Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c0128fa0 authored by Song Hu's avatar Song Hu Committed by Android (Google) Code Review
Browse files

Merge "Changes in PeopleService to supprot ChooserTarget ranking. 1. Pass app...

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
parents 4650ba09 7e134c22
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -229,6 +229,10 @@ public class DataManager {
                return;
                return;
            }
            }
            String shortcutId = appTarget.getShortcutInfo().getId();
            String shortcutId = appTarget.getShortcutInfo().getId();
            // Skip storing chooserTargets sharing events
            if (ChooserActivity.CHOOSER_TARGET.equals(shortcutId)) {
                return;
            }
            if (packageData.getConversationStore().getConversation(shortcutId) == null) {
            if (packageData.getConversationStore().getConversation(shortcutId) == null) {
                addOrUpdateConversationInfo(appTarget.getShortcutInfo());
                addOrUpdateConversationInfo(appTarget.getShortcutInfo());
            }
            }
+22 −1
Original line number Original line Diff line number Diff line
@@ -27,6 +27,8 @@ import android.app.prediction.AppTargetId;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager.ShareShortcutInfo;
import android.content.pm.ShortcutManager.ShareShortcutInfo;
import android.util.Log;
import android.util.Slog;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.ChooserActivity;
import com.android.internal.app.ChooserActivity;
@@ -45,6 +47,8 @@ import java.util.function.Consumer;
 */
 */
class ShareTargetPredictor extends AppTargetPredictor {
class ShareTargetPredictor extends AppTargetPredictor {


    private static final String TAG = "ShareTargetPredictor";
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
    private final IntentFilter mIntentFilter;
    private final IntentFilter mIntentFilter;


    ShareTargetPredictor(@NonNull AppPredictionContext predictionContext,
    ShareTargetPredictor(@NonNull AppPredictionContext predictionContext,
@@ -59,6 +63,9 @@ class ShareTargetPredictor extends AppTargetPredictor {
    @WorkerThread
    @WorkerThread
    @Override
    @Override
    void reportAppTargetEvent(AppTargetEvent event) {
    void reportAppTargetEvent(AppTargetEvent event) {
        if (DEBUG) {
            Slog.d(TAG, "reportAppTargetEvent");
        }
        getDataManager().reportShareTargetEvent(event, mIntentFilter);
        getDataManager().reportShareTargetEvent(event, mIntentFilter);
    }
    }


@@ -66,6 +73,9 @@ class ShareTargetPredictor extends AppTargetPredictor {
    @WorkerThread
    @WorkerThread
    @Override
    @Override
    void predictTargets() {
    void predictTargets() {
        if (DEBUG) {
            Slog.d(TAG, "predictTargets");
        }
        List<ShareTarget> shareTargets = getDirectShareTargets();
        List<ShareTarget> shareTargets = getDirectShareTargets();
        SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter),
        SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter),
                System.currentTimeMillis());
                System.currentTimeMillis());
@@ -82,6 +92,9 @@ class ShareTargetPredictor extends AppTargetPredictor {
    @WorkerThread
    @WorkerThread
    @Override
    @Override
    void sortTargets(List<AppTarget> targets, Consumer<List<AppTarget>> callback) {
    void sortTargets(List<AppTarget> targets, Consumer<List<AppTarget>> callback) {
        if (DEBUG) {
            Slog.d(TAG, "sortTargets");
        }
        List<ShareTarget> shareTargets = getAppShareTargets(targets);
        List<ShareTarget> shareTargets = getAppShareTargets(targets);
        SharesheetModelScorer.computeScoreForAppShare(shareTargets,
        SharesheetModelScorer.computeScoreForAppShare(shareTargets,
                getShareEventType(mIntentFilter), getPredictionContext().getPredictedTargetCount(),
                getShareEventType(mIntentFilter), getPredictionContext().getPredictedTargetCount(),
@@ -89,7 +102,15 @@ class ShareTargetPredictor extends AppTargetPredictor {
                mCallingUserId);
                mCallingUserId);
        Collections.sort(shareTargets, (t1, t2) -> -Float.compare(t1.getScore(), t2.getScore()));
        Collections.sort(shareTargets, (t1, t2) -> -Float.compare(t1.getScore(), t2.getScore()));
        List<AppTarget> appTargetList = new ArrayList<>();
        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);
        callback.accept(appTargetList);
    }
    }


+3 −1
Original line number Original line Diff line number Diff line
@@ -50,6 +50,7 @@ class SharesheetModelScorer {
    private static final float RECENCY_SCORE_SUBSEQUENT_DECAY = 0.02F;
    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 ONE_MONTH_WINDOW = TimeUnit.DAYS.toMillis(30);
    private static final long FOREGROUND_APP_PROMO_TIME_WINDOW = TimeUnit.MINUTES.toMillis(10);
    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;
    private static final float FREQUENTLY_USED_APP_SCORE_DECAY = 0.9F;
    @VisibleForTesting
    @VisibleForTesting
    static final float FOREGROUND_APP_WEIGHT = 0F;
    static final float FOREGROUND_APP_WEIGHT = 0F;
@@ -219,6 +220,7 @@ class SharesheetModelScorer {
        Map<String, Integer> appLaunchCountsMap = dataManager.queryAppLaunchCount(
        Map<String, Integer> appLaunchCountsMap = dataManager.queryAppLaunchCount(
                callingUserId, now - ONE_MONTH_WINDOW, now, shareTargetMap.keySet());
                callingUserId, now - ONE_MONTH_WINDOW, now, shareTargetMap.keySet());
        List<Pair<String, Integer>> appLaunchCounts = new ArrayList<>();
        List<Pair<String, Integer>> appLaunchCounts = new ArrayList<>();
        minValidScore *= FREQUENTLY_USED_APP_SCORE_INITIAL_DECAY;
        for (Map.Entry<String, Integer> entry : appLaunchCountsMap.entrySet()) {
        for (Map.Entry<String, Integer> entry : appLaunchCountsMap.entrySet()) {
            if (entry.getValue() > 0) {
            if (entry.getValue() > 0) {
                appLaunchCounts.add(new Pair(entry.getKey(), entry.getValue()));
                appLaunchCounts.add(new Pair(entry.getKey(), entry.getValue()));
@@ -233,8 +235,8 @@ class SharesheetModelScorer {
            if (target.getScore() > 0f) {
            if (target.getScore() > 0f) {
                continue;
                continue;
            }
            }
            minValidScore *= FREQUENTLY_USED_APP_SCORE_DECAY;
            target.setScore(minValidScore);
            target.setScore(minValidScore);
            minValidScore *= FREQUENTLY_USED_APP_SCORE_DECAY;
            if (DEBUG) {
            if (DEBUG) {
                Slog.d(TAG, String.format(
                Slog.d(TAG, String.format(
                        "SharesheetModel: promoteFrequentUsedApps packageName: %s, className: %s,"
                        "SharesheetModel: promoteFrequentUsedApps packageName: %s, className: %s,"
+14 −4
Original line number Original line Diff line number Diff line
@@ -16,8 +16,6 @@


package com.android.server.people.prediction;
package com.android.server.people.prediction;


import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -274,8 +272,20 @@ public final class ShareTargetPredictorTest {
                mUpdatePredictionsMethod);
                mUpdatePredictionsMethod);


        verify(mUpdatePredictionsMethod).accept(mAppTargetCaptor.capture());
        verify(mUpdatePredictionsMethod).accept(mAppTargetCaptor.capture());
        assertThat(mAppTargetCaptor.getValue()).containsExactly(
        List<AppTarget> res = mAppTargetCaptor.getValue();
                appTarget4, appTarget3, appTarget2, appTarget1, appTarget5);
        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(
    private static ShareShortcutInfo buildShareShortcut(
+3 −3
Original line number Original line Diff line number Diff line
@@ -281,9 +281,9 @@ public final class SharesheetModelScorerTest {


        verify(mDataManager, times(1)).queryAppLaunchCount(anyInt(), anyLong(), anyLong(),
        verify(mDataManager, times(1)).queryAppLaunchCount(anyInt(), anyLong(), anyLong(),
                anySet());
                anySet());
        assertEquals(0.9f, mShareTarget5.getScore(), DELTA);
        assertEquals(0.3f, mShareTarget5.getScore(), DELTA);
        assertEquals(0.81f, mShareTarget3.getScore(), DELTA);
        assertEquals(0.27f, mShareTarget3.getScore(), DELTA);
        assertEquals(0.729f, mShareTarget1.getScore(), DELTA);
        assertEquals(0.243f, mShareTarget1.getScore(), DELTA);
        assertEquals(0f, mShareTarget2.getScore(), DELTA);
        assertEquals(0f, mShareTarget2.getScore(), DELTA);
        assertEquals(0f, mShareTarget4.getScore(), DELTA);
        assertEquals(0f, mShareTarget4.getScore(), DELTA);
        assertEquals(0f, mShareTarget6.getScore(), DELTA);
        assertEquals(0f, mShareTarget6.getScore(), DELTA);