Loading services/autofill/java/com/android/server/autofill/Helper.java +24 −0 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 @@ -32,6 +35,7 @@ import android.content.Context; import android.graphics.drawable.Icon; 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.InternalSanitizer; Loading Loading @@ -103,6 +107,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 @@ -4623,11 +4623,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 @@ -4653,11 +4659,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 @@ -103,6 +103,7 @@ final class FillUi { new AutofillWindowPresenter(); private final @NonNull Context mContext; private final @NonNull Context mUserContext; private final @NonNull AnchoredWindow mWindow; Loading Loading @@ -135,6 +136,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 @@ -146,6 +149,7 @@ final class FillUi { mCallback = callback; mFullScreen = isFullScreen(context); mContext = new ContextThemeWrapper(context, mThemeId); mUserContext = Helper.getUserContext(mContext); final LayoutInflater inflater = LayoutInflater.from(mContext); Loading Loading @@ -233,7 +237,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 @@ -274,7 +278,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 @@ -293,7 +297,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 @@ -322,7 +326,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 @@ -784,6 +788,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 @@ -173,6 +173,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 @@ -190,7 +192,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 @@ -229,6 +231,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 +24 −0 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 @@ -32,6 +35,7 @@ import android.content.Context; import android.graphics.drawable.Icon; 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.InternalSanitizer; Loading Loading @@ -103,6 +107,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 @@ -4623,11 +4623,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 @@ -4653,11 +4659,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 @@ -103,6 +103,7 @@ final class FillUi { new AutofillWindowPresenter(); private final @NonNull Context mContext; private final @NonNull Context mUserContext; private final @NonNull AnchoredWindow mWindow; Loading Loading @@ -135,6 +136,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 @@ -146,6 +149,7 @@ final class FillUi { mCallback = callback; mFullScreen = isFullScreen(context); mContext = new ContextThemeWrapper(context, mThemeId); mUserContext = Helper.getUserContext(mContext); final LayoutInflater inflater = LayoutInflater.from(mContext); Loading Loading @@ -233,7 +237,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 @@ -274,7 +278,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 @@ -293,7 +297,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 @@ -322,7 +326,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 @@ -784,6 +788,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 @@ -173,6 +173,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 @@ -190,7 +192,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 @@ -229,6 +231,7 @@ final class SaveUi { return null; } }; final LayoutInflater inflater = LayoutInflater.from(context); final View view = inflater.inflate(R.layout.autofill_save, null); Loading