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

Commit 4bf279f0 authored by Joanne Chung's avatar Joanne Chung
Browse files

Use PackageMonitor WeakReference in PackageMonitorCallback

Bug: 309862926
Bug: 310012723
Test: manual
Test: atest PackageMonitorTest

Change-Id: Id249165d1daa66b8faab4bcf50f7257eb53e5236
parent 70ce23b0
Loading
Loading
Loading
Loading
+20 −9
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;

import java.lang.ref.WeakReference;
import java.util.Objects;
import java.util.concurrent.Executor;

@@ -63,6 +64,8 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {

    PackageMonitorCallback mPackageMonitorCallback;

    private Executor mExecutor;

    @UnsupportedAppUsage
    public PackageMonitor() {
        final boolean isCore = UserHandle.isCore(android.os.Process.myUid());
@@ -106,8 +109,8 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
        if (mPackageMonitorCallback == null) {
            PackageManager pm = mRegisteredContext.getPackageManager();
            if (pm != null) {
                mPackageMonitorCallback = new PackageMonitorCallback(this,
                        new HandlerExecutor(mRegisteredHandler));
                mExecutor = new HandlerExecutor(mRegisteredHandler);
                mPackageMonitorCallback = new PackageMonitorCallback(this);
                int userId = user != null ? user.getIdentifier() : mRegisteredContext.getUserId();
                pm.registerPackageMonitorCallback(mPackageMonitorCallback, userId);
            }
@@ -131,6 +134,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
        }
        mPackageMonitorCallback = null;
        mRegisteredContext = null;
        mExecutor = null;
    }

    public void onBeginPackageChanges() {
@@ -362,6 +366,13 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
        doHandlePackageEvent(intent);
    }


    private void postHandlePackageEvent(Intent intent) {
        if (mExecutor != null) {
            mExecutor.execute(() -> doHandlePackageEvent(intent));
        }
    }

    /**
     * Handle the package related event
     * @param intent the intent that contains package related event information
@@ -516,13 +527,10 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
    }

    private static final class PackageMonitorCallback extends IRemoteCallback.Stub {
        private final WeakReference<PackageMonitor> mMonitorWeakReference;

        private final PackageMonitor mPackageMonitor;
        private final Executor mExecutor;

        PackageMonitorCallback(PackageMonitor monitor, Executor executor) {
            mPackageMonitor = monitor;
            mExecutor = executor;
        PackageMonitorCallback(PackageMonitor monitor) {
            mMonitorWeakReference = new WeakReference<>(monitor);
        }

        @Override
@@ -537,7 +545,10 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
                Log.w(TAG, "No intent is set for PackageMonitorCallback");
                return;
            }
            mExecutor.execute(() -> mPackageMonitor.doHandlePackageEvent(intent));
            PackageMonitor monitor = mMonitorWeakReference.get();
            if (monitor != null) {
                monitor.postHandlePackageEvent(intent);
            }
        }
    }
}