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 d9ca4152026e4..107c41a47507e 100644 --- a/services/people/java/com/android/server/people/data/DataManager.java +++ b/services/people/java/com/android/server/people/data/DataManager.java @@ -229,6 +229,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 d09d0b379769c..43acd459f84bd 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 shareTargets = getDirectShareTargets(); SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter), System.currentTimeMillis()); @@ -82,6 +92,9 @@ class ShareTargetPredictor extends AppTargetPredictor { @WorkerThread @Override void sortTargets(List targets, Consumer> callback) { + if (DEBUG) { + Slog.d(TAG, "sortTargets"); + } List 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 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 0ac5724210da8..76f252efb412d 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 appLaunchCountsMap = dataManager.queryAppLaunchCount( callingUserId, now - ONE_MONTH_WINDOW, now, shareTargetMap.keySet()); List> appLaunchCounts = new ArrayList<>(); + minValidScore *= FREQUENTLY_USED_APP_SCORE_INITIAL_DECAY; for (Map.Entry 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 1480627b9b9f2..c2716393b9472 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 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 9d96d6b7d861b..9fc17763b8e00 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);