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

Commit db193ed7 authored by Guojing Yuan's avatar Guojing Yuan
Browse files

[CDM] Add a lock for package callbacks

This is to resolve race condition that CDM receives the same callback
twice, which causes the second callback couldn't find associations.

Fix: 420760732
Test: CTS
Flag: EXEMPT bugfix
Change-Id: I03c6f3a1c55a76544ad0b1697ad4f43f208a4c63
parent edef3e0f
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -137,6 +137,8 @@ public class CompanionDeviceManagerService extends SystemService {
    private final DisassociationProcessor mDisassociationProcessor;
    private final CrossDeviceSyncController mCrossDeviceSyncController;

    private final Object mPackageLock = new Object();

    public CompanionDeviceManagerService(Context context) {
        super(context);

@@ -784,23 +786,31 @@ public class CompanionDeviceManagerService extends SystemService {
    private final PackageMonitor mPackageMonitor = new PackageMonitor() {
        @Override
        public void onPackageRemoved(String packageName, int uid) {
            synchronized (mPackageLock) {
                onPackageRemoveOrDataClearedInternal(getChangingUserId(), packageName);
            }
        }

        @Override
        public void onPackageDataCleared(String packageName, int uid) {
            synchronized (mPackageLock) {
                onPackageRemoveOrDataClearedInternal(getChangingUserId(), packageName);
            }
        }

        @Override
        public void onPackageModified(@NonNull String packageName) {
            synchronized (mPackageLock) {
                onPackageModifiedInternal(getChangingUserId(), packageName);
            }
        }

        @Override
        public void onPackageAdded(String packageName, int uid) {
            synchronized (mPackageLock) {
                onPackageAddedInternal(getChangingUserId(), packageName);
            }
        }
    };

    private class LocalService implements CompanionDeviceManagerServiceInternal {