Tweak sizes and padding of various keyboard elements.

This commit is contained in:
Cody Henthorne
2021-07-13 19:37:30 -04:00
committed by Greyson Parrelli
parent 55c69cd50a
commit 916006e664
23 changed files with 136 additions and 132 deletions

View File

@@ -10,9 +10,10 @@ import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.Emoj
import org.thoughtcrime.securesms.util.InsetItemDecoration
import org.thoughtcrime.securesms.util.ViewUtil
private val EDGE_LENGTH: Int = ViewUtil.dpToPx(7)
private val HORIZONTAL_INSET: Int = ViewUtil.dpToPx(8)
private val VERTICAL_INSET: Int = ViewUtil.dpToPx(8)
private val EDGE_LENGTH: Int = ViewUtil.dpToPx(6)
private val HORIZONTAL_INSET: Int = ViewUtil.dpToPx(6)
private val EMOJI_VERTICAL_INSET: Int = ViewUtil.dpToPx(5)
private val HEADER_VERTICAL_INSET: Int = ViewUtil.dpToPx(8)
/**
* Use super class to add insets to the emojis and use the [onDrawOver] to draw the variation
@@ -41,11 +42,12 @@ class EmojiItemDecoration(private val allowVariations: Boolean, private val vari
private class SetInset : InsetItemDecoration.SetInset() {
override fun setInset(outRect: Rect, view: View, parent: RecyclerView) {
val isFirstHeader = view.javaClass == AppCompatTextView::class.java && getPosition(view, parent) == 0
val isHeader = view.javaClass == AppCompatTextView::class.java
outRect.left = HORIZONTAL_INSET
outRect.right = HORIZONTAL_INSET
outRect.top = if (isFirstHeader) 0 else VERTICAL_INSET
outRect.bottom = VERTICAL_INSET
outRect.top = if (isHeader) HEADER_VERTICAL_INSET else EMOJI_VERTICAL_INSET
outRect.bottom = if (isHeader) 0 else EMOJI_VERTICAL_INSET
}
}
}

View File

@@ -19,11 +19,9 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.EmojiHeader;
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.EmojiNoResultsModel;
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.VariationSelectorListener;
import org.thoughtcrime.securesms.emoji.EmojiCategory;
import org.thoughtcrime.securesms.util.ContextUtil;
import org.thoughtcrime.securesms.util.DrawableUtil;
import org.thoughtcrime.securesms.util.MappingModel;
import org.thoughtcrime.securesms.util.MappingModelList;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.List;
@@ -31,7 +29,6 @@ import java.util.Optional;
public class EmojiPageView extends RecyclerView implements VariationSelectorListener {
private EmojiPageModel model;
private AdapterFactory adapterFactory;
private LinearLayoutManager layoutManager;
private RecyclerView.OnItemTouchListener scrollDisabler;
@@ -125,45 +122,15 @@ public class EmojiPageView extends RecyclerView implements VariationSelectorList
}
public void onSelected() {
if (getAdapter() != null && (model == null || model.isDynamic())) {
if (getAdapter() != null) {
getAdapter().notifyDataSetChanged();
}
}
public void setList(@NonNull List<MappingModel<?>> list) {
this.model = null;
public void setList(@NonNull List<MappingModel<?>> list, @Nullable Runnable commitCallback) {
EmojiPageViewGridAdapter adapter = adapterFactory.create();
setAdapter(adapter);
adapter.submitList(list);
}
public void setModel(@Nullable EmojiPageModel model) {
this.model = model;
EmojiPageViewGridAdapter adapter = adapterFactory.create();
setAdapter(adapter);
adapter.submitList(getMappingModelList());
}
public void bindSearchableAdapter(@Nullable EmojiPageModel model) {
this.model = model;
EmojiPageViewGridAdapter adapter = adapterFactory.create();
setAdapter(adapter);
adapter.submitList(getMappingModelList());
}
private @NonNull MappingModelList getMappingModelList() {
if (model != null) {
boolean emoticonPage = EmojiCategory.EMOTICONS.getKey().equals(model.getKey());
return model.getDisplayEmoji()
.stream()
.map(e -> emoticonPage ? new EmojiPageViewGridAdapter.EmojiTextModel(model.getKey(), e)
: new EmojiPageViewGridAdapter.EmojiModel(model.getKey(), e))
.collect(MappingModelList.collect());
}
return new MappingModelList();
adapter.submitList(list, commitCallback);
}
@Override

View File

@@ -85,7 +85,7 @@ class EmojiKeyboardPageFragment : Fragment(R.layout.keyboard_pager_emoji_page_fr
}
viewModel.pages.observe(viewLifecycleOwner) { pages ->
emojiPageView.setList(pages)
emojiPageView.setList(pages) { (emojiPageView.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(1, 0) }
}
viewModel.selectedKey.observe(viewLifecycleOwner) { updateCategoryTab(it) }

View File

@@ -56,7 +56,7 @@ class EmojiSearchFragment : Fragment(R.layout.emoji_search_fragment), EmojiPageV
searchBar.callbacks = SearchCallbacks()
viewModel.emojiList.observe(viewLifecycleOwner) { results ->
emojiPageView.setList(results.emojiList)
emojiPageView.setList(results.emojiList, null)
if (results.emojiList.isNotEmpty() || results.isRecents) {
emojiPageView.visibility = View.VISIBLE

View File

@@ -0,0 +1,25 @@
package org.thoughtcrime.securesms.keyboard.sticker
import android.graphics.Rect
import android.view.View
import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import org.thoughtcrime.securesms.util.InsetItemDecoration
import org.thoughtcrime.securesms.util.ViewUtil
private val horizontalInset: Int = ViewUtil.dpToPx(8)
private val verticalInset: Int = ViewUtil.dpToPx(8)
/**
* Set insets for sticker items in a [RecyclerView]. For use in [InsetItemDecoration].
*/
class StickerInsetSetter : InsetItemDecoration.SetInset() {
override fun setInset(outRect: Rect, view: View, parent: RecyclerView) {
val isHeader = view.javaClass == AppCompatTextView::class.java
outRect.left = horizontalInset
outRect.right = horizontalInset
outRect.top = verticalInset
outRect.bottom = if (isHeader) 0 else verticalInset
}
}

View File

@@ -21,11 +21,14 @@ import org.thoughtcrime.securesms.stickers.StickerEventListener
import org.thoughtcrime.securesms.stickers.StickerRolloverTouchListener
import org.thoughtcrime.securesms.stickers.StickerRolloverTouchListener.RolloverStickerRetriever
import org.thoughtcrime.securesms.util.DeviceProperties
import org.thoughtcrime.securesms.util.InsetItemDecoration
import org.thoughtcrime.securesms.util.MappingModel
import org.thoughtcrime.securesms.util.MappingModelList
import org.thoughtcrime.securesms.util.Throttler
import org.whispersystems.libsignal.util.Pair
import java.util.Optional
import kotlin.math.abs
import kotlin.math.max
class StickerKeyboardPageFragment :
LoggingFragment(R.layout.keyboard_pager_sticker_page_fragment),
@@ -48,6 +51,7 @@ class StickerKeyboardPageFragment :
private val packIdSelectionOnScroll: UpdatePackSelectionOnScroll = UpdatePackSelectionOnScroll()
private val observerThrottler: Throttler = Throttler(500)
private val stickerThrottler: Throttler = Throttler(100)
private var firstLoad: Boolean = true
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@@ -72,6 +76,7 @@ class StickerKeyboardPageFragment :
stickerList.adapter = stickerListAdapter
stickerList.addOnItemTouchListener(listTouchListener)
stickerList.addOnScrollListener(packIdSelectionOnScroll)
stickerList.addItemDecoration(InsetItemDecoration(StickerInsetSetter()))
stickerPacksRecycler = view.findViewById(R.id.sticker_packs_recycler)
@@ -106,13 +111,22 @@ class StickerKeyboardPageFragment :
viewModel = ViewModelProviders.of(requireActivity(), StickerKeyboardPageViewModel.Factory(requireContext()))
.get(StickerKeyboardPageViewModel::class.java)
viewModel.stickers.observe(viewLifecycleOwner, stickerListAdapter::submitList)
viewModel.stickers.observe(viewLifecycleOwner, this::updateStickerList)
viewModel.packs.observe(viewLifecycleOwner, stickerPacksAdapter::submitList)
viewModel.getSelectedPack().observe(viewLifecycleOwner, this::updateCategoryTab)
viewModel.refreshStickers()
}
private fun updateStickerList(stickers: MappingModelList) {
if (firstLoad) {
stickerListAdapter.submitList(stickers) { layoutManager.scrollToPositionWithOffset(1, 0) }
firstLoad = false
} else {
stickerListAdapter.submitList(stickers)
}
}
private fun onTabSelected(stickerPack: KeyboardStickerPackListAdapter.StickerPack) {
scrollTo(stickerPack.packRecord.packId)
viewModel.selectPack(stickerPack.packRecord.packId)
@@ -188,9 +202,8 @@ class StickerKeyboardPageFragment :
}
private fun calculateColumnCount(@Px screenWidth: Int): Int {
val modifier = resources.getDimensionPixelOffset(R.dimen.sticker_page_item_padding).toFloat()
val divisor = resources.getDimensionPixelOffset(R.dimen.sticker_page_item_divisor).toFloat()
return ((screenWidth - modifier) / divisor).toInt()
val divisor = resources.getDimensionPixelOffset(R.dimen.sticker_page_item_width).toFloat() + resources.getDimensionPixelOffset(R.dimen.sticker_page_item_padding).toFloat()
return max(1, (screenWidth / divisor).toInt())
}
private inner class UpdatePackSelectionOnScroll : RecyclerView.OnScrollListener() {

View File

@@ -16,7 +16,9 @@ import org.thoughtcrime.securesms.keyboard.findListener
import org.thoughtcrime.securesms.mms.GlideApp
import org.thoughtcrime.securesms.stickers.StickerEventListener
import org.thoughtcrime.securesms.util.DeviceProperties
import org.thoughtcrime.securesms.util.InsetItemDecoration
import org.thoughtcrime.securesms.util.ViewUtil
import kotlin.math.max
/**
* Search dialog for finding stickers.
@@ -50,6 +52,7 @@ class StickerSearchDialogFragment : DialogFragment(), KeyboardStickerListAdapter
list.layoutManager = layoutManager
list.adapter = adapter
list.addItemDecoration(InsetItemDecoration(StickerInsetSetter()))
val viewModel: StickerSearchViewModel = ViewModelProviders.of(this, StickerSearchViewModel.Factory(requireContext())).get(StickerSearchViewModel::class.java)
@@ -80,9 +83,8 @@ class StickerSearchDialogFragment : DialogFragment(), KeyboardStickerListAdapter
}
private fun calculateColumnCount(@Px screenWidth: Int): Int {
val modifier = resources.getDimensionPixelOffset(R.dimen.sticker_page_item_padding).toFloat()
val divisor = resources.getDimensionPixelOffset(R.dimen.sticker_page_item_divisor).toFloat()
return ((screenWidth - modifier) / divisor).toInt()
val divisor = resources.getDimensionPixelOffset(R.dimen.sticker_page_item_width).toFloat() + resources.getDimensionPixelOffset(R.dimen.sticker_page_item_padding).toFloat()
return max(1, (screenWidth / divisor).toInt())
}
override fun onStickerClicked(sticker: KeyboardStickerListAdapter.Sticker) {

View File

@@ -219,7 +219,7 @@ public final class ReactWithAnyEmojiBottomSheetDialogFragment extends BottomShee
emojiPageView.addOnScrollListener(new TopAndBottomShadowHelper(requireView().findViewById(R.id.react_with_any_emoji_top_shadow),
tabBar.findViewById(R.id.react_with_any_emoji_bottom_shadow)));
viewModel.getEmojiList().observe(getViewLifecycleOwner(), pages -> emojiPageView.setList(pages));
viewModel.getEmojiList().observe(getViewLifecycleOwner(), pages -> emojiPageView.setList(pages, null));
viewModel.getCategories().observe(getViewLifecycleOwner(), categoriesAdapter::submitList);
viewModel.getSelectedKey().observe(getViewLifecycleOwner(), key -> categoriesRecycler.post(() -> {
int index = categoriesAdapter.indexOfFirst(EmojiKeyboardPageCategoryMappingModel.class, m -> m.getKey().equals(key));