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 ea8e275ca..a324b5fd0 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java @@ -122,6 +122,10 @@ public final class ContentActivity extends StageActivity lockDrawer(); } } + + @Override + public void onRebirth(Class clazz) { + } }; @Override 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 a6f6e1280..33b75b969 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 @@ -78,7 +78,6 @@ import com.hippo.widget.FloatingActionButton; import com.hippo.widget.recyclerview.EasyRecyclerView; import java.util.List; -import java.util.Map; // TODO remeber the data in ContentHelper after screen dirction change // TODO Must refresh when change source @@ -199,27 +198,6 @@ public final class GalleryListScene extends Scene implements SearchBar.Helper, return LAUNCH_MODE_SINGLE_TOP; } - - @Override - protected void onSave(Map transferStop) { - super.onSave(transferStop); - - transferStop.put("gallery_list_helper_data", mGalleryListHelper.copyData()); - transferStop.put("gallery_list_helper_save", mGalleryListHelper.save()); - transferStop.put("gallery_list_helper_listener", mGalleryListHelper.mListener); - } - - @SuppressWarnings("unchecked") - @Override - protected void onRestore(Map transferStop) { - super.onRestore(transferStop); - - mGalleryListHelper = new GalleryListHelper(getStageActivity(), - (List) transferStop.get("gallery_list_helper_data"), - (int[]) transferStop.get("gallery_list_helper_save"), - (GalleryListHelperSettable) transferStop.get("gallery_list_helper_listener")); - } - private void handleAnnouncer(Announcer announcer) { int mode = MODE_HOMEPAGE; if (announcer != null) { @@ -255,6 +233,13 @@ public final class GalleryListScene extends Scene implements SearchBar.Helper, handleAnnouncer(announcer); } + @Override + protected void onRebirth(@Nullable Bundle savedInstanceState) { + super.onRebirth(savedInstanceState); + + mGalleryListHelper = new GalleryListHelper(getStageActivity(), mGalleryListHelper); + } + @SuppressWarnings("deprecation") @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -298,7 +283,7 @@ public final class GalleryListScene extends Scene implements SearchBar.Helper, mSearchLayout.setHelper(this); // Content Layout - // OnRestore may create new GalleryListHelper + // onRebirth may create new GalleryListHelper if (mGalleryListHelper == null) { mGalleryListHelper = new GalleryListHelper(mActivity); } @@ -329,8 +314,8 @@ public final class GalleryListScene extends Scene implements SearchBar.Helper, } @Override - protected void onDestroy(boolean willSave) { - super.onDestroy(willSave); + protected void onDestroy() { + super.onDestroy(); // Avoid memory leak if (mGalleryListHelper.mListener != null) { @@ -362,10 +347,6 @@ public final class GalleryListScene extends Scene implements SearchBar.Helper, mFabLayout.setPadding(mFabLayout.getPaddingLeft(), mFabLayout.getPaddingTop(), mFabLayout.getPaddingRight(), mCornerFabOriginalBottom + b); } - private void setFabState(int fabState) { - setFabState(fabState, true); - } - private void setFabState(int fabState, boolean animation) { if (mFabState != fabState) { mFabState = fabState; @@ -861,13 +842,13 @@ public final class GalleryListScene extends Scene implements SearchBar.Helper, super(context); } - public GalleryListHelper(Context context, List data, - int[] save, GalleryListHelperSettable listener) { - super(context, data, save); + public GalleryListHelper(Context context, GalleryListHelper older) { + super(context, older); // Update gallery listener - mListener = listener; + mListener = older.mListener; if (mListener != null) { mListener.setGalleryListHelper(this); + older.mListener = null; } } diff --git a/app/src/main/java/com/hippo/ehviewer/widget/ContentLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/ContentLayout.java index a8b420453..8cf1e530e 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/ContentLayout.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/ContentLayout.java @@ -143,6 +143,17 @@ public class ContentLayout extends FrameLayout { private static final String STATE_KEY_RECYCLER_VIEW = "recycler_view"; private static final String STATE_KEY_TIP_MESSAGE = "tip_message"; + private static final String STATE_KEY_FIRST_PAGE = "first_page"; + private static final String STATE_KEY_LAST_PAGE = "last_page"; + private static final String STATE_KEY_FIRST_INDEX = "first_index"; + private static final String STATE_KEY_LAST_INDEX = "last_index"; + private static final String STATE_KEY_PAGE_COUNT = "page_count"; + private static final String STATE_KEY_CURRENT_PAGE = "current_page"; + private static final String STATE_KEY_PAGE_VOLUME = "page_volume"; + private static final String STATE_KEY_CURRENT_TASK_ID = "current_task_id"; + private static final String STATE_KEY_CURRENT_TASK_TYPR = "current_task_type"; + private static final String STATE_KEY_CURRENT_TASK_PAGE = "current_task_page"; + public static final int TYPE_REFRESH = 0; public static final int TYPE_PRE_PAGE = 1; public static final int TYPE_PRE_PAGE_KEEP_POS = 2; @@ -247,35 +258,20 @@ public class ContentLayout extends FrameLayout { } @SuppressWarnings("unchecked") - protected ContentHelper(Context context, List data, int[] save) { + protected ContentHelper(Context context, ContentHelper older) { this(context); - mData.addAll(data); + mData.addAll(older.mData); - mFirstPage = save[0]; - mLastPage = save[1]; - mFirstIndex = save[2]; - mLastIndex = save[3]; - mPageCount = save[4]; - mCurrentPage = save[5]; - mPageVolume = save[6]; - mCurrentTaskId = save[7]; - mCurrentTaskType = save[8]; - mCurrentTaskPage = save[9]; - } - - public int[] save() { - int[] save = new int[10]; - save[0] = mFirstPage; - save[1] = mLastPage; - save[2] = mFirstIndex; - save[3] = mLastIndex; - save[4] = mPageCount; - save[5] = mCurrentPage; - save[6] = mPageVolume; - save[7] = mCurrentTaskId; - save[8] = mCurrentTaskType; - save[9] = mCurrentTaskPage; - return save; + mFirstPage = older.mFirstPage; + mLastPage = older.mLastPage; + mFirstIndex = older.mFirstIndex; + mLastIndex = older.mLastIndex; + mPageCount = older.mPageCount; + mCurrentPage = older.mCurrentPage; + mPageVolume = older.mPageVolume; + mCurrentTaskId = older.mCurrentTaskId; + mCurrentTaskType = older.mCurrentTaskType; + mCurrentTaskPage = older.mCurrentTaskPage; } private void init(ContentLayout contentLayout) { @@ -328,12 +324,6 @@ public class ContentLayout extends FrameLayout { } } - public List copyData() { - List data = new ArrayList<>(mData.size()); - data.addAll(mData); - return data; - } - /** * @throws IndexOutOfBoundsException * if {@code location < 0 || location >= size()} diff --git a/app/src/main/java/com/hippo/scene/Curtain.java b/app/src/main/java/com/hippo/scene/Curtain.java index fe7c7a35e..0e31ee970 100644 --- a/app/src/main/java/com/hippo/scene/Curtain.java +++ b/app/src/main/java/com/hippo/scene/Curtain.java @@ -38,7 +38,7 @@ public abstract class Curtain { return scene != null && scene.getId() == mPreviousSceneId; } - protected void onReplace() { + protected void onRebirth() { } /** diff --git a/app/src/main/java/com/hippo/scene/Scene.java b/app/src/main/java/com/hippo/scene/Scene.java index 3eba0c5b8..fc2f76648 100644 --- a/app/src/main/java/com/hippo/scene/Scene.java +++ b/app/src/main/java/com/hippo/scene/Scene.java @@ -33,14 +33,13 @@ import android.widget.FrameLayout; import com.hippo.util.AssertUtils; import com.hippo.util.ViewUtils; -import java.util.Map; - /** * {@link com.hippo.scene.Scene} is a {@code Activity} of {@link android.app.Activity}. *

* When start a new {@code Scene}, previous {@code Scene} can stay at screen for * a while. Or retain for a while before destroy. */ +// TODO Improve state public abstract class Scene { public static final int LAUNCH_MODE_STANDARD = 0; @@ -168,8 +167,8 @@ public abstract class Scene { } // TODO Tell destory is it need close - void destroy(boolean willSave) { - onDestroy(willSave); + void destroy() { + onDestroy(); SceneApplication.getRefWatcher(getStageActivity()).watch(this); } @@ -190,12 +189,8 @@ public abstract class Scene { onResume(); } - void save(Map transferStop) { - onSave(transferStop); - } - - void restore(Map transferStop) { - onRestore(transferStop); + void rebirth(@Nullable Bundle savedInstanceState) { + onRebirth(savedInstanceState); } void setFitPaddingBottom(int b) { @@ -249,10 +244,12 @@ public abstract class Scene { } @SuppressWarnings("ConstantConditions") - protected void onDestroy(boolean willSave) { + protected void onDestroy() { // Make sure soft key broad is hidden - InputMethodManager imm = (InputMethodManager) getStageActivity().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(mSceneView.getWindowToken(), 0); + if (mSceneView != null) { + InputMethodManager imm = (InputMethodManager) getStageActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(mSceneView.getWindowToken(), 0); + } } protected void onOpen() { @@ -269,18 +266,9 @@ public abstract class Scene { getSceneView().setEnableTouch(true); } - protected void onSave(Map transferStop) { - transferStop.put("scene_id", mId); - transferStop.put("scene_announcer", mAnnouncer); - transferStop.put("scene_curtain", mCurtain); - } - - protected void onRestore(Map transferStop) { - mId = (Integer) transferStop.get("scene_id"); - mAnnouncer = (Announcer) transferStop.get("scene_announcer"); - mCurtain = (Curtain) transferStop.get("scene_curtain"); + protected void onRebirth(@Nullable Bundle savedInstanceState) { if (mCurtain != null) { - mCurtain.onReplace(); + mCurtain.onRebirth(); } } diff --git a/app/src/main/java/com/hippo/scene/SceneManager.java b/app/src/main/java/com/hippo/scene/SceneManager.java index 84d769580..158f4d4c1 100644 --- a/app/src/main/java/com/hippo/scene/SceneManager.java +++ b/app/src/main/java/com/hippo/scene/SceneManager.java @@ -24,9 +24,7 @@ import com.hippo.util.IntIdGenerator; import com.hippo.util.Log; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Stack; public class SceneManager { @@ -42,8 +40,6 @@ public class SceneManager { private List mSceneStateListenerList = new ArrayList<>(); - private Map mTransferStop = new HashMap<>(); - private static SceneManager sSceneManger; public static SceneManager getInstance() { @@ -105,6 +101,12 @@ public class SceneManager { } } + private void notifyRebirth(Class clazz) { + for (SceneStateListener l : mSceneStateListenerList) { + l.onRebirth(clazz); + } + } + Scene createSceneByClass(@NonNull Class sceneClass) { try { return (Scene) sceneClass.newInstance(); @@ -209,7 +211,7 @@ public class SceneManager { // It is the last scene, just finish the activity mSceneStack.remove(index); - scene.destroy(false); + scene.destroy(); scene.setState(Scene.SCENE_STATE_DESTROY); notifyDestroy(scene.getClass()); @@ -228,7 +230,7 @@ public class SceneManager { notifyResume(previousState.getClass()); } - scene.destroy(false); + scene.destroy(); scene.setState(Scene.SCENE_STATE_DESTROY); notifyDestroy(scene.getClass()); @@ -293,32 +295,12 @@ public class SceneManager { } protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { - Stack tempStack = new Stack<>(); - tempStack.addAll(mSceneStack); - mSceneStack.clear(); - - Map transferStop = mTransferStop; - for (Scene oldScene : tempStack) { - oldScene.destroy(true); - oldScene.setState(Scene.SCENE_STATE_DESTROY); - notifyDestroy(oldScene.getClass()); - - oldScene.save(transferStop); - - Scene newScene = createSceneByClass(oldScene.getClass()); - - newScene.restore(transferStop); - - newScene.create(savedInstanceState); - newScene.setState(Scene.SCENE_STATE_CREATE); - notifyCreate(newScene.getClass()); - - newScene.restoreInstanceState(savedInstanceState); - - newScene.setState(Scene.SCENE_STATE_RUN); - mSceneStack.push(newScene); - - transferStop.clear(); + for (Scene scene : mSceneStack) { + // Recreate + scene.rebirth(savedInstanceState); + notifyRebirth(scene.getClass()); + scene.create(savedInstanceState); + scene.restoreInstanceState(savedInstanceState); } } @@ -327,5 +309,6 @@ public class SceneManager { void onDestroy(Class clazz); void onPause(Class clazz); void onResume(Class clazz); + void onRebirth(Class clazz); } } diff --git a/app/src/main/java/com/hippo/scene/SimpleDialog.java b/app/src/main/java/com/hippo/scene/SimpleDialog.java index e96c1565f..b90714e40 100644 --- a/app/src/main/java/com/hippo/scene/SimpleDialog.java +++ b/app/src/main/java/com/hippo/scene/SimpleDialog.java @@ -28,7 +28,6 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.FrameLayout; -import android.widget.ListAdapter; import android.widget.ListView; import android.widget.ScrollView; import android.widget.Space; @@ -38,8 +37,6 @@ import com.hippo.effect.ripple.RippleSalon; import com.hippo.ehviewer.R; import com.hippo.util.ViewUtils; -import java.util.Map; - public class SimpleDialog extends SceneDialog implements View.OnClickListener, SceneDialogView.OnClickOutOfDialogListener, AdapterView.OnItemClickListener { @@ -106,28 +103,8 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, } @Override - protected void onSave(Map transferStop) { - super.onSave(transferStop); - - transferStop.put("builder", mBuilder); - } - - @Override - protected void onRestore(Map transferStop) { - super.onRestore(transferStop); - - mBuilder = (Builder) transferStop.get("builder"); - // Create new Adapter to avoid memory leak - if (mBuilder.mAdapter != null) { - mBuilder.mAdapter = new ArrayAdapter<>(getStageActivity(), - mBuilder.mItemLayoutResId, android.R.id.text1, - mBuilder.mItems); - } - } - - @Override - protected void onDestroy(boolean willSave) { - super.onDestroy(willSave); + protected void onDestroy() { + super.onDestroy(); OnCloseListener listener = mBuilder.mOnCloseListener; if (listener != null) { @@ -152,8 +129,9 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, mMessage.setText(mBuilder.mMessage); ViewUtils.setVisibility(mListView, View.GONE); ViewUtils.setVisibility(mCustom, View.GONE); - } else if (mBuilder.mAdapter != null) { - listView.setAdapter(mBuilder.mAdapter); + } else if (mBuilder.mItemLayoutResId != 0) { + listView.setAdapter(new ArrayAdapter<>(getStageActivity(), + mBuilder.mItemLayoutResId, android.R.id.text1, mBuilder.mItems)); listView.setOnItemClickListener(this); if (mBuilder.mIsSingleChoice) { listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); @@ -319,7 +297,6 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, private CharSequence[] mItems; private int mItemLayoutResId; - private ListAdapter mAdapter; private OnClickListener mOnListItemClickListener; protected int mCheckedItem; protected boolean mIsSingleChoice; @@ -362,8 +339,6 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, public Builder setItems(int itemsId, final OnClickListener listener) { mItems = mContext.getResources().getTextArray(itemsId); mItemLayoutResId = R.layout.select_dialog_item; - mAdapter = new ArrayAdapter<>(mContext, R.layout.select_dialog_item, - android.R.id.text1, mItems); mOnListItemClickListener = listener; mIsSingleChoice = false; return this; @@ -373,8 +348,6 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, final OnClickListener listener) { mItems = items; mItemLayoutResId = R.layout.select_dialog_item; - mAdapter = new ArrayAdapter<>(mContext, R.layout.select_dialog_item, - android.R.id.text1, items); mOnListItemClickListener = listener; mIsSingleChoice = false; return this; @@ -384,9 +357,6 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, final OnClickListener listener) { mItems = mContext.getResources().getTextArray(itemsId); mItemLayoutResId = R.layout.select_dialog_singlechoice; - mAdapter = new ArrayAdapter<>(mContext, - R.layout.select_dialog_singlechoice, android.R.id.text1, - mItems); mOnListItemClickListener = listener; mCheckedItem = checkedItem; mIsSingleChoice = true; @@ -397,8 +367,6 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener, int checkedItem, final OnClickListener listener) { mItems = items; mItemLayoutResId = R.layout.select_dialog_singlechoice; - mAdapter = new ArrayAdapter<>(mContext, - R.layout.select_dialog_singlechoice, android.R.id.text1, items); mOnListItemClickListener = listener; mCheckedItem = checkedItem; mIsSingleChoice = true; diff --git a/app/src/main/java/com/hippo/scene/SimpleDialogCurtain.java b/app/src/main/java/com/hippo/scene/SimpleDialogCurtain.java index e0a291589..d453eeb99 100644 --- a/app/src/main/java/com/hippo/scene/SimpleDialogCurtain.java +++ b/app/src/main/java/com/hippo/scene/SimpleDialogCurtain.java @@ -57,7 +57,7 @@ public class SimpleDialogCurtain extends Curtain { } @Override - protected void onReplace() { + protected void onRebirth() { mStartX = 0; mStartY = 0; }