summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
author 1 <mrcasey@google.com> 2023-04-14 03:04:40 +0000
committer 1 <mrcasey@google.com> 2023-04-17 20:39:26 +0000
commitcd42caeb00aa0bdd33f565816bdbfb46ccbbad24 (patch)
tree0188d15a89c29380d75d042eb1959e011120b22d /java
parentcca6189957d7158c68661c5c0f6b88c5e317a50f (diff)
Move Nearby to the front of the app list.
Introduce a concept of a "cemented" component that always goes to the front of the list. Just allowing up to one of these since we really don't expect to ever have more than one. Remove the nearby action code as well, along with some associated cleanup. Not in this CL: Prevent this target from being pinned. Bug: 275787600 Test: atest com.android.intentresolver Change-Id: I55c551f930de2d642cd0e5a42c6cdbd6e1918f0b
Diffstat (limited to 'java')
-rw-r--r--java/src/com/android/intentresolver/ChooserActionFactory.java94
-rw-r--r--java/src/com/android/intentresolver/ChooserActivity.java7
-rw-r--r--java/src/com/android/intentresolver/ChooserRequestParameters.java32
-rw-r--r--java/src/com/android/intentresolver/ResolverActivity.java3
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java4
-rw-r--r--java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java15
-rw-r--r--java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java4
-rw-r--r--java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java8
-rw-r--r--java/src/com/android/intentresolver/model/AbstractResolverComparator.java37
-rw-r--r--java/src/com/android/intentresolver/model/AppPredictionServiceResolverComparator.java8
-rw-r--r--java/src/com/android/intentresolver/model/ResolverRankerServiceResolverComparator.java10
-rw-r--r--java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt1
-rw-r--r--java/tests/src/com/android/intentresolver/model/AbstractResolverComparatorTest.java74
13 files changed, 94 insertions, 203 deletions
diff --git a/java/src/com/android/intentresolver/ChooserActionFactory.java b/java/src/com/android/intentresolver/ChooserActionFactory.java
index 23e04560..f355d9d4 100644
--- a/java/src/com/android/intentresolver/ChooserActionFactory.java
+++ b/java/src/com/android/intentresolver/ChooserActionFactory.java
@@ -26,12 +26,9 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
-import android.os.Bundle;
import android.service.chooser.ChooserAction;
import android.text.TextUtils;
import android.util.Log;
@@ -92,8 +89,6 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
private final Runnable mOnCopyButtonClicked;
private final TargetInfo mEditSharingTarget;
private final Runnable mOnEditButtonClicked;
- private final TargetInfo mNearbySharingTarget;
- private final Runnable mOnNearbyButtonClicked;
private final ImmutableList<ChooserAction> mCustomActions;
private final @Nullable ChooserAction mModifyShareAction;
private final Consumer<Boolean> mExcludeSharedTextAction;
@@ -144,18 +139,6 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
firstVisibleImageQuery,
activityStarter,
logger),
- getNearbySharingTarget(
- context,
- chooserRequest.getTargetIntent(),
- integratedDeviceComponents),
- makeOnNearbyShareRunnable(
- getNearbySharingTarget(
- context,
- chooserRequest.getTargetIntent(),
- integratedDeviceComponents),
- activityStarter,
- finishCallback,
- logger),
chooserRequest.getChooserActions(),
chooserRequest.getModifyShareAction(),
onUpdateSharedTextIsExcluded,
@@ -171,8 +154,6 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
Runnable onCopyButtonClicked,
TargetInfo editSharingTarget,
Runnable onEditButtonClicked,
- TargetInfo nearbySharingTarget,
- Runnable onNearbyButtonClicked,
List<ChooserAction> customActions,
@Nullable ChooserAction modifyShareAction,
Consumer<Boolean> onUpdateSharedTextIsExcluded,
@@ -184,8 +165,6 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
mOnCopyButtonClicked = onCopyButtonClicked;
mEditSharingTarget = editSharingTarget;
mOnEditButtonClicked = onEditButtonClicked;
- mNearbySharingTarget = nearbySharingTarget;
- mOnNearbyButtonClicked = onNearbyButtonClicked;
mCustomActions = ImmutableList.copyOf(customActions);
mModifyShareAction = modifyShareAction;
mExcludeSharedTextAction = onUpdateSharedTextIsExcluded;
@@ -218,21 +197,6 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
mOnEditButtonClicked);
}
- /** Create a "Share to Nearby" action. */
- @Override
- @Nullable
- public ActionRow.Action createNearbyButton() {
- if (mNearbySharingTarget == null) {
- return null;
- }
-
- return new ActionRow.Action(
- com.android.internal.R.id.chooser_nearby_button,
- mNearbySharingTarget.getDisplayLabel(),
- mNearbySharingTarget.getDisplayIconHolder().getDisplayIcon(),
- mOnNearbyButtonClicked);
- }
-
/** Create custom actions */
@Override
public List<ActionRow.Action> createCustomActions() {
@@ -403,64 +367,6 @@ public final class ChooserActionFactory implements ChooserContentPreviewUi.Actio
};
}
- private static TargetInfo getNearbySharingTarget(
- Context context,
- Intent originalIntent,
- ChooserIntegratedDeviceComponents integratedComponents) {
- final ComponentName cn = integratedComponents.getNearbySharingComponent();
- if (cn == null) {
- return null;
- }
-
- final Intent resolveIntent = new Intent(originalIntent);
- resolveIntent.setComponent(cn);
- final ResolveInfo ri = context.getPackageManager().resolveActivity(
- resolveIntent, PackageManager.GET_META_DATA);
- if (ri == null || ri.activityInfo == null) {
- Log.e(TAG, "Device-specified nearby sharing component (" + cn
- + ") not available");
- return null;
- }
-
- // Allow the nearby sharing component to provide a more appropriate icon and label
- // for the chip.
- CharSequence name = null;
- Drawable icon = null;
- final Bundle metaData = ri.activityInfo.metaData;
- if (metaData != null) {
- try {
- final Resources pkgRes = context.getPackageManager().getResourcesForActivity(cn);
- final int nameResId = metaData.getInt(CHIP_LABEL_METADATA_KEY);
- name = pkgRes.getString(nameResId);
- final int resId = metaData.getInt(CHIP_ICON_METADATA_KEY);
- icon = pkgRes.getDrawable(resId);
- } catch (NameNotFoundException | Resources.NotFoundException ex) { /* ignore */ }
- }
- if (TextUtils.isEmpty(name)) {
- name = ri.loadLabel(context.getPackageManager());
- }
- if (icon == null) {
- icon = ri.loadIcon(context.getPackageManager());
- }
-
- final DisplayResolveInfo dri = DisplayResolveInfo.newDisplayResolveInfo(
- originalIntent, ri, name, "", resolveIntent, null);
- dri.getDisplayIconHolder().setDisplayIcon(icon);
- return dri;
- }
-
- private static Runnable makeOnNearbyShareRunnable(
- TargetInfo nearbyShareTarget,
- ActionActivityStarter activityStarter,
- Consumer<Integer> finishCallback,
- ChooserActivityLogger logger) {
- return () -> {
- logger.logActionSelected(ChooserActivityLogger.SELECTION_TYPE_NEARBY);
- // Action bar is user-independent; always start as primary.
- activityStarter.safelyStartActivityAsPersonalProfileUser(nearbyShareTarget);
- };
- }
-
@Nullable
private static ActionRow.Action createCustomAction(
Context context,
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java
index 404d6da3..ab2ba91e 100644
--- a/java/src/com/android/intentresolver/ChooserActivity.java
+++ b/java/src/com/android/intentresolver/ChooserActivity.java
@@ -239,7 +239,6 @@ public class ChooserActivity extends ResolverActivity implements
getIntent(),
getReferrerPackageName(),
getReferrer(),
- mIntegratedDeviceComponents,
mFeatureFlagRepository);
} catch (IllegalArgumentException e) {
Log.e(TAG, "Caller provided invalid Chooser request parameters", e);
@@ -1261,7 +1260,8 @@ public class ChooserActivity extends ResolverActivity implements
AbstractResolverComparator resolverComparator;
if (appPredictor != null) {
resolverComparator = new AppPredictionServiceResolverComparator(this, getTargetIntent(),
- getReferrerPackageName(), appPredictor, userHandle, getChooserActivityLogger());
+ getReferrerPackageName(), appPredictor, userHandle, getChooserActivityLogger(),
+ getIntegratedDeviceComponents().getNearbySharingComponent());
} else {
resolverComparator =
new ResolverRankerServiceResolverComparator(
@@ -1270,7 +1270,8 @@ public class ChooserActivity extends ResolverActivity implements
getReferrerPackageName(),
null,
getChooserActivityLogger(),
- getResolverRankerServiceUserHandleList(userHandle));
+ getResolverRankerServiceUserHandleList(userHandle),
+ getIntegratedDeviceComponents().getNearbySharingComponent());
}
return new ChooserListController(
diff --git a/java/src/com/android/intentresolver/ChooserRequestParameters.java b/java/src/com/android/intentresolver/ChooserRequestParameters.java
index f9004a9b..039f50e9 100644
--- a/java/src/com/android/intentresolver/ChooserRequestParameters.java
+++ b/java/src/com/android/intentresolver/ChooserRequestParameters.java
@@ -69,7 +69,6 @@ public class ChooserRequestParameters {
Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
private final Intent mTarget;
- private final ChooserIntegratedDeviceComponents mIntegratedDeviceComponents;
private final String mReferrerPackageName;
private final Pair<CharSequence, Integer> mTitleSpec;
private final Intent mReferrerFillInIntent;
@@ -104,14 +103,11 @@ public class ChooserRequestParameters {
final Intent clientIntent,
String referrerPackageName,
final Uri referrer,
- ChooserIntegratedDeviceComponents integratedDeviceComponents,
FeatureFlagRepository featureFlags) {
final Intent requestedTarget = parseTargetIntentExtra(
clientIntent.getParcelableExtra(Intent.EXTRA_INTENT));
mTarget = intentWithModifiedLaunchFlags(requestedTarget);
- mIntegratedDeviceComponents = integratedDeviceComponents;
-
mReferrerPackageName = referrerPackageName;
mAdditionalTargets = intentsWithModifiedLaunchFlagsFromExtraIfPresent(
@@ -133,8 +129,11 @@ public class ChooserRequestParameters {
mRefinementIntentSender = clientIntent.getParcelableExtra(
Intent.EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER);
- mFilteredComponentNames = getFilteredComponentNames(
- clientIntent, mIntegratedDeviceComponents.getNearbySharingComponent());
+ ComponentName[] filteredComponents = clientIntent.getParcelableArrayExtra(
+ Intent.EXTRA_EXCLUDE_COMPONENTS, ComponentName.class);
+ mFilteredComponentNames = filteredComponents != null
+ ? ImmutableList.copyOf(filteredComponents)
+ : ImmutableList.of();
mCallerChooserTargets = parseCallerTargetsFromClientIntent(clientIntent);
@@ -252,10 +251,6 @@ public class ChooserRequestParameters {
return mTargetIntentFilter;
}
- public ChooserIntegratedDeviceComponents getIntegratedDeviceComponents() {
- return mIntegratedDeviceComponents;
- }
-
private static boolean isSendAction(@Nullable String action) {
return (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action));
}
@@ -309,23 +304,6 @@ public class ChooserRequestParameters {
return Pair.create(requestedTitle, defaultTitleRes);
}
- private static ImmutableList<ComponentName> getFilteredComponentNames(
- Intent clientIntent, @Nullable ComponentName nearbySharingComponent) {
- Stream<ComponentName> filteredComponents = streamParcelableArrayExtra(
- clientIntent, Intent.EXTRA_EXCLUDE_COMPONENTS, ComponentName.class, true, true);
-
- if (nearbySharingComponent != null) {
- // Exclude Nearby from main list if chip is present, to avoid duplication.
- // TODO: we don't have an explicit guarantee that the chip will be displayed just
- // because we have a non-null component; that's ultimately determined by the preview
- // layout. Maybe we can make that decision further upstream?
- filteredComponents = Stream.concat(
- filteredComponents, Stream.of(nearbySharingComponent));
- }
-
- return filteredComponents.collect(toImmutableList());
- }
-
private static ImmutableList<ChooserTarget> parseCallerTargetsFromClientIntent(
Intent clientIntent) {
return
diff --git a/java/src/com/android/intentresolver/ResolverActivity.java b/java/src/com/android/intentresolver/ResolverActivity.java
index 3b9d2a53..66eae92d 100644
--- a/java/src/com/android/intentresolver/ResolverActivity.java
+++ b/java/src/com/android/intentresolver/ResolverActivity.java
@@ -871,7 +871,8 @@ public class ResolverActivity extends FragmentActivity implements
getReferrerPackageName(),
null,
null,
- getResolverRankerServiceUserHandleList(userHandle));
+ getResolverRankerServiceUserHandleList(userHandle),
+ null);
return new ResolverListController(
this,
mPm,
diff --git a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
index 56027a16..3c2ee343 100644
--- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java
@@ -66,10 +66,6 @@ public final class ChooserContentPreviewUi {
@Nullable
ActionRow.Action createEditButton();
- /** Create an "Share to Nearby" action. */
- @Nullable
- ActionRow.Action createNearbyButton();
-
/** Create custom actions */
List<ActionRow.Action> createCustomActions();
diff --git a/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
index e9d65eed..cae9403a 100644
--- a/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java
@@ -103,21 +103,8 @@ class FileContentPreviewUi extends ContentPreviewUi {
final ActionRow actionRow =
contentPreviewLayout.findViewById(com.android.internal.R.id.chooser_action_row);
actionRow.setActions(
- createActions(
- createFilePreviewActions(),
- mActionFactory.createCustomActions()));
+ createActions(new ArrayList<>(), mActionFactory.createCustomActions()));
return contentPreviewLayout;
}
-
- private List<ActionRow.Action> createFilePreviewActions() {
- List<ActionRow.Action> actions = new ArrayList<>(1);
- //TODO(b/120417119):
- // add action buttonFactory.createCopyButton()
- ActionRow.Action action = mActionFactory.createNearbyButton();
- if (action != null) {
- actions.add(action);
- }
- return actions;
- }
}
diff --git a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
index ece0c312..44a9e654 100644
--- a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java
@@ -125,10 +125,6 @@ class TextContentPreviewUi extends ContentPreviewUi {
private List<ActionRow.Action> createTextPreviewActions() {
ArrayList<ActionRow.Action> actions = new ArrayList<>(2);
actions.add(mActionFactory.createCopyButton());
- ActionRow.Action nearbyAction = mActionFactory.createNearbyButton();
- if (nearbyAction != null) {
- actions.add(nearbyAction);
- }
return actions;
}
}
diff --git a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
index 9ce875c8..ebf9bf11 100644
--- a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
+++ b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java
@@ -152,14 +152,10 @@ class UnifiedContentPreviewUi extends ContentPreviewUi {
}
private List<ActionRow.Action> createImagePreviewActions() {
- ArrayList<ActionRow.Action> actions = new ArrayList<>(2);
+ ArrayList<ActionRow.Action> actions = new ArrayList<>(1);
//TODO: add copy action;
- ActionRow.Action action = mActionFactory.createNearbyButton();
- if (action != null) {
- actions.add(action);
- }
if (mFiles.size() == 1 && mTypeClassifier.isImageType(mFiles.get(0).getMimeType())) {
- action = mActionFactory.createEditButton();
+ ActionRow.Action action = mActionFactory.createEditButton();
if (action != null) {
actions.add(action);
}
diff --git a/java/src/com/android/intentresolver/model/AbstractResolverComparator.java b/java/src/com/android/intentresolver/model/AbstractResolverComparator.java
index 7357fde9..bc54e01e 100644
--- a/java/src/com/android/intentresolver/model/AbstractResolverComparator.java
+++ b/java/src/com/android/intentresolver/model/AbstractResolverComparator.java
@@ -16,6 +16,7 @@
package com.android.intentresolver.model;
+import android.annotation.Nullable;
import android.app.usage.UsageStatsManager;
import android.content.ComponentName;
import android.content.Context;
@@ -34,8 +35,6 @@ import com.android.intentresolver.ResolvedComponentInfo;
import com.android.intentresolver.ResolverActivity;
import com.android.intentresolver.chooser.TargetInfo;
-import com.google.android.collect.Lists;
-
import java.text.Collator;
import java.util.ArrayList;
import java.util.Comparator;
@@ -59,6 +58,7 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC
protected final Map<UserHandle, UsageStatsManager> mUsmMap = new HashMap<>();
protected String[] mAnnotations;
protected String mContentType;
+ protected final ComponentName mPromoteToFirst;
// True if the current share is a link.
private final boolean mHttp;
@@ -109,32 +109,18 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC
* Constructor to initialize the comparator.
* @param launchedFromContext the activity calling this comparator
* @param intent original intent
- * @param resolvedActivityUserSpace refers to the userSpace used by the comparator for
- * fetching activity stats and recording activity selection.
- * The latter could be different from the userSpace provided by
- * context.
- */
- public AbstractResolverComparator(
- Context launchedFromContext,
- Intent intent,
- UserHandle resolvedActivityUserSpace) {
- this(launchedFromContext, intent, Lists.newArrayList(resolvedActivityUserSpace));
- }
-
-
- /**
- * Constructor to initialize the comparator.
- * @param launchedFromContext the activity calling this comparator
- * @param intent original intent
* @param resolvedActivityUserSpaceList refers to the userSpace(s) used by the comparator for
* fetching activity stats and recording activity
* selection. The latter could be different from the
* userSpace provided by context.
+ * @param promoteToFirst a component to be moved to the front of the app list if it's being
+ * ranked. Unlike pinned apps, this cannot be modified by the user.
*/
public AbstractResolverComparator(
Context launchedFromContext,
Intent intent,
- List<UserHandle> resolvedActivityUserSpaceList) {
+ List<UserHandle> resolvedActivityUserSpaceList,
+ @Nullable ComponentName promoteToFirst) {
String scheme = intent.getScheme();
mHttp = "http".equals(scheme) || "https".equals(scheme);
mContentType = intent.getType();
@@ -147,6 +133,7 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC
(UsageStatsManager) userContext.getSystemService(Context.USAGE_STATS_SERVICE));
}
mAzComparator = new AzInfoComparator(launchedFromContext);
+ mPromoteToFirst = promoteToFirst;
}
// get annotations of content from intent.
@@ -202,6 +189,16 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC
return -1;
}
+ if (mPromoteToFirst != null) {
+ // A single component can be cemented to the front of the list. If it is seen, let it
+ // always get priority.
+ if (mPromoteToFirst.equals(lhs.activityInfo.getComponentName())) {
+ return -1;
+ } else if (mPromoteToFirst.equals(rhs.activityInfo.getComponentName())) {
+ return 1;
+ }
+ }
+
if (mHttp) {
final boolean lhsSpecific = ResolverActivity.isSpecificUriMatch(lhs.match);
final boolean rhsSpecific = ResolverActivity.isSpecificUriMatch(rhs.match);
diff --git a/java/src/com/android/intentresolver/model/AppPredictionServiceResolverComparator.java b/java/src/com/android/intentresolver/model/AppPredictionServiceResolverComparator.java
index 84dca3ff..ba054731 100644
--- a/java/src/com/android/intentresolver/model/AppPredictionServiceResolverComparator.java
+++ b/java/src/com/android/intentresolver/model/AppPredictionServiceResolverComparator.java
@@ -72,8 +72,9 @@ public class AppPredictionServiceResolverComparator extends AbstractResolverComp
String referrerPackage,
AppPredictor appPredictor,
UserHandle user,
- ChooserActivityLogger chooserActivityLogger) {
- super(context, intent, Lists.newArrayList(user));
+ ChooserActivityLogger chooserActivityLogger,
+ @Nullable ComponentName promoteToFirst) {
+ super(context, intent, Lists.newArrayList(user), promoteToFirst);
mContext = context;
mIntent = intent;
mAppPredictor = appPredictor;
@@ -116,7 +117,8 @@ public class AppPredictionServiceResolverComparator extends AbstractResolverComp
mReferrerPackage,
() -> mHandler.sendEmptyMessage(RANKER_SERVICE_RESULT),
getChooserActivityLogger(),
- mUser);
+ mUser,
+ mPromoteToFirst);
mComparatorModel = buildUpdatedModel();
mResolverRankerService.compute(targets);
} else {
diff --git a/java/src/com/android/intentresolver/model/ResolverRankerServiceResolverComparator.java b/java/src/com/android/intentresolver/model/ResolverRankerServiceResolverComparator.java
index 725212e4..ebaffc36 100644
--- a/java/src/com/android/intentresolver/model/ResolverRankerServiceResolverComparator.java
+++ b/java/src/com/android/intentresolver/model/ResolverRankerServiceResolverComparator.java
@@ -102,9 +102,10 @@ public class ResolverRankerServiceResolverComparator extends AbstractResolverCom
*/
public ResolverRankerServiceResolverComparator(Context launchedFromContext, Intent intent,
String referrerPackage, Runnable afterCompute,
- ChooserActivityLogger chooserActivityLogger, UserHandle targetUserSpace) {
+ ChooserActivityLogger chooserActivityLogger, UserHandle targetUserSpace,
+ ComponentName promoteToFirst) {
this(launchedFromContext, intent, referrerPackage, afterCompute, chooserActivityLogger,
- Lists.newArrayList(targetUserSpace));
+ Lists.newArrayList(targetUserSpace), promoteToFirst);
}
/**
@@ -117,8 +118,9 @@ public class ResolverRankerServiceResolverComparator extends AbstractResolverCom
*/
public ResolverRankerServiceResolverComparator(Context launchedFromContext, Intent intent,
String referrerPackage, Runnable afterCompute,
- ChooserActivityLogger chooserActivityLogger, List<UserHandle> targetUserSpaceList) {
- super(launchedFromContext, intent, targetUserSpaceList);
+ ChooserActivityLogger chooserActivityLogger, List<UserHandle> targetUserSpaceList,
+ @Nullable ComponentName promoteToFirst) {
+ super(launchedFromContext, intent, targetUserSpaceList, promoteToFirst);
mCollator = Collator.getInstance(
launchedFromContext.getResources().getConfiguration().locale);
mReferrerPackage = referrerPackage;
diff --git a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt
index 7b9a0ce6..a7273a86 100644
--- a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt
+++ b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt
@@ -53,7 +53,6 @@ class ChooserContentPreviewUiTest {
private val actionFactory = object : ActionFactory {
override fun createCopyButton() = ActionRow.Action(label = "Copy", icon = null) {}
override fun createEditButton(): ActionRow.Action? = null
- override fun createNearbyButton(): ActionRow.Action? = null
override fun createCustomActions(): List<ActionRow.Action> = emptyList()
override fun getModifyShareAction(): ActionRow.Action? = null
override fun getExcludeSharedTextAction(): Consumer<Boolean> = Consumer<Boolean> {}
diff --git a/java/tests/src/com/android/intentresolver/model/AbstractResolverComparatorTest.java b/java/tests/src/com/android/intentresolver/model/AbstractResolverComparatorTest.java
index 892a2e28..5f0ead7b 100644
--- a/java/tests/src/com/android/intentresolver/model/AbstractResolverComparatorTest.java
+++ b/java/tests/src/com/android/intentresolver/model/AbstractResolverComparatorTest.java
@@ -40,52 +40,82 @@ public class AbstractResolverComparatorTest {
@Test
public void testPinned() {
- ResolvedComponentInfo r1 = new ResolvedComponentInfo(
- new ComponentName("package", "class"), new Intent(), new ResolveInfo()
- );
+ ResolvedComponentInfo r1 = createResolvedComponentInfo(
+ new ComponentName("package", "class"));
r1.setPinned(true);
- ResolvedComponentInfo r2 = new ResolvedComponentInfo(
- new ComponentName("zackage", "zlass"), new Intent(), new ResolveInfo()
- );
+ ResolvedComponentInfo r2 = createResolvedComponentInfo(
+ new ComponentName("zackage", "zlass"));
Context context = InstrumentationRegistry.getTargetContext();
- AbstractResolverComparator comparator = getTestComparator(context);
+ AbstractResolverComparator comparator = getTestComparator(context, null);
assertEquals("Pinned ranks over unpinned", -1, comparator.compare(r1, r2));
assertEquals("Unpinned ranks under pinned", 1, comparator.compare(r2, r1));
}
-
@Test
public void testBothPinned() {
- ResolveInfo pmInfo1 = new ResolveInfo();
- pmInfo1.activityInfo = new ActivityInfo();
- pmInfo1.activityInfo.packageName = "aaa";
-
- ResolvedComponentInfo r1 = new ResolvedComponentInfo(
- new ComponentName("package", "class"), new Intent(), pmInfo1);
+ ResolvedComponentInfo r1 = createResolvedComponentInfo(
+ new ComponentName("package", "class"));
r1.setPinned(true);
- ResolveInfo pmInfo2 = new ResolveInfo();
- pmInfo2.activityInfo = new ActivityInfo();
- pmInfo2.activityInfo.packageName = "zzz";
- ResolvedComponentInfo r2 = new ResolvedComponentInfo(
- new ComponentName("zackage", "zlass"), new Intent(), pmInfo2);
+ ResolvedComponentInfo r2 = createResolvedComponentInfo(
+ new ComponentName("zackage", "zlass"));
r2.setPinned(true);
Context context = InstrumentationRegistry.getTargetContext();
- AbstractResolverComparator comparator = getTestComparator(context);
+ AbstractResolverComparator comparator = getTestComparator(context, null);
assertEquals("Both pinned should rank alphabetically", -1, comparator.compare(r1, r2));
}
- private AbstractResolverComparator getTestComparator(Context context) {
+ @Test
+ public void testPromoteToFirst() {
+ ComponentName promoteToFirst = new ComponentName("promoted-package", "class");
+ ResolvedComponentInfo r1 = createResolvedComponentInfo(promoteToFirst);
+
+ ResolvedComponentInfo r2 = createResolvedComponentInfo(
+ new ComponentName("package", "class"));
+
+ Context context = InstrumentationRegistry.getTargetContext();
+ AbstractResolverComparator comparator = getTestComparator(context, promoteToFirst);
+
+ assertEquals("PromoteToFirst ranks over non-cemented", -1, comparator.compare(r1, r2));
+ assertEquals("Non-cemented ranks under PromoteToFirst", 1, comparator.compare(r2, r1));
+ }
+
+ @Test
+ public void testPromoteToFirstOverPinned() {
+ ComponentName cementedComponent = new ComponentName("promoted-package", "class");
+ ResolvedComponentInfo r1 = createResolvedComponentInfo(cementedComponent);
+
+ ResolvedComponentInfo r2 = createResolvedComponentInfo(
+ new ComponentName("package", "class"));
+ r2.setPinned(true);
+
+ Context context = InstrumentationRegistry.getTargetContext();
+ AbstractResolverComparator comparator = getTestComparator(context, cementedComponent);
+
+ assertEquals("PromoteToFirst ranks over pinned", -1, comparator.compare(r1, r2));
+ assertEquals("Pinned ranks under PromoteToFirst", 1, comparator.compare(r2, r1));
+ }
+
+ private ResolvedComponentInfo createResolvedComponentInfo(ComponentName component) {
+ ResolveInfo info = new ResolveInfo();
+ info.activityInfo = new ActivityInfo();
+ info.activityInfo.packageName = component.getPackageName();
+ info.activityInfo.name = component.getClassName();
+ return new ResolvedComponentInfo(component, new Intent(), info);
+ }
+
+ private AbstractResolverComparator getTestComparator(
+ Context context, ComponentName promoteToFirst) {
Intent intent = new Intent();
AbstractResolverComparator testComparator =
new AbstractResolverComparator(context, intent,
- Lists.newArrayList(context.getUser())) {
+ Lists.newArrayList(context.getUser()), promoteToFirst) {
@Override
int compare(ResolveInfo lhs, ResolveInfo rhs) {