Merge "Sharesheet - Give shortcut api results priority"

This commit is contained in:
TreeHugger Robot
2019-04-02 17:53:24 +00:00
committed by Android (Google) Code Review

View File

@@ -187,7 +187,10 @@ public class ChooserActivity extends ResolverActivity {
private Drawable mChooserRowLayer;
private int mChooserRowServiceSpacing;
/** {@link ChooserActivity#getBaseScore} */
private static final float CALLER_TARGET_SCORE_BOOST = 900.f;
/** {@link ChooserActivity#getBaseScore} */
private static final float SHORTCUT_TARGET_SCORE_BOOST = 10.f;
private static final String TARGET_DETAILS_FRAGMENT_TAG = "targetDetailsFragment";
private final List<ChooserTargetServiceConnection> mServiceConnections = new ArrayList<>();
@@ -233,7 +236,7 @@ public class ChooserActivity extends ResolverActivity {
}
if (sri.resultTargets != null) {
mChooserListAdapter.addServiceResults(sri.originalTarget,
sri.resultTargets);
sri.resultTargets, false);
}
unbindService(sri.connection);
sri.connection.destroy();
@@ -266,7 +269,7 @@ public class ChooserActivity extends ResolverActivity {
final ServiceResultInfo resultInfo = (ServiceResultInfo) msg.obj;
if (resultInfo.resultTargets != null) {
mChooserListAdapter.addServiceResults(resultInfo.originalTarget,
resultInfo.resultTargets);
resultInfo.resultTargets, true);
}
break;
@@ -894,7 +897,8 @@ public class ChooserActivity extends ResolverActivity {
final ListView listView = adapterView instanceof ListView ? (ListView) adapterView : null;
mChooserListAdapter = (ChooserListAdapter) adapter;
if (mCallerChooserTargets != null && mCallerChooserTargets.length > 0) {
mChooserListAdapter.addServiceResults(null, Lists.newArrayList(mCallerChooserTargets));
mChooserListAdapter.addServiceResults(null, Lists.newArrayList(mCallerChooserTargets),
false);
}
mChooserRowAdapter = new ChooserRowAdapter(mChooserListAdapter);
if (listView != null) {
@@ -1205,7 +1209,7 @@ public class ChooserActivity extends ResolverActivity {
null,
// The ranking score for this target (0.0-1.0); the system will omit items with low
// scores when there are too many Direct Share items.
0.5f,
1.0f,
// The name of the component to be launched if this target is chosen.
shareShortcut.getTargetComponent().clone(),
// The extra values here will be merged into the Intent when this target is chosen.
@@ -1394,15 +1398,6 @@ public class ChooserActivity extends ResolverActivity {
}
return false;
}
@Override
public float getScore(DisplayResolveInfo target) {
if (target == null) {
return CALLER_TARGET_SCORE_BOOST;
}
return super.getScore(target);
}
}
@Override
@@ -1491,7 +1486,7 @@ public class ChooserActivity extends ResolverActivity {
}
public float getModifiedScore() {
return 0.1f;
return -0.1f;
}
public ChooserTarget getChooserTarget() {
@@ -1813,8 +1808,6 @@ public class ChooserActivity extends ResolverActivity {
private final List<TargetInfo> mCallerTargets = new ArrayList<>();
private boolean mShowServiceTargets;
private float mLateFee = 1.f;
private boolean mTargetsNeedPruning = false;
private final BaseChooserTargetComparator mBaseTargetComparator
@@ -2040,13 +2033,22 @@ public class ChooserActivity extends ResolverActivity {
: getDisplayResolveInfo(position - offset);
}
public void addServiceResults(DisplayResolveInfo origTarget, List<ChooserTarget> targets) {
/**
* Evaluate targets for inclusion in the direct share area. May not be included
* if score is too low.
*/
public void addServiceResults(DisplayResolveInfo origTarget, List<ChooserTarget> targets,
boolean isShortcutResult) {
if (DEBUG) {
Log.d(TAG, "addServiceResults " + origTarget + ", " + targets.size()
+ " targets");
}
if (mTargetsNeedPruning && targets.size() > 0) {
if (targets.size() == 0) {
return;
}
if (mTargetsNeedPruning) {
// First proper update since we got an onListRebuilt() with (transient) 0 items.
// Clear out the target list and rebuild.
createPlaceHolders();
@@ -2055,39 +2057,64 @@ public class ChooserActivity extends ResolverActivity {
// Add back any app-supplied direct share targets that may have been
// wiped by this clear
if (mCallerChooserTargets != null) {
addServiceResults(null, Lists.newArrayList(mCallerChooserTargets));
addServiceResults(null, Lists.newArrayList(mCallerChooserTargets), false);
}
}
final float parentScore = getScore(origTarget);
final float baseScore = getBaseScore(origTarget, isShortcutResult);
Collections.sort(targets, mBaseTargetComparator);
float lastScore = 0;
boolean shouldNotify = false;
for (int i = 0, N = Math.min(targets.size(), MAX_TARGETS_PER_SERVICE); i < N; i++) {
final ChooserTarget target = targets.get(i);
float targetScore = target.getScore();
targetScore *= parentScore;
targetScore *= mLateFee;
targetScore *= baseScore;
if (i > 0 && targetScore >= lastScore) {
// Apply a decay so that the top app can't crowd out everything else.
// This incents ChooserTargetServices to define what's truly better.
targetScore = lastScore * 0.95f;
}
insertServiceTarget(new SelectableTargetInfo(origTarget, target, targetScore));
shouldNotify |= insertServiceTarget(
new SelectableTargetInfo(origTarget, target, targetScore));
if (DEBUG) {
Log.d(TAG, " => " + target.toString() + " score=" + targetScore
+ " base=" + target.getScore()
+ " lastScore=" + lastScore
+ " parentScore=" + parentScore
+ " lateFee=" + mLateFee);
+ " baseScore=" + baseScore);
}
lastScore = targetScore;
}
mLateFee *= 0.95f;
if (shouldNotify) {
notifyDataSetChanged();
}
}
notifyDataSetChanged();
/**
* Use the scoring system along with artificial boosts to create up to 3 distinct buckets:
* <ol>
* <li>App-supplied targets
* <li>Prediction manager targets or Shortcut API targets
* <li>Legacy direct share targets
* </ol>
*/
private float getBaseScore(DisplayResolveInfo target, boolean isShortcutResult) {
if (target == null) {
return CALLER_TARGET_SCORE_BOOST;
}
if (USE_PREDICTION_MANAGER_FOR_DIRECT_TARGETS) {
return SHORTCUT_TARGET_SCORE_BOOST;
}
float score = super.getScore(target);
if (isShortcutResult) {
return score * SHORTCUT_TARGET_SCORE_BOOST;
}
return score;
}
/**
@@ -2103,25 +2130,32 @@ public class ChooserActivity extends ResolverActivity {
notifyDataSetChanged();
}
private void insertServiceTarget(ChooserTargetInfo chooserTargetInfo) {
private boolean insertServiceTarget(ChooserTargetInfo chooserTargetInfo) {
// Avoid inserting any potentially late results
if (mServiceTargets.size() == 1
&& mServiceTargets.get(0) instanceof EmptyTargetInfo) {
return;
return false;
}
final float newScore = chooserTargetInfo.getModifiedScore();
for (int i = 0, N = mServiceTargets.size(); i < N; i++) {
int currentSize = mServiceTargets.size();
for (int i = 0; i < Math.min(currentSize, MAX_SERVICE_TARGETS); i++) {
final ChooserTargetInfo serviceTarget = mServiceTargets.get(i);
if (serviceTarget == null) {
mServiceTargets.set(i, chooserTargetInfo);
return;
return true;
} else if (newScore > serviceTarget.getModifiedScore()) {
mServiceTargets.add(i, chooserTargetInfo);
return;
return true;
}
}
mServiceTargets.add(chooserTargetInfo);
if (currentSize < MAX_SERVICE_TARGETS) {
mServiceTargets.add(chooserTargetInfo);
return true;
}
return false;
}
}