Fix partial emoji swiping (#1645)

This commit is contained in:
Eran Leshem 2025-05-30 23:49:37 +03:00 committed by GitHub
parent 92b1907c61
commit 4d441e5bdf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -6,6 +6,9 @@
package helium314.keyboard.keyboard.emoji;
import java.util.HashMap;
import java.util.Map;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
@ -68,9 +71,21 @@ public final class EmojiPalettesView extends LinearLayout
private final class PagerAdapter extends RecyclerView.Adapter<PagerViewHolder> {
private boolean mInitialized;
private Map<Integer, RecyclerView> mViews = new HashMap<>(mEmojiCategory.getShownCategories().size());
private PagerAdapter() {
private PagerAdapter(ViewPager2 pager) {
setHasStableIds(true);
pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
var categoryId = (int) getItemId(position);
setCurrentCategoryId(categoryId, false);
var recyclerView = mViews.get(position);
if (recyclerView != null) {
updateState(recyclerView, categoryId);
}
}
});
}
@Override
@ -94,7 +109,7 @@ public final class EmojiPalettesView extends LinearLayout
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
updateState(recyclerView, viewHolder);
updateState(recyclerView, viewHolder.mCategoryId);
}
});
@ -106,6 +121,7 @@ public final class EmojiPalettesView extends LinearLayout
public void onBindViewHolder(PagerViewHolder holder, int position) {
holder.mCategoryId = getItemId(position);
var recyclerView = getRecyclerView(holder.itemView);
mViews.put(position, recyclerView);
recyclerView.setAdapter(new EmojiPalettesAdapter(mEmojiCategory, (int) holder.mCategoryId,
EmojiPalettesView.this));
@ -120,16 +136,6 @@ public final class EmojiPalettesView extends LinearLayout
return mEmojiCategory.getShownCategories().size();
}
@Override
public void onViewAttachedToWindow(PagerViewHolder holder) {
if (mPager.getScrollState() == ViewPager2.SCROLL_STATE_DRAGGING // swipe
|| holder.getBindingAdapterPosition() == mPager.getCurrentItem() // tab
) {
setCurrentCategoryId((int) getItemId(holder.getBindingAdapterPosition()), false);
updateState(getRecyclerView(holder.itemView), holder);
}
}
@Override
public void onViewDetachedFromWindow(PagerViewHolder holder) {
if (holder.mCategoryId == EmojiCategory.ID_RECENTS) {
@ -150,8 +156,8 @@ public final class EmojiPalettesView extends LinearLayout
return view.findViewById(R.id.emoji_keyboard_list);
}
private void updateState(@NonNull RecyclerView recyclerView, PagerViewHolder viewHolder) {
if (viewHolder.mCategoryId != mEmojiCategory.getCurrentCategoryId()) {
private void updateState(@NonNull RecyclerView recyclerView, long categoryId) {
if (categoryId != mEmojiCategory.getCurrentCategoryId()) {
return;
}
@ -242,7 +248,7 @@ public final class EmojiPalettesView extends LinearLayout
}
mPager = findViewById(R.id.emoji_pager);
mPager.setAdapter(new PagerAdapter());
mPager.setAdapter(new PagerAdapter(mPager));
mEmojiLayoutParams.setEmojiListProperties(mPager);
mEmojiCategoryPageIndicatorView = findViewById(R.id.emoji_category_page_id_view);
mEmojiLayoutParams.setCategoryPageIdViewProperties(mEmojiCategoryPageIndicatorView);