diff --git a/src/org/geometerplus/fbreader/library/Book.java b/src/org/geometerplus/fbreader/library/Book.java index 892cabf66..d9f87cd5f 100644 --- a/src/org/geometerplus/fbreader/library/Book.java +++ b/src/org/geometerplus/fbreader/library/Book.java @@ -39,7 +39,8 @@ public class Book { } book.loadLists(); - final ZLPhysicalFile physicalFile = book.File.getPhysicalFile(); + final ZLFile bookFile = book.File; + final ZLPhysicalFile physicalFile = bookFile.getPhysicalFile(); if (physicalFile == null) { return book; } @@ -48,7 +49,7 @@ public class Book { } FileInfoSet fileInfos = new FileInfoSet(physicalFile); - if (fileInfos.check(physicalFile)) { + if (fileInfos.check(physicalFile, physicalFile != bookFile)) { return book; } fileInfos.save(); @@ -73,7 +74,7 @@ public class Book { book.loadLists(); } - if (book != null && fileInfos.check(physicalFile)) { + if (book != null && fileInfos.check(physicalFile, physicalFile != bookFile)) { return book; } fileInfos.save(); diff --git a/src/org/geometerplus/fbreader/library/FileInfoSet.java b/src/org/geometerplus/fbreader/library/FileInfoSet.java index df57b37d1..99cec9f2e 100644 --- a/src/org/geometerplus/fbreader/library/FileInfoSet.java +++ b/src/org/geometerplus/fbreader/library/FileInfoSet.java @@ -96,7 +96,7 @@ public final class FileInfoSet { }); } - public boolean check(ZLPhysicalFile file) { + public boolean check(ZLPhysicalFile file, boolean processChildren) { if (file == null) { return true; } @@ -106,9 +106,13 @@ public final class FileInfoSet { return true; } else { info.FileSize = fileSize; - removeChildren(info); - myInfosToSave.add(info); - addChildren(file); + if (processChildren) { + removeChildren(info); + myInfosToSave.add(info); + addChildren(file); + } else { + myInfosToSave.add(info); + } return false; } } diff --git a/src/org/geometerplus/fbreader/library/Library.java b/src/org/geometerplus/fbreader/library/Library.java index ab507cdcf..c760425c9 100644 --- a/src/org/geometerplus/fbreader/library/Library.java +++ b/src/org/geometerplus/fbreader/library/Library.java @@ -45,18 +45,19 @@ public final class Library { private LibraryTree mySearchResult = new RootTree(); private volatile int myState = STATE_NOT_INITIALIZED; + private volatile boolean myInterrupted = false; public Library() { } public boolean hasState(int state) { - return myState >= state; + return myState >= state || myInterrupted; } public void waitForState(int state) { - while (myState < state) { + while (myState < state && !myInterrupted) { synchronized(this) { - if (myState < state) { + if (myState < state && !myInterrupted) { try { wait(); } catch (InterruptedException e) { @@ -96,11 +97,6 @@ public final class Library { Map savedBooks, boolean doReadMetaInfo ) { - System.gc(); - System.gc(); - //Log.println(file.getPath()); - //Log.println("Free: " + Runtime.getRuntime().freeMemory() + " of " + Runtime.getRuntime().totalMemory()); - //Log.flush(); Book book = getBook(file, fileInfos, savedBooks, doReadMetaInfo); if (book != null) { myBooks.add(book); @@ -126,7 +122,7 @@ public final class Library { boolean reloadMetaInfo = false; if (myUpdatedFiles.contains(physicalFile)) { reloadMetaInfo = true; - } else if (!fileInfos.check(physicalFile)) { + } else if (!fileInfos.check(physicalFile, physicalFile != bookFile)) { reloadMetaInfo = true; myUpdatedFiles.add(physicalFile); } @@ -173,7 +169,9 @@ public final class Library { final Map savedBooks = BooksDatabase.Instance().loadBooks(fileInfos); for (ZLPhysicalFile file : physicalFilesList) { - collectBooks(file, fileInfos, savedBooks, !fileInfos.check(file)); + // TODO: better value for this flag + final boolean flag = !"epub".equals(file.getExtension()); + collectBooks(file, fileInfos, savedBooks, !fileInfos.check(file, flag)); file.setCached(false); } final Book helpBook = getBook(getHelpFile(), fileInfos, savedBooks, false); @@ -228,22 +226,14 @@ public final class Library { return tagTree; } - //private PrintWriter Log; - private void build() { final HashMap tagTreeMap = new HashMap(); final HashMap authorTreeMap = new HashMap(); final HashMap seriesTreeMap = new HashMap(); final HashMap bookById = new HashMap(); - /* - try { - Log = new PrintWriter("/sdcard/Log"); - } catch (Exception e) { - } - */ collectBooks(); - //Log.close(); + for (Book book : myBooks) { bookById.put(book.getId(), book); List authors = book.authors(); @@ -294,7 +284,10 @@ public final class Library { myFavorites.createBookSubTree(book, true); } } + myFavorites.sortAllChildren(); + myLibraryByAuthor.sortAllChildren(); + myLibraryByTag.sortAllChildren(); db.executeAsATransaction(new Runnable() { public void run() { @@ -303,16 +296,18 @@ public final class Library { } } }); + + myState = STATE_FULLY_INITIALIZED; } public synchronized void synchronize() { if (myState == STATE_NOT_INITIALIZED) { - build(); - - myLibraryByAuthor.sortAllChildren(); - myLibraryByTag.sortAllChildren(); - - myState = STATE_FULLY_INITIALIZED; + try { + myInterrupted = false; + build(); + } catch (Throwable t) { + myInterrupted = true; + } notifyAll(); } }