Merge "Default to RankerResolver if AppPredictor is disabled" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
2f8f43514f
@@ -43,7 +43,7 @@ abstract class AbstractResolverComparator implements Comparator<ResolvedComponen
|
||||
private static final boolean DEBUG = false;
|
||||
private static final String TAG = "AbstractResolverComp";
|
||||
|
||||
private AfterCompute mAfterCompute;
|
||||
protected AfterCompute mAfterCompute;
|
||||
protected final PackageManager mPm;
|
||||
protected final UsageStatsManager mUsm;
|
||||
protected String[] mAnnotations;
|
||||
@@ -70,11 +70,7 @@ abstract class AbstractResolverComparator implements Comparator<ResolvedComponen
|
||||
Log.d(TAG, "RANKER_SERVICE_RESULT");
|
||||
}
|
||||
if (mHandler.hasMessages(RANKER_RESULT_TIMEOUT)) {
|
||||
if (msg.obj != null) {
|
||||
handleResultMessage(msg);
|
||||
} else {
|
||||
Log.e(TAG, "Receiving null prediction results.");
|
||||
}
|
||||
handleResultMessage(msg);
|
||||
mHandler.removeMessages(RANKER_RESULT_TIMEOUT);
|
||||
afterCompute();
|
||||
}
|
||||
@@ -99,7 +95,6 @@ abstract class AbstractResolverComparator implements Comparator<ResolvedComponen
|
||||
mHttp = "http".equals(scheme) || "https".equals(scheme);
|
||||
mContentType = intent.getType();
|
||||
getContentAnnotations(intent);
|
||||
|
||||
mPm = context.getPackageManager();
|
||||
mUsm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
|
||||
mDefaultBrowserPackageName = mHttp
|
||||
|
||||
@@ -26,9 +26,10 @@ import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.os.UserHandle;
|
||||
import android.view.textclassifier.Log;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
|
||||
|
||||
@@ -38,27 +39,44 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Uses an {@link AppPredictor} to sort Resolver targets.
|
||||
* Uses an {@link AppPredictor} to sort Resolver targets. If the AppPredictionService appears to be
|
||||
* disabled by returning an empty sorted target list, {@link AppPredictionServiceResolverComparator}
|
||||
* will fallback to using a {@link ResolverRankerServiceResolverComparator}.
|
||||
*/
|
||||
class AppPredictionServiceResolverComparator extends AbstractResolverComparator {
|
||||
|
||||
private static final String TAG = "APSResolverComparator";
|
||||
private static final long DELAY_COMPUTE_WHEN_DEFAULTING_TO_RESOLVER_MILLIS = 200;
|
||||
|
||||
private final AppPredictor mAppPredictor;
|
||||
private final Context mContext;
|
||||
private final Map<ComponentName, Integer> mTargetRanks = new HashMap<>();
|
||||
private final UserHandle mUser;
|
||||
private final Intent mIntent;
|
||||
private final String mReferrerPackage;
|
||||
// If this is non-null (and this is not destroyed), it means APS is disabled and we should fall
|
||||
// back to using the ResolverRankerService.
|
||||
private ResolverRankerServiceResolverComparator mResolverRankerService;
|
||||
|
||||
AppPredictionServiceResolverComparator(
|
||||
Context context, Intent intent, AppPredictor appPredictor, UserHandle user) {
|
||||
Context context,
|
||||
Intent intent,
|
||||
String referrerPackage,
|
||||
AppPredictor appPredictor,
|
||||
UserHandle user) {
|
||||
super(context, intent);
|
||||
mContext = context;
|
||||
mIntent = intent;
|
||||
mAppPredictor = appPredictor;
|
||||
mUser = user;
|
||||
mReferrerPackage = referrerPackage;
|
||||
}
|
||||
|
||||
@Override
|
||||
int compare(ResolveInfo lhs, ResolveInfo rhs) {
|
||||
if (mResolverRankerService != null) {
|
||||
return mResolverRankerService.compare(lhs, rhs);
|
||||
}
|
||||
Integer lhsRank = mTargetRanks.get(new ComponentName(lhs.activityInfo.packageName,
|
||||
lhs.activityInfo.name));
|
||||
Integer rhsRank = mTargetRanks.get(new ComponentName(rhs.activityInfo.packageName,
|
||||
@@ -75,6 +93,10 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
|
||||
|
||||
@Override
|
||||
void doCompute(List<ResolvedComponentInfo> targets) {
|
||||
if (targets.isEmpty()) {
|
||||
mHandler.sendEmptyMessage(RANKER_SERVICE_RESULT);
|
||||
return;
|
||||
}
|
||||
List<AppTarget> appTargets = new ArrayList<>();
|
||||
for (ResolvedComponentInfo target : targets) {
|
||||
appTargets.add(new AppTarget.Builder(new AppTargetId(target.name.flattenToString()))
|
||||
@@ -83,25 +105,48 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
|
||||
}
|
||||
mAppPredictor.sortTargets(appTargets, mContext.getMainExecutor(),
|
||||
sortedAppTargets -> {
|
||||
Message msg =
|
||||
if (sortedAppTargets.isEmpty()) {
|
||||
// APS for chooser is disabled. Fallback to resolver.
|
||||
mResolverRankerService =
|
||||
new ResolverRankerServiceResolverComparator(
|
||||
mContext, mIntent, mReferrerPackage,
|
||||
() -> mHandler.sendEmptyMessage(RANKER_SERVICE_RESULT));
|
||||
mResolverRankerService.initRanker(mContext);
|
||||
Handler computeHandler =
|
||||
new Handler(msg -> {
|
||||
mResolverRankerService.compute(targets);
|
||||
return true;
|
||||
});
|
||||
computeHandler.sendEmptyMessageDelayed(
|
||||
0, DELAY_COMPUTE_WHEN_DEFAULTING_TO_RESOLVER_MILLIS);
|
||||
} else {
|
||||
Message msg =
|
||||
Message.obtain(mHandler, RANKER_SERVICE_RESULT, sortedAppTargets);
|
||||
msg.sendToTarget();
|
||||
});
|
||||
msg.sendToTarget();
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
void handleResultMessage(Message msg) {
|
||||
if (msg.what == RANKER_SERVICE_RESULT) {
|
||||
// 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;
|
||||
for (int i = 0; i < sortedAppTargets.size(); i++) {
|
||||
mTargetRanks.put(new ComponentName(sortedAppTargets.get(i).getPackageName(),
|
||||
sortedAppTargets.get(i).getClassName()), i);
|
||||
}
|
||||
} else if (msg.obj == null && mResolverRankerService == null) {
|
||||
Log.e(TAG, "Unexpected null result");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
float getScore(ComponentName name) {
|
||||
if (mResolverRankerService != null) {
|
||||
return mResolverRankerService.getScore(name);
|
||||
}
|
||||
Integer rank = mTargetRanks.get(name);
|
||||
if (rank == null) {
|
||||
Log.w(TAG, "Score requested for unknown component.");
|
||||
@@ -113,6 +158,10 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
|
||||
|
||||
@Override
|
||||
void updateModel(ComponentName componentName) {
|
||||
if (mResolverRankerService != null) {
|
||||
mResolverRankerService.updateModel(componentName);
|
||||
return;
|
||||
}
|
||||
mAppPredictor.notifyAppTargetEvent(
|
||||
new AppTargetEvent.Builder(
|
||||
new AppTarget.Builder(
|
||||
@@ -121,4 +170,12 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
|
||||
.setClassName(componentName.getClassName()).build(),
|
||||
ACTION_LAUNCH).build());
|
||||
}
|
||||
|
||||
@Override
|
||||
void destroy() {
|
||||
if (mResolverRankerService != null) {
|
||||
mResolverRankerService.destroy();
|
||||
mResolverRankerService = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -453,6 +453,11 @@ public class ChooserActivity extends ResolverActivity {
|
||||
if (mChooserListAdapter == null) {
|
||||
return;
|
||||
}
|
||||
if (resultList.isEmpty()) {
|
||||
// APS may be disabled, so try querying targets ourselves.
|
||||
queryDirectShareTargets(mChooserListAdapter, true);
|
||||
return;
|
||||
}
|
||||
final List<DisplayResolveInfo> driList =
|
||||
getDisplayResolveInfos(mChooserListAdapter);
|
||||
final List<ShortcutManager.ShareShortcutInfo> shareShortcutInfos =
|
||||
@@ -1274,11 +1279,14 @@ public class ChooserActivity extends ResolverActivity {
|
||||
return driList;
|
||||
}
|
||||
|
||||
private void queryDirectShareTargets(ChooserListAdapter adapter) {
|
||||
AppPredictor appPredictor = getAppPredictorForDirectShareIfEnabled();
|
||||
if (appPredictor != null) {
|
||||
appPredictor.requestPredictionUpdate();
|
||||
return;
|
||||
private void queryDirectShareTargets(
|
||||
ChooserListAdapter adapter, boolean skipAppPredictionService) {
|
||||
if (!skipAppPredictionService) {
|
||||
AppPredictor appPredictor = getAppPredictorForDirectShareIfEnabled();
|
||||
if (appPredictor != null) {
|
||||
appPredictor.requestPredictionUpdate();
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Default to just querying ShortcutManager if AppPredictor not present.
|
||||
final IntentFilter filter = getTargetIntentFilter();
|
||||
@@ -1611,7 +1619,7 @@ public class ChooserActivity extends ResolverActivity {
|
||||
AbstractResolverComparator resolverComparator;
|
||||
if (appPredictor != null) {
|
||||
resolverComparator = new AppPredictionServiceResolverComparator(this, getTargetIntent(),
|
||||
appPredictor, getUser());
|
||||
getReferrerPackageName(), appPredictor, getUser());
|
||||
} else {
|
||||
resolverComparator =
|
||||
new ResolverRankerServiceResolverComparator(this, getTargetIntent(),
|
||||
@@ -2207,7 +2215,7 @@ public class ChooserActivity extends ResolverActivity {
|
||||
Log.d(TAG, "querying direct share targets from ShortcutManager");
|
||||
}
|
||||
|
||||
queryDirectShareTargets(this);
|
||||
queryDirectShareTargets(this, false);
|
||||
}
|
||||
if (USE_CHOOSER_TARGET_SERVICE_FOR_DIRECT_TARGETS) {
|
||||
if (DEBUG) {
|
||||
|
||||
@@ -66,9 +66,6 @@ class ResolverRankerServiceResolverComparator extends AbstractResolverComparator
|
||||
|
||||
// timeout for establishing connections with a ResolverRankerService.
|
||||
private static final int CONNECTION_COST_TIMEOUT_MILLIS = 200;
|
||||
// timeout for establishing connections with a ResolverRankerService, collecting features and
|
||||
// predicting ranking scores.
|
||||
private static final int WATCHDOG_TIMEOUT_MILLIS = 500;
|
||||
|
||||
private final Collator mCollator;
|
||||
private final Map<String, UsageStats> mStats;
|
||||
@@ -106,6 +103,10 @@ class ResolverRankerServiceResolverComparator extends AbstractResolverComparator
|
||||
if (msg.what != RANKER_SERVICE_RESULT) {
|
||||
return;
|
||||
}
|
||||
if (msg.obj == null) {
|
||||
Log.e(TAG, "Receiving null prediction results.");
|
||||
return;
|
||||
}
|
||||
final List<ResolverTarget> receivedTargets = (List<ResolverTarget>) msg.obj;
|
||||
if (receivedTargets != null && mTargets != null
|
||||
&& receivedTargets.size() == mTargets.size()) {
|
||||
@@ -314,7 +315,7 @@ class ResolverRankerServiceResolverComparator extends AbstractResolverComparator
|
||||
}
|
||||
|
||||
// connect to a ranking service.
|
||||
private void initRanker(Context context) {
|
||||
void initRanker(Context context) {
|
||||
synchronized (mLock) {
|
||||
if (mConnection != null && mRanker != null) {
|
||||
if (DEBUG) {
|
||||
|
||||
Reference in New Issue
Block a user