Loading core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -51684,6 +51684,7 @@ package android.view.inputmethod { method public int describeContents(); method public void dump(android.util.Printer, String); method public android.content.ComponentName getComponent(); method public int getConfigChanges(); method public String getId(); method public int getIsDefaultResourceId(); method public String getPackageName(); core/api/test-current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -2548,6 +2548,10 @@ package android.view.inputmethod { method @NonNull public static android.view.inputmethod.InlineSuggestionsResponse newInlineSuggestionsResponse(@NonNull java.util.List<android.view.inputmethod.InlineSuggestion>); } public final class InputMethodInfo implements android.os.Parcelable { ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, int); } public final class InputMethodManager { method public int getDisplayId(); method public boolean hasActiveInputConnection(@Nullable android.view.View); Loading core/java/android/inputmethodservice/IInputMethodWrapper.java +4 −3 Original line number Diff line number Diff line Loading @@ -171,7 +171,7 @@ class IInputMethodWrapper extends IInputMethod.Stub SomeArgs args = (SomeArgs) msg.obj; try { inputMethod.initializeInternal((IBinder) args.arg1, msg.arg1, (IInputMethodPrivilegedOperations) args.arg2); (IInputMethodPrivilegedOperations) args.arg2, (int) args.arg3); } finally { args.recycle(); } Loading Loading @@ -280,9 +280,10 @@ class IInputMethodWrapper extends IInputMethod.Stub @BinderThread @Override public void initializeInternal(IBinder token, int displayId, IInputMethodPrivilegedOperations privOps) { IInputMethodPrivilegedOperations privOps, int configChanges) { mCaller.executeOrSendMessage( mCaller.obtainMessageIOO(DO_INITIALIZE_INTERNAL, displayId, token, privOps)); mCaller.obtainMessageIOOO(DO_INITIALIZE_INTERNAL, displayId, token, privOps, configChanges)); } @BinderThread Loading core/java/android/inputmethodservice/InputMethodService.java +49 −3 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; Loading Loading @@ -131,6 +132,7 @@ import android.widget.TextView; import android.window.WindowMetricsHelper; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.inputmethod.IInputContentUriToken; import com.android.internal.inputmethod.IInputMethodPrivilegedOperations; import com.android.internal.inputmethod.InputMethodPrivilegedOperations; Loading Loading @@ -513,6 +515,8 @@ public class InputMethodService extends AbstractInputMethodService { private boolean mIsAutomotive; private Handler mHandler; private boolean mImeSurfaceScheduledForRemoval; private Configuration mLastKnownConfig; private int mHandledConfigChanges; /** * An opaque {@link Binder} token of window requesting {@link InputMethodImpl#showSoftInput} Loading Loading @@ -588,12 +592,14 @@ public class InputMethodService extends AbstractInputMethodService { @MainThread @Override public final void initializeInternal(@NonNull IBinder token, int displayId, IInputMethodPrivilegedOperations privilegedOperations) { IInputMethodPrivilegedOperations privilegedOperations, int configChanges) { if (InputMethodPrivilegedOperationsRegistry.isRegistered(token)) { Log.w(TAG, "The token has already registered, ignore this initialization."); return; } Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.initializeInternal"); mHandledConfigChanges = configChanges; mPrivOps.set(privilegedOperations); InputMethodPrivilegedOperationsRegistry.put(token, mPrivOps); updateInputMethodDisplay(displayId); Loading Loading @@ -821,6 +827,9 @@ public class InputMethodService extends AbstractInputMethodService { setImeWindowStatus(mapToImeWindowStatus(), mBackDisposition); } final boolean isVisible = isInputViewShown(); if (isVisible && getResources() != null) { mLastKnownConfig = getResources().getConfiguration(); } final boolean visibilityChanged = isVisible != wasVisible; if (resultReceiver != null) { resultReceiver.send(visibilityChanged Loading Loading @@ -1428,11 +1437,38 @@ public class InputMethodService extends AbstractInputMethodService { * state: {@link #onStartInput} if input is active, and * {@link #onCreateInputView} and {@link #onStartInputView} and related * appropriate functions if the UI is displayed. * <p>Starting with {@link Build.VERSION_CODES#S}, IMEs can opt into handling configuration * changes themselves instead of being restarted with * {@link android.R.styleable#InputMethod_configChanges}. */ @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (shouldImeRestartForConfig(newConfig)) { resetStateForNewConfiguration(); } } /** * @return {@code true} if {@link InputMethodService} needs to restart to handle * .{@link #onConfigurationChanged(Configuration)} */ @VisibleForTesting boolean shouldImeRestartForConfig(@NonNull Configuration newConfig) { if (mLastKnownConfig == null) { return true; } // If the new config is the same as the config this Service is already running with, // then don't bother calling resetStateForNewConfiguration. int diff = mLastKnownConfig.diffPublicOnly(newConfig); if (diff != 0) { // remove attrs not-relevant to IME service. diff &= ActivityInfo.CONFIG_KEYBOARD_HIDDEN; diff &= ActivityInfo.CONFIG_KEYBOARD; diff &= ActivityInfo.CONFIG_NAVIGATION; } int unhandledDiff = (diff & ~mHandledConfigChanges); return unhandledDiff != 0; } private void resetStateForNewConfiguration() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.resetStateForNewConfiguration"); Loading Loading @@ -3182,6 +3218,16 @@ public class InputMethodService extends AbstractInputMethodService { } } @VisibleForTesting void setLastKnownConfig(@NonNull Configuration config) { mLastKnownConfig = config; } @VisibleForTesting void setHandledConfigChanges(int configChanges) { mHandledConfigChanges = configChanges; } void startExtractingText(boolean inputChanged) { final ExtractEditText eet = mExtractEditText; if (eet != null && getCurrentInputStarted() Loading core/java/android/view/inputmethod/InputMethod.java +1 −1 Original line number Diff line number Diff line Loading @@ -105,7 +105,7 @@ public interface InputMethod { */ @MainThread default void initializeInternal(IBinder token, int displayId, IInputMethodPrivilegedOperations privilegedOperations) { IInputMethodPrivilegedOperations privilegedOperations, int configChanges) { updateInputMethodDisplay(displayId); attachToken(token); } Loading Loading
core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -51684,6 +51684,7 @@ package android.view.inputmethod { method public int describeContents(); method public void dump(android.util.Printer, String); method public android.content.ComponentName getComponent(); method public int getConfigChanges(); method public String getId(); method public int getIsDefaultResourceId(); method public String getPackageName();
core/api/test-current.txt +4 −0 Original line number Diff line number Diff line Loading @@ -2548,6 +2548,10 @@ package android.view.inputmethod { method @NonNull public static android.view.inputmethod.InlineSuggestionsResponse newInlineSuggestionsResponse(@NonNull java.util.List<android.view.inputmethod.InlineSuggestion>); } public final class InputMethodInfo implements android.os.Parcelable { ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, int); } public final class InputMethodManager { method public int getDisplayId(); method public boolean hasActiveInputConnection(@Nullable android.view.View); Loading
core/java/android/inputmethodservice/IInputMethodWrapper.java +4 −3 Original line number Diff line number Diff line Loading @@ -171,7 +171,7 @@ class IInputMethodWrapper extends IInputMethod.Stub SomeArgs args = (SomeArgs) msg.obj; try { inputMethod.initializeInternal((IBinder) args.arg1, msg.arg1, (IInputMethodPrivilegedOperations) args.arg2); (IInputMethodPrivilegedOperations) args.arg2, (int) args.arg3); } finally { args.recycle(); } Loading Loading @@ -280,9 +280,10 @@ class IInputMethodWrapper extends IInputMethod.Stub @BinderThread @Override public void initializeInternal(IBinder token, int displayId, IInputMethodPrivilegedOperations privOps) { IInputMethodPrivilegedOperations privOps, int configChanges) { mCaller.executeOrSendMessage( mCaller.obtainMessageIOO(DO_INITIALIZE_INTERNAL, displayId, token, privOps)); mCaller.obtainMessageIOOO(DO_INITIALIZE_INTERNAL, displayId, token, privOps, configChanges)); } @BinderThread Loading
core/java/android/inputmethodservice/InputMethodService.java +49 −3 Original line number Diff line number Diff line Loading @@ -70,6 +70,7 @@ import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; Loading Loading @@ -131,6 +132,7 @@ import android.widget.TextView; import android.window.WindowMetricsHelper; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.inputmethod.IInputContentUriToken; import com.android.internal.inputmethod.IInputMethodPrivilegedOperations; import com.android.internal.inputmethod.InputMethodPrivilegedOperations; Loading Loading @@ -513,6 +515,8 @@ public class InputMethodService extends AbstractInputMethodService { private boolean mIsAutomotive; private Handler mHandler; private boolean mImeSurfaceScheduledForRemoval; private Configuration mLastKnownConfig; private int mHandledConfigChanges; /** * An opaque {@link Binder} token of window requesting {@link InputMethodImpl#showSoftInput} Loading Loading @@ -588,12 +592,14 @@ public class InputMethodService extends AbstractInputMethodService { @MainThread @Override public final void initializeInternal(@NonNull IBinder token, int displayId, IInputMethodPrivilegedOperations privilegedOperations) { IInputMethodPrivilegedOperations privilegedOperations, int configChanges) { if (InputMethodPrivilegedOperationsRegistry.isRegistered(token)) { Log.w(TAG, "The token has already registered, ignore this initialization."); return; } Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.initializeInternal"); mHandledConfigChanges = configChanges; mPrivOps.set(privilegedOperations); InputMethodPrivilegedOperationsRegistry.put(token, mPrivOps); updateInputMethodDisplay(displayId); Loading Loading @@ -821,6 +827,9 @@ public class InputMethodService extends AbstractInputMethodService { setImeWindowStatus(mapToImeWindowStatus(), mBackDisposition); } final boolean isVisible = isInputViewShown(); if (isVisible && getResources() != null) { mLastKnownConfig = getResources().getConfiguration(); } final boolean visibilityChanged = isVisible != wasVisible; if (resultReceiver != null) { resultReceiver.send(visibilityChanged Loading Loading @@ -1428,11 +1437,38 @@ public class InputMethodService extends AbstractInputMethodService { * state: {@link #onStartInput} if input is active, and * {@link #onCreateInputView} and {@link #onStartInputView} and related * appropriate functions if the UI is displayed. * <p>Starting with {@link Build.VERSION_CODES#S}, IMEs can opt into handling configuration * changes themselves instead of being restarted with * {@link android.R.styleable#InputMethod_configChanges}. */ @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (shouldImeRestartForConfig(newConfig)) { resetStateForNewConfiguration(); } } /** * @return {@code true} if {@link InputMethodService} needs to restart to handle * .{@link #onConfigurationChanged(Configuration)} */ @VisibleForTesting boolean shouldImeRestartForConfig(@NonNull Configuration newConfig) { if (mLastKnownConfig == null) { return true; } // If the new config is the same as the config this Service is already running with, // then don't bother calling resetStateForNewConfiguration. int diff = mLastKnownConfig.diffPublicOnly(newConfig); if (diff != 0) { // remove attrs not-relevant to IME service. diff &= ActivityInfo.CONFIG_KEYBOARD_HIDDEN; diff &= ActivityInfo.CONFIG_KEYBOARD; diff &= ActivityInfo.CONFIG_NAVIGATION; } int unhandledDiff = (diff & ~mHandledConfigChanges); return unhandledDiff != 0; } private void resetStateForNewConfiguration() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.resetStateForNewConfiguration"); Loading Loading @@ -3182,6 +3218,16 @@ public class InputMethodService extends AbstractInputMethodService { } } @VisibleForTesting void setLastKnownConfig(@NonNull Configuration config) { mLastKnownConfig = config; } @VisibleForTesting void setHandledConfigChanges(int configChanges) { mHandledConfigChanges = configChanges; } void startExtractingText(boolean inputChanged) { final ExtractEditText eet = mExtractEditText; if (eet != null && getCurrentInputStarted() Loading
core/java/android/view/inputmethod/InputMethod.java +1 −1 Original line number Diff line number Diff line Loading @@ -105,7 +105,7 @@ public interface InputMethod { */ @MainThread default void initializeInternal(IBinder token, int displayId, IInputMethodPrivilegedOperations privilegedOperations) { IInputMethodPrivilegedOperations privilegedOperations, int configChanges) { updateInputMethodDisplay(displayId); attachToken(token); } Loading