Implemented continuous scrolling for emoji keyboards

This commit is contained in:
pdroidandroid@gmail.com 2021-09-12 17:30:26 +02:00
parent b775e0d878
commit 02e2051b33
25 changed files with 190 additions and 185 deletions

View file

@ -76,6 +76,15 @@ final class DynamicGridKeyboard extends Keyboard {
throw new RuntimeException("Can't find template key: code=" + code);
}
public int getDynamicOccupiedHeight() {
final int row = (mGridKeys.size() - 1) / mColumnsNum + 1;
return row * mVerticalStep;
}
public int getColumnsCount() {
return mColumnsNum;
}
public void addPendingKey(final Key usedKey) {
synchronized (mLock) {
mPendingKeys.addLast(usedKey);

View file

@ -21,9 +21,7 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
import android.util.Log;
import android.util.Pair;
import androidx.core.graphics.PaintCompat;
import org.dslul.openboard.inputmethod.keyboard.Key;
@ -56,6 +54,8 @@ final class EmojiCategory {
private static final int ID_FLAGS = 9;
private static final int ID_EMOTICONS = 10;
private static final int MAX_LINE_COUNT_PER_PAGE = 3;
public final class CategoryProperties {
public final int mCategoryId;
public final int mPageCount;
@ -119,7 +119,7 @@ final class EmojiCategory {
private final SharedPreferences mPrefs;
private final Resources mRes;
private final int mMaxPageKeyCount;
private final int mMaxRecentsKeyCount;
private final KeyboardLayoutSet mLayoutSet;
private final HashMap<String, Integer> mCategoryNameToIdMap = new HashMap<>();
private final int[] mCategoryTabIconId = new int[sCategoryName.length];
@ -134,7 +134,7 @@ final class EmojiCategory {
final KeyboardLayoutSet layoutSet, final TypedArray emojiPaletteViewAttr) {
mPrefs = prefs;
mRes = res;
mMaxPageKeyCount = res.getInteger(R.integer.config_emoji_keyboard_max_page_key_count);
mMaxRecentsKeyCount = res.getInteger(R.integer.config_emoji_keyboard_max_recents_key_count);
mLayoutSet = layoutSet;
for (int i = 0; i < sCategoryName.length; ++i) {
mCategoryNameToIdMap.put(sCategoryName[i], i);
@ -170,7 +170,7 @@ final class EmojiCategory {
mCurrentCategoryId = defaultCategoryId;
}
if (mCurrentCategoryPageId >= getCategoryPageCount(mCurrentCategoryId)) {
if (mCurrentCategoryPageId >= computeCategoryPageCount(mCurrentCategoryId)) {
mCurrentCategoryPageId = 0;
}
}
@ -179,7 +179,7 @@ final class EmojiCategory {
// Load a keyboard of categoryId
getKeyboard(categoryId, 0 /* categoryPageId */);
final CategoryProperties properties =
new CategoryProperties(categoryId, getCategoryPageCount(categoryId));
new CategoryProperties(categoryId, computeCategoryPageCount(categoryId));
mShownCategories.add(properties);
}
@ -217,11 +217,11 @@ final class EmojiCategory {
return mCurrentCategoryId;
}
public int getCurrentCategoryPageSize() {
return getCategoryPageSize(mCurrentCategoryId);
public int getCurrentCategoryPageCount() {
return getCategoryPageCount(mCurrentCategoryId);
}
public int getCategoryPageSize(final int categoryId) {
public int getCategoryPageCount(final int categoryId) {
for (final CategoryProperties prop : mShownCategories) {
if (prop.mCategoryId == categoryId) {
return prop.mPageCount;
@ -283,38 +283,21 @@ final class EmojiCategory {
return getTabIdFromCategoryId(EmojiCategory.ID_RECENTS);
}
private int getCategoryPageCount(final int categoryId) {
private int computeCategoryPageCount(final int categoryId) {
final Keyboard keyboard = mLayoutSet.getKeyboard(sCategoryElementId[categoryId]);
return (keyboard.getSortedKeys().size() - 1) / mMaxPageKeyCount + 1;
return (keyboard.getSortedKeys().size() - 1) / computeMaxKeyCountPerPage() + 1;
}
// Returns a pair of the category id and the category page id from the view pager's page
// position. The category page id is numbered in each category. And the view page position
// is the position of the current shown page in the view pager which contains all pages of
// all categories.
public Pair<Integer, Integer> getCategoryIdAndPageIdFromPagePosition(final int position) {
int sum = 0;
for (final CategoryProperties properties : mShownCategories) {
final int temp = sum;
sum += properties.mPageCount;
if (sum > position) {
return new Pair<>(properties.mCategoryId, position - temp);
}
// Returns a keyboard from the recycler view's adapter position.
public DynamicGridKeyboard getKeyboardFromAdapterPosition(final int position) {
if (position >= 0 && position < getCurrentCategoryPageCount()) {
return getKeyboard(mCurrentCategoryId, position);
}
Log.w(TAG, "invalid position for categoryId : " + mCurrentCategoryId);
return null;
}
// Returns a keyboard from the view pager's page position.
public DynamicGridKeyboard getKeyboardFromPagePosition(final int position) {
final Pair<Integer, Integer> categoryAndId =
getCategoryIdAndPageIdFromPagePosition(position);
if (categoryAndId != null) {
return getKeyboard(categoryAndId.first, categoryAndId.second);
}
return null;
}
private static final Long getCategoryKeyboardMapKey(final int categoryId, final int id) {
private static Long getCategoryKeyboardMapKey(final int categoryId, final int id) {
return (((long) categoryId) << Integer.SIZE) | id;
}
@ -328,19 +311,20 @@ final class EmojiCategory {
if (categoryId == EmojiCategory.ID_RECENTS) {
final DynamicGridKeyboard kbd = new DynamicGridKeyboard(mPrefs,
mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS),
mMaxPageKeyCount, categoryId);
mMaxRecentsKeyCount, categoryId);
mCategoryKeyboardMap.put(categoryKeyboardMapKey, kbd);
return kbd;
}
final Keyboard keyboard = mLayoutSet.getKeyboard(sCategoryElementId[categoryId]);
final Key[][] sortedKeys = sortKeysIntoPages(
keyboard.getSortedKeys(), mMaxPageKeyCount);
for (int pageId = 0; pageId < sortedKeys.length; ++pageId) {
final int keyCountPerPage = computeMaxKeyCountPerPage();
final Key[][] sortedKeysPages = sortKeysGrouped(
keyboard.getSortedKeys(), keyCountPerPage);
for (int pageId = 0; pageId < sortedKeysPages.length; ++pageId) {
final DynamicGridKeyboard tempKeyboard = new DynamicGridKeyboard(mPrefs,
mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS),
mMaxPageKeyCount, categoryId);
for (final Key emojiKey : sortedKeys[pageId]) {
keyCountPerPage, categoryId);
for (final Key emojiKey : sortedKeysPages[pageId]) {
if (emojiKey == null) {
break;
}
@ -353,37 +337,33 @@ final class EmojiCategory {
}
}
public int getTotalPageCountOfAllCategories() {
int sum = 0;
for (CategoryProperties properties : mShownCategories) {
sum += properties.mPageCount;
}
return sum;
private int computeMaxKeyCountPerPage() {
final DynamicGridKeyboard tempKeyboard = new DynamicGridKeyboard(mPrefs,
mLayoutSet.getKeyboard(KeyboardId.ELEMENT_EMOJI_RECENTS),
0, 0);
return MAX_LINE_COUNT_PER_PAGE * tempKeyboard.getColumnsCount();
}
private static Comparator<Key> EMOJI_KEY_COMPARATOR = new Comparator<Key>() {
@Override
public int compare(final Key lhs, final Key rhs) {
final Rect lHitBox = lhs.getHitBox();
final Rect rHitBox = rhs.getHitBox();
if (lHitBox.top < rHitBox.top) {
return -1;
} else if (lHitBox.top > rHitBox.top) {
return 1;
}
if (lHitBox.left < rHitBox.left) {
return -1;
} else if (lHitBox.left > rHitBox.left) {
return 1;
}
if (lhs.getCode() == rhs.getCode()) {
return 0;
}
return lhs.getCode() < rhs.getCode() ? -1 : 1;
private static final Comparator<Key> EMOJI_KEY_COMPARATOR = (lhs, rhs) -> {
final Rect lHitBox = lhs.getHitBox();
final Rect rHitBox = rhs.getHitBox();
if (lHitBox.top < rHitBox.top) {
return -1;
} else if (lHitBox.top > rHitBox.top) {
return 1;
}
if (lHitBox.left < rHitBox.left) {
return -1;
} else if (lHitBox.left > rHitBox.left) {
return 1;
}
if (lhs.getCode() == rhs.getCode()) {
return 0;
}
return lhs.getCode() < rhs.getCode() ? -1 : 1;
};
private static Key[][] sortKeysIntoPages(final List<Key> inKeys, final int maxPageCount) {
private static Key[][] sortKeysGrouped(final List<Key> inKeys, final int maxPageCount) {
final ArrayList<Key> keys = new ArrayList<>(inKeys);
Collections.sort(keys, EMOJI_KEY_COMPARATOR);
final int pageCount = (keys.size() - 1) / maxPageCount + 1;

View file

@ -61,9 +61,9 @@ public final class EmojiCategoryPageIndicatorView extends View {
final float height = getHeight();
final float width = getWidth();
final float unitWidth = width / mCategoryPageSize;
final float left = unitWidth * mCurrentCategoryPageId + mOffset * unitWidth;
final float left = Math.min(unitWidth * mCurrentCategoryPageId + mOffset * unitWidth, width - unitWidth);
final float top = 0.0f;
final float right = left + unitWidth;
final float right = Math.min(left + unitWidth, width);
final float bottom = height * BOTTOM_MARGIN_RATIO;
canvas.drawRect(left, top, right, bottom, mPaint);
}

View file

@ -20,17 +20,16 @@ import android.content.res.Resources;
import android.view.View;
import android.widget.LinearLayout;
import androidx.recyclerview.widget.RecyclerView;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;
final class EmojiLayoutParams {
private static final int DEFAULT_KEYBOARD_ROWS = 4;
public final int mEmojiPagerHeight;
private final int mEmojiPagerBottomMargin;
public final int mEmojiListHeight;
private final int mEmojiListBottomMargin;
public final int mEmojiKeyboardHeight;
private final int mEmojiCategoryPageIdViewHeight;
public final int mEmojiActionBarHeight;
@ -56,16 +55,16 @@ final class EmojiLayoutParams {
+ mKeyVerticalGap;
mEmojiActionBarHeight = baseheight / DEFAULT_KEYBOARD_ROWS
- (mKeyVerticalGap - mBottomPadding) / 2;
mEmojiPagerHeight = defaultKeyboardHeight - mEmojiActionBarHeight
mEmojiListHeight = defaultKeyboardHeight - mEmojiActionBarHeight
- mEmojiCategoryPageIdViewHeight;
mEmojiPagerBottomMargin = 0;
mEmojiKeyboardHeight = mEmojiPagerHeight - mEmojiPagerBottomMargin - 1;
mEmojiListBottomMargin = 0;
mEmojiKeyboardHeight = mEmojiListHeight - mEmojiListBottomMargin - 1;
}
public void setPagerProperties(final ViewPager2 vp) {
public void setEmojiListProperties(final RecyclerView vp) {
final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) vp.getLayoutParams();
lp.height = mEmojiKeyboardHeight;
lp.bottomMargin = mEmojiPagerBottomMargin;
lp.bottomMargin = mEmojiListBottomMargin;
vp.setLayoutParams(lp);
}

View file

@ -113,6 +113,20 @@ final class EmojiPageKeyboardView extends KeyboardView implements
mMoreKeysKeyboardContainer = inflater.inflate(moreKeysKeyboardLayoutId, null);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final Keyboard keyboard = getKeyboard();
if (keyboard instanceof DynamicGridKeyboard) {
final int width = keyboard.mOccupiedWidth + getPaddingLeft() + getPaddingRight();
final int occupiedHeight =
((DynamicGridKeyboard) keyboard).getDynamicOccupiedHeight();
final int height = occupiedHeight + getPaddingTop() + getPaddingBottom();
setMeasuredDimension(width, height);
return;
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public void setHardwareAcceleratedDrawingEnabled(final boolean enabled) {
super.setHardwareAcceleratedDrawingEnabled(enabled);
@ -173,9 +187,7 @@ final class EmojiPageKeyboardView extends KeyboardView implements
Keyboard moreKeysKeyboard = mMoreKeysKeyboardCache.get(key);
if (moreKeysKeyboard == null) {
final MoreKeysKeyboard.Builder builder = new MoreKeysKeyboard.Builder(
getContext(), key, getKeyboard(),
true, key.getWidth(), key.getHeight(), // TODO This is cheating
newLabelPaint(key));
getContext(), key, getKeyboard(), false, 0, 0, newLabelPaint(key));
moreKeysKeyboard = builder.build();
mMoreKeysKeyboardCache.put(key, moreKeysKeyboard);
}
@ -382,9 +394,6 @@ final class EmojiPageKeyboardView extends KeyboardView implements
final Runnable pendingKeyDown = mPendingKeyDown;
final Key currentKey = mCurrentKey;
releaseCurrentKey(false /* withKeyRegistering */);
if (key == null) {
return false;
}
final boolean isShowingMoreKeysPanel = isShowingMoreKeysPanel();
if (isShowingMoreKeysPanel) {
@ -402,7 +411,7 @@ final class EmojiPageKeyboardView extends KeyboardView implements
callListenerOnReleaseKey(key, true /* withRegistering */);
}
}, KEY_RELEASE_DELAY_TIME);
} else {
} else if (key != null) {
callListenerOnReleaseKey(key, true /* withRegistering */);
}

View file

@ -182,7 +182,7 @@ final class EmojiPalettesAdapter extends RecyclerView.Adapter<EmojiPalettesAdapt
mActiveKeyboardViews.remove(position);
}
final Keyboard keyboard =
mEmojiCategory.getKeyboardFromPagePosition(position);
mEmojiCategory.getKeyboardFromAdapterPosition(position);
holder.getKeyboardView().setKeyboard(keyboard);
holder.getKeyboardView().setOnKeyEventListener(mListener);
//parent.addView(keyboardView);
@ -201,10 +201,9 @@ final class EmojiPalettesAdapter extends RecyclerView.Adapter<EmojiPalettesAdapt
@Override
public int getItemCount() {
return mEmojiCategory.getTotalPageCountOfAllCategories();
return mEmojiCategory.getCurrentCategoryPageCount();
}
static class ViewHolder extends RecyclerView.ViewHolder {
private EmojiPageKeyboardView customView;

View file

@ -21,7 +21,6 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Pair;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@ -34,6 +33,9 @@ import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabWidget;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.dslul.openboard.inputmethod.compat.TabHostCompat;
import org.dslul.openboard.inputmethod.keyboard.Key;
import org.dslul.openboard.inputmethod.keyboard.KeyboardActionListener;
@ -46,10 +48,12 @@ import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager;
import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.RichInputMethodSubtype;
import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.settings.Settings;
import org.dslul.openboard.inputmethod.latin.settings.SettingsValues;
import org.dslul.openboard.inputmethod.latin.utils.DeviceProtectedUtils;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
import androidx.viewpager2.widget.ViewPager2;
import org.jetbrains.annotations.NotNull;
import static org.dslul.openboard.inputmethod.latin.common.Constants.NOT_A_COORDINATE;
@ -78,6 +82,7 @@ public final class EmojiPalettesView extends LinearLayout
private EmojiPalettesAdapter mEmojiPalettesAdapter;
private final EmojiLayoutParams mEmojiLayoutParams;
private final DeleteKeyOnTouchListener mDeleteKeyOnTouchListener;
private final LinearLayoutManager mEmojiLayoutManager;
private ImageButton mDeleteKey;
private TextView mAlphabetKeyLeft;
@ -85,8 +90,7 @@ public final class EmojiPalettesView extends LinearLayout
// TODO: Remove this workaround.
private View mSpacebarIcon;
private TabHostCompat mTabHost;
private ViewPager2 mEmojiPager;
private int mCurrentPagerPosition = 0;
private RecyclerView mEmojiRecyclerView;
private EmojiCategoryPageIndicatorView mEmojiCategoryPageIndicatorView;
private KeyboardActionListener mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER;
@ -132,6 +136,7 @@ public final class EmojiPalettesView extends LinearLayout
R.styleable.EmojiPalettesView_categoryPageIndicatorBackground, 0);
emojiPalettesViewAttr.recycle();
mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener();
mEmojiLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
}
@Override
@ -164,6 +169,7 @@ public final class EmojiPalettesView extends LinearLayout
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mTabHost = findViewById(R.id.emoji_category_tabhost);
mTabHost.setup();
for (final EmojiCategory.CategoryProperties properties
@ -183,51 +189,41 @@ public final class EmojiPalettesView extends LinearLayout
mEmojiPalettesAdapter = new EmojiPalettesAdapter(mEmojiCategory, this);
mEmojiPager = findViewById(R.id.emoji_keyboard_pager);
mEmojiPager.setAdapter(mEmojiPalettesAdapter);
mEmojiPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
mEmojiRecyclerView = findViewById(R.id.emoji_keyboard_list);
mEmojiRecyclerView.setLayoutManager(mEmojiLayoutManager);
mEmojiRecyclerView.setAdapter(mEmojiPalettesAdapter);
mEmojiRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
mEmojiPalettesAdapter.onPageScrolled();
final Pair<Integer, Integer> newPos =
mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position);
final int newCategoryId = newPos.first;
final int newCategorySize = mEmojiCategory.getCategoryPageSize(newCategoryId);
final int currentCategoryId = mEmojiCategory.getCurrentCategoryId();
final int currentCategoryPageId = mEmojiCategory.getCurrentCategoryPageId();
final int currentCategorySize = mEmojiCategory.getCurrentCategoryPageSize();
if (newCategoryId == currentCategoryId) {
mEmojiCategoryPageIndicatorView.setCategoryPageId(
newCategorySize, newPos.second, positionOffset);
} else if (newCategoryId > currentCategoryId) {
mEmojiCategoryPageIndicatorView.setCategoryPageId(
currentCategorySize, currentCategoryPageId, positionOffset);
} else if (newCategoryId < currentCategoryId) {
mEmojiCategoryPageIndicatorView.setCategoryPageId(
currentCategorySize, currentCategoryPageId, positionOffset - 1);
}
}
@Override
public void onPageSelected(int position) {
final Pair<Integer, Integer> newPos =
mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position);
setCurrentCategoryAndPageId(newPos.first /* categoryId */, newPos.second /* categoryPageId */,
false /* force */);
updateEmojiCategoryPageIdView();
mCurrentPagerPosition = position;
}
@Override
public void onPageScrollStateChanged(int state) {
public void onScrollStateChanged(@NonNull @NotNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// Ignore this message. Only want the actual page selected.
}
@Override
public void onScrolled(@NonNull @NotNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
mEmojiPalettesAdapter.onPageScrolled();
final int offset = recyclerView.computeVerticalScrollOffset();
final int extent = recyclerView.computeVerticalScrollExtent();
final int range = recyclerView.computeVerticalScrollRange();
final float percentage = offset / (float) (range - extent);
final int currentCategorySize = mEmojiCategory.getCurrentCategoryPageCount();
final int a = (int) (percentage * currentCategorySize);
final float b = percentage * currentCategorySize - a;
mEmojiCategoryPageIndicatorView.setCategoryPageId(
currentCategorySize, a, b);
final int firstCompleteVisibleBoard = mEmojiLayoutManager.findFirstCompletelyVisibleItemPosition();
final int firstVisibleBoard = mEmojiLayoutManager.findFirstVisibleItemPosition();
mEmojiCategory.setCurrentCategoryPageId(
firstCompleteVisibleBoard > 0 ? firstCompleteVisibleBoard : firstVisibleBoard);
}
});
mEmojiPager.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);
mEmojiPager.setPersistentDrawingCache(PERSISTENT_NO_CACHE);
mEmojiLayoutParams.setPagerProperties(mEmojiPager);
mEmojiRecyclerView.setPersistentDrawingCache(PERSISTENT_NO_CACHE);
mEmojiLayoutParams.setEmojiListProperties(mEmojiRecyclerView);
mEmojiCategoryPageIndicatorView =
findViewById(R.id.emoji_category_page_id_view);
@ -283,8 +279,10 @@ public final class EmojiPalettesView extends LinearLayout
AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback(
Constants.CODE_UNSPECIFIED, this);
final int categoryId = mEmojiCategory.getCategoryId(tabId);
setCurrentCategoryAndPageId(categoryId, 0, false /* force */);
updateEmojiCategoryPageIdView();
if (categoryId != mEmojiCategory.getCurrentCategoryId()) {
setCurrentCategoryAndPageId(categoryId, 0, false /* force */);
updateEmojiCategoryPageIdView();
}
}
/**
@ -388,14 +386,17 @@ public final class EmojiPalettesView extends LinearLayout
final KeyDrawParams params = new KeyDrawParams();
params.updateParams(mEmojiLayoutParams.getActionBarHeight(), keyVisualAttr);
setupAlphabetKey(mAlphabetKeyLeft, switchToAlphaLabel, params);
mEmojiPager.setAdapter(mEmojiPalettesAdapter);
mEmojiPager.setCurrentItem(mCurrentPagerPosition, false);
if (mEmojiRecyclerView.getAdapter() == null) {
mEmojiRecyclerView.setAdapter(mEmojiPalettesAdapter);
setCurrentCategoryAndPageId(mEmojiCategory.getCurrentCategoryId(), mEmojiCategory.getCurrentCategoryPageId(),
true /* force */);
}
}
public void stopEmojiPalettes() {
mEmojiPalettesAdapter.releaseCurrentKey(true /* withKeyRegistering */);
mEmojiPalettesAdapter.flushPendingRecentKeys();
mEmojiPager.setAdapter(null);
mEmojiRecyclerView.setAdapter(null);
}
public void setKeyboardActionListener(final KeyboardActionListener listener) {
@ -408,19 +409,14 @@ public final class EmojiPalettesView extends LinearLayout
return;
}
mEmojiCategoryPageIndicatorView.setCategoryPageId(
mEmojiCategory.getCurrentCategoryPageSize(),
mEmojiCategory.getCurrentCategoryPageCount(),
mEmojiCategory.getCurrentCategoryPageId(), 0.0f /* offset */);
}
private void setCurrentCategoryAndPageId(final int categoryId, final int categoryPageId,
final boolean force) {
final int oldCategoryId = mEmojiCategory.getCurrentCategoryId();
final int oldPageId = mEmojiCategory.getCurrentCategoryPageId();
final boolean firstPage = categoryPageId == 0;
mEmojiCategory.setCurrentCategoryPageId(categoryPageId);
if (oldCategoryId == categoryId && (!firstPage || oldPageId == 0) && !force) {
return;
}
final int oldCategoryPageId = mEmojiCategory.getCurrentCategoryPageId();
if (oldCategoryId == EmojiCategory.ID_RECENTS && categoryId != EmojiCategory.ID_RECENTS) {
// Needs to save pending updates for recent keys when we get out of the recents
@ -429,13 +425,11 @@ public final class EmojiPalettesView extends LinearLayout
mEmojiPalettesAdapter.flushPendingRecentKeys();
}
mEmojiCategory.setCurrentCategoryId(categoryId);
final Pair<Integer, Integer> pagerIds = mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(
mEmojiPager.getCurrentItem());
if (force || pagerIds.first != categoryId || (firstPage && pagerIds.second != 0)) {
final int newPagerPageId = mEmojiCategory.getPagerPageIdFromCategoryAndPageId(categoryId, categoryPageId);
final boolean smooth = pagerIds.first == categoryId && firstPage && pagerIds.second != 0;
mEmojiPager.setCurrentItem(newPagerPageId, smooth /* smoothScroll */);
if (force || oldCategoryId != categoryId || oldCategoryPageId != categoryPageId) {
mEmojiCategory.setCurrentCategoryId(categoryId);
mEmojiCategory.setCurrentCategoryPageId(categoryPageId);
mEmojiPalettesAdapter.notifyDataSetChanged();
mEmojiRecyclerView.scrollToPosition(categoryPageId);
}
final int newTabId = mEmojiCategory.getTabIdFromCategoryId(categoryId);