Loading java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java +84 −7 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; import android.os.CountDownTimer; import android.preference.PreferenceManager; import android.support.v4.view.ViewPager; import android.util.AttributeSet; Loading Loading @@ -50,7 +51,7 @@ import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.RichInputMethodSubtype; import com.android.inputmethod.latin.common.Constants; import com.android.inputmethod.latin.utils.ResourceUtils; import java.util.concurrent.TimeUnit; /** * View class to implement Emoji palettes. * The Emoji keyboard consists of group of views layout/emoji_palettes_view. Loading Loading @@ -129,7 +130,7 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange mCategoryPageIndicatorBackground = emojiPalettesViewAttr.getColor( R.styleable.EmojiPalettesView_categoryPageIndicatorBackground, 0); emojiPalettesViewAttr.recycle(); mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener(); mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener(context); } @Override Loading Loading @@ -437,9 +438,46 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange } private static class DeleteKeyOnTouchListener implements OnTouchListener { static final long MAX_REPEAT_COUNT_TIME = TimeUnit.SECONDS.toMillis(30); final long mKeyRepeatStartTimeout; final long mKeyRepeatInterval; public DeleteKeyOnTouchListener(Context context) { final Resources res = context.getResources(); mKeyRepeatStartTimeout = res.getInteger(R.integer.config_key_repeat_start_timeout); mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); mTimer = new CountDownTimer(MAX_REPEAT_COUNT_TIME, mKeyRepeatInterval) { @Override public void onTick(long millisUntilFinished) { final long elapsed = MAX_REPEAT_COUNT_TIME - millisUntilFinished; if (elapsed < mKeyRepeatStartTimeout) { return; } onKeyRepeat(); } @Override public void onFinish() { onKeyRepeat(); } }; } /** Key-repeat state. */ private static final int KEY_REPEAT_STATE_INITIALIZED = 0; // The key is touched but auto key-repeat is not started yet. private static final int KEY_REPEAT_STATE_KEY_DOWN = 1; // At least one key-repeat event has already been triggered and the key is not released. private static final int KEY_REPEAT_STATE_KEY_REPEAT = 2; private KeyboardActionListener mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER; // TODO: Do the same things done in PointerTracker private final CountDownTimer mTimer; private int mState = KEY_REPEAT_STATE_INITIALIZED; private int mRepeatCount = 0; public void setKeyboardActionListener(final KeyboardActionListener listener) { mKeyboardActionListener = listener; } Loading @@ -466,21 +504,60 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange return false; } private void handleKeyDown() { mKeyboardActionListener.onPressKey( Constants.CODE_DELETE, mRepeatCount, true /* isSinglePointer */); } private void handleKeyUp() { mKeyboardActionListener.onCodeInput(Constants.CODE_DELETE, NOT_A_COORDINATE, NOT_A_COORDINATE, false /* isKeyRepeat */); mKeyboardActionListener.onReleaseKey( Constants.CODE_DELETE, false /* withSliding */); ++mRepeatCount; } private void onTouchDown(final View v) { mKeyboardActionListener.onPressKey(Constants.CODE_DELETE, 0 /* repeatCount */, true /* isSinglePointer */); mTimer.cancel(); mRepeatCount = 0; handleKeyDown(); v.setPressed(true /* pressed */); mState = KEY_REPEAT_STATE_KEY_DOWN; mTimer.start(); } private void onTouchUp(final View v) { mKeyboardActionListener.onCodeInput(Constants.CODE_DELETE, NOT_A_COORDINATE, NOT_A_COORDINATE, false /* isKeyRepeat */); mKeyboardActionListener.onReleaseKey(Constants.CODE_DELETE, false /* withSliding */); mTimer.cancel(); if (mState == KEY_REPEAT_STATE_KEY_DOWN) { handleKeyUp(); } v.setPressed(false /* pressed */); mState = KEY_REPEAT_STATE_INITIALIZED; } private void onTouchCanceled(final View v) { mTimer.cancel(); v.setBackgroundColor(Color.TRANSPARENT); mState = KEY_REPEAT_STATE_INITIALIZED; } // Called by {@link #mTimer} in the UI thread as an auto key-repeat signal. void onKeyRepeat() { switch (mState) { case KEY_REPEAT_STATE_INITIALIZED: // Basically this should not happen. break; case KEY_REPEAT_STATE_KEY_DOWN: // Do not call {@link #handleKeyDown} here because it has already been called // in {@link #onTouchDown}. handleKeyUp(); mState = KEY_REPEAT_STATE_KEY_REPEAT; break; case KEY_REPEAT_STATE_KEY_REPEAT: handleKeyDown(); handleKeyUp(); break; } } } } No newline at end of file Loading
java/src/com/android/inputmethod/keyboard/emoji/EmojiPalettesView.java +84 −7 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; import android.os.CountDownTimer; import android.preference.PreferenceManager; import android.support.v4.view.ViewPager; import android.util.AttributeSet; Loading Loading @@ -50,7 +51,7 @@ import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.RichInputMethodSubtype; import com.android.inputmethod.latin.common.Constants; import com.android.inputmethod.latin.utils.ResourceUtils; import java.util.concurrent.TimeUnit; /** * View class to implement Emoji palettes. * The Emoji keyboard consists of group of views layout/emoji_palettes_view. Loading Loading @@ -129,7 +130,7 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange mCategoryPageIndicatorBackground = emojiPalettesViewAttr.getColor( R.styleable.EmojiPalettesView_categoryPageIndicatorBackground, 0); emojiPalettesViewAttr.recycle(); mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener(); mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener(context); } @Override Loading Loading @@ -437,9 +438,46 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange } private static class DeleteKeyOnTouchListener implements OnTouchListener { static final long MAX_REPEAT_COUNT_TIME = TimeUnit.SECONDS.toMillis(30); final long mKeyRepeatStartTimeout; final long mKeyRepeatInterval; public DeleteKeyOnTouchListener(Context context) { final Resources res = context.getResources(); mKeyRepeatStartTimeout = res.getInteger(R.integer.config_key_repeat_start_timeout); mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); mTimer = new CountDownTimer(MAX_REPEAT_COUNT_TIME, mKeyRepeatInterval) { @Override public void onTick(long millisUntilFinished) { final long elapsed = MAX_REPEAT_COUNT_TIME - millisUntilFinished; if (elapsed < mKeyRepeatStartTimeout) { return; } onKeyRepeat(); } @Override public void onFinish() { onKeyRepeat(); } }; } /** Key-repeat state. */ private static final int KEY_REPEAT_STATE_INITIALIZED = 0; // The key is touched but auto key-repeat is not started yet. private static final int KEY_REPEAT_STATE_KEY_DOWN = 1; // At least one key-repeat event has already been triggered and the key is not released. private static final int KEY_REPEAT_STATE_KEY_REPEAT = 2; private KeyboardActionListener mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER; // TODO: Do the same things done in PointerTracker private final CountDownTimer mTimer; private int mState = KEY_REPEAT_STATE_INITIALIZED; private int mRepeatCount = 0; public void setKeyboardActionListener(final KeyboardActionListener listener) { mKeyboardActionListener = listener; } Loading @@ -466,21 +504,60 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange return false; } private void handleKeyDown() { mKeyboardActionListener.onPressKey( Constants.CODE_DELETE, mRepeatCount, true /* isSinglePointer */); } private void handleKeyUp() { mKeyboardActionListener.onCodeInput(Constants.CODE_DELETE, NOT_A_COORDINATE, NOT_A_COORDINATE, false /* isKeyRepeat */); mKeyboardActionListener.onReleaseKey( Constants.CODE_DELETE, false /* withSliding */); ++mRepeatCount; } private void onTouchDown(final View v) { mKeyboardActionListener.onPressKey(Constants.CODE_DELETE, 0 /* repeatCount */, true /* isSinglePointer */); mTimer.cancel(); mRepeatCount = 0; handleKeyDown(); v.setPressed(true /* pressed */); mState = KEY_REPEAT_STATE_KEY_DOWN; mTimer.start(); } private void onTouchUp(final View v) { mKeyboardActionListener.onCodeInput(Constants.CODE_DELETE, NOT_A_COORDINATE, NOT_A_COORDINATE, false /* isKeyRepeat */); mKeyboardActionListener.onReleaseKey(Constants.CODE_DELETE, false /* withSliding */); mTimer.cancel(); if (mState == KEY_REPEAT_STATE_KEY_DOWN) { handleKeyUp(); } v.setPressed(false /* pressed */); mState = KEY_REPEAT_STATE_INITIALIZED; } private void onTouchCanceled(final View v) { mTimer.cancel(); v.setBackgroundColor(Color.TRANSPARENT); mState = KEY_REPEAT_STATE_INITIALIZED; } // Called by {@link #mTimer} in the UI thread as an auto key-repeat signal. void onKeyRepeat() { switch (mState) { case KEY_REPEAT_STATE_INITIALIZED: // Basically this should not happen. break; case KEY_REPEAT_STATE_KEY_DOWN: // Do not call {@link #handleKeyDown} here because it has already been called // in {@link #onTouchDown}. handleKeyUp(); mState = KEY_REPEAT_STATE_KEY_REPEAT; break; case KEY_REPEAT_STATE_KEY_REPEAT: handleKeyDown(); handleKeyUp(); break; } } } } No newline at end of file