aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android/inputmethod/keyboard/MainKeyboardView.java')
-rw-r--r--java/src/com/android/inputmethod/keyboard/MainKeyboardView.java895
1 files changed, 0 insertions, 895 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
deleted file mode 100644
index fc8744ec6..000000000
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ /dev/null
@@ -1,895 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.keyboard;
-
-import android.animation.AnimatorInflater;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.Typeface;
-import android.preference.PreferenceManager;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.inputmethod.accessibility.AccessibilityUtils;
-import com.android.inputmethod.accessibility.MainKeyboardAccessibilityDelegate;
-import com.android.inputmethod.annotations.ExternallyReferenced;
-import com.android.inputmethod.keyboard.internal.DrawingPreviewPlacerView;
-import com.android.inputmethod.keyboard.internal.DrawingProxy;
-import com.android.inputmethod.keyboard.internal.GestureFloatingTextDrawingPreview;
-import com.android.inputmethod.keyboard.internal.GestureTrailsDrawingPreview;
-import com.android.inputmethod.keyboard.internal.KeyDrawParams;
-import com.android.inputmethod.keyboard.internal.KeyPreviewChoreographer;
-import com.android.inputmethod.keyboard.internal.KeyPreviewDrawParams;
-import com.android.inputmethod.keyboard.internal.KeyPreviewView;
-import com.android.inputmethod.keyboard.internal.MoreKeySpec;
-import com.android.inputmethod.keyboard.internal.NonDistinctMultitouchHelper;
-import com.android.inputmethod.keyboard.internal.SlidingKeyInputDrawingPreview;
-import com.android.inputmethod.keyboard.internal.TimerHandler;
-import com.android.inputmethod.latin.R;
-import com.android.inputmethod.latin.RichInputMethodSubtype;
-import com.android.inputmethod.latin.SuggestedWords;
-import com.android.inputmethod.latin.common.Constants;
-import com.android.inputmethod.latin.common.CoordinateUtils;
-import com.android.inputmethod.latin.settings.DebugSettings;
-import com.android.inputmethod.latin.utils.LanguageOnSpacebarUtils;
-import com.android.inputmethod.latin.utils.TypefaceUtils;
-
-import java.util.Locale;
-import java.util.WeakHashMap;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * A view that is responsible for detecting key presses and touch movements.
- *
- * @attr ref android.R.styleable#MainKeyboardView_languageOnSpacebarTextRatio
- * @attr ref android.R.styleable#MainKeyboardView_languageOnSpacebarTextColor
- * @attr ref android.R.styleable#MainKeyboardView_languageOnSpacebarTextShadowRadius
- * @attr ref android.R.styleable#MainKeyboardView_languageOnSpacebarTextShadowColor
- * @attr ref android.R.styleable#MainKeyboardView_languageOnSpacebarFinalAlpha
- * @attr ref android.R.styleable#MainKeyboardView_languageOnSpacebarFadeoutAnimator
- * @attr ref android.R.styleable#MainKeyboardView_altCodeKeyWhileTypingFadeoutAnimator
- * @attr ref android.R.styleable#MainKeyboardView_altCodeKeyWhileTypingFadeinAnimator
- * @attr ref android.R.styleable#MainKeyboardView_keyHysteresisDistance
- * @attr ref android.R.styleable#MainKeyboardView_touchNoiseThresholdTime
- * @attr ref android.R.styleable#MainKeyboardView_touchNoiseThresholdDistance
- * @attr ref android.R.styleable#MainKeyboardView_keySelectionByDraggingFinger
- * @attr ref android.R.styleable#MainKeyboardView_keyRepeatStartTimeout
- * @attr ref android.R.styleable#MainKeyboardView_keyRepeatInterval
- * @attr ref android.R.styleable#MainKeyboardView_longPressKeyTimeout
- * @attr ref android.R.styleable#MainKeyboardView_longPressShiftKeyTimeout
- * @attr ref android.R.styleable#MainKeyboardView_ignoreAltCodeKeyTimeout
- * @attr ref android.R.styleable#MainKeyboardView_keyPreviewLayout
- * @attr ref android.R.styleable#MainKeyboardView_keyPreviewOffset
- * @attr ref android.R.styleable#MainKeyboardView_keyPreviewHeight
- * @attr ref android.R.styleable#MainKeyboardView_keyPreviewLingerTimeout
- * @attr ref android.R.styleable#MainKeyboardView_keyPreviewShowUpAnimator
- * @attr ref android.R.styleable#MainKeyboardView_keyPreviewDismissAnimator
- * @attr ref android.R.styleable#MainKeyboardView_moreKeysKeyboardLayout
- * @attr ref android.R.styleable#MainKeyboardView_moreKeysKeyboardForActionLayout
- * @attr ref android.R.styleable#MainKeyboardView_backgroundDimAlpha
- * @attr ref android.R.styleable#MainKeyboardView_showMoreKeysKeyboardAtTouchPoint
- * @attr ref android.R.styleable#MainKeyboardView_gestureFloatingPreviewTextLingerTimeout
- * @attr ref android.R.styleable#MainKeyboardView_gestureStaticTimeThresholdAfterFastTyping
- * @attr ref android.R.styleable#MainKeyboardView_gestureDetectFastMoveSpeedThreshold
- * @attr ref android.R.styleable#MainKeyboardView_gestureDynamicThresholdDecayDuration
- * @attr ref android.R.styleable#MainKeyboardView_gestureDynamicTimeThresholdFrom
- * @attr ref android.R.styleable#MainKeyboardView_gestureDynamicTimeThresholdTo
- * @attr ref android.R.styleable#MainKeyboardView_gestureDynamicDistanceThresholdFrom
- * @attr ref android.R.styleable#MainKeyboardView_gestureDynamicDistanceThresholdTo
- * @attr ref android.R.styleable#MainKeyboardView_gestureSamplingMinimumDistance
- * @attr ref android.R.styleable#MainKeyboardView_gestureRecognitionMinimumTime
- * @attr ref android.R.styleable#MainKeyboardView_gestureRecognitionSpeedThreshold
- * @attr ref android.R.styleable#MainKeyboardView_suppressKeyPreviewAfterBatchInputDuration
- */
-public final class MainKeyboardView extends KeyboardView implements DrawingProxy,
- MoreKeysPanel.Controller {
- private static final String TAG = MainKeyboardView.class.getSimpleName();
-
- /** Listener for {@link KeyboardActionListener}. */
- private KeyboardActionListener mKeyboardActionListener;
-
- /* Space key and its icon and background. */
- private Key mSpaceKey;
- // Stuff to draw language name on spacebar.
- private final int mLanguageOnSpacebarFinalAlpha;
- private ObjectAnimator mLanguageOnSpacebarFadeoutAnimator;
- private int mLanguageOnSpacebarFormatType;
- private boolean mHasMultipleEnabledIMEsOrSubtypes;
- private int mLanguageOnSpacebarAnimAlpha = Constants.Color.ALPHA_OPAQUE;
- private final float mLanguageOnSpacebarTextRatio;
- private float mLanguageOnSpacebarTextSize;
- private final int mLanguageOnSpacebarTextColor;
- private final float mLanguageOnSpacebarTextShadowRadius;
- private final int mLanguageOnSpacebarTextShadowColor;
- private static final float LANGUAGE_ON_SPACEBAR_TEXT_SHADOW_RADIUS_DISABLED = -1.0f;
- // The minimum x-scale to fit the language name on spacebar.
- private static final float MINIMUM_XSCALE_OF_LANGUAGE_NAME = 0.8f;
-
- // Stuff to draw altCodeWhileTyping keys.
- private final ObjectAnimator mAltCodeKeyWhileTypingFadeoutAnimator;
- private final ObjectAnimator mAltCodeKeyWhileTypingFadeinAnimator;
- private int mAltCodeKeyWhileTypingAnimAlpha = Constants.Color.ALPHA_OPAQUE;
-
- // Drawing preview placer view
- private final DrawingPreviewPlacerView mDrawingPreviewPlacerView;
- private final int[] mOriginCoords = CoordinateUtils.newInstance();
- private final GestureFloatingTextDrawingPreview mGestureFloatingTextDrawingPreview;
- private final GestureTrailsDrawingPreview mGestureTrailsDrawingPreview;
- private final SlidingKeyInputDrawingPreview mSlidingKeyInputDrawingPreview;
-
- // Key preview
- private final KeyPreviewDrawParams mKeyPreviewDrawParams;
- private final KeyPreviewChoreographer mKeyPreviewChoreographer;
-
- // More keys keyboard
- private final Paint mBackgroundDimAlphaPaint = new Paint();
- private final View mMoreKeysKeyboardContainer;
- private final View mMoreKeysKeyboardForActionContainer;
- private final WeakHashMap<Key, Keyboard> mMoreKeysKeyboardCache = new WeakHashMap<>();
- private final boolean mConfigShowMoreKeysKeyboardAtTouchedPoint;
- // More keys panel (used by both more keys keyboard and more suggestions view)
- // TODO: Consider extending to support multiple more keys panels
- private MoreKeysPanel mMoreKeysPanel;
-
- // Gesture floating preview text
- // TODO: Make this parameter customizable by user via settings.
- private int mGestureFloatingPreviewTextLingerTimeout;
-
- private final KeyDetector mKeyDetector;
- private final NonDistinctMultitouchHelper mNonDistinctMultitouchHelper;
-
- private final TimerHandler mTimerHandler;
- private final int mLanguageOnSpacebarHorizontalMargin;
-
- private MainKeyboardAccessibilityDelegate mAccessibilityDelegate;
-
- public MainKeyboardView(final Context context, final AttributeSet attrs) {
- this(context, attrs, R.attr.mainKeyboardViewStyle);
- }
-
- public MainKeyboardView(final Context context, final AttributeSet attrs, final int defStyle) {
- super(context, attrs, defStyle);
-
- final DrawingPreviewPlacerView drawingPreviewPlacerView =
- new DrawingPreviewPlacerView(context, attrs);
-
- final TypedArray mainKeyboardViewAttr = context.obtainStyledAttributes(
- attrs, R.styleable.MainKeyboardView, defStyle, R.style.MainKeyboardView);
- final int ignoreAltCodeKeyTimeout = mainKeyboardViewAttr.getInt(
- R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0);
- final int gestureRecognitionUpdateTime = mainKeyboardViewAttr.getInt(
- R.styleable.MainKeyboardView_gestureRecognitionUpdateTime, 0);
- mTimerHandler = new TimerHandler(
- this, ignoreAltCodeKeyTimeout, gestureRecognitionUpdateTime);
-
- final float keyHysteresisDistance = mainKeyboardViewAttr.getDimension(
- R.styleable.MainKeyboardView_keyHysteresisDistance, 0.0f);
- final float keyHysteresisDistanceForSlidingModifier = mainKeyboardViewAttr.getDimension(
- R.styleable.MainKeyboardView_keyHysteresisDistanceForSlidingModifier, 0.0f);
- mKeyDetector = new KeyDetector(
- keyHysteresisDistance, keyHysteresisDistanceForSlidingModifier);
-
- PointerTracker.init(mainKeyboardViewAttr, mTimerHandler, this /* DrawingProxy */);
-
- final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
- final boolean forceNonDistinctMultitouch = prefs.getBoolean(
- DebugSettings.PREF_FORCE_NON_DISTINCT_MULTITOUCH, false);
- final boolean hasDistinctMultitouch = context.getPackageManager()
- .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT)
- && !forceNonDistinctMultitouch;
- mNonDistinctMultitouchHelper = hasDistinctMultitouch ? null
- : new NonDistinctMultitouchHelper();
-
- final int backgroundDimAlpha = mainKeyboardViewAttr.getInt(
- R.styleable.MainKeyboardView_backgroundDimAlpha, 0);
- mBackgroundDimAlphaPaint.setColor(Color.BLACK);
- mBackgroundDimAlphaPaint.setAlpha(backgroundDimAlpha);
- mLanguageOnSpacebarTextRatio = mainKeyboardViewAttr.getFraction(
- R.styleable.MainKeyboardView_languageOnSpacebarTextRatio, 1, 1, 1.0f);
- mLanguageOnSpacebarTextColor = mainKeyboardViewAttr.getColor(
- R.styleable.MainKeyboardView_languageOnSpacebarTextColor, 0);
- mLanguageOnSpacebarTextShadowRadius = mainKeyboardViewAttr.getFloat(
- R.styleable.MainKeyboardView_languageOnSpacebarTextShadowRadius,
- LANGUAGE_ON_SPACEBAR_TEXT_SHADOW_RADIUS_DISABLED);
- mLanguageOnSpacebarTextShadowColor = mainKeyboardViewAttr.getColor(
- R.styleable.MainKeyboardView_languageOnSpacebarTextShadowColor, 0);
- mLanguageOnSpacebarFinalAlpha = mainKeyboardViewAttr.getInt(
- R.styleable.MainKeyboardView_languageOnSpacebarFinalAlpha,
- Constants.Color.ALPHA_OPAQUE);
- final int languageOnSpacebarFadeoutAnimatorResId = mainKeyboardViewAttr.getResourceId(
- R.styleable.MainKeyboardView_languageOnSpacebarFadeoutAnimator, 0);
- final int altCodeKeyWhileTypingFadeoutAnimatorResId = mainKeyboardViewAttr.getResourceId(
- R.styleable.MainKeyboardView_altCodeKeyWhileTypingFadeoutAnimator, 0);
- final int altCodeKeyWhileTypingFadeinAnimatorResId = mainKeyboardViewAttr.getResourceId(
- R.styleable.MainKeyboardView_altCodeKeyWhileTypingFadeinAnimator, 0);
-
- mKeyPreviewDrawParams = new KeyPreviewDrawParams(mainKeyboardViewAttr);
- mKeyPreviewChoreographer = new KeyPreviewChoreographer(mKeyPreviewDrawParams);
-
- final int moreKeysKeyboardLayoutId = mainKeyboardViewAttr.getResourceId(
- R.styleable.MainKeyboardView_moreKeysKeyboardLayout, 0);
- final int moreKeysKeyboardForActionLayoutId = mainKeyboardViewAttr.getResourceId(
- R.styleable.MainKeyboardView_moreKeysKeyboardForActionLayout,
- moreKeysKeyboardLayoutId);
- mConfigShowMoreKeysKeyboardAtTouchedPoint = mainKeyboardViewAttr.getBoolean(
- R.styleable.MainKeyboardView_showMoreKeysKeyboardAtTouchedPoint, false);
-
- mGestureFloatingPreviewTextLingerTimeout = mainKeyboardViewAttr.getInt(
- R.styleable.MainKeyboardView_gestureFloatingPreviewTextLingerTimeout, 0);
-
- mGestureFloatingTextDrawingPreview = new GestureFloatingTextDrawingPreview(
- mainKeyboardViewAttr);
- mGestureFloatingTextDrawingPreview.setDrawingView(drawingPreviewPlacerView);
-
- mGestureTrailsDrawingPreview = new GestureTrailsDrawingPreview(mainKeyboardViewAttr);
- mGestureTrailsDrawingPreview.setDrawingView(drawingPreviewPlacerView);
-
- mSlidingKeyInputDrawingPreview = new SlidingKeyInputDrawingPreview(mainKeyboardViewAttr);
- mSlidingKeyInputDrawingPreview.setDrawingView(drawingPreviewPlacerView);
- mainKeyboardViewAttr.recycle();
-
- mDrawingPreviewPlacerView = drawingPreviewPlacerView;
-
- final LayoutInflater inflater = LayoutInflater.from(getContext());
- mMoreKeysKeyboardContainer = inflater.inflate(moreKeysKeyboardLayoutId, null);
- mMoreKeysKeyboardForActionContainer = inflater.inflate(
- moreKeysKeyboardForActionLayoutId, null);
- mLanguageOnSpacebarFadeoutAnimator = loadObjectAnimator(
- languageOnSpacebarFadeoutAnimatorResId, this);
- mAltCodeKeyWhileTypingFadeoutAnimator = loadObjectAnimator(
- altCodeKeyWhileTypingFadeoutAnimatorResId, this);
- mAltCodeKeyWhileTypingFadeinAnimator = loadObjectAnimator(
- altCodeKeyWhileTypingFadeinAnimatorResId, this);
-
- mKeyboardActionListener = KeyboardActionListener.EMPTY_LISTENER;
-
- mLanguageOnSpacebarHorizontalMargin = (int)getResources().getDimension(
- R.dimen.config_language_on_spacebar_horizontal_margin);
- }
-
- @Override
- public void setHardwareAcceleratedDrawingEnabled(final boolean enabled) {
- super.setHardwareAcceleratedDrawingEnabled(enabled);
- mDrawingPreviewPlacerView.setHardwareAcceleratedDrawingEnabled(enabled);
- }
-
- private ObjectAnimator loadObjectAnimator(final int resId, final Object target) {
- if (resId == 0) {
- // TODO: Stop returning null.
- return null;
- }
- final ObjectAnimator animator = (ObjectAnimator)AnimatorInflater.loadAnimator(
- getContext(), resId);
- if (animator != null) {
- animator.setTarget(target);
- }
- return animator;
- }
-
- private static void cancelAndStartAnimators(final ObjectAnimator animatorToCancel,
- final ObjectAnimator animatorToStart) {
- if (animatorToCancel == null || animatorToStart == null) {
- // TODO: Stop using null as a no-operation animator.
- return;
- }
- float startFraction = 0.0f;
- if (animatorToCancel.isStarted()) {
- animatorToCancel.cancel();
- startFraction = 1.0f - animatorToCancel.getAnimatedFraction();
- }
- final long startTime = (long)(animatorToStart.getDuration() * startFraction);
- animatorToStart.start();
- animatorToStart.setCurrentPlayTime(startTime);
- }
-
- // Implements {@link DrawingProxy#startWhileTypingAnimation(int)}.
- /**
- * Called when a while-typing-animation should be started.
- * @param fadeInOrOut {@link DrawingProxy#FADE_IN} starts while-typing-fade-in animation.
- * {@link DrawingProxy#FADE_OUT} starts while-typing-fade-out animation.
- */
- @Override
- public void startWhileTypingAnimation(final int fadeInOrOut) {
- switch (fadeInOrOut) {
- case DrawingProxy.FADE_IN:
- cancelAndStartAnimators(
- mAltCodeKeyWhileTypingFadeoutAnimator, mAltCodeKeyWhileTypingFadeinAnimator);
- break;
- case DrawingProxy.FADE_OUT:
- cancelAndStartAnimators(
- mAltCodeKeyWhileTypingFadeinAnimator, mAltCodeKeyWhileTypingFadeoutAnimator);
- break;
- }
- }
-
- @ExternallyReferenced
- public int getLanguageOnSpacebarAnimAlpha() {
- return mLanguageOnSpacebarAnimAlpha;
- }
-
- @ExternallyReferenced
- public void setLanguageOnSpacebarAnimAlpha(final int alpha) {
- mLanguageOnSpacebarAnimAlpha = alpha;
- invalidateKey(mSpaceKey);
- }
-
- @ExternallyReferenced
- public int getAltCodeKeyWhileTypingAnimAlpha() {
- return mAltCodeKeyWhileTypingAnimAlpha;
- }
-
- @ExternallyReferenced
- public void setAltCodeKeyWhileTypingAnimAlpha(final int alpha) {
- if (mAltCodeKeyWhileTypingAnimAlpha == alpha) {
- return;
- }
- // Update the visual of alt-code-key-while-typing.
- mAltCodeKeyWhileTypingAnimAlpha = alpha;
- final Keyboard keyboard = getKeyboard();
- if (keyboard == null) {
- return;
- }
- for (final Key key : keyboard.mAltCodeKeysWhileTyping) {
- invalidateKey(key);
- }
- }
-
- public void setKeyboardActionListener(final KeyboardActionListener listener) {
- mKeyboardActionListener = listener;
- PointerTracker.setKeyboardActionListener(listener);
- }
-
- // TODO: We should reconsider which coordinate system should be used to represent keyboard
- // event.
- public int getKeyX(final int x) {
- return Constants.isValidCoordinate(x) ? mKeyDetector.getTouchX(x) : x;
- }
-
- // TODO: We should reconsider which coordinate system should be used to represent keyboard
- // event.
- public int getKeyY(final int y) {
- return Constants.isValidCoordinate(y) ? mKeyDetector.getTouchY(y) : y;
- }
-
- /**
- * Attaches a keyboard to this view. The keyboard can be switched at any time and the
- * view will re-layout itself to accommodate the keyboard.
- * @see Keyboard
- * @see #getKeyboard()
- * @param keyboard the keyboard to display in this view
- */
- @Override
- public void setKeyboard(final Keyboard keyboard) {
- // Remove any pending messages, except dismissing preview and key repeat.
- mTimerHandler.cancelLongPressTimers();
- super.setKeyboard(keyboard);
- mKeyDetector.setKeyboard(
- keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection());
- PointerTracker.setKeyDetector(mKeyDetector);
- mMoreKeysKeyboardCache.clear();
-
- mSpaceKey = keyboard.getKey(Constants.CODE_SPACE);
- final int keyHeight = keyboard.mMostCommonKeyHeight - keyboard.mVerticalGap;
- mLanguageOnSpacebarTextSize = keyHeight * mLanguageOnSpacebarTextRatio;
-
- if (AccessibilityUtils.getInstance().isAccessibilityEnabled()) {
- if (mAccessibilityDelegate == null) {
- mAccessibilityDelegate = new MainKeyboardAccessibilityDelegate(this, mKeyDetector);
- }
- mAccessibilityDelegate.setKeyboard(keyboard);
- } else {
- mAccessibilityDelegate = null;
- }
- }
-
- /**
- * Enables or disables the key preview popup. This is a popup that shows a magnified
- * version of the depressed key. By default the preview is enabled.
- * @param previewEnabled whether or not to enable the key feedback preview
- * @param delay the delay after which the preview is dismissed
- */
- public void setKeyPreviewPopupEnabled(final boolean previewEnabled, final int delay) {
- mKeyPreviewDrawParams.setPopupEnabled(previewEnabled, delay);
- }
-
- /**
- * Enables or disables the key preview popup animations and set animations' parameters.
- *
- * @param hasCustomAnimationParams false to use the default key preview popup animations
- * specified by keyPreviewShowUpAnimator and keyPreviewDismissAnimator attributes.
- * true to override the default animations with the specified parameters.
- * @param showUpStartXScale from this x-scale the show up animation will start.
- * @param showUpStartYScale from this y-scale the show up animation will start.
- * @param showUpDuration the duration of the show up animation in milliseconds.
- * @param dismissEndXScale to this x-scale the dismiss animation will end.
- * @param dismissEndYScale to this y-scale the dismiss animation will end.
- * @param dismissDuration the duration of the dismiss animation in milliseconds.
- */
- public void setKeyPreviewAnimationParams(final boolean hasCustomAnimationParams,
- final float showUpStartXScale, final float showUpStartYScale, final int showUpDuration,
- final float dismissEndXScale, final float dismissEndYScale, final int dismissDuration) {
- mKeyPreviewDrawParams.setAnimationParams(hasCustomAnimationParams,
- showUpStartXScale, showUpStartYScale, showUpDuration,
- dismissEndXScale, dismissEndYScale, dismissDuration);
- }
-
- private void locatePreviewPlacerView() {
- getLocationInWindow(mOriginCoords);
- mDrawingPreviewPlacerView.setKeyboardViewGeometry(mOriginCoords, getWidth(), getHeight());
- }
-
- private void installPreviewPlacerView() {
- final View rootView = getRootView();
- if (rootView == null) {
- Log.w(TAG, "Cannot find root view");
- return;
- }
- final ViewGroup windowContentView = (ViewGroup)rootView.findViewById(android.R.id.content);
- // Note: It'd be very weird if we get null by android.R.id.content.
- if (windowContentView == null) {
- Log.w(TAG, "Cannot find android.R.id.content view to add DrawingPreviewPlacerView");
- return;
- }
- windowContentView.addView(mDrawingPreviewPlacerView);
- }
-
- // Implements {@link DrawingProxy#onKeyPressed(Key,boolean)}.
- @Override
- public void onKeyPressed(@Nonnull final Key key, final boolean withPreview) {
- key.onPressed();
- invalidateKey(key);
- if (withPreview && !key.noKeyPreview()) {
- showKeyPreview(key);
- }
- }
-
- private void showKeyPreview(@Nonnull final Key key) {
- final Keyboard keyboard = getKeyboard();
- if (keyboard == null) {
- return;
- }
- final KeyPreviewDrawParams previewParams = mKeyPreviewDrawParams;
- if (!previewParams.isPopupEnabled()) {
- previewParams.setVisibleOffset(-keyboard.mVerticalGap);
- return;
- }
-
- locatePreviewPlacerView();
- getLocationInWindow(mOriginCoords);
- mKeyPreviewChoreographer.placeAndShowKeyPreview(key, keyboard.mIconsSet, getKeyDrawParams(),
- getWidth(), mOriginCoords, mDrawingPreviewPlacerView, isHardwareAccelerated());
- }
-
- private void dismissKeyPreviewWithoutDelay(@Nonnull final Key key) {
- mKeyPreviewChoreographer.dismissKeyPreview(key, false /* withAnimation */);
- invalidateKey(key);
- }
-
- // Implements {@link DrawingProxy#onKeyReleased(Key,boolean)}.
- @Override
- public void onKeyReleased(@Nonnull final Key key, final boolean withAnimation) {
- key.onReleased();
- invalidateKey(key);
- if (!key.noKeyPreview()) {
- if (withAnimation) {
- dismissKeyPreview(key);
- } else {
- dismissKeyPreviewWithoutDelay(key);
- }
- }
- }
-
- private void dismissKeyPreview(@Nonnull final Key key) {
- if (isHardwareAccelerated()) {
- mKeyPreviewChoreographer.dismissKeyPreview(key, true /* withAnimation */);
- return;
- }
- // TODO: Implement preference option to control key preview method and duration.
- mTimerHandler.postDismissKeyPreview(key, mKeyPreviewDrawParams.getLingerTimeout());
- }
-
- public void setSlidingKeyInputPreviewEnabled(final boolean enabled) {
- mSlidingKeyInputDrawingPreview.setPreviewEnabled(enabled);
- }
-
- @Override
- public void showSlidingKeyInputPreview(@Nullable final PointerTracker tracker) {
- locatePreviewPlacerView();
- if (tracker != null) {
- mSlidingKeyInputDrawingPreview.setPreviewPosition(tracker);
- } else {
- mSlidingKeyInputDrawingPreview.dismissSlidingKeyInputPreview();
- }
- }
-
- private void setGesturePreviewMode(final boolean isGestureTrailEnabled,
- final boolean isGestureFloatingPreviewTextEnabled) {
- mGestureFloatingTextDrawingPreview.setPreviewEnabled(isGestureFloatingPreviewTextEnabled);
- mGestureTrailsDrawingPreview.setPreviewEnabled(isGestureTrailEnabled);
- }
-
- public void showGestureFloatingPreviewText(@Nonnull final SuggestedWords suggestedWords,
- final boolean dismissDelayed) {
- locatePreviewPlacerView();
- final GestureFloatingTextDrawingPreview gestureFloatingTextDrawingPreview =
- mGestureFloatingTextDrawingPreview;
- gestureFloatingTextDrawingPreview.setSuggetedWords(suggestedWords);
- if (dismissDelayed) {
- mTimerHandler.postDismissGestureFloatingPreviewText(
- mGestureFloatingPreviewTextLingerTimeout);
- }
- }
-
- // Implements {@link DrawingProxy#dismissGestureFloatingPreviewTextWithoutDelay()}.
- @Override
- public void dismissGestureFloatingPreviewTextWithoutDelay() {
- mGestureFloatingTextDrawingPreview.dismissGestureFloatingPreviewText();
- }
-
- @Override
- public void showGestureTrail(@Nonnull final PointerTracker tracker,
- final boolean showsFloatingPreviewText) {
- locatePreviewPlacerView();
- if (showsFloatingPreviewText) {
- mGestureFloatingTextDrawingPreview.setPreviewPosition(tracker);
- }
- mGestureTrailsDrawingPreview.setPreviewPosition(tracker);
- }
-
- // Note that this method is called from a non-UI thread.
- @SuppressWarnings("static-method")
- public void setMainDictionaryAvailability(final boolean mainDictionaryAvailable) {
- PointerTracker.setMainDictionaryAvailability(mainDictionaryAvailable);
- }
-
- public void setGestureHandlingEnabledByUser(final boolean isGestureHandlingEnabledByUser,
- final boolean isGestureTrailEnabled,
- final boolean isGestureFloatingPreviewTextEnabled) {
- PointerTracker.setGestureHandlingEnabledByUser(isGestureHandlingEnabledByUser);
- setGesturePreviewMode(isGestureHandlingEnabledByUser && isGestureTrailEnabled,
- isGestureHandlingEnabledByUser && isGestureFloatingPreviewTextEnabled);
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- installPreviewPlacerView();
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- mDrawingPreviewPlacerView.removeAllViews();
- }
-
- // Implements {@link DrawingProxy@showMoreKeysKeyboard(Key,PointerTracker)}.
- @Override
- @Nullable
- public MoreKeysPanel showMoreKeysKeyboard(@Nonnull final Key key,
- @Nonnull final PointerTracker tracker) {
- final MoreKeySpec[] moreKeys = key.getMoreKeys();
- if (moreKeys == null) {
- return null;
- }
- Keyboard moreKeysKeyboard = mMoreKeysKeyboardCache.get(key);
- if (moreKeysKeyboard == null) {
- // {@link KeyPreviewDrawParams#mPreviewVisibleWidth} should have been set at
- // {@link KeyPreviewChoreographer#placeKeyPreview(Key,TextView,KeyboardIconsSet,KeyDrawParams,int,int[]},
- // though there may be some chances that the value is zero. <code>width == 0</code>
- // will cause zero-division error at
- // {@link MoreKeysKeyboardParams#setParameters(int,int,int,int,int,int,boolean,int)}.
- final boolean isSingleMoreKeyWithPreview = mKeyPreviewDrawParams.isPopupEnabled()
- && !key.noKeyPreview() && moreKeys.length == 1
- && mKeyPreviewDrawParams.getVisibleWidth() > 0;
- final MoreKeysKeyboard.Builder builder = new MoreKeysKeyboard.Builder(
- getContext(), key, getKeyboard(), isSingleMoreKeyWithPreview,
- mKeyPreviewDrawParams.getVisibleWidth(),
- mKeyPreviewDrawParams.getVisibleHeight(), newLabelPaint(key));
- moreKeysKeyboard = builder.build();
- mMoreKeysKeyboardCache.put(key, moreKeysKeyboard);
- }
-
- final View container = key.isActionKey() ? mMoreKeysKeyboardForActionContainer
- : mMoreKeysKeyboardContainer;
- final MoreKeysKeyboardView moreKeysKeyboardView =
- (MoreKeysKeyboardView)container.findViewById(R.id.more_keys_keyboard_view);
- moreKeysKeyboardView.setKeyboard(moreKeysKeyboard);
- container.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
-
- final int[] lastCoords = CoordinateUtils.newInstance();
- tracker.getLastCoordinates(lastCoords);
- final boolean keyPreviewEnabled = mKeyPreviewDrawParams.isPopupEnabled()
- && !key.noKeyPreview();
- // The more keys keyboard is usually horizontally aligned with the center of the parent key.
- // If showMoreKeysKeyboardAtTouchedPoint is true and the key preview is disabled, the more
- // keys keyboard is placed at the touch point of the parent key.
- final int pointX = (mConfigShowMoreKeysKeyboardAtTouchedPoint && !keyPreviewEnabled)
- ? CoordinateUtils.x(lastCoords)
- : key.getX() + key.getWidth() / 2;
- // The more keys keyboard is usually vertically aligned with the top edge of the parent key
- // (plus vertical gap). If the key preview is enabled, the more keys keyboard is vertically
- // aligned with the bottom edge of the visible part of the key preview.
- // {@code mPreviewVisibleOffset} has been set appropriately in
- // {@link KeyboardView#showKeyPreview(PointerTracker)}.
- final int pointY = key.getY() + mKeyPreviewDrawParams.getVisibleOffset();
- moreKeysKeyboardView.showMoreKeysPanel(this, this, pointX, pointY, mKeyboardActionListener);
- return moreKeysKeyboardView;
- }
-
- public boolean isInDraggingFinger() {
- if (isShowingMoreKeysPanel()) {
- return true;
- }
- return PointerTracker.isAnyInDraggingFinger();
- }
-
- @Override
- public void onShowMoreKeysPanel(final MoreKeysPanel panel) {
- locatePreviewPlacerView();
- // Dismiss another {@link MoreKeysPanel} that may be being showed.
- onDismissMoreKeysPanel();
- // Dismiss all key previews that may be being showed.
- PointerTracker.setReleasedKeyGraphicsToAllKeys();
- // Dismiss sliding key input preview that may be being showed.
- mSlidingKeyInputDrawingPreview.dismissSlidingKeyInputPreview();
- panel.showInParent(mDrawingPreviewPlacerView);
- mMoreKeysPanel = panel;
- }
-
- public boolean isShowingMoreKeysPanel() {
- return mMoreKeysPanel != null && mMoreKeysPanel.isShowingInParent();
- }
-
- @Override
- public void onCancelMoreKeysPanel() {
- PointerTracker.dismissAllMoreKeysPanels();
- }
-
- @Override
- public void onDismissMoreKeysPanel() {
- if (isShowingMoreKeysPanel()) {
- mMoreKeysPanel.removeFromParent();
- mMoreKeysPanel = null;
- }
- }
-
- public void startDoubleTapShiftKeyTimer() {
- mTimerHandler.startDoubleTapShiftKeyTimer();
- }
-
- public void cancelDoubleTapShiftKeyTimer() {
- mTimerHandler.cancelDoubleTapShiftKeyTimer();
- }
-
- public boolean isInDoubleTapShiftKeyTimeout() {
- return mTimerHandler.isInDoubleTapShiftKeyTimeout();
- }
-
- @Override
- public boolean onTouchEvent(final MotionEvent event) {
- if (getKeyboard() == null) {
- return false;
- }
- if (mNonDistinctMultitouchHelper != null) {
- if (event.getPointerCount() > 1 && mTimerHandler.isInKeyRepeat()) {
- // Key repeating timer will be canceled if 2 or more keys are in action.
- mTimerHandler.cancelKeyRepeatTimers();
- }
- // Non distinct multitouch screen support
- mNonDistinctMultitouchHelper.processMotionEvent(event, mKeyDetector);
- return true;
- }
- return processMotionEvent(event);
- }
-
- public boolean processMotionEvent(final MotionEvent event) {
- final int index = event.getActionIndex();
- final int id = event.getPointerId(index);
- final PointerTracker tracker = PointerTracker.getPointerTracker(id);
- // When a more keys panel is showing, we should ignore other fingers' single touch events
- // other than the finger that is showing the more keys panel.
- if (isShowingMoreKeysPanel() && !tracker.isShowingMoreKeysPanel()
- && PointerTracker.getActivePointerTrackerCount() == 1) {
- return true;
- }
- tracker.processMotionEvent(event, mKeyDetector);
- return true;
- }
-
- public void cancelAllOngoingEvents() {
- mTimerHandler.cancelAllMessages();
- PointerTracker.setReleasedKeyGraphicsToAllKeys();
- mGestureFloatingTextDrawingPreview.dismissGestureFloatingPreviewText();
- mSlidingKeyInputDrawingPreview.dismissSlidingKeyInputPreview();
- PointerTracker.dismissAllMoreKeysPanels();
- PointerTracker.cancelAllPointerTrackers();
- }
-
- public void closing() {
- cancelAllOngoingEvents();
- mMoreKeysKeyboardCache.clear();
- }
-
- public void onHideWindow() {
- onDismissMoreKeysPanel();
- final MainKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate;
- if (accessibilityDelegate != null
- && AccessibilityUtils.getInstance().isAccessibilityEnabled()) {
- accessibilityDelegate.onHideWindow();
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean onHoverEvent(final MotionEvent event) {
- final MainKeyboardAccessibilityDelegate accessibilityDelegate = mAccessibilityDelegate;
- if (accessibilityDelegate != null
- && AccessibilityUtils.getInstance().isTouchExplorationEnabled()) {
- return accessibilityDelegate.onHoverEvent(event);
- }
- return super.onHoverEvent(event);
- }
-
- public void updateShortcutKey(final boolean available) {
- final Keyboard keyboard = getKeyboard();
- if (keyboard == null) {
- return;
- }
- final Key shortcutKey = keyboard.getKey(Constants.CODE_SHORTCUT);
- if (shortcutKey == null) {
- return;
- }
- shortcutKey.setEnabled(available);
- invalidateKey(shortcutKey);
- }
-
- public void startDisplayLanguageOnSpacebar(final boolean subtypeChanged,
- final int languageOnSpacebarFormatType,
- final boolean hasMultipleEnabledIMEsOrSubtypes) {
- if (subtypeChanged) {
- KeyPreviewView.clearTextCache();
- }
- mLanguageOnSpacebarFormatType = languageOnSpacebarFormatType;
- mHasMultipleEnabledIMEsOrSubtypes = hasMultipleEnabledIMEsOrSubtypes;
- final ObjectAnimator animator = mLanguageOnSpacebarFadeoutAnimator;
- if (animator == null) {
- mLanguageOnSpacebarFormatType = LanguageOnSpacebarUtils.FORMAT_TYPE_NONE;
- } else {
- if (subtypeChanged
- && languageOnSpacebarFormatType != LanguageOnSpacebarUtils.FORMAT_TYPE_NONE) {
- setLanguageOnSpacebarAnimAlpha(Constants.Color.ALPHA_OPAQUE);
- if (animator.isStarted()) {
- animator.cancel();
- }
- animator.start();
- } else {
- if (!animator.isStarted()) {
- mLanguageOnSpacebarAnimAlpha = mLanguageOnSpacebarFinalAlpha;
- }
- }
- }
- invalidateKey(mSpaceKey);
- }
-
- @Override
- protected void onDrawKeyTopVisuals(final Key key, final Canvas canvas, final Paint paint,
- final KeyDrawParams params) {
- if (key.altCodeWhileTyping() && key.isEnabled()) {
- params.mAnimAlpha = mAltCodeKeyWhileTypingAnimAlpha;
- }
- super.onDrawKeyTopVisuals(key, canvas, paint, params);
- final int code = key.getCode();
- if (code == Constants.CODE_SPACE) {
- // If input language are explicitly selected.
- if (mLanguageOnSpacebarFormatType != LanguageOnSpacebarUtils.FORMAT_TYPE_NONE) {
- drawLanguageOnSpacebar(key, canvas, paint);
- }
- // Whether space key needs to show the "..." popup hint for special purposes
- if (key.isLongPressEnabled() && mHasMultipleEnabledIMEsOrSubtypes) {
- drawKeyPopupHint(key, canvas, paint, params);
- }
- } else if (code == Constants.CODE_LANGUAGE_SWITCH) {
- drawKeyPopupHint(key, canvas, paint, params);
- }
- }
-
- private boolean fitsTextIntoWidth(final int width, final String text, final Paint paint) {
- final int maxTextWidth = width - mLanguageOnSpacebarHorizontalMargin * 2;
- paint.setTextScaleX(1.0f);
- final float textWidth = TypefaceUtils.getStringWidth(text, paint);
- if (textWidth < width) {
- return true;
- }
-
- final float scaleX = maxTextWidth / textWidth;
- if (scaleX < MINIMUM_XSCALE_OF_LANGUAGE_NAME) {
- return false;
- }
-
- paint.setTextScaleX(scaleX);
- return TypefaceUtils.getStringWidth(text, paint) < maxTextWidth;
- }
-
- // Layout language name on spacebar.
- private String layoutLanguageOnSpacebar(final Paint paint,
- final RichInputMethodSubtype subtype, final int width) {
- // Choose appropriate language name to fit into the width.
- if (mLanguageOnSpacebarFormatType == LanguageOnSpacebarUtils.FORMAT_TYPE_FULL_LOCALE) {
- final String fullText = subtype.getFullDisplayName();
- if (fitsTextIntoWidth(width, fullText, paint)) {
- return fullText;
- }
- }
-
- final String middleText = subtype.getMiddleDisplayName();
- if (fitsTextIntoWidth(width, middleText, paint)) {
- return middleText;
- }
-
- return "";
- }
-
- private void drawLanguageOnSpacebar(final Key key, final Canvas canvas, final Paint paint) {
- final Keyboard keyboard = getKeyboard();
- if (keyboard == null) {
- return;
- }
- final int width = key.getWidth();
- final int height = key.getHeight();
- paint.setTextAlign(Align.CENTER);
- paint.setTypeface(Typeface.DEFAULT);
- paint.setTextSize(mLanguageOnSpacebarTextSize);
- final String language = layoutLanguageOnSpacebar(paint, keyboard.mId.mSubtype, width);
- // Draw language text with shadow
- final float descent = paint.descent();
- final float textHeight = -paint.ascent() + descent;
- final float baseline = height / 2 + textHeight / 2;
- if (mLanguageOnSpacebarTextShadowRadius > 0.0f) {
- paint.setShadowLayer(mLanguageOnSpacebarTextShadowRadius, 0, 0,
- mLanguageOnSpacebarTextShadowColor);
- } else {
- paint.clearShadowLayer();
- }
- paint.setColor(mLanguageOnSpacebarTextColor);
- paint.setAlpha(mLanguageOnSpacebarAnimAlpha);
- canvas.drawText(language, width / 2, baseline - descent, paint);
- paint.clearShadowLayer();
- paint.setTextScaleX(1.0f);
- }
-
- @Override
- public void deallocateMemory() {
- super.deallocateMemory();
- mDrawingPreviewPlacerView.deallocateMemory();
- }
-}