aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Ning <chineseperson5@gmail.com>2019-08-29 03:39:56 +0000
committerAlex Ning <chineseperson5@gmail.com>2019-08-29 03:39:56 +0000
commit2acfcb1d60fc2995c070e87b18a903833f958dc5 (patch)
tree8bc276156a7402c5539c517ea4533fd9c5c79bc9
parentcc0d78aeddb90346c136fc4eafe03d80b95e93fa (diff)
downloadinfinity-for-reddit-2acfcb1d60fc2995c070e87b18a903833f958dc5.tar
infinity-for-reddit-2acfcb1d60fc2995c070e87b18a903833f958dc5.tar.gz
infinity-for-reddit-2acfcb1d60fc2995c070e87b18a903833f958dc5.tar.bz2
infinity-for-reddit-2acfcb1d60fc2995c070e87b18a903833f958dc5.tar.lz
infinity-for-reddit-2acfcb1d60fc2995c070e87b18a903833f958dc5.tar.xz
infinity-for-reddit-2acfcb1d60fc2995c070e87b18a903833f958dc5.tar.zst
infinity-for-reddit-2acfcb1d60fc2995c070e87b18a903833f958dc5.zip
Use StaggeredGridLayoutManager in PostFragment in landscape and tablet. Reimplement lazy mode. Prevent resuming lazy mode twice after configuration changes. Fix regex.
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java77
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Utils.java4
2 files changed, 70 insertions, 11 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
index db10f91f..86900902 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java
@@ -11,6 +11,7 @@ import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -29,6 +30,7 @@ import androidx.paging.PagedList;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSmoothScroller;
import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
@@ -61,6 +63,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
static final String EXTRA_ACCESS_TOKEN = "EAT";
private static final String IS_IN_LAZY_MODE_STATE = "IILMS";
+ private static final String RECYCLER_VIEW_POSITION_STATE = "RVPS";
@BindView(R.id.recycler_view_post_fragment) RecyclerView mPostRecyclerView;
@BindView(R.id.progress_bar_post_fragment) CircleProgressBar mProgressBar;
@@ -72,6 +75,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
private Activity activity;
private LinearLayoutManager mLinearLayoutManager;
+ private StaggeredGridLayoutManager mStaggeredGridLayoutManager;
private boolean isInLazyMode = false;
private boolean isLazyModePaused = false;
@@ -84,7 +88,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
private Window window;
private Handler lazyModeHandler;
- private Runnable lazyModeRunnable;
+ private LazyModeRunnable lazyModeRunnable;
private CountDownTimer resumeLazyModeCountDownTimer;
private float lazyModeInterval;
@@ -149,17 +153,39 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
}
}
+ if (resources.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT && !resources.getBoolean(R.bool.isTablet)) {
+ mLinearLayoutManager = new LinearLayoutManager(activity);
+ mPostRecyclerView.setLayoutManager(mLinearLayoutManager);
+ } else {
+ mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
+ mPostRecyclerView.setLayoutManager(mStaggeredGridLayoutManager);
+ }
+
mGlide = Glide.with(activity);
- lazyModeRunnable = new Runnable() {
+ lazyModeRunnable = new LazyModeRunnable() {
+
@Override
public void run() {
if(isInLazyMode && !isLazyModePaused) {
int nPosts = mAdapter.getItemCount();
- int firstVisiblePosition = mLinearLayoutManager.findFirstVisibleItemPosition();
- if(firstVisiblePosition != RecyclerView.NO_POSITION && nPosts > firstVisiblePosition) {
- smoothScroller.setTargetPosition(firstVisiblePosition + 1);
- mLinearLayoutManager.startSmoothScroll(smoothScroller);
+ if(getCurrentPosition() == -1) {
+ if(mLinearLayoutManager != null) {
+ setCurrentPosition(mLinearLayoutManager.findFirstVisibleItemPosition());
+ } else {
+ int[] into = new int[2];
+ setCurrentPosition(mStaggeredGridLayoutManager.findFirstVisibleItemPositions(into)[1]);
+ }
+ }
+
+ if(getCurrentPosition() != RecyclerView.NO_POSITION && nPosts > getCurrentPosition()) {
+ incrementCurrentPosition();
+ smoothScroller.setTargetPosition(getCurrentPosition());
+ if(mLinearLayoutManager != null) {
+ mLinearLayoutManager.startSmoothScroll(smoothScroller);
+ } else {
+ mStaggeredGridLayoutManager.startSmoothScroll(smoothScroller);
+ }
}
}
lazyModeHandler.postDelayed(this, (long) (lazyModeInterval * 1000));
@@ -179,14 +205,17 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
};
if(savedInstanceState != null) {
+ int recyclerViewPosition = savedInstanceState.getInt(RECYCLER_VIEW_POSITION_STATE);
+ if(recyclerViewPosition > 0) {
+ mPostRecyclerView.scrollToPosition(recyclerViewPosition);
+ }
+
isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE);
if(isInLazyMode) {
resumeLazyMode(false);
}
}
- mLinearLayoutManager = new LinearLayoutManager(activity);
- mPostRecyclerView.setLayoutManager(mLinearLayoutManager);
mPostRecyclerView.setOnTouchListener((view, motionEvent) -> {
if(isInLazyMode) {
pauseLazyMode(true);
@@ -399,6 +428,13 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(IS_IN_LAZY_MODE_STATE, isInLazyMode);
+ if(mLinearLayoutManager != null) {
+ outState.putInt(RECYCLER_VIEW_POSITION_STATE, mLinearLayoutManager.findFirstVisibleItemPosition());
+ } else if(mStaggeredGridLayoutManager != null) {
+ int[] into = new int[2];
+ outState.putInt(RECYCLER_VIEW_POSITION_STATE,
+ mStaggeredGridLayoutManager.findFirstVisibleItemPositions(into)[0]);
+ }
}
@Override
@@ -459,6 +495,9 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
if(isInLazyMode) {
isLazyModePaused = false;
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+
+ lazyModeRunnable.resetOldPosition();
+
if(resumeNow) {
lazyModeHandler.post(lazyModeRunnable);
} else {
@@ -506,7 +545,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
@Override
public void onStart() {
super.onStart();
- if(isInLazyMode) {
+ if(isInLazyMode && isLazyModePaused) {
resumeLazyMode(false);
}
}
@@ -524,4 +563,24 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
+
+ private static abstract class LazyModeRunnable implements Runnable {
+ private int currentPosition = -1;
+
+ int getCurrentPosition() {
+ return currentPosition;
+ }
+
+ void setCurrentPosition(int currentPosition) {
+ this.currentPosition = currentPosition;
+ }
+
+ void incrementCurrentPosition() {
+ currentPosition++;
+ }
+
+ void resetOldPosition() {
+ currentPosition = -1;
+ }
+ }
} \ No newline at end of file
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils.java
index aa7495cd..bdd32364 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils.java
@@ -2,7 +2,7 @@ package ml.docilealligator.infinityforreddit;
class Utils {
static String addSubredditAndUserLink(String markdown) {
- return markdown.replaceAll("(?<!\\w)/{0,1}u/\\w+/{0,1}", "[$0]($0)")
- .replaceAll("(?<!\\w)/{0,1}r/\\w+/{0,1}", "[$0]($0)");
+ return markdown.replaceAll("(?<!\\s)/{0,1}u/\\w+/{0,1}(?<!\\s)$", "[$0]($0)")
+ .replaceAll("(?<!\\s)/{0,1}r/\\w+/{0,1}(?<!\\s)$", "[$0]($0)");
}
}