diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2020-04-27 16:17:27 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-04-27 16:17:27 +0000 |
commit | 2133dc6e7361289f355fae60c403d4f3f49a53d9 (patch) | |
tree | 325a09650d26c90c60956b033c32e805d7abc401 | |
parent | bac5755dadedd23f50ff1144abafdd10375bfd01 (diff) | |
parent | 6f42281c7f1c669ba230fee00e54647315740ba6 (diff) |
Merge "Implement direct share targets quota based onto app share score in ChooserTarget ranking protorype." into rvc-dev
4 files changed, 80 insertions, 22 deletions
diff --git a/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java b/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java index def11379bdd6..986614c0963c 100644 --- a/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java +++ b/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java @@ -53,6 +53,7 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator private final AppPredictor mAppPredictor; private final Context mContext; private final Map<ComponentName, Integer> mTargetRanks = new HashMap<>(); + private final Map<ComponentName, Integer> mTargetScores = new HashMap<>(); private final UserHandle mUser; private final Intent mIntent; private final String mReferrerPackage; @@ -138,6 +139,11 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator // Null value is okay if we have defaulted to the ResolverRankerService. if (msg.what == RANKER_SERVICE_RESULT && msg.obj != null) { final List<AppTarget> sortedAppTargets = (List<AppTarget>) msg.obj; + if (checkAppTargetRankValid(sortedAppTargets)) { + sortedAppTargets.forEach(target -> mTargetScores.put( + new ComponentName(target.getPackageName(), target.getClassName()), + target.getRank())); + } for (int i = 0; i < sortedAppTargets.size(); i++) { mTargetRanks.put(new ComponentName(sortedAppTargets.get(i).getPackageName(), sortedAppTargets.get(i).getClassName()), i); @@ -147,11 +153,23 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator } } + private boolean checkAppTargetRankValid(List<AppTarget> sortedAppTargets) { + for (AppTarget target : sortedAppTargets) { + if (target.getRank() != 0) { + return true; + } + } + return false; + } + @Override float getScore(ComponentName name) { if (mResolverRankerService != null) { return mResolverRankerService.getScore(name); } + if (!mTargetScores.isEmpty()) { + return mTargetScores.get(name); + } Integer rank = mTargetRanks.get(name); if (rank == null) { Log.w(TAG, "Score requested for unknown component."); diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java index bdfcda520281..69a4927c9ab1 100644 --- a/core/java/com/android/internal/app/ChooserListAdapter.java +++ b/core/java/com/android/internal/app/ChooserListAdapter.java @@ -207,9 +207,6 @@ public class ChooserListAdapter extends ResolverListAdapter { if (mListViewDataChanged) { if (mAppendDirectShareEnabled) { appendServiceTargetsWithQuota(); - if (mPendingChooserTargetService.isEmpty()) { - fillAllServiceTargets(); - } } super.notifyDataSetChanged(); } @@ -493,6 +490,8 @@ public class ChooserListAdapter extends ResolverListAdapter { pendingChooserTargetServiceConnections) { ComponentName origComponentName = origTarget != null ? origTarget.getResolvedComponentName() : !targets.isEmpty() ? targets.get(0).getComponentName() : null; + Log.i(TAG, + "parkTargetIntoMemory " + origComponentName + ", " + targets.size() + " targets"); mPendingChooserTargetService = pendingChooserTargetServiceConnections.stream() .map(ChooserActivity.ChooserTargetServiceConnection::getComponentName) .filter(componentName -> !componentName.equals(origComponentName)) @@ -532,32 +531,56 @@ public class ChooserListAdapter extends ResolverListAdapter { private void appendServiceTargetsWithQuota() { int maxRankedTargets = mChooserListCommunicator.getMaxRankedTargets(); List<ComponentName> topComponentNames = getTopComponentNames(maxRankedTargets); - int appRank = 0; + float totalScore = 0f; + for (ComponentName component : topComponentNames) { + if (!mPendingChooserTargetService.contains(component) + && !mParkingDirectShareTargets.containsKey(component)) { + continue; + } + totalScore += super.getScore(component); + } + boolean shouldWaitPendingService = false; for (ComponentName component : topComponentNames) { if (!mPendingChooserTargetService.contains(component) && !mParkingDirectShareTargets.containsKey(component)) { continue; } - appRank++; + float score = super.getScore(component); + int quota = Math.round(maxRankedTargets * score / totalScore); + if (mPendingChooserTargetService.contains(component) && quota >= 1) { + shouldWaitPendingService = true; + } + if (!mParkingDirectShareTargets.containsKey(component)) { + continue; + } + // Append targets into direct share row as per quota. Pair<List<ChooserTargetInfo>, Integer> parkingTargetsItem = mParkingDirectShareTargets.get(component); - if (parkingTargetsItem != null && parkingTargetsItem.second == 0) { - List<ChooserTargetInfo> parkingTargets = parkingTargetsItem.first; - int initTargetsQuota = appRank <= maxRankedTargets / 2 ? 2 : 1; - int insertedNum = 0; - while (insertedNum < initTargetsQuota && !parkingTargets.isEmpty()) { - if (!checkDuplicateTarget(parkingTargets.get(0))) { - mServiceTargets.add(mValidServiceTargetsNum, parkingTargets.get(0)); - mValidServiceTargetsNum++; - insertedNum++; - } - parkingTargets.remove(0); - } - mParkingDirectShareTargets.put(component, new Pair<>(parkingTargets, insertedNum)); - if (mShortcutComponents.contains(component)) { - mNumShortcutResults += insertedNum; + List<ChooserTargetInfo> parkingTargets = parkingTargetsItem.first; + int insertedNum = parkingTargetsItem.second; + while (insertedNum < quota && !parkingTargets.isEmpty()) { + if (!checkDuplicateTarget(parkingTargets.get(0))) { + mServiceTargets.add(mValidServiceTargetsNum, parkingTargets.get(0)); + mValidServiceTargetsNum++; + insertedNum++; } + parkingTargets.remove(0); + } + Log.i(TAG, " appendServiceTargetsWithQuota component=" + component + + " appendNum=" + (insertedNum - parkingTargetsItem.second)); + if (DEBUG) { + Log.d(TAG, " appendServiceTargetsWithQuota component=" + component + + " score=" + score + + " totalScore=" + totalScore + + " quota=" + quota); + } + if (mShortcutComponents.contains(component)) { + mNumShortcutResults += insertedNum - parkingTargetsItem.second; } + mParkingDirectShareTargets.put(component, new Pair<>(parkingTargets, insertedNum)); + } + if (!shouldWaitPendingService) { + fillAllServiceTargets(); } } @@ -568,6 +591,7 @@ public class ChooserListAdapter extends ResolverListAdapter { if (mParkingDirectShareTargets.isEmpty()) { return; } + Log.i(TAG, " fillAllServiceTargets"); int maxRankedTargets = mChooserListCommunicator.getMaxRankedTargets(); List<ComponentName> topComponentNames = getTopComponentNames(maxRankedTargets); // Append all remaining targets of top recommended components into direct share row. @@ -581,7 +605,8 @@ public class ChooserListAdapter extends ResolverListAdapter { if (mShortcutComponents.contains(component)) { mNumShortcutResults++; } - mServiceTargets.add(target); + mServiceTargets.add(mValidServiceTargetsNum, target); + mValidServiceTargetsNum++; }); mParkingDirectShareTargets.remove(component); } @@ -593,7 +618,8 @@ public class ChooserListAdapter extends ResolverListAdapter { .forEach(targets -> { for (ChooserTargetInfo target : targets) { if (!checkDuplicateTarget(target)) { - mServiceTargets.add(target); + mServiceTargets.add(mValidServiceTargetsNum, target); + mValidServiceTargetsNum++; mNumShortcutResults++; } } diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java index cee8a923e198..62bddb17db5f 100644 --- a/core/java/com/android/internal/app/ResolverListAdapter.java +++ b/core/java/com/android/internal/app/ResolverListAdapter.java @@ -154,6 +154,13 @@ public class ResolverListAdapter extends BaseAdapter { } /** + * Returns the app share score of the given {@code componentName}. + */ + public float getScore(ComponentName componentName) { + return mResolverListController.getScore(componentName); + } + + /** * Returns the list of top K component names which have highest * {@link #getScore(DisplayResolveInfo)} */ diff --git a/core/java/com/android/internal/app/ResolverListController.java b/core/java/com/android/internal/app/ResolverListController.java index 033ac72dda4e..2b59907cf86b 100644 --- a/core/java/com/android/internal/app/ResolverListController.java +++ b/core/java/com/android/internal/app/ResolverListController.java @@ -378,6 +378,13 @@ public class ResolverListController { } /** + * Returns the app share score of the given {@code componentName}. + */ + public float getScore(ComponentName componentName) { + return mResolverComparator.getScore(componentName); + } + + /** * Returns the list of top K component names which have highest * {@link #getScore(DisplayResolveInfo)} */ |