From 95dba15db8783c2661df005884230240179c7366 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 3 Jun 2021 11:26:49 -0300 Subject: [PATCH] Fix initial scroll position if there's not enough vertical space to hide search bar. --- .../components/emoji/EmojiPageView.java | 26 +++++++++++++- .../main/res/layout/emoji_display_item.xml | 35 +++++++++++-------- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java index 5971f2198b..0da2e29e09 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiPageView.java @@ -21,6 +21,8 @@ import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.Vari import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView; import org.thoughtcrime.securesms.util.MappingModelList; +import java.util.Objects; + public class EmojiPageView extends FrameLayout implements VariationSelectorListener { private static final String TAG = Log.tag(EmojiPageView.class); @@ -96,7 +98,29 @@ public class EmojiPageView extends FrameLayout implements VariationSelectorListe EmojiPageViewGridAdapter adapter = adapterFactory.create(); recyclerView.setAdapter(adapter); - adapter.submitList(getMappingModelList(), () -> layoutManager.scrollToPosition(1)); + adapter.submitList(getMappingModelList(), () -> { + layoutManager.scrollToPosition(1); + recyclerView.post(() -> { + if (!searchEnabled || recyclerView.getAdapter() == null) { + return; + } + + KeyboardPageSearchView searchView = (KeyboardPageSearchView) layoutManager.findViewByPosition(0); + if (searchView == null) { + return; + } + + int allowedScrollDistance = recyclerView.computeVerticalScrollRange() - recyclerView.computeVerticalScrollExtent(); + if (allowedScrollDistance < searchView.getMeasuredHeight()) { + View lastView = Objects.requireNonNull(layoutManager.findViewByPosition(recyclerView.getAdapter().getItemCount() - 1)); + int scrollDelta = searchView.getMeasuredHeight() - allowedScrollDistance; + int distanceFromBottom = Math.max(0, recyclerView.getMeasuredHeight() - lastView.getBottom()); + lastView.setPadding(lastView.getPaddingLeft(), lastView.getPaddingTop(), lastView.getPaddingRight(), lastView.getPaddingBottom() + scrollDelta + distanceFromBottom); + + recyclerView.post(() -> layoutManager.scrollToPosition(1)); + } + }); + }); } private @NonNull MappingModelList getMappingModelList() { diff --git a/app/src/main/res/layout/emoji_display_item.xml b/app/src/main/res/layout/emoji_display_item.xml index 9fca4fa7c5..e36f436f90 100644 --- a/app/src/main/res/layout/emoji_display_item.xml +++ b/app/src/main/res/layout/emoji_display_item.xml @@ -1,38 +1,45 @@ - + android:background="?selectableItemBackground" + android:padding="2dp"> + android:scaleType="fitCenter" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:src="@drawable/ic_emoji_smiley_24" /> + android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:tint="@color/core_grey_25" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:srcCompat="@drawable/triangle_bottom_right_corner" /> - \ No newline at end of file + \ No newline at end of file