emojis vertical swipe

This commit is contained in:
dslul 2020-09-10 19:04:43 +02:00
parent 449749ca9c
commit 98b9a8fdf1
6 changed files with 148 additions and 72 deletions

View file

@ -41,6 +41,7 @@ dependencies {
implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.core:core-ktx:1.3.1' implementation 'androidx.core:core-ktx:1.3.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.viewpager2:viewpager2:1.0.0'
} }
repositories { repositories {
mavenCentral() mavenCentral()

View file

@ -24,6 +24,7 @@ import org.dslul.openboard.inputmethod.latin.R;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils; import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;
final class EmojiLayoutParams { final class EmojiLayoutParams {
private static final int DEFAULT_KEYBOARD_ROWS = 4; private static final int DEFAULT_KEYBOARD_ROWS = 4;
@ -61,7 +62,7 @@ final class EmojiLayoutParams {
mEmojiKeyboardHeight = mEmojiPagerHeight - mEmojiPagerBottomMargin - 1; mEmojiKeyboardHeight = mEmojiPagerHeight - mEmojiPagerBottomMargin - 1;
} }
public void setPagerProperties(final ViewPager vp) { public void setPagerProperties(final ViewPager2 vp) {
final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) vp.getLayoutParams(); final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) vp.getLayoutParams();
lp.height = mEmojiKeyboardHeight; lp.height = mEmojiKeyboardHeight;
lp.bottomMargin = mEmojiPagerBottomMargin; lp.bottomMargin = mEmojiPagerBottomMargin;

View file

@ -27,9 +27,10 @@ import org.dslul.openboard.inputmethod.keyboard.Keyboard;
import org.dslul.openboard.inputmethod.keyboard.KeyboardView; import org.dslul.openboard.inputmethod.keyboard.KeyboardView;
import org.dslul.openboard.inputmethod.latin.R; import org.dslul.openboard.inputmethod.latin.R;
import androidx.viewpager.widget.PagerAdapter; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
final class EmojiPalettesAdapter extends PagerAdapter { final class EmojiPalettesAdapter extends RecyclerView.Adapter<EmojiPalettesAdapter.ViewHolder>{
private static final String TAG = EmojiPalettesAdapter.class.getSimpleName(); private static final String TAG = EmojiPalettesAdapter.class.getSimpleName();
private static final boolean DEBUG_PAGER = false; private static final boolean DEBUG_PAGER = false;
@ -83,25 +84,7 @@ final class EmojiPalettesAdapter extends PagerAdapter {
currentKeyboardView.releaseCurrentKey(withKeyRegistering); currentKeyboardView.releaseCurrentKey(withKeyRegistering);
} }
@Override /*
public int getCount() {
return mEmojiCategory.getTotalPageCountOfAllCategories();
}
@Override
public void setPrimaryItem(final ViewGroup container, final int position,
final Object object) {
if (mActivePosition == position) {
return;
}
final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(mActivePosition);
if (oldKeyboardView != null) {
oldKeyboardView.releaseCurrentKey(false /* withKeyRegistering */);
oldKeyboardView.deallocateMemory();
}
mActivePosition = position;
}
@Override @Override
public Object instantiateItem(final ViewGroup container, final int position) { public Object instantiateItem(final ViewGroup container, final int position) {
if (DEBUG_PAGER) { if (DEBUG_PAGER) {
@ -116,8 +99,8 @@ final class EmojiPalettesAdapter extends PagerAdapter {
final Keyboard keyboard = final Keyboard keyboard =
mEmojiCategory.getKeyboardFromPagePosition(position); mEmojiCategory.getKeyboardFromPagePosition(position);
final LayoutInflater inflater = LayoutInflater.from(container.getContext()); final LayoutInflater inflater = LayoutInflater.from(container.getContext());
final EmojiPageKeyboardView keyboardView = (EmojiPageKeyboardView)inflater.inflate( final EmojiPageKeyboardView keyboardView = (EmojiPageKeyboardView) inflater.inflate(
R.layout.emoji_keyboard_page, container, false /* attachToRoot */); R.layout.emoji_keyboard_page, container, false);
keyboardView.setKeyboard(keyboard); keyboardView.setKeyboard(keyboard);
keyboardView.setOnKeyEventListener(mListener); keyboardView.setOnKeyEventListener(mListener);
container.addView(keyboardView); container.addView(keyboardView);
@ -125,6 +108,20 @@ final class EmojiPalettesAdapter extends PagerAdapter {
return keyboardView; return keyboardView;
} }
@Override
public void setPrimaryItem(final ViewGroup container, final int position,
final Object object) {
if (mActivePosition == position) {
return;
}
final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(mActivePosition);
if (oldKeyboardView != null) {
oldKeyboardView.releaseCurrentKey(false);
oldKeyboardView.deallocateMemory();
}
mActivePosition = position;
}
@Override @Override
public boolean isViewFromObject(final View view, final Object object) { public boolean isViewFromObject(final View view, final Object object) {
return view == object; return view == object;
@ -147,4 +144,79 @@ final class EmojiPalettesAdapter extends PagerAdapter {
Log.w(TAG, "Warning!!! Emoji palette may be leaking. " + object); Log.w(TAG, "Warning!!! Emoji palette may be leaking. " + object);
} }
} }
*/
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
/*if (DEBUG_PAGER) {
Log.d(TAG, "instantiate item: " + viewType);
}
final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(viewType);
if (oldKeyboardView != null) {
oldKeyboardView.deallocateMemory();
// This may be redundant but wanted to be safer..
mActiveKeyboardViews.remove(viewType);
}
final Keyboard keyboard =
mEmojiCategory.getKeyboardFromPagePosition(parent.getVerticalScrollbarPosition());*/
final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
final EmojiPageKeyboardView keyboardView = (EmojiPageKeyboardView)inflater.inflate(
R.layout.emoji_keyboard_page, parent, false);
/*keyboardView.setKeyboard(keyboard);
keyboardView.setOnKeyEventListener(mListener);
parent.addView(keyboardView);
mActiveKeyboardViews.put(parent.getVerticalScrollbarPosition(), keyboardView);*/
return new ViewHolder(keyboardView);
}
@Override
public void onBindViewHolder(@NonNull EmojiPalettesAdapter.ViewHolder holder, int position) {
if (DEBUG_PAGER) {
Log.d(TAG, "instantiate item: " + position);
}
final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(position);
if (oldKeyboardView != null) {
oldKeyboardView.deallocateMemory();
// This may be redundant but wanted to be safer..
mActiveKeyboardViews.remove(position);
}
final Keyboard keyboard =
mEmojiCategory.getKeyboardFromPagePosition(position);
holder.getKeyboardView().setKeyboard(keyboard);
holder.getKeyboardView().setOnKeyEventListener(mListener);
//parent.addView(keyboardView);
mActiveKeyboardViews.put(position, holder.getKeyboardView());
/*if (mActivePosition == position) {
return;
}
final EmojiPageKeyboardView oldKeyboardView = mActiveKeyboardViews.get(mActivePosition);
if (oldKeyboardView != null) {
oldKeyboardView.releaseCurrentKey(false);
oldKeyboardView.deallocateMemory();
}
mActivePosition = position;*/
}
@Override
public int getItemCount() {
return mEmojiCategory.getTotalPageCountOfAllCategories();
}
static class ViewHolder extends RecyclerView.ViewHolder {
private EmojiPageKeyboardView customView;
public ViewHolder(View v) {
super(v);
customView = (EmojiPageKeyboardView) v;
}
public EmojiPageKeyboardView getKeyboardView() {
return customView;
}
}
} }

View file

@ -49,6 +49,7 @@ import org.dslul.openboard.inputmethod.latin.common.Constants;
import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils; import org.dslul.openboard.inputmethod.latin.utils.ResourceUtils;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;
import static org.dslul.openboard.inputmethod.latin.common.Constants.NOT_A_COORDINATE; import static org.dslul.openboard.inputmethod.latin.common.Constants.NOT_A_COORDINATE;
@ -63,9 +64,9 @@ import static org.dslul.openboard.inputmethod.latin.common.Constants.NOT_A_COORD
* </ol> * </ol>
* Because of the above reasons, this class doesn't extend {@link KeyboardView}. * Because of the above reasons, this class doesn't extend {@link KeyboardView}.
*/ */
public final class EmojiPalettesView extends LinearLayout implements OnTabChangeListener, public final class EmojiPalettesView extends LinearLayout
ViewPager.OnPageChangeListener, View.OnClickListener, View.OnTouchListener, implements OnTabChangeListener, View.OnClickListener, View.OnTouchListener,
EmojiPageKeyboardView.OnKeyEventListener { EmojiPageKeyboardView.OnKeyEventListener{
private final int mFunctionalKeyBackgroundId; private final int mFunctionalKeyBackgroundId;
private final int mSpacebarBackgroundId; private final int mSpacebarBackgroundId;
private final boolean mCategoryIndicatorEnabled; private final boolean mCategoryIndicatorEnabled;
@ -83,7 +84,7 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange
// TODO: Remove this workaround. // TODO: Remove this workaround.
private View mSpacebarIcon; private View mSpacebarIcon;
private TabHost mTabHost; private TabHost mTabHost;
private ViewPager mEmojiPager; private ViewPager2 mEmojiPager;
private int mCurrentPagerPosition = 0; private int mCurrentPagerPosition = 0;
private EmojiCategoryPageIndicatorView mEmojiCategoryPageIndicatorView; private EmojiCategoryPageIndicatorView mEmojiCategoryPageIndicatorView;
@ -183,8 +184,46 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange
mEmojiPager = findViewById(R.id.emoji_keyboard_pager); mEmojiPager = findViewById(R.id.emoji_keyboard_pager);
mEmojiPager.setAdapter(mEmojiPalettesAdapter); mEmojiPager.setAdapter(mEmojiPalettesAdapter);
mEmojiPager.setOnPageChangeListener(this);
mEmojiPager.setOffscreenPageLimit(0); mEmojiPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@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);
setCurrentCategoryId(newPos.first /* categoryId */, false /* force */);
mEmojiCategory.setCurrentCategoryPageId(newPos.second /* categoryPageId */);
updateEmojiCategoryPageIdView();
mCurrentPagerPosition = position;
}
@Override
public void onPageScrollStateChanged(int state) {
// Ignore this message. Only want the actual page selected.
}
});
mEmojiPager.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);
mEmojiPager.setPersistentDrawingCache(PERSISTENT_NO_CACHE); mEmojiPager.setPersistentDrawingCache(PERSISTENT_NO_CACHE);
mEmojiLayoutParams.setPagerProperties(mEmojiPager); mEmojiLayoutParams.setPagerProperties(mEmojiPager);
@ -243,44 +282,6 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange
updateEmojiCategoryPageIdView(); updateEmojiCategoryPageIdView();
} }
@Override
public void onPageSelected(final int position) {
final Pair<Integer, Integer> newPos =
mEmojiCategory.getCategoryIdAndPageIdFromPagePosition(position);
setCurrentCategoryId(newPos.first /* categoryId */, false /* force */);
mEmojiCategory.setCurrentCategoryPageId(newPos.second /* categoryPageId */);
updateEmojiCategoryPageIdView();
mCurrentPagerPosition = position;
}
@Override
public void onPageScrollStateChanged(final int state) {
// Ignore this message. Only want the actual page selected.
}
@Override
public void onPageScrolled(final int position, final float positionOffset,
final 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);
}
}
/** /**
* Called from {@link EmojiPageKeyboardView} through {@link android.view.View.OnTouchListener} * Called from {@link EmojiPageKeyboardView} through {@link android.view.View.OnTouchListener}
* interface to handle touch events from View-based elements such as the space bar. * interface to handle touch events from View-based elements such as the space bar.

View file

@ -22,5 +22,5 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/emoji_keyboard_page" android:id="@+id/emoji_keyboard_page"
android:layoutDirection="ltr" android:layoutDirection="ltr"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="match_parent" />

View file

@ -59,10 +59,11 @@
</FrameLayout> </FrameLayout>
</TabHost> </TabHost>
</LinearLayout> </LinearLayout>
<androidx.viewpager.widget.ViewPager <androidx.viewpager2.widget.ViewPager2
android:id="@+id/emoji_keyboard_pager" android:id="@+id/emoji_keyboard_pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
android:orientation="vertical" />
<org.dslul.openboard.inputmethod.keyboard.emoji.EmojiCategoryPageIndicatorView <org.dslul.openboard.inputmethod.keyboard.emoji.EmojiCategoryPageIndicatorView
android:id="@+id/emoji_category_page_id_view" android:id="@+id/emoji_category_page_id_view"
android:layout_width="match_parent" android:layout_width="match_parent"