diff options
| author | 2023-04-18 18:24:31 +0000 | |
|---|---|---|
| committer | 2023-04-18 18:24:31 +0000 | |
| commit | bbde055a72ae87bdce39238f64b5fc829882887d (patch) | |
| tree | 74ad06d947989a94b005ccab9e47f19474c4dba5 /java | |
| parent | 4252c9c2d580810376a4b1d7c091357e4ec14280 (diff) | |
| parent | af9aa388242bf5a89206b7afb3f7c7e57a577a7b (diff) | |
Merge "Move Nearby to the front of the app list." into udc-dev am: af9aa38824
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/IntentResolver/+/22639899
Change-Id: I5593e83212c1746c15c0943b3bc58a7bdd19413e
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'java')
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 318e9b91..97161452 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -240,7 +240,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); @@ -1262,7 +1261,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( @@ -1271,7 +1271,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 181fe117..81d67a6a 100644 --- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java @@ -65,10 +65,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 6bf9a1cc..746da49e 100644 --- a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java @@ -124,10 +124,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 709ec566..6be4542a 100644 --- a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java @@ -151,14 +151,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 8eec289e..f29fac84 100644 --- a/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt +++ b/java/tests/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUiTest.kt @@ -52,7 +52,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) {  |