mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-04 10:19:33 +02:00
BooksDatabase.Instance() should be never used
This commit is contained in:
parent
bb451e9467
commit
903ffec9d4
13 changed files with 150 additions and 49 deletions
|
@ -47,7 +47,6 @@ import org.geometerplus.fbreader.tips.TipsManager;
|
|||
import org.geometerplus.android.fbreader.api.*;
|
||||
import org.geometerplus.android.fbreader.library.BookInfoActivity;
|
||||
import org.geometerplus.android.fbreader.library.KillerCallback;
|
||||
import org.geometerplus.android.fbreader.library.SQLiteBooksDatabase;
|
||||
import org.geometerplus.android.fbreader.libraryService.BookCollectionShadow;
|
||||
import org.geometerplus.android.fbreader.tips.TipsActivity;
|
||||
|
||||
|
@ -347,9 +346,6 @@ public final class FBReader extends ZLAndroidActivity {
|
|||
|
||||
@Override
|
||||
protected FBReaderApp createApplication() {
|
||||
if (SQLiteBooksDatabase.Instance() == null) {
|
||||
new SQLiteBooksDatabase(this, "READER");
|
||||
}
|
||||
return new FBReaderApp(new BookCollectionShadow(this));
|
||||
}
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ class ProcessHyperlinkAction extends FBAndroidAction {
|
|||
openInBrowser(hyperlink.Id);
|
||||
break;
|
||||
case FBHyperlinkType.INTERNAL:
|
||||
Reader.Model.Book.markHyperlinkAsVisited(hyperlink.Id);
|
||||
Reader.Collection.markHyperlinkAsVisited(Reader.Model.Book, hyperlink.Id);
|
||||
Reader.tryOpenFootnote(hyperlink.Id);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -318,7 +318,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
|
|||
SQLiteUtil.bindString(myInsertBookInfoStatement, 1, encoding);
|
||||
SQLiteUtil.bindString(myInsertBookInfoStatement, 2, language);
|
||||
myInsertBookInfoStatement.bindString(3, title);
|
||||
final FileInfoSet infoSet = new FileInfoSet(file);
|
||||
final FileInfoSet infoSet = new FileInfoSet(this, file);
|
||||
myInsertBookInfoStatement.bindLong(4, infoSet.getId(file));
|
||||
return myInsertBookInfoStatement.executeInsert();
|
||||
}
|
||||
|
@ -980,7 +980,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
|
|||
}
|
||||
|
||||
private void updateTables4() {
|
||||
final FileInfoSet fileInfos = new FileInfoSet();
|
||||
final FileInfoSet fileInfos = new FileInfoSet(this);
|
||||
final Cursor cursor = myDatabase.rawQuery(
|
||||
"SELECT file_name FROM Books", null
|
||||
);
|
||||
|
@ -1069,7 +1069,7 @@ public final class SQLiteBooksDatabase extends BooksDatabase {
|
|||
);
|
||||
|
||||
myDatabase.execSQL("DELETE FROM Files");
|
||||
final FileInfoSet infoSet = new FileInfoSet();
|
||||
final FileInfoSet infoSet = new FileInfoSet(this);
|
||||
Cursor cursor = myDatabase.rawQuery(
|
||||
"SELECT file_name FROM Books", null
|
||||
);
|
||||
|
|
|
@ -28,8 +28,13 @@ import android.os.RemoteException;
|
|||
|
||||
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
||||
|
||||
import org.geometerplus.zlibrary.text.view.ZLTextFixedPosition;
|
||||
import org.geometerplus.zlibrary.text.view.ZLTextPosition;
|
||||
|
||||
import org.geometerplus.fbreader.book.*;
|
||||
|
||||
import org.geometerplus.android.fbreader.api.TextPosition;
|
||||
|
||||
public class BookCollectionShadow implements IBookCollection, ServiceConnection {
|
||||
private final Context myContext;
|
||||
private volatile LibraryInterface myInterface;
|
||||
|
@ -187,6 +192,53 @@ public class BookCollectionShadow implements IBookCollection, ServiceConnection
|
|||
}
|
||||
}
|
||||
|
||||
public synchronized ZLTextPosition getStoredPosition(long bookId) {
|
||||
if (myInterface == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
final TextPosition position = myInterface.getStoredPosition(bookId);
|
||||
return new ZLTextFixedPosition(
|
||||
position.ParagraphIndex, position.ElementIndex, position.CharIndex
|
||||
);
|
||||
} catch (RemoteException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void storePosition(long bookId, ZLTextPosition position) {
|
||||
if (myInterface != null) {
|
||||
try {
|
||||
myInterface.storePosition(bookId, new TextPosition(
|
||||
position.getParagraphIndex(), position.getElementIndex(), position.getCharIndex()
|
||||
));
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized boolean isHyperlinkVisited(Book book, String linkId) {
|
||||
if (myInterface == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
return myInterface.isHyperlinkVisited(SerializerUtil.serialize(book), linkId);
|
||||
} catch (RemoteException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void markHyperlinkAsVisited(Book book, String linkId) {
|
||||
if (myInterface != null) {
|
||||
try {
|
||||
myInterface.markHyperlinkAsVisited(SerializerUtil.serialize(book), linkId);
|
||||
} catch (RemoteException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized List<Bookmark> invisibleBookmarks(Book book) {
|
||||
if (myInterface == null) {
|
||||
return Collections.emptyList();
|
||||
|
|
|
@ -5,10 +5,11 @@
|
|||
package org.geometerplus.android.fbreader.libraryService;
|
||||
|
||||
import java.util.List;
|
||||
import org.geometerplus.android.fbreader.api.TextPosition;
|
||||
|
||||
interface LibraryInterface {
|
||||
int size();
|
||||
List<String> books(String pattern);
|
||||
List<String> books(in String pattern);
|
||||
List<String> recentBooks();
|
||||
List<String> favorites();
|
||||
String getBookByFile(in String file);
|
||||
|
@ -20,6 +21,12 @@ interface LibraryInterface {
|
|||
void addBookToRecentList(in String book);
|
||||
void setBookFavorite(in String book, in boolean favorite);
|
||||
|
||||
TextPosition getStoredPosition(in long bookId);
|
||||
void storePosition(in long bookId, in TextPosition position);
|
||||
|
||||
boolean isHyperlinkVisited(in String book, in String linkId);
|
||||
void markHyperlinkAsVisited(in String book, in String linkId);
|
||||
|
||||
List<String> invisibleBookmarks(in String book);
|
||||
List<String> allBookmarks();
|
||||
String saveBookmark(in String bookmark);
|
||||
|
|
|
@ -29,8 +29,12 @@ import android.os.FileObserver;
|
|||
|
||||
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
||||
|
||||
import org.geometerplus.zlibrary.text.view.ZLTextPosition;
|
||||
import org.geometerplus.zlibrary.text.view.ZLTextFixedPosition;
|
||||
|
||||
import org.geometerplus.fbreader.book.*;
|
||||
|
||||
import org.geometerplus.android.fbreader.api.TextPosition;
|
||||
import org.geometerplus.android.fbreader.library.SQLiteBooksDatabase;
|
||||
|
||||
public class LibraryService extends Service {
|
||||
|
@ -167,6 +171,27 @@ public class LibraryService extends Service {
|
|||
myCollection.setBookFavorite(SerializerUtil.deserializeBook(book), favorite);
|
||||
}
|
||||
|
||||
public TextPosition getStoredPosition(long bookId) {
|
||||
final ZLTextPosition position = myCollection.getStoredPosition(bookId);
|
||||
return new TextPosition(
|
||||
position.getParagraphIndex(), position.getElementIndex(), position.getCharIndex()
|
||||
);
|
||||
}
|
||||
|
||||
public void storePosition(long bookId, TextPosition position) {
|
||||
myCollection.storePosition(bookId, new ZLTextFixedPosition(
|
||||
position.ParagraphIndex, position.ElementIndex, position.CharIndex
|
||||
));
|
||||
}
|
||||
|
||||
public boolean isHyperlinkVisited(String book, String linkId) {
|
||||
return myCollection.isHyperlinkVisited(SerializerUtil.deserializeBook(book), linkId);
|
||||
}
|
||||
|
||||
public void markHyperlinkAsVisited(String book, String linkId) {
|
||||
myCollection.markHyperlinkAsVisited(SerializerUtil.deserializeBook(book), linkId);
|
||||
}
|
||||
|
||||
public List<String> invisibleBookmarks(String book) {
|
||||
return SerializerUtil.serializeBookmarkList(
|
||||
myCollection.invisibleBookmarks(SerializerUtil.deserializeBook(book))
|
||||
|
|
|
@ -121,8 +121,7 @@ public class Book {
|
|||
}
|
||||
}
|
||||
|
||||
void loadLists() {
|
||||
final BooksDatabase database = BooksDatabase.Instance();
|
||||
void loadLists(BooksDatabase database) {
|
||||
myAuthors = database.loadAuthors(myId);
|
||||
myTags = database.loadTags(myId);
|
||||
mySeriesInfo = database.loadSeriesInfo(myId);
|
||||
|
@ -336,7 +335,7 @@ public class Book {
|
|||
database.executeAsATransaction(new Runnable() {
|
||||
public void run() {
|
||||
if (myId >= 0) {
|
||||
final FileInfoSet fileInfos = new FileInfoSet(File);
|
||||
final FileInfoSet fileInfos = new FileInfoSet(database, File);
|
||||
database.updateBookInfo(myId, fileInfos.getId(File), myEncoding, myLanguage, myTitle);
|
||||
} else {
|
||||
myId = database.insertBookInfo(File, myEncoding, myLanguage, myTitle);
|
||||
|
@ -364,37 +363,27 @@ public class Book {
|
|||
return true;
|
||||
}
|
||||
|
||||
public ZLTextPosition getStoredPosition() {
|
||||
return BooksDatabase.Instance().getStoredPosition(myId);
|
||||
}
|
||||
|
||||
public void storePosition(ZLTextPosition position) {
|
||||
if (myId != -1) {
|
||||
BooksDatabase.Instance().storePosition(myId, position);
|
||||
}
|
||||
}
|
||||
|
||||
private Set<String> myVisitedHyperlinks;
|
||||
private void initHyperlinkSet() {
|
||||
private void initHyperlinkSet(BooksDatabase database) {
|
||||
if (myVisitedHyperlinks == null) {
|
||||
myVisitedHyperlinks = new TreeSet<String>();
|
||||
if (myId != -1) {
|
||||
myVisitedHyperlinks.addAll(BooksDatabase.Instance().loadVisitedHyperlinks(myId));
|
||||
myVisitedHyperlinks.addAll(database.loadVisitedHyperlinks(myId));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isHyperlinkVisited(String linkId) {
|
||||
initHyperlinkSet();
|
||||
boolean isHyperlinkVisited(BooksDatabase database, String linkId) {
|
||||
initHyperlinkSet(database);
|
||||
return myVisitedHyperlinks.contains(linkId);
|
||||
}
|
||||
|
||||
public void markHyperlinkAsVisited(String linkId) {
|
||||
initHyperlinkSet();
|
||||
void markHyperlinkAsVisited(BooksDatabase database, String linkId) {
|
||||
initHyperlinkSet(database);
|
||||
if (!myVisitedHyperlinks.contains(linkId)) {
|
||||
myVisitedHyperlinks.add(linkId);
|
||||
if (myId != -1) {
|
||||
BooksDatabase.Instance().addVisitedHyperlink(myId, linkId);
|
||||
database.addVisitedHyperlink(myId, linkId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,6 +24,8 @@ import java.util.*;
|
|||
|
||||
import org.geometerplus.zlibrary.core.filesystem.*;
|
||||
|
||||
import org.geometerplus.zlibrary.text.view.ZLTextPosition;
|
||||
|
||||
import org.geometerplus.fbreader.Paths;
|
||||
import org.geometerplus.fbreader.bookmodel.BookReadingException;
|
||||
|
||||
|
@ -87,11 +89,11 @@ public class BookCollection implements IBookCollection {
|
|||
return null;
|
||||
}
|
||||
|
||||
final FileInfoSet fileInfos = new FileInfoSet(bookFile);
|
||||
final FileInfoSet fileInfos = new FileInfoSet(myDatabase, bookFile);
|
||||
|
||||
book = myDatabase.loadBookByFile(fileInfos.getId(bookFile), bookFile);
|
||||
if (book != null) {
|
||||
book.loadLists();
|
||||
book.loadLists(myDatabase);
|
||||
}
|
||||
|
||||
if (book != null && fileInfos.check(physicalFile, physicalFile != bookFile)) {
|
||||
|
@ -125,7 +127,7 @@ public class BookCollection implements IBookCollection {
|
|||
if (book == null) {
|
||||
return null;
|
||||
}
|
||||
book.loadLists();
|
||||
book.loadLists(myDatabase);
|
||||
|
||||
final ZLFile bookFile = book.File;
|
||||
final ZLPhysicalFile physicalFile = bookFile.getPhysicalFile();
|
||||
|
@ -137,7 +139,7 @@ public class BookCollection implements IBookCollection {
|
|||
return null;
|
||||
}
|
||||
|
||||
FileInfoSet fileInfos = new FileInfoSet(physicalFile);
|
||||
FileInfoSet fileInfos = new FileInfoSet(myDatabase, physicalFile);
|
||||
if (fileInfos.check(physicalFile, physicalFile != bookFile)) {
|
||||
addBook(book);
|
||||
return book;
|
||||
|
@ -281,7 +283,7 @@ public class BookCollection implements IBookCollection {
|
|||
|
||||
private void build() {
|
||||
// Step 0: get database books marked as "existing"
|
||||
final FileInfoSet fileInfos = new FileInfoSet();
|
||||
final FileInfoSet fileInfos = new FileInfoSet(myDatabase);
|
||||
final Map<Long,Book> savedBooksByFileId = myDatabase.loadBooks(fileInfos, true);
|
||||
final Map<Long,Book> savedBooksByBookId = new HashMap<Long,Book>();
|
||||
for (Book b : savedBooksByFileId.values()) {
|
||||
|
@ -502,4 +504,22 @@ public class BookCollection implements IBookCollection {
|
|||
|
||||
return ZLResourceFile.createResourceFile("data/help/MiniHelp.en.fb2");
|
||||
}
|
||||
|
||||
public ZLTextPosition getStoredPosition(long bookId) {
|
||||
return myDatabase.getStoredPosition(bookId);
|
||||
}
|
||||
|
||||
public void storePosition(long bookId, ZLTextPosition position) {
|
||||
if (bookId != -1) {
|
||||
myDatabase.storePosition(bookId, position);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isHyperlinkVisited(Book book, String linkId) {
|
||||
return book.isHyperlinkVisited(myDatabase, linkId);
|
||||
}
|
||||
|
||||
public void markHyperlinkAsVisited(Book book, String linkId) {
|
||||
book.markHyperlinkAsVisited(myDatabase, linkId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ public abstract class BooksDatabase {
|
|||
}
|
||||
|
||||
protected Book createBook(long id, long fileId, String title, String encoding, String language) {
|
||||
final FileInfoSet infos = new FileInfoSet(fileId);
|
||||
final FileInfoSet infos = new FileInfoSet(this, fileId);
|
||||
return createBook(id, infos.getFile(fileId), title, encoding, language);
|
||||
}
|
||||
protected Book createBook(long id, ZLFile file, String title, String encoding, String language) {
|
||||
|
|
|
@ -60,16 +60,21 @@ public final class FileInfoSet {
|
|||
private final LinkedHashSet<FileInfo> myInfosToSave = new LinkedHashSet<FileInfo>();
|
||||
private final LinkedHashSet<FileInfo> myInfosToRemove = new LinkedHashSet<FileInfo>();
|
||||
|
||||
public FileInfoSet() {
|
||||
load(BooksDatabase.Instance().loadFileInfos());
|
||||
private final BooksDatabase myDatabase;
|
||||
|
||||
public FileInfoSet(BooksDatabase database) {
|
||||
myDatabase = database;
|
||||
load(database.loadFileInfos());
|
||||
}
|
||||
|
||||
public FileInfoSet(ZLFile file) {
|
||||
load(BooksDatabase.Instance().loadFileInfos(file));
|
||||
public FileInfoSet(BooksDatabase database, ZLFile file) {
|
||||
myDatabase = database;
|
||||
load(database.loadFileInfos(file));
|
||||
}
|
||||
|
||||
FileInfoSet(long fileId) {
|
||||
load(BooksDatabase.Instance().loadFileInfos(fileId));
|
||||
FileInfoSet(BooksDatabase database, long fileId) {
|
||||
myDatabase = database;
|
||||
load(database.loadFileInfos(fileId));
|
||||
}
|
||||
|
||||
private void load(Collection<FileInfo> infos) {
|
||||
|
@ -80,16 +85,15 @@ public final class FileInfoSet {
|
|||
}
|
||||
|
||||
public void save() {
|
||||
final BooksDatabase database = BooksDatabase.Instance();
|
||||
database.executeAsATransaction(new Runnable() {
|
||||
myDatabase.executeAsATransaction(new Runnable() {
|
||||
public void run() {
|
||||
for (FileInfo info : myInfosToRemove) {
|
||||
database.removeFileInfo(info.Id);
|
||||
myDatabase.removeFileInfo(info.Id);
|
||||
myInfosByPair.remove(new Pair(info.Name, info.Parent));
|
||||
}
|
||||
myInfosToRemove.clear();
|
||||
for (FileInfo info : myInfosToSave) {
|
||||
database.saveFileInfo(info);
|
||||
myDatabase.saveFileInfo(info);
|
||||
}
|
||||
myInfosToSave.clear();
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@ import java.util.List;
|
|||
|
||||
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
||||
|
||||
import org.geometerplus.zlibrary.text.view.ZLTextPosition;
|
||||
|
||||
public interface IBookCollection {
|
||||
public interface Listener {
|
||||
public enum BookEvent {
|
||||
|
@ -59,6 +61,12 @@ public interface IBookCollection {
|
|||
void addBookToRecentList(Book book);
|
||||
void setBookFavorite(Book book, boolean favorite);
|
||||
|
||||
ZLTextPosition getStoredPosition(long bookId);
|
||||
void storePosition(long bookId, ZLTextPosition position);
|
||||
|
||||
boolean isHyperlinkVisited(Book book, String linkId);
|
||||
void markHyperlinkAsVisited(Book book, String linkId);
|
||||
|
||||
List<Bookmark> allBookmarks();
|
||||
List<Bookmark> invisibleBookmarks(Book book);
|
||||
void saveBookmark(Bookmark bookmark);
|
||||
|
|
|
@ -261,7 +261,7 @@ public final class FBReaderApp extends ZLApplication {
|
|||
Collection.saveBook(book, false);
|
||||
ZLTextHyphenator.Instance().load(book.getLanguage());
|
||||
BookTextView.setModel(Model.getTextModel());
|
||||
BookTextView.gotoPosition(book.getStoredPosition());
|
||||
BookTextView.gotoPosition(Collection.getStoredPosition(book.getId()));
|
||||
if (bookmark == null) {
|
||||
setView(BookTextView);
|
||||
} else {
|
||||
|
@ -366,8 +366,8 @@ public final class FBReaderApp extends ZLApplication {
|
|||
}
|
||||
|
||||
public void storePosition() {
|
||||
if (Model != null && BookTextView != null) {
|
||||
Model.Book.storePosition(BookTextView.getStartCursor());
|
||||
if (Model != null && Model.Book != null && BookTextView != null) {
|
||||
Collection.storePosition(Model.Book.getId(), BookTextView.getStartCursor());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -396,7 +396,7 @@ public final class FBView extends ZLTextView {
|
|||
case FBHyperlinkType.NONE:
|
||||
return profile.RegularTextOption.getValue();
|
||||
case FBHyperlinkType.INTERNAL:
|
||||
return myReader.Model.Book.isHyperlinkVisited(hyperlink.Id)
|
||||
return myReader.Collection.isHyperlinkVisited(myReader.Model.Book, hyperlink.Id)
|
||||
? profile.VisitedHyperlinkTextOption.getValue()
|
||||
: profile.HyperlinkTextOption.getValue();
|
||||
case FBHyperlinkType.EXTERNAL:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue