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

Commit 2f8f4351 authored by George Hodulik's avatar George Hodulik Committed by Android (Google) Code Review
Browse files

Merge "Default to RankerResolver if AppPredictor is disabled" into qt-dev

parents 9f590ef1 3f399f2b
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -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.");
                        }
                        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
+64 −7
Original line number Diff line number Diff line
@@ -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 -> {
                    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();
                });
                    }
                }
        );
    }

    @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;
        }
    }
}
+15 −7
Original line number Diff line number Diff line
@@ -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,12 +1279,15 @@ public class ChooserActivity extends ResolverActivity {
        return driList;
    }

    private void queryDirectShareTargets(ChooserListAdapter adapter) {
    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();
        if (filter == null) {
@@ -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) {
+5 −4
Original line number Diff line number Diff line
@@ -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) {