package org.coolreader.crengine; import java.util.ArrayList; import org.coolreader.db.CRDBService; import android.util.Log; public class History extends FileInfoChangeSource { private ArrayList mBooks = new ArrayList<>(); private FileInfo mRecentBooksFolder; public History(Scanner scanner) { this.mScanner = scanner; } public BookInfo getLastBook() { if ( mBooks.size()==0 ) return null; return mBooks.get(0); } public BookInfo getPreviousBook() { if ( mBooks.size()<2 ) return null; return mBooks.get(1); } public interface BookInfoLoadedCallback { void onBookInfoLoaded(BookInfo bookInfo); } public void getOrCreateBookInfo(final CRDBService.LocalBinder db, final FileInfo file, final BookInfoLoadedCallback callback) { BookInfo res = getBookInfo(file); if (res != null) { callback.onBookInfoLoaded(res); return; } db.loadBookInfo(file, bookInfo -> { if (bookInfo == null) { bookInfo = new BookInfo(file); mBooks.add(0, bookInfo); } callback.onBookInfoLoaded(bookInfo); }); } public BookInfo getBookInfo( FileInfo file ) { int index = findBookInfo( file ); if ( index>=0 ) return mBooks.get(index); return null; } public BookInfo getBookInfo( String pathname ) { int index = findBookInfo( pathname ); if ( index>=0 ) return mBooks.get(index); return null; } public void removeBookInfo(final CRDBService.LocalBinder db, FileInfo fileInfo, boolean removeRecentAccessFromDB, boolean removeBookFromDB) { int index = findBookInfo(fileInfo); if (index >= 0) mBooks.remove(index); if ( removeBookFromDB ) db.deleteBook(fileInfo); else if ( removeRecentAccessFromDB ) db.deleteRecentPosition(fileInfo); updateRecentDir(); } public void updateBookInfo(BookInfo bookInfo) { Log.v("cr3", "History.updateBookInfo() for " + bookInfo.getFileInfo().getPathName()); bookInfo.updateAccess(); int index = findBookInfo(bookInfo.getFileInfo()); if ( index>=0 ) { BookInfo info = mBooks.get(index); if ( index>0 ) { mBooks.remove(index); mBooks.add(0, info); } info.setBookmarks(bookInfo.getAllBookmarks()); } else { mBooks.add(0, bookInfo); } } public void updateBookAccess(BookInfo bookInfo, long timeElapsed) { Log.v("cr3", "History.updateBookAccess() for " + bookInfo.getFileInfo().getPathName()); bookInfo.updateAccess(); bookInfo.updateTimeElapsed(timeElapsed); int index = findBookInfo(bookInfo.getFileInfo()); if ( index>=0 ) { BookInfo info = mBooks.get(index); if ( index>0 ) { mBooks.remove(index); mBooks.add(0, info); } info.setBookmarks(bookInfo.getAllBookmarks()); } else { mBooks.add(0, bookInfo); } updateRecentDir(); } public int findBookInfo( String pathname ) { for ( int i=0; i 0) { callback.onRecentBooksListLoaded(mBooks); } else { // not yet loaded. Wait until ready: sync with DB thread. db.sync(() -> callback.onRecentBooksListLoaded(mBooks)); } } public boolean loadFromDB(final CRDBService.LocalBinder db, int maxItems ) { Log.v("cr3", "History.loadFromDB()"); mRecentBooksFolder = mScanner.getRecentDir(); db.loadRecentBooks(100, bookList -> { if (bookList != null) { mBooks = bookList; updateRecentDir(); } }); if ( mRecentBooksFolder==null ) Log.v("cr3", "History.loadFromDB() : mRecentBooksFolder is null"); return true; } }