diff options
5 files changed, 46 insertions, 9 deletions
diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java index c87ece29800c..ee3c39fc60b0 100644 --- a/services/people/java/com/android/server/people/data/DataManager.java +++ b/services/people/java/com/android/server/people/data/DataManager.java @@ -226,6 +226,10 @@ public class DataManager { return; } String shortcutId = appTarget.getShortcutInfo().getId(); + // Skip storing chooserTargets sharing events + if (ChooserActivity.CHOOSER_TARGET.equals(shortcutId)) { + return; + } if (packageData.getConversationStore().getConversation(shortcutId) == null) { addOrUpdateConversationInfo(appTarget.getShortcutInfo()); } 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 d09d0b379769..43acd459f84b 100644 --- a/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java +++ b/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java @@ -27,6 +27,8 @@ import android.app.prediction.AppTargetId; import android.content.IntentFilter; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager.ShareShortcutInfo; +import android.util.Log; +import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.ChooserActivity; @@ -45,6 +47,8 @@ import java.util.function.Consumer; */ class ShareTargetPredictor extends AppTargetPredictor { + private static final String TAG = "ShareTargetPredictor"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final IntentFilter mIntentFilter; ShareTargetPredictor(@NonNull AppPredictionContext predictionContext, @@ -59,6 +63,9 @@ class ShareTargetPredictor extends AppTargetPredictor { @WorkerThread @Override void reportAppTargetEvent(AppTargetEvent event) { + if (DEBUG) { + Slog.d(TAG, "reportAppTargetEvent"); + } getDataManager().reportShareTargetEvent(event, mIntentFilter); } @@ -66,6 +73,9 @@ class ShareTargetPredictor extends AppTargetPredictor { @WorkerThread @Override void predictTargets() { + if (DEBUG) { + Slog.d(TAG, "predictTargets"); + } List<ShareTarget> shareTargets = getDirectShareTargets(); SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter), System.currentTimeMillis()); @@ -82,6 +92,9 @@ class ShareTargetPredictor extends AppTargetPredictor { @WorkerThread @Override void sortTargets(List<AppTarget> targets, Consumer<List<AppTarget>> callback) { + if (DEBUG) { + Slog.d(TAG, "sortTargets"); + } List<ShareTarget> shareTargets = getAppShareTargets(targets); SharesheetModelScorer.computeScoreForAppShare(shareTargets, getShareEventType(mIntentFilter), getPredictionContext().getPredictedTargetCount(), @@ -89,7 +102,15 @@ class ShareTargetPredictor extends AppTargetPredictor { mCallingUserId); Collections.sort(shareTargets, (t1, t2) -> -Float.compare(t1.getScore(), t2.getScore())); List<AppTarget> appTargetList = new ArrayList<>(); - shareTargets.forEach(t -> appTargetList.add(t.getAppTarget())); + for (ShareTarget shareTarget : shareTargets) { + AppTarget appTarget = shareTarget.getAppTarget(); + appTargetList.add(new AppTarget.Builder(appTarget.getId(), appTarget.getPackageName(), + appTarget.getUser()) + .setClassName(appTarget.getClassName()) + .setRank(shareTarget.getScore() > 0 ? (int) (shareTarget.getScore() + * 1000) : 0) + .build()); + } callback.accept(appTargetList); } 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 0ac5724210da..76f252efb412 100644 --- a/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java +++ b/services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java @@ -50,6 +50,7 @@ class SharesheetModelScorer { private static final float RECENCY_SCORE_SUBSEQUENT_DECAY = 0.02F; private static final long ONE_MONTH_WINDOW = TimeUnit.DAYS.toMillis(30); private static final long FOREGROUND_APP_PROMO_TIME_WINDOW = TimeUnit.MINUTES.toMillis(10); + private static final float FREQUENTLY_USED_APP_SCORE_INITIAL_DECAY = 0.3F; private static final float FREQUENTLY_USED_APP_SCORE_DECAY = 0.9F; @VisibleForTesting static final float FOREGROUND_APP_WEIGHT = 0F; @@ -219,6 +220,7 @@ class SharesheetModelScorer { Map<String, Integer> appLaunchCountsMap = dataManager.queryAppLaunchCount( callingUserId, now - ONE_MONTH_WINDOW, now, shareTargetMap.keySet()); List<Pair<String, Integer>> appLaunchCounts = new ArrayList<>(); + minValidScore *= FREQUENTLY_USED_APP_SCORE_INITIAL_DECAY; for (Map.Entry<String, Integer> entry : appLaunchCountsMap.entrySet()) { if (entry.getValue() > 0) { appLaunchCounts.add(new Pair(entry.getKey(), entry.getValue())); @@ -233,8 +235,8 @@ class SharesheetModelScorer { if (target.getScore() > 0f) { continue; } - minValidScore *= FREQUENTLY_USED_APP_SCORE_DECAY; target.setScore(minValidScore); + minValidScore *= FREQUENTLY_USED_APP_SCORE_DECAY; if (DEBUG) { Slog.d(TAG, String.format( "SharesheetModel: promoteFrequentUsedApps packageName: %s, className: %s," diff --git a/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java b/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java index 1480627b9b9f..c2716393b947 100644 --- a/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java +++ b/services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java @@ -16,8 +16,6 @@ package com.android.server.people.prediction; -import static com.google.common.truth.Truth.assertThat; - import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -274,8 +272,20 @@ public final class ShareTargetPredictorTest { mUpdatePredictionsMethod); verify(mUpdatePredictionsMethod).accept(mAppTargetCaptor.capture()); - assertThat(mAppTargetCaptor.getValue()).containsExactly( - appTarget4, appTarget3, appTarget2, appTarget1, appTarget5); + List<AppTarget> res = mAppTargetCaptor.getValue(); + assertEquals(5, res.size()); + checkAppTarget(appTarget4, res.get(0)); + checkAppTarget(appTarget3, res.get(1)); + checkAppTarget(appTarget2, res.get(2)); + checkAppTarget(appTarget1, res.get(3)); + checkAppTarget(appTarget5, res.get(4)); + } + + private static void checkAppTarget(AppTarget expected, AppTarget actual) { + assertEquals(expected.getId(), actual.getId()); + assertEquals(expected.getClassName(), actual.getClassName()); + assertEquals(expected.getPackageName(), actual.getPackageName()); + assertEquals(expected.getUser(), actual.getUser()); } private static ShareShortcutInfo buildShareShortcut( diff --git a/services/tests/servicestests/src/com/android/server/people/prediction/SharesheetModelScorerTest.java b/services/tests/servicestests/src/com/android/server/people/prediction/SharesheetModelScorerTest.java index 9d96d6b7d861..9fc17763b8e0 100644 --- a/services/tests/servicestests/src/com/android/server/people/prediction/SharesheetModelScorerTest.java +++ b/services/tests/servicestests/src/com/android/server/people/prediction/SharesheetModelScorerTest.java @@ -281,9 +281,9 @@ public final class SharesheetModelScorerTest { verify(mDataManager, times(1)).queryAppLaunchCount(anyInt(), anyLong(), anyLong(), anySet()); - assertEquals(0.9f, mShareTarget5.getScore(), DELTA); - assertEquals(0.81f, mShareTarget3.getScore(), DELTA); - assertEquals(0.729f, mShareTarget1.getScore(), DELTA); + assertEquals(0.3f, mShareTarget5.getScore(), DELTA); + assertEquals(0.27f, mShareTarget3.getScore(), DELTA); + assertEquals(0.243f, mShareTarget1.getScore(), DELTA); assertEquals(0f, mShareTarget2.getScore(), DELTA); assertEquals(0f, mShareTarget4.getScore(), DELTA); assertEquals(0f, mShareTarget6.getScore(), DELTA); |