Save list position on pins

filtering
Floens 10 years ago
parent de59ff1a63
commit 71e9e7e16d
  1. 6
      Clover/app/src/main/java/org/floens/chan/core/loader/ChanLoader.java
  2. 4
      Clover/app/src/main/java/org/floens/chan/core/model/ChanThread.java
  3. 7
      Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java
  4. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/WatchSettingsController.java
  5. 13
      Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java

@ -41,7 +41,7 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class ChanLoader { public class ChanLoader {
private static final String TAG = "Loader"; private static final String TAG = "ChanLoader";
private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
private static final int[] watchTimeouts = {10, 15, 20, 30, 60, 90, 120, 180, 240, 300, 600, 1800, 3600}; private static final int[] watchTimeouts = {10, 15, 20, 30, 60, 90, 120, 180, 240, 300, 600, 1800, 3600};
@ -282,7 +282,7 @@ public class ChanLoader {
return; return;
if (thread == null) { if (thread == null) {
thread = new ChanThread(new ArrayList<Post>()); thread = new ChanThread(loadable, new ArrayList<Post>());
} }
if (loadable.isThreadMode() || loadable.isCatalogMode()) { if (loadable.isThreadMode() || loadable.isCatalogMode()) {
@ -344,7 +344,7 @@ public class ChanLoader {
if (destroyed) if (destroyed)
return; return;
Logger.e(TAG, "Error loading " + error.getMessage(), error); Logger.e(TAG, "Loading error", error);
// 404 with more pages already loaded means endofline // 404 with more pages already loaded means endofline
if ((error instanceof ServerError) && loadable.isBoardMode() && loadable.no > 0) { if ((error instanceof ServerError) && loadable.isBoardMode() && loadable.no > 0) {

@ -20,12 +20,14 @@ package org.floens.chan.core.model;
import java.util.List; import java.util.List;
public class ChanThread { public class ChanThread {
public Loadable loadable;
public List<Post> posts; public List<Post> posts;
public Post op; public Post op;
public boolean closed = false; public boolean closed = false;
public boolean archived = false; public boolean archived = false;
public ChanThread(List<Post> posts) { public ChanThread(Loadable loadable, List<Post> posts) {
this.loadable = loadable;
this.posts = posts; this.posts = posts;
} }
} }

@ -64,6 +64,13 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
} }
this.loadable = loadable; this.loadable = loadable;
Pin pin = ChanApplication.getWatchManager().findPinByLoadable(loadable);
if (pin != null) {
// Use the loadable from the pin.
// This way we can store the list position in the pin loadable,
// and not in a separate loadable instance.
loadable = pin.loadable;
}
chanLoader = LoaderPool.getInstance().obtain(loadable, this); chanLoader = LoaderPool.getInstance().obtain(loadable, this);
} }
} }

@ -84,7 +84,7 @@ public class WatchSettingsController extends SettingsController implements Compo
private void populatePreferences() { private void populatePreferences() {
SettingsGroup settings = new SettingsGroup(string(R.string.settings_group_watch)); SettingsGroup settings = new SettingsGroup(string(R.string.settings_group_watch));
settings.add(new BooleanSettingView(this, ChanSettings.watchCountdown, string(R.string.setting_watch_countdown), string(R.string.setting_watch_countdown_description))); // settings.add(new BooleanSettingView(this, ChanSettings.watchCountdown, string(R.string.setting_watch_countdown), string(R.string.setting_watch_countdown_description)));
enableBackground = settings.add(new BooleanSettingView(this, ChanSettings.watchBackground, string(R.string.setting_watch_enable_background), string(R.string.setting_watch_enable_background_description))); enableBackground = settings.add(new BooleanSettingView(this, ChanSettings.watchBackground, string(R.string.setting_watch_enable_background), string(R.string.setting_watch_enable_background_description)));
int[] timeouts = new int[]{1, 2, 3, 5, 10, 30, 60}; int[] timeouts = new int[]{1, 2, 3, 5, 10, 30, 60};

@ -18,6 +18,7 @@
package org.floens.chan.ui.layout; package org.floens.chan.ui.layout;
import android.content.Context; import android.content.Context;
import android.os.Parcelable;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet; import android.util.AttributeSet;
@ -35,6 +36,7 @@ import org.floens.chan.ui.view.PostView;
import org.floens.chan.ui.view.ThumbnailView; import org.floens.chan.ui.view.ThumbnailView;
import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.AndroidUtils;
import org.floens.chan.utils.AnimationUtils; import org.floens.chan.utils.AnimationUtils;
import org.floens.chan.utils.Logger;
import java.util.List; import java.util.List;
@ -46,9 +48,11 @@ import static org.floens.chan.utils.AndroidUtils.ROBOTO_MEDIUM;
public class ThreadListLayout extends LinearLayout { public class ThreadListLayout extends LinearLayout {
private TextView searchStatus; private TextView searchStatus;
private RecyclerView recyclerView; private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
private PostAdapter postAdapter; private PostAdapter postAdapter;
private PostAdapter.PostAdapterCallback postAdapterCallback; private PostAdapter.PostAdapterCallback postAdapterCallback;
private PostView.PostViewCallback postViewCallback; private PostView.PostViewCallback postViewCallback;
private ChanThread showingThread;
public ThreadListLayout(Context context, AttributeSet attrs) { public ThreadListLayout(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@ -62,8 +66,8 @@ public class ThreadListLayout extends LinearLayout {
searchStatus.setTypeface(ROBOTO_MEDIUM); searchStatus.setTypeface(ROBOTO_MEDIUM);
recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
LinearLayoutManager lm = new LinearLayoutManager(getContext()); linearLayoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(lm); recyclerView.setLayoutManager(linearLayoutManager);
} }
public void setCallbacks(PostAdapter.PostAdapterCallback postAdapterCallback, PostView.PostViewCallback postViewCallback, ThreadStatusCell.Callback statusCellCallback) { public void setCallbacks(PostAdapter.PostAdapterCallback postAdapterCallback, PostView.PostViewCallback postViewCallback, ThreadStatusCell.Callback statusCellCallback) {
@ -74,13 +78,15 @@ public class ThreadListLayout extends LinearLayout {
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override @Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
showingThread.loadable.listViewIndex = Math.max(0, linearLayoutManager.findFirstVisibleItemPosition());
} }
}); });
} }
public void showPosts(ChanThread thread, boolean initial) { public void showPosts(ChanThread thread, boolean initial) {
showingThread = thread;
if (initial) { if (initial) {
recyclerView.scrollToPosition(0); linearLayoutManager.scrollToPositionWithOffset(thread.loadable.listViewIndex, 0);
} }
postAdapter.setThread(thread); postAdapter.setThread(thread);
} }
@ -122,6 +128,7 @@ public class ThreadListLayout extends LinearLayout {
public void cleanup() { public void cleanup() {
postAdapter.cleanup(); postAdapter.cleanup();
showingThread = null;
} }
public ThumbnailView getThumbnail(PostImage postImage) { public ThumbnailView getThumbnail(PostImage postImage) {

Loading…
Cancel
Save