browse: add last modified filter.

Closes #251
master
Floens 7 years ago
parent 099465239a
commit a093b9dfbd
  1. 38
      Clover/app/src/main/java/org/floens/chan/core/model/Post.java
  2. 4
      Clover/app/src/main/java/org/floens/chan/core/site/common/FutabaChanReader.java
  3. 4
      Clover/app/src/main/java/org/floens/chan/core/site/common/vichan/VichanApi.java
  4. 1
      Clover/app/src/main/java/org/floens/chan/core/site/loader/ChanThreadLoader.java
  5. 41
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PostsFilter.java
  6. 3
      Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java
  7. 1
      Clover/app/src/main/res/values/strings.xml

@ -28,8 +28,6 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import okhttp3.HttpUrl;
/** /**
* Contains all data needed to represent a single post.<br> * Contains all data needed to represent a single post.<br>
* All {@code final} fields are thread-safe. * All {@code final} fields are thread-safe.
@ -99,12 +97,13 @@ public class Post {
public final List<Integer> repliesFrom = new ArrayList<>(); public final List<Integer> repliesFrom = new ArrayList<>();
// These members may only mutate on the main thread. // These members may only mutate on the main thread.
private boolean sticky = false; private boolean sticky;
private boolean closed = false; private boolean closed;
private boolean archived = false; private boolean archived;
private int replies = -1; private int replies;
private int imagesCount = -1; private int imagesCount;
private int uniqueIps = -1; private int uniqueIps;
private long lastModified;
private String title = ""; private String title = "";
private Post(Builder builder) { private Post(Builder builder) {
@ -116,6 +115,7 @@ public class Post {
replies = builder.replies; replies = builder.replies;
imagesCount = builder.imagesCount; imagesCount = builder.imagesCount;
uniqueIps = builder.uniqueIps; uniqueIps = builder.uniqueIps;
lastModified = builder.lastModified;
sticky = builder.sticky; sticky = builder.sticky;
closed = builder.closed; closed = builder.closed;
archived = builder.archived; archived = builder.archived;
@ -214,6 +214,16 @@ public class Post {
this.uniqueIps = uniqueIps; this.uniqueIps = uniqueIps;
} }
@MainThread
public long getLastModified() {
return lastModified;
}
@MainThread
public void setLastModified(long lastModified) {
this.lastModified = lastModified;
}
@MainThread @MainThread
public String getTitle() { public String getTitle() {
return title; return title;
@ -246,19 +256,16 @@ public class Post {
public boolean sticky; public boolean sticky;
public boolean closed; public boolean closed;
public boolean archived; public boolean archived;
public long lastModified = -1L;
public String subject = ""; public String subject = "";
public String name = ""; public String name = "";
public CharSequence comment = ""; public CharSequence comment = "";
public String tripcode = ""; public String tripcode = "";
public long unixTimestampSeconds = -1; public long unixTimestampSeconds = -1L;
public List<PostImage> images; public List<PostImage> images;
public String countryCode;
public String countryName;
public HttpUrl countryUrl;
public List<PostHttpIcon> httpIcons; public List<PostHttpIcon> httpIcons;
public String posterId = ""; public String posterId = "";
@ -324,6 +331,11 @@ public class Post {
return this; return this;
} }
public Builder lastModified(long lastModified) {
this.lastModified = lastModified;
return this;
}
public Builder closed(boolean closed) { public Builder closed(boolean closed) {
this.closed = closed; this.closed = closed;
return this; return this;

@ -193,6 +193,9 @@ public class FutabaChanReader implements ChanReader {
case "unique_ips": case "unique_ips":
builder.uniqueIps(reader.nextInt()); builder.uniqueIps(reader.nextInt());
break; break;
case "last_modified":
builder.lastModified(reader.nextLong());
break;
case "id": case "id":
builder.posterId(reader.nextString()); builder.posterId(reader.nextString());
break; break;
@ -253,6 +256,7 @@ public class FutabaChanReader implements ChanReader {
op.replies(builder.replies); op.replies(builder.replies);
op.images(builder.imagesCount); op.images(builder.imagesCount);
op.uniqueIps(builder.uniqueIps); op.uniqueIps(builder.uniqueIps);
op.lastModified(builder.lastModified);
queue.setOp(op); queue.setOp(op);
} }

@ -171,6 +171,9 @@ public class VichanApi extends CommonSite.CommonApi {
case "unique_ips": case "unique_ips":
builder.uniqueIps(reader.nextInt()); builder.uniqueIps(reader.nextInt());
break; break;
case "last_modified":
builder.lastModified(reader.nextLong());
break;
case "id": case "id":
builder.posterId(reader.nextString()); builder.posterId(reader.nextString());
break; break;
@ -228,6 +231,7 @@ public class VichanApi extends CommonSite.CommonApi {
op.replies(builder.replies); op.replies(builder.replies);
op.images(builder.imagesCount); op.images(builder.imagesCount);
op.uniqueIps(builder.uniqueIps); op.uniqueIps(builder.uniqueIps);
op.lastModified(builder.lastModified);
queue.setOp(op); queue.setOp(op);
} }

@ -310,6 +310,7 @@ public class ChanThreadLoader implements Response.ErrorListener, Response.Listen
realOp.setReplies(fakeOp.replies); realOp.setReplies(fakeOp.replies);
realOp.setImagesCount(fakeOp.imagesCount); realOp.setImagesCount(fakeOp.imagesCount);
realOp.setUniqueIps(fakeOp.uniqueIps); realOp.setUniqueIps(fakeOp.uniqueIps);
realOp.setLastModified(fakeOp.lastModified);
} else { } else {
Logger.e(TAG, "Thread has no op!"); Logger.e(TAG, "Thread has no op!");
} }

@ -35,33 +35,20 @@ import javax.inject.Inject;
import static org.floens.chan.Chan.inject; import static org.floens.chan.Chan.inject;
public class PostsFilter { public class PostsFilter {
public static final Comparator<Post> IMAGE_COMPARATOR = new Comparator<Post>() { private static final Comparator<Post> IMAGE_COMPARATOR =
@Override (lhs, rhs) -> rhs.getImagesCount() - lhs.getImagesCount();
public int compare(Post lhs, Post rhs) {
return rhs.getImagesCount() - lhs.getImagesCount();
}
};
public static final Comparator<Post> REPLY_COMPARATOR = new Comparator<Post>() { private static final Comparator<Post> REPLY_COMPARATOR =
@Override (lhs, rhs) -> rhs.getReplies() - lhs.getReplies();
public int compare(Post lhs, Post rhs) {
return rhs.getReplies() - lhs.getReplies();
}
};
public static final Comparator<Post> NEWEST_COMPARATOR = new Comparator<Post>() { private static final Comparator<Post> NEWEST_COMPARATOR =
@Override (lhs, rhs) -> (int) (rhs.time - lhs.time);
public int compare(Post lhs, Post rhs) {
return (int) (rhs.time - lhs.time);
}
};
public static final Comparator<Post> OLDEST_COMPARATOR = new Comparator<Post>() { private static final Comparator<Post> OLDEST_COMPARATOR =
@Override (lhs, rhs) -> (int) (lhs.time - rhs.time);
public int compare(Post lhs, Post rhs) {
return (int) (lhs.time - rhs.time); private static final Comparator<Post> MODIFIED_COMPARATOR =
} (lhs, rhs) -> (int) (rhs.getLastModified() - lhs.getLastModified());
};
@Inject @Inject
DatabaseManager databaseManager; DatabaseManager databaseManager;
@ -99,6 +86,9 @@ public class PostsFilter {
case OLDEST: case OLDEST:
Collections.sort(posts, OLDEST_COMPARATOR); Collections.sort(posts, OLDEST_COMPARATOR);
break; break;
case MODIFIED:
Collections.sort(posts, MODIFIED_COMPARATOR);
break;
} }
} }
@ -149,7 +139,8 @@ public class PostsFilter {
REPLY("reply"), REPLY("reply"),
IMAGE("image"), IMAGE("image"),
NEWEST("newest"), NEWEST("newest"),
OLDEST("oldest"); OLDEST("oldest"),
MODIFIED("modified");
public String name; public String name;

@ -290,6 +290,9 @@ public class BrowseController extends ThreadController implements
case OLDEST: case OLDEST:
nameId = R.string.order_oldest; nameId = R.string.order_oldest;
break; break;
case MODIFIED:
nameId = R.string.order_modified;
break;
} }
String name = getString(nameId); String name = getString(nameId);

@ -116,6 +116,7 @@ Re-enable this permission in the app settings if you permanently disabled it."</
<string name="order_image">Image count</string> <string name="order_image">Image count</string>
<string name="order_newest">Newest</string> <string name="order_newest">Newest</string>
<string name="order_oldest">Oldest</string> <string name="order_oldest">Oldest</string>
<string name="order_modified">Latest reply</string>
<string name="search_hint">Search</string> <string name="search_hint">Search</string>
<string name="search_results">Found %1$d %2$s for "%3$s"</string> <string name="search_results">Found %1$d %2$s for "%3$s"</string>

Loading…
Cancel
Save