mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-05 02:39:23 +02:00
Library constructor takes BooksDatabase
This commit is contained in:
parent
d0326d4889
commit
277fe6cbeb
3 changed files with 46 additions and 45 deletions
|
@ -29,14 +29,23 @@ import org.geometerplus.android.fbreader.library.SQLiteBooksDatabase;
|
|||
|
||||
public class LibraryService extends Service implements Library.ChangeListener {
|
||||
public final class LibraryImplementation extends LibraryInterface.Stub {
|
||||
private final AbstractLibrary myBaseLibrary;
|
||||
|
||||
LibraryImplementation() {
|
||||
BooksDatabase database = SQLiteBooksDatabase.Instance();
|
||||
if (database == null) {
|
||||
database = new SQLiteBooksDatabase(LibraryService.this, "LIBRARY SERVICE");
|
||||
}
|
||||
myBaseLibrary = new Library(database);
|
||||
((Library)myBaseLibrary).startBuild();
|
||||
}
|
||||
|
||||
public boolean isUpToDate() {
|
||||
return myLibrary.isUpToDate();
|
||||
return myBaseLibrary.isUpToDate();
|
||||
}
|
||||
}
|
||||
|
||||
private LibraryImplementation myImplementation;
|
||||
private BooksDatabase myDatabase;
|
||||
private AbstractLibrary myLibrary;
|
||||
private LibraryImplementation myLibrary;
|
||||
|
||||
@Override
|
||||
public void onStart(Intent intent, int startId) {
|
||||
|
@ -53,29 +62,21 @@ public class LibraryService extends Service implements Library.ChangeListener {
|
|||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
System.err.println("LibraryService binded for intent " + intent);
|
||||
return myImplementation;
|
||||
return myLibrary;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
System.err.println("LibraryService.onCreate()");
|
||||
super.onCreate();
|
||||
myDatabase = SQLiteBooksDatabase.Instance();
|
||||
if (myDatabase == null) {
|
||||
myDatabase = new SQLiteBooksDatabase(this, "LIBRARY SERVICE");
|
||||
}
|
||||
if (myLibrary == null) {
|
||||
myLibrary = Library.Instance();
|
||||
myLibrary.addChangeListener(this);
|
||||
((Library)myLibrary).startBuild();
|
||||
}
|
||||
myImplementation = new LibraryImplementation();
|
||||
myLibrary = new LibraryImplementation();
|
||||
myLibrary.myBaseLibrary.addChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
System.err.println("LibraryService.onDestroy()");
|
||||
myLibrary.removeChangeListener(this);
|
||||
myLibrary.myBaseLibrary.removeChangeListener(this);
|
||||
myLibrary = null;
|
||||
super.onDestroy();
|
||||
}
|
||||
|
|
|
@ -145,7 +145,7 @@ public final class FBReaderApp extends ZLApplication {
|
|||
public void run() {
|
||||
Book book = createBookForFile(ZLFile.createFileByPath(myArg0));
|
||||
if (book == null) {
|
||||
book = Library.getRecentBook();
|
||||
book = Library.Instance().getRecentBook();
|
||||
}
|
||||
if ((book == null) || !book.File.exists()) {
|
||||
book = Book.getByFile(Library.getHelpFile());
|
||||
|
@ -243,7 +243,7 @@ public final class FBReaderApp extends ZLApplication {
|
|||
} else {
|
||||
gotoBookmark(bookmark);
|
||||
}
|
||||
Library.addBookToRecentList(book);
|
||||
Library.Instance().addBookToRecentList(book);
|
||||
final StringBuilder title = new StringBuilder(book.getTitle());
|
||||
if (!book.authors().isEmpty()) {
|
||||
boolean first = true;
|
||||
|
@ -347,7 +347,7 @@ public final class FBReaderApp extends ZLApplication {
|
|||
public List<CancelActionDescription> getCancelActionsList() {
|
||||
myCancelActionsList.clear();
|
||||
if (ShowPreviousBookInCancelMenuOption.getValue()) {
|
||||
final Book previousBook = Library.getPreviousBook();
|
||||
final Book previousBook = Library.Instance().getPreviousBook();
|
||||
if (previousBook != null) {
|
||||
myCancelActionsList.add(new CancelActionDescription(
|
||||
CancelActionType.previousBook, previousBook.getTitle()
|
||||
|
@ -375,7 +375,7 @@ public final class FBReaderApp extends ZLApplication {
|
|||
final CancelActionDescription description = myCancelActionsList.get(index);
|
||||
switch (description.Type) {
|
||||
case previousBook:
|
||||
openBook(Library.getPreviousBook(), null);
|
||||
openBook(Library.Instance().getPreviousBook(), null);
|
||||
break;
|
||||
case returnTo:
|
||||
{
|
||||
|
|
|
@ -40,11 +40,13 @@ public final class Library extends AbstractLibrary {
|
|||
private static Library ourInstance;
|
||||
public static Library Instance() {
|
||||
if (ourInstance == null) {
|
||||
ourInstance = new Library();
|
||||
ourInstance = new Library(BooksDatabase.Instance());
|
||||
}
|
||||
return ourInstance;
|
||||
}
|
||||
|
||||
private final BooksDatabase myDatabase;
|
||||
|
||||
private final List<Book> myBooks = Collections.synchronizedList(new LinkedList<Book>());
|
||||
private final RootTree myRootTree = new RootTree();
|
||||
private boolean myDoGroupTitlesByFirstLetter;
|
||||
|
@ -58,7 +60,9 @@ public final class Library extends AbstractLibrary {
|
|||
fireModelChangedEvent(ChangeListener.Code.StatusChanged);
|
||||
}
|
||||
|
||||
private Library() {
|
||||
public Library(BooksDatabase db) {
|
||||
myDatabase = db;
|
||||
|
||||
new FavoritesTree(myRootTree, ROOT_FAVORITES);
|
||||
new FirstLevelTree(myRootTree, ROOT_RECENT);
|
||||
new FirstLevelTree(myRootTree, ROOT_BY_AUTHOR);
|
||||
|
@ -269,11 +273,9 @@ public final class Library extends AbstractLibrary {
|
|||
}
|
||||
|
||||
private void build() {
|
||||
final BooksDatabase db = BooksDatabase.Instance();
|
||||
|
||||
// Step 0: get database books marked as "existing"
|
||||
final FileInfoSet fileInfos = new FileInfoSet();
|
||||
final Map<Long,Book> savedBooksByFileId = db.loadBooks(fileInfos, true);
|
||||
final Map<Long,Book> savedBooksByFileId = myDatabase.loadBooks(fileInfos, true);
|
||||
final Map<Long,Book> savedBooksByBookId = new HashMap<Long,Book>();
|
||||
for (Book b : savedBooksByFileId.values()) {
|
||||
savedBooksByBookId.put(b.getId(), b);
|
||||
|
@ -292,7 +294,7 @@ public final class Library extends AbstractLibrary {
|
|||
myDoGroupTitlesByFirstLetter = savedBooksByFileId.values().size() > letterSet.size() * 5 / 4;
|
||||
}
|
||||
|
||||
for (long id : db.loadRecentBookIds()) {
|
||||
for (long id : myDatabase.loadRecentBookIds()) {
|
||||
Book book = savedBooksByBookId.get(id);
|
||||
if (book == null) {
|
||||
book = Book.getById(id);
|
||||
|
@ -305,7 +307,7 @@ public final class Library extends AbstractLibrary {
|
|||
}
|
||||
}
|
||||
|
||||
for (long id : db.loadFavoritesIds()) {
|
||||
for (long id : myDatabase.loadFavoritesIds()) {
|
||||
Book book = savedBooksByBookId.get(id);
|
||||
if (book == null) {
|
||||
book = Book.getById(id);
|
||||
|
@ -356,11 +358,11 @@ public final class Library extends AbstractLibrary {
|
|||
}
|
||||
}
|
||||
fireModelChangedEvent(ChangeListener.Code.BookAdded);
|
||||
db.setExistingFlag(orphanedBooks, false);
|
||||
myDatabase.setExistingFlag(orphanedBooks, false);
|
||||
|
||||
// Step 3: collect books from physical files; add new, update already added,
|
||||
// unmark orphaned as existing again, collect newly added
|
||||
final Map<Long,Book> orphanedBooksByFileId = db.loadBooks(fileInfos, false);
|
||||
final Map<Long,Book> orphanedBooksByFileId = myDatabase.loadBooks(fileInfos, false);
|
||||
final Set<Book> newBooks = new HashSet<Book>();
|
||||
|
||||
final List<ZLPhysicalFile> physicalFilesList = collectPhysicalFiles();
|
||||
|
@ -387,14 +389,14 @@ public final class Library extends AbstractLibrary {
|
|||
// Step 5: save changes into database
|
||||
fileInfos.save();
|
||||
|
||||
db.executeAsATransaction(new Runnable() {
|
||||
myDatabase.executeAsATransaction(new Runnable() {
|
||||
public void run() {
|
||||
for (Book book : newBooks) {
|
||||
book.save();
|
||||
}
|
||||
}
|
||||
});
|
||||
db.setExistingFlag(newBooks, true);
|
||||
myDatabase.setExistingFlag(newBooks, true);
|
||||
}
|
||||
|
||||
private volatile boolean myBuildStarted = false;
|
||||
|
@ -425,13 +427,13 @@ public final class Library extends AbstractLibrary {
|
|||
return myStatusMask == 0;
|
||||
}
|
||||
|
||||
public static Book getRecentBook() {
|
||||
List<Long> recentIds = BooksDatabase.Instance().loadRecentBookIds();
|
||||
public Book getRecentBook() {
|
||||
List<Long> recentIds = myDatabase.loadRecentBookIds();
|
||||
return recentIds.size() > 0 ? Book.getById(recentIds.get(0)) : null;
|
||||
}
|
||||
|
||||
public static Book getPreviousBook() {
|
||||
List<Long> recentIds = BooksDatabase.Instance().loadRecentBookIds();
|
||||
public Book getPreviousBook() {
|
||||
List<Long> recentIds = myDatabase.loadRecentBookIds();
|
||||
return recentIds.size() > 1 ? Book.getById(recentIds.get(1)) : null;
|
||||
}
|
||||
|
||||
|
@ -490,16 +492,15 @@ public final class Library extends AbstractLibrary {
|
|||
}
|
||||
}
|
||||
|
||||
public static void addBookToRecentList(Book book) {
|
||||
final BooksDatabase db = BooksDatabase.Instance();
|
||||
final List<Long> ids = db.loadRecentBookIds();
|
||||
public void addBookToRecentList(Book book) {
|
||||
final List<Long> ids = myDatabase.loadRecentBookIds();
|
||||
final Long bookId = book.getId();
|
||||
ids.remove(bookId);
|
||||
ids.add(0, bookId);
|
||||
if (ids.size() > 12) {
|
||||
ids.remove(12);
|
||||
}
|
||||
db.saveRecentBookIds(ids);
|
||||
myDatabase.saveRecentBookIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -523,13 +524,13 @@ public final class Library extends AbstractLibrary {
|
|||
}
|
||||
final LibraryTree rootFavorites = getFirstLevelTree(ROOT_FAVORITES);
|
||||
rootFavorites.getBookSubTree(book, true);
|
||||
BooksDatabase.Instance().addToFavorites(book.getId());
|
||||
myDatabase.addToFavorites(book.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeBookFromFavorites(Book book) {
|
||||
if (getFirstLevelTree(ROOT_FAVORITES).removeBook(book, false)) {
|
||||
BooksDatabase.Instance().removeFromFavorites(book.getId());
|
||||
myDatabase.removeFromFavorites(book.getId());
|
||||
fireModelChangedEvent(ChangeListener.Code.BookRemoved);
|
||||
}
|
||||
}
|
||||
|
@ -556,15 +557,14 @@ public final class Library extends AbstractLibrary {
|
|||
}
|
||||
myBooks.remove(book);
|
||||
if (getFirstLevelTree(ROOT_RECENT).removeBook(book, false)) {
|
||||
final BooksDatabase db = BooksDatabase.Instance();
|
||||
final List<Long> ids = db.loadRecentBookIds();
|
||||
final List<Long> ids = myDatabase.loadRecentBookIds();
|
||||
ids.remove(book.getId());
|
||||
db.saveRecentBookIds(ids);
|
||||
myDatabase.saveRecentBookIds(ids);
|
||||
}
|
||||
getFirstLevelTree(ROOT_FAVORITES).removeBook(book, false);
|
||||
myRootTree.removeBook(book, true);
|
||||
|
||||
BooksDatabase.Instance().deleteFromBookList(book.getId());
|
||||
myDatabase.deleteFromBookList(book.getId());
|
||||
if ((removeMode & REMOVE_FROM_DISK) != 0) {
|
||||
book.File.getPhysicalFile().delete();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue