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

Commit 830e3b2c authored by George Hodulik's avatar George Hodulik Committed by android-build-merger
Browse files

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

am: 2f8f4351

Change-Id: Ic934eef2b873b1d317ee1c42e1948093d0523342
parents e82f16f8 2f8f4351
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) {