diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index 80ab2fe82..11f595185 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -21,9 +21,11 @@ import android.content.Intent; import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; +import android.os.Bundle; import android.os.Parcelable; import android.provider.MediaStore; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.SparseArray; @@ -63,8 +65,8 @@ public class GalleryListScene extends Scene implements SearchLayout.SearhLayoutH @SuppressLint("InflateParams") @Override - public void onCreate() { - super.onCreate(); + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); mActivity = (ContentActivity) getStageActivity(); mResources = mActivity.getResources(); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/TestScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/TestScene.java index 4fecac8b9..c08db1de4 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/TestScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/TestScene.java @@ -16,6 +16,8 @@ package com.hippo.ehviewer.ui.scene; import android.content.res.Resources; +import android.os.Bundle; +import android.support.annotation.Nullable; import com.hippo.ehviewer.R; import com.hippo.ehviewer.ui.ContentActivity; @@ -27,8 +29,8 @@ public class TestScene extends Scene { private Resources mResources; @Override - public void onCreate() { - super.onCreate(); + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); setContentView(R.layout.scene_test); mActivity = (ContentActivity) getStageActivity(); diff --git a/app/src/main/java/com/hippo/scene/Curtain.java b/app/src/main/java/com/hippo/scene/Curtain.java index c6fc67de1..8aa617c10 100644 --- a/app/src/main/java/com/hippo/scene/Curtain.java +++ b/app/src/main/java/com/hippo/scene/Curtain.java @@ -17,6 +17,9 @@ package com.hippo.scene; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.view.View; + +import com.hippo.util.ViewUtils; public abstract class Curtain { @@ -61,4 +64,12 @@ public abstract class Curtain { protected void dispatchCloseFinished(@NonNull Scene enter, @NonNull Scene exit) { exit.closeFinished(); } + + protected void hideSceneOnOpen(@NonNull Scene exit) { + ViewUtils.setVisibility(exit.getSceneView(), View.GONE); + } + + protected void showSceneOnClose(@NonNull Scene enter) { + ViewUtils.setVisibility(enter.getSceneView(), View.VISIBLE); + } } diff --git a/app/src/main/java/com/hippo/scene/Scene.java b/app/src/main/java/com/hippo/scene/Scene.java index 83b94aafd..e3b243b24 100644 --- a/app/src/main/java/com/hippo/scene/Scene.java +++ b/app/src/main/java/com/hippo/scene/Scene.java @@ -25,9 +25,11 @@ import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; +import android.view.ViewTreeObserver; import android.widget.FrameLayout; import com.hippo.util.AssertUtils; +import com.hippo.util.ViewUtils; /** * {@link com.hippo.scene.Scene} is a {@code Activity} of {@link android.app.Activity}. @@ -107,8 +109,8 @@ public abstract class Scene { sSceneManager.finishScene(this); } - void create() { - onCreate(); + void create(@Nullable Bundle savedInstanceState) { + onCreate(savedInstanceState); if (mSceneView == null) { mSceneView = new FrameLayout(getStageActivity()); @@ -117,6 +119,17 @@ public abstract class Scene { // Make sure scene view is attach from stage attachToStage(); + + // Hide it if it is hidden + if (savedInstanceState != null && savedInstanceState.getBoolean(getIsGoneKey(), false)) { + mSceneView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + ViewUtils.removeOnGlobalLayoutListener(mSceneView.getViewTreeObserver(), this); + ViewUtils.setVisibility(mSceneView, View.GONE); + } + }); + } } void destroy() { @@ -178,7 +191,7 @@ public abstract class Scene { bg.setClickable(true); } - protected void onCreate() { + protected void onCreate(@Nullable Bundle savedInstanceState) { } protected void onDestroy() { @@ -296,10 +309,18 @@ public abstract class Scene { return "scene:" + Integer.toHexString(hashCode()); } + private String getIsGoneKey() { + return getStateKey() + ":gone"; + } + void saveInstanceState(Bundle outState) { SparseArray states = new SparseArray<>(); onSaveInstanceState(states); outState.putSparseParcelableArray(getStateKey(), states); + + if (mSceneView != null) { + outState.putBoolean(getIsGoneKey(), mSceneView.getVisibility() == View.GONE); + } } void restoreInstanceState(@NonNull Bundle savedInstanceState) { diff --git a/app/src/main/java/com/hippo/scene/SceneManager.java b/app/src/main/java/com/hippo/scene/SceneManager.java index 1904a72da..44b252404 100644 --- a/app/src/main/java/com/hippo/scene/SceneManager.java +++ b/app/src/main/java/com/hippo/scene/SceneManager.java @@ -73,7 +73,7 @@ class SceneManager { } scene.setState(Scene.SCENE_STATE_CREATE); - scene.create(); + scene.create(null); if (curtain != null && previousState != null) { scene.setState(Scene.SCENE_STATE_OPEN); @@ -186,8 +186,7 @@ class SceneManager { protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { for (Scene scene : mSceneStack) { // Recreate - // TODO might hide sceneView, curtain do it ? - scene.create(); + scene.create(savedInstanceState); scene.restoreInstanceState(savedInstanceState); } } diff --git a/app/src/main/java/com/hippo/scene/TransitionCurtain.java b/app/src/main/java/com/hippo/scene/TransitionCurtain.java index a2c23a6d1..c4817ad67 100644 --- a/app/src/main/java/com/hippo/scene/TransitionCurtain.java +++ b/app/src/main/java/com/hippo/scene/TransitionCurtain.java @@ -25,6 +25,7 @@ import android.view.ViewTreeObserver; import com.hippo.animation.ArgbEvaluator; import com.hippo.animation.SimpleAnimatorListener; +import com.hippo.util.Log; import com.hippo.util.ViewUtils; import java.util.LinkedList; @@ -32,6 +33,8 @@ import java.util.List; public class TransitionCurtain extends Curtain { + private static final String TAG = TransitionCurtain.class.getSimpleName(); + private static long ANIMATE_TIME = 800L; private ViewPair[] mViewPairArray; @@ -61,6 +64,9 @@ public class TransitionCurtain extends Curtain { colorAnim.addListener(new SimpleAnimatorListener() { @Override public void onAnimationEnd(Animator animation) { + dispatchOpenFinished(enter, exit); + hideSceneOnOpen(exit); + if (mClearList) { mAnimList.clear(); } @@ -116,12 +122,7 @@ public class TransitionCurtain extends Curtain { yAnim.addListener(new SimpleAnimatorListener() { @Override public void onAnimationEnd(Animator animation) { - dispatchOpenFinished(enter, exit); ViewUtils.setVisibility(exitView, View.VISIBLE); - - // Hide previous scene - // TODO remove from stage ? - ViewUtils.setVisibility(exit.getSceneView(), View.GONE); } }); @@ -143,8 +144,7 @@ public class TransitionCurtain extends Curtain { @Override public void close(final @NonNull Scene enter, final @NonNull Scene exit) { - // Show previous scene - ViewUtils.setVisibility(enter.getSceneView(), View.VISIBLE); + showSceneOnClose(enter); // Handle background ObjectAnimator colorAnim = ObjectAnimator.ofInt(exit, "backgroundColor", Color.TRANSPARENT); @@ -154,6 +154,7 @@ public class TransitionCurtain extends Curtain { colorAnim.addListener(new SimpleAnimatorListener() { @Override public void onAnimationEnd(Animator animation) { + dispatchCloseFinished(enter, exit); if (mClearList) { mAnimList.clear(); } @@ -169,8 +170,12 @@ public class TransitionCurtain extends Curtain { for (ViewPair pair : mViewPairArray) { final View enterView = pair.getFromView(enter); final View exitView = pair.getToView(exit); - if (enterView == null || exitView == null) { - // Can't get view + if (enterView == null) { + Log.w(TAG, "Can't get enterView when close"); + continue; + } + if (exitView == null) { + Log.w(TAG, "Can't get exitView when close"); continue; } @@ -201,7 +206,6 @@ public class TransitionCurtain extends Curtain { yAnim.addListener(new SimpleAnimatorListener() { @Override public void onAnimationEnd(Animator animation) { - dispatchCloseFinished(enter, exit); ViewUtils.setVisibility(enterView, View.VISIBLE); } }); diff --git a/app/src/main/java/com/hippo/util/ViewUtils.java b/app/src/main/java/com/hippo/util/ViewUtils.java index c210afebb..9a4219296 100644 --- a/app/src/main/java/com/hippo/util/ViewUtils.java +++ b/app/src/main/java/com/hippo/util/ViewUtils.java @@ -19,6 +19,7 @@ import android.annotation.TargetApi; import android.graphics.Bitmap; import android.graphics.Canvas; import android.os.Build; +import android.support.annotation.Nullable; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; @@ -260,7 +261,11 @@ public final class ViewUtils { * @param visibility One of {@link android.view.View#GONE}, * {@link android.view.View#INVISIBLE}, or {@link android.view.View#GONE}. */ - public static void setVisibility(View v, int visibility) { + public static void setVisibility(@Nullable View v, int visibility) { + if (v == null) { + return; + } + if (visibility != v.getVisibility()) { v.setVisibility(visibility); }