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