Loading core/java/android/app/Notification.java +8 −77 Original line number Diff line number Diff line Loading @@ -2205,9 +2205,6 @@ public class Notification implements Parcelable private void visitUris(@NonNull Consumer<Uri> visitor) { visitIconUri(visitor, getIcon()); if (actionIntent != null) { actionIntent.visitUris(visitor); } } @Override Loading Loading @@ -2901,21 +2898,6 @@ public class Notification implements Parcelable } } // allPendingIntents should contain all associated intents after parcelling, but it may also // contain intents added by the app to extras for their own purposes. We only care about // checking the intents known and used by system_server, to avoid the confused deputy issue. List<PendingIntent> pendingIntents = Arrays.asList(contentIntent, deleteIntent, fullScreenIntent); for (PendingIntent intent : pendingIntents) { if (intent != null) { intent.visitUris(visitor); } } if (mBubbleMetadata != null) { mBubbleMetadata.visitUris(visitor); } if (extras != null) { visitIconUri(visitor, extras.getParcelable(EXTRA_LARGE_ICON_BIG, Icon.class)); visitIconUri(visitor, extras.getParcelable(EXTRA_PICTURE_ICON, Icon.class)); Loading Loading @@ -2987,30 +2969,17 @@ public class Notification implements Parcelable callPerson.visitUris(visitor); } visitIconUri(visitor, extras.getParcelable(EXTRA_VERIFICATION_ICON, Icon.class)); // Extras for MediaStyle. PendingIntent deviceIntent = extras.getParcelable(EXTRA_MEDIA_REMOTE_INTENT, PendingIntent.class); if (deviceIntent != null) { deviceIntent.visitUris(visitor); } if (extras.containsKey(WearableExtender.EXTRA_WEARABLE_EXTENSIONS)) { WearableExtender extender = new WearableExtender(this); extender.visitUris(visitor); } if (extras.containsKey(TvExtender.EXTRA_TV_EXTENDER)) { TvExtender extender = new TvExtender(this); extender.visitUris(visitor); if (mBubbleMetadata != null) { visitIconUri(visitor, mBubbleMetadata.getIcon()); } if (extras.containsKey(CarExtender.EXTRA_CAR_EXTENDER)) { CarExtender extender = new CarExtender(this); if (extras != null && extras.containsKey(WearableExtender.EXTRA_WEARABLE_EXTENSIONS)) { WearableExtender extender = new WearableExtender(this); extender.visitUris(visitor); } } } /** * Removes heavyweight parts of the Notification object for archival or for sending to Loading Loading @@ -10589,16 +10558,6 @@ public class Notification implements Parcelable } } private void visitUris(@NonNull Consumer<Uri> visitor) { visitIconUri(visitor, getIcon()); if (mPendingIntent != null) { mPendingIntent.visitUris(visitor); } if (mDeleteIntent != null) { mDeleteIntent.visitUris(visitor); } } /** * Builder to construct a {@link BubbleMetadata} object. */ Loading Loading @@ -11797,9 +11756,6 @@ public class Notification implements Parcelable } private void visitUris(@NonNull Consumer<Uri> visitor) { if (mDisplayIntent != null) { mDisplayIntent.visitUris(visitor); } for (Action action : mActions) { action.visitUris(visitor); } Loading Loading @@ -11952,19 +11908,12 @@ public class Notification implements Parcelable /** * Returns the unread conversation conveyed by this notification. * * @see #setUnreadConversation(UnreadConversation) */ public UnreadConversation getUnreadConversation() { return mUnreadConversation; } private void visitUris(@NonNull Consumer<Uri> visitor) { if (mUnreadConversation != null) { mUnreadConversation.visitUris(visitor); } } /** * A class which holds the unread messages from a conversation. */ Loading Loading @@ -12116,16 +12065,7 @@ public class Notification implements Parcelable onRead, participants, b.getLong(KEY_TIMESTAMP)); } private void visitUris(@NonNull Consumer<Uri> visitor) { if (mReadPendingIntent != null) { mReadPendingIntent.visitUris(visitor); } if (mReplyPendingIntent != null) { mReplyPendingIntent.visitUris(visitor); } } } }; /** * Builder class for {@link CarExtender.UnreadConversation} objects. Loading Loading @@ -12448,15 +12388,6 @@ public class Notification implements Parcelable public boolean isSuppressShowOverApps() { return mSuppressShowOverApps; } private void visitUris(@NonNull Consumer<Uri> visitor) { if (mContentIntent != null) { mContentIntent.visitUris(visitor); } if (mDeleteIntent != null) { mDeleteIntent.visitUris(visitor); } } } /** Loading core/java/android/app/PendingIntent.java +0 −18 Original line number Diff line number Diff line Loading @@ -44,8 +44,6 @@ import android.content.IntentSender; import android.content.pm.PackageManager.ResolveInfoFlagsBits; import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Handler; Loading @@ -71,7 +69,6 @@ import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.concurrent.Executor; import java.util.function.Consumer; /** * A description of an Intent and target action to perform with it. Instances Loading Loading @@ -1463,21 +1460,6 @@ public final class PendingIntent implements Parcelable { return sb.toString(); } /** * See {@link Intent#visitUris(Consumer)}. * * @hide */ public void visitUris(@NonNull Consumer<Uri> visitor) { if (android.app.Flags.visitRiskyUris()) { Intent intent = Binder.withCleanCallingIdentity(this::getIntent); if (intent != null) { intent.visitUris(visitor); } } } /** @hide */ public void dumpDebug(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); Loading core/java/android/content/Intent.java +0 −22 Original line number Diff line number Diff line Loading @@ -101,7 +101,6 @@ import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.TimeZone; import java.util.function.Consumer; /** * An intent is an abstract description of an operation to be performed. It Loading Loading @@ -8148,27 +8147,6 @@ public class Intent implements Parcelable, Cloneable { } } /** * 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. * See b/281044385 for more context and examples about what happens when this isn't done * correctly. * * @hide */ public void visitUris(@NonNull Consumer<Uri> visitor) { if (android.app.Flags.visitRiskyUris()) { visitor.accept(mData); if (mSelector != null) { mSelector.visitUris(visitor); } if (mOriginalIntent != null) { mOriginalIntent.visitUris(visitor); } } } public static Intent getIntentOld(String uri) throws URISyntaxException { Intent intent = getIntentOld(uri, 0); intent.mLocalFlags |= LOCAL_FLAG_FROM_URI; Loading core/java/android/widget/RemoteViews.java +5 −31 Original line number Diff line number Diff line Loading @@ -1015,11 +1015,6 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return SET_PENDING_INTENT_TEMPLATE_TAG; } @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mPendingIntentTemplate.visitUris(visitor); } } /** Loading Loading @@ -1434,7 +1429,9 @@ public class RemoteViews implements Parcelable, Filter { @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mIntent.visitUris(visitor); // TODO(b/281044385): Maybe visit intent URIs. This may require adding a dedicated // visitUris method in the Intent class, since it can contain other intents. Otherwise, // the basic thing to do here would be just visitor.accept(intent.getData()). } } Loading Loading @@ -1514,7 +1511,7 @@ public class RemoteViews implements Parcelable, Filter { @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mResponse.visitUris(visitor); // TODO(b/281044385): Maybe visit intent URIs in the RemoteResponse. } } Loading Loading @@ -1563,11 +1560,6 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return SET_ON_STYLUS_HANDWRITING_RESPONSE_TAG; } @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mPendingIntent.visitUris(visitor); } } /** Loading Loading @@ -1641,7 +1633,7 @@ public class RemoteViews implements Parcelable, Filter { @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mResponse.visitUris(visitor); // TODO(b/281044385): Maybe visit intent URIs in the RemoteResponse. } } Loading Loading @@ -2202,10 +2194,6 @@ public class RemoteViews implements Parcelable, Filter { final Icon icon = (Icon) getParameterValue(null); if (icon != null) visitIconUri(icon, visitor); break; case INTENT: final Intent intent = (Intent) getParameterValue(null); if (intent != null) intent.visitUris(visitor); break; // TODO(b/281044385): Should we do anything about type BUNDLE? } } Loading Loading @@ -6995,20 +6983,6 @@ public class RemoteViews implements Parcelable, Filter { mElementNames = parcel.createStringArrayList(); } /** * See {@link RemoteViews#visitUris(Consumer)}. * * @hide */ public void visitUris(@NonNull Consumer<Uri> visitor) { if (mPendingIntent != null) { mPendingIntent.visitUris(visitor); } if (mFillIntent != null) { mFillIntent.visitUris(visitor); } } private void handleViewInteraction( View v, InteractionHandler handler) { Loading core/tests/coretests/src/android/widget/RemoteViewsTest.java +3 −27 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ import android.app.PendingIntent; import android.appwidget.AppWidgetHostView; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.AsyncTask; Loading Loading @@ -833,33 +836,6 @@ public class RemoteViewsTest { verify(visitor, times(1)).accept(eq(icon4S.getUri())); } @Test public void visitUris_intents() { RemoteViews views = new RemoteViews(mPackage, R.layout.remote_views_test); Uri fillIntentUri = Uri.parse("content://intent/fill"); views.setOnCheckedChangeResponse( R.id.layout, RemoteViews.RemoteResponse.fromFillInIntent(new Intent("action", fillIntentUri))); Uri pendingIntentUri = Uri.parse("content://intent/pending"); PendingIntent pendingIntent = getPendingIntentWithUri(pendingIntentUri); views.setOnClickResponse( R.id.layout, RemoteViews.RemoteResponse.fromPendingIntent(pendingIntent)); Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class); views.visitUris(visitor); verify(visitor, times(1)).accept(eq(fillIntentUri)); verify(visitor, times(1)).accept(eq(pendingIntentUri)); } private PendingIntent getPendingIntentWithUri(Uri uri) { return PendingIntent.getActivity(mContext, 0, new Intent("action", uri), PendingIntent.FLAG_IMMUTABLE); } @Test public void layoutInflaterFactory_nothingSet_returnsNull() { final RemoteViews rv = new RemoteViews(mPackage, R.layout.remote_views_test); Loading Loading
core/java/android/app/Notification.java +8 −77 Original line number Diff line number Diff line Loading @@ -2205,9 +2205,6 @@ public class Notification implements Parcelable private void visitUris(@NonNull Consumer<Uri> visitor) { visitIconUri(visitor, getIcon()); if (actionIntent != null) { actionIntent.visitUris(visitor); } } @Override Loading Loading @@ -2901,21 +2898,6 @@ public class Notification implements Parcelable } } // allPendingIntents should contain all associated intents after parcelling, but it may also // contain intents added by the app to extras for their own purposes. We only care about // checking the intents known and used by system_server, to avoid the confused deputy issue. List<PendingIntent> pendingIntents = Arrays.asList(contentIntent, deleteIntent, fullScreenIntent); for (PendingIntent intent : pendingIntents) { if (intent != null) { intent.visitUris(visitor); } } if (mBubbleMetadata != null) { mBubbleMetadata.visitUris(visitor); } if (extras != null) { visitIconUri(visitor, extras.getParcelable(EXTRA_LARGE_ICON_BIG, Icon.class)); visitIconUri(visitor, extras.getParcelable(EXTRA_PICTURE_ICON, Icon.class)); Loading Loading @@ -2987,30 +2969,17 @@ public class Notification implements Parcelable callPerson.visitUris(visitor); } visitIconUri(visitor, extras.getParcelable(EXTRA_VERIFICATION_ICON, Icon.class)); // Extras for MediaStyle. PendingIntent deviceIntent = extras.getParcelable(EXTRA_MEDIA_REMOTE_INTENT, PendingIntent.class); if (deviceIntent != null) { deviceIntent.visitUris(visitor); } if (extras.containsKey(WearableExtender.EXTRA_WEARABLE_EXTENSIONS)) { WearableExtender extender = new WearableExtender(this); extender.visitUris(visitor); } if (extras.containsKey(TvExtender.EXTRA_TV_EXTENDER)) { TvExtender extender = new TvExtender(this); extender.visitUris(visitor); if (mBubbleMetadata != null) { visitIconUri(visitor, mBubbleMetadata.getIcon()); } if (extras.containsKey(CarExtender.EXTRA_CAR_EXTENDER)) { CarExtender extender = new CarExtender(this); if (extras != null && extras.containsKey(WearableExtender.EXTRA_WEARABLE_EXTENSIONS)) { WearableExtender extender = new WearableExtender(this); extender.visitUris(visitor); } } } /** * Removes heavyweight parts of the Notification object for archival or for sending to Loading Loading @@ -10589,16 +10558,6 @@ public class Notification implements Parcelable } } private void visitUris(@NonNull Consumer<Uri> visitor) { visitIconUri(visitor, getIcon()); if (mPendingIntent != null) { mPendingIntent.visitUris(visitor); } if (mDeleteIntent != null) { mDeleteIntent.visitUris(visitor); } } /** * Builder to construct a {@link BubbleMetadata} object. */ Loading Loading @@ -11797,9 +11756,6 @@ public class Notification implements Parcelable } private void visitUris(@NonNull Consumer<Uri> visitor) { if (mDisplayIntent != null) { mDisplayIntent.visitUris(visitor); } for (Action action : mActions) { action.visitUris(visitor); } Loading Loading @@ -11952,19 +11908,12 @@ public class Notification implements Parcelable /** * Returns the unread conversation conveyed by this notification. * * @see #setUnreadConversation(UnreadConversation) */ public UnreadConversation getUnreadConversation() { return mUnreadConversation; } private void visitUris(@NonNull Consumer<Uri> visitor) { if (mUnreadConversation != null) { mUnreadConversation.visitUris(visitor); } } /** * A class which holds the unread messages from a conversation. */ Loading Loading @@ -12116,16 +12065,7 @@ public class Notification implements Parcelable onRead, participants, b.getLong(KEY_TIMESTAMP)); } private void visitUris(@NonNull Consumer<Uri> visitor) { if (mReadPendingIntent != null) { mReadPendingIntent.visitUris(visitor); } if (mReplyPendingIntent != null) { mReplyPendingIntent.visitUris(visitor); } } } }; /** * Builder class for {@link CarExtender.UnreadConversation} objects. Loading Loading @@ -12448,15 +12388,6 @@ public class Notification implements Parcelable public boolean isSuppressShowOverApps() { return mSuppressShowOverApps; } private void visitUris(@NonNull Consumer<Uri> visitor) { if (mContentIntent != null) { mContentIntent.visitUris(visitor); } if (mDeleteIntent != null) { mDeleteIntent.visitUris(visitor); } } } /** Loading
core/java/android/app/PendingIntent.java +0 −18 Original line number Diff line number Diff line Loading @@ -44,8 +44,6 @@ import android.content.IntentSender; import android.content.pm.PackageManager.ResolveInfoFlagsBits; import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; import android.os.Handler; Loading @@ -71,7 +69,6 @@ import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.concurrent.Executor; import java.util.function.Consumer; /** * A description of an Intent and target action to perform with it. Instances Loading Loading @@ -1463,21 +1460,6 @@ public final class PendingIntent implements Parcelable { return sb.toString(); } /** * See {@link Intent#visitUris(Consumer)}. * * @hide */ public void visitUris(@NonNull Consumer<Uri> visitor) { if (android.app.Flags.visitRiskyUris()) { Intent intent = Binder.withCleanCallingIdentity(this::getIntent); if (intent != null) { intent.visitUris(visitor); } } } /** @hide */ public void dumpDebug(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); Loading
core/java/android/content/Intent.java +0 −22 Original line number Diff line number Diff line Loading @@ -101,7 +101,6 @@ import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.TimeZone; import java.util.function.Consumer; /** * An intent is an abstract description of an operation to be performed. It Loading Loading @@ -8148,27 +8147,6 @@ public class Intent implements Parcelable, Cloneable { } } /** * 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. * See b/281044385 for more context and examples about what happens when this isn't done * correctly. * * @hide */ public void visitUris(@NonNull Consumer<Uri> visitor) { if (android.app.Flags.visitRiskyUris()) { visitor.accept(mData); if (mSelector != null) { mSelector.visitUris(visitor); } if (mOriginalIntent != null) { mOriginalIntent.visitUris(visitor); } } } public static Intent getIntentOld(String uri) throws URISyntaxException { Intent intent = getIntentOld(uri, 0); intent.mLocalFlags |= LOCAL_FLAG_FROM_URI; Loading
core/java/android/widget/RemoteViews.java +5 −31 Original line number Diff line number Diff line Loading @@ -1015,11 +1015,6 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return SET_PENDING_INTENT_TEMPLATE_TAG; } @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mPendingIntentTemplate.visitUris(visitor); } } /** Loading Loading @@ -1434,7 +1429,9 @@ public class RemoteViews implements Parcelable, Filter { @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mIntent.visitUris(visitor); // TODO(b/281044385): Maybe visit intent URIs. This may require adding a dedicated // visitUris method in the Intent class, since it can contain other intents. Otherwise, // the basic thing to do here would be just visitor.accept(intent.getData()). } } Loading Loading @@ -1514,7 +1511,7 @@ public class RemoteViews implements Parcelable, Filter { @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mResponse.visitUris(visitor); // TODO(b/281044385): Maybe visit intent URIs in the RemoteResponse. } } Loading Loading @@ -1563,11 +1560,6 @@ public class RemoteViews implements Parcelable, Filter { public int getActionTag() { return SET_ON_STYLUS_HANDWRITING_RESPONSE_TAG; } @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mPendingIntent.visitUris(visitor); } } /** Loading Loading @@ -1641,7 +1633,7 @@ public class RemoteViews implements Parcelable, Filter { @Override public void visitUris(@NonNull Consumer<Uri> visitor) { mResponse.visitUris(visitor); // TODO(b/281044385): Maybe visit intent URIs in the RemoteResponse. } } Loading Loading @@ -2202,10 +2194,6 @@ public class RemoteViews implements Parcelable, Filter { final Icon icon = (Icon) getParameterValue(null); if (icon != null) visitIconUri(icon, visitor); break; case INTENT: final Intent intent = (Intent) getParameterValue(null); if (intent != null) intent.visitUris(visitor); break; // TODO(b/281044385): Should we do anything about type BUNDLE? } } Loading Loading @@ -6995,20 +6983,6 @@ public class RemoteViews implements Parcelable, Filter { mElementNames = parcel.createStringArrayList(); } /** * See {@link RemoteViews#visitUris(Consumer)}. * * @hide */ public void visitUris(@NonNull Consumer<Uri> visitor) { if (mPendingIntent != null) { mPendingIntent.visitUris(visitor); } if (mFillIntent != null) { mFillIntent.visitUris(visitor); } } private void handleViewInteraction( View v, InteractionHandler handler) { Loading
core/tests/coretests/src/android/widget/RemoteViewsTest.java +3 −27 Original line number Diff line number Diff line Loading @@ -34,6 +34,9 @@ import android.app.PendingIntent; import android.appwidget.AppWidgetHostView; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.AsyncTask; Loading Loading @@ -833,33 +836,6 @@ public class RemoteViewsTest { verify(visitor, times(1)).accept(eq(icon4S.getUri())); } @Test public void visitUris_intents() { RemoteViews views = new RemoteViews(mPackage, R.layout.remote_views_test); Uri fillIntentUri = Uri.parse("content://intent/fill"); views.setOnCheckedChangeResponse( R.id.layout, RemoteViews.RemoteResponse.fromFillInIntent(new Intent("action", fillIntentUri))); Uri pendingIntentUri = Uri.parse("content://intent/pending"); PendingIntent pendingIntent = getPendingIntentWithUri(pendingIntentUri); views.setOnClickResponse( R.id.layout, RemoteViews.RemoteResponse.fromPendingIntent(pendingIntent)); Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class); views.visitUris(visitor); verify(visitor, times(1)).accept(eq(fillIntentUri)); verify(visitor, times(1)).accept(eq(pendingIntentUri)); } private PendingIntent getPendingIntentWithUri(Uri uri) { return PendingIntent.getActivity(mContext, 0, new Intent("action", uri), PendingIntent.FLAG_IMMUTABLE); } @Test public void layoutInflaterFactory_nothingSet_returnsNull() { final RemoteViews rv = new RemoteViews(mPackage, R.layout.remote_views_test); Loading