diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java index 253d51a90..054a06c5c 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java @@ -30,6 +30,7 @@ import com.hippo.ehviewer.client.EhUtils; import com.hippo.ehviewer.ui.scene.GalleryListScene; import com.hippo.ehviewer.ui.scene.LoginScene; import com.hippo.ehviewer.ui.scene.WarningScene; +import com.hippo.scene.SceneFragment; import com.hippo.scene.StageActivity; public final class MainActivity extends StageActivity @@ -114,7 +115,7 @@ public final class MainActivity extends StageActivity if (id == R.id.nav_homepage) { Bundle args = new Bundle(); args.putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_HOMEPAGE); - startScene(GalleryListScene.class, args); + startScene(GalleryListScene.class, args, null, SceneFragment.FLAG_REMOVE_ALL_THE_OTHER_SCENES); } else if (id == R.id.nav_whats_hot) { } else if (id == R.id.nav_favourite) { diff --git a/app/src/main/java/com/hippo/scene/SceneFragment.java b/app/src/main/java/com/hippo/scene/SceneFragment.java index 474b426ca..2b7559967 100644 --- a/app/src/main/java/com/hippo/scene/SceneFragment.java +++ b/app/src/main/java/com/hippo/scene/SceneFragment.java @@ -38,6 +38,8 @@ public class SceneFragment extends Fragment { public static final int LAUNCH_MODE_STANDARD = 0; public static final int LAUNCH_MODE_SINGLE_TOP = 1; + public static final int FLAG_REMOVE_ALL_THE_OTHER_SCENES = 0x1; + @LaunchMode public int getLaunchMode() { return LAUNCH_MODE_STANDARD; @@ -51,21 +53,27 @@ public class SceneFragment extends Fragment { public void onNewArguments(@NonNull Bundle args) {} public void startScene(Class clazz) { - startScene(clazz, null, null); + startScene(clazz, null, null, 0); } public void startScene(Class clazz, Bundle args) { - startScene(clazz, args, null); + startScene(clazz, args, null, 0); } public void startScene(Class clazz, TransitionHelper transitionHelper) { - startScene(clazz, null, transitionHelper); + startScene(clazz, null, transitionHelper, 0); } - public void startScene(Class clazz, Bundle args, TransitionHelper transitionHelper) { + public void startScene(Class clazz, Bundle args, + TransitionHelper transitionHelper) { + startScene(clazz, args, transitionHelper, 0); + } + + public void startScene(Class clazz, Bundle args, + TransitionHelper transitionHelper, int flag) { FragmentActivity activity = getActivity(); if (activity instanceof StageActivity) { - ((StageActivity) activity).startScene(clazz, args, transitionHelper); + ((StageActivity) activity).startScene(clazz, args, transitionHelper, flag); } } diff --git a/app/src/main/java/com/hippo/scene/StageActivity.java b/app/src/main/java/com/hippo/scene/StageActivity.java index f049a803f..845eb83ef 100644 --- a/app/src/main/java/com/hippo/scene/StageActivity.java +++ b/app/src/main/java/com/hippo/scene/StageActivity.java @@ -122,22 +122,25 @@ public abstract class StageActivity extends AppCompatActivity { } public void startScene(Class clazz) { - startScene(clazz, null, null); + startScene(clazz, null, null, 0); } public void startScene(Class clazz, Bundle args) { - startScene(clazz, args, null); + startScene(clazz, args, null, 0); } public void startScene(Class clazz, TransitionHelper transitionHelper) { - startScene(clazz, null, transitionHelper); + startScene(clazz, null, transitionHelper, 0); } public void startScene(Class clazz, - Bundle args, TransitionHelper transitionHelper) { + Bundle args, TransitionHelper transitionHelper, int flag) { + boolean createNewScene = true; + boolean removeAllTheOthers = (flag & SceneFragment.FLAG_REMOVE_ALL_THE_OTHER_SCENES) != 0; + FragmentManager fragmentManager = getSupportFragmentManager(); - // Old scene + // Current fragment Fragment currentFragment = null; if (mSceneTagList.size() > 0) { // Get last tag @@ -149,22 +152,42 @@ public abstract class StageActivity extends AppCompatActivity { if (currentFragment instanceof SceneFragment && clazz.isInstance(currentFragment)) { SceneFragment currentScene = (SceneFragment) currentFragment; if (currentScene.getLaunchMode() == SceneFragment.LAUNCH_MODE_SINGLE_TOP) { + createNewScene = false; if (args != null) { currentScene.onNewArguments(args); } - return; + if (!removeAllTheOthers) { + // Done! + return; + } } } - // Create new scene - SceneFragment newScene = newSceneInstance(clazz); - newScene.setArguments(args); + SceneFragment newScene = null; + String newTag = null; + if (createNewScene) { + // Create new scene + newScene = newSceneInstance(clazz); + newScene.setArguments(args); - // Create new scene tag - String newTag = Integer.toString(mIdGenerator.nextId()); + // Create new scene tag + newTag = Integer.toString(mIdGenerator.nextId()); + // Add new tag to list + mSceneTagList.add(newTag); + } + + // 1. createNewScene false, removeAllTheOthers false + // Will not go here + // 2. createNewScene false, removeAllTheOthers true + // Keep current scene, remove all the others, no animation + // 3. createNewScene true, removeAllTheOthers false + // Add new scene, detach current fragment, with animation if exist currentFragment + // 4. createNewScene true, removeAllTheOthers true + // Add new scene, remove all the others, with animation if exist currentFragment FragmentTransaction transaction = fragmentManager.beginTransaction(); - if (currentFragment != null) { + // Animation + if (newScene != null && currentFragment != null) { if (transitionHelper == null || !transitionHelper.onTransition( this, transaction, currentFragment, newScene)) { // Clear shared item @@ -179,16 +202,39 @@ public abstract class StageActivity extends AppCompatActivity { // Set default animation transaction.setCustomAnimations(R.anim.scene_open_enter, R.anim.scene_open_exit); } + } + // Remove scene + if (removeAllTheOthers) { + int startIndex = mSceneTagList.size() - 2; + // Remove scene + for (int i = startIndex; i >= 0; i--) { + String tag = mSceneTagList.get(i); + Fragment fragment = fragmentManager.findFragmentByTag(tag); + if (fragment != null) { + transaction.remove(fragment); + } else { + Log.d(TAG, "Can't find fragment with tag: " + tag); + } + } + // Remove scene tag + if (startIndex >= 0) { + mSceneTagList.subList(0, startIndex + 1).clear(); + } + } + // Detach + if (!removeAllTheOthers && currentFragment != null) { transaction.detach(currentFragment); } - transaction.add(getContainerViewId(), newScene, newTag); + // Add + if (newScene != null) { + transaction.add(getContainerViewId(), newScene, newTag); + } transaction.commit(); - // Add new tag to list - mSceneTagList.add(newTag); - // Update SoftInputMode - getWindow().setSoftInputMode(newScene.getSoftInputMode()); + if (newScene != null) { + getWindow().setSoftInputMode(newScene.getSoftInputMode()); + } } int getStackIndex(SceneFragment scene) { diff --git a/app/src/main/res/layout/scene_toolbar.xml b/app/src/main/res/layout/scene_toolbar.xml index a783aee32..d560708b2 100644 --- a/app/src/main/res/layout/scene_toolbar.xml +++ b/app/src/main/res/layout/scene_toolbar.xml @@ -22,12 +22,11 @@ android:orientation="vertical"> + android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>