mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2024-12-26 02:48:23 +01:00
Add a Fab to scroll down parent comments. Use volume up and down keys to navigate parent comments.
This commit is contained in:
parent
ee60cbf640
commit
b997963808
@ -6,6 +6,7 @@ import android.content.res.Configuration;
|
|||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.view.KeyEvent;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -23,6 +24,7 @@ import androidx.annotation.Nullable;
|
|||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.LinearSmoothScroller;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
@ -30,6 +32,7 @@ import com.bumptech.glide.RequestManager;
|
|||||||
import com.evernote.android.state.State;
|
import com.evernote.android.state.State;
|
||||||
import com.google.android.material.appbar.AppBarLayout;
|
import com.google.android.material.appbar.AppBarLayout;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
import com.livefront.bridge.Bridge;
|
import com.livefront.bridge.Bridge;
|
||||||
import com.r0adkll.slidr.Slidr;
|
import com.r0adkll.slidr.Slidr;
|
||||||
@ -142,6 +145,8 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
ImageView mFetchPostInfoImageView;
|
ImageView mFetchPostInfoImageView;
|
||||||
@BindView(R.id.fetch_post_info_text_view_view_post_detail_activity)
|
@BindView(R.id.fetch_post_info_text_view_view_post_detail_activity)
|
||||||
TextView mFetchPostInfoTextView;
|
TextView mFetchPostInfoTextView;
|
||||||
|
@BindView(R.id.fab_view_post_detail_activity)
|
||||||
|
FloatingActionButton fab;
|
||||||
@Inject
|
@Inject
|
||||||
@Named("no_oauth")
|
@Named("no_oauth")
|
||||||
Retrofit mRetrofit;
|
Retrofit mRetrofit;
|
||||||
@ -164,8 +169,10 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
private boolean mShowElapsedTime;
|
private boolean mShowElapsedTime;
|
||||||
private boolean showToast = false;
|
private boolean showToast = false;
|
||||||
private boolean isSortingComments = false;
|
private boolean isSortingComments = false;
|
||||||
|
private boolean mVolumeKeysNavigateComments;
|
||||||
private LinearLayoutManager mLinearLayoutManager;
|
private LinearLayoutManager mLinearLayoutManager;
|
||||||
private CommentAndPostRecyclerViewAdapter mAdapter;
|
private CommentAndPostRecyclerViewAdapter mAdapter;
|
||||||
|
private RecyclerView.SmoothScroller mSmoothScroller;
|
||||||
private PostCommentSortTypeBottomSheetFragment postCommentSortTypeBottomSheetFragment;
|
private PostCommentSortTypeBottomSheetFragment postCommentSortTypeBottomSheetFragment;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -241,12 +248,19 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
mNeedBlurSpoiler = mSharedPreferences.getBoolean(SharedPreferencesUtils.BLUR_SPOILER_KEY, false);
|
mNeedBlurSpoiler = mSharedPreferences.getBoolean(SharedPreferencesUtils.BLUR_SPOILER_KEY, false);
|
||||||
mVoteButtonsOnTheRight = mSharedPreferences.getBoolean(SharedPreferencesUtils.VOTE_BUTTONS_ON_THE_RIGHT_KEY, false);
|
mVoteButtonsOnTheRight = mSharedPreferences.getBoolean(SharedPreferencesUtils.VOTE_BUTTONS_ON_THE_RIGHT_KEY, false);
|
||||||
mShowElapsedTime = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_ELAPSED_TIME_KEY, false);
|
mShowElapsedTime = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_ELAPSED_TIME_KEY, false);
|
||||||
|
mVolumeKeysNavigateComments = mSharedPreferences.getBoolean(SharedPreferencesUtils.VOLUME_KEYS_NAVIGATE_COMMENTS, false);
|
||||||
|
|
||||||
mGlide = Glide.with(this);
|
mGlide = Glide.with(this);
|
||||||
mLocale = getResources().getConfiguration().locale;
|
mLocale = getResources().getConfiguration().locale;
|
||||||
|
|
||||||
mLinearLayoutManager = new LinearLayoutManager(this);
|
mLinearLayoutManager = new LinearLayoutManager(this);
|
||||||
mRecyclerView.setLayoutManager(mLinearLayoutManager);
|
mRecyclerView.setLayoutManager(mLinearLayoutManager);
|
||||||
|
mSmoothScroller = new LinearSmoothScroller(this) {
|
||||||
|
@Override
|
||||||
|
protected int getVerticalSnapPreference() {
|
||||||
|
return LinearSmoothScroller.SNAP_TO_START;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
mSingleCommentId = getIntent().getStringExtra(EXTRA_SINGLE_COMMENT_ID);
|
mSingleCommentId = getIntent().getStringExtra(EXTRA_SINGLE_COMMENT_ID);
|
||||||
if (savedInstanceState == null) {
|
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);
|
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
|
@Subscribe
|
||||||
public void onPostUpdateEvent(PostUpdateEventToDetailActivity event) {
|
public void onPostUpdateEvent(PostUpdateEventToDetailActivity event) {
|
||||||
if (mPost.getId().equals(event.post.getId())) {
|
if (mPost.getId().equals(event.post.getId())) {
|
||||||
@ -1294,7 +1342,7 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
refresh(true, false);
|
refresh(true, false);
|
||||||
}
|
}
|
||||||
} else if (requestCode == EDIT_COMMENT_REQUEST_CODE) {
|
} 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),
|
mAdapter.editComment(data.getStringExtra(EditCommentActivity.EXTRA_EDITED_COMMENT_CONTENT),
|
||||||
data.getExtras().getInt(EditCommentActivity.EXTRA_EDITED_COMMENT_POSITION));
|
data.getExtras().getInt(EditCommentActivity.EXTRA_EDITED_COMMENT_POSITION));
|
||||||
}
|
}
|
||||||
@ -1324,6 +1372,21 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
Bridge.clear(this);
|
Bridge.clear(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
@Override
|
||||||
public void flairSelected(Flair flair) {
|
public void flairSelected(Flair flair) {
|
||||||
Map<String, String> params = new HashMap<>();
|
Map<String, String> params = new HashMap<>();
|
||||||
|
@ -1437,6 +1437,44 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
|
|||||||
mNeedBlurSpoiler = needBlurSpoiler;
|
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
|
@Override
|
||||||
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
||||||
if (holder instanceof CommentViewHolder) {
|
if (holder instanceof CommentViewHolder) {
|
||||||
|
@ -58,4 +58,5 @@ public class SharedPreferencesUtils {
|
|||||||
public static final String PULL_NOTIFICATION_TIME = "pull_notification_time";
|
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 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 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";
|
||||||
}
|
}
|
||||||
|
@ -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>
|
@ -70,4 +70,14 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</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>
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
@ -289,6 +289,7 @@
|
|||||||
<string name="settings_amoled_dark_title">Amoled Dark</string>
|
<string name="settings_amoled_dark_title">Amoled Dark</string>
|
||||||
<string name="settings_immersive_interface_title">Immersive Interface</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_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="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="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>
|
<string name="settings_lazy_mode_interval_title">Lazy Mode Interval</string>
|
||||||
|
@ -29,17 +29,22 @@
|
|||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
app:defaultValue="false"
|
app:defaultValue="false"
|
||||||
app:key="vote_buttons_on_the_right"
|
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
|
<SwitchPreference
|
||||||
app:defaultValue="false"
|
app:defaultValue="false"
|
||||||
app:key="show_elapsed_time"
|
app:key="show_elapsed_time"
|
||||||
app:title="@string/settings_show_elapsed_time"/>
|
app:title="@string/settings_show_elapsed_time" />
|
||||||
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
app:defaultValue="true"
|
app:defaultValue="true"
|
||||||
app:key="swipe_to_go_back_from_post_detail"
|
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
|
<Preference
|
||||||
app:title="@string/settings_font_size_title"
|
app:title="@string/settings_font_size_title"
|
||||||
|
Loading…
Reference in New Issue
Block a user