summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/autofill/java/com/android/server/autofill/Helper.java29
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java10
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/FillUi.java14
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/SaveUi.java5
4 files changed, 50 insertions, 8 deletions
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index 5f36496a2284..b50477809f1f 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -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;
@@ -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;
@@ -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;
@@ -96,6 +105,26 @@ public final class Helper {
}
/**
+ * 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.
*
diff --git a/services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java b/services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java
index 59184e9ed288..a8f468885067 100644
--- a/services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/DialogFillUi.java
@@ -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;
@@ -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,
@@ -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);
@@ -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);
}
@@ -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);
@@ -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;
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index 76fa258734cc..9a471b2a4533 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -100,6 +100,7 @@ final class FillUi {
new AutofillWindowPresenter();
private final @NonNull Context mContext;
+ private final @NonNull Context mUserContext;
private final @NonNull AnchoredWindow mWindow;
@@ -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,
@@ -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);
@@ -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();
@@ -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());
@@ -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");
@@ -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;
@@ -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:
diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
index 47ac0ce704a7..eabbb0d14d22 100644
--- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
@@ -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,
@@ -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) {
@@ -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);