Loading java/res/layout/emoji_keyboard_view.xml +6 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="match_parent" android:background="@drawable/tab_selected" android:divider="@null" android:tabStripEnabled="true" Loading @@ -61,11 +61,16 @@ android:visibility="gone" /> </FrameLayout> </TabHost> <View android:layout_width="2dip" android:layout_height="match_parent" android:background="@drawable/suggestions_strip_divider" /> <ImageButton android:id="@+id/emoji_keyboard_delete" android:layout_width="0dip" android:layout_weight="12.5" android:layout_height="match_parent" android:background="@color/emoji_key_background_color" android:src="@drawable/sym_keyboard_delete_holo_dark" /> </LinearLayout> <android.support.v4.view.ViewPager Loading java/res/values/colors.xml +4 −0 Original line number Diff line number Diff line Loading @@ -62,4 +62,8 @@ <color name="setup_welcome_video_margin_color">#FFCCCCCC</color> <color name="emoji_category_page_id_view_background">#FF000000</color> <color name="emoji_category_page_id_view_foreground">#80FFFFFF</color> <!-- TODO: Color which should be included in the theme --> <color name="emoji_key_background_color">#00000000</color> <color name="emoji_key_pressed_background_color">#30FFFFFF</color> </resources> java/src/com/android/inputmethod/keyboard/EmojiKeyboardView.java +94 −3 Original line number Diff line number Diff line Loading @@ -28,11 +28,13 @@ import android.os.Build; import android.preference.PreferenceManager; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.Log; import android.util.Pair; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; Loading Loading @@ -76,6 +78,7 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange private final int mEmojiFunctionalKeyBackgroundId; private final KeyboardLayoutSet mLayoutSet; private final ColorStateList mTabLabelColor; private final DeleteKeyOnTouchListener mDeleteKeyOnTouchListener; private EmojiKeyboardAdapter mEmojiKeyboardAdapter; private TabHost mTabHost; Loading Loading @@ -395,6 +398,7 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange mLayoutSet = builder.build(); mEmojiCategory = new EmojiCategory(PreferenceManager.getDefaultSharedPreferences(context), context.getResources(), builder.build()); mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener(context); } @Override Loading Loading @@ -459,11 +463,9 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange final LinearLayout actionBar = (LinearLayout)findViewById(R.id.emoji_action_bar); emojiLp.setActionBarProperties(actionBar); // TODO: Implement auto repeat, using View.OnTouchListener? final ImageView deleteKey = (ImageView)findViewById(R.id.emoji_keyboard_delete); deleteKey.setBackgroundResource(mEmojiFunctionalKeyBackgroundId); deleteKey.setTag(Constants.CODE_DELETE); deleteKey.setOnClickListener(this); deleteKey.setOnTouchListener(mDeleteKeyOnTouchListener); final ImageView alphabetKey = (ImageView)findViewById(R.id.emoji_keyboard_alphabet); alphabetKey.setBackgroundResource(mEmojiFunctionalKeyBackgroundId); alphabetKey.setTag(Constants.CODE_SWITCH_ALPHA_SYMBOL); Loading Loading @@ -556,6 +558,7 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange public void setKeyboardActionListener(final KeyboardActionListener listener) { mKeyboardActionListener = listener; mDeleteKeyOnTouchListener.setKeyboardActionListener(mKeyboardActionListener); } private void updateEmojiCategoryPageIdView() { Loading Loading @@ -665,4 +668,92 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange container.removeView(keyboardView); } } // TODO: Do the same things done in PointerTracker private static class DeleteKeyOnTouchListener implements OnTouchListener { private static final long MAX_REPEAT_COUNT_TIME = 30 * DateUtils.SECOND_IN_MILLIS; private final int mDeleteKeyPressedBackgroundColor; private final long mKeyRepeatStartTimeout; private final long mKeyRepeatInterval; public DeleteKeyOnTouchListener(Context context) { final Resources res = context.getResources(); mDeleteKeyPressedBackgroundColor = res.getColor(R.color.emoji_key_pressed_background_color); mKeyRepeatStartTimeout = res.getInteger(R.integer.config_key_repeat_start_timeout); mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); } private KeyboardActionListener mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER; private DummyRepeatKeyRepeatTimer mTimer; private synchronized void startRepeat() { if (mTimer != null) { abortRepeat(); } mTimer = new DummyRepeatKeyRepeatTimer(); mTimer.start(); } private synchronized void abortRepeat() { mTimer.abort(); mTimer = null; } // TODO: Remove // This function is mimicking the repeat code in PointerTracker. // Specifically referring to PointerTracker#startRepeatKey and PointerTracker#onKeyRepeat. private class DummyRepeatKeyRepeatTimer extends Thread { public boolean mAborted = false; @Override public void run() { int timeCount = 0; while (timeCount < MAX_REPEAT_COUNT_TIME && !mAborted) { if (timeCount > mKeyRepeatStartTimeout) { pressDelete(); } timeCount += mKeyRepeatInterval; try { Thread.sleep(mKeyRepeatInterval); } catch (InterruptedException e) { } } } public void abort() { mAborted = true; } } public void pressDelete() { mKeyboardActionListener.onPressKey( Constants.CODE_DELETE, 0 /* repeatCount */, true /* isSinglePointer */); mKeyboardActionListener.onCodeInput( Constants.CODE_DELETE, NOT_A_COORDINATE, NOT_A_COORDINATE); mKeyboardActionListener.onReleaseKey( Constants.CODE_DELETE, false /* withSliding */); } public void setKeyboardActionListener(KeyboardActionListener listener) { mKeyboardActionListener = listener; } @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: v.setBackgroundColor(mDeleteKeyPressedBackgroundColor); pressDelete(); startRepeat(); return true; case MotionEvent.ACTION_UP: v.setBackgroundColor(0); abortRepeat(); return true; } return false; } } } Loading
java/res/layout/emoji_keyboard_view.xml +6 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_height="match_parent" android:background="@drawable/tab_selected" android:divider="@null" android:tabStripEnabled="true" Loading @@ -61,11 +61,16 @@ android:visibility="gone" /> </FrameLayout> </TabHost> <View android:layout_width="2dip" android:layout_height="match_parent" android:background="@drawable/suggestions_strip_divider" /> <ImageButton android:id="@+id/emoji_keyboard_delete" android:layout_width="0dip" android:layout_weight="12.5" android:layout_height="match_parent" android:background="@color/emoji_key_background_color" android:src="@drawable/sym_keyboard_delete_holo_dark" /> </LinearLayout> <android.support.v4.view.ViewPager Loading
java/res/values/colors.xml +4 −0 Original line number Diff line number Diff line Loading @@ -62,4 +62,8 @@ <color name="setup_welcome_video_margin_color">#FFCCCCCC</color> <color name="emoji_category_page_id_view_background">#FF000000</color> <color name="emoji_category_page_id_view_foreground">#80FFFFFF</color> <!-- TODO: Color which should be included in the theme --> <color name="emoji_key_background_color">#00000000</color> <color name="emoji_key_pressed_background_color">#30FFFFFF</color> </resources>
java/src/com/android/inputmethod/keyboard/EmojiKeyboardView.java +94 −3 Original line number Diff line number Diff line Loading @@ -28,11 +28,13 @@ import android.os.Build; import android.preference.PreferenceManager; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.Log; import android.util.Pair; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; Loading Loading @@ -76,6 +78,7 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange private final int mEmojiFunctionalKeyBackgroundId; private final KeyboardLayoutSet mLayoutSet; private final ColorStateList mTabLabelColor; private final DeleteKeyOnTouchListener mDeleteKeyOnTouchListener; private EmojiKeyboardAdapter mEmojiKeyboardAdapter; private TabHost mTabHost; Loading Loading @@ -395,6 +398,7 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange mLayoutSet = builder.build(); mEmojiCategory = new EmojiCategory(PreferenceManager.getDefaultSharedPreferences(context), context.getResources(), builder.build()); mDeleteKeyOnTouchListener = new DeleteKeyOnTouchListener(context); } @Override Loading Loading @@ -459,11 +463,9 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange final LinearLayout actionBar = (LinearLayout)findViewById(R.id.emoji_action_bar); emojiLp.setActionBarProperties(actionBar); // TODO: Implement auto repeat, using View.OnTouchListener? final ImageView deleteKey = (ImageView)findViewById(R.id.emoji_keyboard_delete); deleteKey.setBackgroundResource(mEmojiFunctionalKeyBackgroundId); deleteKey.setTag(Constants.CODE_DELETE); deleteKey.setOnClickListener(this); deleteKey.setOnTouchListener(mDeleteKeyOnTouchListener); final ImageView alphabetKey = (ImageView)findViewById(R.id.emoji_keyboard_alphabet); alphabetKey.setBackgroundResource(mEmojiFunctionalKeyBackgroundId); alphabetKey.setTag(Constants.CODE_SWITCH_ALPHA_SYMBOL); Loading Loading @@ -556,6 +558,7 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange public void setKeyboardActionListener(final KeyboardActionListener listener) { mKeyboardActionListener = listener; mDeleteKeyOnTouchListener.setKeyboardActionListener(mKeyboardActionListener); } private void updateEmojiCategoryPageIdView() { Loading Loading @@ -665,4 +668,92 @@ public final class EmojiKeyboardView extends LinearLayout implements OnTabChange container.removeView(keyboardView); } } // TODO: Do the same things done in PointerTracker private static class DeleteKeyOnTouchListener implements OnTouchListener { private static final long MAX_REPEAT_COUNT_TIME = 30 * DateUtils.SECOND_IN_MILLIS; private final int mDeleteKeyPressedBackgroundColor; private final long mKeyRepeatStartTimeout; private final long mKeyRepeatInterval; public DeleteKeyOnTouchListener(Context context) { final Resources res = context.getResources(); mDeleteKeyPressedBackgroundColor = res.getColor(R.color.emoji_key_pressed_background_color); mKeyRepeatStartTimeout = res.getInteger(R.integer.config_key_repeat_start_timeout); mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval); } private KeyboardActionListener mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER; private DummyRepeatKeyRepeatTimer mTimer; private synchronized void startRepeat() { if (mTimer != null) { abortRepeat(); } mTimer = new DummyRepeatKeyRepeatTimer(); mTimer.start(); } private synchronized void abortRepeat() { mTimer.abort(); mTimer = null; } // TODO: Remove // This function is mimicking the repeat code in PointerTracker. // Specifically referring to PointerTracker#startRepeatKey and PointerTracker#onKeyRepeat. private class DummyRepeatKeyRepeatTimer extends Thread { public boolean mAborted = false; @Override public void run() { int timeCount = 0; while (timeCount < MAX_REPEAT_COUNT_TIME && !mAborted) { if (timeCount > mKeyRepeatStartTimeout) { pressDelete(); } timeCount += mKeyRepeatInterval; try { Thread.sleep(mKeyRepeatInterval); } catch (InterruptedException e) { } } } public void abort() { mAborted = true; } } public void pressDelete() { mKeyboardActionListener.onPressKey( Constants.CODE_DELETE, 0 /* repeatCount */, true /* isSinglePointer */); mKeyboardActionListener.onCodeInput( Constants.CODE_DELETE, NOT_A_COORDINATE, NOT_A_COORDINATE); mKeyboardActionListener.onReleaseKey( Constants.CODE_DELETE, false /* withSliding */); } public void setKeyboardActionListener(KeyboardActionListener listener) { mKeyboardActionListener = listener; } @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: v.setBackgroundColor(mDeleteKeyPressedBackgroundColor); pressDelete(); startRepeat(); return true; case MotionEvent.ACTION_UP: v.setBackgroundColor(0); abortRepeat(); return true; } return false; } } }