Remove DrawingHandler

Change-Id: I658a5b16cca1e56f0b944009b8aef09e0a97a0db
This commit is contained in:
Tadashi G. Takaoka 2014-10-29 12:56:42 +09:00
parent ca6e5dfedb
commit 2ad6d9cda3
6 changed files with 76 additions and 111 deletions

View file

@ -39,7 +39,6 @@ import android.view.ViewGroup;
import com.android.inputmethod.accessibility.AccessibilityUtils; import com.android.inputmethod.accessibility.AccessibilityUtils;
import com.android.inputmethod.accessibility.MainKeyboardAccessibilityDelegate; import com.android.inputmethod.accessibility.MainKeyboardAccessibilityDelegate;
import com.android.inputmethod.annotations.ExternallyReferenced; import com.android.inputmethod.annotations.ExternallyReferenced;
import com.android.inputmethod.keyboard.internal.DrawingHandler;
import com.android.inputmethod.keyboard.internal.DrawingPreviewPlacerView; import com.android.inputmethod.keyboard.internal.DrawingPreviewPlacerView;
import com.android.inputmethod.keyboard.internal.GestureFloatingTextDrawingPreview; import com.android.inputmethod.keyboard.internal.GestureFloatingTextDrawingPreview;
import com.android.inputmethod.keyboard.internal.GestureTrailsDrawingPreview; import com.android.inputmethod.keyboard.internal.GestureTrailsDrawingPreview;
@ -64,6 +63,8 @@ import com.android.inputmethod.latin.utils.TypefaceUtils;
import java.util.Locale; import java.util.Locale;
import java.util.WeakHashMap; import java.util.WeakHashMap;
import javax.annotation.Nonnull;
/** /**
* A view that is responsible for detecting key presses and touch movements. * A view that is responsible for detecting key presses and touch movements.
* *
@ -108,7 +109,7 @@ import java.util.WeakHashMap;
* @attr ref R.styleable#MainKeyboardView_suppressKeyPreviewAfterBatchInputDuration * @attr ref R.styleable#MainKeyboardView_suppressKeyPreviewAfterBatchInputDuration
*/ */
public final class MainKeyboardView extends KeyboardView implements PointerTracker.DrawingProxy, public final class MainKeyboardView extends KeyboardView implements PointerTracker.DrawingProxy,
MoreKeysPanel.Controller, DrawingHandler.Callbacks, TimerHandler.Callbacks { MoreKeysPanel.Controller, TimerHandler.Callbacks {
private static final String TAG = MainKeyboardView.class.getSimpleName(); private static final String TAG = MainKeyboardView.class.getSimpleName();
/** Listener for {@link KeyboardActionListener}. */ /** Listener for {@link KeyboardActionListener}. */
@ -164,11 +165,9 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
private final KeyDetector mKeyDetector; private final KeyDetector mKeyDetector;
private final NonDistinctMultitouchHelper mNonDistinctMultitouchHelper; private final NonDistinctMultitouchHelper mNonDistinctMultitouchHelper;
private final TimerHandler mKeyTimerHandler; private final TimerHandler mTimerHandler;
private final int mLanguageOnSpacebarHorizontalMargin; private final int mLanguageOnSpacebarHorizontalMargin;
private final DrawingHandler mDrawingHandler = new DrawingHandler(this);
private MainKeyboardAccessibilityDelegate mAccessibilityDelegate; private MainKeyboardAccessibilityDelegate mAccessibilityDelegate;
public MainKeyboardView(final Context context, final AttributeSet attrs) { public MainKeyboardView(final Context context, final AttributeSet attrs) {
@ -186,7 +185,7 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0); R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0);
final int gestureRecognitionUpdateTime = mainKeyboardViewAttr.getInt( final int gestureRecognitionUpdateTime = mainKeyboardViewAttr.getInt(
R.styleable.MainKeyboardView_gestureRecognitionUpdateTime, 0); R.styleable.MainKeyboardView_gestureRecognitionUpdateTime, 0);
mKeyTimerHandler = new TimerHandler( mTimerHandler = new TimerHandler(
this, ignoreAltCodeKeyTimeout, gestureRecognitionUpdateTime); this, ignoreAltCodeKeyTimeout, gestureRecognitionUpdateTime);
final float keyHysteresisDistance = mainKeyboardViewAttr.getDimension( final float keyHysteresisDistance = mainKeyboardViewAttr.getDimension(
@ -196,7 +195,7 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
mKeyDetector = new KeyDetector( mKeyDetector = new KeyDetector(
keyHysteresisDistance, keyHysteresisDistanceForSlidingModifier); keyHysteresisDistance, keyHysteresisDistanceForSlidingModifier);
PointerTracker.init(mainKeyboardViewAttr, mKeyTimerHandler, this /* DrawingProxy */); PointerTracker.init(mainKeyboardViewAttr, mTimerHandler, this /* DrawingProxy */);
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
final boolean forceNonDistinctMultitouch = prefs.getBoolean( final boolean forceNonDistinctMultitouch = prefs.getBoolean(
@ -379,7 +378,7 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
@Override @Override
public void setKeyboard(final Keyboard keyboard) { public void setKeyboard(final Keyboard keyboard) {
// Remove any pending messages, except dismissing preview and key repeat. // Remove any pending messages, except dismissing preview and key repeat.
mKeyTimerHandler.cancelLongPressTimers(); mTimerHandler.cancelLongPressTimers();
super.setKeyboard(keyboard); super.setKeyboard(keyboard);
mKeyDetector.setKeyboard( mKeyDetector.setKeyboard(
keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection()); keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection());
@ -473,22 +472,21 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
getWidth(), mOriginCoords, mDrawingPreviewPlacerView, isHardwareAccelerated()); getWidth(), mOriginCoords, mDrawingPreviewPlacerView, isHardwareAccelerated());
} }
// Implements {@link TimerHandler.Callbacks} method. // Implements {@link TimerHandler.Callbacks#dismissKeyPreviewWithoutDelay(Key)}.
@Override @Override
public void dismissKeyPreviewWithoutDelay(final Key key) { public void dismissKeyPreviewWithoutDelay(final Key key) {
mKeyPreviewChoreographer.dismissKeyPreview(key, false /* withAnimation */); mKeyPreviewChoreographer.dismissKeyPreview(key, false /* withAnimation */);
// To redraw key top letter.
invalidateKey(key); invalidateKey(key);
} }
@Override @Override
public void dismissKeyPreview(final Key key) { public void dismissKeyPreview(final Key key) {
if (!isHardwareAccelerated()) { final KeyPreviewChoreographer keyPreviewChoreographer = mKeyPreviewChoreographer;
// TODO: Implement preference option to control key preview method and duration. if (isHardwareAccelerated()) {
mDrawingHandler.dismissKeyPreview(mKeyPreviewDrawParams.getLingerTimeout(), key); keyPreviewChoreographer.dismissKeyPreview(key, true /* withAnimation */);
return;
} }
mKeyPreviewChoreographer.dismissKeyPreview(key, true /* withAnimation */); // TODO: Implement preference option to control key preview method and duration.
mTimerHandler.postDismissKeyPreview(key, mKeyPreviewDrawParams.getLingerTimeout());
} }
public void setSlidingKeyInputPreviewEnabled(final boolean enabled) { public void setSlidingKeyInputPreviewEnabled(final boolean enabled) {
@ -512,16 +510,22 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
mGestureTrailsDrawingPreview.setPreviewEnabled(isGestureTrailEnabled); mGestureTrailsDrawingPreview.setPreviewEnabled(isGestureTrailEnabled);
} }
// Implements {@link DrawingHandler.Callbacks} method. public void showGestureFloatingPreviewText(@Nonnull final SuggestedWords suggestedWords,
@Override final boolean dismissDelayed) {
public void showGestureFloatingPreviewText(final SuggestedWords suggestedWords) {
locatePreviewPlacerView(); locatePreviewPlacerView();
mGestureFloatingTextDrawingPreview.setSuggetedWords(suggestedWords); final GestureFloatingTextDrawingPreview gestureFloatingTextDrawingPreview =
mGestureFloatingTextDrawingPreview;
gestureFloatingTextDrawingPreview.setSuggetedWords(suggestedWords);
if (dismissDelayed) {
mTimerHandler.postDismissGestureFloatingPreviewText(
mGestureFloatingPreviewTextLingerTimeout);
}
} }
public void dismissGestureFloatingPreviewText() { // Implements {@link TimerHandler.Callbacks#dismissGestureFloatingPreviewTextWithoutDelay()}.
locatePreviewPlacerView(); @Override
mDrawingHandler.dismissGestureFloatingPreviewText(mGestureFloatingPreviewTextLingerTimeout); public void dismissGestureFloatingPreviewTextWithoutDelay() {
mGestureFloatingTextDrawingPreview.dismissGestureFloatingPreviewText();
} }
@Override @Override
@ -653,7 +657,7 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
moreKeysPanel.showMoreKeysPanel(this, this, pointX, pointY, mKeyboardActionListener); moreKeysPanel.showMoreKeysPanel(this, this, pointX, pointY, mKeyboardActionListener);
tracker.onShowMoreKeysPanel(moreKeysPanel); tracker.onShowMoreKeysPanel(moreKeysPanel);
// TODO: Implement zoom in animation of more keys panel. // TODO: Implement zoom in animation of more keys panel.
dismissKeyPreviewWithoutDelay(key); mKeyPreviewChoreographer.dismissKeyPreview(key, false /* withAnimation */);
} }
public boolean isInDraggingFinger() { public boolean isInDraggingFinger() {
@ -694,15 +698,15 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
} }
public void startDoubleTapShiftKeyTimer() { public void startDoubleTapShiftKeyTimer() {
mKeyTimerHandler.startDoubleTapShiftKeyTimer(); mTimerHandler.startDoubleTapShiftKeyTimer();
} }
public void cancelDoubleTapShiftKeyTimer() { public void cancelDoubleTapShiftKeyTimer() {
mKeyTimerHandler.cancelDoubleTapShiftKeyTimer(); mTimerHandler.cancelDoubleTapShiftKeyTimer();
} }
public boolean isInDoubleTapShiftKeyTimeout() { public boolean isInDoubleTapShiftKeyTimeout() {
return mKeyTimerHandler.isInDoubleTapShiftKeyTimeout(); return mTimerHandler.isInDoubleTapShiftKeyTimeout();
} }
@Override @Override
@ -711,9 +715,9 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
return false; return false;
} }
if (mNonDistinctMultitouchHelper != null) { if (mNonDistinctMultitouchHelper != null) {
if (me.getPointerCount() > 1 && mKeyTimerHandler.isInKeyRepeat()) { if (me.getPointerCount() > 1 && mTimerHandler.isInKeyRepeat()) {
// Key repeating timer will be canceled if 2 or more keys are in action. // Key repeating timer will be canceled if 2 or more keys are in action.
mKeyTimerHandler.cancelKeyRepeatTimers(); mTimerHandler.cancelKeyRepeatTimers();
} }
// Non distinct multitouch screen support // Non distinct multitouch screen support
mNonDistinctMultitouchHelper.processMotionEvent(me, mKeyDetector); mNonDistinctMultitouchHelper.processMotionEvent(me, mKeyDetector);
@ -737,10 +741,9 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
} }
public void cancelAllOngoingEvents() { public void cancelAllOngoingEvents() {
mKeyTimerHandler.cancelAllMessages(); mTimerHandler.cancelAllMessages();
mDrawingHandler.cancelAllMessages();
PointerTracker.setReleasedKeyGraphicsToAllKeys(); PointerTracker.setReleasedKeyGraphicsToAllKeys();
dismissGestureFloatingPreviewText(); mGestureFloatingTextDrawingPreview.dismissGestureFloatingPreviewText();
dismissSlidingKeyInputPreview(); dismissSlidingKeyInputPreview();
PointerTracker.dismissAllMoreKeysPanels(); PointerTracker.dismissAllMoreKeysPanels();
PointerTracker.cancelAllPointerTrackers(); PointerTracker.cancelAllPointerTrackers();

View file

@ -1,69 +0,0 @@
/*
* 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.keyboard.internal;
import android.os.Message;
import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.internal.DrawingHandler.Callbacks;
import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.utils.LeakGuardHandlerWrapper;
import javax.annotation.Nonnull;
// TODO: Separate this class into KeyPreviewHandler and BatchInputPreviewHandler or so.
public class DrawingHandler extends LeakGuardHandlerWrapper<Callbacks> {
public interface Callbacks {
public void dismissKeyPreviewWithoutDelay(Key key);
public void showGestureFloatingPreviewText(SuggestedWords suggestedWords);
}
private static final int MSG_DISMISS_KEY_PREVIEW = 0;
private static final int MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT = 1;
public DrawingHandler(@Nonnull final Callbacks ownerInstance) {
super(ownerInstance);
}
@Override
public void handleMessage(final Message msg) {
final Callbacks callbacks = getOwnerInstance();
if (callbacks == null) {
return;
}
switch (msg.what) {
case MSG_DISMISS_KEY_PREVIEW:
callbacks.dismissKeyPreviewWithoutDelay((Key)msg.obj);
break;
case MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT:
callbacks.showGestureFloatingPreviewText(SuggestedWords.getEmptyInstance());
break;
}
}
public void dismissKeyPreview(final long delay, final Key key) {
sendMessageDelayed(obtainMessage(MSG_DISMISS_KEY_PREVIEW, key), delay);
}
public void dismissGestureFloatingPreviewText(final long delay) {
sendMessageDelayed(obtainMessage(MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT), delay);
}
public void cancelAllMessages() {
removeMessages(MSG_DISMISS_KEY_PREVIEW);
}
}

View file

@ -29,6 +29,8 @@ import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.SuggestedWords; import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.utils.CoordinateUtils; import com.android.inputmethod.latin.utils.CoordinateUtils;
import javax.annotation.Nonnull;
/** /**
* The class for single gesture preview text. The class for multiple gesture preview text will be * The class for single gesture preview text. The class for multiple gesture preview text will be
* derived from it. * derived from it.
@ -110,7 +112,11 @@ public class GestureFloatingTextDrawingPreview extends AbstractDrawingPreview {
// Nothing to do here. // Nothing to do here.
} }
public void setSuggetedWords(final SuggestedWords suggestedWords) { public void dismissGestureFloatingPreviewText() {
setSuggetedWords(SuggestedWords.getEmptyInstance());
}
public void setSuggetedWords(@Nonnull final SuggestedWords suggestedWords) {
if (!isPreviewEnabled()) { if (!isPreviewEnabled()) {
return; return;
} }

View file

@ -35,6 +35,8 @@ public final class TimerHandler extends LeakGuardHandlerWrapper<Callbacks> imple
public void startWhileTypingFadeinAnimation(); public void startWhileTypingFadeinAnimation();
public void startWhileTypingFadeoutAnimation(); public void startWhileTypingFadeoutAnimation();
public void onLongPress(PointerTracker tracker); public void onLongPress(PointerTracker tracker);
public void dismissKeyPreviewWithoutDelay(@Nonnull Key key);
public void dismissGestureFloatingPreviewTextWithoutDelay();
} }
private static final int MSG_TYPING_STATE_EXPIRED = 0; private static final int MSG_TYPING_STATE_EXPIRED = 0;
@ -43,6 +45,8 @@ public final class TimerHandler extends LeakGuardHandlerWrapper<Callbacks> imple
private static final int MSG_LONGPRESS_SHIFT_KEY = 3; private static final int MSG_LONGPRESS_SHIFT_KEY = 3;
private static final int MSG_DOUBLE_TAP_SHIFT_KEY = 4; private static final int MSG_DOUBLE_TAP_SHIFT_KEY = 4;
private static final int MSG_UPDATE_BATCH_INPUT = 5; private static final int MSG_UPDATE_BATCH_INPUT = 5;
private static final int MSG_DISMISS_KEY_PREVIEW = 6;
private static final int MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT = 7;
private final int mIgnoreAltCodeKeyTimeout; private final int mIgnoreAltCodeKeyTimeout;
private final int mGestureRecognitionUpdateTime; private final int mGestureRecognitionUpdateTime;
@ -60,22 +64,31 @@ public final class TimerHandler extends LeakGuardHandlerWrapper<Callbacks> imple
if (callbacks == null) { if (callbacks == null) {
return; return;
} }
final PointerTracker tracker = (PointerTracker) msg.obj;
switch (msg.what) { switch (msg.what) {
case MSG_TYPING_STATE_EXPIRED: case MSG_TYPING_STATE_EXPIRED:
callbacks.startWhileTypingFadeinAnimation(); callbacks.startWhileTypingFadeinAnimation();
break; break;
case MSG_REPEAT_KEY: case MSG_REPEAT_KEY:
tracker.onKeyRepeat(msg.arg1 /* code */, msg.arg2 /* repeatCount */); final PointerTracker tracker1 = (PointerTracker) msg.obj;
tracker1.onKeyRepeat(msg.arg1 /* code */, msg.arg2 /* repeatCount */);
break; break;
case MSG_LONGPRESS_KEY: case MSG_LONGPRESS_KEY:
case MSG_LONGPRESS_SHIFT_KEY: case MSG_LONGPRESS_SHIFT_KEY:
cancelLongPressTimers(); cancelLongPressTimers();
callbacks.onLongPress(tracker); final PointerTracker tracker2 = (PointerTracker) msg.obj;
callbacks.onLongPress(tracker2);
break; break;
case MSG_UPDATE_BATCH_INPUT: case MSG_UPDATE_BATCH_INPUT:
tracker.updateBatchInputByTimer(SystemClock.uptimeMillis()); final PointerTracker tracker3 = (PointerTracker) msg.obj;
startUpdateBatchInputTimer(tracker); tracker3.updateBatchInputByTimer(SystemClock.uptimeMillis());
startUpdateBatchInputTimer(tracker3);
break;
case MSG_DISMISS_KEY_PREVIEW:
final Key key = (Key) msg.obj;
callbacks.dismissKeyPreviewWithoutDelay(key);
break;
case MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT:
callbacks.dismissGestureFloatingPreviewTextWithoutDelay();
break; break;
} }
} }
@ -215,8 +228,18 @@ public final class TimerHandler extends LeakGuardHandlerWrapper<Callbacks> imple
removeMessages(MSG_UPDATE_BATCH_INPUT); removeMessages(MSG_UPDATE_BATCH_INPUT);
} }
public void postDismissKeyPreview(@Nonnull final Key key, final long delay) {
sendMessageDelayed(obtainMessage(MSG_DISMISS_KEY_PREVIEW, key), delay);
}
public void postDismissGestureFloatingPreviewText(final long delay) {
sendMessageDelayed(obtainMessage(MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT), delay);
}
public void cancelAllMessages() { public void cancelAllMessages() {
cancelAllKeyTimers(); cancelAllKeyTimers();
cancelAllUpdateBatchInputTimers(); cancelAllUpdateBatchInputTimers();
removeMessages(MSG_DISMISS_KEY_PREVIEW);
removeMessages(MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT);
} }
} }

View file

@ -1501,14 +1501,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
} }
// This method must run on the UI Thread. // This method must run on the UI Thread.
void showGesturePreviewAndSuggestionStrip(final SuggestedWords suggestedWords, void showGesturePreviewAndSuggestionStrip(@Nonnull final SuggestedWords suggestedWords,
final boolean dismissGestureFloatingPreviewText) { final boolean dismissGestureFloatingPreviewText) {
showSuggestionStrip(suggestedWords); showSuggestionStrip(suggestedWords);
final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
mainKeyboardView.showGestureFloatingPreviewText(suggestedWords); mainKeyboardView.showGestureFloatingPreviewText(suggestedWords,
if (dismissGestureFloatingPreviewText) { dismissGestureFloatingPreviewText /* dismissDelayed */);
mainKeyboardView.dismissGestureFloatingPreviewText();
}
} }
// Called from PointerTracker through the KeyboardActionListener interface // Called from PointerTracker through the KeyboardActionListener interface

View file

@ -28,6 +28,8 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import javax.annotation.Nonnull;
public class SuggestedWords { public class SuggestedWords {
public static final int INDEX_OF_TYPED_WORD = 0; public static final int INDEX_OF_TYPED_WORD = 0;
public static final int INDEX_OF_AUTO_CORRECTION = 1; public static final int INDEX_OF_AUTO_CORRECTION = 1;
@ -46,6 +48,7 @@ public class SuggestedWords {
public static final int MAX_SUGGESTIONS = 18; public static final int MAX_SUGGESTIONS = 18;
private static final ArrayList<SuggestedWordInfo> EMPTY_WORD_INFO_LIST = new ArrayList<>(0); private static final ArrayList<SuggestedWordInfo> EMPTY_WORD_INFO_LIST = new ArrayList<>(0);
@Nonnull
private static final SuggestedWords EMPTY = new SuggestedWords( private static final SuggestedWords EMPTY = new SuggestedWords(
EMPTY_WORD_INFO_LIST, null /* rawSuggestions */, false /* typedWordValid */, EMPTY_WORD_INFO_LIST, null /* rawSuggestions */, false /* typedWordValid */,
false /* willAutoCorrect */, false /* isObsoleteSuggestions */, INPUT_STYLE_NONE); false /* willAutoCorrect */, false /* isObsoleteSuggestions */, INPUT_STYLE_NONE);
@ -210,6 +213,7 @@ public class SuggestedWords {
return result; return result;
} }
@Nonnull
public static final SuggestedWords getEmptyInstance() { public static final SuggestedWords getEmptyInstance() {
return SuggestedWords.EMPTY; return SuggestedWords.EMPTY;
} }