From db70aaee67fde7200db8d0fe5e9bec55393f0dd7 Mon Sep 17 00:00:00 2001 From: 1 Date: Mon, 5 Jun 2023 20:29:08 +0000 Subject: Always show divider between ranked and alphabetical apps Adjust paddings for better symmetry. Bug: 286284385 Test: atest IntentResolverUnitTests Test: Manual testing in portrait and landscape. Change-Id: Ie94a2f48ff7ce4c56afbef9006bfb2e8b457185b --- .../android/intentresolver/ChooserActivity.java | 32 ++-------------------- .../intentresolver/grid/ChooserGridAdapter.java | 10 ++----- 2 files changed, 5 insertions(+), 37 deletions(-) (limited to 'java/src/com') diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index a2dff970..c8062830 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -99,7 +99,6 @@ import com.android.intentresolver.model.ResolverRankerServiceResolverComparator; import com.android.intentresolver.shortcuts.AppPredictorFactory; import com.android.intentresolver.shortcuts.ShortcutLoader; import com.android.intentresolver.widget.ImagePreviewView; -import com.android.intentresolver.widget.ResolverDrawerLayout; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.content.PackageMonitor; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -143,8 +142,6 @@ public class ChooserActivity extends ResolverActivity implements */ public static final String FIRST_IMAGE_PREVIEW_TRANSITION_NAME = "screenshot_preview_image"; - private static final String PREF_NUM_SHEET_EXPANSIONS = "pref_num_sheet_expansions"; - private static final boolean DEBUG = true; public static final String LAUNCH_LOCATION_DIRECT_SHARE = "direct_share"; @@ -323,21 +320,8 @@ public class ChooserActivity extends ResolverActivity implements mResolverDrawerLayout.addOnLayoutChangeListener(this::handleLayoutChange); mResolverDrawerLayout.setOnCollapsedChangedListener( - new ResolverDrawerLayout.OnCollapsedChangedListener() { - - // Only consider one expansion per activity creation - private boolean mWrittenOnce = false; - - @Override - public void onCollapsedChanged(boolean isCollapsed) { - if (!isCollapsed && !mWrittenOnce) { - incrementNumSheetExpansions(); - mWrittenOnce = true; - } - getChooserActivityLogger() - .logSharesheetExpansionChanged(isCollapsed); - } - }); + isCollapsed -> + getChooserActivityLogger().logSharesheetExpansionChanged(isCollapsed)); } if (DEBUG) { @@ -725,15 +709,6 @@ public class ChooserActivity extends ResolverActivity implements return resolver.query(uri, null, null, null, null); } - private int getNumSheetExpansions() { - return getPreferences(Context.MODE_PRIVATE).getInt(PREF_NUM_SHEET_EXPANSIONS, 0); - } - - private void incrementNumSheetExpansions() { - getPreferences(Context.MODE_PRIVATE).edit().putInt(PREF_NUM_SHEET_EXPANSIONS, - getNumSheetExpansions() + 1).apply(); - } - @Override protected void onStop() { super.onStop(); @@ -1248,8 +1223,7 @@ public class ChooserActivity extends ResolverActivity implements }, chooserListAdapter, shouldShowContentPreview(), - mMaxTargetsPerRow, - getNumSheetExpansions()); + mMaxTargetsPerRow); } @VisibleForTesting diff --git a/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java b/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java index e6f70d4f..8db03645 100644 --- a/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java +++ b/java/src/com/android/intentresolver/grid/ChooserGridAdapter.java @@ -99,8 +99,6 @@ public final class ChooserGridAdapter extends RecyclerView.Adapter 0) ? 1 : 0; + return (mChooserListAdapter.getAlphaTargetCount() > 0) ? 1 : 0; } @Override -- cgit v1.2.3-59-g8ed1b From 6ccc32c949215ab372ca58fadcf6ee830d29cef3 Mon Sep 17 00:00:00 2001 From: Andrey Epin Date: Wed, 7 Jun 2023 21:18:19 -0700 Subject: Check shortcut icon validity Check if a shortcut icon is available for the curent user. This is important for callter provided targets (see Intent#EXTRA_CHOOSER_TARGETS) which icons are specified by the calling app. Bug: 277207798 Test: manual testing with some debug code injections and a custom test app. Change-Id: Idcf7f415abb77b585fddbc26e887909b07c8af17 --- .../icons/DefaultTargetDataLoader.kt | 1 - .../icons/LoadDirectShareIconTask.java | 20 ++++++++++------ .../com/android/intentresolver/util/UriFilters.kt | 27 ++++++++++++++-------- 3 files changed, 31 insertions(+), 17 deletions(-) (limited to 'java/src/com') 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 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 -- cgit v1.2.3-59-g8ed1b