diff options
| author | 2023-06-09 22:15:28 +0000 | |
|---|---|---|
| committer | 2023-06-09 22:15:28 +0000 | |
| commit | d47efc020efb419ae28369017a282ca4688616df (patch) | |
| tree | 8c6922286b27af989e431d0ab1a62b7b1156056b /java | |
| parent | c5a9dbe58ab09ab9130d96d43bef9b2b0ce4a747 (diff) | |
| parent | 12ad74836f917f60a6d1d517e977eabbd4304826 (diff) | |
Check shortcut icon validity am: 6ccc32c949 am: 12ad74836f
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/IntentResolver/+/23609699
Change-Id: I61d4dfcdafa754387005601bc28f20f35da55567
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'java')
3 files changed, 31 insertions, 17 deletions
diff --git a/java/src/com/android/intentresolver/icons/DefaultTargetDataLoader.kt b/java/src/com/android/intentresolver/icons/DefaultTargetDataLoader.kt index 0414dea7..0e4d0209 100644 --- a/java/src/com/android/intentresolver/icons/DefaultTargetDataLoader.kt +++ b/java/src/com/android/intentresolver/icons/DefaultTargetDataLoader.kt @@ -86,7 +86,6 @@ class DefaultTargetDataLoader( LoadDirectShareIconTask( context.createContextAsUser(userHandle, 0), info, - userHandle, presentationFactory, ) { result -> removeTask(taskId) diff --git a/java/src/com/android/intentresolver/icons/LoadDirectShareIconTask.java b/java/src/com/android/intentresolver/icons/LoadDirectShareIconTask.java index b7bacc90..6aee69b5 100644 --- a/java/src/com/android/intentresolver/icons/LoadDirectShareIconTask.java +++ b/java/src/com/android/intentresolver/icons/LoadDirectShareIconTask.java @@ -28,7 +28,6 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.Trace; -import android.os.UserHandle; import android.util.Log; import androidx.annotation.WorkerThread; @@ -36,6 +35,7 @@ import androidx.annotation.WorkerThread; import com.android.intentresolver.SimpleIconFactory; import com.android.intentresolver.TargetPresentationGetter; import com.android.intentresolver.chooser.SelectableTargetInfo; +import com.android.intentresolver.util.UriFilters; import java.util.function.Consumer; @@ -49,7 +49,6 @@ class LoadDirectShareIconTask extends BaseLoadIconTask { LoadDirectShareIconTask( Context context, SelectableTargetInfo targetInfo, - UserHandle userHandle, TargetPresentationGetter.Factory presentationFactory, Consumer<Drawable> callback) { super(context, presentationFactory, callback); @@ -61,11 +60,18 @@ class LoadDirectShareIconTask extends BaseLoadIconTask { Drawable drawable; Trace.beginSection("shortcut-icon"); try { - drawable = getChooserTargetIconDrawable( - mContext, - mTargetInfo.getChooserTargetIcon(), - mTargetInfo.getChooserTargetComponentName(), - mTargetInfo.getDirectShareShortcutInfo()); + final Icon icon = mTargetInfo.getChooserTargetIcon(); + if (icon == null || UriFilters.hasValidIcon(icon)) { + drawable = getChooserTargetIconDrawable( + mContext, + icon, + mTargetInfo.getChooserTargetComponentName(), + mTargetInfo.getDirectShareShortcutInfo()); + } else { + Log.e(TAG, "Failed to load shortcut icon for " + + mTargetInfo.getChooserTargetComponentName() + "; no access"); + drawable = loadIconPlaceholder(); + } } catch (Exception e) { Log.e( TAG, diff --git a/java/src/com/android/intentresolver/util/UriFilters.kt b/java/src/com/android/intentresolver/util/UriFilters.kt index 8714c314..a4c6e574 100644 --- a/java/src/com/android/intentresolver/util/UriFilters.kt +++ b/java/src/com/android/intentresolver/util/UriFilters.kt @@ -19,6 +19,7 @@ package com.android.intentresolver.util import android.content.ContentProvider.getUserIdFromUri import android.content.ContentResolver.SCHEME_CONTENT +import android.graphics.drawable.Icon import android.graphics.drawable.Icon.TYPE_URI import android.graphics.drawable.Icon.TYPE_URI_ADAPTIVE_BITMAP import android.net.Uri @@ -38,13 +39,14 @@ import android.service.chooser.ChooserAction */ val Uri?.ownedByCurrentUser: Boolean @JvmName("isOwnedByCurrentUser") - get() = this?.let { - when (getUserIdFromUri(this, UserHandle.USER_CURRENT)) { - UserHandle.USER_CURRENT, - UserHandle.myUserId() -> true - else -> false - } - } == true + get() = + this?.let { + when (getUserIdFromUri(this, UserHandle.USER_CURRENT)) { + UserHandle.USER_CURRENT, + UserHandle.myUserId() -> true + else -> false + } + } == true /** Does the [Uri] reference a content provider ('content://')? */ internal val Uri.contentScheme: Boolean @@ -56,8 +58,15 @@ internal val Uri.contentScheme: Boolean * @param action the chooser action * @see [Uri.ownedByCurrentUser] */ -fun hasValidIcon(action: ChooserAction) = - with(action.icon) { +fun hasValidIcon(action: ChooserAction) = hasValidIcon(action.icon) + +/** + * Checks if the Icon backed by content:// [Uri] is safe for display. + * + * @see [Uri.ownedByCurrentUser] + */ +fun hasValidIcon(icon: Icon) = + with(icon) { when (type) { TYPE_URI, TYPE_URI_ADAPTIVE_BITMAP -> !uri.contentScheme || uri.ownedByCurrentUser |