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

Commit cfa4e477 authored by Pavel Grafov's avatar Pavel Grafov
Browse files

Handle USER_ALL case when policy applied globally.

Bug: 335775778
Test: atest CtsDevicePolicyTestCases:android.devicepolicy.cts.UserControlDisabledPackagesTest#setUserControlDisabledPackages_bgUsageAllowed
Change-Id: I896124a3ec75bebe8cd777b82475054dafb45f98
parent e529616f
Loading
Loading
Loading
Loading
+30 −9
Original line number Original line Diff line number Diff line
@@ -16,6 +16,9 @@


package com.android.server.devicepolicy;
package com.android.server.devicepolicy;


import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;

import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.annotation.UserIdInt;
@@ -185,6 +188,9 @@ final class PolicyEnforcerCallbacks {
        }
        }
    }
    }


    // TODO: when a local policy exists for a user, this callback will be invoked for this user
    // individually as well as for USER_ALL. This can be optimized by separating local and global
    // enforcement in the policy engine.
    static boolean setUserControlDisabledPackages(
    static boolean setUserControlDisabledPackages(
            @Nullable Set<String> packages, Context context, int userId, PolicyKey policyKey) {
            @Nullable Set<String> packages, Context context, int userId, PolicyKey policyKey) {
        Binder.withCleanCallingIdentity(() -> {
        Binder.withCleanCallingIdentity(() -> {
@@ -201,19 +207,34 @@ final class PolicyEnforcerCallbacks {
                    return;
                    return;
                }
                }
                final AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
                final AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
                resolveUsers(userId).forEach(
                        user -> setBgUsageAppOp(packages, pmi, user, appOpsManager));
            }
        });
        return true;
    }

    /** Handles USER_ALL expanding it into the list of all intact users. */
    private static List<Integer> resolveUsers(int userId) {
        if (userId == UserHandle.USER_ALL) {
            UserManagerInternal userManager = LocalServices.getService(UserManagerInternal.class);
            return userManager.getUsers(/* excludeDying= */ true)
                    .stream().map(ui -> ui.id).toList();
        } else {
            return List.of(userId);
        }
    }

    private static void setBgUsageAppOp(Set<String> packages, PackageManagerInternal pmi,
            int userId, AppOpsManager appOpsManager) {
        for (var pkg : packages) {
        for (var pkg : packages) {
                    final var appInfo = pmi.getApplicationInfo(pkg,
            int packageFlags = MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE;
                            PackageManager.MATCH_DIRECT_BOOT_AWARE
            final var appInfo = pmi.getApplicationInfo(pkg, packageFlags, Process.myUid(), userId);
                                    | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                            Process.myUid(), userId);
            if (appInfo != null) {
            if (appInfo != null) {
                DevicePolicyManagerService.setBgUsageAppOp(appOpsManager, appInfo);
                DevicePolicyManagerService.setBgUsageAppOp(appOpsManager, appInfo);
            }
            }
        }
        }
    }
    }
        });
        return true;
    }


    static boolean addPersistentPreferredActivity(
    static boolean addPersistentPreferredActivity(
            @Nullable ComponentName preferredActivity, @NonNull Context context, int userId,
            @Nullable ComponentName preferredActivity, @NonNull Context context, int userId,