Loading app/src/main/java/app/fedilab/android/client/entities/api/Status.java +6 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ public class Status implements Serializable, Cloneable { public boolean isExpended = false; public boolean isTruncated = true; public boolean isFetchMore = false; public PositionFetchMore positionFetchMore = PositionFetchMore.BOTTOM; public boolean isMediaDisplayed = false; public boolean isMediaObfuscated = true; public boolean isChecked = false; Loading @@ -108,6 +109,11 @@ public class Status implements Serializable, Cloneable { public transient int cursorPosition = 0; public transient boolean submitted = false; public enum PositionFetchMore { TOP, BOTTOM } @Override public boolean equals(@Nullable Object obj) { boolean same = false; Loading app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +29 −18 Original line number Diff line number Diff line Loading @@ -113,7 +113,6 @@ import app.fedilab.android.client.entities.app.Account; import app.fedilab.android.client.entities.app.StatusCache; import app.fedilab.android.client.entities.app.StatusDraft; import app.fedilab.android.client.entities.app.Timeline; import app.fedilab.android.databinding.DrawerFetchMoreBinding; import app.fedilab.android.databinding.DrawerStatusArtBinding; import app.fedilab.android.databinding.DrawerStatusBinding; import app.fedilab.android.databinding.DrawerStatusHiddenBinding; Loading Loading @@ -1862,7 +1861,6 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } }); //For reports if (holder.bindingReport != null) { holder.bindingReport.checkbox.setChecked(status.isChecked); holder.bindingReport.checkbox.setOnClickListener(v -> status.isChecked = !status.isChecked); Loading @@ -1873,7 +1871,14 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> holder.binding.layoutFetchMore.fetchMoreMin.setOnClickListener(v -> { status.isFetchMore = false; adapter.notifyItemChanged(holder.getBindingAdapterPosition()); fetchMoreCallBack.onClickMinId(status.id); if (holder.getBindingAdapterPosition() < statusList.size() - 1) { String fromId; if (status.positionFetchMore == Status.PositionFetchMore.TOP) { fromId = statusList.get(holder.getBindingAdapterPosition() + 1).id; } else { fromId = status.id; } fetchMoreCallBack.onClickMinId(fromId); if (!remote) { new Thread(() -> { StatusCache statusCache = new StatusCache(); Loading @@ -1888,10 +1893,18 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } }).start(); } } }); holder.binding.layoutFetchMore.fetchMoreMax.setOnClickListener(v -> { //We hide the button status.isFetchMore = false; String fromId; if (status.positionFetchMore == Status.PositionFetchMore.TOP) { fromId = statusList.get(holder.getBindingAdapterPosition()).id; } else { fromId = statusList.get(holder.getBindingAdapterPosition() - 1).id; } fetchMoreCallBack.onClickMaxId(fromId); adapter.notifyItemChanged(holder.getBindingAdapterPosition()); if (!remote) { new Thread(() -> { Loading @@ -1907,7 +1920,6 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } }).start(); } fetchMoreCallBack.onClickMaxId(status.id); }); } else { holder.binding.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE); Loading Loading @@ -2070,7 +2082,6 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> DrawerStatusBinding binding; DrawerStatusHiddenBinding bindingHidden; DrawerStatusReportBinding bindingReport; DrawerFetchMoreBinding bindingFetchMore; DrawerStatusNotificationBinding bindingNotification; DrawerStatusArtBinding bindingArt; Loading app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java +3 −0 Original line number Diff line number Diff line Loading @@ -347,14 +347,17 @@ public class TimelinesVM extends AndroidViewModel { //When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole if (statusList.get(statusList.size() - 1).id.compareToIgnoreCase(timelineStatuses.get(0).id) > 0) { statusList.get(statusList.size() - 1).isFetchMore = true; statusList.get(statusList.size() - 1).positionFetchMore = Status.PositionFetchMore.TOP; } } else if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.TOP && timelineParams.fetchingMissing) { if (!timelineStatuses.contains(statusList.get(0))) { statusList.get(0).isFetchMore = true; statusList.get(0).positionFetchMore = Status.PositionFetchMore.BOTTOM; } } else if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.BOTTOM && timelineParams.fetchingMissing) { if (!timelineStatuses.contains(statusList.get(statusList.size() - 1))) { statusList.get(statusList.size() - 1).isFetchMore = true; statusList.get(statusList.size() - 1).positionFetchMore = Status.PositionFetchMore.TOP; } } } Loading Loading
app/src/main/java/app/fedilab/android/client/entities/api/Status.java +6 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ public class Status implements Serializable, Cloneable { public boolean isExpended = false; public boolean isTruncated = true; public boolean isFetchMore = false; public PositionFetchMore positionFetchMore = PositionFetchMore.BOTTOM; public boolean isMediaDisplayed = false; public boolean isMediaObfuscated = true; public boolean isChecked = false; Loading @@ -108,6 +109,11 @@ public class Status implements Serializable, Cloneable { public transient int cursorPosition = 0; public transient boolean submitted = false; public enum PositionFetchMore { TOP, BOTTOM } @Override public boolean equals(@Nullable Object obj) { boolean same = false; Loading
app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +29 −18 Original line number Diff line number Diff line Loading @@ -113,7 +113,6 @@ import app.fedilab.android.client.entities.app.Account; import app.fedilab.android.client.entities.app.StatusCache; import app.fedilab.android.client.entities.app.StatusDraft; import app.fedilab.android.client.entities.app.Timeline; import app.fedilab.android.databinding.DrawerFetchMoreBinding; import app.fedilab.android.databinding.DrawerStatusArtBinding; import app.fedilab.android.databinding.DrawerStatusBinding; import app.fedilab.android.databinding.DrawerStatusHiddenBinding; Loading Loading @@ -1862,7 +1861,6 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } }); //For reports if (holder.bindingReport != null) { holder.bindingReport.checkbox.setChecked(status.isChecked); holder.bindingReport.checkbox.setOnClickListener(v -> status.isChecked = !status.isChecked); Loading @@ -1873,7 +1871,14 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> holder.binding.layoutFetchMore.fetchMoreMin.setOnClickListener(v -> { status.isFetchMore = false; adapter.notifyItemChanged(holder.getBindingAdapterPosition()); fetchMoreCallBack.onClickMinId(status.id); if (holder.getBindingAdapterPosition() < statusList.size() - 1) { String fromId; if (status.positionFetchMore == Status.PositionFetchMore.TOP) { fromId = statusList.get(holder.getBindingAdapterPosition() + 1).id; } else { fromId = status.id; } fetchMoreCallBack.onClickMinId(fromId); if (!remote) { new Thread(() -> { StatusCache statusCache = new StatusCache(); Loading @@ -1888,10 +1893,18 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } }).start(); } } }); holder.binding.layoutFetchMore.fetchMoreMax.setOnClickListener(v -> { //We hide the button status.isFetchMore = false; String fromId; if (status.positionFetchMore == Status.PositionFetchMore.TOP) { fromId = statusList.get(holder.getBindingAdapterPosition()).id; } else { fromId = statusList.get(holder.getBindingAdapterPosition() - 1).id; } fetchMoreCallBack.onClickMaxId(fromId); adapter.notifyItemChanged(holder.getBindingAdapterPosition()); if (!remote) { new Thread(() -> { Loading @@ -1907,7 +1920,6 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } }).start(); } fetchMoreCallBack.onClickMaxId(status.id); }); } else { holder.binding.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE); Loading Loading @@ -2070,7 +2082,6 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> DrawerStatusBinding binding; DrawerStatusHiddenBinding bindingHidden; DrawerStatusReportBinding bindingReport; DrawerFetchMoreBinding bindingFetchMore; DrawerStatusNotificationBinding bindingNotification; DrawerStatusArtBinding bindingArt; Loading
app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java +3 −0 Original line number Diff line number Diff line Loading @@ -347,14 +347,17 @@ public class TimelinesVM extends AndroidViewModel { //When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole if (statusList.get(statusList.size() - 1).id.compareToIgnoreCase(timelineStatuses.get(0).id) > 0) { statusList.get(statusList.size() - 1).isFetchMore = true; statusList.get(statusList.size() - 1).positionFetchMore = Status.PositionFetchMore.TOP; } } else if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.TOP && timelineParams.fetchingMissing) { if (!timelineStatuses.contains(statusList.get(0))) { statusList.get(0).isFetchMore = true; statusList.get(0).positionFetchMore = Status.PositionFetchMore.BOTTOM; } } else if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.BOTTOM && timelineParams.fetchingMissing) { if (!timelineStatuses.contains(statusList.get(statusList.size() - 1))) { statusList.get(statusList.size() - 1).isFetchMore = true; statusList.get(statusList.size() - 1).positionFetchMore = Status.PositionFetchMore.TOP; } } } Loading