diff --git a/TODO.filechooser b/TODO.filechooser index b711b00a2..05e48d2c2 100644 --- a/TODO.filechooser +++ b/TODO.filechooser @@ -5,10 +5,10 @@ DONE same problem with 'Ok' button DONE all/writable only option (use writable only for books & temp, all for fonts & wallpapers) NOT NECESSARY activity orientation (use fbreader's OrientaionUtil mechanism) DONE resource strings -* use in fix book catalog dialog -* standard temp dir (?) +DONE use in fix book catalog dialog +DELAYED standard temp dir (?) DONE layout for versions < v11 -* create missing catalogs for fonts/wallpapers (if possible) -* special icon for inaccessible folders +DELAYED create missing catalogs for fonts/wallpapers (if possible) +DONE special icon for inaccessible folders * set impossible value for temp folder & check * set impossible value for downloads folder & check diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml index 95dde2a1e..ba164cf42 100644 --- a/assets/resources/application/en.xml +++ b/assets/resources/application/en.xml @@ -925,7 +925,7 @@ - + diff --git a/assets/resources/application/ru.xml b/assets/resources/application/ru.xml index 5ccbfdfdc..cf360c67b 100644 --- a/assets/resources/application/ru.xml +++ b/assets/resources/application/ru.xml @@ -930,7 +930,7 @@ - + diff --git a/res/layout/books_directory_fix.xml b/res/layout/books_directory_fix.xml index 682cf026f..77746855c 100644 --- a/res/layout/books_directory_fix.xml +++ b/res/layout/books_directory_fix.xml @@ -16,13 +16,28 @@ android:layout_height="wrap_content" android:layout_marginBottom="10dp" /> - + android:orientation="horizontal" + > + + + diff --git a/src/org/geometerplus/android/fbreader/crash/FixBooksDirectoryActivity.java b/src/org/geometerplus/android/fbreader/crash/FixBooksDirectoryActivity.java index edb0eb770..f57d9af35 100644 --- a/src/org/geometerplus/android/fbreader/crash/FixBooksDirectoryActivity.java +++ b/src/org/geometerplus/android/fbreader/crash/FixBooksDirectoryActivity.java @@ -19,9 +19,6 @@ package org.geometerplus.android.fbreader.crash; -import java.util.LinkedList; -import java.util.List; - import android.app.Activity; import android.content.Intent; import android.os.Bundle; @@ -38,8 +35,11 @@ import org.geometerplus.fbreader.Paths; import org.geometerplus.zlibrary.ui.android.R; import org.geometerplus.android.fbreader.FBReader; +import org.geometerplus.android.util.FileChooserUtil; public class FixBooksDirectoryActivity extends Activity { + private TextView myDirectoryView; + @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); @@ -48,24 +48,38 @@ public class FixBooksDirectoryActivity extends Activity { final ZLResource resource = ZLResource.resource("crash").getResource("fixBooksDirectory"); final ZLResource buttonResource = ZLResource.resource("dialog").getResource("button"); - setTitle(resource.getResource("title").getValue()); + final String title = resource.getResource("title").getValue(); + setTitle(title); final TextView textView = (TextView)findViewById(R.id.books_directory_fix_text); textView.setText(resource.getResource("text").getValue()); - final EditText directoryView = (EditText)findViewById(R.id.books_directory_fix_directory); + myDirectoryView = (TextView)findViewById(R.id.books_directory_fix_directory); final View buttonsView = findViewById(R.id.books_directory_fix_buttons); final Button okButton = (Button)buttonsView.findViewById(R.id.ok_button); okButton.setText(buttonResource.getResource("ok").getValue()); + final View selectArea = findViewById(R.id.books_directory_fix_select_area); + Config.Instance().runOnStart(new Runnable() { public void run() { final ZLStringOption tempDirectoryOption = Paths.TempDirectoryOption(); - directoryView.setText(tempDirectoryOption.getValue()); + myDirectoryView.setText(tempDirectoryOption.getValue()); + selectArea.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + FileChooserUtil.runDirectoryChooser( + FixBooksDirectoryActivity.this, + 1, + title, + tempDirectoryOption.getValue(), + true + ); + } + }); okButton.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { - final String newDirectory = directoryView.getText().toString(); + final String newDirectory = myDirectoryView.getText().toString(); tempDirectoryOption.setValue(newDirectory); startActivity(new Intent(FixBooksDirectoryActivity.this, FBReader.class)); finish(); @@ -82,4 +96,11 @@ public class FixBooksDirectoryActivity extends Activity { } }); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == 1 && resultCode == RESULT_OK) { + myDirectoryView.setText(FileChooserUtil.pathFromData(data)); + } + } } diff --git a/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserCollection.java b/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserCollection.java index 8defe3e9f..4517a1757 100644 --- a/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserCollection.java +++ b/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserCollection.java @@ -25,12 +25,12 @@ import java.util.List; import android.content.Context; import android.content.Intent; -import group.pals.android.lib.ui.filechooser.FileChooserActivity; - import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.options.ZLStringListOption; import org.geometerplus.zlibrary.core.resources.ZLResource; +import org.geometerplus.android.util.FileChooserUtil; + public class FileChooserCollection { private final Context myContext; private final List myPreferences = new ArrayList(); @@ -61,9 +61,7 @@ public class FileChooserCollection { public void update(int index, Intent data) { try { - myPreferences.get(index).setValue( - data.getStringExtra(FileChooserActivity._FolderPath) - ); + myPreferences.get(index).setValue(FileChooserUtil.pathFromData(data)); } catch (Exception e) { // ignore } diff --git a/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserPreference.java b/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserPreference.java index bb96aa3b6..5e005f410 100644 --- a/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserPreference.java +++ b/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserPreference.java @@ -19,68 +19,37 @@ package org.geometerplus.android.fbreader.preferences.fileChooser; -import java.util.HashMap; - import android.app.Activity; import android.content.Context; -import android.content.Intent; -import android.os.Parcelable; import android.preference.Preference; -import group.pals.android.lib.ui.filechooser.FileChooserActivity; -import group.pals.android.lib.ui.filechooser.services.IFileProvider; -import group.pals.android.lib.ui.filechooser.io.localfile.LocalFile; - import org.geometerplus.zlibrary.core.resources.ZLResource; +import org.geometerplus.android.util.FileChooserUtil; + abstract class FileChooserPreference extends Preference { private final int myRegCode; private final ZLResource myResource; - private final IFileProvider.FilterMode myFilterMode; + private final boolean myChooseWritableDirectoriesOnly; - FileChooserPreference(Context context, ZLResource rootResource, String resourceKey, IFileProvider.FilterMode filterMode, int regCode) { + FileChooserPreference(Context context, ZLResource rootResource, String resourceKey, boolean chooseWritableDirectoriesOnly, int regCode) { super(context); myRegCode = regCode; - myFilterMode = filterMode; + myChooseWritableDirectoriesOnly = chooseWritableDirectoriesOnly; myResource = rootResource.getResource(resourceKey); setTitle(myResource.getValue()); } @Override protected void onClick() { - final HashMap textResources = new HashMap(); - textResources.put("title", myResource.getResource("chooserTitle").getValue()); - final ZLResource dialogResource = ZLResource.resource("dialog"); - final ZLResource buttonResource = dialogResource.getResource("button"); - textResources.put("ok", buttonResource.getResource("ok").getValue()); - textResources.put("cancel", buttonResource.getResource("cancel").getValue()); - final ZLResource resource = dialogResource.getResource("fileChooser"); - textResources.put("root", resource.getResource("root").getValue()); - textResources.put("newFolder", resource.getResource("newFolder").getValue()); - textResources.put("folderNameHint", resource.getResource("folderNameHint").getValue()); - final ZLResource menuResource = resource.getResource("menu"); - textResources.put("menuOrigin", menuResource.getResource("origin").getValue()); - textResources.put("menuReload", menuResource.getResource("reload").getValue()); - final ZLResource sortResource = resource.getResource("sortBy"); - textResources.put("sortBy", sortResource.getValue()); - textResources.put("sortByName", sortResource.getResource("name").getValue()); - textResources.put("sortBySize", sortResource.getResource("size").getValue()); - textResources.put("sortByDate", sortResource.getResource("date").getValue()); - textResources.put("permissionDenied", resource.getResource("permissionDenied").getValue()); - - final Intent intent = new Intent(getContext(), FileChooserActivity.class); - intent.putExtra(FileChooserActivity._TextResources, textResources); - intent.putExtra(FileChooserActivity._Rootpath, (Parcelable)new LocalFile(getStringValue())); - intent.putExtra(FileChooserActivity._ActionBar, true); - intent.putExtra(FileChooserActivity._SaveLastLocation, false); - intent.putExtra(FileChooserActivity._DisplayHiddenFiles, true); - intent.putExtra(FileChooserActivity._FilterMode, myFilterMode); - //intent.putExtra(FileChooserActivity._FilterMode, IFileProvider.FilterMode.AnyDirectories); - //intent.putExtra(FileChooserActivity._FilterMode, IFileProvider.FilterMode.DirectoriesOnly); - //intent.putExtra(FileChooserActivity._FilterMode, IFileProvider.FilterMode.FilesOnly); - //intent.putExtra(FileChooserActivity._FilterMode, IFileProvider.FilterMode.FilesAndDirectories); - ((Activity)getContext()).startActivityForResult(intent, myRegCode); + FileChooserUtil.runDirectoryChooser( + (Activity)getContext(), + myRegCode, + myResource.getResource("chooserTitle").getValue(), + getStringValue(), + myChooseWritableDirectoriesOnly + ); } protected abstract String getStringValue(); diff --git a/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserStringListPreference.java b/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserStringListPreference.java index 40b515818..0a9d6b809 100644 --- a/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserStringListPreference.java +++ b/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserStringListPreference.java @@ -24,8 +24,6 @@ import java.util.List; import android.content.Context; -import group.pals.android.lib.ui.filechooser.services.IFileProvider; - import org.geometerplus.zlibrary.core.options.ZLStringListOption; import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.util.MiscUtil; @@ -35,7 +33,7 @@ class FileChooserStringListPreference extends FileChooserPreference { private final Runnable myOnValueSetAction; FileChooserStringListPreference(Context context, ZLResource rootResource, String resourceKey, ZLStringListOption option, int regCode, Runnable onValueSetAction) { - super(context, rootResource, resourceKey, IFileProvider.FilterMode.AnyDirectories, regCode); + super(context, rootResource, resourceKey, false, regCode); myOption = option; myOnValueSetAction = onValueSetAction; diff --git a/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserStringPreference.java b/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserStringPreference.java index dac627f8d..d3a334988 100644 --- a/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserStringPreference.java +++ b/src/org/geometerplus/android/fbreader/preferences/fileChooser/FileChooserStringPreference.java @@ -21,8 +21,6 @@ package org.geometerplus.android.fbreader.preferences.fileChooser; import android.content.Context; -import group.pals.android.lib.ui.filechooser.services.IFileProvider; - import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.util.MiscUtil; @@ -31,7 +29,7 @@ class FileChooserStringPreference extends FileChooserPreference { private final ZLStringOption myOption; FileChooserStringPreference(Context context, ZLResource rootResource, String resourceKey, ZLStringOption option, int regCode) { - super(context, rootResource, resourceKey, IFileProvider.FilterMode.DirectoriesOnly, regCode); + super(context, rootResource, resourceKey, true, regCode); myOption = option; setSummary(getStringValue()); diff --git a/src/org/geometerplus/android/util/FileChooserUtil.java b/src/org/geometerplus/android/util/FileChooserUtil.java new file mode 100644 index 000000000..e936484bc --- /dev/null +++ b/src/org/geometerplus/android/util/FileChooserUtil.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2007-2014 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.util; + +import java.util.HashMap; + +import android.app.Activity; +import android.content.Intent; +import android.os.Parcelable; + +import group.pals.android.lib.ui.filechooser.FileChooserActivity; +import group.pals.android.lib.ui.filechooser.services.IFileProvider; +import group.pals.android.lib.ui.filechooser.io.localfile.LocalFile; + +import org.geometerplus.zlibrary.core.resources.ZLResource; + +public abstract class FileChooserUtil { + private FileChooserUtil() { + } + + public static void runDirectoryChooser( + Activity activity, + int requestCode, + String title, + String initinalValue, + boolean chooseWritableDirsOnly + ) { + final Intent intent = new Intent(activity, FileChooserActivity.class); + intent.putExtra(FileChooserActivity._TextResources, textResources(title)); + intent.putExtra(FileChooserActivity._Rootpath, (Parcelable)new LocalFile(initinalValue)); + intent.putExtra(FileChooserActivity._ActionBar, true); + intent.putExtra(FileChooserActivity._SaveLastLocation, false); + intent.putExtra(FileChooserActivity._DisplayHiddenFiles, true); + intent.putExtra( + FileChooserActivity._FilterMode, + chooseWritableDirsOnly + ? IFileProvider.FilterMode.DirectoriesOnly + : IFileProvider.FilterMode.AnyDirectories + ); + activity.startActivityForResult(intent, requestCode); + } + + public static String pathFromData(Intent data) { + return data.getStringExtra(FileChooserActivity._FolderPath); + } + + private static HashMap textResources(String title) { + final HashMap map = new HashMap(); + + map.put("title", title); + final ZLResource dialogResource = ZLResource.resource("dialog"); + final ZLResource buttonResource = dialogResource.getResource("button"); + map.put("ok", buttonResource.getResource("ok").getValue()); + map.put("cancel", buttonResource.getResource("cancel").getValue()); + final ZLResource resource = dialogResource.getResource("fileChooser"); + map.put("root", resource.getResource("root").getValue()); + map.put("newFolder", resource.getResource("newFolder").getValue()); + map.put("folderNameHint", resource.getResource("folderNameHint").getValue()); + final ZLResource menuResource = resource.getResource("menu"); + map.put("menuOrigin", menuResource.getResource("origin").getValue()); + map.put("menuReload", menuResource.getResource("reload").getValue()); + final ZLResource sortResource = resource.getResource("sortBy"); + map.put("sortBy", sortResource.getValue()); + map.put("sortByName", sortResource.getResource("name").getValue()); + map.put("sortBySize", sortResource.getResource("size").getValue()); + map.put("sortByDate", sortResource.getResource("date").getValue()); + map.put("permissionDenied", resource.getResource("permissionDenied").getValue()); + + return map; + } +} diff --git a/src/org/geometerplus/fbreader/Paths.java b/src/org/geometerplus/fbreader/Paths.java index 883538c46..775c908f4 100644 --- a/src/org/geometerplus/fbreader/Paths.java +++ b/src/org/geometerplus/fbreader/Paths.java @@ -52,6 +52,7 @@ public abstract class Paths { if ("".equals(ourTempDirectoryOption.getValue())) { ourTempDirectoryOption.setValue(mainBookDirectory() + "/.FBReader"); } + //ourTempDirectoryOption.setValue("/X/Y/Z"); return ourTempDirectoryOption; }