diff --git a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java index 2a8fc693..912ae9ec 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java @@ -145,6 +145,13 @@ public abstract class NavigationController extends Controller implements Control } } + /* + * Used to save instance state + */ + public List getControllerList() { + return controllerList; + } + @Override public void onControllerTransitionCompleted(ControllerTransition transition) { ControllerLogic.finishTransition(transition); diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java b/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java index ab781058..4c0f4bd0 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java @@ -19,6 +19,7 @@ package org.floens.chan.core.model; import android.content.Context; import android.os.Bundle; +import android.os.Parcel; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; @@ -133,6 +134,24 @@ public class Loadable { bundle.putInt(p + "." + tag + ".listViewTop", listViewTop); } + public void writeToParcel(Parcel parcel) { + parcel.writeInt(mode); + parcel.writeString(board); + parcel.writeInt(no); + parcel.writeString(title); + parcel.writeInt(listViewIndex); + parcel.writeInt(listViewTop); + } + + public void readFromParcel(Parcel parcel) { + mode = parcel.readInt(); + board = parcel.readString(); + no = parcel.readInt(); + title = parcel.readString(); + listViewIndex = parcel.readInt(); + listViewTop = parcel.readInt(); + } + public Loadable copy() { Loadable copy = new Loadable(); copy.mode = mode; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java index 4351249f..4b51d18a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java @@ -33,6 +33,9 @@ import org.floens.chan.core.model.Loadable; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.controller.BrowseController; import org.floens.chan.ui.controller.RootNavigationController; +import org.floens.chan.ui.controller.ViewThreadController; +import org.floens.chan.ui.state.ChanState; +import org.floens.chan.utils.Logger; import org.floens.chan.utils.ThemeHelper; import java.util.ArrayList; @@ -41,9 +44,14 @@ import java.util.List; public class StartActivity extends AppCompatActivity { private static final String TAG = "StartActivity"; + private static final String STATE_KEY = "chan_state"; + private ViewGroup contentView; private List stack = new ArrayList<>(); + private RootNavigationController rootNavigationController; + private BrowseController browseController; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -53,13 +61,13 @@ public class StartActivity extends AppCompatActivity { contentView = (ViewGroup) findViewById(android.R.id.content); - RootNavigationController rootNavigationController = new RootNavigationController(this); + rootNavigationController = new RootNavigationController(this); rootNavigationController.onCreate(); setContentView(rootNavigationController.view); addController(rootNavigationController); - BrowseController browseController = new BrowseController(this); + browseController = new BrowseController(this); rootNavigationController.pushController(browseController, false); rootNavigationController.onShow(); @@ -71,7 +79,18 @@ public class StartActivity extends AppCompatActivity { // Startup from background or url boolean loadDefault = true; if (savedInstanceState != null) { - // blah + ChanState chanState = savedInstanceState.getParcelable(STATE_KEY); + if (chanState == null) { + Logger.w(TAG, "savedInstanceState was not null, but no ChanState was found!"); + } else { + loadDefault = false; + Board board = Chan.getBoardManager().getBoardByValue(chanState.board.board); + browseController.loadBoard(board); + + if (chanState.thread.mode == Loadable.Mode.THREAD) { + browseController.showThread(chanState.thread, false); + } + } } else if (getIntent().getData() != null) { Loadable fromUri = ChanHelper.getLoadableFromStartUri(getIntent().getData()); if (fromUri != null) { @@ -80,17 +99,42 @@ public class StartActivity extends AppCompatActivity { browseController.loadBoard(board); if (fromUri.isThreadMode()) { - browseController.showThread(fromUri); + browseController.showThread(fromUri, false); } } } if (loadDefault) { - // start default browseController.loadBoard(Chan.getBoardManager().getSavedBoards().get(0)); } } + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + Loadable board = browseController.getLoadable(); + if (board == null) { + Logger.w(TAG, "Can not save instance state, the board loadable is null"); + } else { + Loadable thread = null; + List controllers = rootNavigationController.getControllerList(); + for (Controller controller : controllers) { + if (controller instanceof ViewThreadController) { + thread = ((ViewThreadController) controller).getLoadable(); + break; + } + } + + if (thread == null) { + // Make the parcel happy + thread = new Loadable(); + } + + outState.putParcelable(STATE_KEY, new ChanState(board, thread)); + } + } + public void addController(Controller controller) { stack.add(controller); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java index 1a8e9e18..3fc3672a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java @@ -129,9 +129,13 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte @Override public void showThread(Loadable threadLoadable) { + showThread(threadLoadable, true); + } + + public void showThread(Loadable threadLoadable, boolean animated) { ViewThreadController viewThreadController = new ViewThreadController(context); viewThreadController.setLoadable(threadLoadable); - navigationController.pushController(viewThreadController); + navigationController.pushController(viewThreadController, animated); } public void onEvent(BoardManager.BoardsChangedMessage event) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java index 245c8662..688eb945 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java @@ -57,6 +57,13 @@ public abstract class ThreadController extends Controller implements ThreadLayou EventBus.getDefault().unregister(this); } + /* + * Used to save instance state + */ + public Loadable getLoadable() { + return threadLayout.getPresenter().getLoadable(); + } + @Override public boolean onBack() { return threadLayout.onBack(); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java b/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java new file mode 100644 index 00000000..ee2f412a --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java @@ -0,0 +1,46 @@ +package org.floens.chan.ui.state; + +import android.os.Parcel; +import android.os.Parcelable; + +import org.floens.chan.core.model.Loadable; + +public class ChanState implements Parcelable { + public Loadable board; + public Loadable thread; + + public ChanState(Loadable board, Loadable thread) { + this.board = board; + this.thread = thread; + } + + public ChanState(Parcel parcel) { + board = new Loadable(); + board.readFromParcel(parcel); + thread = new Loadable(); + thread.readFromParcel(parcel); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + board.writeToParcel(dest); + thread.writeToParcel(dest); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public ChanState createFromParcel(Parcel source) { + return new ChanState(source); + } + + @Override + public ChanState[] newArray(int size) { + return new ChanState[size]; + } + }; +}