diff options
7 files changed, 131 insertions, 4 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"; } diff --git a/app/src/main/res/drawable/ic_keyboard_arrow_down_24dp.xml b/app/src/main/res/drawable/ic_keyboard_arrow_down_24dp.xml new file mode 100644 index 00000000..9f2d9ba3 --- /dev/null +++ b/app/src/main/res/drawable/ic_keyboard_arrow_down_24dp.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#FFFFFFFF" + android:pathData="M7.41,8.59L12,13.17l4.59,-4.58L18,10l-6,6 -6,-6 1.41,-1.41z"/> +</vector> diff --git a/app/src/main/res/layout/activity_view_post_detail.xml b/app/src/main/res/layout/activity_view_post_detail.xml index eb48f340..98794359 100644 --- a/app/src/main/res/layout/activity_view_post_detail.xml +++ b/app/src/main/res/layout/activity_view_post_detail.xml @@ -70,4 +70,14 @@ </LinearLayout> + <com.google.android.material.floatingactionbutton.FloatingActionButton + android:id="@+id/fab_view_post_detail_activity" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|end" + android:layout_margin="@dimen/fab_margin" + app:backgroundTint="@color/backgroundColorPrimary" + app:tint="@android:color/white" + app:srcCompat="@drawable/ic_keyboard_arrow_down_24dp" /> + </androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 88228a44..9452003c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -289,6 +289,7 @@ <string name="settings_amoled_dark_title">Amoled Dark</string> <string name="settings_immersive_interface_title">Immersive Interface</string> <string name="settings_vote_buttons_on_the_right_title">Vote Buttons on the Right</string> + <string name="settings_volume_keys_navigate_comments_title">Use Volume Keys to Navigate Comments in Posts</string> <string name="settings_show_elapsed_time">Show Elpased Time in Posts and Comments</string> <string name="swipe_to_go_back_from_post_detail">Swipe Right to Go Back From Comments</string> <string name="settings_lazy_mode_interval_title">Lazy Mode Interval</string> diff --git a/app/src/main/res/xml/main_preferences.xml b/app/src/main/res/xml/main_preferences.xml index db4b75a1..894642fa 100644 --- a/app/src/main/res/xml/main_preferences.xml +++ b/app/src/main/res/xml/main_preferences.xml @@ -29,17 +29,22 @@ <SwitchPreference app:defaultValue="false" app:key="vote_buttons_on_the_right" - app:title="@string/settings_vote_buttons_on_the_right_title"/> + app:title="@string/settings_vote_buttons_on_the_right_title" /> <SwitchPreference app:defaultValue="false" app:key="show_elapsed_time" - app:title="@string/settings_show_elapsed_time"/> + app:title="@string/settings_show_elapsed_time" /> <SwitchPreference app:defaultValue="true" app:key="swipe_to_go_back_from_post_detail" - app:title="@string/swipe_to_go_back_from_post_detail"/> + app:title="@string/swipe_to_go_back_from_post_detail" /> + + <SwitchPreference + app:defaultValue="false" + app:key="volume_keys_navigate_comments" + app:title="@string/settings_volume_keys_navigate_comments_title" /> <Preference app:title="@string/settings_font_size_title" |