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

Commit fe5a3e50 authored by Cliff Wu's avatar Cliff Wu
Browse files

Add a lock to protect mRunningUids in GenericWindowPolicyController

- Open the camera on the virtual display and immediately use
  CameraAccessController's isAppRunningOnAnyVirtualDevice to judge, it
  may cause race conditions in onRunningAppsChanged() and containsUid(),
  making the result incorrect.

Bug: 218400882
Test: Manual
Change-Id: I61fc436da96b007614db2c8f0a10cf060462138c
parent 79401519
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.util.Slog;
import android.view.Display;
import android.window.DisplayWindowPolicyController;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.BlockedAppStreamingActivity;

import java.util.List;
@@ -75,9 +76,11 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
    private final ArraySet<ComponentName> mAllowedActivities;
    @Nullable
    private final ArraySet<ComponentName> mBlockedActivities;
    private final Object mGenericWindowPolicyControllerLock = new Object();
    private Consumer<ActivityInfo> mActivityBlockedCallback;

    @NonNull
    @GuardedBy("mGenericWindowPolicyControllerLock")
    final ArraySet<Integer> mRunningUids = new ArraySet<>();
    @Nullable private final ActivityListener mActivityListener;
    private final Handler mHandler = new Handler(Looper.getMainLooper());
@@ -149,12 +152,14 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController

    @Override
    public void onRunningAppsChanged(ArraySet<Integer> runningUids) {
        synchronized (mGenericWindowPolicyControllerLock) {
            mRunningUids.clear();
            mRunningUids.addAll(runningUids);
            if (mActivityListener != null && mRunningUids.isEmpty()) {
                // Post callback on the main thread so it doesn't block activity launching
                mHandler.post(() -> mActivityListener.onDisplayEmpty(Display.INVALID_DISPLAY));
            }
        }
        if (mRunningAppsChangedListener != null) {
            mRunningAppsChangedListener.onRunningAppsChanged(runningUids);
        }
@@ -165,8 +170,10 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController
     * this controller.
     */
    boolean containsUid(int uid) {
        synchronized (mGenericWindowPolicyControllerLock) {
            return mRunningUids.contains(uid);
        }
    }

    private boolean canContainActivity(ActivityInfo activityInfo, int windowFlags,
            int systemWindowFlags) {