Merge "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." into rvc-dev am: c0128fa07d am: bd9c30505e am: e94e648e84
Change-Id: If3ae7b60c1a4b34414d68d1727fd731e68d2c3c3
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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,"
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user