From 262b4e7d62fd2235d7572fe716dfe55f6b10218b Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 3 Jun 2021 15:27:29 -0300 Subject: [PATCH] Hide bottom bar on scroll for Emoji pager. --- .../emoji/EmojiKeyboardProvider.java | 2 +- .../components/emoji/EmojiPageView.java | 50 ++----- .../emoji/EmojiKeyboardPageAdapter.kt | 6 +- .../emoji/EmojiKeyboardPageFragment.kt | 6 +- .../emoji/search/EmojiSearchFragment.kt | 2 +- .../any/ReactWithAnyEmojiAdapter.java | 2 +- app/src/main/res/layout/emoji_grid_layout.xml | 40 +----- .../keyboard_pager_emoji_page_fragment.xml | 126 +++++++++--------- 8 files changed, 92 insertions(+), 142 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java index 1870ec7a7a..93cf7109a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiKeyboardProvider.java @@ -149,7 +149,7 @@ public class EmojiKeyboardProvider implements MediaKeyboardProvider, @Override public @NonNull Object instantiateItem(@NonNull ViewGroup container, int position) { - EmojiPageView page = new EmojiPageView(context, emojiSelectionListener, variationSelectorListener, true, null); + EmojiPageView page = new EmojiPageView(context, emojiSelectionListener, variationSelectorListener, true); page.setModel(pages.get(position)); container.addView(page); return page; 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 242984a0be..3556039d90 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 @@ -9,22 +9,17 @@ import android.widget.FrameLayout; import androidx.annotation.LayoutRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.annimon.stream.Stream; -import com.google.android.material.appbar.AppBarLayout; -import org.jetbrains.annotations.NotNull; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.emoji.EmojiKeyboardProvider.EmojiEventListener; import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.VariationSelectorListener; -import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView; import org.thoughtcrime.securesms.util.MappingModelList; - -import java.util.Objects; +import org.thoughtcrime.securesms.util.ViewUtil; public class EmojiPageView extends FrameLayout implements VariationSelectorListener { private static final String TAG = Log.tag(EmojiPageView.class); @@ -36,23 +31,19 @@ public class EmojiPageView extends FrameLayout implements VariationSelectorListe private RecyclerView.OnItemTouchListener scrollDisabler; private VariationSelectorListener variationSelectorListener; private EmojiVariationSelectorPopup popup; - private AppBarLayout appBarLayout; - private boolean searchEnabled; public EmojiPageView(@NonNull Context context, @NonNull EmojiEventListener emojiSelectionListener, @NonNull VariationSelectorListener variationSelectorListener, - boolean allowVariations, - @Nullable KeyboardPageSearchView.Callbacks searchCallbacks) + boolean allowVariations) { - this(context, emojiSelectionListener, variationSelectorListener, allowVariations, searchCallbacks, new GridLayoutManager(context, 8), R.layout.emoji_display_item); + this(context, emojiSelectionListener, variationSelectorListener, allowVariations, new GridLayoutManager(context, 8), R.layout.emoji_display_item); } public EmojiPageView(@NonNull Context context, @NonNull EmojiEventListener emojiSelectionListener, @NonNull VariationSelectorListener variationSelectorListener, boolean allowVariations, - @Nullable KeyboardPageSearchView.Callbacks searchCallbacks, @NonNull RecyclerView.LayoutManager layoutManager, @LayoutRes int displayItemLayoutResId) { @@ -71,16 +62,19 @@ public class EmojiPageView extends FrameLayout implements VariationSelectorListe allowVariations, displayItemLayoutResId); - this.appBarLayout = view.findViewById(R.id.emoji_keyboard_search_appbar); - ((CoordinatorLayout.LayoutParams) this.appBarLayout.getLayoutParams()).setBehavior(new BlockableScrollBehavior()); - - KeyboardPageSearchView searchView = view.findViewById(R.id.emoji_keyboard_search_text); - searchView.setCallbacks(searchCallbacks); - recyclerView.setLayoutManager(layoutManager); recyclerView.setItemAnimator(null); } + public void presentForEmojiKeyboard() { + recyclerView.setPadding(recyclerView.getPaddingLeft(), + recyclerView.getPaddingTop(), + recyclerView.getPaddingRight(), + recyclerView.getPaddingBottom() + ViewUtil.dpToPx(56)); + + recyclerView.setClipToPadding(false); + } + public void onSelected() { if (model.isDynamic() && recyclerView.getAdapter() != null) { recyclerView.getAdapter().notifyDataSetChanged(); @@ -96,8 +90,7 @@ public class EmojiPageView extends FrameLayout implements VariationSelectorListe } public void bindSearchableAdapter(@Nullable EmojiPageModel model) { - this.searchEnabled = true; - this.model = model; + this.model = model; EmojiPageViewGridAdapter adapter = adapterFactory.create(); recyclerView.setAdapter(adapter); @@ -161,23 +154,6 @@ public class EmojiPageView extends FrameLayout implements VariationSelectorListe public void onRequestDisallowInterceptTouchEvent(boolean b) { } } - private class BlockableScrollBehavior extends AppBarLayout.Behavior { - @Override public boolean onStartNestedScroll(@NonNull CoordinatorLayout parent, - @NonNull AppBarLayout child, - @NonNull View directTargetChild, - View target, - int nestedScrollAxes, - int type) - { - return searchEnabled && super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes, type); - } - - @Override - public boolean onTouchEvent(@NonNull @NotNull CoordinatorLayout parent, @NonNull @NotNull AppBarLayout child, @NonNull @NotNull MotionEvent ev) { - return searchEnabled && super.onTouchEvent(parent, child, ev); - } - } - private interface AdapterFactory { EmojiPageViewGridAdapter create(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/EmojiKeyboardPageAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/EmojiKeyboardPageAdapter.kt index 4c3c2fc6f8..8e4353c89e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/EmojiKeyboardPageAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/EmojiKeyboardPageAdapter.kt @@ -9,16 +9,16 @@ import org.thoughtcrime.securesms.util.MappingViewHolder class EmojiKeyboardPageAdapter( private val emojiSelectionListener: EmojiKeyboardProvider.EmojiEventListener, - private val variationSelectorListener: EmojiPageViewGridAdapter.VariationSelectorListener, - private val searchCallbacks: KeyboardPageSearchView.Callbacks + private val variationSelectorListener: EmojiPageViewGridAdapter.VariationSelectorListener ) : MappingAdapter() { init { registerFactory(EmojiPageMappingModel::class.java) { parent -> - val pageView = EmojiPageView(parent.context, emojiSelectionListener, variationSelectorListener, true, searchCallbacks) + val pageView = EmojiPageView(parent.context, emojiSelectionListener, variationSelectorListener, true) val layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) pageView.layoutParams = layoutParams + pageView.presentForEmojiKeyboard() ViewHolder(pageView) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/EmojiKeyboardPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/EmojiKeyboardPageFragment.kt index cef4f4fd7e..abbcc4cd03 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/EmojiKeyboardPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/EmojiKeyboardPageFragment.kt @@ -27,6 +27,7 @@ class EmojiKeyboardPageFragment : Fragment(R.layout.keyboard_pager_emoji_page_fr private lateinit var callback: Callback private lateinit var pagesAdapter: EmojiKeyboardPageAdapter private lateinit var categoriesAdapter: EmojiKeyboardPageCategoriesAdapter + private lateinit var searchBar: KeyboardPageSearchView override fun onAttach(context: Context) { super.onAttach(context) @@ -38,6 +39,7 @@ class EmojiKeyboardPageFragment : Fragment(R.layout.keyboard_pager_emoji_page_fr super.onViewCreated(view, savedInstanceState) emojiPager = view.findViewById(R.id.emoji_pager) searchView = view.findViewById(R.id.emoji_search) + searchBar = view.findViewById(R.id.emoji_keyboard_search_text) emojiCategoriesRecycler = view.findViewById(R.id.emoji_categories_recycler) backspaceView = view.findViewById(R.id.emoji_backspace) } @@ -47,7 +49,7 @@ class EmojiKeyboardPageFragment : Fragment(R.layout.keyboard_pager_emoji_page_fr viewModel = ViewModelProviders.of(requireActivity()).get(EmojiKeyboardPageViewModel::class.java) - pagesAdapter = EmojiKeyboardPageAdapter(this, this, EmojiKeyboardPageSearchViewCallbacks()) + pagesAdapter = EmojiKeyboardPageAdapter(this, this) categoriesAdapter = EmojiKeyboardPageCategoriesAdapter { key -> viewModel.onKeySelected(key) @@ -64,6 +66,8 @@ class EmojiKeyboardPageFragment : Fragment(R.layout.keyboard_pager_emoji_page_fr emojiPager.adapter = pagesAdapter emojiCategoriesRecycler.adapter = categoriesAdapter + searchBar.callbacks = EmojiKeyboardPageSearchViewCallbacks() + searchView.setOnClickListener { callback.openEmojiSearch() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchFragment.kt index 806ebed476..dedc0f091f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchFragment.kt @@ -40,7 +40,7 @@ class EmojiSearchFragment : Fragment(R.layout.emoji_search_fragment), EmojiPageV val searchBar: KeyboardPageSearchView = view.findViewById(R.id.emoji_search_view) val resultsContainer: FrameLayout = view.findViewById(R.id.emoji_search_results_container) val noResults: TextView = view.findViewById(R.id.emoji_search_empty) - val emojiPageView = EmojiPageView(requireContext(), eventListener, this, true, null, LinearLayoutManager(requireContext(), RecyclerView.HORIZONTAL, false), R.layout.emoji_search_result_display_item) + val emojiPageView = EmojiPageView(requireContext(), eventListener, this, true, LinearLayoutManager(requireContext(), RecyclerView.HORIZONTAL, false), R.layout.emoji_search_result_display_item) resultsContainer.addView(emojiPageView) diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiAdapter.java index 0dcff4c3cc..2343f98235 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiAdapter.java @@ -90,7 +90,7 @@ final class ReactWithAnyEmojiAdapter extends ListAdapter - - - - - - - - - - - - \ No newline at end of file + android:clipToPadding="false" + android:paddingBottom="8dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/keyboard_pager_emoji_page_fragment.xml b/app/src/main/res/layout/keyboard_pager_emoji_page_fragment.xml index cc3ffa9732..7adc13ee6c 100644 --- a/app/src/main/res/layout/keyboard_pager_emoji_page_fragment.xml +++ b/app/src/main/res/layout/keyboard_pager_emoji_page_fragment.xml @@ -1,77 +1,79 @@ - + android:background="@color/signal_background_secondary"> + + + + + + + android:layout_height="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior" /> - - - - - - - + app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"> - + - \ No newline at end of file + + + + + + \ No newline at end of file