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

Commit 00669537 authored by Himanshu Gupta's avatar Himanshu Gupta Committed by Android (Google) Code Review
Browse files

Merge "ResolverComparator changes to rank targets across profiles."

parents 08817663 411f4cb2
Loading
Loading
Loading
Loading
+35 −14
Original line number Diff line number Diff line
@@ -30,11 +30,16 @@ import android.os.UserHandle;
import android.util.Log;

import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
import com.android.internal.app.chooser.TargetInfo;

import com.google.android.collect.Lists;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Used to sort resolved activities in {@link ResolverListController}.
@@ -48,8 +53,8 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC
    private static final String TAG = "AbstractResolverComp";

    protected AfterCompute mAfterCompute;
    protected final PackageManager mPm;
    protected final UsageStatsManager mUsm;
    protected final Map<UserHandle, PackageManager> mPmMap = new HashMap<>();
    protected final Map<UserHandle, UsageStatsManager> mUsmMap = new HashMap<>();
    protected String[] mAnnotations;
    protected String mContentType;

@@ -98,14 +103,28 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC
        }
    };

    public AbstractResolverComparator(Context context, Intent intent) {
    // context here refers to the activity calling this comparator.
    // targetUserSpace refers to the userSpace in which the targets to be ranked lie.
    public AbstractResolverComparator(Context launchedFromContext, Intent intent,
            UserHandle targetUserSpace) {
        this(launchedFromContext, intent, Lists.newArrayList(targetUserSpace));
    }

    // context here refers to the activity calling this comparator.
    // targetUserSpaceList refers to the userSpace(s) in which the targets to be ranked lie.
    public AbstractResolverComparator(Context launchedFromContext, Intent intent,
            List<UserHandle> targetUserSpaceList) {
        String scheme = intent.getScheme();
        mHttp = "http".equals(scheme) || "https".equals(scheme);
        mContentType = intent.getType();
        getContentAnnotations(intent);
        mPm = context.getPackageManager();
        mUsm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
        mAzComparator = new AzInfoComparator(context);
        for (UserHandle user : targetUserSpaceList) {
            Context userContext = launchedFromContext.createContextAsUser(user, 0);
            mPmMap.put(user, userContext.getPackageManager());
            mUsmMap.put(user,
                    (UsageStatsManager) userContext.getSystemService(Context.USAGE_STATS_SERVICE));
        }
        mAzComparator = new AzInfoComparator(launchedFromContext);
    }

    // get annotations of content from intent.
@@ -208,8 +227,8 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC

    /**
     * Computes features for each target. This will be called before calls to {@link
     * #getScore(ComponentName)} or {@link #compare(Object, Object)}, in order to prepare the
     * comparator for those calls. Note that {@link #getScore(ComponentName)} uses {@link
     * #getScore(TargetInfo)} or {@link #compare(ResolveInfo, ResolveInfo)}, in order to prepare the
     * comparator for those calls. Note that {@link #getScore(TargetInfo)} uses {@link
     * ComponentName}, so the implementation will have to be prepared to identify a {@link
     * ResolvedComponentInfo} by {@link ComponentName}. {@link #beforeCompute()} will be called
     * before doing any computing.
@@ -226,7 +245,7 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC
     * Returns the score that was calculated for the corresponding {@link ResolvedComponentInfo}
     * when {@link #compute(List)} was called before this.
     */
    abstract float getScore(ComponentName name);
    abstract float getScore(TargetInfo targetInfo);

    /** Handles result message sent to mHandler. */
    abstract void handleResultMessage(Message message);
@@ -234,9 +253,11 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC
    /**
     * Reports to UsageStats what was chosen.
     */
    final void updateChooserCounts(String packageName, int userId, String action) {
        if (mUsm != null) {
            mUsm.reportChooserSelection(packageName, userId, mContentType, mAnnotations, action);
    final void updateChooserCounts(String packageName, UserHandle user, String action) {
        if (mUsmMap.containsKey(user)) {
            mUsmMap.get(user)
                    .reportChooserSelection(packageName, user.getIdentifier(), mContentType,
                            mAnnotations, action);
        }
    }

@@ -246,9 +267,9 @@ public abstract class AbstractResolverComparator implements Comparator<ResolvedC
     * <p>Default implementation does nothing, as we could have simple model that does not train
     * online.
     *
     * @param componentName the component that the user clicked
     * @param targetInfo the target that the user clicked.
     */
    void updateModel(ComponentName componentName) {
    void updateModel(TargetInfo targetInfo) {
    }

    /** Called before {@link #doCompute(List)}. Sets up 500ms timeout. */
+24 −17
Original line number Diff line number Diff line
@@ -31,6 +31,9 @@ import android.os.UserHandle;
import android.util.Log;

import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
import com.android.internal.app.chooser.TargetInfo;

import com.google.android.collect.Lists;

import java.util.ArrayList;
import java.util.Collections;
@@ -70,7 +73,7 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
            AppPredictor appPredictor,
            UserHandle user,
            ChooserActivityLogger chooserActivityLogger) {
        super(context, intent);
        super(context, intent, Lists.newArrayList(user));
        mContext = context;
        mIntent = intent;
        mAppPredictor = appPredictor;
@@ -99,13 +102,13 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
    }

    @Override
    float getScore(ComponentName name) {
        return mComparatorModel.getScore(name);
    float getScore(TargetInfo targetInfo) {
        return mComparatorModel.getScore(targetInfo);
    }

    @Override
    void updateModel(ComponentName componentName) {
        mComparatorModel.notifyOnTargetSelected(componentName);
    void updateModel(TargetInfo targetInfo) {
        mComparatorModel.notifyOnTargetSelected(targetInfo);
    }

    @Override
@@ -158,9 +161,12 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
    private void setupFallbackModel(List<ResolvedComponentInfo> targets) {
        mResolverRankerService =
                new ResolverRankerServiceResolverComparator(
                        mContext, mIntent, mReferrerPackage,
                        mContext,
                        mIntent,
                        mReferrerPackage,
                        () -> mHandler.sendEmptyMessage(RANKER_SERVICE_RESULT),
                        getChooserActivityLogger());
                        getChooserActivityLogger(),
                        mUser);
        mComparatorModel = mModelBuilder.buildFallbackModel(mResolverRankerService);
        mResolverRankerService.compute(targets);
    }
@@ -224,13 +230,13 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
                    }

                    @Override
                    public float getScore(ComponentName componentName) {
                        return comparator.getScore(componentName);
                    public float getScore(TargetInfo targetInfo) {
                        return comparator.getScore(targetInfo);
                    }

                    @Override
                    public void notifyOnTargetSelected(ComponentName componentName) {
                        comparator.updateModel(componentName);
                    public void notifyOnTargetSelected(TargetInfo targetInfo) {
                        comparator.updateModel(targetInfo);
                    }
                };
        }
@@ -271,8 +277,8 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
        }

        @Override
        public float getScore(ComponentName name) {
            Integer rank = mTargetRanks.get(name);
        public float getScore(TargetInfo targetInfo) {
            Integer rank = mTargetRanks.get(targetInfo.getResolvedComponentName());
            if (rank == null) {
                Log.w(TAG, "Score requested for unknown component. Did you call compute yet?");
                return 0f;
@@ -282,13 +288,14 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator
        }

        @Override
        public void notifyOnTargetSelected(ComponentName componentName) {
        public void notifyOnTargetSelected(TargetInfo targetInfo) {
            mAppPredictor.notifyAppTargetEvent(
                    new AppTargetEvent.Builder(
                        new AppTarget.Builder(
                            new AppTargetId(componentName.toString()),
                            componentName.getPackageName(), mUser)
                            .setClassName(componentName.getClassName()).build(),
                            new AppTargetId(targetInfo.getResolvedComponentName().toString()),
                                targetInfo.getResolvedComponentName().getPackageName(), mUser)
                            .setClassName(targetInfo.getResolvedComponentName()
                                    .getClassName()).build(),
                        ACTION_LAUNCH).build());
        }
    }
+16 −6
Original line number Diff line number Diff line
@@ -2268,9 +2268,11 @@ public class ChooserActivity extends ResolverActivity implements
                        mChooserMultiProfilePagerAdapter.getActiveListAdapter();
                if (currentListAdapter != null) {
                    sendImpressionToAppPredictor(info, currentListAdapter);
                    currentListAdapter.updateModel(info.getResolvedComponentName());
                    currentListAdapter.updateChooserCounts(ri.activityInfo.packageName,
                            targetIntent.getAction());
                    currentListAdapter.updateModel(info);
                    currentListAdapter.updateChooserCounts(
                            ri.activityInfo.packageName,
                            targetIntent.getAction(),
                            ri.userHandle);
                }
                if (DEBUG) {
                    Log.d(TAG, "ResolveInfo Package is " + ri.activityInfo.packageName);
@@ -2395,7 +2397,10 @@ public class ChooserActivity extends ResolverActivity implements
     */
    @Nullable
    private AppPredictor getAppPredictorForShareActivitiesIfEnabled(UserHandle userHandle) {
        return USE_PREDICTION_MANAGER_FOR_SHARE_ACTIVITIES ? createAppPredictor(userHandle) : null;
        // We cannot use APS service when clone profile is present as APS service cannot sort
        // cross profile targets as of now.
        return USE_PREDICTION_MANAGER_FOR_SHARE_ACTIVITIES && getCloneProfileUserHandle() == null
                ? createAppPredictor(userHandle) : null;
    }

    void onRefinementResult(TargetInfo selectedTarget, Intent matchingIntent) {
@@ -2548,8 +2553,13 @@ public class ChooserActivity extends ResolverActivity implements
                    getReferrerPackageName(), appPredictor, userHandle, getChooserActivityLogger());
        } else {
            resolverComparator =
                    new ResolverRankerServiceResolverComparator(this, getTargetIntent(),
                        getReferrerPackageName(), null, getChooserActivityLogger());
                    new ResolverRankerServiceResolverComparator(
                            this,
                            getTargetIntent(),
                            getReferrerPackageName(),
                            null,
                            getChooserActivityLogger(),
                            getResolverRankerServiceUserHandleList(userHandle));
        }

        UserHandle queryIntentsUser = getQueryIntentsUser(userHandle);
+26 −0
Original line number Diff line number Diff line
@@ -1617,6 +1617,14 @@ public class ResolverActivity extends Activity implements
    @VisibleForTesting
    protected ResolverListController createListController(UserHandle userHandle) {
        UserHandle queryIntentsUser = getQueryIntentsUser(userHandle);
        ResolverRankerServiceResolverComparator resolverComparator =
                new ResolverRankerServiceResolverComparator(
                        this,
                        getTargetIntent(),
                        getReferrerPackageName(),
                        null,
                        null,
                        getResolverRankerServiceUserHandleList(userHandle));
        return new ResolverListController(
                this,
                mPm,
@@ -1624,6 +1632,7 @@ public class ResolverActivity extends Activity implements
                getReferrerPackageName(),
                mLaunchedFromUid,
                userHandle,
                resolverComparator,
                queryIntentsUser);
    }

@@ -2534,4 +2543,21 @@ public class ResolverActivity extends Activity implements
            UserHandle predictedHandle) {
        return resolveInfo.userHandle;
    }

    /**
     * Returns the {@link List} of {@link UserHandle} to pass on to the
     * {@link ResolverRankerServiceResolverComparator} as per the provided {@code userHandle}.
     */
    protected final List<UserHandle> getResolverRankerServiceUserHandleList(UserHandle userHandle) {
        List<UserHandle> userList = new ArrayList<>();
        userList.add(userHandle);
        // Add clonedProfileUserHandle to the list only if we are:
        // a. Building the Personal Tab.
        // b. CloneProfile exists on the device.
        if (userHandle.equals(getPersonalProfileUserHandle())
                && getCloneProfileUserHandle() != null) {
            userList.add(getCloneProfileUserHandle());
        }
        return userList;
    }
}
+4 −4
Original line number Diff line number Diff line
@@ -16,11 +16,11 @@

package com.android.internal.app;

import android.content.ComponentName;
import android.content.pm.ResolveInfo;

import com.android.internal.app.chooser.TargetInfo;

import java.util.Comparator;
import java.util.List;

/**
 * A ranking model for resolver targets, providing ordering and (optionally) numerical scoring.
@@ -45,7 +45,7 @@ interface ResolverComparatorModel {
     * likelihood that the user will select that component as the target. Implementations that don't
     * assign numerical scores are <em>recommended</em> to return a value of 0 for all components.
     */
    float getScore(ComponentName name);
    float getScore(TargetInfo targetInfo);

    /**
     * Notify the model that the user selected a target. (Models may log this information, use it as
@@ -53,5 +53,5 @@ interface ResolverComparatorModel {
     * {@code ResolverComparatorModel} instance is immutable, clients will need to get an up-to-date
     * instance in order to see any changes in the ranking that might result from this feedback.
     */
    void notifyOnTargetSelected(ComponentName componentName);
    void notifyOnTargetSelected(TargetInfo targetInfo);
}
Loading