diff --git a/src/org/geometerplus/android/fbreader/FBReader.java b/src/org/geometerplus/android/fbreader/FBReader.java index 65a553da9..a9f0a55f8 100644 --- a/src/org/geometerplus/android/fbreader/FBReader.java +++ b/src/org/geometerplus/android/fbreader/FBReader.java @@ -65,7 +65,6 @@ public final class FBReader extends ZLAndroidActivity { public static final int RESULT_RELOAD_BOOK = RESULT_FIRST_USER + 2; private int myFullScreenFlag; - private final BookCollectionShadow myCollection = new BookCollectionShadow(this); private static final String PLUGIN_ACTION_PREFIX = "___"; private final List myPluginActions = @@ -120,10 +119,17 @@ public final class FBReader extends ZLAndroidActivity { }; } + private BookCollectionShadow getCollection() { + return (BookCollectionShadow)((FBReaderApp)FBReaderApp.Instance()).Collection; + } + + @Override + protected void init(Runnable action) { + getCollection().bindToService(action); + } + @Override public void onCreate(Bundle icicle) { - myCollection.bindToService(null); - super.onCreate(icicle); final FBReaderApp fbReader = (FBReaderApp)FBReaderApp.Instance(); @@ -245,7 +251,7 @@ public final class FBReader extends ZLAndroidActivity { @Override protected void onRestart() { super.onRestart(); - myCollection.bindToService(null); + getCollection().bindToService(null); } @Override @@ -335,7 +341,7 @@ public final class FBReader extends ZLAndroidActivity { public void onStop() { ApiServerImplementation.sendEvent(this, ApiListener.EVENT_READ_MODE_CLOSED); PopupPanel.removeAllWindows(FBReaderApp.Instance(), this); - myCollection.unbind(); + getCollection().unbind(); super.onStop(); } @@ -344,12 +350,7 @@ public final class FBReader extends ZLAndroidActivity { if (SQLiteBooksDatabase.Instance() == null) { new SQLiteBooksDatabase(this, "READER"); } - return new FBReaderApp(myCollection); - } - - @Override - protected void updateApplication() { - ((FBReaderApp)FBReaderApp.Instance()).setCollection(myCollection); + return new FBReaderApp(new BookCollectionShadow(this)); } @Override @@ -507,7 +508,7 @@ public final class FBReader extends ZLAndroidActivity { text, true ); - myCollection.saveBookmark(bookmark); + fbReader.Collection.saveBookmark(bookmark); fbView.clearSelection(); UIUtil.showMessageText( diff --git a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java index 2b7327336..839feceb7 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java +++ b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java @@ -26,6 +26,8 @@ import android.content.*; import android.os.IBinder; import android.os.RemoteException; +import org.geometerplus.zlibrary.core.filesystem.ZLFile; + import org.geometerplus.fbreader.library.*; public class BookCollectionShadow implements IBookCollection, ServiceConnection { @@ -37,16 +39,21 @@ public class BookCollectionShadow implements IBookCollection, ServiceConnection myContext = context; } - public void bindToService(Runnable onBindAction) { + public synchronized void bindToService(Runnable onBindAction) { if (myInterface != null) { - return; + if (onBindAction != null) { + onBindAction.run(); + } + } else { + if (onBindAction != null) { + myOnBindAction = onBindAction; + } + myContext.bindService( + new Intent(myContext, LibraryService.class), + this, + LibraryService.BIND_AUTO_CREATE + ); } - myOnBindAction = onBindAction; - myContext.bindService( - new Intent(myContext, LibraryService.class), - this, - LibraryService.BIND_AUTO_CREATE - ); } public void unbind() { @@ -120,6 +127,17 @@ public class BookCollectionShadow implements IBookCollection, ServiceConnection } } + public synchronized Book getBookByFile(ZLFile file) { + if (myInterface == null) { + return null; + } + try { + return SerializerUtil.deserializeBook(myInterface.getBookByFile(file.getPath())); + } catch (RemoteException e) { + return null; + } + } + public synchronized Book getBookById(long id) { if (myInterface == null) { return null; @@ -207,6 +225,7 @@ public class BookCollectionShadow implements IBookCollection, ServiceConnection myInterface = LibraryInterface.Stub.asInterface(service); if (myOnBindAction != null) { myOnBindAction.run(); + myOnBindAction = null; } } diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl index 1d069dc75..d00f69772 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl @@ -11,6 +11,7 @@ interface LibraryInterface { List books(String pattern); List recentBooks(); List favorites(); + String getBookByFile(in String file); String getBookById(in long id); String getRecentBook(in int index); diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java index 38940e0c5..bb4e9a583 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java @@ -27,6 +27,8 @@ import android.content.Intent; import android.os.IBinder; import android.os.FileObserver; +import org.geometerplus.zlibrary.core.filesystem.ZLFile; + import org.geometerplus.fbreader.library.*; import org.geometerplus.android.fbreader.library.SQLiteBooksDatabase; @@ -141,6 +143,10 @@ public class LibraryService extends Service { return SerializerUtil.serialize(myCollection.getRecentBook(index)); } + public String getBookByFile(String file) { + return SerializerUtil.serialize(myCollection.getBookByFile(ZLFile.createFileByPath(file))); + } + public String getBookById(long id) { return SerializerUtil.serialize(myCollection.getBookById(id)); } diff --git a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java index 8bc2a1926..dea097804 100644 --- a/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java +++ b/src/org/geometerplus/fbreader/fbreader/FBReaderApp.java @@ -118,10 +118,10 @@ public final class FBReaderApp extends ZLApplication { private ZLTextPosition myJumpEndPosition; private Date myJumpTimeStamp; - private IBookCollection myCollection; + public final IBookCollection Collection; public FBReaderApp(IBookCollection collection) { - setCollection(collection); + Collection = collection; addAction(ActionCode.INCREASE_FONT, new ChangeFontSizeAction(this, +2)); addAction(ActionCode.DECREASE_FONT, new ChangeFontSizeAction(this, -2)); @@ -154,10 +154,6 @@ public final class FBReaderApp extends ZLApplication { setView(BookTextView); } - public void setCollection(IBookCollection collection) { - myCollection = collection; - } - public void openBook(final Book book, final Bookmark bookmark, final Runnable postAction) { if (book != null || Model == null) { runWithMessage("loadingBook", new Runnable() { @@ -238,9 +234,9 @@ public final class FBReaderApp extends ZLApplication { synchronized void openBookInternal(Book book, Bookmark bookmark, boolean force) { if (book == null) { - book = myCollection.getRecentBook(0); + book = Collection.getRecentBook(0); if (book == null || !book.File.exists()) { - book = Book.getByFile(Library.getHelpFile()); + book = Collection.getBookByFile(Library.getHelpFile()); } if (book == null) { return; @@ -272,7 +268,7 @@ public final class FBReaderApp extends ZLApplication { } else { gotoBookmark(bookmark); } - myCollection.addBookToRecentList(book); + Collection.addBookToRecentList(book); final StringBuilder title = new StringBuilder(book.getTitle()); if (!book.authors().isEmpty()) { boolean first = true; @@ -310,12 +306,12 @@ public final class FBReaderApp extends ZLApplication { return false; } - final List bookmarks = myCollection.invisibleBookmarks(Model.Book); + final List bookmarks = Collection.invisibleBookmarks(Model.Book); if (bookmarks.isEmpty()) { return false; } final Bookmark b = bookmarks.get(0); - myCollection.deleteBookmark(b); + Collection.deleteBookmark(b); gotoBookmark(b); return true; } finally { @@ -346,14 +342,14 @@ public final class FBReaderApp extends ZLApplication { if (file == null) { return null; } - Book book = Book.getByFile(file); + Book book = Collection.getBookByFile(file); if (book != null) { book.insertIntoBookList(); return book; } if (file.isArchive()) { for (ZLFile child : file.children()) { - book = Book.getByFile(child); + book = Collection.getBookByFile(child); if (book != null) { book.insertIntoBookList(); return book; @@ -424,7 +420,7 @@ public final class FBReaderApp extends ZLApplication { )); } if (ShowPreviousBookInCancelMenuOption.getValue()) { - final Book previousBook = myCollection.getRecentBook(1); + final Book previousBook = Collection.getRecentBook(1); if (previousBook != null) { myCancelActionsList.add(new CancelActionDescription( CancelActionType.previousBook, previousBook.getTitle() @@ -433,7 +429,7 @@ public final class FBReaderApp extends ZLApplication { } if (ShowPositionsInCancelMenuOption.getValue()) { if (Model != null && Model.Book != null) { - for (Bookmark bookmark : myCollection.invisibleBookmarks(Model.Book)) { + for (Bookmark bookmark : Collection.invisibleBookmarks(Model.Book)) { myCancelActionsList.add(new BookmarkDescription(bookmark)); } } @@ -458,12 +454,12 @@ public final class FBReaderApp extends ZLApplication { runAction(ActionCode.SHOW_NETWORK_LIBRARY); break; case previousBook: - openBook(myCollection.getRecentBook(1), null, null); + openBook(Collection.getRecentBook(1), null, null); break; case returnTo: { final Bookmark b = ((BookmarkDescription)description).Bookmark; - myCollection.deleteBookmark(b); + Collection.deleteBookmark(b); gotoBookmark(b); break; } @@ -475,15 +471,15 @@ public final class FBReaderApp extends ZLApplication { private synchronized void updateInvisibleBookmarksList(Bookmark b) { if (Model != null && Model.Book != null && b != null) { - for (Bookmark bm : myCollection.invisibleBookmarks(Model.Book)) { + for (Bookmark bm : Collection.invisibleBookmarks(Model.Book)) { if (b.equals(bm)) { - myCollection.deleteBookmark(bm); + Collection.deleteBookmark(bm); } } - myCollection.saveBookmark(b); - final List bookmarks = myCollection.invisibleBookmarks(Model.Book); + Collection.saveBookmark(b); + final List bookmarks = Collection.invisibleBookmarks(Model.Book); for (int i = 3; i < bookmarks.size(); ++i) { - myCollection.deleteBookmark(bookmarks.get(i)); + Collection.deleteBookmark(bookmarks.get(i)); } } } diff --git a/src/org/geometerplus/fbreader/library/Book.java b/src/org/geometerplus/fbreader/library/Book.java index 3010cf12c..9122370c8 100644 --- a/src/org/geometerplus/fbreader/library/Book.java +++ b/src/org/geometerplus/fbreader/library/Book.java @@ -39,42 +39,6 @@ import org.geometerplus.fbreader.bookmodel.BookReadingException; import org.geometerplus.fbreader.Paths; public class Book { - public static Book getByFile(ZLFile bookFile) { - if (bookFile == null) { - return null; - } - - final ZLPhysicalFile physicalFile = bookFile.getPhysicalFile(); - if (physicalFile != null && !physicalFile.exists()) { - return null; - } - - final FileInfoSet fileInfos = new FileInfoSet(bookFile); - - Book book = BooksDatabase.Instance().loadBookByFile(fileInfos.getId(bookFile), bookFile); - if (book != null) { - book.loadLists(); - } - - if (book != null && fileInfos.check(physicalFile, physicalFile != bookFile)) { - return book; - } - fileInfos.save(); - - try { - if (book == null) { - book = new Book(bookFile); - } else { - book.readMetaInfo(); - } - } catch (BookReadingException e) { - return null; - } - - book.save(); - return book; - } - public final ZLFile File; private volatile long myId; diff --git a/src/org/geometerplus/fbreader/library/BookCollection.java b/src/org/geometerplus/fbreader/library/BookCollection.java index 3e6c6f0af..94141c8cd 100644 --- a/src/org/geometerplus/fbreader/library/BookCollection.java +++ b/src/org/geometerplus/fbreader/library/BookCollection.java @@ -73,6 +73,49 @@ public class BookCollection implements IBookCollection { return myBooksByFile.size(); } + public Book getBookByFile(ZLFile bookFile) { + if (bookFile == null) { + return null; + } + + Book book = myBooksByFile.get(bookFile); + if (book != null) { + return book; + } + + final ZLPhysicalFile physicalFile = bookFile.getPhysicalFile(); + if (physicalFile != null && !physicalFile.exists()) { + return null; + } + + final FileInfoSet fileInfos = new FileInfoSet(bookFile); + + book = BooksDatabase.Instance().loadBookByFile(fileInfos.getId(bookFile), bookFile); + if (book != null) { + book.loadLists(); + } + + if (book != null && fileInfos.check(physicalFile, physicalFile != bookFile)) { + addBook(book); + return book; + } + fileInfos.save(); + + try { + if (book == null) { + book = new Book(bookFile); + } else { + book.readMetaInfo(); + } + } catch (BookReadingException e) { + return null; + } + + book.save(); + addBook(book); + return book; + } + public Book getBookById(long id) { Book book = myBooksById.get(id); if (book != null) { diff --git a/src/org/geometerplus/fbreader/library/FileFirstLevelTree.java b/src/org/geometerplus/fbreader/library/FileFirstLevelTree.java index 6fbeac96c..57eaf9508 100644 --- a/src/org/geometerplus/fbreader/library/FileFirstLevelTree.java +++ b/src/org/geometerplus/fbreader/library/FileFirstLevelTree.java @@ -25,8 +25,11 @@ import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.fbreader.Paths; public class FileFirstLevelTree extends FirstLevelTree { - FileFirstLevelTree(RootTree root, String id) { + private final IBookCollection myCollection; + + FileFirstLevelTree(IBookCollection collection, RootTree root, String id) { super(root, id); + myCollection = collection; addChild(Paths.BooksDirectoryOption().getValue(), "fileTreeLibrary"); addChild("/", "fileTreeRoot"); addChild(Paths.cardDirectory(), "fileTreeCard"); @@ -38,6 +41,7 @@ public class FileFirstLevelTree extends FirstLevelTree { final ZLResource resource = LibraryUtil.resource().getResource(resourceKey); new FileTree( this, + myCollection, file, resource.getValue(), resource.getResource("summary").getValue() diff --git a/src/org/geometerplus/fbreader/library/FileTree.java b/src/org/geometerplus/fbreader/library/FileTree.java index a7960fd7b..e93dc0c02 100644 --- a/src/org/geometerplus/fbreader/library/FileTree.java +++ b/src/org/geometerplus/fbreader/library/FileTree.java @@ -28,13 +28,15 @@ import org.geometerplus.fbreader.formats.PluginCollection; import org.geometerplus.fbreader.tree.FBTree; public class FileTree extends LibraryTree { + private final IBookCollection myCollection; private final ZLFile myFile; private final String myName; private final String mySummary; private final boolean myIsSelectable; - FileTree(LibraryTree parent, ZLFile file, String name, String summary) { + FileTree(LibraryTree parent, IBookCollection collection, ZLFile file, String name, String summary) { super(parent); + myCollection = collection; myFile = file; myName = name; mySummary = summary; @@ -43,6 +45,7 @@ public class FileTree extends LibraryTree { public FileTree(FileTree parent, ZLFile file) { super(parent); + myCollection = parent.myCollection; myFile = file; myName = null; mySummary = null; @@ -98,7 +101,7 @@ public class FileTree extends LibraryTree { @Override public Book getBook() { if (myBook == null) { - myBook = Book.getByFile(myFile); + myBook = myCollection.getBookByFile(myFile); if (myBook == null) { myBook = NULL_BOOK; } diff --git a/src/org/geometerplus/fbreader/library/IBookCollection.java b/src/org/geometerplus/fbreader/library/IBookCollection.java index 59fd7ae22..f44f58322 100644 --- a/src/org/geometerplus/fbreader/library/IBookCollection.java +++ b/src/org/geometerplus/fbreader/library/IBookCollection.java @@ -21,6 +21,8 @@ package org.geometerplus.fbreader.library; import java.util.List; +import org.geometerplus.zlibrary.core.filesystem.ZLFile; + public interface IBookCollection { public interface Listener { public enum BookEvent { @@ -48,6 +50,7 @@ public interface IBookCollection { List books(String pattern); List recentBooks(); List favorites(); + Book getBookByFile(ZLFile file); Book getBookById(long id); Book getRecentBook(int index); diff --git a/src/org/geometerplus/fbreader/library/Library.java b/src/org/geometerplus/fbreader/library/Library.java index 9637110ad..0f72d77e3 100644 --- a/src/org/geometerplus/fbreader/library/Library.java +++ b/src/org/geometerplus/fbreader/library/Library.java @@ -128,7 +128,7 @@ public final class Library { new FirstLevelTree(myRootTree, ROOT_BY_AUTHOR); new FirstLevelTree(myRootTree, ROOT_BY_TITLE); new FirstLevelTree(myRootTree, ROOT_BY_TAG); - new FileFirstLevelTree(myRootTree, ROOT_FILE_TREE); + new FileFirstLevelTree(collection, myRootTree, ROOT_FILE_TREE); } public LibraryTree getRootTree() { diff --git a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java index cfd3dc29e..6d46b82f5 100644 --- a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java +++ b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java @@ -37,7 +37,7 @@ import org.geometerplus.zlibrary.ui.android.application.ZLAndroidApplicationWind public abstract class ZLAndroidActivity extends Activity { protected abstract ZLApplication createApplication(); - protected abstract void updateApplication(); + protected abstract void init(Runnable action); private static final String REQUESTED_ORIENTATION_KEY = "org.geometerplus.zlibrary.ui.android.library.androidActiviy.RequestedOrientation"; private static final String ORIENTATION_CHANGE_COUNTER_KEY = "org.geometerplus.zlibrary.ui.android.library.androidActiviy.ChangeCounter"; @@ -98,18 +98,20 @@ public abstract class ZLAndroidActivity extends Activity { final ZLApplication application = createApplication(); androidApplication.myMainWindow = new ZLAndroidApplicationWindow(application); application.initWindow(); - } else { - updateApplication(); } - new Thread() { + init(new Runnable() { public void run() { - ZLApplication.Instance().openFile(fileFromIntent(getIntent()), getPostponedInitAction()); + new Thread() { + public void run() { + ZLApplication.Instance().openFile(fileFromIntent(getIntent()), getPostponedInitAction()); + ZLApplication.Instance().getViewWidget().repaint(); + } + }.start(); + ZLApplication.Instance().getViewWidget().repaint(); } - }.start(); - - ZLApplication.Instance().getViewWidget().repaint(); + }); } protected abstract Runnable getPostponedInitAction(); @@ -194,11 +196,15 @@ public abstract class ZLAndroidActivity extends Activity { } @Override - protected void onNewIntent(Intent intent) { + protected void onNewIntent(final Intent intent) { super.onNewIntent(intent); final String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action) || "android.fbreader.action.VIEW".equals(action)) { - ZLApplication.Instance().openFile(fileFromIntent(intent), null); + init(new Runnable() { + public void run() { + ZLApplication.Instance().openFile(fileFromIntent(intent), null); + } + }); } }