Add audio and haptic feedback for Emoji and Suggestions
Bug: 15378862 Change-Id: Ia14929bd9eb63ad5735cae0ad98ad0e2ad301128main
parent
d022df49bd
commit
874a600dc8
|
@ -19,6 +19,8 @@
|
|||
-->
|
||||
|
||||
<!-- Note: contentDescription will be added programatically in {@link EmojiPalettesView}. -->
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="0dip"
|
||||
android:layout_weight="1.0"
|
||||
|
@ -26,4 +28,6 @@
|
|||
android:gravity="center"
|
||||
android:scaleType="center"
|
||||
android:contentDescription="@null"
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:soundEffectsEnabled="false"
|
||||
/>
|
||||
|
|
|
@ -62,11 +62,15 @@
|
|||
android:layout_height="match_parent"
|
||||
android:background="@drawable/suggestions_strip_divider" />
|
||||
<!-- TODO: Implement KeyView and replace this. -->
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<ImageButton
|
||||
android:id="@+id/emoji_keyboard_delete"
|
||||
android:layout_width="0dip"
|
||||
android:layout_weight="12.5"
|
||||
android:layout_height="match_parent"
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:soundEffectsEnabled="false"
|
||||
android:contentDescription="@string/spoken_description_delete" />
|
||||
</LinearLayout>
|
||||
<android.support.v4.view.ViewPager
|
||||
|
@ -85,18 +89,26 @@
|
|||
android:layout_weight="1"
|
||||
>
|
||||
<!-- TODO: Implement a KeyView and replace this. -->
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<TextView
|
||||
android:id="@+id/emoji_keyboard_alphabet_left"
|
||||
android:layout_width="0dip"
|
||||
android:layout_weight="0.15"
|
||||
android:gravity="center"
|
||||
android:layout_height="match_parent" />
|
||||
android:layout_height="match_parent"
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:soundEffectsEnabled="false" />
|
||||
<!-- TODO: Implement KeyView and replace this. -->
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<RelativeLayout
|
||||
android:id="@+id/emoji_keyboard_space"
|
||||
android:layout_width="0dip"
|
||||
android:layout_weight="0.70"
|
||||
android:layout_height="match_parent"
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:soundEffectsEnabled="false"
|
||||
android:contentDescription="@string/spoken_description_space">
|
||||
<!-- WORKAROUND: Show the spacebar icon as a bacground of this View. -->
|
||||
<View
|
||||
|
@ -108,11 +120,15 @@
|
|||
android:layout_centerInParent="true" />
|
||||
</RelativeLayout>
|
||||
<!-- TODO: Implement KeyView and replace this. -->
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<TextView
|
||||
android:id="@+id/emoji_keyboard_alphabet_right"
|
||||
android:layout_width="0dip"
|
||||
android:layout_weight="0.15"
|
||||
android:gravity="center"
|
||||
android:layout_height="match_parent" />
|
||||
android:layout_height="match_parent"
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:soundEffectsEnabled="false" />
|
||||
</LinearLayout>
|
||||
</com.android.inputmethod.keyboard.emoji.EmojiPalettesView>
|
||||
|
|
|
@ -18,13 +18,17 @@
|
|||
*/
|
||||
-->
|
||||
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<ImageView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="0dp"
|
||||
android:gravity="center"
|
||||
android:src="@drawable/suggestions_strip_divider"
|
||||
android:contentDescription="@null"
|
||||
android:clickable="false"
|
||||
android:longClickable="false"
|
||||
android:contentDescription="@null"
|
||||
android:padding="0dp"
|
||||
android:gravity="center" />
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:soundEffectsEnabled="false" />
|
||||
|
|
|
@ -20,13 +20,19 @@
|
|||
|
||||
<merge
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<LinearLayout
|
||||
android:id="@+id/suggestions_strip"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginLeft="@dimen/config_suggestions_strip_horizontal_margin"
|
||||
android:layout_marginRight="@dimen/config_suggestions_strip_horizontal_margin" />
|
||||
android:layout_marginRight="@dimen/config_suggestions_strip_horizontal_margin"
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:soundEffectsEnabled="false" />
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<LinearLayout
|
||||
android:id="@+id/add_to_dictionary_strip"
|
||||
android:orientation="horizontal"
|
||||
|
@ -34,7 +40,8 @@
|
|||
android:layout_height="match_parent"
|
||||
android:layout_marginLeft="@dimen/config_suggestions_strip_horizontal_margin"
|
||||
android:layout_marginRight="@dimen/config_suggestions_strip_horizontal_margin"
|
||||
android:visibility="invisible">
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:soundEffectsEnabled="false">
|
||||
<TextView
|
||||
android:id="@+id/word_to_save"
|
||||
android:layout_width="match_parent"
|
||||
|
@ -49,13 +56,17 @@
|
|||
android:textAlignment="viewStart"
|
||||
style="?attr/suggestionWordStyle" />
|
||||
</LinearLayout>
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<LinearLayout
|
||||
android:id="@+id/important_notice_strip"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginLeft="@dimen/config_suggestions_strip_horizontal_margin"
|
||||
android:layout_marginRight="@dimen/config_suggestions_strip_horizontal_margin">
|
||||
android:layout_marginRight="@dimen/config_suggestions_strip_horizontal_margin"
|
||||
android:hapticFeedbackEnabled="false"
|
||||
android:soundEffectsEnabled="false" >
|
||||
<TextView
|
||||
android:id="@+id/important_notice_title"
|
||||
android:layout_width="match_parent"
|
||||
|
|
|
@ -124,9 +124,10 @@
|
|||
<item name="android:paddingTop">0dp</item>
|
||||
<item name="android:paddingRight">@dimen/config_suggestion_text_horizontal_padding</item>
|
||||
<item name="android:paddingBottom">0dp</item>
|
||||
<!-- Provide a haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's haptic feedback settings. -->
|
||||
<!-- Provide audio and haptic feedback by ourselves based on the keyboard settings.
|
||||
We just need to ignore the system's audio and haptic feedback settings. -->
|
||||
<item name="android:hapticFeedbackEnabled">false</item>
|
||||
<item name="android:soundEffectsEnabled">false</item>
|
||||
<item name="android:focusable">false</item>
|
||||
<item name="android:clickable">false</item>
|
||||
<item name="android:singleLine">true</item>
|
||||
|
|
|
@ -46,6 +46,7 @@ import com.android.inputmethod.keyboard.KeyboardView;
|
|||
import com.android.inputmethod.keyboard.internal.KeyDrawParams;
|
||||
import com.android.inputmethod.keyboard.internal.KeyVisualAttributes;
|
||||
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
|
||||
import com.android.inputmethod.latin.AudioAndHapticFeedbackManager;
|
||||
import com.android.inputmethod.latin.Constants;
|
||||
import com.android.inputmethod.latin.R;
|
||||
import com.android.inputmethod.latin.SubtypeSwitcher;
|
||||
|
@ -240,6 +241,8 @@ public final class EmojiPalettesView extends LinearLayout implements OnTabChange
|
|||
|
||||
@Override
|
||||
public void onTabChanged(final String tabId) {
|
||||
AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback(
|
||||
Constants.CODE_UNSPECIFIED, this);
|
||||
final int categoryId = mEmojiCategory.getCategoryId(tabId);
|
||||
setCurrentCategoryId(categoryId, false /* force */);
|
||||
updateEmojiCategoryPageIdView();
|
||||
|
|
|
@ -16,14 +16,14 @@
|
|||
|
||||
package com.android.inputmethod.latin;
|
||||
|
||||
import com.android.inputmethod.latin.settings.SettingsValues;
|
||||
|
||||
import android.content.Context;
|
||||
import android.media.AudioManager;
|
||||
import android.os.Vibrator;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.inputmethod.latin.settings.SettingsValues;
|
||||
|
||||
/**
|
||||
* This class gathers audio feedback and haptic feedback functions.
|
||||
*
|
||||
|
@ -86,40 +86,41 @@ public final class AudioAndHapticFeedbackManager {
|
|||
if (mAudioManager == null) {
|
||||
return;
|
||||
}
|
||||
if (mSoundOn) {
|
||||
final int sound;
|
||||
switch (code) {
|
||||
case Constants.CODE_DELETE:
|
||||
sound = AudioManager.FX_KEYPRESS_DELETE;
|
||||
break;
|
||||
case Constants.CODE_ENTER:
|
||||
sound = AudioManager.FX_KEYPRESS_RETURN;
|
||||
break;
|
||||
case Constants.CODE_SPACE:
|
||||
sound = AudioManager.FX_KEYPRESS_SPACEBAR;
|
||||
break;
|
||||
default:
|
||||
sound = AudioManager.FX_KEYPRESS_STANDARD;
|
||||
break;
|
||||
}
|
||||
mAudioManager.playSoundEffect(sound, mSettingsValues.mKeypressSoundVolume);
|
||||
if (!mSoundOn) {
|
||||
return;
|
||||
}
|
||||
final int sound;
|
||||
switch (code) {
|
||||
case Constants.CODE_DELETE:
|
||||
sound = AudioManager.FX_KEYPRESS_DELETE;
|
||||
break;
|
||||
case Constants.CODE_ENTER:
|
||||
sound = AudioManager.FX_KEYPRESS_RETURN;
|
||||
break;
|
||||
case Constants.CODE_SPACE:
|
||||
sound = AudioManager.FX_KEYPRESS_SPACEBAR;
|
||||
break;
|
||||
default:
|
||||
sound = AudioManager.FX_KEYPRESS_STANDARD;
|
||||
break;
|
||||
}
|
||||
mAudioManager.playSoundEffect(sound, mSettingsValues.mKeypressSoundVolume);
|
||||
}
|
||||
|
||||
public void performHapticFeedback(final View viewToPerformHapticFeedbackOn) {
|
||||
if (!mSettingsValues.mVibrateOn) {
|
||||
return;
|
||||
}
|
||||
if (mSettingsValues.mKeypressVibrationDuration < 0) {
|
||||
// Go ahead with the system default
|
||||
if (viewToPerformHapticFeedbackOn != null) {
|
||||
viewToPerformHapticFeedbackOn.performHapticFeedback(
|
||||
HapticFeedbackConstants.KEYBOARD_TAP,
|
||||
HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
|
||||
}
|
||||
if (mSettingsValues.mKeypressVibrationDuration >= 0) {
|
||||
vibrate(mSettingsValues.mKeypressVibrationDuration);
|
||||
return;
|
||||
}
|
||||
vibrate(mSettingsValues.mKeypressVibrationDuration);
|
||||
// Go ahead with the system default
|
||||
if (viewToPerformHapticFeedbackOn != null) {
|
||||
viewToPerformHapticFeedbackOn.performHapticFeedback(
|
||||
HapticFeedbackConstants.KEYBOARD_TAP,
|
||||
HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
|
||||
}
|
||||
}
|
||||
|
||||
public void onSettingsChanged(final SettingsValues settingsValues) {
|
||||
|
|
|
@ -428,6 +428,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
|
|||
|
||||
@Override
|
||||
public void onClick(final View view) {
|
||||
AudioAndHapticFeedbackManager.getInstance().performHapticAndAudioFeedback(
|
||||
Constants.CODE_UNSPECIFIED, this);
|
||||
if (view == mImportantNoticeStrip) {
|
||||
mListener.showImportantNoticeContents();
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue