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

Commit 7ea26881 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Allow companion apps to start background activities from PendingIntents...

Merge "Allow companion apps to start background activities from PendingIntents (even if they aren't foreground)"
parents 03a8c095 da34cd4f
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -163,6 +163,20 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
        publishBinderService(Context.COMPANION_DEVICE_SERVICE, mImpl);
    }

    @Override
    public void onUnlockUser(int userHandle) {
        Set<Association> associations = readAllAssociations(userHandle);
        Set<String> companionAppPackages = new HashSet<>();
        for (Association association : associations) {
            companionAppPackages.add(association.companionAppPackage);
        }
        ActivityTaskManagerInternal atmInternal = LocalServices.getService(
                ActivityTaskManagerInternal.class);
        if (atmInternal != null) {
            atmInternal.setCompanionAppPackages(userHandle, companionAppPackages);
        }
    }

    @Override
    public void binderDied() {
        Handler.getMain().post(this::cleanup);
+6 −1
Original line number Diff line number Diff line
@@ -981,6 +981,11 @@ class ActivityStarter {
            if (isRealCallingUidPersistentSystemProcess && allowBackgroundActivityStart) {
                return false;
            }
            // don't abort if the realCallingUid is an associated companion app
            if (mService.isAssociatedCompanionApp(UserHandle.getUserId(realCallingUid),
                    realCallingUid)) {
                return false;
            }
        }
        // If we don't have callerApp at this point, no caller was provided to startActivity().
        // That's the case for PendingIntent-based starts, since the creator's process might not be
@@ -1026,7 +1031,7 @@ class ActivityStarter {
        }
        // don't abort if the callingPackage has companion device
        final int callingUserId = UserHandle.getUserId(callingUid);
        if (mService.isAssociatedCompanionApp(callingUserId, callingPackage)) {
        if (mService.isAssociatedCompanionApp(callingUserId, callingUid)) {
            return false;
        }
        // don't abort if the callingPackage is temporarily whitelisted
+13 −10
Original line number Diff line number Diff line
@@ -443,8 +443,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
    // VoiceInteractionManagerService
    ComponentName mActiveVoiceInteractionServiceComponent;

    // A map userId and all its companion app packages
    private final Map<Integer, Set<String>> mCompanionAppPackageMap = new ArrayMap<>();
    // A map userId and all its companion app uids
    private final Map<Integer, Set<Integer>> mCompanionAppUidsMap = new ArrayMap<>();

    VrController mVrController;
    KeyguardController mKeyguardController;
@@ -5907,12 +5907,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        }
    }

    boolean isAssociatedCompanionApp(int userId, String packageName) {
        final Set<String> allPackages = mCompanionAppPackageMap.get(userId);
        if (allPackages == null) {
    boolean isAssociatedCompanionApp(int userId, int uid) {
        final Set<Integer> allUids = mCompanionAppUidsMap.get(userId);
        if (allUids == null) {
            return false;
        }
        return allPackages.contains(packageName);
        return allUids.contains(uid);
    }

    final class H extends Handler {
@@ -7291,13 +7291,16 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {

        @Override
        public void setCompanionAppPackages(int userId, Set<String> companionAppPackages) {
            // Deep copy all content to make sure we do not rely on the source
            final Set<String> result = new HashSet<>();
            // Translate package names into UIDs
            final Set<Integer> result = new HashSet<>();
            for (String pkg : companionAppPackages) {
                result.add(pkg);
                final int uid = getPackageManagerInternalLocked().getPackageUid(pkg, 0, userId);
                if (uid >= 0) {
                    result.add(uid);
                }
            }
            synchronized (mGlobalLock) {
                mCompanionAppPackageMap.put(userId, result);
                mCompanionAppUidsMap.put(userId, result);
            }
        }
    }