From 55651807302dc424c80d99a0032622884e1a09c1 Mon Sep 17 00:00:00 2001 From: seven332 Date: Sat, 23 May 2015 03:08:06 +0800 Subject: [PATCH] Add SceneStateListener --- .../hippo/ehviewer/ui/ContentActivity.java | 49 +++++++++++ .../com/hippo/scene/SceneApplication.java | 2 +- .../java/com/hippo/scene/SceneManager.java | 88 +++++++++++++++++-- 3 files changed, 131 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java index 100c337f9..37d7163b6 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java @@ -34,6 +34,7 @@ import com.hippo.ehviewer.util.Config; import com.hippo.ehviewer.widget.DrawerLeftPanel; import com.hippo.ehviewer.widget.FitStageLayout; import com.hippo.scene.Announcer; +import com.hippo.scene.SceneManager; import com.hippo.scene.SimpleCurtain; import com.hippo.scene.StageActivity; import com.hippo.scene.StageLayout; @@ -94,6 +95,38 @@ public final class ContentActivity extends StageActivity } }; + private SceneManager.SceneStateListener mSceneStateListener = new SceneManager.SceneStateListener() { + @Override + public void onCreate(Class clazz) { + if (clazz.equals(GalleryListScene.class)) { + unlockDrawer(); + } else { + lockDrawer(); + } + } + + @Override + public void onDestroy(Class clazz) { + } + + @Override + public void onPause(Class clazz) { + } + + @Override + public void onResume(Class clazz) { + if (clazz.equals(GalleryListScene.class)) { + unlockDrawer(); + } else { + lockDrawer(); + } + } + + @Override + public void onReplace(Class clazz) { + } + }; + @Override protected boolean isShowStats() { return Config.getShowApplicationStats(); @@ -106,6 +139,8 @@ public final class ContentActivity extends StageActivity super.onCreate(savedInstanceState); setContentView(R.layout.activity_content); + SceneManager.getInstance().addSceneStateListener(mSceneStateListener); + mResources = getResources(); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); @@ -145,6 +180,12 @@ public final class ContentActivity extends StageActivity } } + @Override + protected void onDestroy() { + super.onDestroy(); + SceneManager.getInstance().removeSceneStateListener(mSceneStateListener); + } + @Override public @NonNull StageLayout getStageLayout() { return mFitStageLayout; @@ -178,6 +219,14 @@ public final class ContentActivity extends StageActivity } } + public void lockDrawer() { + mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); + } + + public void unlockDrawer() { + mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); + } + @Override public void onFitPaddingBottom(int bottom) { setFitPaddingBottom(bottom); diff --git a/app/src/main/java/com/hippo/scene/SceneApplication.java b/app/src/main/java/com/hippo/scene/SceneApplication.java index 3bb00a846..235603d14 100644 --- a/app/src/main/java/com/hippo/scene/SceneApplication.java +++ b/app/src/main/java/com/hippo/scene/SceneApplication.java @@ -25,7 +25,7 @@ public class SceneApplication extends Application { public void onCreate() { super.onCreate(); - mSceneManager = new SceneManager(); + mSceneManager = SceneManager.getInstance(); StageActivity.setSceneManager(mSceneManager); Scene.setSceneManager(mSceneManager); } diff --git a/app/src/main/java/com/hippo/scene/SceneManager.java b/app/src/main/java/com/hippo/scene/SceneManager.java index 1c6e232ce..068f0673d 100644 --- a/app/src/main/java/com/hippo/scene/SceneManager.java +++ b/app/src/main/java/com/hippo/scene/SceneManager.java @@ -22,9 +22,11 @@ import android.support.annotation.Nullable; import com.hippo.util.IntIdGenerator; import com.hippo.util.Log; +import java.util.ArrayList; +import java.util.List; import java.util.Stack; -class SceneManager { +public class SceneManager { private static final String TAG = SceneManager.class.getSimpleName(); @@ -35,8 +37,19 @@ class SceneManager { private IntIdGenerator mIdGenerator = IntIdGenerator.create(); + private List mSceneStateListenerList = new ArrayList<>(); + + private static SceneManager sSceneManger; + + public static SceneManager getInstance() { + if (sSceneManger == null) { + sSceneManger = new SceneManager(); + } + return sSceneManger; + } + // Should only be called by SceneApplication - SceneManager() { + private SceneManager() { } int nextId() { @@ -55,6 +68,44 @@ class SceneManager { return mStageActivity != null; } + public void addSceneStateListener(SceneStateListener listener) { + mSceneStateListenerList.add(listener); + } + + public void removeSceneStateListener(SceneStateListener listener) { + mSceneStateListenerList.remove(listener); + } + + private void notifyCreate(Class clazz) { + for (SceneStateListener l : mSceneStateListenerList) { + l.onCreate(clazz); + } + } + + private void notifyDestroy(Class clazz) { + for (SceneStateListener l : mSceneStateListenerList) { + l.onDestroy(clazz); + } + } + + private void notifyPause(Class clazz) { + for (SceneStateListener l : mSceneStateListenerList) { + l.onPause(clazz); + } + } + + private void notifyResume(Class clazz) { + for (SceneStateListener l : mSceneStateListenerList) { + l.onResume(clazz); + } + } + + private void notifyReplace(Class clazz) { + for (SceneStateListener l : mSceneStateListenerList) { + l.onReplace(clazz); + } + } + Scene createSceneByClass(@NonNull Class sceneClass) { try { return (Scene) sceneClass.newInstance(); @@ -111,11 +162,13 @@ class SceneManager { if (previousState != null) { previousState.pause(); - scene.setState(Scene.SCENE_STATE_PAUSE); + previousState.setState(Scene.SCENE_STATE_PAUSE); + notifyPause(previousState.getClass()); } - scene.setState(Scene.SCENE_STATE_CREATE); scene.create(null); + scene.setState(Scene.SCENE_STATE_CREATE); + notifyCreate(scene.getClass()); // Update fit padding int fitPaddingBottom = getStageActivity().getFitPaddingBottom(); @@ -156,8 +209,11 @@ class SceneManager { if (index == 0) { // It is the last scene, just finish the activity mSceneStack.remove(index); + scene.destroy(); scene.setState(Scene.SCENE_STATE_DESTROY); + notifyDestroy(scene.getClass()); + getStageActivity().finish(); } else { // TODO check scene state @@ -169,10 +225,13 @@ class SceneManager { if (previousState != null) { previousState.resume(); - scene.setState(Scene.SCENE_STATE_RUN); + previousState.setState(Scene.SCENE_STATE_RUN); + notifyResume(previousState.getClass()); } scene.destroy(); + scene.setState(Scene.SCENE_STATE_DESTROY); + notifyDestroy(scene.getClass()); Curtain curtain = scene.getCurtain(); if (curtain != null && previousState != null && curtain.isPreviousScene(previousState)) { @@ -181,7 +240,6 @@ class SceneManager { curtain.close(previousState, scene); // detachFromeStage by curtain } else { - scene.setState(Scene.SCENE_STATE_DESTROY); scene.detachFromeStage(); } } @@ -243,12 +301,28 @@ class SceneManager { for (Scene oldScene : tempStack) { Scene newScene = createSceneByClass(oldScene.getClass()); newScene.replace(oldScene); + notifyReplace(newScene.getClass()); + oldScene.destroy(); oldScene.setState(Scene.SCENE_STATE_DESTROY); + notifyDestroy(oldScene.getClass()); + newScene.create(savedInstanceState); - newScene.setState(Scene.SCENE_STATE_RUN); + newScene.setState(Scene.SCENE_STATE_CREATE); + notifyCreate(newScene.getClass()); + newScene.restoreInstanceState(savedInstanceState); + + newScene.setState(Scene.SCENE_STATE_RUN); mSceneStack.push(newScene); } } + + public interface SceneStateListener { + void onCreate(Class clazz); + void onDestroy(Class clazz); + void onPause(Class clazz); + void onResume(Class clazz); + void onReplace(Class clazz); + } }