Add board ordering

filtering
Floens 10 years ago
parent 2446f44ade
commit 57f3cbefcd
  1. 43
      Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java
  2. 6
      Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java
  3. 48
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java
  4. 19
      Clover/app/src/main/java/org/floens/chan/ui/cell/PostCellInterface.java
  5. 61
      Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java
  6. 6
      Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java
  7. 5
      Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java
  8. 7
      Clover/app/src/main/res/values/strings.xml

@ -75,6 +75,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
private Loadable loadable;
private ChanLoader chanLoader;
private boolean searchOpen = false;
private Order order = Order.BUMP;
public ThreadPresenter(ThreadPresenterCallback threadPresenterCallback) {
this.threadPresenterCallback = threadPresenterCallback;
@ -108,6 +109,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
LoaderPool.getInstance().release(chanLoader, this);
chanLoader = null;
loadable = null;
order = Order.BUMP;
threadPresenterCallback.showLoading();
}
@ -163,6 +165,19 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
}
}
public void setOrder(Order order) {
if (this.order != order) {
this.order = order;
if (chanLoader != null) {
ChanThread thread = chanLoader.getThread();
if (thread != null) {
threadPresenterCallback.scrollTo(0, false);
threadPresenterCallback.showPosts(thread, order);
}
}
}
}
@Override
public Loadable getLoadable() {
return loadable;
@ -182,7 +197,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
}
chanLoader.setAutoLoadMore(isWatching());
threadPresenterCallback.showPosts(result);
threadPresenterCallback.showPosts(result, order);
if (loadable.markedNo >= 0) {
Post markedPost = findPostById(loadable.markedNo);
@ -192,7 +207,6 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
}
loadable.markedNo = -1;
}
}
@Override
@ -535,8 +549,31 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
threadPresenterCallback.filterList(originalQuery, filtered, false, false, false);
}
public enum Order {
BUMP("bump"),
REPLY("reply"),
IMAGE("image"),
NEWEST("newest"),
OLDEST("oldest");
public String name;
Order(String storeName) {
this.name = storeName;
}
public static Order find(String name) {
for (Order mode : Order.values()) {
if (mode.name.equals(name)) {
return mode;
}
}
return null;
}
}
public interface ThreadPresenterCallback {
void showPosts(ChanThread thread);
void showPosts(ChanThread thread, Order order);
void postClicked(Post post);

@ -23,6 +23,8 @@ import android.os.Environment;
import org.floens.chan.Chan;
import org.floens.chan.R;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.presenter.ThreadPresenter;
import org.floens.chan.ui.cell.PostCellInterface;
import org.floens.chan.utils.AndroidUtils;
import java.io.File;
@ -37,6 +39,7 @@ public class ChanSettings {
public static final BooleanSetting videoOpenExternal;
public static final BooleanSetting videoErrorIgnore;
public static final StringSetting boardViewMode;
public static final StringSetting boardOrder;
public static final StringSetting postDefaultName;
public static final BooleanSetting postPinThread;
@ -79,7 +82,8 @@ public class ChanSettings {
videoAutoLoad = new BooleanSetting(p, "preference_autoplay", false);
videoOpenExternal = new BooleanSetting(p, "preference_video_external", false);
videoErrorIgnore = new BooleanSetting(p, "preference_video_error_ignore", false);
boardViewMode = new StringSetting(p, "preference_board_view_mode", "list"); // "list" or "grid"
boardViewMode = new StringSetting(p, "preference_board_view_mode", PostCellInterface.PostViewMode.LIST.name); // "list" or "grid"
boardOrder = new StringSetting(p, "preference_board_order", ThreadPresenter.Order.BUMP.name);
postDefaultName = new StringSetting(p, "preference_default_name", "");
postPinThread = new BooleanSetting(p, "preference_pin_on_post", false);

@ -26,21 +26,25 @@ import org.floens.chan.R;
import org.floens.chan.core.model.ChanThread;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.presenter.ThreadPresenter;
import org.floens.chan.ui.cell.PostCellInterface;
import org.floens.chan.ui.cell.ThreadStatusCell;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_POST = 0;
private static final int TYPE_STATUS = 1;
private final PostAdapterCallback postAdapterCallback;
private final PostCellInterface.PostCellCallback postCellCallback;
private final ThreadStatusCell.Callback statusCellCallback;
private RecyclerView recyclerView;
private final ThreadStatusCell.Callback statusCellCallback;
private final List<Post> sourceList = new ArrayList<>();
private final List<Post> displayList = new ArrayList<>();
private int lastPostCount = 0;
@ -49,6 +53,7 @@ public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private String highlightedPostId;
private int highlightedPostNo = -1;
private boolean filtering = false;
private PostCellInterface.PostViewMode postViewMode;
public PostAdapter(RecyclerView recyclerView, PostAdapterCallback postAdapterCallback, PostCellInterface.PostCellCallback postCellCallback, ThreadStatusCell.Callback statusCellCallback) {
@ -127,10 +132,11 @@ public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
}
}
public void setThread(ChanThread thread) {
public void setThread(ChanThread thread, ThreadPresenter.Order order) {
showError(null);
sourceList.clear();
sourceList.addAll(thread.posts);
orderPosts(sourceList, order);
if (!filtering) {
displayList.clear();
@ -210,6 +216,10 @@ public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
notifyDataSetChanged();
}
public void setPostViewMode(PostCellInterface.PostViewMode postViewMode) {
this.postViewMode = postViewMode;
}
private void onScrolledToBottom() {
if (!filtering && lastPostCount != sourceList.size()) {
lastPostCount = sourceList.size();
@ -221,8 +231,38 @@ public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
return postAdapterCallback.getLoadable().isThreadMode();
}
public void setPostViewMode(PostCellInterface.PostViewMode postViewMode) {
this.postViewMode = postViewMode;
private void orderPosts(List<Post> posts, ThreadPresenter.Order order) {
if (order != ThreadPresenter.Order.BUMP) {
if (order == ThreadPresenter.Order.IMAGE) {
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return rhs.images - lhs.images;
}
});
} else if (order == ThreadPresenter.Order.REPLY) {
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return rhs.replies - lhs.replies;
}
});
} else if (order == ThreadPresenter.Order.NEWEST) {
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return (int) (rhs.time - lhs.time);
}
});
} else if (order == ThreadPresenter.Order.OLDEST) {
Collections.sort(posts, new Comparator<Post>() {
@Override
public int compare(Post lhs, Post rhs) {
return (int) (lhs.time - rhs.time);
}
});
}
}
}
public static class PostViewHolder extends RecyclerView.ViewHolder {

@ -34,8 +34,23 @@ public interface PostCellInterface {
ThumbnailView getThumbnailView();
enum PostViewMode {
LIST,
CARD
LIST("list"),
CARD("grid");
public String name;
PostViewMode(String name) {
this.name = name;
}
public static PostViewMode find(String name) {
for (PostViewMode mode : PostViewMode.values()) {
if (mode.name.equals(name)) {
return mode;
}
}
return null;
}
}
interface PostCellCallback {

@ -32,6 +32,7 @@ import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
import org.floens.chan.core.presenter.ThreadPresenter;
import org.floens.chan.core.settings.ChanSettings;
import org.floens.chan.ui.cell.PostCellInterface;
import org.floens.chan.ui.layout.ThreadLayout;
@ -49,10 +50,14 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
private static final int SEARCH_ID = 101;
private static final int SHARE_ID = 102;
private static final int VIEW_MODE_ID = 103;
private static final int ORDER_ID = 104;
private PostCellInterface.PostViewMode postViewMode;
private ThreadPresenter.Order order;
private List<FloatingMenuItem> boardItems;
private FloatingMenuItem viewModeMenuItem;
private ToolbarMenuItem overflow;
public BrowseController(Context context) {
super(context);
@ -62,8 +67,10 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
public void onCreate() {
super.onCreate();
postViewMode = ChanSettings.boardViewMode.get().equals("list") ? PostCellInterface.PostViewMode.LIST : PostCellInterface.PostViewMode.CARD;
postViewMode = PostCellInterface.PostViewMode.find(ChanSettings.boardViewMode.get());
order = ThreadPresenter.Order.find(ChanSettings.boardOrder.get());
threadLayout.setPostViewMode(postViewMode);
threadLayout.getPresenter().setOrder(order);
navigationItem.hasDrawer = true;
navigationItem.middleMenu = new FloatingMenu(context);
@ -76,7 +83,7 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
menu.addItem(new ToolbarMenuItem(context, this, REFRESH_ID, R.drawable.ic_refresh_white_24dp));
ToolbarMenuItem overflow = menu.createOverflow(this);
overflow = menu.createOverflow(this);
List<FloatingMenuItem> items = new ArrayList<>();
items.add(new FloatingMenuItem(SEARCH_ID, context.getString(R.string.action_search)));
@ -84,6 +91,7 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
viewModeMenuItem = new FloatingMenuItem(VIEW_MODE_ID, context.getString(
postViewMode == PostCellInterface.PostViewMode.LIST ? R.string.action_switch_catalog : R.string.action_switch_board));
items.add(viewModeMenuItem);
items.add(new FloatingMenuItem(ORDER_ID, context.getString(R.string.action_order)));
overflow.setSubMenu(new FloatingMenu(context, overflow.getView(), items));
}
@ -114,13 +122,60 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
postViewMode = PostCellInterface.PostViewMode.LIST;
}
ChanSettings.boardViewMode.set(postViewMode == PostCellInterface.PostViewMode.LIST ? "list" : "grid");
ChanSettings.boardViewMode.set(postViewMode.name);
viewModeMenuItem.setText(context.getString(
postViewMode == PostCellInterface.PostViewMode.LIST ? R.string.action_switch_catalog : R.string.action_switch_board));
threadLayout.setPostViewMode(postViewMode);
break;
case ORDER_ID:
List<FloatingMenuItem> items = new ArrayList<>();
for (ThreadPresenter.Order order : ThreadPresenter.Order.values()) {
int nameId = 0;
switch (order) {
case BUMP:
nameId = R.string.order_bump;
break;
case REPLY:
nameId = R.string.order_reply;
break;
case IMAGE:
nameId = R.string.order_image;
break;
case NEWEST:
nameId = R.string.order_newest;
break;
case OLDEST:
nameId = R.string.order_oldest;
break;
}
String name = string(nameId);
if (order == this.order) {
name = "\u2713 " + name; // Checkmark
}
items.add(new FloatingMenuItem(order, name));
}
FloatingMenu menu = new FloatingMenu(context, overflow.getView(), items);
menu.setCallback(new FloatingMenu.FloatingMenuCallback() {
@Override
public void onFloatingMenuItemClicked(FloatingMenu menu, FloatingMenuItem item) {
ThreadPresenter.Order order = (ThreadPresenter.Order) item.getId();
ChanSettings.boardOrder.set(order.name);
BrowseController.this.order = order;
threadLayout.getPresenter().setOrder(order);
}
@Override
public void onFloatingMenuDismissed(FloatingMenu menu) {
}
});
menu.show();
break;
}
}

@ -89,7 +89,6 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T
private ProgressDialog deletingDialog;
private boolean refreshedFromSwipe;
private boolean showingReplyButton = false;
private PostCellInterface.PostViewMode postViewMode;
public ThreadLayout(Context context) {
super(context);
@ -162,7 +161,6 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T
}
public void setPostViewMode(PostCellInterface.PostViewMode postViewMode) {
this.postViewMode = postViewMode;
threadListLayout.setPostViewMode(postViewMode);
}
@ -172,8 +170,8 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T
}
@Override
public void showPosts(ChanThread thread) {
threadListLayout.showPosts(thread, visible != Visible.THREAD);
public void showPosts(ChanThread thread, ThreadPresenter.Order order) {
threadListLayout.showPosts(thread, order, visible != Visible.THREAD);
switchVisible(Visible.THREAD);
callback.onShowPosts();
}

@ -32,6 +32,7 @@ import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.model.PostImage;
import org.floens.chan.core.presenter.ReplyPresenter;
import org.floens.chan.core.presenter.ThreadPresenter;
import org.floens.chan.ui.adapter.PostAdapter;
import org.floens.chan.ui.cell.PostCell;
import org.floens.chan.ui.cell.PostCellInterface;
@ -163,7 +164,7 @@ public class ThreadListLayout extends LinearLayout implements ReplyLayout.ReplyL
}
}
public void showPosts(ChanThread thread, boolean initial) {
public void showPosts(ChanThread thread, ThreadPresenter.Order order, boolean initial) {
showingThread = thread;
if (initial) {
reply.bindLoadable(showingThread.loadable);
@ -194,7 +195,7 @@ public class ThreadListLayout extends LinearLayout implements ReplyLayout.ReplyL
}
}
postAdapter.setThread(thread);
postAdapter.setThread(thread, order);
}
public boolean onBack() {

@ -60,6 +60,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<string name="action_switch_board">Board mode</string>
<string name="action_up">Up</string>
<string name="action_down">Down</string>
<string name="action_order">Order</string>
<string name="order_bump">Bump order</string>
<string name="order_reply">Reply count</string>
<string name="order_image">Image count</string>
<string name="order_newest">Newest</string>
<string name="order_oldest">Oldest</string>
<string name="search_hint">Search</string>
<string name="search_results">Found %1$s for "%2$s"</string>

Loading…
Cancel
Save