diff options
14 files changed, 194 insertions, 140 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 83770233bb9a..b731a3dfdd5a 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -6031,10 +6031,7 @@ package android.service.autofill.augmented { method public int getTaskId(); } - public final class FillResponse implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.service.autofill.augmented.FillResponse> CREATOR; + public final class FillResponse { } public static final class FillResponse.Builder { @@ -6048,7 +6045,6 @@ package android.service.autofill.augmented { ctor public FillWindow(); method public void destroy(); method public boolean update(@NonNull android.service.autofill.augmented.PresentationParams.Area, @NonNull android.view.View, long); - field public static final long FLAG_METADATA_ADDRESS = 1L; // 0x1L } public abstract class PresentationParams { @@ -9093,6 +9089,18 @@ package android.view.accessibility { } +package android.view.autofill { + + public final class AutofillManager { + method @NonNull public java.util.Set<android.content.ComponentName> getAugmentedAutofillDisabledActivities(); + method @NonNull public java.util.Set<java.lang.String> getAugmentedAutofillDisabledPackages(); + method public void setActivityAugmentedAutofillEnabled(@NonNull android.content.ComponentName, boolean); + method public void setAugmentedAutofillWhitelist(@Nullable java.util.List<java.lang.String>, @Nullable java.util.List<android.content.ComponentName>); + method public void setPackageAugmentedAutofillEnabled(@NonNull String, boolean); + } + +} + package android.view.contentcapture { public final class ContentCaptureContext implements android.os.Parcelable { diff --git a/api/test-current.txt b/api/test-current.txt index 1f894c27d5ea..c7468829a8d2 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1688,10 +1688,7 @@ package android.service.autofill.augmented { method public int getTaskId(); } - public final class FillResponse implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.service.autofill.augmented.FillResponse> CREATOR; + public final class FillResponse { } public static final class FillResponse.Builder { @@ -1705,7 +1702,6 @@ package android.service.autofill.augmented { ctor public FillWindow(); method public void destroy(); method public boolean update(@NonNull android.service.autofill.augmented.PresentationParams.Area, @NonNull android.view.View, long); - field public static final long FLAG_METADATA_ADDRESS = 1L; // 0x1L } public abstract class PresentationParams { @@ -2341,6 +2337,12 @@ package android.view.autofill { } public final class AutofillManager { + method @NonNull public java.util.Set<android.content.ComponentName> getAugmentedAutofillDisabledActivities(); + method @NonNull public java.util.Set<java.lang.String> getAugmentedAutofillDisabledPackages(); + method public void setActivityAugmentedAutofillEnabled(@NonNull android.content.ComponentName, boolean); + method public void setAugmentedAutofillWhitelist(@Nullable java.util.List<java.lang.String>, @Nullable java.util.List<android.content.ComponentName>); + method public void setPackageAugmentedAutofillEnabled(@NonNull String, boolean); + field public static final int FLAG_SMART_SUGGESTION_SYSTEM = 1; // 0x1 field public static final int MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS = 120000; // 0x1d4c0 } diff --git a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java index aaba85bd36a7..8e0f522b5665 100644 --- a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java +++ b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java @@ -67,7 +67,7 @@ public abstract class AugmentedAutofillService extends Service { private static final String TAG = AugmentedAutofillService.class.getSimpleName(); - // TODO(b/111330312): STOPSHIP use dynamic value, or change to false + // TODO(b/123100811): STOPSHIP use dynamic value, or change to false static final boolean DEBUG = true; static final boolean VERBOSE = false; @@ -127,8 +127,6 @@ public abstract class AugmentedAutofillService extends Service { return false; } - // TODO(b/111330312): add methods to disable autofill per app / activity? - /** * Asks the service to handle an "augmented" autofill request. * @@ -175,12 +173,11 @@ public abstract class AugmentedAutofillService extends Service { focusedValue, requestTime, callback); mAutofillProxies.put(sessionId, proxy); } else { - // TODO(b/111330312): figure out if it's ok to reuse the proxy; add logging - // TODO(b/111330312): also make sure to cover scenario on CTS test + // TODO(b/123099468): figure out if it's ok to reuse the proxy; add logging if (DEBUG) Log.d(TAG, "Reusing proxy for session " + sessionId); proxy.update(focusedId, focusedValue); } - // TODO(b/111330312): set cancellation signal + // TODO(b/123101711): set cancellation signal final CancellationSignal cancellationSignal = null; onFillRequest(new FillRequest(proxy), cancellationSignal, new FillController(proxy), new FillCallback(proxy)); @@ -193,7 +190,7 @@ public abstract class AugmentedAutofillService extends Service { final int sessionId = mAutofillProxies.keyAt(i); final AutofillProxy proxy = mAutofillProxies.valueAt(i); if (proxy == null) { - // TODO(b/111330312): this might be fine, in which case we should logv it + // TODO(b/123100811): this might be fine, in which case we should logv it Log.w(TAG, "No proxy for session " + sessionId); return; } @@ -303,7 +300,7 @@ public abstract class AugmentedAutofillService extends Service { this.mFocusedId = focusedId; this.mFocusedValue = focusedValue; this.mRequestTime = requestTime; - // TODO(b/111330312): linkToDeath + // TODO(b/123099468): linkToDeath } @NonNull @@ -366,7 +363,7 @@ public abstract class AugmentedAutofillService extends Service { private void update(@NonNull AutofillId focusedId, @NonNull AutofillValue focusedValue) { synchronized (mLock) { - // TODO(b/111330312): should we close the popupwindow if the focused id changed? + // TODO(b/123099468): should we close the popupwindow if the focused id changed? mFocusedId = focusedId; mFocusedValue = focusedValue; } @@ -425,7 +422,7 @@ public abstract class AugmentedAutofillService extends Service { default: Slog.w(TAG, "invalid event reported: " + event); } - // TODO(b/111330312): log metrics as well + // TODO(b/122858578): log metrics as well } public void dump(@NonNull String prefix, @NonNull PrintWriter pw) { diff --git a/core/java/android/service/autofill/augmented/FillCallback.java b/core/java/android/service/autofill/augmented/FillCallback.java index bfb4aadaeed9..f2a7a35b2825 100644 --- a/core/java/android/service/autofill/augmented/FillCallback.java +++ b/core/java/android/service/autofill/augmented/FillCallback.java @@ -59,7 +59,8 @@ public final class FillCallback { if (fillWindow != null) { fillWindow.show(); } - // TODO(b/111330312): properly implement on server-side by updating the Session state - // accordingly (and adding CTS tests) + // TODO(b/123099468): must notify the server so it can update the session state to avoid + // showing conflicting UIs (for example, if a new request is made to the main autofill + // service and it now wants to show something). } } diff --git a/core/java/android/service/autofill/augmented/FillRequest.java b/core/java/android/service/autofill/augmented/FillRequest.java index dad506763641..af9905f480df 100644 --- a/core/java/android/service/autofill/augmented/FillRequest.java +++ b/core/java/android/service/autofill/augmented/FillRequest.java @@ -29,7 +29,7 @@ import android.view.autofill.AutofillValue; * @hide */ @SystemApi -// TODO(b/111330312): pass a requestId and/or sessionId +// TODO(b/123100811): pass a requestId and/or sessionId? @TestApi // TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service // in the same package as the test, and that module is compiled with SDK=test_current diff --git a/core/java/android/service/autofill/augmented/FillResponse.java b/core/java/android/service/autofill/augmented/FillResponse.java index 5285132b31a5..f1e904a7d8bc 100644 --- a/core/java/android/service/autofill/augmented/FillResponse.java +++ b/core/java/android/service/autofill/augmented/FillResponse.java @@ -19,8 +19,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; -import android.os.Parcel; -import android.os.Parcelable; import android.view.autofill.AutofillId; import java.util.List; @@ -34,7 +32,7 @@ import java.util.List; @TestApi //TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service //in the same package as the test, and that module is compiled with SDK=test_current -public final class FillResponse implements Parcelable { +public final class FillResponse { private final FillWindow mFillWindow; @@ -70,8 +68,8 @@ public final class FillResponse implements Parcelable { * @return this builder */ public Builder setFillWindow(@NonNull FillWindow fillWindow) { - // TODO(b/111330312): implement / check not null / unit test - // TODO(b/111330312): throw exception if FillWindow not updated yet + // TODO(b/123100712): check not null / unit test / throw exception if FillWindow not + // updated yet mFillWindow = fillWindow; return this; } @@ -85,7 +83,7 @@ public final class FillResponse implements Parcelable { * @return this builder */ public Builder setIgnoredIds(@NonNull List<AutofillId> ids) { - // TODO(b/111330312): implement / check not null / unit test + // TODO(b/123100695): implement / check not null / unit test return this; } @@ -102,37 +100,10 @@ public final class FillResponse implements Parcelable { * @return A built response. */ public FillResponse build() { - // TODO(b/111330312): check conditions / add unit test + // TODO(b/123100712): check conditions / add unit test return new FillResponse(this); } - - // TODO(b/111330312): add methods to disable app / activity, either here or on manager - } - - // TODO(b/111330312): implement to String - - @Override - public int describeContents() { - return 0; } - @Override - public void writeToParcel(Parcel parcel, int flags) { - // TODO(b/111330312): implement - } - - public static final Parcelable.Creator<FillResponse> CREATOR = - new Parcelable.Creator<FillResponse>() { - - @Override - public FillResponse createFromParcel(Parcel parcel) { - // TODO(b/111330312): implement - return null; - } - - @Override - public FillResponse[] newArray(int size) { - return new FillResponse[size]; - } - }; + // TODO(b/123100811): implement to String } diff --git a/core/java/android/service/autofill/augmented/FillWindow.java b/core/java/android/service/autofill/augmented/FillWindow.java index 51b0f01af6ae..40e3a1219501 100644 --- a/core/java/android/service/autofill/augmented/FillWindow.java +++ b/core/java/android/service/autofill/augmented/FillWindow.java @@ -20,7 +20,6 @@ import static android.service.autofill.augmented.AugmentedAutofillService.VERBOS import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; -import android.annotation.LongDef; import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.TestApi; @@ -42,8 +41,6 @@ import com.android.internal.util.Preconditions; import dalvik.system.CloseGuard; import java.io.PrintWriter; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; /** * Handle to a window used to display the augmented autofill UI. @@ -71,18 +68,6 @@ import java.lang.annotation.RetentionPolicy; public final class FillWindow implements AutoCloseable { private static final String TAG = "FillWindow"; - /** Indicates the data being shown is a physical address */ - public static final long FLAG_METADATA_ADDRESS = 0x1; - - // TODO(b/111330312): add more flags - - /** @hide */ - @LongDef(prefix = { "FLAG" }, value = { - FLAG_METADATA_ADDRESS, - }) - @Retention(RetentionPolicy.SOURCE) - @interface Flags{} - private final Object mLock = new Object(); private final CloseGuard mCloseGuard = CloseGuard.get(); @@ -108,29 +93,22 @@ public final class FillWindow implements AutoCloseable { * * @param rootView new root view * @param area coordinates to render the view. - * @param flags optional flags such as metadata of what will be rendered in the window. The - * Smart Suggestion host might decide whether or not to render the UI based on them. + * @param flags currently not used. * * @return boolean whether the window was updated or not. * * @throws IllegalArgumentException if the area is not compatible with this window */ - public boolean update(@NonNull Area area, @NonNull View rootView, @Flags long flags) { + public boolean update(@NonNull Area area, @NonNull View rootView, long flags) { if (DEBUG) { Log.d(TAG, "Updating " + area + " + with " + rootView); } - // TODO(b/111330312): add test case for null + // TODO(b/123100712): add test case for null Preconditions.checkNotNull(area); Preconditions.checkNotNull(rootView); - // TODO(b/111330312): must check the area is a valid object returned by + // TODO(b/123100712): must check the area is a valid object returned by // SmartSuggestionParams, throw IAE if not - // TODO(b/111330312): must some how pass metadata to the SmartSuggestiongs provider - - - // TODO(b/111330312): use a SurfaceControl approach; for now, we're manually creating - // the window underneath the existing view. - final PresentationParams smartSuggestion = area.proxy.getSmartSuggestionParams(); if (smartSuggestion == null) { Log.w(TAG, "No SmartSuggestionParams"); @@ -148,12 +126,12 @@ public final class FillWindow implements AutoCloseable { mProxy = area.proxy; - // TODO(b/111330312): once we have the SurfaceControl approach, we should update the + // TODO(b/123227534): once we have the SurfaceControl approach, we should update the // window instead of destroying. In fact, it might be better to allocate a full window // initially, which is transparent (and let touches get through) everywhere but in the // rect boundaries. - // TODO(b/111330312): make sure all touch events are handled, window is always closed, + // TODO(b/123099468): make sure all touch events are handled, window is always closed, // etc. mWm = rootView.getContext().getSystemService(WindowManager.class); @@ -181,7 +159,7 @@ public final class FillWindow implements AutoCloseable { /** @hide */ void show() { - // TODO(b/111330312): check if updated first / throw exception + // TODO(b/123100712): check if updated first / throw exception if (DEBUG) Log.d(TAG, "show()"); synchronized (mLock) { checkNotDestroyedLocked(); diff --git a/core/java/android/service/autofill/augmented/IFillCallback.aidl b/core/java/android/service/autofill/augmented/IFillCallback.aidl index dac75904f4fc..2b0726649759 100644 --- a/core/java/android/service/autofill/augmented/IFillCallback.aidl +++ b/core/java/android/service/autofill/augmented/IFillCallback.aidl @@ -24,8 +24,7 @@ import android.os.ICancellationSignal; * @hide */ interface IFillCallback { - // TODO(b/111330312): add cancellation (after we have CTS tests, so we can test it) + // TODO(b/123101711): add cancellation (after we have CTS tests, so we can test it) // void onCancellable(in ICancellationSignal cancellation); - // TODO(b/111330312): might need to pass the response (once IME implements Smart Suggestions) void onSuccess(); } diff --git a/core/java/android/service/autofill/augmented/PresentationParams.java b/core/java/android/service/autofill/augmented/PresentationParams.java index b60064e9dd69..1fb9032c9af5 100644 --- a/core/java/android/service/autofill/augmented/PresentationParams.java +++ b/core/java/android/service/autofill/augmented/PresentationParams.java @@ -190,7 +190,7 @@ public abstract class PresentationParams { */ @Nullable public Area getSubArea(@NonNull Rect bounds) { - // TODO(b/111330312): implement / check boundaries / throw IAE / add unit test + // TODO(b/123100712): implement / check boundaries / throw IAE / add unit test return null; } diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 60bef2ccc5de..64c34f612048 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -17,6 +17,7 @@ package android.view.autofill; import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST; +import static android.util.DebugUtils.flagsToString; import static android.view.autofill.Helper.sDebug; import static android.view.autofill.Helper.sVerbose; @@ -25,6 +26,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresFeature; +import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; import android.content.ComponentName; @@ -77,6 +79,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Set; //TODO: use java.lang.ref.Cleaner once Android supports Java 9 import sun.misc.Cleaner; @@ -336,6 +339,25 @@ public final class AutofillManager { public static final int MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS = 1_000 * 60 * 2; // 2 minutes /** + * Displays the Augment Autofill window using the same mechanism (such as a popup-window + * attached to the focused view) as the standard autofill. + * + * @hide + */ + @TestApi + public static final int FLAG_SMART_SUGGESTION_SYSTEM = 0x1; + + /** @hide */ // TODO(b/123233342): remove when not used anymore + public static final int FLAG_SMART_SUGGESTION_LEGACY = 0x2; + + /** @hide */ + @IntDef(flag = true, prefix = { "FLAG_SMART_SUGGESTION_" }, value = { + FLAG_SMART_SUGGESTION_SYSTEM + }) + @Retention(RetentionPolicy.SOURCE) + public @interface SmartSuggestionMode {} + + /** * Makes an authentication id from a request id and a dataset id. * * @param requestId The request id. @@ -1686,7 +1708,7 @@ public final class AutofillManager { final IAutoFillManager service = mService; final IAutoFillManagerClient serviceClient = mServiceClient; mServiceClientCleaner = Cleaner.create(this, () -> { - // TODO(b/111330312): call service to also remove reference to + // TODO(b/123100811): call service to also remove reference to // mAugmentedAutofillServiceClient try { service.removeClient(serviceClient, userId); @@ -1746,6 +1768,108 @@ public final class AutofillManager { } } + /** + * Defines whether augmented autofill should be triggered for activities with such + * {@link android.content.ComponentName}. + * + * <p>Useful to blacklist a particular activity. + * + * <p><b>Note:</b> This method should only be called by the app providing the augmented autofill + * service, and it's ignored if the caller isn't it. + * + * @hide + */ + @SystemApi + @TestApi + //TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service + //in the same package as the test, and that module is compiled with SDK=test_current + public void setActivityAugmentedAutofillEnabled(@NonNull ComponentName activity, + boolean enabled) { + // TODO(b/123100824): implement + } + + /** + * Defines whether augmented autofill should be triggered for activities of the app with such + * {@code packageName}. + * + * <p>Useful to blacklist any activity from a particular app. + * + * <p><b>Note:</b> This method should only be called by the app providing the augmented autofill + * service, and it's ignored if the caller isn't it. + * + * @hide + */ + @SystemApi + @TestApi + //TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service + //in the same package as the test, and that module is compiled with SDK=test_current + public void setPackageAugmentedAutofillEnabled(@NonNull String packageName, boolean enabled) { + // TODO(b/123100824): implement + } + + /** + * Explicitly limits augmented autofill to the given packages and activities. + * + * <p>When the whitelist is set, it overrides the values passed to + * {@link #setActivityAugmentedAutofillEnabled(ComponentName, boolean)} + * and {@link #setPackageAugmentedAutofillEnabled(String, boolean)}. + * + * <p>To reset the whitelist, call it passing {@code null} to both arguments. + * + * <p>Useful when the service wants to restrict augmented autofill to a category of apps, like + * apps that uses addresses. For example, if the service wants to support augmented autofill on + * all activities of app {@code AddressApp1} and just activities {@code act1} and {@code act2} + * of {@code AddressApp2}, it would call: + * {@code setAugmentedAutofillWhitelist(Arrays.asList("AddressApp1"), + * Arrays.asList(new ComponentName("AddressApp2", "act1"), + * new ComponentName("AddressApp2", "act2")));} + * + * <p><b>Note:</b> This method should only be called by the app providing the augmented autofill + * service, and it's ignored if the caller isn't it. + * + * @hide + */ + @SystemApi + @TestApi + //TODO(b/122654591): @TestApi is needed because CtsAutoFillServiceTestCases hosts the service + //in the same package as the test, and that module is compiled with SDK=test_current + public void setAugmentedAutofillWhitelist(@Nullable List<String> packages, + @Nullable List<ComponentName> activities) { + // TODO(b/123100824): implement + } + + /** + * Gets the activities where augmented autofill was disabled by + * {@link #setActivityAugmentedAutofillEnabled(ComponentName, boolean)}. + * + * <p><b>Note:</b> This method should only be called by the app providing the augmented autofill + * service, and it's ignored if the caller isn't it. + * + * @hide + */ + @SystemApi + @TestApi + @NonNull + public Set<ComponentName> getAugmentedAutofillDisabledActivities() { + return null; // TODO(b/123100824): implement + } + + /** + * Gets the apps where content capture was disabled by + * {@link #setPackageAugmentedAutofillEnabled(String, boolean)}. + * + * <p><b>Note:</b> This method should only be called by the app providing the augmented autofill + * service, and it's ignored if the caller isn't it. + * + * @hide + */ + @SystemApi + @TestApi + @NonNull + public Set<String> getAugmentedAutofillDisabledPackages() { + return null; // TODO(b/123100824): implement + } + private void requestShowFillUi(int sessionId, AutofillId id, int width, int height, Rect anchorBounds, IAutofillWindowPresenter presenter) { final View anchor = findView(id); @@ -2296,6 +2420,11 @@ public final class AutofillManager { } } + /** @hide */ + public static String getSmartSuggestionModeToString(@SmartSuggestionMode int flags) { + return flagsToString(AutofillManager.class, "FLAG_SMART_SUGGESTION_", flags); + } + @GuardedBy("mLock") private boolean isActiveLocked() { return mState == STATE_ACTIVE; @@ -2972,7 +3101,6 @@ public final class AutofillManager { @Override public Rect getViewCoordinates(@NonNull AutofillId id) { - // TODO(b/111330312): use handler / callback? final AutofillManager afm = mAfm.get(); if (afm == null) return null; diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index c992da43fc07..2e45fa72eaac 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -18,14 +18,13 @@ package com.android.server.autofill; import static android.Manifest.permission.MANAGE_AUTO_FILL; import static android.content.Context.AUTOFILL_MANAGER_SERVICE; -import static android.util.DebugUtils.flagsToString; import static android.view.autofill.AutofillManager.MAX_TEMP_AUGMENTED_SERVICE_DURATION_MS; +import static android.view.autofill.AutofillManager.getSmartSuggestionModeToString; import static com.android.server.autofill.Helper.sDebug; import static com.android.server.autofill.Helper.sFullScreenMode; import static com.android.server.autofill.Helper.sVerbose; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -61,6 +60,7 @@ import android.util.Slog; import android.util.SparseArray; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; +import android.view.autofill.AutofillManager.SmartSuggestionMode; import android.view.autofill.AutofillManagerInternal; import android.view.autofill.AutofillValue; import android.view.autofill.IAutoFillManager; @@ -80,8 +80,6 @@ import com.android.server.infra.SecureSettingsServiceNameResolver; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -102,26 +100,6 @@ public final class AutofillManagerService private static final Object sLock = AutofillManagerService.class; - /** - * IME supports Smart Suggestions. - */ - // NOTE: must be public because of flagsToString() - public static final int FLAG_SMART_SUGGESTION_IME = 0x1; - - /** - * System supports Smarts Suggestions (as a popup-window similar to standard Autofill). - */ - // NOTE: must be public because of flagsToString() - public static final int FLAG_SMART_SUGGESTION_SYSTEM = 0x2; - - /** @hide */ - @IntDef(flag = true, prefix = { "FLAG_SMART_SUGGESTION_" }, value = { - FLAG_SMART_SUGGESTION_IME, - FLAG_SMART_SUGGESTION_SYSTEM - }) - @Retention(RetentionPolicy.SOURCE) - @interface SmartSuggestionMode {} - static final String RECEIVER_BUNDLE_EXTRA_SESSIONS = "sessions"; private static final char COMPAT_PACKAGE_DELIMITER = ':'; @@ -484,7 +462,7 @@ public final class AutofillManagerService Settings.Global.AUTOFILL_SMART_SUGGESTION_EMULATION_FLAGS, 0); if (sDebug) { Slog.d(TAG, "setSmartSuggestionEmulationFromSettings(): " - + smartSuggestionFlagsToString(flags)); + + getSmartSuggestionModeToString(flags)); } synchronized (mLock) { @@ -698,10 +676,6 @@ public final class AutofillManagerService } } - static String smartSuggestionFlagsToString(int flags) { - return flagsToString(AutofillManagerService.class, "FLAG_SMART_SUGGESTION_", flags); - } - private final class LocalService extends AutofillManagerInternal { @Override public void onBackKeyPressed() { @@ -1251,7 +1225,7 @@ public final class AutofillManagerService pw.println(getWhitelistedCompatModePackagesFromSettings()); if (mSupportedSmartSuggestionModes != 0) { pw.print("Smart Suggestion modes: "); - pw.println(smartSuggestionFlagsToString(mSupportedSmartSuggestionModes)); + pw.println(getSmartSuggestionModeToString(mSupportedSmartSuggestionModes)); } if (showHistory) { pw.println(); pw.println("Requests history:"); pw.println(); diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index 954b67e4e2dc..8886ee2365c0 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -63,6 +63,7 @@ import android.util.SparseArray; import android.util.TimeUtils; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; +import android.view.autofill.AutofillManager.SmartSuggestionMode; import android.view.autofill.AutofillValue; import android.view.autofill.IAutoFillManagerClient; @@ -72,7 +73,6 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.server.LocalServices; import com.android.server.autofill.AutofillManagerService.AutofillCompatState; -import com.android.server.autofill.AutofillManagerService.SmartSuggestionMode; import com.android.server.autofill.RemoteAugmentedAutofillService.RemoteAugmentedAutofillServiceCallbacks; import com.android.server.autofill.ui.AutoFillUI; import com.android.server.infra.AbstractPerUserSystemService; @@ -855,7 +855,6 @@ final class AutofillManagerServiceImpl @GuardedBy("mLock") @SmartSuggestionMode int getSupportedSmartSuggestionModesLocked() { - // TODO(b/111330312): once we support IME, we need to set it per-user (OR'ed with master) return mMaster.getSupportedSmartSuggestionModesLocked(); } @@ -1049,7 +1048,7 @@ final class AutofillManagerServiceImpl componentName, mUserId, new RemoteAugmentedAutofillServiceCallbacks() { @Override public void onServiceDied(@NonNull RemoteAugmentedAutofillService service) { - // TODO(b/111330312): properly implement + // TODO(b/123100811): properly implement Slog.w(TAG, "remote augmented autofill service died"); } }, mMaster.isInstantServiceAllowed(), mMaster.verbose); diff --git a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java index 5d8d8fa46d3f..9b863a9f2d26 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java @@ -113,7 +113,7 @@ final class RemoteAugmentedAutofillService scheduleAsyncRequest((s) -> s.onDestroyAllFillWindowsRequest()); } - // TODO(b/111330312): inline into PendingAutofillRequest if it doesn't have any other subclass + // TODO(b/123100811): inline into PendingAutofillRequest if it doesn't have any other subclass private abstract static class MyPendingRequest extends PendingRequest<RemoteAugmentedAutofillService, IAugmentedAutofillService> { protected final int mSessionId; diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 9f7d33f6796a..194332ab8451 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -23,11 +23,10 @@ import static android.view.autofill.AutofillManager.ACTION_START_SESSION; import static android.view.autofill.AutofillManager.ACTION_VALUE_CHANGED; import static android.view.autofill.AutofillManager.ACTION_VIEW_ENTERED; import static android.view.autofill.AutofillManager.ACTION_VIEW_EXITED; +import static android.view.autofill.AutofillManager.FLAG_SMART_SUGGESTION_SYSTEM; +import static android.view.autofill.AutofillManager.getSmartSuggestionModeToString; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; -import static com.android.server.autofill.AutofillManagerService.FLAG_SMART_SUGGESTION_IME; -import static com.android.server.autofill.AutofillManagerService.FLAG_SMART_SUGGESTION_SYSTEM; -import static com.android.server.autofill.AutofillManagerService.smartSuggestionFlagsToString; import static com.android.server.autofill.Helper.getNumericValue; import static com.android.server.autofill.Helper.sDebug; import static com.android.server.autofill.Helper.sVerbose; @@ -88,6 +87,7 @@ import android.util.TimeUtils; import android.view.KeyEvent; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; +import android.view.autofill.AutofillManager.SmartSuggestionMode; import android.view.autofill.AutofillValue; import android.view.autofill.IAutoFillManagerClient; import android.view.autofill.IAutofillWindowPresenter; @@ -97,7 +97,6 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.ArrayUtils; -import com.android.server.autofill.AutofillManagerService.SmartSuggestionMode; import com.android.server.autofill.ui.AutoFillUI; import com.android.server.autofill.ui.PendingUi; @@ -250,7 +249,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState /** * Destroys the augmented Autofill UI. */ - // TODO(b/111330312): this runnable is called when the Autofill session is destroyed, the + // TODO(b/123099468): this runnable is called when the Autofill session is destroyed, the // main reason being the cases where user tap HOME. // Right now it's completely destroying the UI, but we need to decide whether / how to // properly recover it later (for example, if the user switches back to the activity, @@ -2559,7 +2558,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState notifyUnavailableToClient(AutofillManager.STATE_FINISHED); removeSelf(); } else { - // TODO(b/111330312, b/119638958): must set internal state so when user focus other + // TODO(b/123099468, b/119638958): must set internal state so when user focus other // fields it does not generate a new call to the standard autofill service (right now // it does). Must also add CTS tests to exercise this scenario. if (sVerbose) { @@ -2574,7 +2573,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState * * @return callback to destroy the autofill UI, or {@code null} if not supported. */ - // TODO(b/111330312): might need to call it in other places, like when the service returns a + // TODO(b/123099468): might need to call it in other places, like when the service returns a // non-null response but without datasets (for example, just SaveInfo) @GuardedBy("mLock") private Runnable triggerAugmentedAutofillLocked() { @@ -2594,14 +2593,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Define which mode will be used final int mode; - if ((supportedModes & FLAG_SMART_SUGGESTION_IME) != 0) { - // TODO(b/111330312): support it :-) - Slog.w(TAG, "Smart Suggestions on IME not supported yet"); - return null; - } else if ((supportedModes & FLAG_SMART_SUGGESTION_SYSTEM) != 0) { + if ((supportedModes & FLAG_SMART_SUGGESTION_SYSTEM) != 0) { mode = FLAG_SMART_SUGGESTION_SYSTEM; + } else if ((supportedModes & AutofillManager.FLAG_SMART_SUGGESTION_LEGACY) != 0) { + mode = AutofillManager.FLAG_SMART_SUGGESTION_LEGACY; } else { - Slog.w(TAG, "Unsupported Smart Suggestion Mode: " + supportedModes); + Slog.w(TAG, "Unsupported Smart Suggestion mode: " + supportedModes); return null; } @@ -2614,7 +2611,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState Slog.v(TAG, "calling Augmented Autofill Service (" + remoteService.getComponentName().toShortString() + ") on view " + mCurrentViewId + " using suggestion mode " - + smartSuggestionFlagsToString(mode) + + getSmartSuggestionModeToString(mode) + " when server returned null for session " + this.id); } |