Loading services/autofill/java/com/android/server/autofill/Helper.java +29 −0 Original line number Diff line number Diff line Loading @@ -16,8 +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 @@ -26,8 +31,11 @@ import android.app.assist.AssistStructure.WindowNode; import android.app.slice.Slice; import android.app.slice.SliceItem; import android.content.ComponentName; import android.content.Context; import android.graphics.drawable.Icon; import android.metrics.LogMaker; import android.os.UserHandle; import android.os.UserManager; import android.service.autofill.Dataset; import android.service.autofill.InternalSanitizer; import android.service.autofill.SaveInfo; Loading @@ -41,6 +49,7 @@ import android.view.autofill.AutofillId; import android.view.autofill.AutofillValue; import android.widget.RemoteViews; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.ArrayUtils; Loading Loading @@ -95,6 +104,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/ui/DialogFillUi.java +7 −3 Original line number Diff line number Diff line Loading @@ -93,6 +93,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 @@ -102,6 +103,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 @@ -115,6 +118,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 @@ -213,7 +217,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 @@ -252,7 +256,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 @@ -294,7 +298,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 +10 −4 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ final class FillUi { new AutofillWindowPresenter(); private final @NonNull Context mContext; private final @NonNull Context mUserContext; private final @NonNull AnchoredWindow mWindow; Loading Loading @@ -132,6 +133,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 @@ -141,6 +144,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 @@ -228,7 +232,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 @@ -269,7 +273,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 @@ -288,7 +292,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 @@ -317,7 +321,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 @@ -777,6 +781,8 @@ final class FillUi { pw.print(prefix); pw.print("mContentWidth: "); pw.println(mContentWidth); 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 @@ -172,6 +172,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 @@ -187,7 +189,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 @@ -224,6 +226,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 +29 −0 Original line number Diff line number Diff line Loading @@ -16,8 +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 @@ -26,8 +31,11 @@ import android.app.assist.AssistStructure.WindowNode; import android.app.slice.Slice; import android.app.slice.SliceItem; import android.content.ComponentName; import android.content.Context; import android.graphics.drawable.Icon; import android.metrics.LogMaker; import android.os.UserHandle; import android.os.UserManager; import android.service.autofill.Dataset; import android.service.autofill.InternalSanitizer; import android.service.autofill.SaveInfo; Loading @@ -41,6 +49,7 @@ import android.view.autofill.AutofillId; import android.view.autofill.AutofillValue; import android.widget.RemoteViews; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.ArrayUtils; Loading Loading @@ -95,6 +104,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/ui/DialogFillUi.java +7 −3 Original line number Diff line number Diff line Loading @@ -93,6 +93,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 @@ -102,6 +103,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 @@ -115,6 +118,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 @@ -213,7 +217,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 @@ -252,7 +256,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 @@ -294,7 +298,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 +10 −4 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ final class FillUi { new AutofillWindowPresenter(); private final @NonNull Context mContext; private final @NonNull Context mUserContext; private final @NonNull AnchoredWindow mWindow; Loading Loading @@ -132,6 +133,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 @@ -141,6 +144,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 @@ -228,7 +232,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 @@ -269,7 +273,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 @@ -288,7 +292,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 @@ -317,7 +321,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 @@ -777,6 +781,8 @@ final class FillUi { pw.print(prefix); pw.print("mContentWidth: "); pw.println(mContentWidth); 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 @@ -172,6 +172,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 @@ -187,7 +189,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 @@ -224,6 +226,7 @@ final class SaveUi { return null; } }; final LayoutInflater inflater = LayoutInflater.from(context); final View view = inflater.inflate(R.layout.autofill_save, null); Loading