From 9b5718e104b39a65c83df889a38c2b67d0479782 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 12 Oct 2013 11:16:23 +0100 Subject: [PATCH] string list as book path (only first element can be set from preferences) --- .../crash/FixBooksDirectoryActivity.java | 10 +++- .../libraryService/BookCollectionShadow.java | 4 +- .../libraryService/LibraryService.java | 2 +- .../preferences/PreferenceActivity.java | 4 +- .../ZLStringListOptionPreference.java | 51 +++++++++++++++++++ src/org/geometerplus/fbreader/Paths.java | 14 +++-- .../fbreader/library/FileFirstLevelTree.java | 12 +++-- 7 files changed, 82 insertions(+), 15 deletions(-) create mode 100644 src/org/geometerplus/android/fbreader/preferences/ZLStringListOptionPreference.java diff --git a/src/org/geometerplus/android/fbreader/crash/FixBooksDirectoryActivity.java b/src/org/geometerplus/android/fbreader/crash/FixBooksDirectoryActivity.java index 65fb394a0..6fac52c97 100644 --- a/src/org/geometerplus/android/fbreader/crash/FixBooksDirectoryActivity.java +++ b/src/org/geometerplus/android/fbreader/crash/FixBooksDirectoryActivity.java @@ -19,6 +19,9 @@ 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; @@ -56,7 +59,12 @@ public class FixBooksDirectoryActivity extends Activity { okButton.setText(buttonResource.getResource("ok").getValue()); okButton.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { - Paths.BooksDirectoryOption().setValue(directoryView.getText().toString()); + final List bookPath = + new LinkedList(Paths.BookPathOption().getValue()); + final String newDirectory = directoryView.getText().toString(); + bookPath.remove(newDirectory); + bookPath.add(0, newDirectory); + Paths.BookPathOption().setValue(bookPath); startActivity(new Intent(FixBooksDirectoryActivity.this, FBReader.class)); finish(); } diff --git a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java index d5df8d31d..4e2eefb95 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java +++ b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java @@ -111,9 +111,7 @@ public class BookCollectionShadow extends AbstractBookCollection implements Serv public synchronized void reset(boolean force) { if (myInterface != null) { try { - myInterface.reset( - Collections.singletonList(Paths.BooksDirectoryOption().getValue()), force - ); + myInterface.reset(Paths.BookPathOption().getValue(), force); } catch (RemoteException e) { } } diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java index f8f4be6ea..a807b51f7 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java @@ -89,7 +89,7 @@ public class LibraryService extends Service { LibraryImplementation() { myDatabase = SQLiteBooksDatabase.Instance(LibraryService.this); - reset(Collections.singletonList(Paths.BooksDirectoryOption().getValue()), true); + reset(Paths.BookPathOption().getValue(), true); } public void reset(List bookDirectories, boolean force) { diff --git a/src/org/geometerplus/android/fbreader/preferences/PreferenceActivity.java b/src/org/geometerplus/android/fbreader/preferences/PreferenceActivity.java index e3e14c369..40551c7f0 100644 --- a/src/org/geometerplus/android/fbreader/preferences/PreferenceActivity.java +++ b/src/org/geometerplus/android/fbreader/preferences/PreferenceActivity.java @@ -80,8 +80,8 @@ public class PreferenceActivity extends ZLPreferenceActivity { String.valueOf(new DecimalFormatSymbols(Locale.getDefault()).getDecimalSeparator()); final Screen directoriesScreen = createPreferenceScreen("directories"); - directoriesScreen.addPreference(new ZLStringOptionPreference( - this, Paths.BooksDirectoryOption(), directoriesScreen.Resource, "books" + directoriesScreen.addPreference(new ZLStringListOptionPreference( + this, Paths.BookPathOption(), directoriesScreen.Resource, "books" ) { protected void setValue(String value) { super.setValue(value); diff --git a/src/org/geometerplus/android/fbreader/preferences/ZLStringListOptionPreference.java b/src/org/geometerplus/android/fbreader/preferences/ZLStringListOptionPreference.java new file mode 100644 index 000000000..244e2433f --- /dev/null +++ b/src/org/geometerplus/android/fbreader/preferences/ZLStringListOptionPreference.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2009-2013 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.fbreader.preferences; + +import java.util.ArrayList; +import java.util.List; + +import org.geometerplus.zlibrary.core.options.ZLStringListOption; +import org.geometerplus.zlibrary.core.resources.ZLResource; + +import android.content.Context; + +class ZLStringListOptionPreference extends ZLStringPreference { + private final ZLStringListOption myOption; + + ZLStringListOptionPreference(Context context, ZLStringListOption option, ZLResource rootResource, String resourceKey) { + super(context, rootResource, resourceKey); + myOption = option; + final List optionValues = myOption.getValue(); + super.setValue(optionValues.isEmpty() ? "" : optionValues.get(0)); + } + + @Override + protected void setValue(String value) { + super.setValue(value); + final List optionValues = new ArrayList(myOption.getValue()); + if (optionValues.isEmpty()) { + optionValues.add(value); + } else { + optionValues.set(0, value); + } + myOption.setValue(optionValues); + } +} diff --git a/src/org/geometerplus/fbreader/Paths.java b/src/org/geometerplus/fbreader/Paths.java index b5edeef8d..2e57c42c5 100644 --- a/src/org/geometerplus/fbreader/Paths.java +++ b/src/org/geometerplus/fbreader/Paths.java @@ -19,17 +19,24 @@ package org.geometerplus.fbreader; +import java.util.List; + import android.os.Environment; import org.geometerplus.zlibrary.core.options.ZLStringOption; +import org.geometerplus.zlibrary.core.options.ZLStringListOption; public abstract class Paths { public static String cardDirectory() { return Environment.getExternalStorageDirectory().getPath(); } - public static ZLStringOption BooksDirectoryOption() { - return new ZLStringOption("Files", "BooksDirectory", cardDirectory() + "/Books"); + private static String defaultBookDirectory() { + return cardDirectory() + "/Books"; + } + + public static ZLStringListOption BookPathOption() { + return new ZLStringListOption("Files", "BooksDirectory", defaultBookDirectory(), "\n"); } public static ZLStringOption FontsDirectoryOption() { @@ -41,7 +48,8 @@ public abstract class Paths { } public static String mainBookDirectory() { - return BooksDirectoryOption().getValue(); + final List bookPath = BookPathOption().getValue(); + return bookPath.isEmpty() ? defaultBookDirectory() : bookPath.get(0); } public static String cacheDirectory() { diff --git a/src/org/geometerplus/fbreader/library/FileFirstLevelTree.java b/src/org/geometerplus/fbreader/library/FileFirstLevelTree.java index 3d8a20481..468d78250 100644 --- a/src/org/geometerplus/fbreader/library/FileFirstLevelTree.java +++ b/src/org/geometerplus/fbreader/library/FileFirstLevelTree.java @@ -27,12 +27,14 @@ import org.geometerplus.fbreader.Paths; public class FileFirstLevelTree extends FirstLevelTree { FileFirstLevelTree(RootTree root) { super(root, ROOT_FILE_TREE); - addChild(Paths.BooksDirectoryOption().getValue(), "fileTreeLibrary"); - addChild("/", "fileTreeRoot"); - addChild(Paths.cardDirectory(), "fileTreeCard"); + for (String dir : Paths.BookPathOption().getValue()) { + addChild(dir, "fileTreeLibrary", dir); + } + addChild("/", "fileTreeRoot", null); + addChild(Paths.cardDirectory(), "fileTreeCard", null); } - private void addChild(String path, String resourceKey) { + private void addChild(String path, String resourceKey, String summary) { final ZLFile file = ZLFile.createFileByPath(path); if (file != null) { final ZLResource resource = resource().getResource(resourceKey); @@ -40,7 +42,7 @@ public class FileFirstLevelTree extends FirstLevelTree { this, file, resource.getValue(), - resource.getResource("summary").getValue() + summary != null ? summary : resource.getResource("summary").getValue() ); } }