Loading core/java/android/window/DisplayWindowPolicyController.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +22 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } /** Loading Loading @@ -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; Loading Loading @@ -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)); } } Loading @@ -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()) { Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +27 −17 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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") Loading Loading @@ -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); } } } Loading services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +5 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 = Loading Loading @@ -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); Loading @@ -315,7 +316,7 @@ public class VirtualDeviceManagerService extends SystemService { }); if (mComputerControlSessionProcessor.isComputerControlSession(deviceId)) { mAutomatedPackagesRepository.update(deviceId, deviceOwnerPackageName, runningUids); mAutomatedPackagesRepository.update(deviceId, deviceOwnerPackageName, uidPackagePairs); } } Loading services/companion/java/com/android/server/companion/virtual/computercontrol/AutomatedPackagesRepository.java +18 −21 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading @@ -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<>(); Loading @@ -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; } Loading @@ -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. Loading Loading @@ -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 Loading
core/java/android/window/DisplayWindowPolicyController.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading
services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +22 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } /** Loading Loading @@ -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; Loading Loading @@ -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)); } } Loading @@ -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()) { Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +27 −17 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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") Loading Loading @@ -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); } } } Loading
services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +5 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 = Loading Loading @@ -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); Loading @@ -315,7 +316,7 @@ public class VirtualDeviceManagerService extends SystemService { }); if (mComputerControlSessionProcessor.isComputerControlSession(deviceId)) { mAutomatedPackagesRepository.update(deviceId, deviceOwnerPackageName, runningUids); mAutomatedPackagesRepository.update(deviceId, deviceOwnerPackageName, uidPackagePairs); } } Loading
services/companion/java/com/android/server/companion/virtual/computercontrol/AutomatedPackagesRepository.java +18 −21 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading @@ -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<>(); Loading @@ -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; } Loading @@ -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. Loading Loading @@ -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