diff options
Diffstat (limited to 'app/src/main/java/mygram/droid/FolderActivity.java')
| -rw-r--r-- | app/src/main/java/mygram/droid/FolderActivity.java | 82 |
1 files changed, 74 insertions, 8 deletions
diff --git a/app/src/main/java/mygram/droid/FolderActivity.java b/app/src/main/java/mygram/droid/FolderActivity.java index 10a9940..c7002c5 100644 --- a/app/src/main/java/mygram/droid/FolderActivity.java +++ b/app/src/main/java/mygram/droid/FolderActivity.java @@ -23,18 +23,27 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.Toast; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import java.util.Collections; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; -/** One folder as a grid, shuffled once per open. */ +/** One folder as a grid, paged in lazily in random page order. */ public final class FolderActivity extends Activity { private FrameLayout content; private RecyclerView grid; + private final List<Post> posts = new ArrayList<>(); + private final List<TileAdapter.Tile> tiles = new ArrayList<>(); + private Callable<List<Post>> more; + private boolean loading; static void open(Context c, Api.Folder f) { - c.startActivity(new Intent(c, FolderActivity.class).putExtra("slug", f.slug).putExtra("name", f.name)); + c.startActivity(new Intent(c, FolderActivity.class).putExtra("slug", f.slug).putExtra("name", f.name) + .putExtra("count", f.count)); } @Override @@ -49,19 +58,76 @@ public final class FolderActivity extends Activity { column.addView(content, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1)); setContentView(column); show(Ui.text(this, "Loading…", 18)); - Api.async(() -> Api.folderPosts(getIntent().getStringExtra("slug")), posts -> { - Collections.shuffle(posts); - grid = Ui.grid(this, Ui.postTiles(this, posts), Ui.POST_W, Ui.POST_H, 6); + more = Api.folderPages(getIntent().getStringExtra("slug"), getIntent().getIntExtra("count", 0)); + loading = true; + Api.async(more, page -> { + loading = false; + if (isDestroyed()) + return; + append(page); + if (page.isEmpty()) { + show(Ui.text(this, "Nothing to show", 18)); + return; + } + grid = Ui.grid(this, tiles, Ui.POST_W, Ui.POST_H, 6); + grid.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView rv, int dx, int dy) { + loadMore(); + } + }); show(grid); grid.post(grid::requestFocus); // after layout - }, e -> show(Ui.text(this, "Cannot load folder: " + e.getMessage(), 18))); + }, e -> { + loading = false; + show(Ui.text(this, "Cannot load folder: " + e.getMessage(), 18)); + }); + } + + /** Loads the next page when the last visible tile is within 12 of the end. */ + private void loadMore() { + if (more == null || loading || grid == null) + return; + if (((GridLayoutManager) grid.getLayoutManager()).findLastVisibleItemPosition() < tiles.size() - 12) + return; + loading = true; + Api.async(more, page -> { + loading = false; + if (isDestroyed()) + return; + if (page.isEmpty()) + more = null; + append(page); + }, e -> { + loading = false; + if (!isDestroyed()) + Toast.makeText(this, "Cannot load more: " + e.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + + /** Pages from one pager never overlap, so no id check is needed here. */ + private void append(List<Post> page) { + posts.addAll(page); + addTiles(); + } + + private void addTiles() { + int old = tiles.size(); + for (int i = old; i < posts.size(); i++) { + int start = i; + tiles.add(TileAdapter.post(posts.get(i), () -> Playlist.open(this, posts, start, more))); + } + if (grid != null && tiles.size() > old) + grid.getAdapter().notifyItemRangeInserted(old, tiles.size() - old); } @Override protected void onResume() { super.onResume(); - if (grid != null && grid.getAdapter() != null) + if (grid != null && grid.getAdapter() != null) { + addTiles(); // the viewer may have appended to the shared list grid.getAdapter().notifyItemRangeChanged(0, grid.getAdapter().getItemCount()); + } } private void show(android.view.View v) { |
