aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
authorAlex Ning <chineseperson5@gmail.com>2019-11-17 15:41:58 +0000
committerAlex Ning <chineseperson5@gmail.com>2019-11-17 15:41:58 +0000
commitb997963808a418948e46841c406f03deafd21f94 (patch)
treea428768a4d35a8e5299b83925c5ac104c41f2e3c /app/src/main/java
parentee60cbf640df8386bd7ffab0508edff9c283fdbd (diff)
downloadinfinity-for-reddit-b997963808a418948e46841c406f03deafd21f94.tar
infinity-for-reddit-b997963808a418948e46841c406f03deafd21f94.tar.gz
infinity-for-reddit-b997963808a418948e46841c406f03deafd21f94.tar.bz2
infinity-for-reddit-b997963808a418948e46841c406f03deafd21f94.tar.lz
infinity-for-reddit-b997963808a418948e46841c406f03deafd21f94.tar.xz
infinity-for-reddit-b997963808a418948e46841c406f03deafd21f94.tar.zst
infinity-for-reddit-b997963808a418948e46841c406f03deafd21f94.zip
Add a Fab to scroll down parent comments. Use volume up and down keys to navigate parent comments.
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewPostDetailActivity.java65
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java38
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Utils/SharedPreferencesUtils.java1
3 files changed, 103 insertions, 1 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewPostDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewPostDetailActivity.java
index 66457f9a..11b99830 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewPostDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewPostDetailActivity.java
@@ -6,6 +6,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.os.Bundle;
+import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -23,6 +24,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.LinearSmoothScroller;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
@@ -30,6 +32,7 @@ import com.bumptech.glide.RequestManager;
import com.evernote.android.state.State;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.livefront.bridge.Bridge;
import com.r0adkll.slidr.Slidr;
@@ -142,6 +145,8 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
ImageView mFetchPostInfoImageView;
@BindView(R.id.fetch_post_info_text_view_view_post_detail_activity)
TextView mFetchPostInfoTextView;
+ @BindView(R.id.fab_view_post_detail_activity)
+ FloatingActionButton fab;
@Inject
@Named("no_oauth")
Retrofit mRetrofit;
@@ -164,8 +169,10 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
private boolean mShowElapsedTime;
private boolean showToast = false;
private boolean isSortingComments = false;
+ private boolean mVolumeKeysNavigateComments;
private LinearLayoutManager mLinearLayoutManager;
private CommentAndPostRecyclerViewAdapter mAdapter;
+ private RecyclerView.SmoothScroller mSmoothScroller;
private PostCommentSortTypeBottomSheetFragment postCommentSortTypeBottomSheetFragment;
@Override
@@ -241,12 +248,19 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
mNeedBlurSpoiler = mSharedPreferences.getBoolean(SharedPreferencesUtils.BLUR_SPOILER_KEY, false);
mVoteButtonsOnTheRight = mSharedPreferences.getBoolean(SharedPreferencesUtils.VOTE_BUTTONS_ON_THE_RIGHT_KEY, false);
mShowElapsedTime = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_ELAPSED_TIME_KEY, false);
+ mVolumeKeysNavigateComments = mSharedPreferences.getBoolean(SharedPreferencesUtils.VOLUME_KEYS_NAVIGATE_COMMENTS, false);
mGlide = Glide.with(this);
mLocale = getResources().getConfiguration().locale;
mLinearLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLinearLayoutManager);
+ mSmoothScroller = new LinearSmoothScroller(this) {
+ @Override
+ protected int getVerticalSnapPreference() {
+ return LinearSmoothScroller.SNAP_TO_START;
+ }
+ };
mSingleCommentId = getIntent().getStringExtra(EXTRA_SINGLE_COMMENT_ID);
if (savedInstanceState == null) {
@@ -433,6 +447,8 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
}
}
}
+
+ fab.setOnClickListener(view -> scrollToNextParentComment());
}
@@ -965,6 +981,38 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
refresh(false, true);
}
+ public void scrollToNextParentComment() {
+ if (mLinearLayoutManager != null) {
+ int currentPosition = mLinearLayoutManager.findFirstVisibleItemPosition();
+ if (mAdapter != null) {
+ int nextParentPosition = mAdapter.getNextParentCommentPosition(currentPosition);
+ if (nextParentPosition < 0) {
+ return;
+ }
+ mSmoothScroller.setTargetPosition(nextParentPosition);
+ if (mLinearLayoutManager != null) {
+ mLinearLayoutManager.startSmoothScroll(mSmoothScroller);
+ }
+ }
+ }
+ }
+
+ public void scrollToPreviousParentComment() {
+ if (mLinearLayoutManager != null) {
+ int currentPosition = mLinearLayoutManager.findFirstVisibleItemPosition();
+ if (mAdapter != null) {
+ int nextParentPosition = mAdapter.getPreviousParentCommentPosition(currentPosition);
+ if (nextParentPosition < 0) {
+ return;
+ }
+ mSmoothScroller.setTargetPosition(nextParentPosition);
+ if (mLinearLayoutManager != null) {
+ mLinearLayoutManager.startSmoothScroll(mSmoothScroller);
+ }
+ }
+ }
+ }
+
@Subscribe
public void onPostUpdateEvent(PostUpdateEventToDetailActivity event) {
if (mPost.getId().equals(event.post.getId())) {
@@ -1294,7 +1342,7 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
refresh(true, false);
}
} else if (requestCode == EDIT_COMMENT_REQUEST_CODE) {
- if (resultCode == RESULT_OK) {
+ if (data != null && resultCode == RESULT_OK) {
mAdapter.editComment(data.getStringExtra(EditCommentActivity.EXTRA_EDITED_COMMENT_CONTENT),
data.getExtras().getInt(EditCommentActivity.EXTRA_EDITED_COMMENT_POSITION));
}
@@ -1325,6 +1373,21 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
}
@Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (mVolumeKeysNavigateComments) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ scrollToPreviousParentComment();
+ return true;
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ scrollToNextParentComment();
+ return true;
+ }
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
public void flairSelected(Flair flair) {
Map<String, String> params = new HashMap<>();
params.put(RedditUtils.API_TYPE_KEY, RedditUtils.API_TYPE_JSON);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java
index da09328f..3fcea5d7 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java
@@ -1437,6 +1437,44 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
mNeedBlurSpoiler = needBlurSpoiler;
}
+ public int getNextParentCommentPosition(int currentPosition) {
+ if (mVisibleComments != null && !mVisibleComments.isEmpty()) {
+ if (mIsSingleCommentThreadMode) {
+ for (int i = currentPosition + 1; i - 2 < mVisibleComments.size(); i++) {
+ if (mVisibleComments.get(i - 2).getDepth() == 0) {
+ return i;
+ }
+ }
+ } else {
+ for (int i = currentPosition + 1; i - 1 < mVisibleComments.size(); i++) {
+ if (mVisibleComments.get(i - 1).getDepth() == 0) {
+ return i;
+ }
+ }
+ }
+ }
+ return -1;
+ }
+
+ public int getPreviousParentCommentPosition(int currentPosition) {
+ if (mVisibleComments != null && !mVisibleComments.isEmpty()) {
+ if (mIsSingleCommentThreadMode) {
+ for (int i = currentPosition + 1; i - 2 >= 0; i--) {
+ if (mVisibleComments.get(i - 2).getDepth() == 0) {
+ return i;
+ }
+ }
+ } else {
+ for (int i = currentPosition - 1; i - 1 >= 0; i--) {
+ if (mVisibleComments.get(i - 1).getDepth() == 0) {
+ return i;
+ }
+ }
+ }
+ }
+ return -1;
+ }
+
@Override
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
if (holder instanceof CommentViewHolder) {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/SharedPreferencesUtils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/SharedPreferencesUtils.java
index aa612bed..8333db44 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/SharedPreferencesUtils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Utils/SharedPreferencesUtils.java
@@ -58,4 +58,5 @@ public class SharedPreferencesUtils {
public static final String PULL_NOTIFICATION_TIME = "pull_notification_time";
public static final String SHOW_ELAPSED_TIME_KEY = "show_elapsed_time";
public static final String SWIPE_RIGHT_TO_GO_BACK_FROM_POST_DETAIL = "swipe_to_go_back_from_post_detail";
+ public static final String VOLUME_KEYS_NAVIGATE_COMMENTS = "volume_keys_navigate_comments";
}