diff --git a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java index 753589b4d..5eb27875a 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java +++ b/src/org/geometerplus/android/fbreader/libraryService/BookCollectionShadow.java @@ -346,6 +346,17 @@ public class BookCollectionShadow extends AbstractBookCollection implements Serv } } + public synchronized List firstTitleLetters() { + if (myInterface == null) { + return Collections.emptyList(); + } + try { + return myInterface.firstTitleLetters(); + } catch (RemoteException e) { + return Collections.emptyList(); + } + } + public synchronized List titlesForAuthor(Author author, int limit) { if (myInterface == null) { return Collections.emptyList(); diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl index 1f33a0a90..bd0a98925 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryInterface.aidl @@ -32,6 +32,7 @@ interface LibraryInterface { List series(); List tags(); List titles(); + List firstTitleLetters(); List titlesForAuthor(in String author, int limit); List titlesForSeries(in String series, int limit); List titlesForSeriesAndAuthor(in String series, in String author, int limit); diff --git a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java index c7d05b265..a677aabec 100644 --- a/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java +++ b/src/org/geometerplus/android/fbreader/libraryService/LibraryService.java @@ -222,6 +222,10 @@ public class LibraryService extends Service { return myCollection.titles(); } + public List firstTitleLetters() { + return myCollection.firstTitleLetters(); + } + public List titlesForAuthor(String author, int limit) { return myCollection.titlesForAuthor(Util.stringToAuthor(author), limit); } diff --git a/src/org/geometerplus/fbreader/book/BookCollection.java b/src/org/geometerplus/fbreader/book/BookCollection.java index 29937635e..33ccc22bc 100644 --- a/src/org/geometerplus/fbreader/book/BookCollection.java +++ b/src/org/geometerplus/fbreader/book/BookCollection.java @@ -375,6 +375,16 @@ public class BookCollection extends AbstractBookCollection { } } + public List firstTitleLetters() { + synchronized (myBooksByFile) { + final TreeSet titles = new TreeSet(); + for (Book book : myBooksByFile.values()) { + titles.add(book.firstTitleLetter()); + } + return new ArrayList(titles); + } + } + public List titlesForAuthor(Author author, int limit) { if (limit <= 0) { return Collections.emptyList(); diff --git a/src/org/geometerplus/fbreader/book/IBookCollection.java b/src/org/geometerplus/fbreader/book/IBookCollection.java index 4ba0d41b8..a999200a4 100644 --- a/src/org/geometerplus/fbreader/book/IBookCollection.java +++ b/src/org/geometerplus/fbreader/book/IBookCollection.java @@ -77,6 +77,7 @@ public interface IBookCollection { List series(); List tags(); List titles(); + List firstTitleLetters(); List titlesForAuthor(Author author, int limit); List titlesForSeries(String series, int limit); List titlesForSeriesAndAuthor(String series, Author author, int limit); diff --git a/src/org/geometerplus/fbreader/library/BookTree.java b/src/org/geometerplus/fbreader/library/BookTree.java index abfc8a070..ba202d1c9 100644 --- a/src/org/geometerplus/fbreader/library/BookTree.java +++ b/src/org/geometerplus/fbreader/library/BookTree.java @@ -22,10 +22,9 @@ package org.geometerplus.fbreader.library; import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.fbreader.book.*; -import org.geometerplus.fbreader.sort.TitledEntity; import org.geometerplus.fbreader.tree.FBTree; -public class BookTree extends TitledEntityTree { +public class BookTree extends LibraryTree { public final Book Book; BookTree(IBookCollection collection, Book book) { @@ -73,6 +72,11 @@ public class BookTree extends TitledEntityTree { return book != null && book.equals(Book); } + @Override + protected String getSortKey() { + return Book.getSortKey(); + } + @Override public int compareTo(FBTree tree) { final int cmp = super.compareTo(tree); @@ -95,9 +99,4 @@ public class BookTree extends TitledEntityTree { } return Book.equals(((BookTree)object).Book); } - - @Override - public TitledEntity getTitledEntity() { - return Book; - } } diff --git a/src/org/geometerplus/fbreader/library/SeriesTree.java b/src/org/geometerplus/fbreader/library/SeriesTree.java index 87a518ecc..904b46f0d 100644 --- a/src/org/geometerplus/fbreader/library/SeriesTree.java +++ b/src/org/geometerplus/fbreader/library/SeriesTree.java @@ -25,9 +25,8 @@ import java.util.List; import org.geometerplus.zlibrary.core.util.MiscUtil; import org.geometerplus.fbreader.book.*; -import org.geometerplus.fbreader.sort.TitledEntity; -public final class SeriesTree extends TitledEntityTree { +public final class SeriesTree extends LibraryTree { public final Series Series; public final Author Author; @@ -73,7 +72,7 @@ public final class SeriesTree extends TitledEntityTree { @Override protected String getSortKey() { - return " Series:" + super.getSortKey(); + return Series.getSortKey(); } @Override @@ -122,9 +121,4 @@ public final class SeriesTree extends TitledEntityTree { return true; } } - - @Override - public TitledEntity getTitledEntity() { - return Series; - } } diff --git a/src/org/geometerplus/fbreader/library/TitleListTree.java b/src/org/geometerplus/fbreader/library/TitleListTree.java index b8450f417..cf16f0574 100644 --- a/src/org/geometerplus/fbreader/library/TitleListTree.java +++ b/src/org/geometerplus/fbreader/library/TitleListTree.java @@ -40,24 +40,19 @@ public class TitleListTree extends FirstLevelTree { clear(); myDoGroupByFirstLetter = false; - final TreeSet letterSet = new TreeSet(); - final List books = Collection.books(); - if (books.size() > 9) { - for (Book b : books) { - final String letter = b.firstTitleLetter(); - if (letter != null) { - letterSet.add(letter); - } - } - myDoGroupByFirstLetter = books.size() > letterSet.size() * 5 / 4; + + List letters = null; + if (Collection.size() > 9) { + letters = Collection.firstTitleLetters(); + myDoGroupByFirstLetter = Collection.size() > letters.size() * 5 / 4; } if (myDoGroupByFirstLetter) { - for (String letter : letterSet) { - createTitleSubTree(letter); + for (String l : letters) { + createTitleSubTree(l); } } else { - for (Book b : books) { + for (Book b : Collection.books()) { createBookWithAuthorsSubTree(b); } } diff --git a/src/org/geometerplus/fbreader/library/TitledEntityTree.java b/src/org/geometerplus/fbreader/library/TitledEntityTree.java deleted file mode 100644 index 185d08846..000000000 --- a/src/org/geometerplus/fbreader/library/TitledEntityTree.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2009-2013 Geometer Plus - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package org.geometerplus.fbreader.library; - -import org.geometerplus.fbreader.book.IBookCollection; -import org.geometerplus.fbreader.sort.TitledEntity; -import org.geometerplus.fbreader.tree.FBTree; - -public abstract class TitledEntityTree extends LibraryTree { - TitledEntityTree(IBookCollection collection) { - super(collection); - } - - TitledEntityTree(LibraryTree parent) { - super(parent); - } - - TitledEntityTree(LibraryTree parent, int position) { - super(parent, position); - } - - protected abstract TitledEntity getTitledEntity(); - - @Override - public int compareTo(FBTree tree) { - if (tree instanceof TitledEntityTree) { - return getTitledEntity().compareTo(((TitledEntityTree)tree).getTitledEntity()); - } - return super.compareTo(tree); - } -} diff --git a/src/org/geometerplus/fbreader/sort/TitledEntity.java b/src/org/geometerplus/fbreader/sort/TitledEntity.java index 0946f53a4..3a2c9b9e7 100644 --- a/src/org/geometerplus/fbreader/sort/TitledEntity.java +++ b/src/org/geometerplus/fbreader/sort/TitledEntity.java @@ -26,7 +26,7 @@ import java.util.Map; import android.annotation.TargetApi; import android.os.Build; -public abstract class TitledEntity implements Comparable { +public abstract class TitledEntity { private String myTitle; private String mySortKey; @@ -155,10 +155,6 @@ public abstract class TitledEntity implements Comparable { return Normalizer.normalize(s, Normalizer.Form.NFKD); } - public int compareTo(TitledEntity entity) { - return getSortKey().compareTo(entity.getSortKey()); - } - public String firstTitleLetter() { final String str = getSortKey(); if ("".equals(str)) {