1 /* 2 * Copyright 2016, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.managedprovisioning.model; 18 19 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE; 20 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE; 21 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME; 22 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI; 23 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL; 24 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME; 25 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DISCLAIMERS; 26 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION; 27 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED; 28 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCALE; 29 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCAL_TIME; 30 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR; 31 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ORGANIZATION_NAME; 32 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION; 33 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_USER_CONSENT; 34 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_USER_SETUP; 35 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SUPPORT_URL; 36 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_TIME_ZONE; 37 import static com.android.internal.util.Preconditions.checkArgument; 38 import static com.android.internal.util.Preconditions.checkNotNull; 39 import static com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences.DEFAULT_PROVISIONING_ID; 40 import static com.android.managedprovisioning.common.StoreUtils.accountToPersistableBundle; 41 import static com.android.managedprovisioning.common.StoreUtils.getIntegerAttrFromPersistableBundle; 42 import static com.android.managedprovisioning.common.StoreUtils.getObjectAttrFromPersistableBundle; 43 import static com.android.managedprovisioning.common.StoreUtils.getStringAttrFromPersistableBundle; 44 import static com.android.managedprovisioning.common.StoreUtils.putIntegerIfNotNull; 45 import static com.android.managedprovisioning.common.StoreUtils.putPersistableBundlableIfNotNull; 46 47 import android.accounts.Account; 48 import android.content.ComponentName; 49 import android.content.Context; 50 import android.os.Parcel; 51 import android.os.Parcelable; 52 import android.os.PersistableBundle; 53 import android.support.annotation.Nullable; 54 import android.util.Xml; 55 import com.android.internal.util.FastXmlSerializer; 56 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences; 57 import com.android.managedprovisioning.common.PersistableBundlable; 58 import com.android.managedprovisioning.common.ProvisionLogger; 59 import com.android.managedprovisioning.common.StoreUtils; 60 import java.io.File; 61 import java.io.FileInputStream; 62 import java.io.FileOutputStream; 63 import java.io.IOException; 64 import java.nio.charset.StandardCharsets; 65 import java.util.Locale; 66 import org.xmlpull.v1.XmlPullParser; 67 import org.xmlpull.v1.XmlPullParserException; 68 import org.xmlpull.v1.XmlSerializer; 69 70 /** 71 * Provisioning parameters for Device Owner and Profile Owner provisioning. 72 */ 73 public final class ProvisioningParams extends PersistableBundlable { 74 public static final long DEFAULT_LOCAL_TIME = -1; 75 public static final Integer DEFAULT_MAIN_COLOR = null; 76 public static final boolean DEFAULT_STARTED_BY_TRUSTED_SOURCE = false; 77 public static final boolean DEFAULT_IS_NFC = false; 78 public static final boolean DEFAULT_LEAVE_ALL_SYSTEM_APPS_ENABLED = false; 79 public static final boolean DEFAULT_EXTRA_PROVISIONING_SKIP_ENCRYPTION = false; 80 public static final boolean DEFAULT_EXTRA_PROVISIONING_SKIP_USER_CONSENT = false; 81 public static final boolean DEFAULT_EXTRA_PROVISIONING_KEEP_ACCOUNT_MIGRATED = false; 82 public static final boolean DEFAULT_SKIP_USER_SETUP = true; 83 // Intent extra used internally for passing data between activities and service. 84 public static final String EXTRA_PROVISIONING_PARAMS = "provisioningParams"; 85 86 private static final String TAG_PROVISIONING_ID = "provisioning-id"; 87 private static final String TAG_PROVISIONING_PARAMS = "provisioning-params"; 88 private static final String TAG_WIFI_INFO = "wifi-info"; 89 private static final String TAG_PACKAGE_DOWNLOAD_INFO = "download-info"; 90 private static final String TAG_STARTED_BY_TRUSTED_SOURCE = "started-by-trusted-source"; 91 private static final String TAG_IS_NFC = "started-is-nfc"; 92 private static final String TAG_PROVISIONING_ACTION = "provisioning-action"; 93 94 public static final Parcelable.Creator<ProvisioningParams> CREATOR 95 = new Parcelable.Creator<ProvisioningParams>() { 96 @Override 97 public ProvisioningParams createFromParcel(Parcel in) { 98 return new ProvisioningParams(in); 99 } 100 101 @Override 102 public ProvisioningParams[] newArray(int size) { 103 return new ProvisioningParams[size]; 104 } 105 }; 106 107 public final long provisioningId; 108 109 @Nullable 110 public final String timeZone; 111 112 public final long localTime; 113 114 @Nullable 115 public final Locale locale; 116 117 /** WiFi configuration. */ 118 @Nullable 119 public final WifiInfo wifiInfo; 120 121 /** 122 * Package name of the device admin package. 123 * 124 * <p>At least one one of deviceAdminPackageName and deviceAdminComponentName should be 125 * non-null. 126 */ 127 @Deprecated 128 public final String deviceAdminPackageName; 129 130 /** 131 * {@link ComponentName} of the device admin package. 132 * 133 * <p>At least one one of deviceAdminPackageName and deviceAdminComponentName should be 134 * non-null. 135 */ 136 public final ComponentName deviceAdminComponentName; 137 138 public final String deviceAdminLabel; 139 public final String organizationName; 140 public final String supportUrl; 141 public final String deviceAdminIconFilePath; 142 143 /** {@link Account} that should be migrated to the managed profile. */ 144 @Nullable 145 public final Account accountToMigrate; 146 147 /** True if the account will not be removed from the calling user after it is migrated. */ 148 public final boolean keepAccountMigrated; 149 150 /** Provisioning action comes along with the provisioning data. */ 151 public final String provisioningAction; 152 153 /** 154 * The main color theme used in managed profile only. 155 * 156 * <p>{@code null} means the default value. 157 */ 158 @Nullable 159 public final Integer mainColor; 160 161 /** The download information of device admin package. */ 162 @Nullable 163 public final PackageDownloadInfo deviceAdminDownloadInfo; 164 165 /** List of disclaimers */ 166 @Nullable 167 public final DisclaimersParam disclaimersParam; 168 169 /** 170 * Custom key-value pairs from enterprise mobility management which are passed to device admin 171 * package after provisioning. 172 * 173 * <p>Note that {@link ProvisioningParams} is not immutable because this field is mutable. 174 */ 175 @Nullable 176 public final PersistableBundle adminExtrasBundle; 177 178 /** 179 * True iff provisioning flow was started by a trusted app. This includes Nfc bump and QR code. 180 */ 181 public final boolean startedByTrustedSource; 182 183 public final boolean isNfc; 184 185 /** True if all system apps should be enabled after provisioning. */ 186 public final boolean leaveAllSystemAppsEnabled; 187 188 /** True if device encryption should be skipped. */ 189 public final boolean skipEncryption; 190 191 /** True if user setup can be skipped. */ 192 public final boolean skipUserSetup; 193 194 /** True if user consent page in pre-provisioning can be skipped. */ 195 public final boolean skipUserConsent; 196 197 public static String inferStaticDeviceAdminPackageName(ComponentName deviceAdminComponentName, 198 String deviceAdminPackageName) { 199 if (deviceAdminComponentName != null) { 200 return deviceAdminComponentName.getPackageName(); 201 } 202 return deviceAdminPackageName; 203 } 204 205 public String inferDeviceAdminPackageName() { 206 return inferStaticDeviceAdminPackageName(deviceAdminComponentName, deviceAdminPackageName); 207 } 208 209 private ProvisioningParams(Builder builder) { 210 provisioningId = builder.mProvisioningId; 211 timeZone = builder.mTimeZone; 212 localTime = builder.mLocalTime; 213 locale = builder.mLocale; 214 215 wifiInfo = builder.mWifiInfo; 216 217 deviceAdminComponentName = builder.mDeviceAdminComponentName; 218 deviceAdminPackageName = builder.mDeviceAdminPackageName; 219 deviceAdminLabel = builder.mDeviceAdminLabel; 220 organizationName = builder.mOrganizationName; 221 supportUrl = builder.mSupportUrl; 222 deviceAdminIconFilePath = builder.mDeviceAdminIconFilePath; 223 224 deviceAdminDownloadInfo = builder.mDeviceAdminDownloadInfo; 225 disclaimersParam = builder.mDisclaimersParam; 226 227 adminExtrasBundle = builder.mAdminExtrasBundle; 228 229 startedByTrustedSource = builder.mStartedByTrustedSource; 230 isNfc = builder.mIsNfc; 231 leaveAllSystemAppsEnabled = builder.mLeaveAllSystemAppsEnabled; 232 skipEncryption = builder.mSkipEncryption; 233 accountToMigrate = builder.mAccountToMigrate; 234 provisioningAction = checkNotNull(builder.mProvisioningAction); 235 mainColor = builder.mMainColor; 236 skipUserConsent = builder.mSkipUserConsent; 237 skipUserSetup = builder.mSkipUserSetup; 238 keepAccountMigrated = builder.mKeepAccountMigrated; 239 240 validateFields(); 241 } 242 243 private ProvisioningParams(Parcel in) { 244 this(createBuilderFromPersistableBundle( 245 PersistableBundlable.getPersistableBundleFromParcel(in))); 246 } 247 248 private void validateFields() { 249 checkArgument(deviceAdminPackageName != null || deviceAdminComponentName != null); 250 } 251 252 @Override 253 public PersistableBundle toPersistableBundle() { 254 final PersistableBundle bundle = new PersistableBundle(); 255 256 bundle.putLong(TAG_PROVISIONING_ID, provisioningId); 257 bundle.putString(EXTRA_PROVISIONING_TIME_ZONE, timeZone); 258 bundle.putLong(EXTRA_PROVISIONING_LOCAL_TIME, localTime); 259 bundle.putString(EXTRA_PROVISIONING_LOCALE, StoreUtils.localeToString(locale)); 260 putPersistableBundlableIfNotNull(bundle, TAG_WIFI_INFO, wifiInfo); 261 bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, deviceAdminPackageName); 262 bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, 263 StoreUtils.componentNameToString(deviceAdminComponentName)); 264 bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL, deviceAdminLabel); 265 bundle.putString(EXTRA_PROVISIONING_ORGANIZATION_NAME, organizationName); 266 bundle.putString(EXTRA_PROVISIONING_SUPPORT_URL, supportUrl); 267 bundle.putString(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI, deviceAdminIconFilePath); 268 bundle.putPersistableBundle(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, accountToMigrate == null 269 ? null : accountToPersistableBundle(accountToMigrate)); 270 bundle.putString(TAG_PROVISIONING_ACTION, provisioningAction); 271 putIntegerIfNotNull(bundle, EXTRA_PROVISIONING_MAIN_COLOR, mainColor); 272 putPersistableBundlableIfNotNull(bundle, TAG_PACKAGE_DOWNLOAD_INFO, 273 deviceAdminDownloadInfo); 274 putPersistableBundlableIfNotNull(bundle, EXTRA_PROVISIONING_DISCLAIMERS, 275 disclaimersParam); 276 bundle.putPersistableBundle(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, adminExtrasBundle); 277 bundle.putBoolean(TAG_STARTED_BY_TRUSTED_SOURCE, startedByTrustedSource); 278 bundle.putBoolean(TAG_IS_NFC, isNfc); 279 bundle.putBoolean(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED, 280 leaveAllSystemAppsEnabled); 281 bundle.putBoolean(EXTRA_PROVISIONING_SKIP_ENCRYPTION, skipEncryption); 282 bundle.putBoolean(EXTRA_PROVISIONING_SKIP_USER_SETUP, skipUserSetup); 283 bundle.putBoolean(EXTRA_PROVISIONING_SKIP_USER_CONSENT, skipUserConsent); 284 bundle.putBoolean(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, keepAccountMigrated); 285 return bundle; 286 } 287 288 /* package */ static ProvisioningParams fromPersistableBundle(PersistableBundle bundle) { 289 return createBuilderFromPersistableBundle(bundle).build(); 290 } 291 292 private static Builder createBuilderFromPersistableBundle(PersistableBundle bundle) { 293 Builder builder = new Builder(); 294 builder.setProvisioningId(bundle.getLong(TAG_PROVISIONING_ID, DEFAULT_PROVISIONING_ID)); 295 builder.setTimeZone(bundle.getString(EXTRA_PROVISIONING_TIME_ZONE)); 296 builder.setLocalTime(bundle.getLong(EXTRA_PROVISIONING_LOCAL_TIME)); 297 builder.setLocale(getStringAttrFromPersistableBundle(bundle, 298 EXTRA_PROVISIONING_LOCALE, StoreUtils::stringToLocale)); 299 builder.setWifiInfo(getObjectAttrFromPersistableBundle(bundle, 300 TAG_WIFI_INFO, WifiInfo::fromPersistableBundle)); 301 builder.setDeviceAdminPackageName(bundle.getString( 302 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME)); 303 builder.setDeviceAdminComponentName(getStringAttrFromPersistableBundle(bundle, 304 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, StoreUtils::stringToComponentName)); 305 builder.setDeviceAdminLabel(bundle.getString( 306 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL)); 307 builder.setOrganizationName(bundle.getString(EXTRA_PROVISIONING_ORGANIZATION_NAME)); 308 builder.setSupportUrl(bundle.getString(EXTRA_PROVISIONING_SUPPORT_URL)); 309 builder.setDeviceAdminIconFilePath(bundle.getString( 310 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_ICON_URI)); 311 builder.setAccountToMigrate(getObjectAttrFromPersistableBundle(bundle, 312 EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, StoreUtils::persistableBundleToAccount)); 313 builder.setProvisioningAction(bundle.getString(TAG_PROVISIONING_ACTION)); 314 builder.setMainColor(getIntegerAttrFromPersistableBundle(bundle, 315 EXTRA_PROVISIONING_MAIN_COLOR)); 316 builder.setDeviceAdminDownloadInfo(getObjectAttrFromPersistableBundle(bundle, 317 TAG_PACKAGE_DOWNLOAD_INFO, PackageDownloadInfo::fromPersistableBundle)); 318 builder.setDisclaimersParam(getObjectAttrFromPersistableBundle(bundle, 319 EXTRA_PROVISIONING_DISCLAIMERS, DisclaimersParam::fromPersistableBundle)); 320 builder.setAdminExtrasBundle(bundle.getPersistableBundle( 321 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE)); 322 builder.setStartedByTrustedSource(bundle.getBoolean(TAG_STARTED_BY_TRUSTED_SOURCE)); 323 builder.setIsNfc(bundle.getBoolean(TAG_IS_NFC)); 324 builder.setSkipEncryption(bundle.getBoolean(EXTRA_PROVISIONING_SKIP_ENCRYPTION)); 325 builder.setLeaveAllSystemAppsEnabled(bundle.getBoolean( 326 EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED)); 327 builder.setSkipUserSetup(bundle.getBoolean(EXTRA_PROVISIONING_SKIP_USER_SETUP)); 328 builder.setSkipUserConsent(bundle.getBoolean(EXTRA_PROVISIONING_SKIP_USER_CONSENT)); 329 builder.setKeepAccountMigrated(bundle.getBoolean( 330 EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION)); 331 return builder; 332 } 333 334 @Override 335 public String toString() { 336 return "ProvisioningParams values: " + toPersistableBundle().toString(); 337 } 338 339 /** 340 * Saves the ProvisioningParams to the specified file. 341 */ 342 public void save(File file) { 343 ProvisionLogger.logd("Saving ProvisioningParams to " + file); 344 try (FileOutputStream stream = new FileOutputStream(file)) { 345 XmlSerializer serializer = new FastXmlSerializer(); 346 serializer.setOutput(stream, StandardCharsets.UTF_8.name()); 347 serializer.startDocument(null, true); 348 serializer.startTag(null, TAG_PROVISIONING_PARAMS); 349 toPersistableBundle().saveToXml(serializer); 350 serializer.endTag(null, TAG_PROVISIONING_PARAMS); 351 serializer.endDocument(); 352 } catch (IOException | XmlPullParserException e) { 353 ProvisionLogger.loge("Caught exception while trying to save Provisioning Params to " 354 + " file " + file, e); 355 file.delete(); 356 } 357 } 358 359 public void cleanUp() { 360 if (disclaimersParam != null) { 361 disclaimersParam.cleanUp(); 362 } 363 if (deviceAdminIconFilePath != null) { 364 new File(deviceAdminIconFilePath).delete(); 365 } 366 } 367 368 /** 369 * Loads the ProvisioningParams From the specified file. 370 */ 371 public static ProvisioningParams load(File file) { 372 if (!file.exists()) { 373 return null; 374 } 375 ProvisionLogger.logd("Loading ProvisioningParams from " + file); 376 try (FileInputStream stream = new FileInputStream(file)) { 377 XmlPullParser parser = Xml.newPullParser(); 378 parser.setInput(stream, null); 379 return load(parser); 380 } catch (IOException | XmlPullParserException e) { 381 ProvisionLogger.loge("Caught exception while trying to load the provisioning params" 382 + " from file " + file, e); 383 return null; 384 } 385 } 386 387 private static ProvisioningParams load(XmlPullParser parser) throws XmlPullParserException, 388 IOException { 389 int type; 390 int outerDepth = parser.getDepth(); 391 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 392 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 393 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 394 continue; 395 } 396 String tag = parser.getName(); 397 switch (tag) { 398 case TAG_PROVISIONING_PARAMS: 399 return createBuilderFromPersistableBundle( 400 PersistableBundle.restoreFromXml(parser)).build(); 401 } 402 } 403 return new Builder().build(); 404 } 405 406 public final static class Builder { 407 private long mProvisioningId; 408 private String mTimeZone; 409 private long mLocalTime = DEFAULT_LOCAL_TIME; 410 private Locale mLocale; 411 private WifiInfo mWifiInfo; 412 private String mDeviceAdminPackageName; 413 private ComponentName mDeviceAdminComponentName; 414 private String mDeviceAdminLabel; 415 private String mOrganizationName; 416 private String mSupportUrl; 417 private String mDeviceAdminIconFilePath; 418 private Account mAccountToMigrate; 419 private String mProvisioningAction; 420 private Integer mMainColor = DEFAULT_MAIN_COLOR; 421 private PackageDownloadInfo mDeviceAdminDownloadInfo; 422 private DisclaimersParam mDisclaimersParam; 423 private PersistableBundle mAdminExtrasBundle; 424 private boolean mStartedByTrustedSource = DEFAULT_STARTED_BY_TRUSTED_SOURCE; 425 private boolean mIsNfc = DEFAULT_IS_NFC; 426 private boolean mLeaveAllSystemAppsEnabled = DEFAULT_LEAVE_ALL_SYSTEM_APPS_ENABLED; 427 private boolean mSkipEncryption = DEFAULT_EXTRA_PROVISIONING_SKIP_ENCRYPTION; 428 private boolean mSkipUserConsent = DEFAULT_EXTRA_PROVISIONING_SKIP_USER_CONSENT; 429 private boolean mSkipUserSetup = DEFAULT_SKIP_USER_SETUP; 430 private boolean mKeepAccountMigrated = DEFAULT_EXTRA_PROVISIONING_KEEP_ACCOUNT_MIGRATED; 431 432 public Builder setProvisioningId(long provisioningId) { 433 mProvisioningId = provisioningId; 434 return this; 435 } 436 437 public Builder setTimeZone(String timeZone) { 438 mTimeZone = timeZone; 439 return this; 440 } 441 442 public Builder setLocalTime(long localTime) { 443 mLocalTime = localTime; 444 return this; 445 } 446 447 public Builder setLocale(Locale locale) { 448 mLocale = locale; 449 return this; 450 } 451 452 public Builder setWifiInfo(WifiInfo wifiInfo) { 453 mWifiInfo = wifiInfo; 454 return this; 455 } 456 457 @Deprecated 458 public Builder setDeviceAdminPackageName(String deviceAdminPackageName) { 459 mDeviceAdminPackageName = deviceAdminPackageName; 460 return this; 461 } 462 463 public Builder setDeviceAdminComponentName(ComponentName deviceAdminComponentName) { 464 mDeviceAdminComponentName = deviceAdminComponentName; 465 return this; 466 } 467 468 public Builder setDeviceAdminLabel(String deviceAdminLabel) { 469 mDeviceAdminLabel = deviceAdminLabel; 470 return this; 471 } 472 473 public Builder setOrganizationName(String organizationName) { 474 mOrganizationName = organizationName; 475 return this; 476 } 477 478 public Builder setSupportUrl(String supportUrl) { 479 mSupportUrl = supportUrl; 480 return this; 481 } 482 483 public Builder setDeviceAdminIconFilePath(String deviceAdminIconFilePath) { 484 mDeviceAdminIconFilePath = deviceAdminIconFilePath; 485 return this; 486 } 487 488 public Builder setAccountToMigrate(Account accountToMigrate) { 489 mAccountToMigrate = accountToMigrate; 490 return this; 491 } 492 493 public Builder setProvisioningAction(String provisioningAction) { 494 mProvisioningAction = provisioningAction; 495 return this; 496 } 497 498 public Builder setMainColor(Integer mainColor) { 499 mMainColor = mainColor; 500 return this; 501 } 502 503 public Builder setDeviceAdminDownloadInfo(PackageDownloadInfo deviceAdminDownloadInfo) { 504 mDeviceAdminDownloadInfo = deviceAdminDownloadInfo; 505 return this; 506 } 507 508 public Builder setDisclaimersParam(DisclaimersParam disclaimersParam) { 509 mDisclaimersParam = disclaimersParam; 510 return this; 511 } 512 513 public Builder setAdminExtrasBundle(PersistableBundle adminExtrasBundle) { 514 mAdminExtrasBundle = adminExtrasBundle; 515 return this; 516 } 517 518 public Builder setStartedByTrustedSource(boolean startedByTrustedSource) { 519 mStartedByTrustedSource = startedByTrustedSource; 520 return this; 521 } 522 523 public Builder setIsNfc(boolean isNfc) { 524 mIsNfc = isNfc; 525 return this; 526 } 527 528 529 public Builder setLeaveAllSystemAppsEnabled(boolean leaveAllSystemAppsEnabled) { 530 mLeaveAllSystemAppsEnabled = leaveAllSystemAppsEnabled; 531 return this; 532 } 533 534 public Builder setSkipEncryption(boolean skipEncryption) { 535 mSkipEncryption = skipEncryption; 536 return this; 537 } 538 539 public Builder setSkipUserConsent(boolean skipUserConsent) { 540 mSkipUserConsent = skipUserConsent; 541 return this; 542 } 543 544 public Builder setSkipUserSetup(boolean skipUserSetup) { 545 mSkipUserSetup = skipUserSetup; 546 return this; 547 } 548 549 public Builder setKeepAccountMigrated(boolean keepAccountMigrated) { 550 mKeepAccountMigrated = keepAccountMigrated; 551 return this; 552 } 553 554 public ProvisioningParams build() { 555 return new ProvisioningParams(this); 556 } 557 558 public static Builder builder() { 559 return new Builder(); 560 } 561 } 562 } 563