150 lines
5.6 KiB
Java
150 lines
5.6 KiB
Java
/*
|
|
* Copyright (C) 2014 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.inputmethod.keyboard.emoji;
|
|
|
|
import androidx.viewpager.widget.PagerAdapter;
|
|
import android.util.Log;
|
|
import android.util.SparseArray;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
|
|
import com.android.inputmethod.keyboard.Key;
|
|
import com.android.inputmethod.keyboard.Keyboard;
|
|
import com.android.inputmethod.keyboard.KeyboardView;
|
|
import com.android.inputmethod.latin.R;
|
|
|
|
final class EmojiPalettesAdapter extends PagerAdapter {
|
|
private static final String TAG = EmojiPalettesAdapter.class.getSimpleName();
|
|
private static final boolean DEBUG_PAGER = false;
|
|
|
|
private final EmojiPageKeyboardView.OnKeyEventListener mListener;
|
|
private final DynamicGridKeyboard mRecentsKeyboard;
|
|
private final SparseArray<EmojiPageKeyboardView> mActiveKeyboardViews = new SparseArray<>();
|
|
private final EmojiCategory mEmojiCategory;
|
|
private int mActivePosition = 0;
|
|
|
|
public EmojiPalettesAdapter(final EmojiCategory emojiCategory,
|
|
final EmojiPageKeyboardView.OnKeyEventListener listener) {
|
|
mEmojiCategory = emojiCategory;
|
|
mListener = listener;
|
|
mRecentsKeyboard = mEmojiCategory.getKeyboard(EmojiCategory.ID_RECENTS, 0);
|
|
}
|
|
|
|
public void flushPendingRecentKeys() {
|
|
mRecentsKeyboard.flushPendingRecentKeys();
|
|
final KeyboardView recentKeyboardView =
|
|
mActiveKeyboardViews.get(mEmojiCategory.getRecentTabId());
|
|
if (recentKeyboardView != null) {
|
|
recentKeyboardView.invalidateAllKeys();
|
|
}
|
|
}
|
|
|
|
public void addRecentKey(final Key key) {
|
|
if (mEmojiCategory.isInRecentTab()) {
|
|
mRecentsKeyboard.addPendingKey(key);
|
|
return;
|
|
}
|
|
mRecentsKeyboard.addKeyFirst(key);
|
|
final KeyboardView recentKeyboardView =
|
|
mActiveKeyboardViews.get(mEmojiCategory.getRecentTabId());
|
|
if (recentKeyboardView != null) {
|
|
recentKeyboardView.invalidateAllKeys();
|
|
}
|
|
}
|
|
|
|
public void onPageScrolled() {
|
|
releaseCurrentKey(false /* withKeyRegistering */);
|
|
}
|
|
|
|
public void releaseCurrentKey(final boolean withKeyRegistering) {
|
|
// Make sure the delayed key-down event (highlight effect and haptic feedback) will be
|
|
// canceled.
|
|
final EmojiPageKeyboardView currentKeyboardView =
|
|
mActiveKeyboardViews.get(mActivePosition);
|
|
if (currentKeyboardView == null) {
|
|
return;
|
|
}
|
|
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
|
|
public Object instantiateItem(final ViewGroup container, final 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);
|
|
final LayoutInflater inflater = LayoutInflater.from(container.getContext());
|
|
final EmojiPageKeyboardView keyboardView = (EmojiPageKeyboardView)inflater.inflate(
|
|
R.layout.emoji_keyboard_page, container, false /* attachToRoot */);
|
|
keyboardView.setKeyboard(keyboard);
|
|
keyboardView.setOnKeyEventListener(mListener);
|
|
container.addView(keyboardView);
|
|
mActiveKeyboardViews.put(position, keyboardView);
|
|
return keyboardView;
|
|
}
|
|
|
|
@Override
|
|
public boolean isViewFromObject(final View view, final Object object) {
|
|
return view == object;
|
|
}
|
|
|
|
@Override
|
|
public void destroyItem(final ViewGroup container, final int position,
|
|
final Object object) {
|
|
if (DEBUG_PAGER) {
|
|
Log.d(TAG, "destroy item: " + position + ", " + object.getClass().getSimpleName());
|
|
}
|
|
final EmojiPageKeyboardView keyboardView = mActiveKeyboardViews.get(position);
|
|
if (keyboardView != null) {
|
|
keyboardView.deallocateMemory();
|
|
mActiveKeyboardViews.remove(position);
|
|
}
|
|
if (object instanceof View) {
|
|
container.removeView((View)object);
|
|
} else {
|
|
Log.w(TAG, "Warning!!! Emoji palette may be leaking. " + object);
|
|
}
|
|
}
|
|
}
|