1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 10:49:24 +02:00

NetworkTree.Key as unique key for network tree

This commit is contained in:
Nikolay Pultsin 2011-03-01 14:39:47 +00:00
parent 27b4719781
commit 85df6a5e84
20 changed files with 137 additions and 65 deletions

View file

@ -53,7 +53,7 @@ public class AddCustomCatalogItemTree extends NetworkTree implements ZLAndroidTr
}
@Override
public String getUniqueKey() {
return null;
protected String getStringId() {
return "@Add Custom Catalog";
}
}

View file

@ -25,6 +25,7 @@ import android.os.Message;
import android.app.Service;
import android.content.Intent;
import org.geometerplus.fbreader.network.NetworkTree;
public class ItemsLoadingService extends Service {
@ -53,7 +54,7 @@ public class ItemsLoadingService extends Service {
super.onStart(intent, startId);
doStart();
final String key = intent.getStringExtra(ITEMS_LOADING_RUNNABLE_KEY);
final NetworkTree.Key key = (NetworkTree.Key)intent.getSerializableExtra(ITEMS_LOADING_RUNNABLE_KEY);
if (key == null) {
doStop();
return;

View file

@ -272,11 +272,10 @@ class NetworkCatalogActions extends NetworkTreeActions {
private static class ExpandCatalogHandler extends ItemsLoadingHandler {
private final String myKey;
private final NetworkTree.Key myKey;
private final NetworkCatalogTree myTree;
ExpandCatalogHandler(NetworkCatalogTree tree, String key) {
ExpandCatalogHandler(NetworkCatalogTree tree, NetworkTree.Key key) {
myTree = tree;
myKey = key;
}
@ -389,7 +388,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
}
private void doExpandCatalog(final NetworkBaseActivity activity, final NetworkCatalogTree tree) {
final String key = tree.getUniqueKey();
final NetworkTree.Key key = tree.getUniqueKey();
NetworkView.Instance().tryResumeLoading(activity, tree, key, new Runnable() {
public void run() {
boolean resumeNotLoad = false;
@ -434,7 +433,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
}
public void doReloadCatalog(NetworkBaseActivity activity, final NetworkCatalogTree tree) {
final String key = tree.getUniqueKey();
final NetworkTree.Key key = tree.getUniqueKey();
if (NetworkView.Instance().containsItemsLoadingRunnable(key)) {
return;
}

View file

@ -36,7 +36,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR
public static final String CATALOG_KEY_KEY = "org.geometerplus.android.fbreader.network.CatalogKey";
private NetworkTree myTree;
private String myCatalogKey;
private NetworkTree.Key myCatalogKey;
private volatile boolean myInProgress;
@Override
@ -57,7 +57,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR
throw new RuntimeException("Catalog's Level was not specified!!!");
}
myCatalogKey = intent.getStringExtra(CATALOG_KEY_KEY);
myCatalogKey = (NetworkTree.Key)intent.getSerializableExtra(CATALOG_KEY_KEY);
if (myCatalogKey == null) {
throw new RuntimeException("Catalog's Key was not specified!!!");
}
@ -183,10 +183,10 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR
}
}
private static String getLoadableNetworkTreeKey(NetworkTree tree) {
private static NetworkTree.Key getLoadableNetworkTreeKey(NetworkTree tree) {
if ((tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree)
&& tree.Parent instanceof NetworkTree) {
return getLoadableNetworkTreeKey((NetworkTree) tree.Parent);
return getLoadableNetworkTreeKey((NetworkTree)tree.Parent);
}
return tree.getUniqueKey();
}
@ -194,7 +194,7 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR
@Override
public void onModelChanged() {
final NetworkView networkView = NetworkView.Instance();
final String key = getLoadableNetworkTreeKey(myTree);
final NetworkTree.Key key = getLoadableNetworkTreeKey(myTree);
myInProgress = key != null && networkView.isInitialized() && networkView.containsItemsLoadingRunnable(key);
getListView().invalidateViews();
@ -218,9 +218,9 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR
}
private void doStopLoading() {
final String key = myCatalogKey;
if (key != null && NetworkView.Instance().isInitialized()) {
final ItemsLoadingRunnable runnable = NetworkView.Instance().getItemsLoadingRunnable(key);
if (NetworkView.Instance().isInitialized()) {
final ItemsLoadingRunnable runnable =
NetworkView.Instance().getItemsLoadingRunnable(myCatalogKey);
if (runnable != null) {
runnable.interruptLoading();
}

View file

@ -275,8 +275,7 @@ public class NetworkLibraryActivity extends NetworkBaseActivity {
}
private static boolean searchIsInProgress() {
return NetworkView.Instance().containsItemsLoadingRunnable(
NetworkSearchActivity.SEARCH_RUNNABLE_KEY);
return NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey);
}
@Override

View file

@ -35,9 +35,6 @@ import org.geometerplus.fbreader.network.*;
public class NetworkSearchActivity extends Activity {
static final String SEARCH_RUNNABLE_KEY = "org.geometerplus.android.fbreader.network.NetworkSearchActivity";
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@ -109,7 +106,7 @@ public class NetworkSearchActivity extends Activity {
}
if (msg != null) {
if (NetworkView.Instance().isInitialized()) {
final NetworkCatalogActivity activity = NetworkView.Instance().getOpenedActivity(SEARCH_RUNNABLE_KEY);
final NetworkCatalogActivity activity = NetworkView.Instance().getOpenedActivity(NetworkTree.SearchKey);
if (activity != null) {
final ZLResource buttonResource = dialogResource.getResource("button");
new AlertDialog.Builder(activity)
@ -148,7 +145,7 @@ public class NetworkSearchActivity extends Activity {
final NetworkLibrary library = NetworkLibrary.Instance();
library.NetworkSearchPatternOption.setValue(pattern);
if (NetworkView.Instance().containsItemsLoadingRunnable(SEARCH_RUNNABLE_KEY)) {
if (NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey)) {
return;
}
@ -163,9 +160,9 @@ public class NetworkSearchActivity extends Activity {
final SearchHandler handler = new SearchHandler(tree);
NetworkView.Instance().startItemsLoading(
this,
SEARCH_RUNNABLE_KEY,
NetworkTree.SearchKey,
new SearchRunnable(handler, pattern)
);
NetworkView.Instance().openTree(this, tree, SEARCH_RUNNABLE_KEY);
NetworkView.Instance().openTree(this, tree, NetworkTree.SearchKey);
}
}

View file

@ -141,9 +141,10 @@ class NetworkView {
* Code for loading network items (running items-loading service and managing items-loading runnables).
*/
private final HashMap<String, ItemsLoadingRunnable> myItemsLoadingRunnables = new HashMap<String, ItemsLoadingRunnable>();
private final HashMap<NetworkTree.Key,ItemsLoadingRunnable> myItemsLoadingRunnables =
new HashMap<NetworkTree.Key,ItemsLoadingRunnable>();
public void startItemsLoading(Context context, String key, ItemsLoadingRunnable runnable) {
public void startItemsLoading(Context context, NetworkTree.Key key, ItemsLoadingRunnable runnable) {
boolean doDownload = false;
synchronized (myItemsLoadingRunnables) {
if (!myItemsLoadingRunnables.containsKey(key)) {
@ -159,13 +160,13 @@ class NetworkView {
}
}
ItemsLoadingRunnable getItemsLoadingRunnable(String key) {
ItemsLoadingRunnable getItemsLoadingRunnable(NetworkTree.Key key) {
synchronized (myItemsLoadingRunnables) {
return myItemsLoadingRunnables.get(key);
}
}
void removeItemsLoadingRunnable(String key) {
void removeItemsLoadingRunnable(NetworkTree.Key key) {
synchronized (myItemsLoadingRunnables) {
ItemsLoadingRunnable runnable = myItemsLoadingRunnables.remove(key);
if (runnable != null) {
@ -174,11 +175,11 @@ class NetworkView {
}
}
public final boolean containsItemsLoadingRunnable(String key) {
public final boolean containsItemsLoadingRunnable(NetworkTree.Key key) {
return getItemsLoadingRunnable(key) != null;
}
public void tryResumeLoading(NetworkBaseActivity activity, NetworkCatalogTree tree, String key, Runnable expandRunnable) {
public void tryResumeLoading(NetworkBaseActivity activity, NetworkCatalogTree tree, NetworkTree.Key key, Runnable expandRunnable) {
final ItemsLoadingRunnable runnable = getItemsLoadingRunnable(key);
if (runnable != null && runnable.tryResumeLoading()) {
openTree(activity, tree, key);
@ -266,9 +267,10 @@ class NetworkView {
*/
private final LinkedList<NetworkTree> myOpenedStack = new LinkedList<NetworkTree>();
private final HashMap<String, NetworkCatalogActivity> myOpenedActivities = new HashMap<String, NetworkCatalogActivity>();
private final HashMap<NetworkTree.Key,NetworkCatalogActivity> myOpenedActivities =
new HashMap<NetworkTree.Key,NetworkCatalogActivity>();
public void openTree(Context context, NetworkTree tree, String key) {
public void openTree(Context context, NetworkTree tree, NetworkTree.Key key) {
final int level = tree.Level - 1; // tree.Level == 1 for catalog's root element
if (level > myOpenedStack.size()) {
throw new RuntimeException("Unable to open catalog with Level greater than the number of opened catalogs.\n"
@ -288,7 +290,7 @@ class NetworkView {
);
}
void setOpenedActivity(String key, NetworkCatalogActivity activity) {
void setOpenedActivity(NetworkTree.Key key, NetworkCatalogActivity activity) {
if (activity == null) {
myOpenedActivities.remove(key);
} else {
@ -296,7 +298,7 @@ class NetworkView {
}
}
public NetworkCatalogActivity getOpenedActivity(String key) {
public NetworkCatalogActivity getOpenedActivity(NetworkTree.Key key) {
return myOpenedActivities.get(key);
}

View file

@ -75,7 +75,7 @@ class RefillAccountTree extends NetworkTree implements ZLAndroidTree {
}
@Override
public String getUniqueKey() {
return null;
protected String getStringId() {
return "@TopUp Account";
}
}

View file

@ -26,7 +26,6 @@ import android.view.ContextMenu;
import org.geometerplus.fbreader.network.NetworkTree;
import org.geometerplus.fbreader.network.SearchResult;
class SearchItemActions extends NetworkTreeActions {
public static final int RUN_SEARCH_ITEM_ID = 0;
@ -50,7 +49,7 @@ class SearchItemActions extends NetworkTreeActions {
public void buildContextMenu(Activity activity, ContextMenu menu, NetworkTree tree) {
menu.setHeaderTitle(tree.getName());
final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkSearchActivity.SEARCH_RUNNABLE_KEY);
final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey);
if (!isLoading) {
addMenuItem(menu, RUN_SEARCH_ITEM_ID, "search");
@ -61,7 +60,7 @@ class SearchItemActions extends NetworkTreeActions {
@Override
public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) {
final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkSearchActivity.SEARCH_RUNNABLE_KEY);
final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(NetworkTree.SearchKey);
if (!isLoading) {
return RUN_SEARCH_ITEM_ID;
}

View file

@ -104,7 +104,7 @@ public class SearchItemTree extends NetworkTree implements ZLAndroidTree {
}
@Override
public String getUniqueKey() {
return NetworkSearchActivity.SEARCH_RUNNABLE_KEY;
protected String getStringId() {
return "@Search";
}
}

View file

@ -32,7 +32,7 @@ class OEBAnnotationReader extends ZLXMLReaderAdapter implements XMLNamespaces {
private static final int READ_DESCRIPTION = 1;
private int myReadState;
private final StringBuffer myBuffer = new StringBuffer();
private final StringBuilder myBuffer = new StringBuilder();
String readAnnotation(ZLFile file) {
myReadState = READ_NONE;

View file

@ -83,7 +83,7 @@ class OEBMetaInfoReader extends ZLXMLReaderAdapter implements XMLNamespaces {
private int myReadState;
private boolean myReadMetaData;
private final StringBuffer myBuffer = new StringBuffer();
private final StringBuilder myBuffer = new StringBuilder();
@Override
public boolean processNamespaces() {

View file

@ -59,7 +59,7 @@ public final class NetworkBookItem extends NetworkLibraryItem {
return false;
}
final AuthorData data = (AuthorData) o;
return SortKey == data.SortKey && DisplayName == data.DisplayName;
return SortKey.equals(data.SortKey) && DisplayName.equals(data.DisplayName);
}
@Override

View file

@ -21,6 +21,7 @@ package org.geometerplus.fbreader.network;
import java.util.LinkedList;
import java.util.Set;
import java.io.*;
import org.geometerplus.zlibrary.core.constants.MimeTypes;
import org.geometerplus.zlibrary.core.image.ZLImage;
@ -28,6 +29,71 @@ import org.geometerplus.zlibrary.core.image.ZLImage;
import org.geometerplus.fbreader.tree.FBTree;
public abstract class NetworkTree extends FBTree {
public static final Key SearchKey = new Key(null, "@Search");
public static class Key implements Serializable {
private Key myParent;
private String myId;
private Key(Key parent, String id) {
if (id == null) {
throw new IllegalArgumentException("NetworkTree string id must be non-null");
}
myParent = parent;
myId = id;
}
private Key() {
}
@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}
if (!(other instanceof NetworkTree.Key)) {
return false;
}
final NetworkTree.Key key = (NetworkTree.Key)other;
return myParent == key.myParent && myId.equals(key.myId);
}
@Override
public int hashCode() {
return myId.hashCode();
}
private void writeObject(ObjectOutputStream os) throws IOException {
if (myParent != null) {
myParent.writeObject(os);
}
os.writeBytes(myId);
os.writeBytes("\000");
}
private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException {
myParent = null;
myId = null;
final StringBuilder builder = new StringBuilder();
try {
while (true) {
char c = is.readChar();
if (c != '\000') {
builder.append(c);
} else {
if (myId != null) {
myParent = new Key(myParent, myId);
}
myId = builder.toString();
builder.delete(0, builder.length());
}
}
} catch (IOException e) {
}
}
}
protected NetworkTree(int level) {
super(level);
}
@ -90,11 +156,28 @@ public abstract class NetworkTree extends FBTree {
public abstract NetworkLibraryItem getHoldedItem();
private Key myKey;
/**
* Returns unique identifier which can be used in NetworkView methods
* @return unique String instance
* @return unique Key instance
*/
public abstract String getUniqueKey();
public final Key getUniqueKey() {
if (myKey == null) {
//final ZLTree parentTree = getParent();
final Key parentKey = Parent instanceof NetworkTree ?
((NetworkTree)Parent).getUniqueKey() : null;
myKey = new Key(parentKey, getStringId());
}
return myKey;
}
/**
* Returns id used as a part of unique key above. This string must be
* not null
* and
* be unique for all children of same tree
*/
protected abstract String getStringId();
public void removeItems(Set<NetworkLibraryItem> items) {
if (items.isEmpty() || subTrees().isEmpty()) {

View file

@ -172,7 +172,7 @@ class OPDSXMLReader extends ZLXMLReaderAdapter {
private int myState = START;
private final StringBuffer myBuffer = new StringBuffer();
private final StringBuilder myBuffer = new StringBuilder();
private HtmlToString myHtmlToString = new HtmlToString();
private boolean myFeedMetadataProcessed;

View file

@ -125,7 +125,7 @@ public class NetworkAuthorTree extends NetworkTree {
}
@Override
public String getUniqueKey() {
return "org.geometerplus.fbreader.network.tree.Authors:" + Author.DisplayName;
protected String getStringId() {
return "@Author:" + Author.DisplayName + ":" + Author.SortKey;
}
}

View file

@ -74,7 +74,7 @@ public class NetworkBookTree extends NetworkTree {
}
@Override
public String getUniqueKey() {
return null;
protected String getStringId() {
return "@Book:" + Book.Id + ":" + Book.Title;
}
}

View file

@ -172,7 +172,7 @@ public class NetworkCatalogTree extends NetworkTree {
}
@Override
public String getUniqueKey() {
protected String getStringId() {
return Item.getFullRequestString();
}
}

View file

@ -100,15 +100,7 @@ public class NetworkSeriesTree extends NetworkTree {
}
@Override
public String getUniqueKey() {
final StringBuilder buffer = new StringBuilder();
final String parentKey = ((NetworkTree)Parent).getUniqueKey();
if (parentKey != null) {
buffer.append(parentKey).append("///");
}
buffer.append("org.geometerplus.fbreader.network.tree.Series:").append(SeriesTitle);
return buffer.toString();
protected String getStringId() {
return "@Series:" + SeriesTitle;
}
}

View file

@ -34,7 +34,7 @@ public final class RootTree extends NetworkTree {
}
@Override
public String getUniqueKey() {
return null;
protected String getStringId() {
return "@Root";
}
}