mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-05 10:49:24 +02:00
BookmarksActivity optimization
This commit is contained in:
parent
31247e39bf
commit
19aeb9c9b6
8 changed files with 95 additions and 24 deletions
|
@ -44,7 +44,7 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
|
||||||
private static final int DELETE_ITEM_ID = 2;
|
private static final int DELETE_ITEM_ID = 2;
|
||||||
|
|
||||||
private final BookCollectionShadow myCollection = new BookCollectionShadow();
|
private final BookCollectionShadow myCollection = new BookCollectionShadow();
|
||||||
private volatile long myBookId = -1;
|
private volatile Book myBook;
|
||||||
|
|
||||||
private final Comparator<Bookmark> myComparator = new Bookmark.ByTimeComparator();
|
private final Comparator<Bookmark> myComparator = new Bookmark.ByTimeComparator();
|
||||||
|
|
||||||
|
@ -68,6 +68,7 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
|
||||||
super.onCreate(bundle);
|
super.onCreate(bundle);
|
||||||
|
|
||||||
Thread.setDefaultUncaughtExceptionHandler(new org.geometerplus.zlibrary.ui.android.library.UncaughtExceptionHandler(this));
|
Thread.setDefaultUncaughtExceptionHandler(new org.geometerplus.zlibrary.ui.android.library.UncaughtExceptionHandler(this));
|
||||||
|
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
|
||||||
|
|
||||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||||
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
|
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
|
||||||
|
@ -78,14 +79,26 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
|
||||||
final TabHost host = getTabHost();
|
final TabHost host = getTabHost();
|
||||||
LayoutInflater.from(this).inflate(R.layout.bookmarks, host.getTabContentView(), true);
|
LayoutInflater.from(this).inflate(R.layout.bookmarks, host.getTabContentView(), true);
|
||||||
|
|
||||||
final Book book =
|
myBook = SerializerUtil.deserializeBook(getIntent().getStringExtra(FBReader.BOOK_KEY));
|
||||||
SerializerUtil.deserializeBook(getIntent().getStringExtra(FBReader.BOOK_KEY));
|
|
||||||
myBookId = book != null ? book.getId() : -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Initializer implements Runnable {
|
private class Initializer implements Runnable {
|
||||||
public void run() {
|
public void run() {
|
||||||
long id = 0;
|
long id = 0;
|
||||||
|
if (myBook != null) {
|
||||||
|
while (true) {
|
||||||
|
final List<Bookmark> thisBookBookmarks =
|
||||||
|
myCollection.bookmarksForBook(myBook, id, 20);
|
||||||
|
if (thisBookBookmarks.isEmpty()) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
id = thisBookBookmarks.get(thisBookBookmarks.size() - 1).getId() + 1;
|
||||||
|
}
|
||||||
|
myThisBookAdapter.addAll(thisBookBookmarks);
|
||||||
|
myAllBooksAdapter.addAll(thisBookBookmarks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
id = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
final List<Bookmark> allBookmarks = myCollection.bookmarks(id, 20);
|
final List<Bookmark> allBookmarks = myCollection.bookmarks(id, 20);
|
||||||
if (allBookmarks.isEmpty()) {
|
if (allBookmarks.isEmpty()) {
|
||||||
|
@ -93,18 +106,13 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
|
||||||
} else {
|
} else {
|
||||||
id = allBookmarks.get(allBookmarks.size() - 1).getId() + 1;
|
id = allBookmarks.get(allBookmarks.size() - 1).getId() + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
myAllBooksAdapter.addAll(allBookmarks);
|
myAllBooksAdapter.addAll(allBookmarks);
|
||||||
if (myBookId != -1) {
|
|
||||||
final List<Bookmark> thisBookBookmarks = new LinkedList<Bookmark>();
|
|
||||||
for (Bookmark b : allBookmarks) {
|
|
||||||
if (b.getBookId() == myBookId) {
|
|
||||||
thisBookBookmarks.add(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
myThisBookAdapter.addAll(thisBookBookmarks);
|
|
||||||
}
|
}
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
setProgressBarIndeterminateVisibility(false);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,13 +120,19 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
|
||||||
protected void onStart() {
|
protected void onStart() {
|
||||||
super.onStart();
|
super.onStart();
|
||||||
|
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
setProgressBarIndeterminateVisibility(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
myCollection.bindToService(this, new Runnable() {
|
myCollection.bindToService(this, new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
if (myAllBooksAdapter != null) {
|
if (myAllBooksAdapter != null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (myBookId != -1) {
|
if (myBook != null) {
|
||||||
myThisBookAdapter = new BookmarksAdapter(
|
myThisBookAdapter = new BookmarksAdapter(
|
||||||
createTab("thisBook", R.id.this_book), true
|
createTab("thisBook", R.id.this_book), true
|
||||||
);
|
);
|
||||||
|
@ -130,9 +144,7 @@ public class BookmarksActivity extends TabActivity implements MenuItem.OnMenuIte
|
||||||
);
|
);
|
||||||
findViewById(R.id.search_results).setVisibility(View.GONE);
|
findViewById(R.id.search_results).setVisibility(View.GONE);
|
||||||
|
|
||||||
final Thread initializer = new Thread(new Initializer());
|
new Thread(new Initializer()).start();
|
||||||
initializer.setPriority((Thread.MIN_PRIORITY + Thread.NORM_PRIORITY) / 2);
|
|
||||||
initializer.start();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -534,6 +534,19 @@ public class BookCollectionShadow extends AbstractBookCollection implements Serv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized List<Bookmark> bookmarksForBook(Book book, long fromId, int limitCount) {
|
||||||
|
if (myInterface == null) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return SerializerUtil.deserializeBookmarkList(myInterface.bookmarksForBook(
|
||||||
|
SerializerUtil.serialize(book), fromId, limitCount
|
||||||
|
));
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public synchronized void saveBookmark(Bookmark bookmark) {
|
public synchronized void saveBookmark(Bookmark bookmark) {
|
||||||
if (myInterface != null) {
|
if (myInterface != null) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -54,6 +54,7 @@ interface LibraryInterface {
|
||||||
|
|
||||||
List<String> invisibleBookmarks(in String book);
|
List<String> invisibleBookmarks(in String book);
|
||||||
List<String> bookmarks(in long fromId, in int limitCount);
|
List<String> bookmarks(in long fromId, in int limitCount);
|
||||||
|
List<String> bookmarksForBook(in String book, in long fromId, in int limitCount);
|
||||||
String saveBookmark(in String bookmark);
|
String saveBookmark(in String bookmark);
|
||||||
void deleteBookmark(in String bookmark);
|
void deleteBookmark(in String bookmark);
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,6 +304,12 @@ public class LibraryService extends Service {
|
||||||
return SerializerUtil.serializeBookmarkList(myCollection.bookmarks(fromId, limitCount));
|
return SerializerUtil.serializeBookmarkList(myCollection.bookmarks(fromId, limitCount));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<String> bookmarksForBook(String book, long fromId, int limitCount) {
|
||||||
|
return SerializerUtil.serializeBookmarkList(myCollection.bookmarksForBook(
|
||||||
|
SerializerUtil.deserializeBook(book), fromId, limitCount
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
public String saveBookmark(String serialized) {
|
public String saveBookmark(String serialized) {
|
||||||
final Bookmark bookmark = SerializerUtil.deserializeBookmark(serialized);
|
final Bookmark bookmark = SerializerUtil.deserializeBookmark(serialized);
|
||||||
myCollection.saveBookmark(bookmark);
|
myCollection.saveBookmark(bookmark);
|
||||||
|
|
|
@ -735,10 +735,10 @@ final class SQLiteBooksDatabase extends BooksDatabase {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<Bookmark> loadBookmarks(long bookId, boolean visible) {
|
protected List<Bookmark> loadInvisibleBookmarks(long bookId) {
|
||||||
LinkedList<Bookmark> list = new LinkedList<Bookmark>();
|
LinkedList<Bookmark> list = new LinkedList<Bookmark>();
|
||||||
Cursor cursor = myDatabase.rawQuery(
|
Cursor cursor = myDatabase.rawQuery(
|
||||||
"SELECT Bookmarks.bookmark_id,Bookmarks.book_id,Books.title,Bookmarks.bookmark_text,Bookmarks.creation_time,Bookmarks.modification_time,Bookmarks.access_time,Bookmarks.access_counter,Bookmarks.model_id,Bookmarks.paragraph,Bookmarks.word,Bookmarks.char FROM Bookmarks INNER JOIN Books ON Books.book_id = Bookmarks.book_id WHERE Bookmarks.book_id = ? AND Bookmarks.visible = ?", new String[] { "" + bookId, visible ? "1" : "0" }
|
"SELECT bm.bookmark_id,bm.book_id,b.title,bm.bookmark_text,bm.creation_time,bm.modification_time,bm.access_time,bm.access_counter,bm.model_id,bm.paragraph,bm.word,bm.char FROM Bookmarks AS bm INNER JOIN Books AS b ON b.book_id = bm.book_id WHERE bm.book_id = ? AND bm.visible = 0", new String[] { String.valueOf(bookId) }
|
||||||
);
|
);
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
list.add(createBookmark(
|
list.add(createBookmark(
|
||||||
|
@ -754,7 +754,7 @@ final class SQLiteBooksDatabase extends BooksDatabase {
|
||||||
(int)cursor.getLong(9),
|
(int)cursor.getLong(9),
|
||||||
(int)cursor.getLong(10),
|
(int)cursor.getLong(10),
|
||||||
(int)cursor.getLong(11),
|
(int)cursor.getLong(11),
|
||||||
visible
|
false
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
cursor.close();
|
cursor.close();
|
||||||
|
@ -764,7 +764,6 @@ final class SQLiteBooksDatabase extends BooksDatabase {
|
||||||
@Override
|
@Override
|
||||||
protected List<Bookmark> loadVisibleBookmarks(long fromId, int limitCount) {
|
protected List<Bookmark> loadVisibleBookmarks(long fromId, int limitCount) {
|
||||||
LinkedList<Bookmark> list = new LinkedList<Bookmark>();
|
LinkedList<Bookmark> list = new LinkedList<Bookmark>();
|
||||||
myDatabase.execSQL("DELETE FROM Bookmarks WHERE book_id = -1");
|
|
||||||
Cursor cursor = myDatabase.rawQuery("SELECT" +
|
Cursor cursor = myDatabase.rawQuery("SELECT" +
|
||||||
" bm.bookmark_id,bm.book_id,b.title,bm.bookmark_text," +
|
" bm.bookmark_id,bm.book_id,b.title,bm.bookmark_text," +
|
||||||
"bm.creation_time,bm.modification_time,bm.access_time,bm.access_counter," +
|
"bm.creation_time,bm.modification_time,bm.access_time,bm.access_counter," +
|
||||||
|
@ -794,6 +793,40 @@ final class SQLiteBooksDatabase extends BooksDatabase {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<Bookmark> loadVisibleBookmarks(long bookId, long fromId, int limitCount) {
|
||||||
|
LinkedList<Bookmark> list = new LinkedList<Bookmark>();
|
||||||
|
Cursor cursor = myDatabase.rawQuery("SELECT" +
|
||||||
|
" bm.bookmark_id,bm.book_id,b.title,bm.bookmark_text," +
|
||||||
|
"bm.creation_time,bm.modification_time,bm.access_time,bm.access_counter," +
|
||||||
|
"bm.model_id,bm.paragraph,bm.word,bm.char" +
|
||||||
|
" FROM Bookmarks AS bm INNER JOIN Books AS b ON b.book_id = bm.book_id" +
|
||||||
|
" WHERE b.book_id = ? AND bm.bookmark_id >= ? AND bm.visible = 1" +
|
||||||
|
" ORDER BY bm.bookmark_id LIMIT ?",
|
||||||
|
new String[] { String.valueOf(bookId), String.valueOf(fromId), String.valueOf(limitCount) }
|
||||||
|
);
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
list.add(createBookmark(
|
||||||
|
cursor.getLong(0),
|
||||||
|
cursor.getLong(1),
|
||||||
|
cursor.getString(2),
|
||||||
|
cursor.getString(3),
|
||||||
|
SQLiteUtil.getDate(cursor, 4),
|
||||||
|
SQLiteUtil.getDate(cursor, 5),
|
||||||
|
SQLiteUtil.getDate(cursor, 6),
|
||||||
|
(int)cursor.getLong(7),
|
||||||
|
cursor.getString(8),
|
||||||
|
(int)cursor.getLong(9),
|
||||||
|
(int)cursor.getLong(10),
|
||||||
|
(int)cursor.getLong(11),
|
||||||
|
true
|
||||||
|
));
|
||||||
|
}
|
||||||
|
cursor.close();
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
private SQLiteStatement myInsertBookmarkStatement;
|
private SQLiteStatement myInsertBookmarkStatement;
|
||||||
private SQLiteStatement myUpdateBookmarkStatement;
|
private SQLiteStatement myUpdateBookmarkStatement;
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -761,8 +761,12 @@ public class BookCollection extends AbstractBookCollection {
|
||||||
return myDatabase.loadVisibleBookmarks(fromId, limitCount);
|
return myDatabase.loadVisibleBookmarks(fromId, limitCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Bookmark> bookmarksForBook(Book book, long fromId, int limitCount) {
|
||||||
|
return myDatabase.loadVisibleBookmarks(book.getId(), fromId, limitCount);
|
||||||
|
}
|
||||||
|
|
||||||
public List<Bookmark> invisibleBookmarks(Book book) {
|
public List<Bookmark> invisibleBookmarks(Book book) {
|
||||||
final List<Bookmark> list = myDatabase.loadBookmarks(book.getId(), false);
|
final List<Bookmark> list = myDatabase.loadInvisibleBookmarks(book.getId());
|
||||||
Collections.sort(list, new Bookmark.ByTimeComparator());
|
Collections.sort(list, new Bookmark.ByTimeComparator());
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,8 +86,9 @@ public abstract class BooksDatabase {
|
||||||
return new Bookmark(id, bookId, bookTitle, text, creationDate, modificationDate, accessDate, accessCounter, modelId, paragraphIndex, wordIndex, charIndex, isVisible);
|
return new Bookmark(id, bookId, bookTitle, text, creationDate, modificationDate, accessDate, accessCounter, modelId, paragraphIndex, wordIndex, charIndex, isVisible);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract List<Bookmark> loadBookmarks(long bookId, boolean isVisible);
|
protected abstract List<Bookmark> loadInvisibleBookmarks(long bookId);
|
||||||
protected abstract List<Bookmark> loadVisibleBookmarks(long fromId, int limitCount);
|
protected abstract List<Bookmark> loadVisibleBookmarks(long fromId, int limitCount);
|
||||||
|
protected abstract List<Bookmark> loadVisibleBookmarks(long bookId, long fromId, int limitCount);
|
||||||
protected abstract long saveBookmark(Bookmark bookmark);
|
protected abstract long saveBookmark(Bookmark bookmark);
|
||||||
protected abstract void deleteBookmark(Bookmark bookmark);
|
protected abstract void deleteBookmark(Bookmark bookmark);
|
||||||
|
|
||||||
|
|
|
@ -92,6 +92,7 @@ public interface IBookCollection {
|
||||||
void markHyperlinkAsVisited(Book book, String linkId);
|
void markHyperlinkAsVisited(Book book, String linkId);
|
||||||
|
|
||||||
List<Bookmark> bookmarks(long fromId, int limitCount);
|
List<Bookmark> bookmarks(long fromId, int limitCount);
|
||||||
|
List<Bookmark> bookmarksForBook(Book book, long fromId, int limitCount);
|
||||||
List<Bookmark> invisibleBookmarks(Book book);
|
List<Bookmark> invisibleBookmarks(Book book);
|
||||||
void saveBookmark(Bookmark bookmark);
|
void saveBookmark(Bookmark bookmark);
|
||||||
void deleteBookmark(Bookmark bookmark);
|
void deleteBookmark(Bookmark bookmark);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue