summaryrefslogtreecommitdiff
path: root/services/people
diff options
context:
space:
mode:
authorSong Hu <songhu@google.com>2020-09-23 18:12:46 -0700
committerSong Hu <songhu@google.com>2020-09-24 22:18:49 -0700
commiteedf47cbf5836730e7076d920722930a544af846 (patch)
tree97a1b30f5184d7dadd551f696ba44b82e1115da0 /services/people
parentd6af5b5d1e5986c2d63dfc89d996c899416cf9f8 (diff)
DO NOT MERGE Put parameterized weights on top two sharing shortcuts of each app as per shortcuts native ranking in PeopleService Sharesheet model.
By default weights are 0 which ensures ranking same as what it is now. Bug: 168212835 Test: atest com.android.server.people.prediction.SharesheetModelScorerTest Change-Id: I02eaa5b6a448c33b51e5f4c6acaba93e7a2bd995
Diffstat (limited to 'services/people')
-rw-r--r--services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java4
-rw-r--r--services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java75
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