mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-05 10:49:24 +02:00
refactoring: user data in NetworkTree instead of map in NetworkView
This commit is contained in:
parent
2c3d3c11f8
commit
c0437dafef
11 changed files with 101 additions and 90 deletions
|
@ -19,17 +19,47 @@
|
|||
|
||||
package org.geometerplus.android.fbreader.network;
|
||||
|
||||
import android.app.Service;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.IBinder;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.app.Service;
|
||||
import android.content.Intent;
|
||||
|
||||
import org.geometerplus.fbreader.network.NetworkTree;
|
||||
|
||||
public class ItemsLoadingService extends Service {
|
||||
private static final String KEY = "ItemsLoadingRunnable";
|
||||
|
||||
public static final String ITEMS_LOADING_RUNNABLE_KEY = "org.geometerplus.android.fbreader.network.ItemsLoadingRunnable";
|
||||
static void start(Context context, NetworkTree tree, ItemsLoadingRunnable runnable) {
|
||||
boolean doDownload = false;
|
||||
synchronized (tree) {
|
||||
if (tree.getUserData(KEY) == null) {
|
||||
tree.setUserData(KEY, runnable);
|
||||
doDownload = true;
|
||||
}
|
||||
}
|
||||
if (doDownload) {
|
||||
context.startService(
|
||||
new Intent(context.getApplicationContext(), ItemsLoadingService.class)
|
||||
.putExtra(Util.TREE_KEY_KEY, tree.getUniqueKey())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static ItemsLoadingRunnable getRunnable(NetworkTree tree) {
|
||||
return (ItemsLoadingRunnable)tree.getUserData(KEY);
|
||||
}
|
||||
|
||||
private static void removeRunnable(NetworkTree tree) {
|
||||
synchronized (tree) {
|
||||
ItemsLoadingRunnable runnable = (ItemsLoadingRunnable)tree.getUserData(KEY);
|
||||
if (runnable != null) {
|
||||
tree.setUserData(KEY, null);
|
||||
runnable.runFinishHandler();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private volatile int myServiceCounter;
|
||||
|
||||
|
@ -54,18 +84,19 @@ public class ItemsLoadingService extends Service {
|
|||
super.onStart(intent, startId);
|
||||
doStart();
|
||||
|
||||
final NetworkTree.Key key = (NetworkTree.Key)intent.getSerializableExtra(ITEMS_LOADING_RUNNABLE_KEY);
|
||||
if (key == null) {
|
||||
final NetworkTree tree = Util.getTreeFromIntent(intent);
|
||||
if (tree == null) {
|
||||
doStop();
|
||||
return;
|
||||
}
|
||||
intent.removeExtra(ITEMS_LOADING_RUNNABLE_KEY);
|
||||
intent.removeExtra(Util.TREE_KEY_KEY);
|
||||
|
||||
if (!NetworkView.Instance().isInitialized()) {
|
||||
doStop();
|
||||
return;
|
||||
}
|
||||
final ItemsLoadingRunnable runnable = NetworkView.Instance().getItemsLoadingRunnable(key);
|
||||
|
||||
final ItemsLoadingRunnable runnable = getRunnable(tree);
|
||||
if (runnable == null) {
|
||||
doStop();
|
||||
return;
|
||||
|
@ -74,8 +105,8 @@ public class ItemsLoadingService extends Service {
|
|||
final Handler finishHandler = new Handler() {
|
||||
public void handleMessage(Message message) {
|
||||
doStop();
|
||||
removeRunnable(tree);
|
||||
if (NetworkView.Instance().isInitialized()) {
|
||||
NetworkView.Instance().removeItemsLoadingRunnable(key);
|
||||
NetworkView.Instance().fireModelChangedAsync();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -176,7 +176,7 @@ class NetworkCatalogActions extends NetworkTreeActions {
|
|||
prepareOptionsItem(menu, RELOAD_ITEM_ID,
|
||||
urlItem != null &&
|
||||
urlItem.getUrl(UrlInfo.Type.Catalog) != null &&
|
||||
!NetworkView.Instance().containsItemsLoadingRunnable(tree.getUniqueKey())
|
||||
ItemsLoadingService.getRunnable(tree) == null
|
||||
);
|
||||
|
||||
boolean signIn = false;
|
||||
|
@ -438,9 +438,9 @@ class NetworkCatalogActions extends NetworkTreeActions {
|
|||
* 3) Remove unused messages (say, by timeout)
|
||||
*/
|
||||
final ExpandCatalogHandler handler = new ExpandCatalogHandler(tree, key);
|
||||
NetworkView.Instance().startItemsLoading(
|
||||
ItemsLoadingService.start(
|
||||
activity,
|
||||
key,
|
||||
tree,
|
||||
new ExpandCatalogRunnable(handler, tree, true, resumeNotLoad)
|
||||
);
|
||||
processExtraData(activity, tree.Item.extraData(), new Runnable() {
|
||||
|
@ -453,17 +453,16 @@ class NetworkCatalogActions extends NetworkTreeActions {
|
|||
}
|
||||
|
||||
public void doReloadCatalog(NetworkBaseActivity activity, final NetworkCatalogTree tree) {
|
||||
final NetworkTree.Key key = tree.getUniqueKey();
|
||||
if (NetworkView.Instance().containsItemsLoadingRunnable(key)) {
|
||||
if (ItemsLoadingService.getRunnable(tree) != null) {
|
||||
return;
|
||||
}
|
||||
tree.ChildrenItems.clear();
|
||||
tree.clear();
|
||||
NetworkView.Instance().fireModelChangedAsync();
|
||||
final ExpandCatalogHandler handler = new ExpandCatalogHandler(tree, key);
|
||||
NetworkView.Instance().startItemsLoading(
|
||||
final ExpandCatalogHandler handler = new ExpandCatalogHandler(tree, tree.getUniqueKey());
|
||||
ItemsLoadingService.start(
|
||||
activity,
|
||||
key,
|
||||
tree,
|
||||
new ExpandCatalogRunnable(handler, tree, false, false)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -222,21 +222,25 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR
|
|||
}
|
||||
}
|
||||
|
||||
private static NetworkTree.Key getLoadableNetworkTreeKey(NetworkTree tree) {
|
||||
if ((tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree)
|
||||
&& tree.Parent instanceof NetworkTree) {
|
||||
return getLoadableNetworkTreeKey((NetworkTree)tree.Parent);
|
||||
private static NetworkTree getLoadableNetworkTree(NetworkTree tree) {
|
||||
while (tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree) {
|
||||
if (tree.Parent instanceof NetworkTree) {
|
||||
tree = (NetworkTree)tree.Parent;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return tree.getUniqueKey();
|
||||
}
|
||||
return tree;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onModelChanged() {
|
||||
runOnUiThread(new Runnable() {
|
||||
public void run() {
|
||||
final NetworkView networkView = NetworkView.Instance();
|
||||
final NetworkTree.Key key = getLoadableNetworkTreeKey(myTree);
|
||||
myInProgress = key != null && networkView.isInitialized() && networkView.containsItemsLoadingRunnable(key);
|
||||
final NetworkTree tree = getLoadableNetworkTree(myTree);
|
||||
myInProgress =
|
||||
tree != null &&
|
||||
ItemsLoadingService.getRunnable(tree) != null;
|
||||
getListView().invalidateViews();
|
||||
|
||||
/*
|
||||
|
@ -261,14 +265,11 @@ public class NetworkCatalogActivity extends NetworkBaseActivity implements UserR
|
|||
}
|
||||
|
||||
private void doStopLoading() {
|
||||
if (NetworkView.Instance().isInitialized()) {
|
||||
final ItemsLoadingRunnable runnable =
|
||||
NetworkView.Instance().getItemsLoadingRunnable(myTree.getUniqueKey());
|
||||
final ItemsLoadingRunnable runnable = ItemsLoadingService.getRunnable(myTree);
|
||||
if (runnable != null) {
|
||||
runnable.interruptLoading();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
|
|
|
@ -200,13 +200,9 @@ public class NetworkLibraryActivity extends NetworkBaseActivity {
|
|||
}
|
||||
|
||||
private static boolean searchIsInProgress() {
|
||||
final NetworkView nView = NetworkView.Instance();
|
||||
return
|
||||
nView != null &&
|
||||
nView.isInitialized() &&
|
||||
nView.containsItemsLoadingRunnable(
|
||||
NetworkLibrary.Instance().getSearchItemTree().getUniqueKey()
|
||||
);
|
||||
return ItemsLoadingService.getRunnable(
|
||||
NetworkLibrary.Instance().getSearchItemTree()
|
||||
) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -156,7 +156,7 @@ public class NetworkSearchActivity extends Activity {
|
|||
|
||||
final SearchItemTree tree = library.getSearchItemTree();
|
||||
if (tree == null ||
|
||||
NetworkView.Instance().containsItemsLoadingRunnable(tree.getUniqueKey())) {
|
||||
ItemsLoadingService.getRunnable(tree) != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -167,10 +167,8 @@ public class NetworkSearchActivity extends Activity {
|
|||
NetworkView.Instance().fireModelChangedAsync();
|
||||
|
||||
final SearchHandler handler = new SearchHandler(tree);
|
||||
NetworkView.Instance().startItemsLoading(
|
||||
this,
|
||||
tree.getUniqueKey(),
|
||||
new SearchRunnable(handler, pattern)
|
||||
ItemsLoadingService.start(
|
||||
this, tree, new SearchRunnable(handler, pattern)
|
||||
);
|
||||
Util.openTree(this, tree);
|
||||
}
|
||||
|
|
|
@ -134,46 +134,8 @@ class NetworkView {
|
|||
* Code for loading network items (running items-loading service and managing items-loading runnables).
|
||||
*/
|
||||
|
||||
private final HashMap<NetworkTree.Key,ItemsLoadingRunnable> myItemsLoadingRunnables =
|
||||
new HashMap<NetworkTree.Key,ItemsLoadingRunnable>();
|
||||
|
||||
public void startItemsLoading(Context context, NetworkTree.Key key, ItemsLoadingRunnable runnable) {
|
||||
boolean doDownload = false;
|
||||
synchronized (myItemsLoadingRunnables) {
|
||||
if (!myItemsLoadingRunnables.containsKey(key)) {
|
||||
myItemsLoadingRunnables.put(key, runnable);
|
||||
doDownload = true;
|
||||
}
|
||||
}
|
||||
if (doDownload) {
|
||||
context.startService(
|
||||
new Intent(context.getApplicationContext(), ItemsLoadingService.class)
|
||||
.putExtra(ItemsLoadingService.ITEMS_LOADING_RUNNABLE_KEY, key)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
ItemsLoadingRunnable getItemsLoadingRunnable(NetworkTree.Key key) {
|
||||
synchronized (myItemsLoadingRunnables) {
|
||||
return myItemsLoadingRunnables.get(key);
|
||||
}
|
||||
}
|
||||
|
||||
void removeItemsLoadingRunnable(NetworkTree.Key key) {
|
||||
synchronized (myItemsLoadingRunnables) {
|
||||
ItemsLoadingRunnable runnable = myItemsLoadingRunnables.remove(key);
|
||||
if (runnable != null) {
|
||||
runnable.runFinishHandler();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final boolean containsItemsLoadingRunnable(NetworkTree.Key key) {
|
||||
return getItemsLoadingRunnable(key) != null;
|
||||
}
|
||||
|
||||
public void tryResumeLoading(NetworkBaseActivity activity, NetworkCatalogTree tree, Runnable expandRunnable) {
|
||||
final ItemsLoadingRunnable runnable = getItemsLoadingRunnable(tree.getUniqueKey());
|
||||
final ItemsLoadingRunnable runnable = ItemsLoadingService.getRunnable(tree);
|
||||
if (runnable != null && runnable.tryResumeLoading()) {
|
||||
Util.openTree(activity, tree);
|
||||
return;
|
||||
|
|
|
@ -50,7 +50,7 @@ class SearchItemActions extends NetworkTreeActions {
|
|||
public void buildContextMenu(Activity activity, ContextMenu menu, NetworkTree tree) {
|
||||
menu.setHeaderTitle(tree.getName());
|
||||
|
||||
final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(tree.getUniqueKey());
|
||||
final boolean isLoading = ItemsLoadingService.getRunnable(tree) != null;
|
||||
|
||||
if (!isLoading) {
|
||||
addMenuItem(menu, RUN_SEARCH_ITEM_ID, "search");
|
||||
|
@ -61,7 +61,7 @@ class SearchItemActions extends NetworkTreeActions {
|
|||
|
||||
@Override
|
||||
public int getDefaultActionCode(NetworkBaseActivity activity, NetworkTree tree) {
|
||||
final boolean isLoading = NetworkView.Instance().containsItemsLoadingRunnable(tree.getUniqueKey());
|
||||
final boolean isLoading = ItemsLoadingService.getRunnable(tree) != null;
|
||||
if (!isLoading) {
|
||||
return RUN_SEARCH_ITEM_ID;
|
||||
}
|
||||
|
|
|
@ -232,7 +232,7 @@ abstract class Util implements UserRegistrationConstants {
|
|||
}
|
||||
}
|
||||
|
||||
private static final String TREE_KEY_KEY = "org.geometerplus.android.fbreader.network.TreeKey";
|
||||
static final String TREE_KEY_KEY = "org.geometerplus.android.fbreader.network.TreeKey";
|
||||
|
||||
static void openTree(Context context, NetworkTree tree) {
|
||||
final Class<?> clz = tree instanceof NetworkBookTree
|
||||
|
|
|
@ -109,6 +109,10 @@ public class NetworkBookItem extends NetworkItem {
|
|||
IndexInSeries = indexInSeries;
|
||||
}
|
||||
|
||||
public boolean isFullyLoaded() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void loadFullInformation() throws ZLNetworkException {
|
||||
}
|
||||
|
||||
|
|
|
@ -19,8 +19,7 @@
|
|||
|
||||
package org.geometerplus.fbreader.network;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
import org.geometerplus.zlibrary.core.image.ZLImage;
|
||||
|
@ -67,6 +66,9 @@ public abstract class NetworkTree extends FBTree {
|
|||
}
|
||||
}
|
||||
|
||||
private Key myKey;
|
||||
private Map<String,Object> myUserData;
|
||||
|
||||
protected NetworkTree() {
|
||||
super();
|
||||
}
|
||||
|
@ -123,10 +125,8 @@ public abstract class NetworkTree extends FBTree {
|
|||
return null;
|
||||
}
|
||||
|
||||
|
||||
public abstract NetworkItem getHoldedItem();
|
||||
|
||||
private Key myKey;
|
||||
/**
|
||||
* Returns unique identifier which can be used in NetworkView methods
|
||||
* @return unique Key instance
|
||||
|
@ -141,6 +141,21 @@ public abstract class NetworkTree extends FBTree {
|
|||
return myKey;
|
||||
}
|
||||
|
||||
public final synchronized void setUserData(String key, Object data) {
|
||||
if (myUserData == null) {
|
||||
myUserData = new HashMap<String,Object>();
|
||||
}
|
||||
if (data != null) {
|
||||
myUserData.put(key, data);
|
||||
} else {
|
||||
myUserData.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
public final synchronized Object getUserData(String key) {
|
||||
return myUserData != null ? myUserData.get(key) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns id used as a part of unique key above. This string must be
|
||||
* not null
|
||||
|
|
|
@ -208,6 +208,11 @@ public class OPDSBookItem extends NetworkBookItem implements OPDSConstants {
|
|||
|
||||
private volatile boolean myInformationIsFull;
|
||||
|
||||
@Override
|
||||
public synchronized boolean isFullyLoaded() {
|
||||
return myInformationIsFull || getUrl(UrlInfo.Type.SingleEntry) == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void loadFullInformation() throws ZLNetworkException {
|
||||
if (myInformationIsFull) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue