diff --git a/src/org/geometerplus/android/fbreader/libraryService/SQLiteBooksDatabase.java b/src/org/geometerplus/android/fbreader/libraryService/SQLiteBooksDatabase.java index a96a671a1..c754bc152 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/SQLiteBooksDatabase.java +++ b/src/org/geometerplus/android/fbreader/libraryService/SQLiteBooksDatabase.java @@ -222,7 +222,7 @@ final class SQLiteBooksDatabase extends BooksDatabase { "SELECT book_id,author_id FROM BookAuthor ORDER BY author_index", null ); while (cursor.moveToNext()) { - Book book = booksById.get(cursor.getLong(0)); + final Book book = booksById.get(cursor.getLong(0)); if (book != null) { Author author = authorById.get(cursor.getLong(1)); if (author != null) { @@ -234,7 +234,7 @@ final class SQLiteBooksDatabase extends BooksDatabase { cursor = myDatabase.rawQuery("SELECT book_id,tag_id FROM BookTag", null); while (cursor.moveToNext()) { - Book book = booksById.get(cursor.getLong(0)); + final Book book = booksById.get(cursor.getLong(0)); if (book != null) { addTag(book, getTagById(cursor.getLong(1))); } @@ -254,7 +254,7 @@ final class SQLiteBooksDatabase extends BooksDatabase { "SELECT book_id,series_id,book_index FROM BookSeries", null ); while (cursor.moveToNext()) { - Book book = booksById.get(cursor.getLong(0)); + final Book book = booksById.get(cursor.getLong(0)); if (book != null) { final String series = seriesById.get(cursor.getLong(1)); if (series != null) { @@ -263,6 +263,43 @@ final class SQLiteBooksDatabase extends BooksDatabase { } } cursor.close(); + + cursor = myDatabase.rawQuery( + "SELECT book_id,type,uid FROM BookUid", null + ); + while (cursor.moveToNext()) { + final Book book = booksById.get(cursor.getLong(0)); + if (book != null) { + book.addUid(cursor.getString(1), cursor.getString(2)); + } + } + cursor.close(); + + cursor = myDatabase.rawQuery( + "SELECT BookLabel.book_id,Labels.name FROM Labels" + + " INNER JOIN BookLabel ON BookLabel.label_id=Labels.label_id", + null + ); + while (cursor.moveToNext()) { + final Book book = booksById.get(cursor.getLong(0)); + if (book != null) { + book.addLabel(cursor.getString(1)); + } + } + cursor.close(); + + cursor = myDatabase.rawQuery( + "SELECT book_id FROM Bookmarks WHERE visible = 1 GROUP by book_id", + null + ); + while (cursor.moveToNext()) { + final Book book = booksById.get(cursor.getLong(0)); + if (book != null) { + book.HasBookmark = true; + } + } + cursor.close(); + return booksByFileId; } @@ -781,6 +818,17 @@ final class SQLiteBooksDatabase extends BooksDatabase { myRemoveLabelStatement.execute(); } + @Override + protected boolean hasVisibleBookmark(long bookId) { + final Cursor cursor = myDatabase.rawQuery( + "SELECT bookmark_id FROM Bookmarks WHERE book_id = " + bookId + + " AND visible = 1 LIMIT 1", null + ); + final boolean result = cursor.moveToNext(); + cursor.close(); + return result; + } + @Override protected List loadBookmarks(BookmarkQuery query) { final LinkedList list = new LinkedList(); diff --git a/src/org/geometerplus/fbreader/book/Book.java b/src/org/geometerplus/fbreader/book/Book.java index 72ac5479d..288194646 100644 --- a/src/org/geometerplus/fbreader/book/Book.java +++ b/src/org/geometerplus/fbreader/book/Book.java @@ -50,6 +50,8 @@ public class Book extends TitledEntity { private volatile SeriesInfo mySeriesInfo; private volatile List myUids; + public volatile boolean HasBookmark; + private volatile boolean myIsSaved; private static final WeakReference NULL_IMAGE = new WeakReference(null); @@ -146,6 +148,8 @@ public class Book extends TitledEntity { myLabels = database.listLabels(myId); mySeriesInfo = database.getSeriesInfo(myId); myUids = database.listUids(myId); + HasBookmark = database.hasVisibleBookmark(myId); + System.err.println(myId + ": " + getTitle() + " :: " + HasBookmark); myIsSaved = true; if (myUids == null || myUids.isEmpty()) { try { diff --git a/src/org/geometerplus/fbreader/book/BookCollection.java b/src/org/geometerplus/fbreader/book/BookCollection.java index b99585117..4834a1990 100644 --- a/src/org/geometerplus/fbreader/book/BookCollection.java +++ b/src/org/geometerplus/fbreader/book/BookCollection.java @@ -612,12 +612,24 @@ public class BookCollection extends AbstractBookCollection { public void saveBookmark(Bookmark bookmark) { if (bookmark != null) { bookmark.setId(myDatabase.saveBookmark(bookmark)); + if (bookmark.IsVisible) { + final Book book = getBookById(bookmark.getBookId()); + if (book != null) { + book.HasBookmark = true; + } + } } } public void deleteBookmark(Bookmark bookmark) { if (bookmark != null && bookmark.getId() != -1) { myDatabase.deleteBookmark(bookmark); + if (bookmark.IsVisible) { + final Book book = getBookById(bookmark.getBookId()); + if (book != null) { + book.HasBookmark = myDatabase.hasVisibleBookmark(bookmark.getBookId()); + } + } } } diff --git a/src/org/geometerplus/fbreader/book/BooksDatabase.java b/src/org/geometerplus/fbreader/book/BooksDatabase.java index 08320c929..d53522aa2 100644 --- a/src/org/geometerplus/fbreader/book/BooksDatabase.java +++ b/src/org/geometerplus/fbreader/book/BooksDatabase.java @@ -56,6 +56,7 @@ public abstract class BooksDatabase { protected abstract List listLabels(long bookId); protected abstract SeriesInfo getSeriesInfo(long bookId); protected abstract List listUids(long bookId); + protected abstract boolean hasVisibleBookmark(long bookId); protected abstract Long bookIdByUid(UID uid); diff --git a/src/org/geometerplus/fbreader/book/Filter.java b/src/org/geometerplus/fbreader/book/Filter.java index e170aecce..60ce7fc2e 100644 --- a/src/org/geometerplus/fbreader/book/Filter.java +++ b/src/org/geometerplus/fbreader/book/Filter.java @@ -109,8 +109,7 @@ public abstract class Filter { public final static class HasBookmark extends Filter { public boolean matches(Book book) { - // TODO: implement - return true; + return book != null && book.HasBookmark; } } diff --git a/src/org/geometerplus/fbreader/book/XMLSerializer.java b/src/org/geometerplus/fbreader/book/XMLSerializer.java index 628a7ef33..1ea8fd1b9 100644 --- a/src/org/geometerplus/fbreader/book/XMLSerializer.java +++ b/src/org/geometerplus/fbreader/book/XMLSerializer.java @@ -208,6 +208,11 @@ class XMLSerializer extends AbstractSerializer { appendTagWithContent(buffer, "calibre:series_index", seriesInfo.Index); } } + + if (book.HasBookmark) { + appendTag(buffer, "has-bookmark", true); + } + // TODO: serialize description (?) // TODO: serialize cover (?) @@ -382,6 +387,7 @@ class XMLSerializer extends AbstractSerializer { private final StringBuilder myAuthorName = new StringBuilder(); private final StringBuilder mySeriesTitle = new StringBuilder(); private final StringBuilder mySeriesIndex = new StringBuilder(); + private boolean myHasBookmark; private Book myBook; @@ -405,6 +411,7 @@ class XMLSerializer extends AbstractSerializer { myAuthors.clear(); myTags.clear(); myLabels.clear(); + myHasBookmark = false; myState = State.READ_NOTHING; } @@ -434,6 +441,7 @@ class XMLSerializer extends AbstractSerializer { myBook.addUid(uid); } myBook.setSeriesInfoWithNoCheck(string(mySeriesTitle), string(mySeriesIndex)); + myBook.HasBookmark = myHasBookmark; } @Override @@ -475,6 +483,8 @@ class XMLSerializer extends AbstractSerializer { myState = State.READ_SERIES_TITLE; } else if ("series_index".equals(localName) && XMLNamespaces.CalibreMetadata.equals(uri)) { myState = State.READ_SERIES_INDEX; + } else if ("has-bookmark".equals(localName)) { + myHasBookmark = true; } else if ("link".equals(localName)) { // TODO: use "rel" attribute myUrl = attributes.getValue("href");