diff options
31 files changed, 544 insertions, 239 deletions
diff --git a/java/res/layout-land/setup_steps_screen.xml b/java/res/layout-land/setup_steps_screen.xml index 0b4a096cc..cf8c42475 100644 --- a/java/res/layout-land/setup_steps_screen.xml +++ b/java/res/layout-land/setup_steps_screen.xml @@ -27,7 +27,9 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="@integer/setup_title_weight_in_screen" - android:orientation="vertical"> + android:orientation="vertical" + android:layout_marginEnd="@dimen/setup_title_end_margin" + android:layout_marginRight="@dimen/setup_title_end_margin"> <include layout="@layout/setup_steps_title" /> </LinearLayout> <LinearLayout diff --git a/java/res/layout-land/setup_welcome_screen.xml b/java/res/layout-land/setup_welcome_screen.xml index 8b162e27f..38aea2c4f 100644 --- a/java/res/layout-land/setup_welcome_screen.xml +++ b/java/res/layout-land/setup_welcome_screen.xml @@ -27,7 +27,9 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="@integer/setup_title_weight_in_screen" - android:orientation="vertical"> + android:orientation="vertical" + android:layout_marginEnd="@dimen/setup_title_end_margin" + android:layout_marginRight="@dimen/setup_title_end_margin"> <include layout="@layout/setup_welcome_title" /> </LinearLayout> <LinearLayout diff --git a/java/res/layout/setup_steps_cards.xml b/java/res/layout/setup_steps_cards.xml index 245173122..9b03a3e93 100644 --- a/java/res/layout/setup_steps_cards.xml +++ b/java/res/layout/setup_steps_cards.xml @@ -23,7 +23,7 @@ android:id="@+id/setup_step_bullets" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/setup_step_vertical_padding" + android:paddingTop="@dimen/setup_step_vertical_padding" android:orientation="horizontal"> <TextView android:id="@+id/setup_step1_bullet" diff --git a/java/res/layout/setup_welcome_title.xml b/java/res/layout/setup_welcome_title.xml index 6e6d78147..af7053a37 100644 --- a/java/res/layout/setup_welcome_title.xml +++ b/java/res/layout/setup_welcome_title.xml @@ -27,6 +27,6 @@ <TextView android:id="@+id/setup_welcome_description" android:text="@string/setup_welcome_additional_description" - android:layout_marginTop="12dp" + android:layout_marginTop="@dimen/setup_welcome_description_top_margin" style="@style/setupWelcomeDescritpionStyle" /> </merge> diff --git a/java/res/layout/setup_welcome_video.xml b/java/res/layout/setup_welcome_video.xml index 8c04e637e..751773211 100644 --- a/java/res/layout/setup_welcome_video.xml +++ b/java/res/layout/setup_welcome_video.xml @@ -23,26 +23,29 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingTop="@dimen/setup_welcome_video_vertical_margin" - android:paddingBottom="@dimen/setup_welcome_video_vertical_margin"> - <View - android:layout_weight="@integer/setup_welcome_video_left_padding_weight_in_screen" - android:layout_width="0dp" - android:layout_height="0dp" /> - <VideoView - android:id="@+id/setup_welcome_video" - android:background="@color/setup_background" - android:layout_weight="@integer/setup_welcome_video_weight_in_screen" - android:layout_width="0dp" - android:layout_height="wrap_content" /> - <ImageView - android:id="@+id/setup_welcome_image" - android:visibility="gone" + android:paddingTop="@dimen/setup_welcome_video_top_padding" + android:paddingBottom="@dimen/setup_welcome_video_bottom_padding"> + <LinearLayout android:layout_weight="@integer/setup_welcome_video_weight_in_screen" android:layout_width="0dp" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="1dp" + android:background="@color/setup_welcome_video_margin_color" > + <VideoView + android:id="@+id/setup_welcome_video" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/setup_background" /> + <ImageView + android:id="@+id/setup_welcome_image" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:adjustViewBounds="true" + android:visibility="gone" /> + </LinearLayout> <View - android:layout_weight="@integer/setup_welcome_video_right_padding_weight_in_screen" + android:layout_weight="@integer/setup_welcome_video_end_padding_weight_in_screen" android:layout_width="0dp" android:layout_height="0dp" /> </LinearLayout> diff --git a/java/res/raw/setup_welcome_image.png b/java/res/raw/setup_welcome_image.png Binary files differindex 17e31111f..2445915b8 100644 --- a/java/res/raw/setup_welcome_image.png +++ b/java/res/raw/setup_welcome_image.png diff --git a/java/res/raw/setup_welcome_video.mp4 b/java/res/raw/setup_welcome_video.mp4 Binary files differindex 09357d8de..820852531 100644 --- a/java/res/raw/setup_welcome_video.mp4 +++ b/java/res/raw/setup_welcome_video.mp4 diff --git a/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml b/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml index ad61c1a3a..bc7928d6a 100644 --- a/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml +++ b/java/res/values-h1200dp-port/setup-dimens-large-tablet-port.xml @@ -17,7 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Setup wizard dimensions for large-tablet/portrait. --> <dimen name="setup_title_text_size">72sp</dimen> - <dimen name="setup_welcome_description_text_size">36sp</dimen> + <dimen name="setup_welcome_description_text_size">38sp</dimen> <dimen name="setup_step_bullet_text_size">24sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> <dimen name="setup_step_indicator_height">24dp</dimen> @@ -33,8 +33,10 @@ <dimen name="setup_step_horizontal_line_height">2dp</dimen> <integer name="setup_title_weight_in_screen">40</integer> <integer name="setup_body_weight_in_screen">60</integer> - <dimen name="setup_welcome_video_vertical_margin">24dp</dimen> - <integer name="setup_welcome_video_weight_in_screen">50</integer> - <integer name="setup_welcome_video_left_padding_weight_in_screen">25</integer> - <integer name="setup_welcome_video_right_padding_weight_in_screen">25</integer> + <dimen name="setup_title_end_margin">24dp</dimen> + <dimen name="setup_welcome_description_top_margin">12dp</dimen> + <dimen name="setup_welcome_video_top_padding">24dp</dimen> + <dimen name="setup_welcome_video_bottom_padding">24dp</dimen> + <integer name="setup_welcome_video_weight_in_screen">70</integer> + <integer name="setup_welcome_video_end_padding_weight_in_screen">30</integer> </resources> diff --git a/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml b/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml index 69a8a7ad5..aebf6d2f3 100644 --- a/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml +++ b/java/res/values-h330dp-land/setup-dimens-large-phone-land.xml @@ -16,13 +16,13 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Setup wizard dimensions for large-phone/landscape. --> - <dimen name="setup_title_text_size">42sp</dimen> - <dimen name="setup_welcome_description_text_size">24sp</dimen> + <dimen name="setup_title_text_size">40sp</dimen> + <dimen name="setup_welcome_description_text_size">22sp</dimen> <dimen name="setup_step_bullet_text_size">22sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> <dimen name="setup_step_indicator_height">24dp</dimen> - <dimen name="setup_step_title_text_size">22sp</dimen> - <dimen name="setup_step_instruction_text_size">14sp</dimen> + <dimen name="setup_step_title_text_size">20sp</dimen> + <dimen name="setup_step_instruction_text_size">16sp</dimen> <dimen name="setup_step_action_text_size">18sp</dimen> <dimen name="setup_vertical_padding">16dp</dimen> <dimen name="setup_horizontal_padding">16dp</dimen> @@ -33,8 +33,10 @@ <dimen name="setup_step_horizontal_line_height">2dp</dimen> <integer name="setup_title_weight_in_screen">40</integer> <integer name="setup_body_weight_in_screen">60</integer> - <dimen name="setup_welcome_video_vertical_margin">24dp</dimen> - <integer name="setup_welcome_video_weight_in_screen">80</integer> - <integer name="setup_welcome_video_left_padding_weight_in_screen">10</integer> - <integer name="setup_welcome_video_right_padding_weight_in_screen">10</integer> + <dimen name="setup_title_end_margin">24dp</dimen> + <dimen name="setup_welcome_description_top_margin">10dp</dimen> + <dimen name="setup_welcome_video_top_padding">0dp</dimen> + <dimen name="setup_welcome_video_bottom_padding">12dp</dimen> + <integer name="setup_welcome_video_weight_in_screen">70</integer> + <integer name="setup_welcome_video_end_padding_weight_in_screen">30</integer> </resources> diff --git a/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml b/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml index 6a14d5918..aedf79fb2 100644 --- a/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml +++ b/java/res/values-h520dp-land/setup-dimens-small-tablet-land.xml @@ -16,8 +16,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Setup wizard dimensions for small-tablet/landscape. --> - <dimen name="setup_title_text_size">56sp</dimen> - <dimen name="setup_welcome_description_text_size">28sp</dimen> + <dimen name="setup_title_text_size">60sp</dimen> + <dimen name="setup_welcome_description_text_size">32sp</dimen> <dimen name="setup_step_bullet_text_size">24sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> <dimen name="setup_step_indicator_height">24dp</dimen> @@ -31,10 +31,12 @@ <dimen name="setup_step_horizontal_padding_half">12dp</dimen> <dimen name="setup_step_vertical_padding">16dp</dimen> <dimen name="setup_step_horizontal_line_height">2dp</dimen> - <integer name="setup_title_weight_in_screen">40</integer> - <integer name="setup_body_weight_in_screen">60</integer> - <dimen name="setup_welcome_video_vertical_margin">24dp</dimen> - <integer name="setup_welcome_video_weight_in_screen">60</integer> - <integer name="setup_welcome_video_left_padding_weight_in_screen">20</integer> - <integer name="setup_welcome_video_right_padding_weight_in_screen">20</integer> + <integer name="setup_title_weight_in_screen">50</integer> + <integer name="setup_body_weight_in_screen">50</integer> + <dimen name="setup_title_end_margin">24dp</dimen> + <dimen name="setup_welcome_description_top_margin">12dp</dimen> + <dimen name="setup_welcome_video_top_padding">0dp</dimen> + <dimen name="setup_welcome_video_bottom_padding">24dp</dimen> + <integer name="setup_welcome_video_weight_in_screen">80</integer> + <integer name="setup_welcome_video_end_padding_weight_in_screen">20</integer> </resources> diff --git a/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml b/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml index b8dd33df4..6d66f46eb 100644 --- a/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml +++ b/java/res/values-h540dp-port/setup-dimens-large-phone-port.xml @@ -16,15 +16,15 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Setup wizard dimensions for large-phone/portrait. --> - <dimen name="setup_title_text_size">46sp</dimen> + <dimen name="setup_title_text_size">48sp</dimen> <dimen name="setup_welcome_description_text_size">26sp</dimen> <dimen name="setup_step_bullet_text_size">22sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> <dimen name="setup_step_indicator_height">24dp</dimen> - <dimen name="setup_step_title_text_size">22sp</dimen> - <dimen name="setup_step_instruction_text_size">14sp</dimen> + <dimen name="setup_step_title_text_size">20sp</dimen> + <dimen name="setup_step_instruction_text_size">16sp</dimen> <dimen name="setup_step_action_text_size">18sp</dimen> - <dimen name="setup_vertical_padding">16dp</dimen> + <dimen name="setup_vertical_padding">8dp</dimen> <dimen name="setup_horizontal_padding">16dp</dimen> <dimen name="setup_step_action_height">48dp</dimen> <dimen name="setup_step_horizontal_padding">24dp</dimen> @@ -33,8 +33,10 @@ <dimen name="setup_step_horizontal_line_height">2dp</dimen> <integer name="setup_title_weight_in_screen">40</integer> <integer name="setup_body_weight_in_screen">60</integer> - <dimen name="setup_welcome_video_vertical_margin">24dp</dimen> - <integer name="setup_welcome_video_weight_in_screen">80</integer> - <integer name="setup_welcome_video_left_padding_weight_in_screen">10</integer> - <integer name="setup_welcome_video_right_padding_weight_in_screen">10</integer> + <dimen name="setup_title_end_margin">24dp</dimen> + <dimen name="setup_welcome_description_top_margin">6dp</dimen> + <dimen name="setup_welcome_video_top_padding">12dp</dimen> + <dimen name="setup_welcome_video_bottom_padding">12dp</dimen> + <integer name="setup_welcome_video_weight_in_screen">70</integer> + <integer name="setup_welcome_video_end_padding_weight_in_screen">30</integer> </resources> diff --git a/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml b/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml index 0004a3c85..e22b741fb 100644 --- a/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml +++ b/java/res/values-h720dp-land/setup-dimens-large-tablet-land.xml @@ -16,8 +16,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Setup wizard dimensions for large-tablet/landscape. --> - <dimen name="setup_title_text_size">58sp</dimen> - <dimen name="setup_welcome_description_text_size">28sp</dimen> + <dimen name="setup_title_text_size">72sp</dimen> + <dimen name="setup_welcome_description_text_size">38sp</dimen> <dimen name="setup_step_bullet_text_size">24sp</dimen> <dimen name="setup_step_triangle_indicator_height">24dp</dimen> <dimen name="setup_step_indicator_height">24dp</dimen> @@ -25,16 +25,18 @@ <dimen name="setup_step_instruction_text_size">18sp</dimen> <dimen name="setup_step_action_text_size">20sp</dimen> <dimen name="setup_vertical_padding">96dp</dimen> - <dimen name="setup_horizontal_padding">192dp</dimen> + <dimen name="setup_horizontal_padding">160dp</dimen> <dimen name="setup_step_action_height">48dp</dimen> <dimen name="setup_step_horizontal_padding">24dp</dimen> <dimen name="setup_step_horizontal_padding_half">12dp</dimen> <dimen name="setup_step_vertical_padding">16dp</dimen> <dimen name="setup_step_horizontal_line_height">2dp</dimen> - <integer name="setup_title_weight_in_screen">40</integer> - <integer name="setup_body_weight_in_screen">60</integer> - <dimen name="setup_welcome_video_vertical_margin">24dp</dimen> - <integer name="setup_welcome_video_weight_in_screen">50</integer> - <integer name="setup_welcome_video_left_padding_weight_in_screen">25</integer> - <integer name="setup_welcome_video_right_padding_weight_in_screen">25</integer> + <integer name="setup_title_weight_in_screen">50</integer> + <integer name="setup_body_weight_in_screen">50</integer> + <dimen name="setup_title_end_margin">24dp</dimen> + <dimen name="setup_welcome_description_top_margin">12dp</dimen> + <dimen name="setup_welcome_video_top_padding">0dp</dimen> + <dimen name="setup_welcome_video_bottom_padding">24dp</dimen> + <integer name="setup_welcome_video_weight_in_screen">80</integer> + <integer name="setup_welcome_video_end_padding_weight_in_screen">20</integer> </resources> diff --git a/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml b/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml index 87c991c4d..86cf3a04a 100644 --- a/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml +++ b/java/res/values-h800dp-port/setup-dimens-small-tablet-port.xml @@ -33,8 +33,10 @@ <dimen name="setup_step_horizontal_line_height">2dp</dimen> <integer name="setup_title_weight_in_screen">40</integer> <integer name="setup_body_weight_in_screen">60</integer> - <dimen name="setup_welcome_video_vertical_margin">24dp</dimen> - <integer name="setup_welcome_video_weight_in_screen">60</integer> - <integer name="setup_welcome_video_left_padding_weight_in_screen">20</integer> - <integer name="setup_welcome_video_right_padding_weight_in_screen">20</integer> + <dimen name="setup_title_end_margin">24dp</dimen> + <dimen name="setup_welcome_description_top_margin">12dp</dimen> + <dimen name="setup_welcome_video_top_padding">24dp</dimen> + <dimen name="setup_welcome_video_bottom_padding">24dp</dimen> + <integer name="setup_welcome_video_weight_in_screen">70</integer> + <integer name="setup_welcome_video_end_padding_weight_in_screen">30</integer> </resources> diff --git a/java/res/values-land/setup-dimens-small-phone-land.xml b/java/res/values-land/setup-dimens-small-phone-land.xml index 63f4661d1..088e6562a 100644 --- a/java/res/values-land/setup-dimens-small-phone-land.xml +++ b/java/res/values-land/setup-dimens-small-phone-land.xml @@ -16,7 +16,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Setup wizard dimensions for small-phone/landscape. --> - <dimen name="setup_title_text_size">36sp</dimen> + <dimen name="setup_title_text_size">32sp</dimen> <dimen name="setup_welcome_description_text_size">18sp</dimen> <dimen name="setup_step_bullet_text_size">18sp</dimen> <dimen name="setup_step_triangle_indicator_height">18dp</dimen> @@ -24,7 +24,7 @@ <dimen name="setup_step_title_text_size">18sp</dimen> <dimen name="setup_step_instruction_text_size">14sp</dimen> <dimen name="setup_step_action_text_size">16sp</dimen> - <dimen name="setup_vertical_padding">12dp</dimen> + <dimen name="setup_vertical_padding">16dp</dimen> <dimen name="setup_horizontal_padding">12dp</dimen> <dimen name="setup_step_action_height">42dp</dimen> <dimen name="setup_step_horizontal_padding">20dp</dimen> @@ -33,8 +33,10 @@ <dimen name="setup_step_horizontal_line_height">2dp</dimen> <integer name="setup_title_weight_in_screen">40</integer> <integer name="setup_body_weight_in_screen">60</integer> - <dimen name="setup_welcome_video_vertical_margin">24dp</dimen> - <integer name="setup_welcome_video_weight_in_screen">80</integer> - <integer name="setup_welcome_video_left_padding_weight_in_screen">10</integer> - <integer name="setup_welcome_video_right_padding_weight_in_screen">10</integer> + <dimen name="setup_title_end_margin">12dp</dimen> + <dimen name="setup_welcome_description_top_margin">12dp</dimen> + <dimen name="setup_welcome_video_top_padding">0dp</dimen> + <dimen name="setup_welcome_video_bottom_padding">12dp</dimen> + <integer name="setup_welcome_video_weight_in_screen">70</integer> + <integer name="setup_welcome_video_end_padding_weight_in_screen">30</integer> </resources> diff --git a/java/res/values-port/setup-dimens-small-phone-port.xml b/java/res/values-port/setup-dimens-small-phone-port.xml index 34f4d9240..8ac72ea7c 100644 --- a/java/res/values-port/setup-dimens-small-phone-port.xml +++ b/java/res/values-port/setup-dimens-small-phone-port.xml @@ -24,7 +24,7 @@ <dimen name="setup_step_title_text_size">18sp</dimen> <dimen name="setup_step_instruction_text_size">14sp</dimen> <dimen name="setup_step_action_text_size">16sp</dimen> - <dimen name="setup_vertical_padding">12dp</dimen> + <dimen name="setup_vertical_padding">2dp</dimen> <dimen name="setup_horizontal_padding">12dp</dimen> <dimen name="setup_step_action_height">42dp</dimen> <dimen name="setup_step_horizontal_padding">20dp</dimen> @@ -33,8 +33,10 @@ <dimen name="setup_step_horizontal_line_height">2dp</dimen> <integer name="setup_title_weight_in_screen">40</integer> <integer name="setup_body_weight_in_screen">60</integer> - <dimen name="setup_welcome_video_vertical_margin">16dp</dimen> - <integer name="setup_welcome_video_weight_in_screen">80</integer> - <integer name="setup_welcome_video_left_padding_weight_in_screen">10</integer> - <integer name="setup_welcome_video_right_padding_weight_in_screen">10</integer> + <dimen name="setup_title_end_margin">16dp</dimen> + <dimen name="setup_welcome_description_top_margin">4dp</dimen> + <dimen name="setup_welcome_video_top_padding">12dp</dimen> + <dimen name="setup_welcome_video_bottom_padding">12dp</dimen> + <integer name="setup_welcome_video_weight_in_screen">70</integer> + <integer name="setup_welcome_video_end_padding_weight_in_screen">30</integer> </resources> diff --git a/java/res/values/colors.xml b/java/res/values/colors.xml index 8a8049f1f..daa167c8a 100644 --- a/java/res/values/colors.xml +++ b/java/res/values/colors.xml @@ -58,4 +58,5 @@ <color name="setup_text_dark">#FF707070</color> <color name="setup_text_action">@android:color/holo_blue_light</color> <color name="setup_step_background">@android:color/background_light</color> + <color name="setup_welcome_video_margin_color">#FFCCCCCC</color> </resources> diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml index b6413b3f3..98ae76cb1 100644 --- a/java/res/values/dimens.xml +++ b/java/res/values/dimens.xml @@ -102,7 +102,7 @@ <!-- Gesture trail parameters --> <!-- Minimum distance between gesture trail sampling points. --> - <dimen name="gesture_trail_min_sampling_distance">6.4dp</dimen> + <dimen name="gesture_trail_min_sampling_distance">9.6dp</dimen> <!-- Maximum angular threshold between gesture trails interpolation segments in degree. --> <integer name="gesture_trail_max_interpolation_angular_threshold">15</integer> <!-- Maximum distance threshold between gesture trails interpolation segments. --> diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java index 60d09d6fd..9eeee5baf 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java @@ -27,8 +27,9 @@ public interface KeyboardActionListener { * * @param primaryCode the unicode of the key being pressed. If the touch is not on a valid key, * the value will be zero. + * @param isSinglePointer true if pressing has occurred while no other key is being pressed. */ - public void onPressKey(int primaryCode); + public void onPressKey(int primaryCode, boolean isSinglePointer); /** * Called when the user releases a key. This is sent after the {@link #onCodeInput} is called. @@ -88,6 +89,11 @@ public interface KeyboardActionListener { public void onCancelInput(); /** + * Called when user finished sliding key input. + */ + public void onFinishSlidingInput(); + + /** * Send a non-"code input" custom request to the listener. * @return true if the request has been consumed, false otherwise. */ @@ -97,7 +103,7 @@ public interface KeyboardActionListener { public static final Adapter EMPTY_LISTENER = new Adapter(); @Override - public void onPressKey(int primaryCode) {} + public void onPressKey(int primaryCode, boolean isSinglePointer) {} @Override public void onReleaseKey(int primaryCode, boolean withSliding) {} @Override @@ -115,6 +121,8 @@ public interface KeyboardActionListener { @Override public void onCancelInput() {} @Override + public void onFinishSlidingInput() {} + @Override public boolean onCustomRequest(int requestCode) { return false; } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java index 39afe9072..ad08d6477 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -216,19 +216,19 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { mState.onResetKeyboardStateToAlphabet(); } - public void onPressKey(final int code) { + public void onPressKey(final int code, final boolean isSinglePointer) { if (isVibrateAndSoundFeedbackRequired()) { mFeedbackManager.hapticAndAudioFeedback(code, mKeyboardView); } - mState.onPressKey(code, isSinglePointer(), mLatinIME.getCurrentAutoCapsState()); + mState.onPressKey(code, isSinglePointer, mLatinIME.getCurrentAutoCapsState()); } public void onReleaseKey(final int code, final boolean withSliding) { mState.onReleaseKey(code, withSliding); } - public void onCancelInput() { - mState.onCancelInput(isSinglePointer()); + public void onFinishSlidingInput() { + mState.onFinishSlidingInput(); } // Implements {@link KeyboardState.SwitchActions}. @@ -346,15 +346,11 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions { return mKeyboardView != null && !mKeyboardView.isInSlidingKeyInput(); } - private boolean isSinglePointer() { - return mKeyboardView != null && mKeyboardView.getPointerCount() == 1; - } - /** * Updates state machine to figure out when to automatically switch back to the previous mode. */ public void onCodeInput(final int code) { - mState.onCodeInput(code, isSinglePointer(), mLatinIME.getCurrentAutoCapsState()); + mState.onCodeInput(code, mLatinIME.getCurrentAutoCapsState()); } public MainKeyboardView getMainKeyboardView() { diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index 3201d2e5b..6c6fc6157 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -1100,10 +1100,6 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack return false; } - public int getPointerCount() { - return mOldPointerCount; - } - @Override public boolean dispatchTouchEvent(MotionEvent event) { if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) { diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index a8327289b..174239325 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -459,7 +459,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { return false; } if (key.isEnabled()) { - mListener.onPressKey(key.mCode); + mListener.onPressKey(key.mCode, getActivePointerTrackerCount() == 1); final boolean keyboardLayoutHasBeenChanged = mKeyboardLayoutHasBeenChanged; mKeyboardLayoutHasBeenChanged = false; mTimerProxy.startTypingStateTimer(key); @@ -527,6 +527,13 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } } + private void callListenerOnFinishSlidingInput() { + if (DEBUG_LISTENER) { + Log.d(TAG, String.format("[%d] onFinishSlidingInput", mPointerId)); + } + mListener.onFinishSlidingInput(); + } + private void callListenerOnCancelInput() { if (DEBUG_LISTENER) { Log.d(TAG, String.format("[%d] onCancelInput", mPointerId)); @@ -1036,7 +1043,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { private void processSildeOutFromOldKey(final Key oldKey) { setReleasedKeyGraphics(oldKey); - callListenerOnRelease(oldKey, oldKey.mCode, true); + callListenerOnRelease(oldKey, oldKey.mCode, true /* withSliding */); startSlidingKeyInput(oldKey); mTimerProxy.cancelKeyTimers(); } @@ -1169,6 +1176,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { private void onUpEventInternal(final int x, final int y, final long eventTime) { mTimerProxy.cancelKeyTimers(); final boolean isInSlidingKeyInput = mIsInSlidingKeyInput; + final boolean isInSlidingKeyInputFromModifier = mIsInSlidingKeyInputFromModifier; resetSlidingKeyInput(); mIsDetectingGesture = false; final Key currentKey = mCurrentKey; @@ -1189,7 +1197,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (sInGesture) { if (currentKey != null) { - callListenerOnRelease(currentKey, currentKey.mCode, true); + callListenerOnRelease(currentKey, currentKey.mCode, true /* withSliding */); } mayEndBatchInput(eventTime); return; @@ -1203,6 +1211,9 @@ public final class PointerTracker implements PointerTrackerQueue.Element { return; } detectAndSendKey(currentKey, mKeyX, mKeyY, eventTime); + if (isInSlidingKeyInputFromModifier) { + callListenerOnFinishSlidingInput(); + } } public void onShowMoreKeysPanel(final int translatedX, final int translatedY, @@ -1328,7 +1339,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { final int code = key.mCode; callListenerOnCodeInput(key, code, x, y, eventTime); - callListenerOnRelease(key, code, false); + callListenerOnRelease(key, code, false /* withSliding */); } private void printTouchEvent(final String title, final int x, final int y, diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java index 962bde91e..6af1bd75f 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java @@ -28,9 +28,9 @@ import com.android.inputmethod.latin.RecapitalizeStatus; * This class contains all keyboard state transition logic. * * The input events are {@link #onLoadKeyboard()}, {@link #onSaveKeyboardState()}, - * {@link #onPressKey(int, boolean, int)}, {@link #onReleaseKey(int, boolean)}, - * {@link #onCodeInput(int, boolean, int)}, {@link #onCancelInput(boolean)}, - * {@link #onUpdateShiftState(int, int)}, {@link #onLongPressTimeout(int)}. + * {@link #onPressKey(int,boolean,int)}, {@link #onReleaseKey(int,boolean)}, + * {@link #onCodeInput(int,int)}, {@link #onFinishSlidingInput()}, {@link #onCancelInput()}, + * {@link #onUpdateShiftState(int,int)}, {@link #onLongPressTimeout(int)}. * * The actions are {@link SwitchActions}'s methods. */ @@ -74,6 +74,7 @@ public final class KeyboardState { private static final int SWITCH_STATE_SYMBOL = 2; private static final int SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL = 3; private static final int SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE = 4; + private static final int SWITCH_STATE_MOMENTARY_ALPHA_SHIFT = 5; private int mSwitchState = SWITCH_STATE_ALPHA; private boolean mIsAlphabetMode; @@ -525,6 +526,9 @@ public final class KeyboardState { } else if (mAlphabetShiftState.isShiftLockShifted() && withSliding) { // In shift locked state, shift has been pressed and slid out to other key. setShiftLocked(true); + } else if (mAlphabetShiftState.isManualShifted() && withSliding) { + // Shift has been pressed and slid out to other key. + mSwitchState = SWITCH_STATE_MOMENTARY_ALPHA_SHIFT; } else if (isShiftLocked && !mAlphabetShiftState.isShiftLockShifted() && (mShiftKeyState.isPressing() || mShiftKeyState.isPressingOnShifted()) && !withSliding) { @@ -554,17 +558,21 @@ public final class KeyboardState { mShiftKeyState.onRelease(); } - public void onCancelInput(final boolean isSinglePointer) { + public void onFinishSlidingInput() { if (DEBUG_EVENT) { - Log.d(TAG, "onCancelInput: single=" + isSinglePointer + " " + this); + Log.d(TAG, "onFinishSlidingInput: " + this); } // Switch back to the previous keyboard mode if the user cancels sliding input. - if (isSinglePointer) { - if (mSwitchState == SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL) { - toggleAlphabetAndSymbols(); - } else if (mSwitchState == SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE) { - toggleShiftInSymbols(); - } + switch (mSwitchState) { + case SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL: + toggleAlphabetAndSymbols(); + break; + case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE: + toggleShiftInSymbols(); + break; + case SWITCH_STATE_MOMENTARY_ALPHA_SHIFT: + setAlphabetKeyboard(); + break; } } @@ -577,10 +585,9 @@ public final class KeyboardState { return c == Constants.CODE_SPACE || c == Constants.CODE_ENTER; } - public void onCodeInput(final int code, final boolean isSinglePointer, final int autoCaps) { + public void onCodeInput(final int code, final int autoCaps) { if (DEBUG_EVENT) { Log.d(TAG, "onCodeInput: code=" + Constants.printableCode(code) - + " single=" + isSinglePointer + " autoCaps=" + autoCaps + " " + this); } @@ -593,23 +600,12 @@ public final class KeyboardState { } else { mSwitchState = SWITCH_STATE_SYMBOL_BEGIN; } - } else if (isSinglePointer) { - // Switch back to the previous keyboard mode if the user pressed the mode change key - // and slid to other key, then released the finger. - // If the user cancels the sliding input, switching back to the previous keyboard - // mode is handled by {@link #onCancelInput}. - toggleAlphabetAndSymbols(); } break; case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE: if (code == Constants.CODE_SHIFT) { // Detected only the shift key has been pressed on symbol layout, and then released. mSwitchState = SWITCH_STATE_SYMBOL_BEGIN; - } else if (isSinglePointer) { - // Switch back to the previous keyboard mode if the user pressed the shift key on - // symbol mode and slid to other key, then released the finger. - toggleShiftInSymbols(); - mSwitchState = SWITCH_STATE_SYMBOL; } break; case SWITCH_STATE_SYMBOL_BEGIN: @@ -650,6 +646,7 @@ public final class KeyboardState { case SWITCH_STATE_SYMBOL: return "SYMBOL"; case SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL: return "MOMENTARY-ALPHA-SYMBOL"; case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE: return "MOMENTARY-SYMBOL-MORE"; + case SWITCH_STATE_MOMENTARY_ALPHA_SHIFT: return "MOMENTARY-ALPHA_SHIFT"; default: return null; } } diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 5dd42bf02..347a4c63a 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -90,7 +90,7 @@ import java.util.TreeSet; /** * Input method implementation for Qwerty'ish keyboard. */ -public final class LatinIME extends InputMethodService implements KeyboardActionListener, +public class LatinIME extends InputMethodService implements KeyboardActionListener, SuggestionStripView.Listener, TargetApplicationGetter.OnTargetApplicationKnownListener, Suggest.SuggestInitializationListener { private static final String TAG = LatinIME.class.getSimpleName(); @@ -188,6 +188,8 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // Keeps track of most recently inserted text (multi-character key) for reverting private String mEnteredText; + // TODO: This boolean is persistent state and causes large side effects at unexpected times. + // Find a way to remove it for readability. private boolean mIsAutoCorrectionIndicatorOn; private AlertDialog mOptionsDialog; @@ -902,7 +904,12 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // we know for sure the cursor moved while we were composing and we should reset // the state. final boolean noComposingSpan = composingSpanStart == -1 && composingSpanEnd == -1; - if (!mExpectingUpdateSelection + // If the keyboard is not visible, we don't need to do all the housekeeping work, as it + // will be reset when the keyboard shows up anyway. + // TODO: revisit this when LatinIME supports hardware keyboards. + // NOTE: the test harness subclasses LatinIME and overrides isInputViewShown(). + // TODO: find a better way to simulate actual execution. + if (isInputViewShown() && !mExpectingUpdateSelection && !mConnection.isBelatedExpectedUpdate(oldSelStart, newSelStart)) { // TAKE CARE: there is a race condition when we enter this test even when the user // did not explicitly move the cursor. This happens when typing fast, where two keys @@ -1752,9 +1759,16 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // Called from PointerTracker through the KeyboardActionListener interface @Override + public void onFinishSlidingInput() { + // User finished sliding input. + mKeyboardSwitcher.onFinishSlidingInput(); + } + + // Called from PointerTracker through the KeyboardActionListener interface + @Override public void onCancelInput() { // User released a finger outside any key - mKeyboardSwitcher.onCancelInput(); + // Nothing to do so far. } @Override @@ -2102,25 +2116,16 @@ public final class LatinIME extends InputMethodService implements KeyboardAction } private boolean isSuggestionsStripVisible() { - final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); - if (null == mainKeyboardView || !mainKeyboardView.isShown()) { - return false; - } - if (mSuggestionStripView == null) { + if (mSuggestionStripView == null) return false; - } - if (mSuggestionStripView.isShowingAddToDictionaryHint()) { + if (mSuggestionStripView.isShowingAddToDictionaryHint()) return true; - } - if (null == mSettings.getCurrent()) { + if (null == mSettings.getCurrent()) return false; - } - if (!mSettings.getCurrent().isSuggestionStripVisibleInOrientation(mDisplayOrientation)) { + if (!mSettings.getCurrent().isSuggestionStripVisibleInOrientation(mDisplayOrientation)) return false; - } - if (mSettings.getCurrent().isApplicationSpecifiedCompletionsOn()) { + if (mSettings.getCurrent().isApplicationSpecifiedCompletionsOn()) return true; - } return mSettings.getCurrent().isSuggestionsRequested(mDisplayOrientation); } @@ -2509,7 +2514,10 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // Note that it's very important here that suggestedWords.mWillAutoCorrect is false. // We never want to auto-correct on a resumed suggestion. Please refer to the three - // places above where suggestedWords is affected. + // places above where suggestedWords is affected. We also need to reset + // mIsAutoCorrectionIndicatorOn to avoid showSuggestionStrip touching the text to adapt it. + // TODO: remove mIsAutoCorrectionIndicator on (see comment on definition) + mIsAutoCorrectionIndicatorOn = false; showSuggestionStrip(suggestedWords, typedWord); } @@ -2621,8 +2629,8 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // Callback called by PointerTracker through the KeyboardActionListener. This is called when a // key is depressed; release matching call is onReleaseKey below. @Override - public void onPressKey(final int primaryCode) { - mKeyboardSwitcher.onPressKey(primaryCode); + public void onPressKey(final int primaryCode, final boolean isSinglePointer) { + mKeyboardSwitcher.onPressKey(primaryCode, isSinglePointer); } // Callback by PointerTracker through the KeyboardActionListener. This is called when a key diff --git a/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java b/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java index 3406ecf34..78a6478c6 100644 --- a/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java +++ b/java/src/com/android/inputmethod/latin/setup/SetupWizardActivity.java @@ -46,11 +46,14 @@ import java.util.ArrayList; public final class SetupWizardActivity extends Activity implements View.OnClickListener { static final String TAG = SetupWizardActivity.class.getSimpleName(); + private static final boolean ENABLE_WELCOME_VIDEO = true; + private View mSetupWizard; private View mWelcomeScreen; private View mSetupScreen; private Uri mWelcomeVideoUri; private VideoView mWelcomeVideoView; + private ImageView mWelcomeImageView; private View mActionStart; private View mActionNext; private TextView mStep1Bullet; @@ -58,6 +61,7 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL private SetupStepGroup mSetupStepGroup; private static final String STATE_STEP = "step"; private int mStepNumber; + private boolean mNeedsToAdjustStepNumberToSystemState; private static final int STEP_WELCOME = 0; private static final int STEP_1 = 1; private static final int STEP_2 = 2; @@ -156,9 +160,7 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL step2.setAction(new Runnable() { @Override public void run() { - // Invoke input method picker. - RichInputMethodManager.getInstance().getInputMethodManager() - .showInputMethodPicker(); + invokeInputMethodPicker(); } }); mSetupStepGroup.addStep(step2); @@ -191,18 +193,16 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL mp.setLooping(true); } }); - final ImageView welcomeImageView = (ImageView)findViewById(R.id.setup_welcome_image); welcomeVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(final MediaPlayer mp, final int what, final int extra) { Log.e(TAG, "Playing welcome video causes error: what=" + what + " extra=" + extra); - welcomeVideoView.setVisibility(View.GONE); - welcomeImageView.setImageResource(R.raw.setup_welcome_image); - welcomeImageView.setVisibility(View.VISIBLE); + hideWelcomeVideoAndShowWelcomeImage(); return true; } }); mWelcomeVideoView = welcomeVideoView; + mWelcomeImageView = (ImageView)findViewById(R.id.setup_welcome_image); mActionStart = findViewById(R.id.setup_start_label); mActionStart.setOnClickListener(this); @@ -244,6 +244,7 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); + mNeedsToAdjustStepNumberToSystemState = true; } private void invokeSettingsOfThisIme() { @@ -259,6 +260,14 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL intent.setAction(Settings.ACTION_INPUT_METHOD_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); startActivity(intent); + mNeedsToAdjustStepNumberToSystemState = true; + } + + void invokeInputMethodPicker() { + // Invoke input method picker. + RichInputMethodManager.getInstance().getInputMethodManager() + .showInputMethodPicker(); + mNeedsToAdjustStepNumberToSystemState = true; } void invokeSubtypeEnablerOfThisIme() { @@ -312,6 +321,9 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL @Override protected void onRestart() { super.onRestart(); + // Probably the setup wizard has been invoked from "Recent" menu. The setup step number + // needs to be adjusted to system state, because the state (IME is enabled and/or current) + // may have been changed. if (isInSetupSteps(mStepNumber)) { mStepNumber = determineSetupStepNumber(); } @@ -344,21 +356,34 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL super.onBackPressed(); } - private static void hideAndStopVideo(final VideoView videoView) { - videoView.stopPlayback(); - videoView.setVisibility(View.INVISIBLE); + void hideWelcomeVideoAndShowWelcomeImage() { + mWelcomeVideoView.setVisibility(View.GONE); + mWelcomeImageView.setImageResource(R.raw.setup_welcome_image); + mWelcomeImageView.setVisibility(View.VISIBLE); + } + + private void showAndStartWelcomeVideo() { + mWelcomeVideoView.setVisibility(View.VISIBLE); + mWelcomeVideoView.setVideoURI(mWelcomeVideoUri); + mWelcomeVideoView.start(); + } + + private void hideAndStopWelcomeVideo() { + mWelcomeVideoView.stopPlayback(); + mWelcomeVideoView.setVisibility(View.GONE); } @Override protected void onPause() { - hideAndStopVideo(mWelcomeVideoView); + hideAndStopWelcomeVideo(); super.onPause(); } @Override public void onWindowFocusChanged(final boolean hasFocus) { super.onWindowFocusChanged(hasFocus); - if (hasFocus && isInSetupSteps(mStepNumber)) { + if (hasFocus && mNeedsToAdjustStepNumberToSystemState) { + mNeedsToAdjustStepNumberToSystemState = false; mStepNumber = determineSetupStepNumber(); updateSetupStepView(); } @@ -370,12 +395,14 @@ public final class SetupWizardActivity extends Activity implements View.OnClickL mWelcomeScreen.setVisibility(welcomeScreen ? View.VISIBLE : View.GONE); mSetupScreen.setVisibility(welcomeScreen ? View.GONE : View.VISIBLE); if (welcomeScreen) { - mWelcomeVideoView.setVisibility(View.VISIBLE); - mWelcomeVideoView.setVideoURI(mWelcomeVideoUri); - mWelcomeVideoView.start(); + if (ENABLE_WELCOME_VIDEO) { + showAndStartWelcomeVideo(); + } else { + hideWelcomeVideoAndShowWelcomeImage(); + } return; } - hideAndStopVideo(mWelcomeVideoView); + hideAndStopWelcomeVideo(); final boolean isStepActionAlreadyDone = mStepNumber < determineSetupStepNumber(); mSetupStepGroup.enableStep(mStepNumber, isStepActionAlreadyDone); mActionNext.setVisibility(isStepActionAlreadyDone ? View.VISIBLE : View.GONE); diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java index b3c0faf29..8b8ea21e9 100644 --- a/java/src/com/android/inputmethod/research/ResearchLogger.java +++ b/java/src/com/android/inputmethod/research/ResearchLogger.java @@ -156,11 +156,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang // LogUnits are queued in the LogBuffers and published to the ResearchLogs when words are // complete. /* package for test */ MainLogBuffer mMainLogBuffer; // always non-null after init() is called - // TODO: Remove the feedback log. The feedback log continuously captured user data in case the - // user wanted to submit it. We now use the mUserRecordingLogBuffer to allow the user to - // explicitly reproduce a problem. - private ResearchLog mFeedbackLog; - private LogBuffer mFeedbackLogBuffer; /* package */ ResearchLog mUserRecordingLog; /* package */ LogBuffer mUserRecordingLogBuffer; private File mUserRecordingFile = null; @@ -200,15 +195,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang private long mSavedDownEventTime; private Bundle mFeedbackDialogBundle = null; private boolean mInFeedbackDialog = false; - // The feedback dialog causes stop() to be called for the keyboard connected to the original - // window. This is because the feedback dialog must present its own EditText box that displays - // a keyboard. stop() normally causes mFeedbackLogBuffer, which contains the user's data, to be - // cleared, and causes mFeedbackLog, which is ready to collect information in case the user - // wants to upload, to be closed. This is good because we don't need to log information about - // what the user is typing in the feedback dialog, but bad because this data must be uploaded. - // Here we save the LogBuffer and Log so the feedback dialog can later access their data. - private LogBuffer mSavedFeedbackLogBuffer; - private ResearchLog mSavedFeedbackLog; private Handler mUserRecordingTimeoutHandler; private static final long USER_RECORDING_TIMEOUT_MS = 30L * DateUtils.SECOND_IN_MILLIS; @@ -280,10 +266,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang publishLogUnits(logUnits, mMainResearchLog, canIncludePrivateData); } }; - - mFeedbackLog = new ResearchLog(mResearchLogDirectory.getLogFilePath( - System.currentTimeMillis(), System.nanoTime()), mLatinIME); - mFeedbackLogBuffer = new FixedLogBuffer(FEEDBACK_WORD_BUFFER_SIZE); } private void cleanLogDirectoryIfNeeded(final ResearchLogDirectory researchLogDirectory, @@ -436,7 +418,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang Log.w(TAG, "IOException when publishing LogBuffer", e); } mMainResearchLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS); - mFeedbackLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS); resetLogBuffers(); } @@ -447,8 +428,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } mMainLogBuffer.clear(); mMainResearchLog.blockingAbort(RESEARCHLOG_ABORT_TIMEOUT_IN_MS); - mFeedbackLogBuffer.clear(); - mFeedbackLog.blockingAbort(RESEARCHLOG_ABORT_TIMEOUT_IN_MS); resetLogBuffers(); } @@ -482,12 +461,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang saveRecording(); } mInFeedbackDialog = true; - mSavedFeedbackLogBuffer = mFeedbackLogBuffer; - mSavedFeedbackLog = mFeedbackLog; - // Set the non-saved versions to null so that the stop() caused by switching to the - // Feedback dialog will not close them. - mFeedbackLogBuffer = null; - mFeedbackLog = null; final Intent intent = new Intent(); intent.setClass(mLatinIME, FeedbackActivity.class); @@ -645,12 +618,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang new LogStatement("UserFeedback", false, false, "contents", "accountName", "recording"); public void sendFeedback(final String feedbackContents, final boolean includeHistory, final boolean isIncludingAccountName, final boolean isIncludingRecording) { - if (mSavedFeedbackLogBuffer == null) { - return; - } - if (!includeHistory) { - mSavedFeedbackLogBuffer.clear(); - } String recording = ""; if (isIncludingRecording) { // Try to read recording from recently written json file @@ -682,9 +649,13 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang final String accountName = isIncludingAccountName ? getAccountName() : ""; feedbackLogUnit.addLogStatement(LOGSTATEMENT_FEEDBACK, SystemClock.uptimeMillis(), feedbackContents, accountName, recording); - mFeedbackLogBuffer.shiftIn(feedbackLogUnit); - publishLogBuffer(mFeedbackLogBuffer, mSavedFeedbackLog, true /* isIncludingPrivateData */); - mSavedFeedbackLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS); + + final ResearchLog feedbackLog = new ResearchLog(mResearchLogDirectory.getLogFilePath( + System.currentTimeMillis(), System.nanoTime()), mLatinIME); + final LogBuffer feedbackLogBuffer = new LogBuffer(); + feedbackLogBuffer.shiftIn(feedbackLogUnit); + publishLogBuffer(feedbackLogBuffer, feedbackLog, true /* isIncludingPrivateData */); + feedbackLog.blockingClose(RESEARCHLOG_CLOSE_TIMEOUT_IN_MS); uploadNow(); if (isIncludingRecording && DEBUG_REPLAY_AFTER_FEEDBACK) { @@ -836,9 +807,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } if (!mCurrentLogUnit.isEmpty()) { mMainLogBuffer.shiftIn(mCurrentLogUnit); - if (mFeedbackLogBuffer != null) { - mFeedbackLogBuffer.shiftIn(mCurrentLogUnit); - } if (mUserRecordingLogBuffer != null) { mUserRecordingLogBuffer.shiftIn(mCurrentLogUnit); } @@ -884,9 +852,6 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang } else { mCurrentLogUnit = oldLogUnit; } - if (mFeedbackLogBuffer != null) { - mFeedbackLogBuffer.unshiftIn(); - } enqueueEvent(LOGSTATEMENT_UNCOMMIT_CURRENT_LOGUNIT); if (DEBUG) { Log.d(TAG, "uncommitCurrentLogUnit (dump=" + dumpCurrentLogUnit + ") back to " diff --git a/java/src/com/android/inputmethod/research/Uploader.java b/java/src/com/android/inputmethod/research/Uploader.java index ba05ec12b..c7ea3e69d 100644 --- a/java/src/com/android/inputmethod/research/Uploader.java +++ b/java/src/com/android/inputmethod/research/Uploader.java @@ -49,7 +49,7 @@ public final class Uploader { private static final boolean DEBUG = false && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; // Set IS_INHIBITING_AUTO_UPLOAD to true for local testing - private static final boolean IS_INHIBITING_AUTO_UPLOAD = false + private static final boolean IS_INHIBITING_UPLOAD = false && ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS_DEBUG; private static final int BUF_SIZE = 1024 * 8; @@ -76,7 +76,7 @@ public final class Uploader { } public boolean isPossibleToUpload() { - return hasUploadingPermission() && mUrl != null && !IS_INHIBITING_AUTO_UPLOAD; + return hasUploadingPermission() && mUrl != null && !IS_INHIBITING_UPLOAD; } private boolean hasUploadingPermission() { diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateSingleTouchTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateSingleTouchTests.java index a3f9dbdcc..d5b9d1dfd 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateSingleTouchTests.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateSingleTouchTests.java @@ -352,30 +352,34 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { // Alphabet -> shift key + letter -> alphabet. // Press and slide from shift key, enter alphabet shifted. pressAndSlideFromKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); - // Enter/release letter key, switch back to alphabet. - pressAndReleaseKey('Z', ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED); + // Enter/release letter keys, switch back to alphabet. + pressAndSlideFromKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + stopSlidingOnKey('Z', ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED); // Alphabet -> "?123" key + letter -> alphabet. // Press and slide from "123?" key, enter symbols. pressAndSlideFromKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); - // Enter/release into symbol letter key, switch back to alphabet. - pressAndReleaseKey('!', SYMBOLS_UNSHIFTED, ALPHABET_UNSHIFTED); + // Enter/release into symbol letter keys, switch back to alphabet. + pressAndSlideFromKey('@', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + stopSlidingOnKey('!', SYMBOLS_UNSHIFTED, ALPHABET_UNSHIFTED); // Alphabet shifted -> shift key + letter -> alphabet. // Press/release shift key, enter alphabet shifted. pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); // Press and slide from shift key, remain alphabet shifted. pressAndSlideFromKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); - // Enter/release letter key, switch back to alphabet (not alphabet shifted). - pressAndReleaseKey('Z', ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED); + // Enter/release letter keys, switch back to alphabet (not alphabet shifted). + pressAndSlideFromKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + stopSlidingOnKey('Z', ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED); // Alphabet shifted -> "?123" key + letter -> alphabet. // Press/release shift key, enter alphabet shifted. pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); // Press and slide from "123?" key, enter symbols. pressAndSlideFromKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); - // Enter/release into symbol letter key, switch back to alphabet (not alphabet shifted). - pressAndReleaseKey('!', SYMBOLS_UNSHIFTED, ALPHABET_UNSHIFTED); + // Enter/release into symbol letter keys, switch back to alphabet (not alphabet shifted). + pressAndSlideFromKey('@', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + stopSlidingOnKey('!', SYMBOLS_UNSHIFTED, ALPHABET_UNSHIFTED); // Alphabet shift locked -> shift key + letter -> alphabet shift locked. // Long press shift key, enter alphabet shift locked. @@ -383,14 +387,76 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { ALPHABET_SHIFT_LOCKED); // Press and slide from "123?" key, enter symbols. pressAndSlideFromKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); - // Enter/release into symbol letter key, switch back to alphabet shift locked. - pressAndReleaseKey('!', SYMBOLS_UNSHIFTED, ALPHABET_SHIFT_LOCKED); + // Enter/release into symbol letter keys, switch back to alphabet shift locked. + pressAndSlideFromKey('!', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + stopSlidingOnKey('!', SYMBOLS_UNSHIFTED, ALPHABET_SHIFT_LOCKED); // Alphabet shift locked -> "?123" key + letter -> alphabet shift locked. // Press and slide from shift key, enter alphabet shifted. pressAndSlideFromKey(CODE_SHIFT, ALPHABET_SHIFT_LOCK_SHIFTED, ALPHABET_SHIFT_LOCKED); + // Enter/release letter keys, switch back to shift locked. + pressAndSlideFromKey('A', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + stopSlidingOnKey('Z', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + } + + // Cancel sliding input in alphabet. + public void testSlidingAlphabetCancel() { + // Alphabet -> shift key + letter -> cancel -> alphabet. + // Press and slide from shift key, enter alphabet shifted. + pressAndSlideFromKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + // Press and slide from shift key, enter alphabet shifted. + pressAndSlideFromKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + // Enter/release letter key, remains in alphabet shifted. + pressAndSlideFromKey('Z', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + // Cancel sliding, switch back to alphabet. + stopSlidingAndCancel(ALPHABET_UNSHIFTED); + + // Alphabet -> "?123" key + letter -> cancel -> alphabet. + // Press and slide from "123?" key, enter symbols. + pressAndSlideFromKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Enter/release into symbol letter key, remains in symbols. + pressAndSlideFromKey('!', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Cancel sliding, switch back to alphabet. + stopSlidingAndCancel(ALPHABET_UNSHIFTED); + + // Alphabet shifted -> shift key + letter -> cancel -> alphabet. + // Press/release shift key, enter alphabet shifted. + pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + // Press and slide from shift key, remain alphabet shifted. + pressAndSlideFromKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + // Enter/release letter key, remains in alphabet shifted. + pressAndSlideFromKey('Z', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + // Cancel sliding, switch back to alphabet (not alphabet shifted). + stopSlidingAndCancel(ALPHABET_UNSHIFTED); + + // Alphabet shifted -> "?123" key + letter -> cancel -> alphabet. + // Press/release shift key, enter alphabet shifted. + pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + // Press and slide from "123?" key, enter symbols. + pressAndSlideFromKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Enter/release into symbol letter key, remains in symbols. + pressAndSlideFromKey('!', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Cancel sliding, switch back to alphabet (not alphabet shifted). + stopSlidingAndCancel(ALPHABET_UNSHIFTED); + + // Alphabet shift locked -> shift key + letter -> cancel -> alphabet shift locked. + // Long press shift key, enter alphabet shift locked. + longPressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED, + ALPHABET_SHIFT_LOCKED); + // Press and slide from "123?" key, enter symbols. + pressAndSlideFromKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Enter/release into symbol letter key, remains in symbols. + pressAndSlideFromKey('!', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Cancel sliding, switch back to alphabet shift locked. + stopSlidingAndCancel( ALPHABET_SHIFT_LOCKED); + + // Alphabet shift locked -> "?123" key + letter -> cancel -> alphabet shift locked. + // Press and slide from shift key, enter alphabet shifted. + pressAndSlideFromKey(CODE_SHIFT, ALPHABET_SHIFT_LOCK_SHIFTED, ALPHABET_SHIFT_LOCKED); + // Enter/release letter key, remains in alphabet shift locked. + pressAndSlideFromKey('Z', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); // Enter/release letter key, switch back to shift locked. - pressAndReleaseKey('Z', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + stopSlidingAndCancel(ALPHABET_SHIFT_LOCKED); } // Sliding input in symbols. @@ -398,16 +464,91 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { // Symbols -> "=\<" key + letter -> symbols. // Press/release "?123" key, enter into symbols. pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); - // Press and slide from shift key, enter symols shifted. + // Press and slide from shift key, enter symbols shifted. + pressAndSlideFromKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + // Enter/release symbol shifted letter keys, switch back to symbols. + pressAndSlideFromKey('|', SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + stopSlidingOnKey('~', SYMBOLS_SHIFTED, SYMBOLS_UNSHIFTED); + + // Symbols -> "ABC" key + letter -> Symbols. + // Press and slide from "ABC" key, enter alphabet. + pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + // Enter/release letter keys, switch back to symbols. + pressAndSlideFromKey('z', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + stopSlidingOnKey('a', ALPHABET_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press/release "ABC" key, switch to alphabet. + pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + + // Alphabet shifted -> symbols -> "ABC" key + letter -> symbols -> + // alphabet. + // Load keyboard + loadKeyboard(ALPHABET_UNSHIFTED); + // Press/release shift key, enter alphabet shifted. + pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + // Press/release "?123" key, enter into symbols. + pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press and slide from "ABC" key. + pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + // Enter/release letter keys, switch back to symbols. + pressAndSlideFromKey('z', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + stopSlidingOnKey('a', ALPHABET_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press/release "ABC" key, switch to alphabet (not alphabet shifted). + pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + + // Alphabet shift locked -> symbols -> "ABC" key + letter -> symbols -> + // alphabet shift locked. + // Load keyboard + loadKeyboard(ALPHABET_UNSHIFTED); + // Long press shift key, enter alphabet shift locked. + longPressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED, + ALPHABET_SHIFT_LOCKED); + // Press/release "?123" key, enter into symbols. + pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press and slide from "ABC" key, enter alphabet shift locked. + pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + // Enter/release letter keys, switch back to symbols. + pressAndSlideFromKey('Z', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + stopSlidingOnKey('A', ALPHABET_SHIFT_LOCKED, SYMBOLS_UNSHIFTED); + // Press/release "ABC" key, switch to alphabet shift locked. + pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + + // Alphabet shift locked -> symbols -> "=\<" key + letter -> symbols -> + // alphabet shift locked. + // Load keyboard + loadKeyboard(ALPHABET_UNSHIFTED); + // Long press shift key, enter alphabet shift locked. + longPressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED, + ALPHABET_SHIFT_LOCKED); + // Press/release "?123" key, enter into symbols. + pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press and slide from "=\<" key, enter symbols shifted. + pressAndSlideFromKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + // Enter/release symbols shift letter keys, switch back to symbols. + pressAndSlideFromKey('|', SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + stopSlidingOnKey('~', SYMBOLS_SHIFTED, SYMBOLS_UNSHIFTED); + // Press/release "ABC" key, switch to alphabet shift locked. + pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + } + + // Cancel sliding input in symbols. + public void testSlidingSymbolsCancel() { + // Symbols -> "=\<" key + letter -> cancel -> symbols. + // Press/release "?123" key, enter into symbols. + pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press and slide from shift key, enter symbols shifted. pressAndSlideFromKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); - // Enter/release symbol shifted letter key, switch back to symbols. - pressAndReleaseKey('~', SYMBOLS_SHIFTED, SYMBOLS_UNSHIFTED); + // Enter/release symbol shifted letter key, remains in symbols shifted. + pressAndSlideFromKey('|', SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + // Cancel sliding, switch back to symbols. + stopSlidingAndCancel(SYMBOLS_UNSHIFTED); // Symbols -> "ABC" key + letter -> Symbols. // Press and slide from "ABC" key, enter alphabet. pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); - // Enter/release letter key, switch back to symbols. - pressAndReleaseKey('a', ALPHABET_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Enter/release letter keys, remains in alphabet. + pressAndSlideFromKey('z', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + // Cancel sliding, switch back to symbols. + stopSlidingAndCancel(SYMBOLS_UNSHIFTED); // Press/release "ABC" key, switch to alphabet. pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); @@ -421,8 +562,10 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); // Press and slide from "ABC" key. pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); - // Enter/release letter key, switch back to symbols. - pressAndReleaseKey('a', ALPHABET_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Enter/release letter key, remains in alphabet. + pressAndSlideFromKey('z', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + // Cancel sliding, switch back to symbols. + stopSlidingAndCancel(SYMBOLS_UNSHIFTED); // Press/release "ABC" key, switch to alphabet (not alphabet shifted). pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); @@ -437,8 +580,10 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); // Press and slide from "ABC" key, enter alphabet shift locked. pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); - // Enter/release letter key, switch back to symbols. - pressAndReleaseKey('A', ALPHABET_SHIFT_LOCKED, SYMBOLS_UNSHIFTED); + // Enter/release letter key, remains in alphabet shifted. + pressAndSlideFromKey('Z', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + // Cancel sliding, switch back to symbols. + stopSlidingAndCancel(SYMBOLS_UNSHIFTED); // Press/release "ABC" key, switch to alphabet shift locked. pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); @@ -453,8 +598,10 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); // Press and slide from "=\<" key, enter symbols shifted. pressAndSlideFromKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); - // Enter/release symbols shift letter key, switch back to symbols. - pressAndReleaseKey('~', SYMBOLS_SHIFTED, SYMBOLS_UNSHIFTED); + // Enter/release symbols shift letter key, remains in symbols shifted. + pressAndSlideFromKey('|', SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + // Cancel sliding, switch back to symbols. + stopSlidingAndCancel(SYMBOLS_UNSHIFTED); // Press/release "ABC" key, switch to alphabet shift locked. pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); } @@ -468,14 +615,97 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); // Press and slide from shift key, enter symbols. pressAndSlideFromKey(CODE_SHIFT, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); - // Enter/release symbol letter key, switch back to symbols shifted. - pressAndReleaseKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_SHIFTED); + // Enter/release symbol letter keys, switch back to symbols shifted. + pressAndSlideFromKey('2', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + stopSlidingOnKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_SHIFTED); + + // Symbols shifted -> "ABC" key + letter -> symbols shifted. + // Press and slide from "ABC" key, enter alphabet. + pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + // Enter/release letter keys, switch back to symbols shifted. + pressAndSlideFromKey('z', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + stopSlidingOnKey('a', ALPHABET_UNSHIFTED, SYMBOLS_SHIFTED); + // Press/release "ABC" key, switch to alphabet. + pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + + // Alphabet shifted -> symbols shifted -> "ABC" + letter -> symbols shifted -> + // alphabet. + // Load keyboard + loadKeyboard(ALPHABET_UNSHIFTED); + // Press/release shift key, enter alphabet shifted. + pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); + // Press/release "?123" key, enter into symbols. + pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press/release "=\<" key, enter into symbols shifted. + pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + // Press and slide from "ABC" key. + pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + // Enter/release letter keys, switch back to symbols shifted. + pressAndSlideFromKey('z', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + stopSlidingOnKey('a', ALPHABET_UNSHIFTED, SYMBOLS_SHIFTED); + // Press/release "ABC" key, switch to alphabet (not alphabet shifted). + pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + + // Alphabet shift locked -> symbols shifted -> "ABC" + letter -> symbols shifted -> + // alphabet shift locked. + // Load keyboard + loadKeyboard(ALPHABET_UNSHIFTED); + // Long press shift key, enter alphabet shift locked. + longPressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED, + ALPHABET_SHIFT_LOCKED); + // Press/release "?123" key, enter into symbols. + pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press/release "=\<" key, enter into symbols shifted. + pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + // Press and slide from "ABC" key. + pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + // Enter/release letter keys, switch back to symbols shifted. + pressAndSlideFromKey('Z', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + stopSlidingOnKey('A', ALPHABET_SHIFT_LOCKED, SYMBOLS_SHIFTED); + // Press/release "ABC" key, switch to alphabet shift locked. + pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + + // Alphabet shift locked -> symbols shifted -> "?123" + letter -> symbols shifted -> + // alphabet shift locked. + // Load keyboard + loadKeyboard(ALPHABET_UNSHIFTED); + // Long press shift key, enter alphabet shift locked. + longPressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED, + ALPHABET_SHIFT_LOCKED); + // Press/release "?123" key, enter into symbols. + pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press/release "=\<" key, enter into symbols shifted. + pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + // Press and slide from "?123" key. + pressAndSlideFromKey(CODE_SHIFT, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Enter/release symbol letter keys, switch back to symbols shifted. + pressAndSlideFromKey('2', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + stopSlidingOnKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_SHIFTED); + // Press/release "ABC" key, switch to alphabet shift locked. + pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + } + + // Cancel sliding input in symbols shifted. + public void testSlidingSymbolsShiftedCancel() { + // Symbols shifted -> "?123" + letter -> symbols shifted. + // Press/release "?123" key, enter into symbols. + pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Press/release "=\<" key, enter into symbols shifted. + pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); + // Press and slide from shift key, enter symbols. + pressAndSlideFromKey(CODE_SHIFT, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Enter/release symbol letter key, remains in symbols. + pressAndSlideFromKey('2', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Cancel sliding, switch back to symbols shifted. + stopSlidingAndCancel(SYMBOLS_SHIFTED); // Symbols shifted -> "ABC" key + letter -> symbols shifted. // Press and slide from "ABC" key, enter alphabet. pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); - // Enter/release letter key, switch back to symbols shifted. - pressAndReleaseKey('a', ALPHABET_UNSHIFTED, SYMBOLS_SHIFTED); + // Enter/release letter key, remains in alphabet. + pressAndSlideFromKey('z', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + // Cancel sliding, switch back to symbols shifted. + stopSlidingAndCancel(SYMBOLS_SHIFTED); // Press/release "ABC" key, switch to alphabet. pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); @@ -491,8 +721,10 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); // Press and slide from "ABC" key. pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); - // Enter/release letter key, switch back to symbols shifted. - pressAndReleaseKey('a', ALPHABET_UNSHIFTED, SYMBOLS_SHIFTED); + // Enter/release letter key, remains in alphabet. + pressAndSlideFromKey('z', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); + // Cancel sliding, switch back to symbols shifted. + stopSlidingAndCancel(SYMBOLS_SHIFTED); // Press/release "ABC" key, switch to alphabet (not alphabet shifted). pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED); @@ -509,8 +741,10 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); // Press and slide from "ABC" key. pressAndSlideFromKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); - // Enter/release letter key, switch back to symbols shifted. - pressAndReleaseKey('A', ALPHABET_SHIFT_LOCKED, SYMBOLS_SHIFTED); + // Enter/release letter key, remains in alphabet shift locked. + pressAndSlideFromKey('Z', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); + // Cancel sliding, switch back to symbols shifted. + stopSlidingAndCancel(SYMBOLS_SHIFTED); // Press/release "ABC" key, switch to alphabet shift locked. pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); @@ -527,8 +761,10 @@ public class KeyboardStateSingleTouchTests extends KeyboardStateTestsBase { pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED); // Press and slide from "?123" key. pressAndSlideFromKey(CODE_SHIFT, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); - // Enter/release symbol letter key, switch back to symbols shifted. - pressAndReleaseKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_SHIFTED); + // Enter/release symbol letter key, remains in symbols. + pressAndSlideFromKey('2', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED); + // Cancel sliding, switch back to symbols shifted. + stopSlidingAndCancel(SYMBOLS_SHIFTED); // Press/release "ABC" key, switch to alphabet shift locked. pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED); } diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateTestsBase.java b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateTestsBase.java index 5e94aebf6..e06ca064a 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateTestsBase.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateTestsBase.java @@ -71,7 +71,7 @@ public class KeyboardStateTestsBase extends AndroidTestCase } public void releaseKey(final int code, final int afterRelease) { - mSwitcher.onCodeInput(code, SINGLE); + mSwitcher.onCodeInput(code); mSwitcher.onReleaseKey(code, NOT_SLIDING); assertLayout("afterRelease", afterRelease, mSwitcher.getLayoutId()); } @@ -87,7 +87,7 @@ public class KeyboardStateTestsBase extends AndroidTestCase } public void chordingReleaseKey(final int code, final int afterRelease) { - mSwitcher.onCodeInput(code, MULTI); + mSwitcher.onCodeInput(code); mSwitcher.onReleaseKey(code, NOT_SLIDING); assertLayout("afterRelease", afterRelease, mSwitcher.getLayoutId()); } @@ -104,6 +104,19 @@ public class KeyboardStateTestsBase extends AndroidTestCase assertLayout("afterSlide", afterSlide, mSwitcher.getLayoutId()); } + public void stopSlidingOnKey(final int code, final int afterPress, final int afterSlide) { + pressKey(code, afterPress); + mSwitcher.onCodeInput(code); + mSwitcher.onReleaseKey(code, NOT_SLIDING); + mSwitcher.onFinishSlidingInput(); + assertLayout("afterSlide", afterSlide, mSwitcher.getLayoutId()); + } + + public void stopSlidingAndCancel(final int afterCancelSliding) { + mSwitcher.onFinishSlidingInput(); + assertLayout("afterCancelSliding", afterCancelSliding, mSwitcher.getLayoutId()); + } + public void longPressKey(final int code, final int afterPress, final int afterLongPress) { pressKey(code, afterPress); mSwitcher.onLongPressTimeout(code); diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MockKeyboardSwitcher.java b/tests/src/com/android/inputmethod/keyboard/internal/MockKeyboardSwitcher.java index 74506d26a..2544b6c52 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/MockKeyboardSwitcher.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/MockKeyboardSwitcher.java @@ -185,7 +185,7 @@ public class MockKeyboardSwitcher implements KeyboardState.SwitchActions { } } - public void onCodeInput(final int code, final boolean isSinglePointer) { + public void onCodeInput(final int code) { if (mAutoCapsMode == MockConstants.CAP_MODE_WORDS) { if (Constants.isLetterCode(code)) { mAutoCapsState = (code == MockConstants.CODE_AUTO_CAPS_TRIGGER) @@ -194,10 +194,10 @@ public class MockKeyboardSwitcher implements KeyboardState.SwitchActions { } else { mAutoCapsState = mAutoCapsMode; } - mState.onCodeInput(code, isSinglePointer, mAutoCapsState); + mState.onCodeInput(code, mAutoCapsState); } - public void onCancelInput(final boolean isSinglePointer) { - mState.onCancelInput(isSinglePointer); + public void onFinishSlidingInput() { + mState.onFinishSlidingInput(); } -}
\ No newline at end of file +} diff --git a/tests/src/com/android/inputmethod/latin/InputTestsBase.java b/tests/src/com/android/inputmethod/latin/InputTestsBase.java index 807c9f3c4..aec4aaca1 100644 --- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java +++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java @@ -39,7 +39,7 @@ import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; import java.util.Locale; -public class InputTestsBase extends ServiceTestCase<LatinIME> { +public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> { private static final String PREF_DEBUG_MODE = "debug_mode"; @@ -121,7 +121,7 @@ public class InputTestsBase extends ServiceTestCase<LatinIME> { } public InputTestsBase() { - super(LatinIME.class); + super(LatinIMEForTests.class); } // TODO: Isn't there a way to make this generic somehow? We can take a <T> and return a <T> diff --git a/tests/src/com/android/inputmethod/latin/LatinIMEForTests.java b/tests/src/com/android/inputmethod/latin/LatinIMEForTests.java new file mode 100644 index 000000000..e47c55736 --- /dev/null +++ b/tests/src/com/android/inputmethod/latin/LatinIMEForTests.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2013 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.latin; + +public class LatinIMEForTests extends LatinIME { + @Override + public boolean isInputViewShown() { + return true; + } +} |