1 /* 2 * Copyright 2014, 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; 18 19 import android.content.Context; 20 import android.accounts.Account; 21 import android.content.ComponentName; 22 import android.os.Parcel; 23 import android.os.Parcelable; 24 import android.os.PersistableBundle; 25 26 import java.util.Locale; 27 28 /** 29 * Provisioning Parameters for Device owner and Profile owner Provisioning. 30 */ 31 public class ProvisioningParams implements Parcelable { 32 public static final long DEFAULT_LOCAL_TIME = -1; 33 public static final boolean DEFAULT_WIFI_HIDDEN = false; 34 public static final boolean DEFAULT_LEAVE_ALL_SYSTEM_APPS_ENABLED = false; 35 public static final int DEFAULT_WIFI_PROXY_PORT = 0; 36 public static final boolean DEFAULT_EXTRA_PROVISIONING_SKIP_ENCRYPTION = false; 37 // Always download packages if no minimum version given. 38 public static final int DEFAULT_MINIMUM_VERSION = Integer.MAX_VALUE; 39 40 public String timeZone; 41 public long localTime = DEFAULT_LOCAL_TIME; 42 public Locale locale; 43 44 // Intent extra used internally for passing data between activities and service. 45 /* package */ static final String EXTRA_PROVISIONING_PARAMS = "provisioningParams"; 46 47 public static class WifiInfo { 48 public String ssid; 49 public boolean hidden = DEFAULT_WIFI_HIDDEN; 50 public String securityType; 51 public String password; 52 public String proxyHost; 53 public int proxyPort = DEFAULT_WIFI_PROXY_PORT; 54 public String proxyBypassHosts; 55 public String pacUrl; 56 writeToParcel(Parcel out)57 public void writeToParcel(Parcel out) { 58 out.writeString(ssid); 59 out.writeInt(hidden ? 1 : 0); 60 out.writeString(securityType); 61 out.writeString(password); 62 out.writeString(proxyHost); 63 out.writeInt(proxyPort); 64 out.writeString(proxyBypassHosts); 65 out.writeString(pacUrl); 66 } 67 readFromParcel(Parcel in)68 public void readFromParcel(Parcel in) { 69 ssid = in.readString(); 70 hidden = in.readInt() == 1; 71 securityType = in.readString(); 72 password = in.readString(); 73 proxyHost = in.readString(); 74 proxyPort = in.readInt(); 75 proxyBypassHosts = in.readString(); 76 pacUrl = in.readString(); 77 } 78 } 79 public WifiInfo wifiInfo = new WifiInfo(); 80 81 // At least one one of deviceAdminPackageName and deviceAdminComponentName should be non-null 82 public String deviceAdminPackageName; // Package name of the device admin package. 83 public ComponentName deviceAdminComponentName; 84 public ComponentName deviceInitializerComponentName; 85 public Account accountToMigrate; 86 87 private ComponentName inferedDeviceAdminComponentName; 88 89 public static class PackageDownloadInfo { 90 // Url where the package (.apk) can be downloaded from 91 public String location; 92 // Cookie header for http request 93 public String cookieHeader; 94 // One of the following two checksums should be non empty. 95 // SHA-256 or SHA-1 hash of the .apk file, or empty array if not used. 96 public byte[] packageChecksum = new byte[0]; 97 // SHA-256 hash of the signature in the .apk file, or empty array if not used. 98 public byte[] signatureChecksum = new byte[0]; 99 public int minVersion; 100 // If this is false, packageChecksum can only be SHA-256 hash, otherwise SHA-1 is also 101 // supported. 102 public boolean packageChecksumSupportsSha1; 103 writeToParcel(Parcel out)104 public void writeToParcel(Parcel out) { 105 out.writeInt(minVersion); 106 out.writeString(location); 107 out.writeString(cookieHeader); 108 out.writeByteArray(packageChecksum); 109 out.writeByteArray(signatureChecksum); 110 out.writeInt(packageChecksumSupportsSha1 ? 1 : 0); 111 } 112 readFromParcel(Parcel in)113 public void readFromParcel(Parcel in) { 114 minVersion = in.readInt(); 115 location = in.readString(); 116 cookieHeader = in.readString(); 117 packageChecksum = in.createByteArray(); 118 signatureChecksum = in.createByteArray(); 119 packageChecksumSupportsSha1 = in.readInt() == 1; 120 } 121 } 122 public PackageDownloadInfo deviceAdminDownloadInfo = new PackageDownloadInfo(); 123 public PackageDownloadInfo deviceInitializerDownloadInfo = new PackageDownloadInfo(); 124 125 public PersistableBundle adminExtrasBundle; 126 127 public boolean startedByNfc; // True iff provisioning flow was started by Nfc bump. 128 129 public boolean leaveAllSystemAppsEnabled; 130 public boolean skipEncryption; 131 inferDeviceAdminPackageName()132 public String inferDeviceAdminPackageName() { 133 if (deviceAdminComponentName != null) { 134 return deviceAdminComponentName.getPackageName(); 135 } 136 return deviceAdminPackageName; 137 } 138 getDeviceInitializerPackageName()139 public String getDeviceInitializerPackageName() { 140 if (deviceInitializerComponentName != null) { 141 return deviceInitializerComponentName.getPackageName(); 142 } 143 return null; 144 } 145 146 // This should not be called if the app has not been installed yet. inferDeviceAdminComponentName(Context c)147 ComponentName inferDeviceAdminComponentName(Context c) 148 throws Utils.IllegalProvisioningArgumentException { 149 if (inferedDeviceAdminComponentName == null) { 150 inferedDeviceAdminComponentName = Utils.findDeviceAdmin( 151 deviceAdminPackageName, deviceAdminComponentName, c); 152 } 153 return inferedDeviceAdminComponentName; 154 } 155 156 @Override describeContents()157 public int describeContents() { 158 return 0; 159 } 160 161 @Override writeToParcel(Parcel out, int flags)162 public void writeToParcel(Parcel out, int flags) { 163 out.writeString(timeZone); 164 out.writeLong(localTime); 165 out.writeSerializable(locale); 166 wifiInfo.writeToParcel(out); 167 out.writeString(deviceAdminPackageName); 168 out.writeParcelable(deviceAdminComponentName, 0 /* default */); 169 deviceAdminDownloadInfo.writeToParcel(out); 170 out.writeParcelable(deviceInitializerComponentName, 0 /* default */); 171 deviceInitializerDownloadInfo.writeToParcel(out); 172 out.writeParcelable(adminExtrasBundle, 0 /* default */); 173 out.writeInt(startedByNfc ? 1 : 0); 174 out.writeInt(leaveAllSystemAppsEnabled ? 1 : 0); 175 out.writeInt(skipEncryption ? 1 : 0); 176 out.writeParcelable(accountToMigrate, 0 /* default */); 177 } 178 179 public static final Parcelable.Creator<ProvisioningParams> CREATOR 180 = new Parcelable.Creator<ProvisioningParams>() { 181 @Override 182 public ProvisioningParams createFromParcel(Parcel in) { 183 ProvisioningParams params = new ProvisioningParams(); 184 params.timeZone = in.readString(); 185 params.localTime = in.readLong(); 186 params.locale = (Locale) in.readSerializable(); 187 params.wifiInfo.readFromParcel(in); 188 params.deviceAdminPackageName = in.readString(); 189 params.deviceAdminComponentName = (ComponentName) 190 in.readParcelable(null /* use default classloader */); 191 params.deviceAdminDownloadInfo.readFromParcel(in); 192 params.deviceInitializerComponentName = (ComponentName) 193 in.readParcelable(null /* use default classloader */); 194 params.deviceInitializerDownloadInfo.readFromParcel(in); 195 params.adminExtrasBundle = in.readParcelable(null /* use default classloader */); 196 params.startedByNfc = in.readInt() == 1; 197 params.leaveAllSystemAppsEnabled = in.readInt() == 1; 198 params.skipEncryption = in.readInt() == 1; 199 params.accountToMigrate = 200 (Account) in.readParcelable(null /* use default classloader */); 201 return params; 202 } 203 204 @Override 205 public ProvisioningParams[] newArray(int size) { 206 return new ProvisioningParams[size]; 207 } 208 }; 209 } 210