1
0
Fork 0
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:
Nikolay Pultsin 2013-01-13 08:42:21 +04:00
parent bb451e9467
commit 903ffec9d4
13 changed files with 150 additions and 49 deletions

View file

@ -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));
}

View file

@ -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;
}

View file

@ -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
);

View file

@ -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();

View file

@ -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);

View file

@ -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))

View file

@ -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);
}
}
}

View file

@ -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);
}
}

View file

@ -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) {

View file

@ -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();
}

View file

@ -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);

View file

@ -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());
}
}

View file

@ -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: