diff --git a/src/org/geometerplus/android/fbreader/library/LibraryActivity.java b/src/org/geometerplus/android/fbreader/library/LibraryActivity.java index 2cce93124..b48cc3cac 100644 --- a/src/org/geometerplus/android/fbreader/library/LibraryActivity.java +++ b/src/org/geometerplus/android/fbreader/library/LibraryActivity.java @@ -47,7 +47,6 @@ import org.geometerplus.android.fbreader.tree.BaseActivity; import org.geometerplus.android.fbreader.tree.ListAdapter; public class LibraryActivity extends BaseActivity implements MenuItem.OnMenuItemClickListener, View.OnCreateContextMenuListener { - public static final String TREE_KEY_KEY = "TreeKey"; public static final String SELECTED_BOOK_PATH_KEY = "SelectedBookPath"; static Library LibraryInstance; @@ -70,11 +69,8 @@ public class LibraryActivity extends BaseActivity implements MenuItem.OnMenuItem } final FBTree.Key key = (FBTree.Key)getIntent().getSerializableExtra(TREE_KEY_KEY); - setCurrentTree( - key != null - ? LibraryInstance.getLibraryTree(key) - : LibraryInstance.getRootTree() - ); + setCurrentTree(getTreeByKey(key)); + setTitle(getCurrentTree().getTreeTitle()); final String selectedBookPath = getIntent().getStringExtra(SELECTED_BOOK_PATH_KEY); @@ -87,12 +83,17 @@ public class LibraryActivity extends BaseActivity implements MenuItem.OnMenuItem } final ListAdapter adapter = new LibraryListAdapter(this, getCurrentTree().subTrees()); - setSelection(adapter.getFirstSelectedItemIndex()); + setSelection(adapter.getIndex(adapter.getFirstSelectedItem())); getListView().setTextFilterEnabled(true); getListView().setOnCreateContextMenuListener(this); } + @Override + protected FBTree getTreeByKey(FBTree.Key key) { + return key != null ? LibraryInstance.getLibraryTree(key) : LibraryInstance.getRootTree(); + } + @Override protected void onDestroy() { LibraryInstance = null; @@ -150,6 +151,8 @@ public class LibraryActivity extends BaseActivity implements MenuItem.OnMenuItem } else { UIUtil.showErrorMessage(this, "bookNotFound"); } + } else { + super.onNewIntent(intent); } } diff --git a/src/org/geometerplus/android/fbreader/network/ItemsLoadingService.java b/src/org/geometerplus/android/fbreader/network/ItemsLoadingService.java index b5ae35fb9..fad738a9b 100644 --- a/src/org/geometerplus/android/fbreader/network/ItemsLoadingService.java +++ b/src/org/geometerplus/android/fbreader/network/ItemsLoadingService.java @@ -42,7 +42,7 @@ public class ItemsLoadingService extends Service { if (doDownload) { context.startService( new Intent(context.getApplicationContext(), ItemsLoadingService.class) - .putExtra(Util.TREE_KEY_KEY, tree.getUniqueKey()) + .putExtra(NetworkBaseActivity.TREE_KEY_KEY, tree.getUniqueKey()) ); } } @@ -89,7 +89,7 @@ public class ItemsLoadingService extends Service { doStop(); return; } - intent.removeExtra(Util.TREE_KEY_KEY); + intent.removeExtra(NetworkBaseActivity.TREE_KEY_KEY); if (!NetworkView.Instance().isInitialized()) { doStop(); diff --git a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java index f991f6919..8c59ef4df 100644 --- a/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java +++ b/src/org/geometerplus/android/fbreader/network/NetworkBaseActivity.java @@ -66,6 +66,12 @@ public class NetworkBaseActivity extends BaseActivity implements NetworkView.Eve private volatile boolean myInProgress; + @Override + protected FBTree getTreeByKey(FBTree.Key key) { + final NetworkLibrary library = NetworkLibrary.Instance(); + return key != null ? library.getTreeByKey(key) : library.getRootTree(); + } + @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); diff --git a/src/org/geometerplus/android/fbreader/network/Util.java b/src/org/geometerplus/android/fbreader/network/Util.java index 2cb9856bc..a38f53fc6 100644 --- a/src/org/geometerplus/android/fbreader/network/Util.java +++ b/src/org/geometerplus/android/fbreader/network/Util.java @@ -239,20 +239,18 @@ abstract class Util implements UserRegistrationConstants { } } - 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 ? NetworkBookInfoActivity.class : NetworkBaseActivity.class; context.startActivity( new Intent(context.getApplicationContext(), clz) - .putExtra(TREE_KEY_KEY, tree.getUniqueKey()) + .putExtra(NetworkBaseActivity.TREE_KEY_KEY, tree.getUniqueKey()) ); } public static NetworkTree getTreeFromIntent(Intent intent) { final NetworkLibrary library = NetworkLibrary.Instance(); - final NetworkTree.Key key = (NetworkTree.Key)intent.getSerializableExtra(TREE_KEY_KEY); + final NetworkTree.Key key = (NetworkTree.Key)intent.getSerializableExtra(NetworkBaseActivity.TREE_KEY_KEY); return library.getTreeByKey(key); } } diff --git a/src/org/geometerplus/android/fbreader/tree/BaseActivity.java b/src/org/geometerplus/android/fbreader/tree/BaseActivity.java index c3f4a23ed..05015d72b 100644 --- a/src/org/geometerplus/android/fbreader/tree/BaseActivity.java +++ b/src/org/geometerplus/android/fbreader/tree/BaseActivity.java @@ -30,6 +30,11 @@ import org.geometerplus.android.util.UIUtil; import org.geometerplus.fbreader.tree.FBTree; public abstract class BaseActivity extends ListActivity { + private static final String OPEN_TREE_ACTION = "org.fbreader.intent.OPEN_TREE"; + + public static final String TREE_KEY_KEY = "TreeKey"; + public static final String SELECTED_TREE_KEY_KEY = "SelectedTreeKey"; + private FBTree myCurrentTree; @Override @@ -62,9 +67,7 @@ public abstract class BaseActivity extends ListActivity { } if (keyCode == KeyEvent.KEYCODE_BACK && myCurrentTree.Parent != null) { - final FBTree oldTree = myCurrentTree; - openTree(myCurrentTree.Parent); - setSelection(getListAdapter().getIndex(oldTree)); + openTree(myCurrentTree.Parent, myCurrentTree); return true; } else { return super.onKeyDown(keyCode, event); @@ -72,6 +75,10 @@ public abstract class BaseActivity extends ListActivity { } protected void openTree(final FBTree tree) { + openTree(tree, null); + } + + protected void openTree(final FBTree tree, final FBTree treeToSelect) { switch (tree.getOpeningStatus()) { case WAIT_FOR_OPEN: case ALWAYS_RELOAD_BEFORE_OPENING: @@ -86,29 +93,52 @@ public abstract class BaseActivity extends ListActivity { }, new Runnable() { public void run() { - openTreeInternal(tree); + openTreeInternal(tree, treeToSelect); } } ); } else { tree.waitForOpening(); - openTreeInternal(tree); + openTreeInternal(tree, treeToSelect); } break; default: - openTreeInternal(tree); + openTreeInternal(tree, treeToSelect); break; } } - private void openTreeInternal(FBTree tree) { + protected abstract FBTree getTreeByKey(FBTree.Key key); + + @Override + protected void onNewIntent(Intent intent) { + if (OPEN_TREE_ACTION.equals(intent.getAction())) { + final FBTree.Key key = (FBTree.Key)intent.getSerializableExtra(TREE_KEY_KEY); + final FBTree.Key selectedKey = (FBTree.Key)intent.getSerializableExtra(SELECTED_TREE_KEY_KEY); + myCurrentTree = getTreeByKey(key); + final ListAdapter adapter = getListAdapter(); + adapter.replaceAll(myCurrentTree.subTrees()); + setTitle(myCurrentTree.getTreeTitle()); + final FBTree selectedTree = + selectedKey != null ? getTreeByKey(selectedKey) : adapter.getFirstSelectedItem(); + setSelection(adapter.getIndex(selectedTree)); + } else { + super.onNewIntent(intent); + } + } + + private void openTreeInternal(FBTree tree, FBTree treeToSelect) { switch (tree.getOpeningStatus()) { case READY_TO_OPEN: case ALWAYS_RELOAD_BEFORE_OPENING: - myCurrentTree = tree; - getListAdapter().replaceAll(myCurrentTree.subTrees()); - setTitle(myCurrentTree.getTreeTitle()); - setSelection(getListAdapter().getFirstSelectedItemIndex()); + startActivity(new Intent(this, getClass()) + .setAction(OPEN_TREE_ACTION) + .putExtra(TREE_KEY_KEY, tree.getUniqueKey()) + .putExtra( + SELECTED_TREE_KEY_KEY, + treeToSelect != null ? treeToSelect.getUniqueKey() : null + ) + ); break; case CANNOT_OPEN: UIUtil.showErrorMessage(BaseActivity.this, tree.getOpeningStatusMessage()); diff --git a/src/org/geometerplus/android/fbreader/tree/ListAdapter.java b/src/org/geometerplus/android/fbreader/tree/ListAdapter.java index 1d55a3d8a..e4e46bb0b 100644 --- a/src/org/geometerplus/android/fbreader/tree/ListAdapter.java +++ b/src/org/geometerplus/android/fbreader/tree/ListAdapter.java @@ -95,16 +95,14 @@ public abstract class ListAdapter extends BaseAdapter { return myItems.indexOf(item); } - public int getFirstSelectedItemIndex() { - int index = 0; + public FBTree getFirstSelectedItem() { synchronized (myItems) { for (FBTree t : myItems) { if (myActivity.isTreeSelected(t)) { - return index; + return t; } - ++index; } } - return -1; + return null; } }