/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.app.admin; import static java.util.Objects.requireNonNull; import android.accounts.Account; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.content.ComponentName; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; import android.stats.devicepolicy.DevicePolicyEnums; /** * Params required to provision a managed profile, see * {@link DevicePolicyManager#createAndProvisionManagedProfile}. * * @hide */ @SystemApi public final class ManagedProfileProvisioningParams implements Parcelable { private static final String LEAVE_ALL_SYSTEM_APPS_ENABLED_PARAM = "LEAVE_ALL_SYSTEM_APPS_ENABLED"; private static final String ORGANIZATION_OWNED_PROVISIONING_PARAM = "ORGANIZATION_OWNED_PROVISIONING"; private static final String ACCOUNT_TO_MIGRATE_PROVIDED_PARAM = "ACCOUNT_TO_MIGRATE_PROVIDED"; private static final String KEEP_MIGRATED_ACCOUNT_PARAM = "KEEP_MIGRATED_ACCOUNT"; @NonNull private final ComponentName mProfileAdminComponentName; @NonNull private final String mOwnerName; @Nullable private final String mProfileName; @Nullable private final Account mAccountToMigrate; private final boolean mLeaveAllSystemAppsEnabled; private final boolean mOrganizationOwnedProvisioning; private final boolean mKeepAccountOnMigration; @NonNull private final PersistableBundle mAdminExtras; private ManagedProfileProvisioningParams( @NonNull ComponentName profileAdminComponentName, @NonNull String ownerName, @Nullable String profileName, @Nullable Account accountToMigrate, boolean leaveAllSystemAppsEnabled, boolean organizationOwnedProvisioning, boolean keepAccountOnMigration, @NonNull PersistableBundle adminExtras) { this.mProfileAdminComponentName = requireNonNull(profileAdminComponentName); this.mOwnerName = requireNonNull(ownerName); this.mProfileName = profileName; this.mAccountToMigrate = accountToMigrate; this.mLeaveAllSystemAppsEnabled = leaveAllSystemAppsEnabled; this.mOrganizationOwnedProvisioning = organizationOwnedProvisioning; this.mKeepAccountOnMigration = keepAccountOnMigration; this.mAdminExtras = adminExtras; } /** * Returns the profile owner's {@link ComponentName}. */ @NonNull public ComponentName getProfileAdminComponentName() { return mProfileAdminComponentName; } /** * Returns the profile owner's name. */ @NonNull public String getOwnerName() { return mOwnerName; } /** * Returns the profile's name if set, otherwise returns {@code null}. */ @Nullable public String getProfileName() { return mProfileName; } /** * If set, it returns the {@link Account} to migrate from the parent profile to the managed * profile after provisioning, otherwise returns {@code null}. */ @Nullable public Account getAccountToMigrate() { return mAccountToMigrate; } /** * Returns {@code true} if system apps should be left enabled after provisioning. */ public boolean isLeaveAllSystemAppsEnabled() { return mLeaveAllSystemAppsEnabled; } /** * Returns {@code true} if this is an org owned device. */ public boolean isOrganizationOwnedProvisioning() { return mOrganizationOwnedProvisioning; } /** * Returns {@code true} if the migrated account from {@link #getAccountToMigrate()} should be * kept in parent profile. */ public boolean isKeepingAccountOnMigration() { return mKeepAccountOnMigration; } /** * Returns a copy of the admin extras bundle. * * @see DevicePolicyManager#EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE */ public @NonNull PersistableBundle getAdminExtras() { return new PersistableBundle(mAdminExtras); } /** * Logs the provisioning params using {@link DevicePolicyEventLogger}. * * @hide */ public void logParams(@NonNull String callerPackage) { requireNonNull(callerPackage); logParam(callerPackage, LEAVE_ALL_SYSTEM_APPS_ENABLED_PARAM, mLeaveAllSystemAppsEnabled); logParam(callerPackage, ORGANIZATION_OWNED_PROVISIONING_PARAM, mOrganizationOwnedProvisioning); logParam(callerPackage, KEEP_MIGRATED_ACCOUNT_PARAM, mKeepAccountOnMigration); logParam(callerPackage, ACCOUNT_TO_MIGRATE_PROVIDED_PARAM, /* value= */ mAccountToMigrate != null); } private void logParam(String callerPackage, String param, boolean value) { DevicePolicyEventLogger .createEvent(DevicePolicyEnums.PLATFORM_PROVISIONING_PARAM) .setStrings(callerPackage) .setAdmin(mProfileAdminComponentName) .setStrings(param) .setBoolean(value) .write(); } /** * Builder class for {@link ManagedProfileProvisioningParams} objects. */ public static final class Builder { @NonNull private final ComponentName mProfileAdminComponentName; @NonNull private final String mOwnerName; @Nullable private String mProfileName; @Nullable private Account mAccountToMigrate; private boolean mLeaveAllSystemAppsEnabled; private boolean mOrganizationOwnedProvisioning; private boolean mKeepingAccountOnMigration; @Nullable private PersistableBundle mAdminExtras; /** * Initialize a new {@link Builder) to construct a {@link ManagedProfileProvisioningParams}. *

* See {@link DevicePolicyManager#createAndProvisionManagedProfile} * * @param profileAdminComponentName The admin {@link ComponentName} to be set as the profile * owner. * @param ownerName The name of the profile owner. * * @throws NullPointerException if {@code profileAdminComponentName} or * {@code ownerName} are null. */ public Builder( @NonNull ComponentName profileAdminComponentName, @NonNull String ownerName) { requireNonNull(profileAdminComponentName); requireNonNull(ownerName); this.mProfileAdminComponentName = profileAdminComponentName; this.mOwnerName = ownerName; } /** * Sets the profile name of the created profile when * {@link DevicePolicyManager#createAndProvisionManagedProfile} is called. Defaults to * {@code null} if not set. */ @NonNull public Builder setProfileName(@Nullable String profileName) { this.mProfileName = profileName; return this; } /** * Sets the {@link Account} to migrate from the parent profile to the created profile when * {@link DevicePolicyManager#createAndProvisionManagedProfile} is called. If not set, or * set to {@code null}, no accounts will be migrated. */ @NonNull public Builder setAccountToMigrate(@Nullable Account accountToMigrate) { this.mAccountToMigrate = accountToMigrate; return this; } /** * Sets whether non-required system apps should be installed on * the created profile when {@link DevicePolicyManager#createAndProvisionManagedProfile} * is called. Defaults to {@code false} if not set. */ @NonNull public Builder setLeaveAllSystemAppsEnabled(boolean leaveAllSystemAppsEnabled) { this.mLeaveAllSystemAppsEnabled = leaveAllSystemAppsEnabled; return this; } /** * Sets if this device is owned by an organization. Defaults to {@code false} * if not set. */ @NonNull public Builder setOrganizationOwnedProvisioning(boolean organizationOwnedProvisioning) { this.mOrganizationOwnedProvisioning = organizationOwnedProvisioning; return this; } /** * Sets whether to keep the account on the parent profile during account migration. * Defaults to {@code false}. */ @NonNull public Builder setKeepingAccountOnMigration(boolean keepingAccountOnMigration) { this.mKeepingAccountOnMigration = keepingAccountOnMigration; return this; } /** * Sets a {@link Bundle} that contains admin-specific extras. */ @NonNull //TODO(b/235783053) The adminExtras parameter is actually @Nullable. public Builder setAdminExtras(@NonNull PersistableBundle adminExtras) { mAdminExtras = adminExtras != null ? new PersistableBundle(adminExtras) : new PersistableBundle(); return this; } /** * Combines all of the attributes that have been set on this {@code Builder}. * * @return a new {@link ManagedProfileProvisioningParams} object. */ @NonNull public ManagedProfileProvisioningParams build() { return new ManagedProfileProvisioningParams( mProfileAdminComponentName, mOwnerName, mProfileName, mAccountToMigrate, mLeaveAllSystemAppsEnabled, mOrganizationOwnedProvisioning, mKeepingAccountOnMigration, mAdminExtras != null ? mAdminExtras : new PersistableBundle()); } } @Override public int describeContents() { return 0; } /** * @hide */ @Override public String toString() { return "ManagedProfileProvisioningParams{" + "mProfileAdminComponentName=" + mProfileAdminComponentName + ", mOwnerName=" + mOwnerName + ", mProfileName=" + (mProfileName == null ? "null" : mProfileName) + ", mAccountToMigrate=" + (mAccountToMigrate == null ? "null" : mAccountToMigrate) + ", mLeaveAllSystemAppsEnabled=" + mLeaveAllSystemAppsEnabled + ", mOrganizationOwnedProvisioning=" + mOrganizationOwnedProvisioning + ", mKeepAccountOnMigration=" + mKeepAccountOnMigration + ", mAdminExtras=" + mAdminExtras + '}'; } @Override public void writeToParcel(@NonNull Parcel dest, @Nullable int flags) { dest.writeTypedObject(mProfileAdminComponentName, flags); dest.writeString(mOwnerName); dest.writeString(mProfileName); dest.writeTypedObject(mAccountToMigrate, flags); dest.writeBoolean(mLeaveAllSystemAppsEnabled); dest.writeBoolean(mOrganizationOwnedProvisioning); dest.writeBoolean(mKeepAccountOnMigration); dest.writePersistableBundle(mAdminExtras); } public static final @NonNull Creator CREATOR = new Creator() { @Override public ManagedProfileProvisioningParams createFromParcel(Parcel in) { ComponentName componentName = in.readTypedObject(ComponentName.CREATOR); String ownerName = in.readString(); String profileName = in.readString(); Account account = in.readTypedObject(Account.CREATOR); boolean leaveAllSystemAppsEnabled = in.readBoolean(); boolean organizationOwnedProvisioning = in.readBoolean(); boolean keepAccountMigrated = in.readBoolean(); PersistableBundle adminExtras = in.readPersistableBundle(); return new ManagedProfileProvisioningParams( componentName, ownerName, profileName, account, leaveAllSystemAppsEnabled, organizationOwnedProvisioning, keepAccountMigrated, adminExtras); } @Override public ManagedProfileProvisioningParams[] newArray(int size) { return new ManagedProfileProvisioningParams[size]; } }; }