From 522d32a58511b8fc880e3406784cd0d7b51fa738 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 12 Jan 2013 19:34:03 +0400 Subject: [PATCH] more methods in IBookCollection --- .../fbreader/library/LibraryActivity.java | 5 +- .../libraryService/BookCollectionShadow.java | 64 ++++++++++++++++++- .../libraryService/LibraryInterface.aidl | 11 +++- .../libraryService/LibraryService.java | 30 ++++++++- .../fbreader/library/BookCollection.java | 27 ++++++-- .../fbreader/library/IBookCollection.java | 7 ++ .../fbreader/library/Library.java | 40 ++++++------ .../fbreader/library/SerializerUtil.java | 18 +++++- 8 files changed, 166 insertions(+), 36 deletions(-) diff --git a/src/org/geometerplus/android/fbreader/library/LibraryActivity.java b/src/org/geometerplus/android/fbreader/library/LibraryActivity.java index 416380de1..f1164a9ff 100644 --- a/src/org/geometerplus/android/fbreader/library/LibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/library/LibraryActivity.java @@ -60,9 +60,10 @@ public class LibraryActivity extends TreeActivity implements MenuItem.OnMenuItem myDatabase = new SQLiteBooksDatabase(this, "LIBRARY"); } if (myLibrary == null) { - myLibrary = Library.Instance(); + final BookCollection collection = new BookCollection(myDatabase); + myLibrary = new Library(collection); myLibrary.addChangeListener(this); - myLibrary.startBuild(); + collection.startBuild(); } final String selectedBookPath = getIntent().getStringExtra(SELECTED_BOOK_PATH_KEY); diff --git a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java index d470e9dc8..c6367545e 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java +++ b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java @@ -61,12 +61,45 @@ public class BookCollectionShadow implements IBookCollection, ServiceConnection } } + public synchronized List books(String pattern) { + if (myInterface == null) { + return Collections.emptyList(); + } + try { + return SerializerUtil.deserializeBookList(myInterface.books(pattern)); + } catch (RemoteException e) { + return Collections.emptyList(); + } + } + + public synchronized List recentBooks() { + if (myInterface == null) { + return Collections.emptyList(); + } + try { + return SerializerUtil.deserializeBookList(myInterface.recentBooks()); + } catch (RemoteException e) { + return Collections.emptyList(); + } + } + + public synchronized List favorites() { + if (myInterface == null) { + return Collections.emptyList(); + } + try { + return SerializerUtil.deserializeBookList(myInterface.favorites()); + } catch (RemoteException e) { + return Collections.emptyList(); + } + } + public synchronized Book getRecentBook(int index) { if (myInterface == null) { return null; } try { - return SerializerUtil.deserializeBook(myInterface.recentBook(index)); + return SerializerUtil.deserializeBook(myInterface.getRecentBook(index)); } catch (RemoteException e) { return null; } @@ -77,12 +110,39 @@ public class BookCollectionShadow implements IBookCollection, ServiceConnection return null; } try { - return SerializerUtil.deserializeBook(myInterface.bookById(id)); + return SerializerUtil.deserializeBook(myInterface.getBookById(id)); } catch (RemoteException e) { return null; } } + public synchronized void removeBook(Book book, boolean deleteFromDisk) { + if (myInterface != null) { + try { + myInterface.removeBook(SerializerUtil.serialize(book), deleteFromDisk); + } catch (RemoteException e) { + } + } + } + + public synchronized void addBookToRecentList(Book book) { + if (myInterface != null) { + try { + myInterface.addBookToRecentList(SerializerUtil.serialize(book)); + } catch (RemoteException e) { + } + } + } + + public synchronized void setBookFavorite(Book book, boolean favorite) { + if (myInterface != null) { + try { + myInterface.setBookFavorite(SerializerUtil.serialize(book), favorite); + } catch (RemoteException e) { + } + } + } + public synchronized List allBookmarks() { if (myInterface == null) { return Collections.emptyList(); diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl index 2ce213da6..8619ed6cc 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl @@ -8,8 +8,15 @@ import java.util.List; interface LibraryInterface { int size(); - String bookById(in long id); - String recentBook(in int index); + List books(String pattern); + List recentBooks(); + List favorites(); + String getBookById(in long id); + String getRecentBook(in int index); + + void removeBook(in String book, in boolean deleteFromDisk); + void addBookToRecentList(in String book); + void setBookFavorite(in String book, in boolean favorite); List allBookmarks(); String saveBookmark(in String bookmark); diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java index 971aec716..a7f601e02 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java @@ -125,16 +125,40 @@ public class LibraryService extends Service { return myCollection.size(); } - public String recentBook(int index) { + public List books(String pattern) { + return SerializerUtil.serializeBookList(myCollection.books(pattern)); + } + + public List recentBooks() { + return SerializerUtil.serializeBookList(myCollection.recentBooks()); + } + + public List favorites() { + return SerializerUtil.serializeBookList(myCollection.favorites()); + } + + public String getRecentBook(int index) { return SerializerUtil.serialize(myCollection.getRecentBook(index)); } - public String bookById(long id) { + public String getBookById(long id) { return SerializerUtil.serialize(myCollection.getBookById(id)); } + public void removeBook(String book, boolean deleteFromDisk) { + myCollection.removeBook(SerializerUtil.deserializeBook(book), deleteFromDisk); + } + + public void addBookToRecentList(String book) { + myCollection.addBookToRecentList(SerializerUtil.deserializeBook(book)); + } + + public void setBookFavorite(String book, boolean favorite) { + myCollection.setBookFavorite(SerializerUtil.deserializeBook(book), favorite); + } + public List allBookmarks() { - return SerializerUtil.serialize(myCollection.allBookmarks()); + return SerializerUtil.serializeBookmarkList(myCollection.allBookmarks()); } public String saveBookmark(String serialized) { diff --git a/src/org/geometerplus/fbreader/library/BookCollection.java b/src/org/geometerplus/fbreader/library/BookCollection.java index 1dd124835..e6e4f78aa 100644 --- a/src/org/geometerplus/fbreader/library/BookCollection.java +++ b/src/org/geometerplus/fbreader/library/BookCollection.java @@ -77,7 +77,12 @@ public class BookCollection implements IBookCollection { Collections.synchronizedMap(new LinkedHashMap()); private final Map myBooksById = Collections.synchronizedMap(new HashMap()); - private volatile boolean myBuildStarted = false; + private static enum BuildStatus { + NotStarted, + Started, + Finished + }; + private volatile BuildStatus myBuildStatus = BuildStatus.NotStarted; public BookCollection(BooksDatabase db) { myDatabase = db; @@ -165,6 +170,20 @@ public class BookCollection implements IBookCollection { } } + public List books(String pattern) { + if (pattern == null || pattern.length() == 0) { + return Collections.emptyList(); + } + + final LinkedList filtered = new LinkedList(); + for (Book b : books()) { + if (b.matches(pattern)) { + filtered.add(b); + } + } + return filtered; + } + public List recentBooks() { return books(myDatabase.loadRecentBookIds()); } @@ -210,11 +229,11 @@ public class BookCollection implements IBookCollection { } public synchronized void startBuild() { - if (myBuildStarted) { + if (myBuildStatus != BuildStatus.NotStarted) { fireBuildEvent(Listener.BuildEvent.NotStarted); return; } - myBuildStarted = true; + myBuildStatus = BuildStatus.Started; final Thread builder = new Thread("Library.build") { public void run() { @@ -226,7 +245,7 @@ public class BookCollection implements IBookCollection { fireBuildEvent(Listener.BuildEvent.Failed); } finally { fireBuildEvent(Listener.BuildEvent.Completed); - myBuildStarted = false; + myBuildStatus = BuildStatus.Finished; } } }; diff --git a/src/org/geometerplus/fbreader/library/IBookCollection.java b/src/org/geometerplus/fbreader/library/IBookCollection.java index 32ff31260..abe6f4fe0 100644 --- a/src/org/geometerplus/fbreader/library/IBookCollection.java +++ b/src/org/geometerplus/fbreader/library/IBookCollection.java @@ -23,9 +23,16 @@ import java.util.List; public interface IBookCollection { int size(); + List books(String pattern); + List recentBooks(); + List favorites(); Book getBookById(long id); Book getRecentBook(int index); + void removeBook(Book book, boolean deleteFromDisk); + void addBookToRecentList(Book book); + void setBookFavorite(Book book, boolean favorite); + List allBookmarks(); void saveBookmark(Bookmark bookmark); void deleteBookmark(Bookmark bookmark); diff --git a/src/org/geometerplus/fbreader/library/Library.java b/src/org/geometerplus/fbreader/library/Library.java index 097c12695..02f2c2700 100644 --- a/src/org/geometerplus/fbreader/library/Library.java +++ b/src/org/geometerplus/fbreader/library/Library.java @@ -73,7 +73,8 @@ public final class Library { private static Library ourInstance; public static Library Instance() { if (ourInstance == null) { - ourInstance = new Library(BooksDatabase.Instance()); + final BookCollection collection = new BookCollection(BooksDatabase.Instance()); + ourInstance = new Library(collection); } return ourInstance; } @@ -97,8 +98,8 @@ public final class Library { } } - public Library(BooksDatabase db) { - myCollection = new BookCollection(db); + public Library(BookCollection collection) { + myCollection = collection; myCollection.addListener(new BookCollection.Listener() { public void onBookEvent(BookEvent event, Book book) { switch (event) { @@ -234,10 +235,11 @@ public final class Library { getTagTree(t).getBookSubTree(book, true); } - final SearchResultsTree found = - (SearchResultsTree)getFirstLevelTree(ROOT_FOUND); - if (found != null && book.matches(found.getPattern())) { - found.getBookSubTree(book, true); + synchronized (this) { + final SearchResultsTree found = (SearchResultsTree)getFirstLevelTree(ROOT_FOUND); + if (found != null && book.matches(found.getPattern())) { + found.getBookSubTree(book, true); + } } } @@ -275,10 +277,6 @@ public final class Library { fireModelChangedEvent(ChangeListener.Code.BookAdded); } - public synchronized void startBuild() { - myCollection.startBuild(); - } - public boolean isUpToDate() { return myStatusMask == 0; } @@ -321,19 +319,17 @@ public final class Library { } FirstLevelTree newSearchResults = null; - for (Book book : myCollection.books()) { - if (book.matches(pattern)) { - synchronized (this) { - if (newSearchResults == null) { - if (oldSearchResults != null) { - oldSearchResults.removeSelf(); - } - newSearchResults = new SearchResultsTree(myRootTree, ROOT_FOUND, pattern); - fireModelChangedEvent(ChangeListener.Code.Found); + synchronized (this) { + for (Book book : myCollection.books(pattern)) { + if (newSearchResults == null) { + if (oldSearchResults != null) { + oldSearchResults.removeSelf(); } - newSearchResults.getBookSubTree(book, true); - fireModelChangedEvent(ChangeListener.Code.BookAdded); + newSearchResults = new SearchResultsTree(myRootTree, ROOT_FOUND, pattern); + fireModelChangedEvent(ChangeListener.Code.Found); } + newSearchResults.getBookSubTree(book, true); + fireModelChangedEvent(ChangeListener.Code.BookAdded); } } if (newSearchResults == null) { diff --git a/src/org/geometerplus/fbreader/library/SerializerUtil.java b/src/org/geometerplus/fbreader/library/SerializerUtil.java index 6d5622ab9..388bf972c 100644 --- a/src/org/geometerplus/fbreader/library/SerializerUtil.java +++ b/src/org/geometerplus/fbreader/library/SerializerUtil.java @@ -43,7 +43,23 @@ public abstract class SerializerUtil { return xml != null ? defaultSerializer.deserializeBookmark(xml) : null; } - public static List serialize(List bookmarks) { + public static List serializeBookList(List books) { + final List serialized = new ArrayList(books.size()); + for (Book b : books) { + serialized.add(SerializerUtil.serialize(b)); + } + return serialized; + } + + public static List deserializeBookList(List xmlList) { + final List books = new ArrayList(xmlList.size()); + for (String xml : xmlList) { + books.add(defaultSerializer.deserializeBook(xml)); + } + return books; + } + + public static List serializeBookmarkList(List bookmarks) { final List serialized = new ArrayList(bookmarks.size()); for (Bookmark b : bookmarks) { serialized.add(SerializerUtil.serialize(b));