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

Commit e3b47105 authored by Kang Li's avatar Kang Li
Browse files

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

Bug: 72458997
Test: manually reproduced error and verified that it is fixed with this
code change on a Taimen.

Change-Id: I03ddbc8a1b3cfb6f720413248cc5813458d35851
parent bca6e66c
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;
        }
    }
}