summaryrefslogtreecommitdiff
path: root/services/autofill
diff options
context:
space:
mode:
authorTYM Tsai <tymtsai@google.com>2020-05-04 23:11:24 +0800
committerTYM Tsai <tymtsai@google.com>2020-05-25 15:09:44 +0800
commit81cbe29a1ce566921acd5aa6c4d2cc1b35748407 (patch)
tree95ed71a981ed548523cffb3ec21eeb4d8e557376 /services/autofill
parent81fd503701c09bd1d60647f366291a051f01c8fb (diff)
Handle input method switch properly for inline suggestions
Expired the old response while received input method subtype changed. When user next tap on an autofill field, trigger a new fill request for the new input method. Bug: 150483555 Test: manual switch imput method Test: atest CtsAutoFillServiceTestCases Change-Id: I97be067db3a79d2481c05aeb59875ec24514199d
Diffstat (limited to 'services/autofill')
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerService.java23
-rw-r--r--services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java10
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java37
3 files changed, 70 insertions, 0 deletions
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index c6a54fc3d206..9432678b7d2b 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -249,6 +249,9 @@ public final class AutofillManagerService
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.AUTOFILL_MAX_VISIBLE_DATASETS), false, observer,
UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE), false, observer,
+ UserHandle.USER_ALL);
}
@Override // from AbstractMasterSystemService
@@ -263,6 +266,9 @@ public final class AutofillManagerService
case Settings.Global.AUTOFILL_MAX_VISIBLE_DATASETS:
setMaxVisibleDatasetsFromSettings();
break;
+ case Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE:
+ handleInputMethodSwitch(userId);
+ break;
default:
Slog.w(TAG, "Unexpected property (" + property + "); updating cache instead");
// fall through
@@ -273,6 +279,23 @@ public final class AutofillManagerService
}
}
+ private void handleInputMethodSwitch(@UserIdInt int userId) {
+ // TODO(b/156903336): Used the SettingsObserver with a background thread maybe slow to
+ // respond to the IME switch in certain situations.
+ // See: services/core/java/com/android/server/FgThread.java
+ // In particular, the shared background thread could be doing relatively long-running
+ // operations like saving state to disk (in addition to simply being a background priority),
+ // which can cause operations scheduled on it to be delayed for a user-noticeable amount
+ // of time.
+
+ synchronized (mLock) {
+ final AutofillManagerServiceImpl service = peekServiceForUserLocked(userId);
+ if (service != null) {
+ service.onSwitchInputMethod();
+ }
+ }
+ }
+
private void onDeviceConfigChange(@NonNull Set<String> keys) {
for (String key : keys) {
switch (key) {
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 1aeb19bb4a9e..96b593d9682f 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -1564,6 +1564,16 @@ final class AutofillManagerServiceImpl
}
}
+ void onSwitchInputMethod() {
+ synchronized (mLock) {
+ final int sessionCount = mSessions.size();
+ for (int i = 0; i < sessionCount; i++) {
+ final Session session = mSessions.valueAt(i);
+ session.onSwitchInputMethodLocked();
+ }
+ }
+ }
+
@Override
public String toString() {
return "AutofillManagerServiceImpl: [userId=" + mUserId
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 086a8be6d6cf..7957726a5a7a 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -311,6 +311,43 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
*/
private final AssistDataReceiverImpl mAssistReceiver = new AssistDataReceiverImpl();
+ void onSwitchInputMethodLocked() {
+ if (mExpiredResponse) {
+ return;
+ }
+
+ if (shouldExpireResponseOnInputMethodSwitch()) {
+ // Set the old response expired, so the next action (ACTION_VIEW_ENTERED) can trigger
+ // a new fill request.
+ mExpiredResponse = true;
+ }
+ }
+
+ private boolean shouldExpireResponseOnInputMethodSwitch() {
+ // One of below cases will need a new fill request to update the inline spec for the new
+ // input method.
+ // 1. The autofill provider supports inline suggestion and the render service is available.
+ // 2. Had triggered the augmented autofill and the render service is available. Whether the
+ // augmented autofill triggered by:
+ // a. Augmented autofill only
+ // b. The autofill provider respond null
+ if (mService.getRemoteInlineSuggestionRenderServiceLocked() == null) {
+ return false;
+ }
+
+ if (isInlineSuggestionsEnabledByAutofillProviderLocked()) {
+ return true;
+ }
+
+ final ViewState state = mViewStates.get(mCurrentViewId);
+ if (state != null
+ && (state.getState() & ViewState.STATE_TRIGGERED_AUGMENTED_AUTOFILL) != 0) {
+ return true;
+ }
+
+ return false;
+ }
+
/**
* TODO(b/151867668): improve how asynchronous data dependencies are handled, without using
* CountDownLatch.