From 02e2051b332fd1e5557343b2999963ce37f224a5 Mon Sep 17 00:00:00 2001 From: "pdroidandroid@gmail.com" Date: Sun, 12 Sep 2021 17:30:26 +0200 Subject: [PATCH] Implemented continuous scrolling for emoji keyboards --- .../keyboard/emoji/DynamicGridKeyboard.java | 9 ++ .../keyboard/emoji/EmojiCategory.java | 112 +++++++--------- .../emoji/EmojiCategoryPageIndicatorView.java | 4 +- .../keyboard/emoji/EmojiLayoutParams.java | 19 ++- .../keyboard/emoji/EmojiPageKeyboardView.java | 23 +++- .../keyboard/emoji/EmojiPalettesAdapter.java | 5 +- .../keyboard/emoji/EmojiPalettesView.java | 120 +++++++++--------- .../main/res/layout/emoji_palettes_view.xml | 4 +- app/src/main/res/values-land/config.xml | 9 +- .../main/res/values-sw600dp-land/config.xml | 9 +- app/src/main/res/values-sw600dp/config.xml | 9 +- .../main/res/values-sw768dp-land/config.xml | 5 +- app/src/main/res/values-sw768dp/config.xml | 7 +- app/src/main/res/values/config.xml | 7 +- app/src/main/res/xml/kbd_emoji_category1.xml | 3 +- app/src/main/res/xml/kbd_emoji_category10.xml | 3 +- app/src/main/res/xml/kbd_emoji_category2.xml | 3 +- app/src/main/res/xml/kbd_emoji_category3.xml | 3 +- app/src/main/res/xml/kbd_emoji_category4.xml | 3 +- app/src/main/res/xml/kbd_emoji_category5.xml | 3 +- app/src/main/res/xml/kbd_emoji_category6.xml | 4 +- app/src/main/res/xml/kbd_emoji_category7.xml | 3 +- app/src/main/res/xml/kbd_emoji_category8.xml | 3 +- app/src/main/res/xml/kbd_emoji_category9.xml | 3 +- app/src/main/res/xml/kbd_emoji_recents.xml | 2 +- 25 files changed, 190 insertions(+), 185 deletions(-) diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/DynamicGridKeyboard.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/DynamicGridKeyboard.java index 528c5f1ac..79fa46ba4 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/DynamicGridKeyboard.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/DynamicGridKeyboard.java @@ -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); diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategory.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategory.java index a5dab8d2f..1a61ed984 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategory.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategory.java @@ -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 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 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 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 EMOJI_KEY_COMPARATOR = new Comparator() { - @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 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 inKeys, final int maxPageCount) { + private static Key[][] sortKeysGrouped(final List inKeys, final int maxPageCount) { final ArrayList keys = new ArrayList<>(inKeys); Collections.sort(keys, EMOJI_KEY_COMPARATOR); final int pageCount = (keys.size() - 1) / maxPageCount + 1; diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java index da2b21dac..27c06cf66 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiCategoryPageIndicatorView.java @@ -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); } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiLayoutParams.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiLayoutParams.java index 431aa5ed1..607804c7b 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiLayoutParams.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiLayoutParams.java @@ -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); } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java index 7f228e449..cf11c1d54 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPageKeyboardView.java @@ -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 */); } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java index c34b3c7a7..ec59fc0db 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/emoji/EmojiPalettesAdapter.java @@ -182,7 +182,7 @@ final class EmojiPalettesAdapter extends RecyclerView.Adapter 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 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 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); diff --git a/app/src/main/res/layout/emoji_palettes_view.xml b/app/src/main/res/layout/emoji_palettes_view.xml index 4b4fb8a2d..0b65196a5 100644 --- a/app/src/main/res/layout/emoji_palettes_view.xml +++ b/app/src/main/res/layout/emoji_palettes_view.xml @@ -59,8 +59,8 @@ - diff --git a/app/src/main/res/values-land/config.xml b/app/src/main/res/values-land/config.xml index 15e1bbb67..22b811329 100644 --- a/app/src/main/res/values-land/config.xml +++ b/app/src/main/res/values-land/config.xml @@ -77,8 +77,9 @@ 15dp - 10%p - 50%p - 54%p - 20 + 8.33%p + 40%p + 70%p + 70%p + 32 diff --git a/app/src/main/res/values-sw600dp-land/config.xml b/app/src/main/res/values-sw600dp-land/config.xml index d33af2e37..4410c191b 100644 --- a/app/src/main/res/values-sw600dp-land/config.xml +++ b/app/src/main/res/values-sw600dp-land/config.xml @@ -65,8 +65,9 @@ 17dp - 10%p - 33%p - 70%p - 30 + 8.33%p + 40%p + 64%p + 64%p + 36 diff --git a/app/src/main/res/values-sw600dp/config.xml b/app/src/main/res/values-sw600dp/config.xml index 44e0d0632..860a3bcf0 100644 --- a/app/src/main/res/values-sw600dp/config.xml +++ b/app/src/main/res/values-sw600dp/config.xml @@ -82,8 +82,9 @@ 3dp - 12.5%p - 33%p - 60%p - 24 + 11.11%p + 28%p + 78%p + 78%p + 36 diff --git a/app/src/main/res/values-sw768dp-land/config.xml b/app/src/main/res/values-sw768dp-land/config.xml index fdb95c6cc..024985681 100644 --- a/app/src/main/res/values-sw768dp-land/config.xml +++ b/app/src/main/res/values-sw768dp-land/config.xml @@ -65,6 +65,7 @@ 7.69%p 33%p - 60%p - 39 + 58%p + 58%p + 39 diff --git a/app/src/main/res/values-sw768dp/config.xml b/app/src/main/res/values-sw768dp/config.xml index 13be6bedf..a50dac5cc 100644 --- a/app/src/main/res/values-sw768dp/config.xml +++ b/app/src/main/res/values-sw768dp/config.xml @@ -81,7 +81,8 @@ 10%p - 33%p - 68%p - 30 + 30%p + 64%p + 64%p + 39 diff --git a/app/src/main/res/values/config.xml b/app/src/main/res/values/config.xml index e135b318e..5dc7ea951 100644 --- a/app/src/main/res/values/config.xml +++ b/app/src/main/res/values/config.xml @@ -88,9 +88,10 @@ 12.5%p - 33%p - 68%p - 24 + 28%p + 78%p + 78%p + 32