diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2020-06-11 13:56:11 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-06-11 13:56:11 +0000 |
commit | d5fe3bf3acc6a9d01554ab532c5cd76e508fe2d9 (patch) | |
tree | 033e039d21f42b747f627077852a76207610ec6e | |
parent | 5c4ad7091e38e7df7e67aac282898445cae1d141 (diff) | |
parent | a4157a3b3bd13b9dd8f9d633aa0d4d26a10735da (diff) |
Merge "Factor native ranks provided by apps into shortcut targets ranking. This would help rank shortcuts targets properly when there is no enough sharing history on them." into rvc-dev
2 files changed, 56 insertions, 14 deletions
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 2e60f2afcdea..236ac8407faa 100644 --- a/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java +++ b/services/people/java/com/android/server/people/prediction/ShareTargetPredictor.java @@ -16,6 +16,8 @@ package com.android.server.people.prediction; +import static java.util.Collections.reverseOrder; + import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -39,6 +41,7 @@ import com.android.server.people.data.PackageData; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.function.Consumer; @@ -85,7 +88,9 @@ class ShareTargetPredictor extends AppTargetPredictor { List<ShareTarget> shareTargets = getDirectShareTargets(); SharesheetModelScorer.computeScore(shareTargets, getShareEventType(mIntentFilter), System.currentTimeMillis()); - Collections.sort(shareTargets, (t1, t2) -> -Float.compare(t1.getScore(), t2.getScore())); + Collections.sort(shareTargets, + Comparator.comparing(ShareTarget::getScore, reverseOrder()) + .thenComparing(t -> t.getAppTarget().getRank())); List<AppTarget> res = new ArrayList<>(); for (int i = 0; i < Math.min(getPredictionContext().getPredictedTargetCount(), shareTargets.size()); i++) { @@ -135,6 +140,7 @@ class ShareTargetPredictor extends AppTargetPredictor { new AppTargetId(shortcutInfo.getId()), shortcutInfo) .setClassName(shareShortcut.getTargetComponent().getClassName()) + .setRank(shortcutInfo.getRank()) .build(); String packageName = shortcutInfo.getPackage(); int userId = shortcutInfo.getUserId(); 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 60104d390eb7..b09a3c374e86 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 @@ -117,10 +117,10 @@ public final class ShareTargetPredictorTest { @Test public void testPredictTargets() { - mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc1")); - mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc2")); - mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc3")); - mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc4")); + mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc1", 0)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc2", 0)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc3", 0)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc4", 0)); when(mPackageData1.getConversationInfo("sc1")).thenReturn(mock(ConversationInfo.class)); when(mPackageData1.getConversationInfo("sc2")).thenReturn(mock(ConversationInfo.class)); @@ -165,12 +165,12 @@ public final class ShareTargetPredictorTest { @Test public void testPredictTargets_reachTargetsLimit() { - mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc1")); - mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc2")); - mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc3")); - mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc4")); - mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc5")); - mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc6")); + mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc1", 0)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc2", 0)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc3", 0)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc4", 0)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc5", 0)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc6", 0)); when(mPackageData1.getConversationInfo("sc1")).thenReturn(mock(ConversationInfo.class)); when(mPackageData1.getConversationInfo("sc2")).thenReturn(mock(ConversationInfo.class)); @@ -250,6 +250,41 @@ public final class ShareTargetPredictorTest { } @Test + public void testPredictTargets_noSharingHistoryRankedByShortcutRank() { + mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc1", 3)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_1, CLASS_1, "sc2", 2)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc3", 1)); + mShareShortcuts.add(buildShareShortcut(PACKAGE_2, CLASS_2, "sc4", 0)); + + when(mPackageData1.getConversationInfo("sc1")).thenReturn(mock(ConversationInfo.class)); + when(mPackageData1.getConversationInfo("sc2")).thenReturn(mock(ConversationInfo.class)); + when(mPackageData2.getConversationInfo("sc3")).thenReturn(mock(ConversationInfo.class)); + // "sc4" does not have a ConversationInfo. + + mPredictor.predictTargets(); + + verify(mUpdatePredictionsMethod).accept(mAppTargetCaptor.capture()); + List<AppTarget> res = mAppTargetCaptor.getValue(); + assertEquals(4, res.size()); + + assertEquals("sc4", res.get(0).getId().getId()); + assertEquals(CLASS_2, res.get(0).getClassName()); + assertEquals(PACKAGE_2, res.get(0).getPackageName()); + + assertEquals("sc3", res.get(1).getId().getId()); + assertEquals(CLASS_2, res.get(1).getClassName()); + assertEquals(PACKAGE_2, res.get(1).getPackageName()); + + assertEquals("sc2", res.get(2).getId().getId()); + assertEquals(CLASS_1, res.get(2).getClassName()); + assertEquals(PACKAGE_1, res.get(2).getPackageName()); + + assertEquals("sc1", res.get(3).getId().getId()); + assertEquals(CLASS_1, res.get(3).getClassName()); + assertEquals(PACKAGE_1, res.get(3).getPackageName()); + } + + @Test public void testSortTargets() { AppTarget appTarget1 = new AppTarget.Builder( new AppTargetId("cls1#pkg1"), PACKAGE_1, UserHandle.of(USER_ID)) @@ -348,19 +383,20 @@ public final class ShareTargetPredictorTest { } private static ShareShortcutInfo buildShareShortcut( - String packageName, String className, String shortcutId) { - ShortcutInfo shortcutInfo = buildShortcut(packageName, shortcutId); + String packageName, String className, String shortcutId, int rank) { + ShortcutInfo shortcutInfo = buildShortcut(packageName, shortcutId, rank); ComponentName componentName = new ComponentName(packageName, className); return new ShareShortcutInfo(shortcutInfo, componentName); } - private static ShortcutInfo buildShortcut(String packageName, String shortcutId) { + private static ShortcutInfo buildShortcut(String packageName, String shortcutId, int rank) { Context mockContext = mock(Context.class); when(mockContext.getPackageName()).thenReturn(packageName); when(mockContext.getUserId()).thenReturn(USER_ID); when(mockContext.getUser()).thenReturn(UserHandle.of(USER_ID)); ShortcutInfo.Builder builder = new ShortcutInfo.Builder(mockContext, shortcutId) .setShortLabel(shortcutId) + .setRank(rank) .setIntent(new Intent("TestIntent")); return builder.build(); } |