mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-05-19 08:20:15 +00:00
Implemented continuous scrolling for emoji keyboards
This commit is contained in:
parent
b775e0d878
commit
02e2051b33
25 changed files with 190 additions and 185 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue