diff options
| author | Song Hu <songhu@google.com> | 2021-03-22 15:26:20 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-03-22 15:26:20 +0000 |
| commit | c24be7e65336f4a0e76de442977756ae5ab850ff (patch) | |
| tree | 933eedf01370b6b34ce81ab4b258a3d0de55555d /core/java | |
| parent | c6c7448499df365edc43f1847947c11b62547554 (diff) | |
| parent | 64515ec80bb4c46d24c53bec4e414d0609be12d1 (diff) | |
Merge "Surface DS targets as per their own score and ranking, remove customized ranking logic (max shortcuts count limit per app, app share adjustment). This is guarded by the flag "apply_sharing_app_limits_in_sysui"." into sc-dev
Diffstat (limited to 'core/java')
3 files changed, 29 insertions, 34 deletions
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 9f58fee539f0..862c9001e380 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -850,9 +850,7 @@ public class ChooserActivity extends ResolverActivity implements final List<ShortcutManager.ShareShortcutInfo> shareShortcutInfos = new ArrayList<>(); - // Separate ChooserTargets ranking scores and ranked Shortcuts. List<AppTarget> shortcutResults = new ArrayList<>(); - List<AppTarget> chooserTargetScores = new ArrayList<>(); for (AppTarget appTarget : resultList) { if (appTarget.getShortcutInfo() == null) { continue; diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java index d153107d77c7..cc2b12a99d79 100644 --- a/core/java/com/android/internal/app/ChooserListAdapter.java +++ b/core/java/com/android/internal/app/ChooserListAdapter.java @@ -33,9 +33,9 @@ import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.UserHandle; import android.os.UserManager; +import android.provider.DeviceConfig; import android.service.chooser.ChooserTarget; import android.util.Log; -import android.util.Pair; import android.view.View; import android.view.ViewGroup; @@ -46,14 +46,13 @@ import com.android.internal.app.chooser.DisplayResolveInfo; import com.android.internal.app.chooser.MultiDisplayResolveInfo; import com.android.internal.app.chooser.SelectableTargetInfo; import com.android.internal.app.chooser.TargetInfo; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; public class ChooserListAdapter extends ResolverListAdapter { private static final String TAG = "ChooserListAdapter"; @@ -70,8 +69,6 @@ public class ChooserListAdapter extends ResolverListAdapter { private static final int MAX_SUGGESTED_APP_TARGETS = 4; private static final int MAX_CHOOSER_TARGETS_PER_APP = 2; - private static final int MAX_SERVICE_TARGET_APP = 8; - private static final int DEFAULT_DIRECT_SHARE_RANKING_SCORE = 1000; /** {@link #getBaseScore} */ public static final float CALLER_TARGET_SCORE_BOOST = 900.f; @@ -85,17 +82,11 @@ public class ChooserListAdapter extends ResolverListAdapter { private int mNumShortcutResults = 0; private Map<DisplayResolveInfo, LoadIconTask> mIconLoaders = new HashMap<>(); + private boolean mApplySharingAppLimits; // Reserve spots for incoming direct share targets by adding placeholders private ChooserTargetInfo mPlaceHolderTargetInfo = new ChooserActivity.PlaceHolderTargetInfo(); - private int mValidServiceTargetsNum = 0; - private int mAvailableServiceTargetsNum = 0; - private final Map<ComponentName, Pair<List<ChooserTargetInfo>, Integer>> - mParkingDirectShareTargets = new HashMap<>(); - private final Map<ComponentName, Map<String, Integer>> mChooserTargetScores = new HashMap<>(); - private Set<ComponentName> mPendingChooserTargetService = new HashSet<>(); - private Set<ComponentName> mShortcutComponents = new HashSet<>(); private final List<ChooserTargetInfo> mServiceTargets = new ArrayList<>(); private final List<DisplayResolveInfo> mCallerTargets = new ArrayList<>(); @@ -174,6 +165,10 @@ public class ChooserListAdapter extends ResolverListAdapter { if (mCallerTargets.size() == MAX_SUGGESTED_APP_TARGETS) break; } } + mApplySharingAppLimits = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.APPLY_SHARING_APP_LIMITS_IN_SYSUI, + true); } AppPredictor getAppPredictor() { @@ -209,10 +204,6 @@ public class ChooserListAdapter extends ResolverListAdapter { private void createPlaceHolders() { mNumShortcutResults = 0; mServiceTargets.clear(); - mValidServiceTargetsNum = 0; - mParkingDirectShareTargets.clear(); - mPendingChooserTargetService.clear(); - mShortcutComponents.clear(); for (int i = 0; i < mChooserListCommunicator.getMaxRankedTargets(); i++) { mServiceTargets.add(mPlaceHolderTargetInfo); } @@ -508,25 +499,27 @@ public class ChooserListAdapter extends ResolverListAdapter { if (targets.size() == 0) { return; } - final float baseScore = getBaseScore(origTarget, targetType); Collections.sort(targets, mBaseTargetComparator); - final boolean isShortcutResult = (targetType == TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER || targetType == TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE); final int maxTargets = isShortcutResult ? mMaxShortcutTargetsPerApp : MAX_CHOOSER_TARGETS_PER_APP; + final int targetsLimit = mApplySharingAppLimits ? Math.min(targets.size(), maxTargets) + : targets.size(); float lastScore = 0; boolean shouldNotify = false; - for (int i = 0, count = Math.min(targets.size(), maxTargets); i < count; i++) { + for (int i = 0, count = targetsLimit; i < count; i++) { final ChooserTarget target = targets.get(i); float targetScore = target.getScore(); - targetScore *= baseScore; - if (i > 0 && targetScore >= lastScore) { - // Apply a decay so that the top app can't crowd out everything else. - // This incents ChooserTargetServices to define what's truly better. - targetScore = lastScore * 0.95f; + if (mApplySharingAppLimits) { + targetScore *= baseScore; + if (i > 0 && targetScore >= lastScore) { + // Apply a decay so that the top app can't crowd out everything else. + // This incents ChooserTargetServices to define what's truly better. + targetScore = lastScore * 0.95f; + } } UserHandle userHandle = getUserHandle(); Context contextAsUser = mContext.createContextAsUser(userHandle, 0 /* flags */); @@ -544,7 +537,8 @@ public class ChooserListAdapter extends ResolverListAdapter { Log.d(TAG, " => " + target.toString() + " score=" + targetScore + " base=" + target.getScore() + " lastScore=" + lastScore - + " baseScore=" + baseScore); + + " baseScore=" + baseScore + + " applyAppLimit=" + mApplySharingAppLimits); } lastScore = targetScore; @@ -580,16 +574,11 @@ public class ChooserListAdapter extends ResolverListAdapter { if (target == null) { return CALLER_TARGET_SCORE_BOOST; } - - if (targetType == TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE) { - return SHORTCUT_TARGET_SCORE_BOOST; - } - float score = super.getScore(target); - if (targetType == TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER) { + if (targetType == TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER + || targetType == TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE) { return score * SHORTCUT_TARGET_SCORE_BOOST; } - return score; } diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 52801faf9c36..3729899f819d 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -473,6 +473,14 @@ public final class SystemUiDeviceConfigFlags { */ public static final String SHARE_USE_SERVICE_TARGETS = "share_use_service_targets"; + /** + * (boolean) If true, SysUI provides guardrails for app usage of Direct Share by enforcing + * limits on number of targets per app & adjusting scores for apps providing many targets. If + * false, this step is skipped. This should be true unless the ranking provider configured by + * [some other flag] is expected to manage these incentives. + */ + public static final String APPLY_SHARING_APP_LIMITS_IN_SYSUI = + "apply_sharing_app_limits_in_sysui"; /* * (long) The duration that the home button must be pressed before triggering Assist |
