diff options
author | Justin Klaassen <justinklaassen@google.com> | 2018-01-03 13:39:41 -0500 |
---|---|---|
committer | Justin Klaassen <justinklaassen@google.com> | 2018-01-03 13:39:41 -0500 |
commit | 98fe7819c6d14f4f464a5cac047f9e82dee5da58 (patch) | |
tree | a6b8b93eb21e205b27590ab5e2a1fb9efe27f892 /android/view/inputmethod | |
parent | 4217cf85c20565a3446a662a7f07f26137b26b7f (diff) | |
download | android-28-98fe7819c6d14f4f464a5cac047f9e82dee5da58.tar.gz |
Import Android SDK Platform P [4524038]
/google/data/ro/projects/android/fetch_artifact \
--bid 4524038 \
--target sdk_phone_armv7-win_sdk \
sdk-repo-linux-sources-4524038.zip
AndroidVersion.ApiLevel has been modified to appear as 28
Change-Id: Ic193bf1cf0cae78d4f2bfb4fbddfe42025c5c3c2
Diffstat (limited to 'android/view/inputmethod')
-rw-r--r-- | android/view/inputmethod/InputMethodInfo.java | 28 | ||||
-rw-r--r-- | android/view/inputmethod/InputMethodManager.java | 206 | ||||
-rw-r--r-- | android/view/inputmethod/InputMethodManagerInternal.java | 7 |
3 files changed, 186 insertions, 55 deletions
diff --git a/android/view/inputmethod/InputMethodInfo.java b/android/view/inputmethod/InputMethodInfo.java index f0645b89..c69543f6 100644 --- a/android/view/inputmethod/InputMethodInfo.java +++ b/android/view/inputmethod/InputMethodInfo.java @@ -67,6 +67,11 @@ public final class InputMethodInfo implements Parcelable { final ResolveInfo mService; /** + * IME only supports VR mode. + */ + final boolean mIsVrOnly; + + /** * The unique string Id to identify the input method. This is generated * from the input method component. */ @@ -149,6 +154,7 @@ public final class InputMethodInfo implements Parcelable { PackageManager pm = context.getPackageManager(); String settingsActivityComponent = null; + boolean isVrOnly; int isDefaultResId = 0; XmlResourceParser parser = null; @@ -179,6 +185,7 @@ public final class InputMethodInfo implements Parcelable { com.android.internal.R.styleable.InputMethod); settingsActivityComponent = sa.getString( com.android.internal.R.styleable.InputMethod_settingsActivity); + isVrOnly = sa.getBoolean(com.android.internal.R.styleable.InputMethod_isVrOnly, false); isDefaultResId = sa.getResourceId( com.android.internal.R.styleable.InputMethod_isDefault, 0); supportsSwitchingToNextInputMethod = sa.getBoolean( @@ -254,6 +261,8 @@ public final class InputMethodInfo implements Parcelable { mIsDefaultResId = isDefaultResId; mIsAuxIme = isAuxIme; mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod; + // TODO(b/68948291): remove this meta-data before release. + mIsVrOnly = isVrOnly || service.serviceInfo.metaData.getBoolean("isVrOnly", false); } InputMethodInfo(Parcel source) { @@ -262,6 +271,7 @@ public final class InputMethodInfo implements Parcelable { mIsDefaultResId = source.readInt(); mIsAuxIme = source.readInt() == 1; mSupportsSwitchingToNextInputMethod = source.readInt() == 1; + mIsVrOnly = source.readBoolean(); mService = ResolveInfo.CREATOR.createFromParcel(source); mSubtypes = new InputMethodSubtypeArray(source); mForceDefault = false; @@ -274,7 +284,8 @@ public final class InputMethodInfo implements Parcelable { CharSequence label, String settingsActivity) { this(buildDummyResolveInfo(packageName, className, label), false /* isAuxIme */, settingsActivity, null /* subtypes */, 0 /* isDefaultResId */, - false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */); + false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, + false /* isVrOnly */); } /** @@ -285,7 +296,7 @@ public final class InputMethodInfo implements Parcelable { String settingsActivity, List<InputMethodSubtype> subtypes, int isDefaultResId, boolean forceDefault) { this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault, - true /* supportsSwitchingToNextInputMethod */); + true /* supportsSwitchingToNextInputMethod */, false /* isVrOnly */); } /** @@ -294,7 +305,7 @@ public final class InputMethodInfo implements Parcelable { */ public InputMethodInfo(ResolveInfo ri, boolean isAuxIme, String settingsActivity, List<InputMethodSubtype> subtypes, int isDefaultResId, boolean forceDefault, - boolean supportsSwitchingToNextInputMethod) { + boolean supportsSwitchingToNextInputMethod, boolean isVrOnly) { final ServiceInfo si = ri.serviceInfo; mService = ri; mId = new ComponentName(si.packageName, si.name).flattenToShortString(); @@ -304,6 +315,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes = new InputMethodSubtypeArray(subtypes); mForceDefault = forceDefault; mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod; + mIsVrOnly = isVrOnly; } private static ResolveInfo buildDummyResolveInfo(String packageName, String className, @@ -398,6 +410,14 @@ public final class InputMethodInfo implements Parcelable { } /** + * Returns true if IME supports VR mode only. + * @hide + */ + public boolean isVrOnly() { + return mIsVrOnly; + } + + /** * Return the count of the subtypes of Input Method. */ public int getSubtypeCount() { @@ -444,6 +464,7 @@ public final class InputMethodInfo implements Parcelable { public void dump(Printer pw, String prefix) { pw.println(prefix + "mId=" + mId + " mSettingsActivityName=" + mSettingsActivityName + + " mIsVrOnly=" + mIsVrOnly + " mSupportsSwitchingToNextInputMethod=" + mSupportsSwitchingToNextInputMethod); pw.println(prefix + "mIsDefaultResId=0x" + Integer.toHexString(mIsDefaultResId)); @@ -509,6 +530,7 @@ public final class InputMethodInfo implements Parcelable { dest.writeInt(mIsDefaultResId); dest.writeInt(mIsAuxIme ? 1 : 0); dest.writeInt(mSupportsSwitchingToNextInputMethod ? 1 : 0); + dest.writeBoolean(mIsVrOnly); mService.writeToParcel(dest, flags); mSubtypes.writeToParcel(dest); } diff --git a/android/view/inputmethod/InputMethodManager.java b/android/view/inputmethod/InputMethodManager.java index 92d1de8e..80d7b6b7 100644 --- a/android/view/inputmethod/InputMethodManager.java +++ b/android/view/inputmethod/InputMethodManager.java @@ -24,6 +24,7 @@ import android.annotation.RequiresPermission; import android.annotation.SystemService; import android.content.Context; import android.graphics.Rect; +import android.inputmethodservice.InputMethodService; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -280,10 +281,10 @@ public final class InputMethodManager { boolean mActive = false; /** - * Set whenever this client becomes inactive, to know we need to reset - * state with the IME the next time we receive focus. + * {@code true} if next {@link #onPostWindowFocus(View, View, int, boolean, int)} needs to + * restart input. */ - boolean mHasBeenInactive = true; + boolean mRestartOnNextWindowFocus = true; /** * As reported by IME through InputConnection. @@ -488,7 +489,7 @@ public final class InputMethodManager { // Some other client has starting using the IME, so note // that this happened and make sure our own editor's // state is reset. - mHasBeenInactive = true; + mRestartOnNextWindowFocus = true; try { // Note that finishComposingText() is allowed to run // even when we are not active. @@ -499,7 +500,7 @@ public final class InputMethodManager { // Check focus again in case that "onWindowFocus" is called before // handling this message. if (mServedView != null && mServedView.hasWindowFocus()) { - if (checkFocusNoStartInput(mHasBeenInactive)) { + if (checkFocusNoStartInput(mRestartOnNextWindowFocus)) { final int reason = active ? InputMethodClient.START_INPUT_REASON_ACTIVATED_BY_IMMS : InputMethodClient.START_INPUT_REASON_DEACTIVATED_BY_IMMS; @@ -697,6 +698,19 @@ public final class InputMethodManager { } } + /** + * Returns a list of VR InputMethod currently installed. + * @hide + */ + @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) + public List<InputMethodInfo> getVrInputMethodList() { + try { + return mService.getVrInputMethodList(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + public List<InputMethodInfo> getEnabledInputMethodList() { try { return mService.getEnabledInputMethodList(); @@ -722,7 +736,20 @@ public final class InputMethodManager { } } + /** + * @deprecated Use {@link InputMethodService#showStatusIcon(int)} instead. This method was + * intended for IME developers who should be accessing APIs through the service. APIs in this + * class are intended for app developers interacting with the IME. + */ + @Deprecated public void showStatusIcon(IBinder imeToken, String packageName, int iconId) { + showStatusIconInternal(imeToken, packageName, iconId); + } + + /** + * @hide + */ + public void showStatusIconInternal(IBinder imeToken, String packageName, int iconId) { try { mService.updateStatusIcon(imeToken, packageName, iconId); } catch (RemoteException e) { @@ -730,7 +757,20 @@ public final class InputMethodManager { } } + /** + * @deprecated Use {@link InputMethodService#hideStatusIcon()} instead. This method was + * intended for IME developers who should be accessing APIs through the service. APIs in + * this class are intended for app developers interacting with the IME. + */ + @Deprecated public void hideStatusIcon(IBinder imeToken) { + hideStatusIconInternal(imeToken); + } + + /** + * @hide + */ + public void hideStatusIconInternal(IBinder imeToken) { try { mService.updateStatusIcon(imeToken, null, 0); } catch (RemoteException e) { @@ -1108,7 +1148,6 @@ public final class InputMethodManager { } } - /** * This method toggles the input method window display. * If the input window is already displayed, it gets hidden. @@ -1294,48 +1333,31 @@ public final class InputMethodManager { + Integer.toHexString(controlFlags)); final InputBindResult res = mService.startInputOrWindowGainedFocus( startInputReason, mClient, windowGainingFocus, controlFlags, softInputMode, - windowFlags, tba, servedContext, missingMethodFlags); + windowFlags, tba, servedContext, missingMethodFlags, + view.getContext().getApplicationInfo().targetSdkVersion); if (DEBUG) Log.v(TAG, "Starting input: Bind result=" + res); - if (res != null) { - if (res.id != null) { - setInputChannelLocked(res.channel); - mBindSequence = res.sequence; - mCurMethod = res.method; - mCurId = res.id; - mNextUserActionNotificationSequenceNumber = - res.userActionNotificationSequenceNumber; - } else { - if (res.channel != null && res.channel != mCurChannel) { - res.channel.dispose(); - } - if (mCurMethod == null) { - // This means there is no input method available. - if (DEBUG) Log.v(TAG, "ABORT input: no input method!"); - return true; - } - } - } else { - if (startInputReason - == InputMethodClient.START_INPUT_REASON_WINDOW_FOCUS_GAIN) { - // We are here probably because of an obsolete window-focus-in message sent - // to windowGainingFocus. Since IMMS determines whether a Window can have - // IME focus or not by using the latest window focus state maintained in the - // WMS, this kind of race condition cannot be avoided. One obvious example - // would be that we have already received a window-focus-out message but the - // UI thread is still handling previous window-focus-in message here. - // TODO: InputBindResult should have the error code. - if (DEBUG) Log.w(TAG, "startInputOrWindowGainedFocus failed. " - + "Window focus may have already been lost. " - + "win=" + windowGainingFocus + " view=" + dumpViewInfo(view)); - if (!mActive) { - // mHasBeenInactive is a latch switch to forcefully refresh IME focus - // state when an inactive (mActive == false) client is gaining window - // focus. In case we have unnecessary disable the latch due to this - // spurious wakeup, we re-enable the latch here. - // TODO: Come up with more robust solution. - mHasBeenInactive = true; - } - } + if (res == null) { + Log.wtf(TAG, "startInputOrWindowGainedFocus must not return" + + " null. startInputReason=" + + InputMethodClient.getStartInputReason(startInputReason) + + " editorInfo=" + tba + + " controlFlags=#" + Integer.toHexString(controlFlags)); + return false; + } + if (res.id != null) { + setInputChannelLocked(res.channel); + mBindSequence = res.sequence; + mCurMethod = res.method; + mCurId = res.id; + mNextUserActionNotificationSequenceNumber = + res.userActionNotificationSequenceNumber; + } else if (res.channel != null && res.channel != mCurChannel) { + res.channel.dispose(); + } + switch (res.result) { + case InputBindResult.ResultCode.ERROR_NOT_IME_TARGET_WINDOW: + mRestartOnNextWindowFocus = true; + break; } if (mCurMethod != null && mCompletions != null) { try { @@ -1511,9 +1533,9 @@ public final class InputMethodManager { + " softInputMode=" + InputMethodClient.softInputModeToString(softInputMode) + " first=" + first + " flags=#" + Integer.toHexString(windowFlags)); - if (mHasBeenInactive) { - if (DEBUG) Log.v(TAG, "Has been inactive! Starting fresh"); - mHasBeenInactive = false; + if (mRestartOnNextWindowFocus) { + if (DEBUG) Log.v(TAG, "Restarting due to mRestartOnNextWindowFocus"); + mRestartOnNextWindowFocus = false; forceNewFocus = true; } focusInLocked(focusedView != null ? focusedView : rootView); @@ -1549,7 +1571,8 @@ public final class InputMethodManager { mService.startInputOrWindowGainedFocus( InputMethodClient.START_INPUT_REASON_WINDOW_FOCUS_GAIN_REPORT_ONLY, mClient, rootView.getWindowToken(), controlFlags, softInputMode, windowFlags, null, - null, 0 /* missingMethodFlags */); + null, 0 /* missingMethodFlags */, + rootView.getContext().getApplicationInfo().targetSdkVersion); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1787,8 +1810,19 @@ public final class InputMethodManager { * when it was started, which allows it to perform this operation on * itself. * @param id The unique identifier for the new input method to be switched to. + * @deprecated Use {@link InputMethodService#setInputMethod(String)} instead. This method + * was intended for IME developers who should be accessing APIs through the service. APIs in + * this class are intended for app developers interacting with the IME. */ + @Deprecated public void setInputMethod(IBinder token, String id) { + setInputMethodInternal(token, id); + } + + /** + * @hide + */ + public void setInputMethodInternal(IBinder token, String id) { try { mService.setInputMethod(token, id); } catch (RemoteException e) { @@ -1804,8 +1838,21 @@ public final class InputMethodManager { * itself. * @param id The unique identifier for the new input method to be switched to. * @param subtype The new subtype of the new input method to be switched to. + * @deprecated Use + * {@link InputMethodService#setInputMethodAndSubtype(String, InputMethodSubtype)} + * instead. This method was intended for IME developers who should be accessing APIs through + * the service. APIs in this class are intended for app developers interacting with the IME. */ + @Deprecated public void setInputMethodAndSubtype(IBinder token, String id, InputMethodSubtype subtype) { + setInputMethodAndSubtypeInternal(token, id, subtype); + } + + /** + * @hide + */ + public void setInputMethodAndSubtypeInternal( + IBinder token, String id, InputMethodSubtype subtype) { try { mService.setInputMethodAndSubtype(token, id, subtype); } catch (RemoteException e) { @@ -1824,8 +1871,19 @@ public final class InputMethodManager { * @param flags Provides additional operating flags. Currently may be * 0 or have the {@link #HIDE_IMPLICIT_ONLY}, * {@link #HIDE_NOT_ALWAYS} bit set. + * @deprecated Use {@link InputMethodService#hideSoftInputFromInputMethod(int)} + * instead. This method was intended for IME developers who should be accessing APIs through + * the service. APIs in this class are intended for app developers interacting with the IME. */ + @Deprecated public void hideSoftInputFromInputMethod(IBinder token, int flags) { + hideSoftInputFromInputMethodInternal(token, flags); + } + + /** + * @hide + */ + public void hideSoftInputFromInputMethodInternal(IBinder token, int flags) { try { mService.hideMySoftInput(token, flags); } catch (RemoteException e) { @@ -1845,8 +1903,19 @@ public final class InputMethodManager { * @param flags Provides additional operating flags. Currently may be * 0 or have the {@link #SHOW_IMPLICIT} or * {@link #SHOW_FORCED} bit set. + * @deprecated Use {@link InputMethodService#showSoftInputFromInputMethod(int)} + * instead. This method was intended for IME developers who should be accessing APIs through + * the service. APIs in this class are intended for app developers interacting with the IME. */ + @Deprecated public void showSoftInputFromInputMethod(IBinder token, int flags) { + showSoftInputFromInputMethodInternal(token, flags); + } + + /** + * @hide + */ + public void showSoftInputFromInputMethodInternal(IBinder token, int flags) { try { mService.showMySoftInput(token, flags); } catch (RemoteException e) { @@ -2226,8 +2295,19 @@ public final class InputMethodManager { * which allows it to perform this operation on itself. * @return true if the current input method and subtype was successfully switched to the last * used input method and subtype. + * @deprecated Use {@link InputMethodService#switchToLastInputMethod()} instead. This method + * was intended for IME developers who should be accessing APIs through the service. APIs in + * this class are intended for app developers interacting with the IME. */ + @Deprecated public boolean switchToLastInputMethod(IBinder imeToken) { + return switchToLastInputMethodInternal(imeToken); + } + + /** + * @hide + */ + public boolean switchToLastInputMethodInternal(IBinder imeToken) { synchronized (mH) { try { return mService.switchToLastInputMethod(imeToken); @@ -2246,8 +2326,19 @@ public final class InputMethodManager { * belongs to the current IME * @return true if the current input method and subtype was successfully switched to the next * input method and subtype. + * @deprecated Use {@link InputMethodService#switchToNextInputMethod(boolean)} instead. This + * method was intended for IME developers who should be accessing APIs through the service. + * APIs in this class are intended for app developers interacting with the IME. */ + @Deprecated public boolean switchToNextInputMethod(IBinder imeToken, boolean onlyCurrentIme) { + return switchToNextInputMethodInternal(imeToken, onlyCurrentIme); + } + + /** + * @hide + */ + public boolean switchToNextInputMethodInternal(IBinder imeToken, boolean onlyCurrentIme) { synchronized (mH) { try { return mService.switchToNextInputMethod(imeToken, onlyCurrentIme); @@ -2267,8 +2358,19 @@ public final class InputMethodManager { * between IMEs and subtypes. * @param imeToken Supplies the identifying token given to an input method when it was started, * which allows it to perform this operation on itself. + * @deprecated Use {@link InputMethodService#shouldOfferSwitchingToNextInputMethod()} + * instead. This method was intended for IME developers who should be accessing APIs through + * the service. APIs in this class are intended for app developers interacting with the IME. */ + @Deprecated public boolean shouldOfferSwitchingToNextInputMethod(IBinder imeToken) { + return shouldOfferSwitchingToNextInputMethodInternal(imeToken); + } + + /** + * @hide + */ + public boolean shouldOfferSwitchingToNextInputMethodInternal(IBinder imeToken) { synchronized (mH) { try { return mService.shouldOfferSwitchingToNextInputMethod(imeToken); @@ -2365,7 +2467,7 @@ public final class InputMethodManager { p.println(" mMainLooper=" + mMainLooper); p.println(" mIInputContext=" + mIInputContext); p.println(" mActive=" + mActive - + " mHasBeenInactive=" + mHasBeenInactive + + " mRestartOnNextWindowFocus=" + mRestartOnNextWindowFocus + " mBindSequence=" + mBindSequence + " mCurId=" + mCurId); p.println(" mFullscreenMode=" + mFullscreenMode); diff --git a/android/view/inputmethod/InputMethodManagerInternal.java b/android/view/inputmethod/InputMethodManagerInternal.java index 77df4e38..e13813e5 100644 --- a/android/view/inputmethod/InputMethodManagerInternal.java +++ b/android/view/inputmethod/InputMethodManagerInternal.java @@ -16,6 +16,8 @@ package android.view.inputmethod; +import android.content.ComponentName; + /** * Input method manager local system service interface. * @@ -37,4 +39,9 @@ public interface InputMethodManagerInternal { * Hides the current input method, if visible. */ void hideCurrentInputMethod(); + + /** + * Switches to VR InputMethod defined in the packageName of {@param componentName}. + */ + void startVrInputMethodNoCheck(ComponentName componentName); } |