Save board/thread state.

filtering
Floens 10 years ago
parent 507b4dbc11
commit e8b8f930b7
  1. 7
      Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java
  2. 19
      Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java
  3. 54
      Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java
  4. 6
      Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java
  5. 7
      Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java
  6. 46
      Clover/app/src/main/java/org/floens/chan/ui/state/ChanState.java

@ -145,6 +145,13 @@ public abstract class NavigationController extends Controller implements Control
}
}
/*
* Used to save instance state
*/
public List<Controller> getControllerList() {
return controllerList;
}
@Override
public void onControllerTransitionCompleted(ControllerTransition transition) {
ControllerLogic.finishTransition(transition);

@ -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;

@ -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<Controller> 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<Controller> 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);
}

@ -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) {

@ -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();

@ -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<ChanState> CREATOR = new Parcelable.Creator<ChanState>() {
@Override
public ChanState createFromParcel(Parcel source) {
return new ChanState(source);
}
@Override
public ChanState[] newArray(int size) {
return new ChanState[size];
}
};
}
Loading…
Cancel
Save