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

Commit e9f70acf authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix timeouts caused by destroy() waiting for the same lock on sort."

parents f93ae682 e3b47105
Loading
Loading
Loading
Loading
+25 −50
Original line number Diff line number Diff line
@@ -56,9 +56,6 @@ 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;

@@ -73,11 +70,9 @@ public class ResolverListController {
        mLaunchedFromUid = launchedFromUid;
        mTargetIntent = targetIntent;
        mReferrerPackage = referrerPackage;
        synchronized (mLock) {
        mResolverComparator =
                new ResolverComparator(mContext, mTargetIntent, mReferrerPackage, null);
    }
    }

    @VisibleForTesting
    public ResolveInfo getLastChosen() throws RemoteException {
@@ -244,17 +239,16 @@ 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);
            mResolverComparator.setCallBack(callback);
        try {
            long beforeRank = System.currentTimeMillis();
            if (!isComputed) {
                final CountDownLatch finishComputeSignal = new CountDownLatch(1);
                ComputeCallback callback = new ComputeCallback(finishComputeSignal);
                mResolverComparator.setCallBack(callback);
                mResolverComparator.compute(inputList);
                finishComputeSignal.await();
                isComputed = true;
@@ -268,7 +262,6 @@ public class ResolverListController {
            Log.e(TAG, "Compute & Sort was interrupted: " + e);
        }
    }
    }

    private static boolean isSameResolvedComponent(ResolveInfo a,
            ResolverActivity.ResolvedComponentInfo b) {
@@ -287,36 +280,18 @@ 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;
        }
    }
}