diff --git a/assets/resources/application/en.xml b/assets/resources/application/en.xml
index a38d2d94f..219907539 100644
--- a/assets/resources/application/en.xml
+++ b/assets/resources/application/en.xml
@@ -55,6 +55,9 @@
+
+
+
diff --git a/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java b/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java
index eaf162871..db8981e73 100644
--- a/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java
+++ b/src/org/geometerplus/fbreader/network/NetworkBookItemComparator.java
@@ -22,9 +22,7 @@ package org.geometerplus.fbreader.network;
import java.util.Comparator;
import java.util.LinkedList;
-
public final class NetworkBookItemComparator implements Comparator {
-
public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) {
final boolean item0isABook = item0 instanceof NetworkBookItem;
final boolean item1isABook = item1 instanceof NetworkBookItem;
diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java
index eba9ed973..9553cc2a4 100644
--- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java
+++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResAuthenticationManager.java
@@ -361,11 +361,11 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager {
}
private void loadPurchasedBooksOnSuccess(LitResNetworkRequest purchasedBooksRequest) {
- LitResXMLReader reader = (LitResXMLReader) purchasedBooksRequest.Reader;
+ LitResXMLReader reader = (LitResXMLReader)purchasedBooksRequest.Reader;
myPurchasedBooks.clear();
for (NetworkLibraryItem item: reader.Books) {
if (item instanceof NetworkBookItem) {
- NetworkBookItem book = (NetworkBookItem) item;
+ NetworkBookItem book = (NetworkBookItem)item;
myPurchasedBooks.put(book.Id, book);
}
}
@@ -390,7 +390,7 @@ public class LitResAuthenticationManager extends NetworkAuthenticationManager {
}
private void loadAccountOnSuccess(LitResNetworkRequest accountRequest) {
- LitResPurchaseXMLReader reader = (LitResPurchaseXMLReader) accountRequest.Reader;
+ LitResPurchaseXMLReader reader = (LitResPurchaseXMLReader)accountRequest.Reader;
myAccount = BuyBookReference.price(reader.Account, "RUB");
}
diff --git a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java
index c2f7478ae..62c7418ac 100644
--- a/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java
+++ b/src/org/geometerplus/fbreader/network/authentication/litres/LitResBookshelfItem.java
@@ -26,12 +26,29 @@ import org.geometerplus.zlibrary.core.network.ZLNetworkException;
import org.geometerplus.fbreader.network.*;
-class SortedCatalogItem extends NetworkCatalogItem {
+abstract class SortedCatalogItem extends NetworkCatalogItem {
private final List myChildren = new LinkedList();
private SortedCatalogItem(NetworkCatalogItem parent, ZLResource resource, List children) {
super(parent.Link, resource.getValue(), resource.getResource("summary").getValue(), "", parent.URLByType);
- myChildren.addAll(children);
+ for (NetworkLibraryItem child : children) {
+ if (accepts(child)) {
+ myChildren.add(child);
+ }
+ }
+ final Comparator comparator = getComparator();
+ if (comparator != null) {
+ Collections.sort(myChildren, comparator);
+ }
+ }
+
+ public boolean isEmpty() {
+ return myChildren.isEmpty();
+ }
+
+ protected abstract Comparator getComparator();
+ protected boolean accepts(NetworkLibraryItem item) {
+ return item instanceof NetworkBookItem;
}
public SortedCatalogItem(NetworkCatalogItem parent, String resourceKey, List children) {
@@ -51,6 +68,75 @@ class SortedCatalogItem extends NetworkCatalogItem {
}
}
+class ByAuthorCatalogItem extends SortedCatalogItem {
+ ByAuthorCatalogItem(NetworkCatalogItem parent, List children) {
+ super(parent, "byAuthor", children);
+ }
+
+ @Override
+ protected Comparator getComparator() {
+ return new NetworkBookItemComparator();
+ }
+}
+
+class ByTitleCatalogItem extends SortedCatalogItem {
+ ByTitleCatalogItem(NetworkCatalogItem parent, List children) {
+ super(parent, "byTitle", children);
+ }
+
+ @Override
+ protected Comparator getComparator() {
+ return new Comparator() {
+ public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) {
+ return item0.Title.compareTo(item1.Title);
+ }
+ };
+ }
+}
+
+class ByDateCatalogItem extends SortedCatalogItem {
+ ByDateCatalogItem(NetworkCatalogItem parent, List children) {
+ super(parent, "byDate", children);
+ }
+
+ @Override
+ protected Comparator getComparator() {
+ return new Comparator() {
+ public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) {
+ return 0;
+ }
+ };
+ }
+}
+
+class BySeriesCatalogItem extends SortedCatalogItem {
+ BySeriesCatalogItem(NetworkCatalogItem parent, List children) {
+ super(parent, "bySeries", children);
+ }
+
+ @Override
+ protected Comparator getComparator() {
+ return new Comparator() {
+ public int compare(NetworkLibraryItem item0, NetworkLibraryItem item1) {
+ final NetworkBookItem book0 = (NetworkBookItem)item0;
+ final NetworkBookItem book1 = (NetworkBookItem)item1;
+ int diff = book0.SeriesTitle.compareTo(book1.SeriesTitle);
+ if (diff == 0) {
+ diff = book0.IndexInSeries - book1.IndexInSeries;
+ }
+ return diff != 0 ? diff : book0.Title.compareTo(book1.Title);
+ }
+ };
+ }
+
+ @Override
+ protected boolean accepts(NetworkLibraryItem item) {
+ return
+ item instanceof NetworkBookItem &&
+ ((NetworkBookItem)item).SeriesTitle != null;
+ }
+}
+
public class LitResBookshelfItem extends NetworkCatalogItem {
private boolean myForceReload;
@@ -87,9 +173,13 @@ public class LitResBookshelfItem extends NetworkCatalogItem {
listener.onNewItem(Link, item);
}
} else {
- listener.onNewItem(Link, new SortedCatalogItem(this, "byDate", children));
- listener.onNewItem(Link, new SortedCatalogItem(this, "byAuthor", children));
- listener.onNewItem(Link, new SortedCatalogItem(this, "byTitle", children));
+ listener.onNewItem(Link, new ByDateCatalogItem(this, children));
+ listener.onNewItem(Link, new ByAuthorCatalogItem(this, children));
+ listener.onNewItem(Link, new ByTitleCatalogItem(this, children));
+ final BySeriesCatalogItem bySeries = new BySeriesCatalogItem(this, children);
+ if (!bySeries.isEmpty()) {
+ listener.onNewItem(Link, bySeries);
+ }
}
listener.commitItems(Link);
}