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