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

Commit 6afa4f29 authored by Kang Li's avatar Kang Li
Browse files

Dedupes ranked apps in sharing windows, and reuses computed scores

in sorting for ResolverActivity.

bug: 63109049

Test: tested on a Pixel XL and a 6P to verify that it worked as expected.

Change-Id: I04ff45c3e15cbffb015568772b9b804e08f11aa4
parent 58d47a6f
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -1681,7 +1681,14 @@ public class ResolverActivity extends Activity {
        // We assume that at this point we've already filtered out the only intent for a different
        // targetUserId which we're going to use.
        private void addResolveInfo(DisplayResolveInfo dri) {
            if (dri.mResolveInfo.targetUserId == UserHandle.USER_CURRENT) {
            if (dri != null && dri.mResolveInfo != null
                    && dri.mResolveInfo.targetUserId == UserHandle.USER_CURRENT) {
                // Checks if this info is already listed in display.
                for (DisplayResolveInfo existingInfo : mDisplayList) {
                    if (resolveInfoMatch(dri.mResolveInfo, existingInfo.mResolveInfo)) {
                        return;
                    }
                }
                mDisplayList.add(dri);
            }
        }
+3 −1
Original line number Diff line number Diff line
@@ -553,8 +553,10 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
                Log.e(TAG, "Error in Predict: " + e);
            }
        }
        if (mAfterCompute != null) {
            mAfterCompute.afterCompute();
        }
    }

    // adds select prob as the default values, according to a pre-trained Logistic Regression model.
    private void addDefaultSelectProbability(ResolverTarget target) {
+48 −26
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.RemoteException;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;

import java.lang.InterruptedException;
@@ -55,7 +56,11 @@ public class ResolverListController {
    private static final String TAG = "ResolverListController";
    private static final boolean DEBUG = false;

    Object mLock = new Object();

    @GuardedBy("mLock")
    private ResolverComparator mResolverComparator;
    private boolean isComputed = false;

    public ResolverListController(
            Context context,
@@ -68,6 +73,10 @@ public class ResolverListController {
        mLaunchedFromUid = launchedFromUid;
        mTargetIntent = targetIntent;
        mReferrerPackage = referrerPackage;
        synchronized (mLock) {
            mResolverComparator =
                    new ResolverComparator(mContext, mTargetIntent, mReferrerPackage, null);
        }
    }

    @VisibleForTesting
@@ -232,18 +241,21 @@ public class ResolverListController {
    @VisibleForTesting
    @WorkerThread
    public void sort(List<ResolverActivity.ResolvedComponentInfo> inputList) {
        synchronized (mLock) {
            if (mResolverComparator == null) {
                Log.d(TAG, "Comparator has already been destroyed; skipped.");
                return;
            }
            final CountDownLatch finishComputeSignal = new CountDownLatch(1);
            ComputeCallback callback = new ComputeCallback(finishComputeSignal);
        if (mResolverComparator == null) {
            mResolverComparator =
                    new ResolverComparator(mContext, mTargetIntent, mReferrerPackage, callback);
        } else {
            mResolverComparator.setCallBack(callback);
        }
            try {
                long beforeRank = System.currentTimeMillis();
                if (!isComputed) {
                    mResolverComparator.compute(inputList);
                    finishComputeSignal.await();
                    isComputed = true;
                }
                Collections.sort(inputList, mResolverComparator);
                long afterRank = System.currentTimeMillis();
                if (DEBUG) {
@@ -253,6 +265,7 @@ public class ResolverListController {
                Log.e(TAG, "Compute & Sort was interrupted: " + e);
            }
        }
    }

    private static boolean isSameResolvedComponent(ResolveInfo a,
            ResolverActivity.ResolvedComponentInfo b) {
@@ -271,27 +284,36 @@ public class ResolverListController {

    @VisibleForTesting
    public float getScore(ResolverActivity.DisplayResolveInfo target) {
        synchronized (mLock) {
            if (mResolverComparator == null) {
                return 0.0f;
            }
            return mResolverComparator.getScore(target.getResolvedComponentName());
        }
    }

    public void updateModel(ComponentName componentName) {
        synchronized (mLock) {
            if (mResolverComparator != null) {
                mResolverComparator.updateModel(componentName);
            }
        }
    }

    public void updateChooserCounts(String packageName, int userId, String action) {
        synchronized (mLock) {
            if (mResolverComparator != null) {
                mResolverComparator.updateChooserCounts(packageName, userId, action);
            }
        }
    }

    public void destroy() {
        synchronized (mLock) {
            if (mResolverComparator != null) {
                mResolverComparator.destroy();
            }
            mResolverComparator = null;
        }
    }
}