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

Commit abbf6d1e authored by Vladimir Komsiyski's avatar Vladimir Komsiyski Committed by Android (Google) Code Review
Browse files

Merge "Pass package name along with the UID to DWPC" into main

parents d679a5ee 03379916
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ActivityInfo;
import android.util.ArraySet;
import android.util.Pair;

import java.io.PrintWriter;
import java.util.List;
@@ -178,8 +179,11 @@ public abstract class DisplayWindowPolicyController {
     * This is called when the apps that contains running activities on the display has changed.
     * The running activities refer to the non-finishing activities regardless of they are running
     * in a process.
     *
     * @param uidPackagePairs Set of pairs of UID and package name corresponding to all activities
     *   currently present on the display.
     */
    public void onRunningAppsChanged(ArraySet<Integer> runningUids) {}
    public void onRunningAppsChanged(ArraySet<Pair<Integer, String>> uidPackagePairs) {}

    /**
     * This is called when an Activity is entering PIP.
+22 −9
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
import android.util.ArraySet;
import android.util.Pair;
import android.util.Slog;
import android.view.Display;
import android.window.DisplayWindowPolicyController;
@@ -85,8 +86,14 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
        /** Returns true when an intent should be intercepted */
        boolean shouldInterceptIntent(@NonNull Intent intent);

        /** Called when the set of running apps on this display changes. */
        void onRunningAppsChanged(int displayId, @NonNull ArraySet<Integer> runningUids);
        /**
         * Called when the set of running apps on this display changes.
         *
         * @param uidPackagePairs Set of pairs of UID and package name corresponding to all
         *   activities currently present on the display.
         */
        void onRunningAppsChanged(int displayId,
                @NonNull ArraySet<Pair<Integer, String>> uidPackagePairs);
    }

    /**
@@ -126,7 +133,7 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {

    @NonNull
    @GuardedBy("mGenericWindowPolicyControllerLock")
    private final ArraySet<Integer> mRunningUids = new ArraySet<>();
    private final ArraySet<Pair<Integer, String>> mRunningUidPackagePairs = new ArraySet<>();
    @NonNull private final ActivityListener mActivityListener;
    private final Handler mHandler = new Handler(Looper.getMainLooper());
    @NonNull private final Set<String> mDisplayCategories;
@@ -392,16 +399,17 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
    }

    @Override
    public void onRunningAppsChanged(ArraySet<Integer> runningUids) {
    public void onRunningAppsChanged(ArraySet<Pair<Integer, String>> uidPackagePairs) {
        synchronized (mGenericWindowPolicyControllerLock) {
            mRunningUids.clear();
            mRunningUids.addAll(runningUids);
            mRunningUidPackagePairs.clear();
            mRunningUidPackagePairs.addAll(uidPackagePairs);
            int displayId = waitAndGetDisplayId();
            if (displayId == INVALID_DISPLAY) {
                return;
            }
            mHandler.post(() -> mActivityListener.onRunningAppsChanged(displayId, runningUids));
            if (mRunningUids.isEmpty()) {
            mHandler.post(() ->
                    mActivityListener.onRunningAppsChanged(displayId, uidPackagePairs));
            if (mRunningUidPackagePairs.isEmpty()) {
                mHandler.post(() -> mActivityListener.onDisplayEmpty(displayId));
            }
        }
@@ -424,9 +432,14 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
     */
    boolean containsUid(int uid) {
        synchronized (mGenericWindowPolicyControllerLock) {
            return mRunningUids.contains(uid);
            for (int i = 0; i < mRunningUidPackagePairs.size(); ++i) {
                if (mRunningUidPackagePairs.valueAt(i).first == uid) {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean activityMatchesDisplayCategory(ActivityInfo activityInfo) {
        if (mDisplayCategories.isEmpty()) {
+27 −17
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ import android.os.UserManager;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.IntArray;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -216,11 +217,12 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub implements IBinder.Dea
    @GuardedBy("mIntentInterceptors")
    private final Map<IBinder, IntentFilter> mIntentInterceptors = new ArrayMap<>();

    // Mapping from displayId to all UIDs running on that display.
    // Mapping from displayId to all UID+PackageName running on that display.
    @GuardedBy("mVirtualDeviceLock")
    private final SparseArray<ArraySet<Integer>> mRunningUids = new SparseArray<>();
    private final SparseArray<ArraySet<Pair<Integer, String>>> mRunningUidPackagePairsPerDisplay =
            new SparseArray<>();
    @GuardedBy("mVirtualDeviceLock")
    private ArraySet<Integer> mAllRunningUids = new ArraySet<>();
    private ArraySet<Pair<Integer, String>> mAllRunningUidPackagePairs = new ArraySet<>();

    // The default setting for showing the pointer on new displays.
    @GuardedBy("mVirtualDeviceLock")
@@ -381,34 +383,42 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub implements IBinder.Dea

        @SuppressWarnings("AndroidFrameworkRequiresPermission")
        @Override
        public void onRunningAppsChanged(int displayId, @NonNull ArraySet<Integer> runningUids) {
            final ArraySet<Integer> newAllUids;
        public void onRunningAppsChanged(int displayId,
                @NonNull ArraySet<Pair<Integer, String>> uidPackagePairs) {
            final ArraySet<Pair<Integer, String>> newAllRunningUidPackagePairs;
            synchronized (mVirtualDeviceLock) {
                if (Objects.equals(runningUids, mRunningUids.get(displayId))) {
                if (Objects.equals(uidPackagePairs,
                        mRunningUidPackagePairsPerDisplay.get(displayId))) {
                    return;
                }
                if (runningUids.isEmpty()) {
                    mRunningUids.remove(displayId);
                if (uidPackagePairs.isEmpty()) {
                    mRunningUidPackagePairsPerDisplay.remove(displayId);
                } else {
                    mRunningUids.put(displayId, runningUids);
                    mRunningUidPackagePairsPerDisplay.put(displayId, uidPackagePairs);
                }

                newAllUids = new ArraySet<>();
                for (int i = 0; i < mRunningUids.size(); i++) {
                    newAllUids.addAll(mRunningUids.valueAt(i));
                newAllRunningUidPackagePairs = new ArraySet<>();
                for (int i = 0; i < mRunningUidPackagePairsPerDisplay.size(); i++) {
                    newAllRunningUidPackagePairs.addAll(
                            mRunningUidPackagePairsPerDisplay.valueAt(i));
                }
                if (newAllUids.equals(mAllRunningUids)) {
                if (newAllRunningUidPackagePairs.equals(mAllRunningUidPackagePairs)) {
                    return;
                }
                mAllRunningUids = newAllUids;
                mAllRunningUidPackagePairs = newAllRunningUidPackagePairs;
            }

            mService.onRunningAppsChanged(mDeviceId, mOwnerPackageName, newAllUids);
            final ArraySet<Integer> runningUids = new ArraySet<>();
            for (int i = 0; i < newAllRunningUidPackagePairs.size(); i++) {
                runningUids.add(newAllRunningUidPackagePairs.valueAt(i).first);
            }
            mService.onRunningAppsChanged(
                    mDeviceId, mOwnerPackageName, runningUids, newAllRunningUidPackagePairs);
            if (mVirtualAudioController != null) {
                mVirtualAudioController.onRunningAppsChanged(newAllUids);
                mVirtualAudioController.onRunningAppsChanged(runningUids);
            }
            if (mCameraAccessController != null) {
                mCameraAccessController.blockCameraAccessIfNeeded(newAllUids);
                mCameraAccessController.blockCameraAccessIfNeeded(runningUids);
            }
        }
    }
+5 −4
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.ExceptionUtils;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
@@ -195,8 +196,7 @@ public class VirtualDeviceManagerService extends SystemService {
        mLocalService = new LocalService();
        mComputerControlSessionProcessor =
                new ComputerControlSessionProcessor(context, mImpl::createLocalVirtualDevice);
        mAutomatedPackagesRepository =
                new AutomatedPackagesRepository(context.getPackageManager(), mHandler);
        mAutomatedPackagesRepository = new AutomatedPackagesRepository(mHandler);
    }

    private final ActivityInterceptorCallback mActivityInterceptorCallback =
@@ -303,7 +303,8 @@ public class VirtualDeviceManagerService extends SystemService {

    @VisibleForTesting
    void onRunningAppsChanged(int deviceId, @NonNull String deviceOwnerPackageName,
            @NonNull ArraySet<Integer> runningUids) {
            @NonNull ArraySet<Integer> runningUids,
            @NonNull ArraySet<Pair<Integer, String>> uidPackagePairs) {
        final List<VirtualDeviceManagerInternal.AppsOnVirtualDeviceListener> listeners;
        synchronized (mVirtualDeviceManagerLock) {
            listeners = List.copyOf(mAppsOnVirtualDeviceListeners);
@@ -315,7 +316,7 @@ public class VirtualDeviceManagerService extends SystemService {
        });

        if (mComputerControlSessionProcessor.isComputerControlSession(deviceId)) {
            mAutomatedPackagesRepository.update(deviceId, deviceOwnerPackageName, runningUids);
            mAutomatedPackagesRepository.update(deviceId, deviceOwnerPackageName, uidPackagePairs);
        }
    }

+18 −21
Original line number Diff line number Diff line
@@ -17,20 +17,19 @@
package com.android.server.companion.virtual.computercontrol;

import android.companion.virtual.computercontrol.IAutomatedPackageListener;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -40,7 +39,6 @@ public class AutomatedPackagesRepository {

    private static final String TAG = AutomatedPackagesRepository.class.getSimpleName();

    private final PackageManager mPackageManager;
    private final Handler mHandler;

    private final Object mLock = new Object();
@@ -54,7 +52,7 @@ public class AutomatedPackagesRepository {
    @GuardedBy("mLock")
    final ArrayMap<String, SparseArray<ArraySet<String>>> mAutomatedPackages = new ArrayMap<>();

    // Full mapping of deviceId -> userID -> packageNames running on that device.
    // Full mapping of deviceId -> userId -> packageNames running on that device.
    // We need the deviceId for correctness, as there may be multiple devices with the same owner.
    @GuardedBy("mLock")
    final SparseArray<SparseArray<ArraySet<String>>> mDevicePackages = new SparseArray<>();
@@ -63,8 +61,7 @@ public class AutomatedPackagesRepository {
    @GuardedBy("mLock")
    final SparseArray<String> mDeviceOwnerPackageNames = new SparseArray<>();

    public AutomatedPackagesRepository(PackageManager packageManager, Handler handler) {
        mPackageManager = packageManager;
    public AutomatedPackagesRepository(Handler handler) {
        mHandler = handler;
    }

@@ -83,20 +80,21 @@ public class AutomatedPackagesRepository {
    }

    /** Update the list of packages running on a device. */
    public void update(int deviceId, String deviceOwnerPackageName, ArraySet<Integer> runningUids) {
    public void update(int deviceId, String deviceOwnerPackageName,
            ArraySet<Pair<Integer, String>> runningPackageUids) {
        synchronized (mLock) {
            updateLocked(deviceId, deviceOwnerPackageName, runningUids);
            updateLocked(deviceId, deviceOwnerPackageName, runningPackageUids);
        }
    }

    private void updateLocked(
            int deviceId, String deviceOwnerPackageName, ArraySet<Integer> runningUids) {
        if (runningUids.isEmpty()) {
    private void updateLocked(int deviceId, String deviceOwnerPackageName,
            ArraySet<Pair<Integer, String>> uidPackagePairs) {
        if (uidPackagePairs.isEmpty()) {
            mDeviceOwnerPackageNames.remove(deviceId);
            mDevicePackages.remove(deviceId);
        } else {
            mDeviceOwnerPackageNames.put(deviceId, deviceOwnerPackageName);
            mDevicePackages.put(deviceId, mapUserIdToPackages(runningUids));
            mDevicePackages.put(deviceId, mapUserIdToPackages(uidPackagePairs));
        }

        // userId -> automatedPackages for this device owner.
@@ -161,20 +159,19 @@ public class AutomatedPackagesRepository {
        }
    }

    private SparseArray<ArraySet<String>> mapUserIdToPackages(ArraySet<Integer> runningUids) {
    private SparseArray<ArraySet<String>> mapUserIdToPackages(
            ArraySet<Pair<Integer, String>> uidPackagePairs) {
        final SparseArray<ArraySet<String>> userIdToPackages = new SparseArray<>();
        // TODO(b/442624418): replace this with reporting UID+package directly to GWPC and change
        // the set<Uid> to set<UidAndPackage> everywhere. Now there's ambiguity in the package names
        // because several packages may share a uid.
        for (int i = 0; i < runningUids.size(); ++i) {
            final int uid = runningUids.valueAt(i);
        for (int i = 0; i < uidPackagePairs.size(); ++i) {
            final Pair<Integer, String> uidAndPackage = uidPackagePairs.valueAt(i);
            final int uid = uidAndPackage.first;
            final int userId = UserHandle.getUserId(uid);
            if (!userIdToPackages.contains(userId)) {
                userIdToPackages.put(userId, new ArraySet<>());
            }
            final String[] packageNames = mPackageManager.getPackagesForUid(uid);
            if (packageNames != null) {
                userIdToPackages.get(userId).addAll(Arrays.asList(packageNames));
            final String packageName = uidAndPackage.second;
            if (packageName != null) {
                userIdToPackages.get(userId).add(packageName);
            }
        }
        return userIdToPackages;
Loading