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

Commit 57e52590 authored by Kholoud Mohamed's avatar Kholoud Mohamed Committed by Android (Google) Code Review
Browse files

Merge "Fix single-user headless DO provisioning" into main

parents 0cf242fd 92d000af
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -189,10 +189,13 @@ public final class DeviceAdminInfo implements Parcelable {
    @FlaggedApi(FLAG_HEADLESS_DEVICE_OWNER_SINGLE_USER_ENABLED)
    @FlaggedApi(FLAG_HEADLESS_DEVICE_OWNER_SINGLE_USER_ENABLED)
    public static final int HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER = 2;
    public static final int HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER = 2;


    /**
     * @hide
     */
    @IntDef({HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED, HEADLESS_DEVICE_OWNER_MODE_AFFILIATED,
    @IntDef({HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED, HEADLESS_DEVICE_OWNER_MODE_AFFILIATED,
            HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER})
            HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER})
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    private @interface HeadlessDeviceOwnerMode {}
    public @interface HeadlessDeviceOwnerMode {}


    /** @hide */
    /** @hide */
    public static class PolicyInfo {
    public static class PolicyInfo {
+23 −0
Original line number Original line Diff line number Diff line
@@ -53,6 +53,7 @@ import static android.Manifest.permission.QUERY_ADMIN_POLICY;
import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY;
import static android.Manifest.permission.REQUEST_PASSWORD_COMPLEXITY;
import static android.Manifest.permission.SET_TIME;
import static android.Manifest.permission.SET_TIME;
import static android.Manifest.permission.SET_TIME_ZONE;
import static android.Manifest.permission.SET_TIME_ZONE;
import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED;
import static android.app.admin.flags.Flags.FLAG_DEVICE_THEFT_API_ENABLED;
import static android.app.admin.flags.Flags.FLAG_DEVICE_THEFT_API_ENABLED;
import static android.app.admin.flags.Flags.FLAG_ESIM_MANAGEMENT_ENABLED;
import static android.app.admin.flags.Flags.FLAG_ESIM_MANAGEMENT_ENABLED;
import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED;
import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED;
@@ -93,6 +94,7 @@ import android.app.Activity;
import android.app.IServiceConnection;
import android.app.IServiceConnection;
import android.app.KeyguardManager;
import android.app.KeyguardManager;
import android.app.admin.SecurityLog.SecurityEvent;
import android.app.admin.SecurityLog.SecurityEvent;
import android.app.admin.flags.Flags;
import android.app.compat.CompatChanges;
import android.app.compat.CompatChanges;
import android.compat.annotation.ChangeId;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.compat.annotation.EnabledSince;
@@ -17526,4 +17528,25 @@ public class DevicePolicyManager {
        }
        }
        return -1;
        return -1;
    }
    }
    /**
     * @return The headless device owner mode for the current set DO, returns
     * {@link DeviceAdminInfo#HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED} if no DO is set.
     *
     * @hide
     */
    @DeviceAdminInfo.HeadlessDeviceOwnerMode
    public int getHeadlessDeviceOwnerMode() {
        if (!Flags.headlessDeviceOwnerProvisioningFixEnabled()) {
            return HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED;
        }
        if (mService != null) {
            try {
                return mService.getHeadlessDeviceOwnerMode(mContext.getPackageName());
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
        return HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED;
    }
}
}
 No newline at end of file
+2 −0
Original line number Original line Diff line number Diff line
@@ -625,4 +625,6 @@ interface IDevicePolicyManager {


    void setMaxPolicyStorageLimit(String packageName, int storageLimit);
    void setMaxPolicyStorageLimit(String packageName, int storageLimit);
    int getMaxPolicyStorageLimit(String packageName);
    int getMaxPolicyStorageLimit(String packageName);

    int getHeadlessDeviceOwnerMode(String callerPackageName);
}
}
+10 −0
Original line number Original line Diff line number Diff line
@@ -163,3 +163,13 @@ flag {
  description: "Enable UX changes for esim management"
  description: "Enable UX changes for esim management"
  bug: "295301164"
  bug: "295301164"
}
}

flag {
  name: "headless_device_owner_provisioning_fix_enabled"
  namespace: "enterprise"
  description: "Fix provisioning for single-user headless DO"
  bug: "289515470"
  metadata {
      purpose: PURPOSE_BUGFIX
    }
}
+25 −3
Original line number Original line Diff line number Diff line
@@ -16877,6 +16877,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
    private int checkDeviceOwnerProvisioningPreCondition(@UserIdInt int callingUserId) {
    private int checkDeviceOwnerProvisioningPreCondition(@UserIdInt int callingUserId) {
        synchronized (getLockObject()) {
        synchronized (getLockObject()) {
            final int deviceOwnerUserId = mInjector.userManagerIsHeadlessSystemUserMode()
            final int deviceOwnerUserId = mInjector.userManagerIsHeadlessSystemUserMode()
                    && (!Flags.headlessDeviceOwnerProvisioningFixEnabled()
                    || getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_AFFILIATED)
                    ? UserHandle.USER_SYSTEM
                    ? UserHandle.USER_SYSTEM
                    : callingUserId;
                    : callingUserId;
            Slogf.i(LOG_TAG, "Calling user %d, device owner will be set on user %d",
            Slogf.i(LOG_TAG, "Calling user %d, device owner will be set on user %d",
@@ -21549,10 +21551,21 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
            setTimeAndTimezone(provisioningParams.getTimeZone(), provisioningParams.getLocalTime());
            setTimeAndTimezone(provisioningParams.getTimeZone(), provisioningParams.getLocalTime());
            setLocale(provisioningParams.getLocale());
            setLocale(provisioningParams.getLocale());
            boolean isSingleUserMode;
            if (Flags.headlessDeviceOwnerProvisioningFixEnabled()) {
                DeviceAdminInfo adminInfo = findAdmin(
                        deviceAdmin, caller.getUserId(), /* throwForMissingPermission= */ false);
                isSingleUserMode = (adminInfo != null && adminInfo.getHeadlessDeviceOwnerMode()
                        == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER);
            } else {
                isSingleUserMode =
                        (getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER);
            }
            int deviceOwnerUserId = Flags.headlessDeviceOwnerSingleUserEnabled()
            int deviceOwnerUserId = Flags.headlessDeviceOwnerSingleUserEnabled()
                    && getHeadlessDeviceOwnerMode() == HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER
                    && isSingleUserMode
                    ? mUserManagerInternal.getMainUserId()
                    ? mUserManagerInternal.getMainUserId() : UserHandle.USER_SYSTEM;
                    : UserHandle.USER_SYSTEM;
            if (!removeNonRequiredAppsForManagedDevice(
            if (!removeNonRequiredAppsForManagedDevice(
                    deviceOwnerUserId,
                    deviceOwnerUserId,
@@ -24256,4 +24269,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
        return mDevicePolicyEngine.getMaxPolicyStorageLimit();
        return mDevicePolicyEngine.getMaxPolicyStorageLimit();
    }
    }
    @Override
    public int getHeadlessDeviceOwnerMode(String callerPackageName) {
        final CallerIdentity caller = getCallerIdentity(callerPackageName);
        enforcePermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, caller.getPackageName(),
                caller.getUserId());
        return Binder.withCleanCallingIdentity(() -> getHeadlessDeviceOwnerMode());
    }
}
}