diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 0b31b999e..a508877a2 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -63,7 +63,7 @@
-
+
diff --git a/AndroidManifest.xml.pattern b/AndroidManifest.xml.pattern
index 71437118c..68594fddf 100644
--- a/AndroidManifest.xml.pattern
+++ b/AndroidManifest.xml.pattern
@@ -63,7 +63,7 @@
-
+
diff --git a/src/org/geometerplus/fbreader/library/AuthorTree.java b/src/org/geometerplus/fbreader/library/AuthorTree.java
index 92ed38957..891900699 100644
--- a/src/org/geometerplus/fbreader/library/AuthorTree.java
+++ b/src/org/geometerplus/fbreader/library/AuthorTree.java
@@ -19,6 +19,8 @@
package org.geometerplus.fbreader.library;
+import java.util.Collections;
+
public class AuthorTree extends LibraryTree {
public final Author Author;
@@ -31,8 +33,14 @@ public class AuthorTree extends LibraryTree {
Author = author;
}
- SeriesTree createSeriesSubTree(String series) {
- return new SeriesTree(this, series);
+ SeriesTree getSeriesSubTree(String series) {
+ final SeriesTree temp = new SeriesTree(series);
+ int position = Collections.binarySearch(subTrees(), temp);
+ if (position >= 0) {
+ return (SeriesTree)subTrees().get(position);
+ } else {
+ return new SeriesTree(this, series, - position - 1);
+ }
}
@Override
diff --git a/src/org/geometerplus/fbreader/library/BookInSeriesTree.java b/src/org/geometerplus/fbreader/library/BookInSeriesTree.java
index 975ed48fd..ab7186425 100644
--- a/src/org/geometerplus/fbreader/library/BookInSeriesTree.java
+++ b/src/org/geometerplus/fbreader/library/BookInSeriesTree.java
@@ -22,8 +22,12 @@ package org.geometerplus.fbreader.library;
import org.geometerplus.fbreader.tree.FBTree;
public final class BookInSeriesTree extends BookTree {
- BookInSeriesTree(LibraryTree parent, Book book) {
- super(parent, book, false);
+ BookInSeriesTree(Book book) {
+ super(book, false);
+ }
+
+ BookInSeriesTree(LibraryTree parent, Book book, int position) {
+ super(parent, book, false, position);
}
@Override
diff --git a/src/org/geometerplus/fbreader/library/BookTree.java b/src/org/geometerplus/fbreader/library/BookTree.java
index 50382196b..e498d21ba 100644
--- a/src/org/geometerplus/fbreader/library/BookTree.java
+++ b/src/org/geometerplus/fbreader/library/BookTree.java
@@ -25,12 +25,23 @@ public class BookTree extends LibraryTree {
public final Book Book;
private final boolean myShowAuthors;
+ BookTree(Book book, boolean showAuthors) {
+ Book = book;
+ myShowAuthors = showAuthors;
+ }
+
BookTree(LibraryTree parent, Book book, boolean showAuthors) {
super(parent);
Book = book;
myShowAuthors = showAuthors;
}
+ BookTree(LibraryTree parent, Book book, boolean showAuthors, int position) {
+ super(parent, position);
+ Book = book;
+ myShowAuthors = showAuthors;
+ }
+
@Override
public String getName() {
return Book.getTitle();
diff --git a/src/org/geometerplus/fbreader/library/Library.java b/src/org/geometerplus/fbreader/library/Library.java
index 92cb0f138..f583bb00b 100644
--- a/src/org/geometerplus/fbreader/library/Library.java
+++ b/src/org/geometerplus/fbreader/library/Library.java
@@ -257,21 +257,15 @@ public final class Library {
myNullList.add(null);
}
- private TagTree getTagTree(Tag tag, HashMap tagTreeMap) {
- TagTree tagTree = tagTreeMap.get(tag);
- if (tagTree == null) {
- LibraryTree parent =
- ((tag != null) && (tag.Parent != null)) ?
- getTagTree(tag.Parent, tagTreeMap) : getFirstLevelTree(ROOT_BY_TAG);
- tagTree = parent.createTagSubTree(tag);
- tagTreeMap.put(tag, tagTree);
+ private LibraryTree getTagTree(Tag tag) {
+ if (tag == null || tag.Parent == null) {
+ return getFirstLevelTree(ROOT_BY_TAG).getTagSubTree(tag);
+ } else {
+ return getTagTree(tag.Parent).getTagSubTree(tag);
}
- return tagTree;
}
private void build() {
- final HashMap tagTreeMap = new HashMap();
- final HashMap seriesTreeMap = new HashMap();
final HashMap bookById = new HashMap();
collectBooks();
@@ -286,16 +280,12 @@ public final class Library {
for (Author a : authors) {
final AuthorTree authorTree = getFirstLevelTree(ROOT_BY_AUTHOR).getAuthorSubTree(a);
if (seriesInfo == null) {
- authorTree.createBookSubTree(book, false);
+ authorTree.getBookSubTree(book, false);
} else {
final String series = seriesInfo.Name;
final AuthorSeriesPair pair = new AuthorSeriesPair(a, series);
- SeriesTree seriesTree = seriesTreeMap.get(pair);
- if (seriesTree == null) {
- seriesTree = authorTree.createSeriesSubTree(series);
- seriesTreeMap.put(pair, seriesTree);
- }
- seriesTree.createBookInSeriesSubTree(book);
+ final SeriesTree seriesTree = authorTree.getSeriesSubTree(series);
+ seriesTree.getBookInSeriesSubTree(book);
}
}
@@ -304,7 +294,7 @@ public final class Library {
tags = (List)myNullList;
}
for (Tag t : tags) {
- getTagTree(t, tagTreeMap).createBookSubTree(book, true);
+ getTagTree(t).getBookSubTree(book, true);
}
}
@@ -323,7 +313,6 @@ public final class Library {
doGroupTitlesByFirstLetter = myBooks.size() > letterSet.size() * 5 / 4;
}
if (doGroupTitlesByFirstLetter) {
- final HashMap letterTrees = new HashMap();
for (Book book : myBooks) {
String title = book.getTitle();
if (title == null) {
@@ -334,16 +323,12 @@ public final class Library {
continue;
}
Character c = title.charAt(0);
- TitleTree tree = letterTrees.get(c);
- if (tree == null) {
- tree = getFirstLevelTree(ROOT_BY_TITLE).createTitleSubTree(c.toString());
- letterTrees.put(c, tree);
- }
- tree.createBookSubTree(book, true);
+ final TitleTree tree = getFirstLevelTree(ROOT_BY_TITLE).getTitleSubTree(c.toString());
+ tree.getBookSubTree(book, true);
}
} else {
for (Book book : myBooks) {
- getFirstLevelTree(ROOT_BY_TITLE).createBookSubTree(book, true);
+ getFirstLevelTree(ROOT_BY_TITLE).getBookSubTree(book, true);
}
}
@@ -351,22 +336,17 @@ public final class Library {
for (long id : db.loadRecentBookIds()) {
Book book = bookById.get(id);
if (book != null) {
- getFirstLevelTree(ROOT_RECENT).createBookSubTree(book, true);
+ new BookTree(getFirstLevelTree(ROOT_RECENT), book, true);
}
}
for (long id : db.loadFavoritesIds()) {
Book book = bookById.get(id);
if (book != null) {
- getFirstLevelTree(ROOT_FAVORITES).createBookSubTree(book, true);
+ getFirstLevelTree(ROOT_FAVORITES).getBookSubTree(book, true);
}
}
- getFirstLevelTree(ROOT_FAVORITES).sortAllChildren();
- getFirstLevelTree(ROOT_BY_AUTHOR).sortAllChildren();
- getFirstLevelTree(ROOT_BY_TITLE).sortAllChildren();
- getFirstLevelTree(ROOT_BY_TAG).sortAllChildren();
-
db.executeAsATransaction(new Runnable() {
public void run() {
for (Book book : myBooks) {
@@ -418,12 +398,9 @@ public final class Library {
if (newSearchResults == null) {
newSearchResults = createNewSearchResults(pattern);
}
- newSearchResults.createBookSubTree(book, true);
+ newSearchResults.getBookSubTree(book, true);
}
}
- if (newSearchResults != null) {
- newSearchResults.sortAllChildren();
- }
}
return newSearchResults;
}
@@ -460,8 +437,7 @@ public final class Library {
return;
}
final LibraryTree rootFavorites = getFirstLevelTree(ROOT_FAVORITES);
- rootFavorites.createBookSubTree(book, true);
- rootFavorites.sortAllChildren();
+ rootFavorites.getBookSubTree(book, true);
BooksDatabase.Instance().addToFavorites(book.getId());
}
diff --git a/src/org/geometerplus/fbreader/library/LibraryTree.java b/src/org/geometerplus/fbreader/library/LibraryTree.java
index bd92d3d6b..eef11a7db 100644
--- a/src/org/geometerplus/fbreader/library/LibraryTree.java
+++ b/src/org/geometerplus/fbreader/library/LibraryTree.java
@@ -48,12 +48,24 @@ public abstract class LibraryTree extends FBTree {
return true;
}
- TagTree createTagSubTree(Tag tag) {
- return new TagTree(this, tag);
+ TagTree getTagSubTree(Tag tag) {
+ final TagTree temp = new TagTree(tag);
+ int position = Collections.binarySearch(subTrees(), temp);
+ if (position >= 0) {
+ return (TagTree)subTrees().get(position);
+ } else {
+ return new TagTree(this, tag, - position - 1);
+ }
}
- TitleTree createTitleSubTree(String title) {
- return new TitleTree(this, title);
+ TitleTree getTitleSubTree(String title) {
+ final TitleTree temp = new TitleTree(title);
+ int position = Collections.binarySearch(subTrees(), temp);
+ if (position >= 0) {
+ return (TitleTree)subTrees().get(position);
+ } else {
+ return new TitleTree(this, title, - position - 1);
+ }
}
AuthorTree getAuthorSubTree(Author author) {
@@ -66,8 +78,14 @@ public abstract class LibraryTree extends FBTree {
}
}
- BookTree createBookSubTree(Book book, boolean showAuthors) {
- return new BookTree(this, book, showAuthors);
+ BookTree getBookSubTree(Book book, boolean showAuthors) {
+ final BookTree temp = new BookTree(book, showAuthors);
+ int position = Collections.binarySearch(subTrees(), temp);
+ if (position >= 0) {
+ return (BookTree)subTrees().get(position);
+ } else {
+ return new BookTree(this, book, showAuthors, - position - 1);
+ }
}
public boolean removeBook(Book book) {
diff --git a/src/org/geometerplus/fbreader/library/SeriesTree.java b/src/org/geometerplus/fbreader/library/SeriesTree.java
index 2f581500f..150ac9f78 100644
--- a/src/org/geometerplus/fbreader/library/SeriesTree.java
+++ b/src/org/geometerplus/fbreader/library/SeriesTree.java
@@ -19,11 +19,17 @@
package org.geometerplus.fbreader.library;
+import java.util.Collections;
+
public final class SeriesTree extends LibraryTree {
public final String Series;
- SeriesTree(LibraryTree parent, String series) {
- super(parent);
+ SeriesTree(String series) {
+ Series = series;
+ }
+
+ SeriesTree(LibraryTree parent, String series, int position) {
+ super(parent, position);
Series = series;
}
@@ -37,8 +43,14 @@ public final class SeriesTree extends LibraryTree {
return getName();
}
- BookTree createBookInSeriesSubTree(Book book) {
- return new BookInSeriesTree(this, book);
+ BookTree getBookInSeriesSubTree(Book book) {
+ final BookInSeriesTree temp = new BookInSeriesTree(book);
+ int position = Collections.binarySearch(subTrees(), temp);
+ if (position >= 0) {
+ return (BookInSeriesTree)subTrees().get(position);
+ } else {
+ return new BookInSeriesTree(this, book, - position - 1);
+ }
}
@Override
diff --git a/src/org/geometerplus/fbreader/library/TagTree.java b/src/org/geometerplus/fbreader/library/TagTree.java
index 9d122ec7a..336b07d5f 100644
--- a/src/org/geometerplus/fbreader/library/TagTree.java
+++ b/src/org/geometerplus/fbreader/library/TagTree.java
@@ -22,8 +22,12 @@ package org.geometerplus.fbreader.library;
public final class TagTree extends LibraryTree {
public final Tag Tag;
- TagTree(LibraryTree parent, Tag tag) {
- super(parent);
+ TagTree(Tag tag) {
+ Tag = tag;
+ }
+
+ TagTree(LibraryTree parent, Tag tag, int position) {
+ super(parent, position);
Tag = tag;
}
diff --git a/src/org/geometerplus/fbreader/library/TitleTree.java b/src/org/geometerplus/fbreader/library/TitleTree.java
index cdf7caffa..16319bb80 100644
--- a/src/org/geometerplus/fbreader/library/TitleTree.java
+++ b/src/org/geometerplus/fbreader/library/TitleTree.java
@@ -22,8 +22,12 @@ package org.geometerplus.fbreader.library;
public final class TitleTree extends LibraryTree {
public final String Title;
- TitleTree(LibraryTree parent, String title) {
- super(parent);
+ TitleTree(String title) {
+ Title = title;
+ }
+
+ TitleTree(LibraryTree parent, String title, int position) {
+ super(parent, position);
Title = title;
}