Enable InputMethodService#onUpdateCursor behind the flag

With this CL, InputMethodService#onUpdateCursor and
InputMethodService#onUpdateCursorAnchorInfo can be enabled
on L when ENABLE_CURSOR_ANCHOR_INFO_CALLBACK and
ENABLE_CURSOR_RECT_CALLBACK are specified, respectively.

BUG: 16382260
Change-Id: I29924128f6bd2f08cbd91cc4e82c9c4a6ecce3ff
This commit is contained in:
Yohei Yukawa 2014-07-19 13:33:42 +09:00
parent 6b14bbf125
commit 3f513f107e
3 changed files with 31 additions and 39 deletions

View file

@ -17,7 +17,6 @@
package com.android.inputmethod.compat; package com.android.inputmethod.compat;
import android.inputmethodservice.InputMethodService; import android.inputmethodservice.InputMethodService;
import com.android.inputmethod.latin.define.ProductionFlags;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -35,30 +34,4 @@ public final class InputMethodServiceCompatUtils {
return (Boolean)CompatUtils.invoke(ims, false /* defaultValue */, return (Boolean)CompatUtils.invoke(ims, false /* defaultValue */,
METHOD_enableHardwareAcceleration); METHOD_enableHardwareAcceleration);
} }
public static void setCursorAnchorMonitorMode(final InputMethodService ims, final int mode) {
if (ProductionFlags.USES_CURSOR_ANCHOR_MONITOR) {
ExperimentalAPIUtils.setCursorAnchorMonitorMode(ims, mode);
}
}
/*
* For unreleased APIs. ProGuard will strip this class entirely, unless used explicitly.
*/
private static final class ExperimentalAPIUtils {
// Note that {@link InputMethodManager#setCursorAnchorMonitorMode} is not yet available as
// an official API as of API level 19 (Build.VERSION_CODES.KITKAT).
private static final Method METHOD_setCursorAnchorMonitorMode = CompatUtils.getMethod(
InputMethodService.class, "setCursorAnchorMonitorMode", int.class);
private ExperimentalAPIUtils() {
// This utility class is not publicly instantiable.
}
public static void setCursorAnchorMonitorMode(final InputMethodService ims,
final int mode) {
CompatUtils.invoke(ims, null /* defaultValue */,
METHOD_setCursorAnchorMonitorMode, mode);
}
}
} }

View file

@ -55,6 +55,7 @@ import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.accessibility.AccessibilityUtils; import com.android.inputmethod.accessibility.AccessibilityUtils;
import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.compat.InputConnectionCompatUtils;
import com.android.inputmethod.compat.InputMethodServiceCompatUtils; import com.android.inputmethod.compat.InputMethodServiceCompatUtils;
import com.android.inputmethod.dictionarypack.DictionaryPackConstants; import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
import com.android.inputmethod.event.Event; import com.android.inputmethod.event.Event;
@ -413,11 +414,14 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
if (latinIme != null) { if (latinIme != null) {
executePendingImsCallback(latinIme, editorInfo, restarting); executePendingImsCallback(latinIme, editorInfo, restarting);
latinIme.onStartInputInternal(editorInfo, restarting); latinIme.onStartInputInternal(editorInfo, restarting);
if (ProductionFlags.USES_CURSOR_ANCHOR_MONITOR) { if (ProductionFlags.ENABLE_CURSOR_RECT_CALLBACK) {
// Currently we need to call this every time when the IME is attached to InputConnectionCompatUtils.requestCursorRect(
// new application. latinIme.getCurrentInputConnection(), true /* enableMonitor */);
// TODO: Consider if we can do this automatically in the framework. }
InputMethodServiceCompatUtils.setCursorAnchorMonitorMode(latinIme, 1); if (ProductionFlags.ENABLE_CURSOR_ANCHOR_INFO_CALLBACK) {
InputConnectionCompatUtils.requestCursorAnchorInfo(
latinIme.getCurrentInputConnection(), true /* enableMonitor */,
true /* requestImmediateCallback */);
} }
} }
} }

View file

@ -23,15 +23,30 @@ public final class ProductionFlags {
public static final boolean IS_HARDWARE_KEYBOARD_SUPPORTED = false; public static final boolean IS_HARDWARE_KEYBOARD_SUPPORTED = false;
// When true, enable {@link InputMethodService#onUpdateCursor} callback with /**
// {@link InputMethodService#setCursorAnchorMonitorMode}, which is not yet available in * When true, enable {@link InputMethodService#onUpdateCursorAnchorInfo} callback via
// API level 19. Do not turn this on in production until the new API becomes publicly * {@link InputConnection#requestCursorAnchorInfo}. This flag has no effect in API Level 20
// available. * and prior. In general, this callback provides more detailed positional information,
public static final boolean USES_CURSOR_ANCHOR_MONITOR = false; * even though an explicit support is required by the editor.
*/
public static final boolean ENABLE_CURSOR_ANCHOR_INFO_CALLBACK = false;
// Include all suggestions from all dictionaries in {@link SuggestedWords#mRawSuggestions}. /**
* When true, enable {@link InputMethodService#onUpdateCursor} callback via
* {@link InputConnection#requestCursorAnchorInfo}. Although this callback has been available
* since API Level 3, the callback has never been used until API Level 20. Thus it may or may
* not work well as expected. Should rely on {@link InputMethodService#onUpdateCursorAnchorInfo}
* whenever possible since it is supposed to be more reliable and accurate.
*/
public static final boolean ENABLE_CURSOR_RECT_CALLBACK = false;
/**
* Include all suggestions from all dictionaries in {@link SuggestedWords#mRawSuggestions}.
*/
public static final boolean INCLUDE_RAW_SUGGESTIONS = false; public static final boolean INCLUDE_RAW_SUGGESTIONS = false;
// When false, the metrics logging is not yet ready to be enabled. /**
* When false, the metrics logging is not yet ready to be enabled.
*/
public static final boolean IS_METRICS_LOGGING_SUPPORTED = false; public static final boolean IS_METRICS_LOGGING_SUPPORTED = false;
} }