summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSong Hu <songhu@google.com>2020-05-04 14:41:55 -0700
committerSong Hu <songhu@google.com>2020-05-04 15:58:26 -0700
commit7e134c22eb07e252e8080953b1d334dfcfbaf4c8 (patch)
tree6b83f430204ab2f8bf6a4b33c748ce6981d0d642
parent5aab2d3fbe3b484fe6b80d98c07179665a2151c6 (diff)
Changes in PeopleService to supprot ChooserTarget ranking.
1. Pass app share score from PeopleService to Aosp. 2. Skip storing ChooserTargets sharing event in PeopleService. 3. Adjust frequest used app promo decay. Bug: 151112858 Test: atest com.android.server.people.prediction.ShareTargetPredictorTest Test: atest com.android.server.people.prediction.SharesheetModelScorerTest Change-Id: If27d0c914b9f156403950e7ea601b4a7ad35b27f
-rw-r--r--services/people/java/com/android/server/people/data/DataManager.java4
-rw-r--r--services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java23
-rw-r--r--services/people/java/com/android/server/people/prediction/SharesheetModelScorer.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/people/prediction/ShareTargetPredictorTest.java18
-rw-r--r--services/tests/servicestests/src/com/android/server/people/prediction/SharesheetModelScorerTest.java6
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);