Loading services/autofill/java/com/android/server/autofill/Helper.java +25 −2 Original line number Diff line number Diff line Loading @@ -16,10 +16,13 @@ package com.android.server.autofill; import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static com.android.server.autofill.Helper.sDebug; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.assist.AssistStructure; Loading @@ -29,6 +32,7 @@ import android.content.ComponentName; import android.content.Context; import android.hardware.display.DisplayManager; import android.metrics.LogMaker; import android.os.UserHandle; import android.os.UserManager; import android.service.autofill.Dataset; import android.service.autofill.FillResponse; Loading Loading @@ -57,7 +61,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; public final class Helper { private static final String TAG = "AutofillHelper"; Loading @@ -69,7 +72,7 @@ public final class Helper { * {@code cmd autofill set log_level debug} or through * {@link android.provider.Settings.Global#AUTOFILL_LOGGING_LEVEL}. */ public static boolean sDebug = false; public static boolean sDebug = true; /** * Defines a logging flag that can be dynamically changed at runtime using Loading Loading @@ -103,6 +106,26 @@ public final class Helper { return permissionsOk.get(); } /** * Creates the context as the foreground user * * <p>Returns the current context as the current foreground user */ @RequiresPermission(INTERACT_ACROSS_USERS) public static Context getUserContext(Context context) { int userId = ActivityManager.getCurrentUser(); Context c = context.createContextAsUser(UserHandle.of(userId), /* flags= */ 0); if (sDebug) { Slog.d( TAG, "Current User: " + userId + ", context created as: " + c.getContentResolver().getUserId()); } return c; } /** * Checks the URI permissions of the remote view, * to see if the current userId is able to access it. Loading services/autofill/java/com/android/server/autofill/Session.java +24 −10 Original line number Diff line number Diff line Loading @@ -5084,11 +5084,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Try to get the custom Icon, if one was passed through FillResponse int iconResourceId = response.getIconResourceId(); if (iconResourceId != 0) { serviceIcon = mService.getMaster().getContext().getPackageManager() long token = Binder.clearCallingIdentity(); try { serviceIcon = mService.getMaster() .getContext() .getPackageManager() .getDrawable( mService.getServicePackageName(), iconResourceId, null); mService.getServicePackageName(), iconResourceId, null); } finally { Binder.restoreCallingIdentity(token); } } // Custom icon wasn't fetched, use the default package icon instead Loading @@ -5114,11 +5120,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Try to get the custom Service name, if one was passed through FillResponse int customServiceNameId = response.getServiceDisplayNameResourceId(); if (customServiceNameId != 0) { serviceLabel = mService.getMaster().getContext().getPackageManager() long token = Binder.clearCallingIdentity(); try { serviceLabel = mService.getMaster() .getContext() .getPackageManager() .getText( mService.getServicePackageName(), customServiceNameId, null); } finally { Binder.restoreCallingIdentity(token); } } // Custom label wasn't fetched, use the default package name instead Loading services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java +7 −3 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ final class DialogFillUi { private final ComponentName mComponentName; private final int mThemeId; private final @NonNull Context mContext; private final @NonNull Context mUserContext; private final @NonNull UiCallback mCallback; private final @NonNull ListView mListView; private final @Nullable ItemsAdapter mAdapter; Loading @@ -104,6 +105,8 @@ final class DialogFillUi { private @Nullable AnnounceFilterResult mAnnounceFilterResult; private boolean mDestroyed; // System has all permissions, see b/228957088 @SuppressWarnings("AndroidFrameworkRequiresPermission") DialogFillUi(@NonNull Context context, @NonNull FillResponse response, @NonNull AutofillId focusedViewId, @Nullable String filterText, @Nullable Drawable serviceIcon, @Nullable String servicePackageName, Loading @@ -117,6 +120,7 @@ final class DialogFillUi { mComponentName = componentName; mContext = new ContextThemeWrapper(context, mThemeId); mUserContext = Helper.getUserContext(mContext); final LayoutInflater inflater = LayoutInflater.from(mContext); final View decor = inflater.inflate(R.layout.autofill_fill_dialog, null); Loading Loading @@ -224,7 +228,7 @@ final class DialogFillUi { }; final View content = presentation.applyWithTheme( mContext, (ViewGroup) decor, interceptionHandler, mThemeId); mUserContext, (ViewGroup) decor, interceptionHandler, mThemeId); container.addView(content); container.setVisibility(View.VISIBLE); } Loading Loading @@ -263,7 +267,7 @@ final class DialogFillUi { return true; }; final View content = presentation.applyWithTheme( mContext, (ViewGroup) decor, interceptionHandler, mThemeId); mUserContext, (ViewGroup) decor, interceptionHandler, mThemeId); container.addView(content); container.setVisibility(View.VISIBLE); container.setFocusable(true); Loading Loading @@ -305,7 +309,7 @@ final class DialogFillUi { try { if (sVerbose) Slog.v(TAG, "setting remote view for " + focusedViewId); view = presentation.applyWithTheme( mContext, null, interceptionHandler, mThemeId); mUserContext, null, interceptionHandler, mThemeId); } catch (RuntimeException e) { Slog.e(TAG, "Error inflating remote views", e); continue; Loading services/autofill/java/com/android/server/autofill/ui/FillUi.java +9 −4 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ final class FillUi { new AutofillWindowPresenter(); private final @NonNull Context mContext; private final @NonNull Context mUserContext; private final @NonNull AnchoredWindow mWindow; Loading Loading @@ -141,6 +142,8 @@ final class FillUi { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK); } // System has all permissions, see b/228957088 @SuppressWarnings("AndroidFrameworkRequiresPermission") FillUi(@NonNull Context context, @NonNull FillResponse response, @NonNull AutofillId focusedViewId, @Nullable String filterText, @NonNull OverlayControl overlayControl, @NonNull CharSequence serviceLabel, Loading @@ -153,6 +156,7 @@ final class FillUi { mCallback = callback; mFullScreen = isFullScreen(context); mContext = new ContextThemeWrapper(context, mThemeId); mUserContext = Helper.getUserContext(mContext); mMaxInputLengthForAutofill = maxInputLengthForAutofill; final LayoutInflater inflater = LayoutInflater.from(mContext); Loading Loading @@ -245,7 +249,7 @@ final class FillUi { throw new RuntimeException("Permission error accessing RemoteView"); } content = response.getPresentation().applyWithTheme( mContext, decor, interceptionHandler, mThemeId); mUserContext, decor, interceptionHandler, mThemeId); container.addView(content); } catch (RuntimeException e) { callback.onCanceled(); Loading Loading @@ -286,7 +290,7 @@ final class FillUi { if (headerPresentation != null) { interactionBlocker = newInteractionBlocker(); mHeader = headerPresentation.applyWithTheme( mContext, null, interactionBlocker, mThemeId); mUserContext, null, interactionBlocker, mThemeId); final LinearLayout headerContainer = decor.findViewById(R.id.autofill_dataset_header); applyCancelAction(mHeader, response.getCancelIds()); Loading @@ -305,7 +309,7 @@ final class FillUi { interactionBlocker = newInteractionBlocker(); } mFooter = footerPresentation.applyWithTheme( mContext, null, interactionBlocker, mThemeId); mUserContext, null, interactionBlocker, mThemeId); applyCancelAction(mFooter, response.getCancelIds()); // Footer not supported on some platform e.g. TV if (sVerbose) Slog.v(TAG, "adding footer"); Loading Loading @@ -334,7 +338,7 @@ final class FillUi { try { if (sVerbose) Slog.v(TAG, "setting remote view for " + focusedViewId); view = presentation.applyWithTheme( mContext, null, interceptionHandler, mThemeId); mUserContext, null, interceptionHandler, mThemeId); } catch (RuntimeException e) { Slog.e(TAG, "Error inflating remote views", e); continue; Loading Loading @@ -812,6 +816,7 @@ final class FillUi { pw.print(prefix); pw.print("mContentHeight: "); pw.println(mContentHeight); pw.print(prefix); pw.print("mDestroyed: "); pw.println(mDestroyed); pw.print(prefix); pw.print("mContext: "); pw.println(mContext); pw.print(prefix); pw.print("mUserContext: "); pw.println(mUserContext); pw.print(prefix); pw.print("theme id: "); pw.print(mThemeId); switch (mThemeId) { case THEME_ID_DARK: Loading services/autofill/java/com/android/server/autofill/ui/SaveUi.java +4 −1 Original line number Diff line number Diff line Loading @@ -176,6 +176,8 @@ final class SaveUi { private boolean mDestroyed; // System has all permissions, see b/228957088 @SuppressWarnings("AndroidFrameworkRequiresPermission") SaveUi(@NonNull Context context, @NonNull PendingUi pendingUi, @NonNull CharSequence serviceLabel, @NonNull Drawable serviceIcon, @Nullable String servicePackageName, @NonNull ComponentName componentName, Loading @@ -193,7 +195,7 @@ final class SaveUi { mComponentName = componentName; mCompatMode = compatMode; context = new ContextThemeWrapper(context, mThemeId) { context = new ContextThemeWrapper(Helper.getUserContext(context), mThemeId) { @Override public void startActivity(Intent intent) { if (resolveActivity(intent) == null) { Loading Loading @@ -235,6 +237,7 @@ final class SaveUi { return null; } }; final LayoutInflater inflater = LayoutInflater.from(context); final View view = inflater.inflate(R.layout.autofill_save, null); Loading Loading
services/autofill/java/com/android/server/autofill/Helper.java +25 −2 Original line number Diff line number Diff line Loading @@ -16,10 +16,13 @@ package com.android.server.autofill; import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static com.android.server.autofill.Helper.sDebug; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.assist.AssistStructure; Loading @@ -29,6 +32,7 @@ import android.content.ComponentName; import android.content.Context; import android.hardware.display.DisplayManager; import android.metrics.LogMaker; import android.os.UserHandle; import android.os.UserManager; import android.service.autofill.Dataset; import android.service.autofill.FillResponse; Loading Loading @@ -57,7 +61,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; public final class Helper { private static final String TAG = "AutofillHelper"; Loading @@ -69,7 +72,7 @@ public final class Helper { * {@code cmd autofill set log_level debug} or through * {@link android.provider.Settings.Global#AUTOFILL_LOGGING_LEVEL}. */ public static boolean sDebug = false; public static boolean sDebug = true; /** * Defines a logging flag that can be dynamically changed at runtime using Loading Loading @@ -103,6 +106,26 @@ public final class Helper { return permissionsOk.get(); } /** * Creates the context as the foreground user * * <p>Returns the current context as the current foreground user */ @RequiresPermission(INTERACT_ACROSS_USERS) public static Context getUserContext(Context context) { int userId = ActivityManager.getCurrentUser(); Context c = context.createContextAsUser(UserHandle.of(userId), /* flags= */ 0); if (sDebug) { Slog.d( TAG, "Current User: " + userId + ", context created as: " + c.getContentResolver().getUserId()); } return c; } /** * Checks the URI permissions of the remote view, * to see if the current userId is able to access it. Loading
services/autofill/java/com/android/server/autofill/Session.java +24 −10 Original line number Diff line number Diff line Loading @@ -5084,11 +5084,17 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Try to get the custom Icon, if one was passed through FillResponse int iconResourceId = response.getIconResourceId(); if (iconResourceId != 0) { serviceIcon = mService.getMaster().getContext().getPackageManager() long token = Binder.clearCallingIdentity(); try { serviceIcon = mService.getMaster() .getContext() .getPackageManager() .getDrawable( mService.getServicePackageName(), iconResourceId, null); mService.getServicePackageName(), iconResourceId, null); } finally { Binder.restoreCallingIdentity(token); } } // Custom icon wasn't fetched, use the default package icon instead Loading @@ -5114,11 +5120,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Try to get the custom Service name, if one was passed through FillResponse int customServiceNameId = response.getServiceDisplayNameResourceId(); if (customServiceNameId != 0) { serviceLabel = mService.getMaster().getContext().getPackageManager() long token = Binder.clearCallingIdentity(); try { serviceLabel = mService.getMaster() .getContext() .getPackageManager() .getText( mService.getServicePackageName(), customServiceNameId, null); } finally { Binder.restoreCallingIdentity(token); } } // Custom label wasn't fetched, use the default package name instead Loading
services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java +7 −3 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ final class DialogFillUi { private final ComponentName mComponentName; private final int mThemeId; private final @NonNull Context mContext; private final @NonNull Context mUserContext; private final @NonNull UiCallback mCallback; private final @NonNull ListView mListView; private final @Nullable ItemsAdapter mAdapter; Loading @@ -104,6 +105,8 @@ final class DialogFillUi { private @Nullable AnnounceFilterResult mAnnounceFilterResult; private boolean mDestroyed; // System has all permissions, see b/228957088 @SuppressWarnings("AndroidFrameworkRequiresPermission") DialogFillUi(@NonNull Context context, @NonNull FillResponse response, @NonNull AutofillId focusedViewId, @Nullable String filterText, @Nullable Drawable serviceIcon, @Nullable String servicePackageName, Loading @@ -117,6 +120,7 @@ final class DialogFillUi { mComponentName = componentName; mContext = new ContextThemeWrapper(context, mThemeId); mUserContext = Helper.getUserContext(mContext); final LayoutInflater inflater = LayoutInflater.from(mContext); final View decor = inflater.inflate(R.layout.autofill_fill_dialog, null); Loading Loading @@ -224,7 +228,7 @@ final class DialogFillUi { }; final View content = presentation.applyWithTheme( mContext, (ViewGroup) decor, interceptionHandler, mThemeId); mUserContext, (ViewGroup) decor, interceptionHandler, mThemeId); container.addView(content); container.setVisibility(View.VISIBLE); } Loading Loading @@ -263,7 +267,7 @@ final class DialogFillUi { return true; }; final View content = presentation.applyWithTheme( mContext, (ViewGroup) decor, interceptionHandler, mThemeId); mUserContext, (ViewGroup) decor, interceptionHandler, mThemeId); container.addView(content); container.setVisibility(View.VISIBLE); container.setFocusable(true); Loading Loading @@ -305,7 +309,7 @@ final class DialogFillUi { try { if (sVerbose) Slog.v(TAG, "setting remote view for " + focusedViewId); view = presentation.applyWithTheme( mContext, null, interceptionHandler, mThemeId); mUserContext, null, interceptionHandler, mThemeId); } catch (RuntimeException e) { Slog.e(TAG, "Error inflating remote views", e); continue; Loading
services/autofill/java/com/android/server/autofill/ui/FillUi.java +9 −4 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ final class FillUi { new AutofillWindowPresenter(); private final @NonNull Context mContext; private final @NonNull Context mUserContext; private final @NonNull AnchoredWindow mWindow; Loading Loading @@ -141,6 +142,8 @@ final class FillUi { return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK); } // System has all permissions, see b/228957088 @SuppressWarnings("AndroidFrameworkRequiresPermission") FillUi(@NonNull Context context, @NonNull FillResponse response, @NonNull AutofillId focusedViewId, @Nullable String filterText, @NonNull OverlayControl overlayControl, @NonNull CharSequence serviceLabel, Loading @@ -153,6 +156,7 @@ final class FillUi { mCallback = callback; mFullScreen = isFullScreen(context); mContext = new ContextThemeWrapper(context, mThemeId); mUserContext = Helper.getUserContext(mContext); mMaxInputLengthForAutofill = maxInputLengthForAutofill; final LayoutInflater inflater = LayoutInflater.from(mContext); Loading Loading @@ -245,7 +249,7 @@ final class FillUi { throw new RuntimeException("Permission error accessing RemoteView"); } content = response.getPresentation().applyWithTheme( mContext, decor, interceptionHandler, mThemeId); mUserContext, decor, interceptionHandler, mThemeId); container.addView(content); } catch (RuntimeException e) { callback.onCanceled(); Loading Loading @@ -286,7 +290,7 @@ final class FillUi { if (headerPresentation != null) { interactionBlocker = newInteractionBlocker(); mHeader = headerPresentation.applyWithTheme( mContext, null, interactionBlocker, mThemeId); mUserContext, null, interactionBlocker, mThemeId); final LinearLayout headerContainer = decor.findViewById(R.id.autofill_dataset_header); applyCancelAction(mHeader, response.getCancelIds()); Loading @@ -305,7 +309,7 @@ final class FillUi { interactionBlocker = newInteractionBlocker(); } mFooter = footerPresentation.applyWithTheme( mContext, null, interactionBlocker, mThemeId); mUserContext, null, interactionBlocker, mThemeId); applyCancelAction(mFooter, response.getCancelIds()); // Footer not supported on some platform e.g. TV if (sVerbose) Slog.v(TAG, "adding footer"); Loading Loading @@ -334,7 +338,7 @@ final class FillUi { try { if (sVerbose) Slog.v(TAG, "setting remote view for " + focusedViewId); view = presentation.applyWithTheme( mContext, null, interceptionHandler, mThemeId); mUserContext, null, interceptionHandler, mThemeId); } catch (RuntimeException e) { Slog.e(TAG, "Error inflating remote views", e); continue; Loading Loading @@ -812,6 +816,7 @@ final class FillUi { pw.print(prefix); pw.print("mContentHeight: "); pw.println(mContentHeight); pw.print(prefix); pw.print("mDestroyed: "); pw.println(mDestroyed); pw.print(prefix); pw.print("mContext: "); pw.println(mContext); pw.print(prefix); pw.print("mUserContext: "); pw.println(mUserContext); pw.print(prefix); pw.print("theme id: "); pw.print(mThemeId); switch (mThemeId) { case THEME_ID_DARK: Loading
services/autofill/java/com/android/server/autofill/ui/SaveUi.java +4 −1 Original line number Diff line number Diff line Loading @@ -176,6 +176,8 @@ final class SaveUi { private boolean mDestroyed; // System has all permissions, see b/228957088 @SuppressWarnings("AndroidFrameworkRequiresPermission") SaveUi(@NonNull Context context, @NonNull PendingUi pendingUi, @NonNull CharSequence serviceLabel, @NonNull Drawable serviceIcon, @Nullable String servicePackageName, @NonNull ComponentName componentName, Loading @@ -193,7 +195,7 @@ final class SaveUi { mComponentName = componentName; mCompatMode = compatMode; context = new ContextThemeWrapper(context, mThemeId) { context = new ContextThemeWrapper(Helper.getUserContext(context), mThemeId) { @Override public void startActivity(Intent intent) { if (resolveActivity(intent) == null) { Loading Loading @@ -235,6 +237,7 @@ final class SaveUi { return null; } }; final LayoutInflater inflater = LayoutInflater.from(context); final View view = inflater.inflate(R.layout.autofill_save, null); Loading