mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-04 18:29:23 +02:00
Book.getByFile() => IBookCollection.getBookByFile()
This commit is contained in:
parent
2ec3c907af
commit
bc3976f5f6
12 changed files with 138 additions and 92 deletions
|
@ -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<PluginApi.ActionInfo> 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(
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ interface LibraryInterface {
|
|||
List<String> books(String pattern);
|
||||
List<String> recentBooks();
|
||||
List<String> favorites();
|
||||
String getBookByFile(in String file);
|
||||
String getBookById(in long id);
|
||||
String getRecentBook(in int index);
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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<Bookmark> bookmarks = myCollection.invisibleBookmarks(Model.Book);
|
||||
final List<Bookmark> 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<Bookmark> bookmarks = myCollection.invisibleBookmarks(Model.Book);
|
||||
Collection.saveBookmark(b);
|
||||
final List<Bookmark> bookmarks = Collection.invisibleBookmarks(Model.Book);
|
||||
for (int i = 3; i < bookmarks.size(); ++i) {
|
||||
myCollection.deleteBookmark(bookmarks.get(i));
|
||||
Collection.deleteBookmark(bookmarks.get(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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<Book> books(String pattern);
|
||||
List<Book> recentBooks();
|
||||
List<Book> favorites();
|
||||
Book getBookByFile(ZLFile file);
|
||||
Book getBookById(long id);
|
||||
Book getRecentBook(int index);
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue