diff options
author | Song Hu <songhu@google.com> | 2020-09-25 07:50:55 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-09-25 07:50:55 +0000 |
commit | 943c807473851cca6da46576128e25d73d411a22 (patch) | |
tree | cdcbc7a748bec89f91695d3f25d88c84755dce4c /services/people | |
parent | 2f44bc9dfe0f3b9005eb2ce308309154e7249c55 (diff) | |
parent | eedf47cbf5836730e7076d920722930a544af846 (diff) |
DO NOT MERGE Put parameterized weights on top two sharing shortcuts of each app as per shortcuts native ranking in PeopleService Sharesheet model. am: eedf47cbf5
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12684673
Change-Id: I29e0c19f954fc6ce8538a2300279a42120569106
Diffstat (limited to 'services/people')
-rw-r--r-- | services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java | 4 | ||||
-rw-r--r-- | services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java | 75 |
2 files changed, 77 insertions, 2 deletions
diff --git a/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java b/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java index 236ac8407faa..9e6cf845d144 100644 --- a/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java +++ b/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java @@ -86,8 +86,8 @@ class ShareTargetPredictor extends AppTargetPredictor { return; } List<ShareTarget> shareTargets = getDirectShareTargets(); - SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter), - System.currentTimeMillis()); + SharesheetModelScorer.computeScoreForDirectShare(shareTargets, + getShareEventType(mIntentFilter), System.currentTimeMillis()); Collections.sort(shareTargets, Comparator.comparing(ShareTarget::getScore, reverseOrder()) .thenComparing(t -> t.getAppTarget().getRank())); diff --git a/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java b/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java index c77843cfb044..d4a502da56c7 100644 --- a/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java +++ b/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.usage.UsageEvents; +import android.provider.DeviceConfig; import android.util.ArrayMap; import android.util.Pair; import android.util.Range; @@ -27,12 +28,14 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.ChooserActivity; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.server.people.data.AppUsageStatsData; import com.android.server.people.data.DataManager; import com.android.server.people.data.Event; import java.time.Duration; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -46,6 +49,7 @@ class SharesheetModelScorer { private static final String TAG = "SharesheetModelScorer"; private static final boolean DEBUG = false; private static final Integer RECENCY_SCORE_COUNT = 6; + private static final Integer NATIVE_RANK_COUNT = 2; private static final float RECENCY_INITIAL_BASE_SCORE = 0.4F; private static final float RECENCY_SCORE_INITIAL_DECAY = 0.05F; private static final float RECENCY_SCORE_SUBSEQUENT_DECAY = 0.02F; @@ -174,6 +178,77 @@ class SharesheetModelScorer { postProcess(shareTargets, targetsLimit, dataManager, callingUserId); } + /** + * Computes ranking score for direct sharing. Update + * {@link ShareTargetPredictor.ShareTargetScore}. + */ + static void computeScoreForDirectShare(List<ShareTargetPredictor.ShareTarget> shareTargets, + int shareEventType, long now) { + computeScore(shareTargets, shareEventType, now); + promoteTopNativeRankedShortcuts(shareTargets); + } + + /** + * Promotes top (NATIVE_RANK_COUNT) shortcuts for each package and class, as per shortcut native + * ranking provided by apps. + */ + private static void promoteTopNativeRankedShortcuts( + List<ShareTargetPredictor.ShareTarget> shareTargets) { + float topShortcutBonus = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.TOP_NATIVE_RANKED_SHARING_SHORTCUTS_BOOSTER, + 0f); + float secondTopShortcutBonus = DeviceConfig.getFloat( + DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.NON_TOP_NATIVE_RANKED_SHARING_SHORTCUTS_BOOSTER, + 0f); + // Populates a map which key is a packageName and className pair, value is a max heap + // containing top (NATIVE_RANK_COUNT) shortcuts as per shortcut native ranking provided + // by apps. + Map<Pair<String, String>, PriorityQueue<ShareTargetPredictor.ShareTarget>> + topNativeRankedShareTargetMap = new ArrayMap<>(); + for (ShareTargetPredictor.ShareTarget shareTarget : shareTargets) { + Pair<String, String> key = new Pair<>(shareTarget.getAppTarget().getPackageName(), + shareTarget.getAppTarget().getClassName()); + if (!topNativeRankedShareTargetMap.containsKey(key)) { + topNativeRankedShareTargetMap.put(key, + new PriorityQueue<>(NATIVE_RANK_COUNT, + Collections.reverseOrder(Comparator.comparingInt( + p -> p.getAppTarget().getRank())))); + } + PriorityQueue<ShareTargetPredictor.ShareTarget> rankMaxHeap = + topNativeRankedShareTargetMap.get(key); + if (rankMaxHeap.isEmpty() || shareTarget.getAppTarget().getRank() + < rankMaxHeap.peek().getAppTarget().getRank()) { + if (rankMaxHeap.size() == NATIVE_RANK_COUNT) { + rankMaxHeap.poll(); + } + rankMaxHeap.offer(shareTarget); + } + } + for (PriorityQueue<ShareTargetPredictor.ShareTarget> maxHeap : + topNativeRankedShareTargetMap.values()) { + while (!maxHeap.isEmpty()) { + ShareTargetPredictor.ShareTarget target = maxHeap.poll(); + float bonus = maxHeap.isEmpty() ? topShortcutBonus : secondTopShortcutBonus; + target.setScore(probOR(target.getScore(), bonus)); + + if (DEBUG) { + Slog.d(TAG, String.format( + "SharesheetModel: promote top shortcut as per native ranking," + + "packageName: %s, className: %s, shortcutId: %s, bonus:%.2f," + + "total:%.2f", + target.getAppTarget().getPackageName(), + target.getAppTarget().getClassName(), + target.getAppTarget().getShortcutInfo() != null + ? target.getAppTarget().getShortcutInfo().getId() : null, + bonus, + target.getScore())); + } + } + } + } + private static void postProcess(List<ShareTargetPredictor.ShareTarget> shareTargets, int targetsLimit, @NonNull DataManager dataManager, @UserIdInt int callingUserId) { // Populates a map which key is package name and value is list of shareTargets descended |