diff --git a/src/org/geometerplus/android/fbreader/BookmarksActivity.java b/src/org/geometerplus/android/fbreader/BookmarksActivity.java index d1643c918..27bcdf63a 100644 --- a/src/org/geometerplus/android/fbreader/BookmarksActivity.java +++ b/src/org/geometerplus/android/fbreader/BookmarksActivity.java @@ -145,14 +145,6 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte } } - @Override - public void onPause() { - for (Bookmark bookmark : myAllBooksBookmarks) { - bookmark.save(); - } - super.onPause(); - } - @Override protected void onStop() { myCollection.unbind(); @@ -225,7 +217,7 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte // TODO: implement return true; case DELETE_ITEM_ID: - bookmark.delete(); + myCollection.deleteBookmark(bookmark); myThisBookBookmarks.remove(bookmark); myAllBooksBookmarks.remove(bookmark); mySearchResults.remove(bookmark); @@ -239,6 +231,7 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte final FBReaderApp fbreader = (FBReaderApp)FBReaderApp.Instance(); final Bookmark bookmark = fbreader.addBookmark(20, true); if (bookmark != null) { + myCollection.saveBookmark(bookmark); myThisBookBookmarks.add(0, bookmark); myAllBooksBookmarks.add(0, bookmark); invalidateAllViews(); @@ -246,7 +239,8 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte } private void gotoBookmark(Bookmark bookmark) { - bookmark.onOpen(); + bookmark.markAsAccessed(); + myCollection.saveBookmark(bookmark); final FBReaderApp fbreader = (FBReaderApp)FBReaderApp.Instance(); final long bookId = bookmark.getBookId(); if (fbreader.Model == null || fbreader.Model.Book.getId() != bookId) { diff --git a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java index 61c2babc2..367cc9a46 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java +++ b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java @@ -72,6 +72,26 @@ public class BookCollectionShadow implements IBookCollection, ServiceConnection } } + public void saveBookmark(Bookmark bookmark) { + if (myInterface != null) { + try { + bookmark.update(SerializerUtil.deserializeBookmark( + myInterface.saveBookmark(SerializerUtil.serialize(bookmark)) + )); + } catch (RemoteException e) { + } + } + } + + public void deleteBookmark(Bookmark bookmark) { + if (myInterface != null) { + try { + myInterface.deleteBookmark(SerializerUtil.serialize(bookmark)); + } catch (RemoteException e) { + } + } + } + // method from ServiceConnection interface public synchronized void onServiceConnected(ComponentName name, IBinder service) { myInterface = LibraryInterface.Stub.asInterface(service); diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl index d42a643eb..4ecadc158 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl @@ -8,5 +8,8 @@ import java.util.List; interface LibraryInterface { String bookById(in long id); + List allBookmarks(); + String saveBookmark(in String bookmark); + void deleteBookmark(in String bookmark); } diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java index f41f88861..4fb8651f9 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java @@ -76,6 +76,16 @@ public class LibraryService extends Service { public List allBookmarks() { return SerializerUtil.serialize(myCollection.allBookmarks()); } + + public String saveBookmark(String serialized) { + final Bookmark bookmark = SerializerUtil.deserializeBookmark(serialized); + myCollection.saveBookmark(bookmark); + return SerializerUtil.serialize(bookmark); + } + + public void deleteBookmark(String serialized) { + myCollection.deleteBookmark(SerializerUtil.deserializeBookmark(serialized)); + } } private LibraryImplementation myLibrary; diff --git a/src/org/geometerplus/fbreader/library/BookCollection.java b/src/org/geometerplus/fbreader/library/BookCollection.java index 7356f7952..55df07979 100644 --- a/src/org/geometerplus/fbreader/library/BookCollection.java +++ b/src/org/geometerplus/fbreader/library/BookCollection.java @@ -428,4 +428,16 @@ public class BookCollection implements IBookCollection { Collections.sort(list, new Bookmark.ByTimeComparator()); return list; } + + public void saveBookmark(Bookmark bookmark) { + if (bookmark != null) { + bookmark.setId(BooksDatabase.Instance().saveBookmark(bookmark)); + } + } + + public void deleteBookmark(Bookmark bookmark) { + if (bookmark != null && bookmark.getId() != -1) { + BooksDatabase.Instance().deleteBookmark(bookmark); + } + } } diff --git a/src/org/geometerplus/fbreader/library/Bookmark.java b/src/org/geometerplus/fbreader/library/Bookmark.java index caa5cdc6a..82f9572b1 100644 --- a/src/org/geometerplus/fbreader/library/Bookmark.java +++ b/src/org/geometerplus/fbreader/library/Bookmark.java @@ -44,8 +44,6 @@ public final class Bookmark extends ZLTextFixedPosition { public final String ModelId; public final boolean IsVisible; - private boolean myIsChanged; - Bookmark(long id, long bookId, String bookTitle, String text, Date creationDate, Date modificationDate, Date accessDate, int accessCount, String modelId, int paragraphIndex, int elementIndex, int charIndex, boolean isVisible) { super(paragraphIndex, elementIndex, charIndex); @@ -65,7 +63,6 @@ public final class Bookmark extends ZLTextFixedPosition { myAccessCount = accessCount; ModelId = modelId; IsVisible = isVisible; - myIsChanged = false; } public Bookmark(Book book, String modelId, ZLTextWordCursor cursor, int maxLength, boolean isVisible) { @@ -82,7 +79,6 @@ public final class Bookmark extends ZLTextFixedPosition { myCreationDate = new Date(); ModelId = modelId; IsVisible = isVisible; - myIsChanged = true; } public long getId() { @@ -124,28 +120,13 @@ public final class Bookmark extends ZLTextFixedPosition { myText = text; myModificationDate = new Date(); myLatestDate = myModificationDate; - myIsChanged = true; } } - public void onOpen() { + public void markAsAccessed() { myAccessDate = new Date(); ++myAccessCount; myLatestDate = myAccessDate; - myIsChanged = true; - } - - public void save() { - if (myIsChanged) { - myId = BooksDatabase.Instance().saveBookmark(this); - myIsChanged = false; - } - } - - public void delete() { - if (myId != -1) { - BooksDatabase.Instance().deleteBookmark(this); - } } public static class ByTimeComparator implements Comparator { @@ -239,4 +220,25 @@ mainLoop: } return builder.toString(); } + + void setId(long id) { + myId = id; + } + + public void update(Bookmark other) { + // TODO: copy other fields (?) + myId = other.myId; + } + + // TODO: this method should be removed + public void save() { + myId = BooksDatabase.Instance().saveBookmark(this); + } + + // TODO: this method should be removed + public void delete() { + if (myId != -1) { + BooksDatabase.Instance().deleteBookmark(this); + } + } } diff --git a/src/org/geometerplus/fbreader/library/IBookCollection.java b/src/org/geometerplus/fbreader/library/IBookCollection.java index 0d337a7ae..a7dca050c 100644 --- a/src/org/geometerplus/fbreader/library/IBookCollection.java +++ b/src/org/geometerplus/fbreader/library/IBookCollection.java @@ -23,5 +23,8 @@ import java.util.List; public interface IBookCollection { Book getBookById(long id); + List allBookmarks(); + void saveBookmark(Bookmark bookmark); + void deleteBookmark(Bookmark bookmark); } diff --git a/src/org/geometerplus/fbreader/library/XMLSerializer.java b/src/org/geometerplus/fbreader/library/XMLSerializer.java index 65ae8be0f..1701bca3c 100644 --- a/src/org/geometerplus/fbreader/library/XMLSerializer.java +++ b/src/org/geometerplus/fbreader/library/XMLSerializer.java @@ -126,7 +126,7 @@ class XMLSerializer extends AbstractSerializer { return deserializer.getBookmark(); } - private static DateFormat ourDateFormatter = DateFormat.getDateInstance(DateFormat.FULL, Locale.ENGLISH); + private static DateFormat ourDateFormatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.FULL, Locale.ENGLISH); private static String formatDate(Date date) { return date != null ? ourDateFormatter.format(date) : null; } @@ -433,7 +433,7 @@ class XMLSerializer extends AbstractSerializer { @Override public void endDocumentHandler() { - if (myId == -1 || myBookId == -1) { + if (myBookId == -1) { return; } myBookmark = new Bookmark(