summaryrefslogtreecommitdiff
path: root/core/java/android/widget/RemoteViews.java
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2018-04-18 21:32:12 -0600
committerJeff Sharkey <jsharkey@android.com>2018-04-18 21:40:47 -0600
commit23b3118f288d2beff0519ca294baac8093995989 (patch)
tree80cabef85b9c9e3632e1f01fe3cf6514963cf83a /core/java/android/widget/RemoteViews.java
parent56487413b75e09100d9aabb9a8c1cf83b39ef34c (diff)
Visit Uris in RemoteViews for granting purposes.
RemoteViews end up passing around Uris, so we need to extend Uri permission grants for them to ensure the recipient of a Notification object is able to render its contents. Bug: 9069730 Test: atest frameworks/base/services/tests/uiservicestests/src/com/android/server/notification Change-Id: Id31b5adaf2ee66113a1b503e32126aeddbf97b28
Diffstat (limited to 'core/java/android/widget/RemoteViews.java')
-rw-r--r--core/java/android/widget/RemoteViews.java50
1 files changed, 50 insertions, 0 deletions
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index a34bd093e655..b6bd14ed5efd 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -83,6 +83,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Stack;
import java.util.concurrent.Executor;
+import java.util.function.Consumer;
/**
* A class that describes a view hierarchy that can be displayed in
@@ -444,6 +445,10 @@ public class RemoteViews implements Parcelable, Filter {
return true;
}
+ public void visitUris(@NonNull Consumer<Uri> visitor) {
+ // Nothing to visit by default
+ }
+
int viewId;
}
@@ -517,6 +522,27 @@ public class RemoteViews implements Parcelable, Filter {
setBitmapCache(mBitmapCache);
}
+ /**
+ * Note all {@link Uri} that are referenced internally, with the expectation
+ * that Uri permission grants will need to be issued to ensure the recipient
+ * of this object is able to render its contents.
+ *
+ * @hide
+ */
+ public void visitUris(@NonNull Consumer<Uri> visitor) {
+ if (mActions != null) {
+ for (int i = 0; i < mActions.size(); i++) {
+ mActions.get(i).visitUris(visitor);
+ }
+ }
+ }
+
+ private static void visitIconUri(Icon icon, @NonNull Consumer<Uri> visitor) {
+ if (icon != null && icon.getType() == Icon.TYPE_URI) {
+ visitor.accept(icon.getUri());
+ }
+ }
+
private static class RemoteViewsContextWrapper extends ContextWrapper {
private final Context mContextForResources;
@@ -1485,6 +1511,20 @@ public class RemoteViews implements Parcelable, Filter {
public boolean prefersAsyncApply() {
return this.type == URI || this.type == ICON;
}
+
+ @Override
+ public void visitUris(@NonNull Consumer<Uri> visitor) {
+ switch (this.type) {
+ case URI:
+ final Uri uri = (Uri) this.value;
+ visitor.accept(uri);
+ break;
+ case ICON:
+ final Icon icon = (Icon) this.value;
+ visitIconUri(icon, visitor);
+ break;
+ }
+ }
}
/**
@@ -1849,6 +1889,16 @@ public class RemoteViews implements Parcelable, Filter {
return TEXT_VIEW_DRAWABLE_ACTION_TAG;
}
+ @Override
+ public void visitUris(@NonNull Consumer<Uri> visitor) {
+ if (useIcons) {
+ visitIconUri(i1, visitor);
+ visitIconUri(i2, visitor);
+ visitIconUri(i3, visitor);
+ visitIconUri(i4, visitor);
+ }
+ }
+
boolean isRelative = false;
boolean useIcons = false;
int d1, d2, d3, d4;