104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse/* 204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * Copyright 2014, The Android Open Source Project 304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * 404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * Licensed under the Apache License, Version 2.0 (the "License"); 504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * you may not use this file except in compliance with the License. 604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * You may obtain a copy of the License at 704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * 804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * http://www.apache.org/licenses/LICENSE-2.0 904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * 1004ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * Unless required by applicable law or agreed to in writing, software 1104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * distributed under the License is distributed on an "AS IS" BASIS, 1204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * See the License for the specific language governing permissions and 1404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * limitations under the License. 1504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse */ 1604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 1704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnsepackage com.android.managedprovisioning; 1804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 19ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnseimport static android.app.admin.DeviceAdminReceiver.ACTION_PROFILE_PROVISIONING_COMPLETE; 20ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnseimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE; 21ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 2204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport android.app.AlarmManager; 2304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport android.app.Service; 24ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnseimport android.content.BroadcastReceiver; 2504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport android.content.ComponentName; 2604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport android.content.Context; 2704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport android.content.Intent; 28ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnseimport android.content.IntentFilter; 29ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnseimport android.content.pm.PackageManager; 3028bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnseimport android.os.Bundle; 3104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport android.os.IBinder; 323b76f0d34ed293c310605a66711cf3aba42f09e6Nicolas Prevotimport android.os.UserHandle; 3381fe104ecfc98f1fb4356891acfe696e7445acb8Jessica Hummelimport android.support.v4.content.LocalBroadcastManager; 34326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnseimport android.text.TextUtils; 3504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 3604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport com.android.internal.app.LocalePicker; 3704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport com.android.managedprovisioning.task.AddWifiNetworkTask; 382818d32aa494363a59d3b0f47695e317f47b689bSander Alewijnseimport com.android.managedprovisioning.task.DeleteNonRequiredAppsTask; 3904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport com.android.managedprovisioning.task.DownloadPackageTask; 4004ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport com.android.managedprovisioning.task.InstallPackageTask; 4104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport com.android.managedprovisioning.task.SetDevicePolicyTask; 4204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 4304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport java.lang.Runnable; 4404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnseimport java.util.Locale; 4504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 4604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse/** 4704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * This service does the work for the DeviceOwnerProvisioningActivity. 4804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * Feedback is sent back to the activity via intents. 4904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * 5004ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * <p> 5104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * If the corresponding activity is killed and restarted, the service is 5204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * called twice. The service will not start the provisioning flow a second time, but instead 5304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * send a status update to the activity. 5404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * </p> 5504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse */ 5604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnsepublic class DeviceOwnerProvisioningService extends Service { 57639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse /** 58639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse * Intent action to activate the CDMA phone connection by OTASP. 59639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse * This is not necessary for a GSM phone connection, which is activated automatically. 60639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse * String must agree with the constants in com.android.phone.InCallScreenShowActivation. 61639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse */ 62639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse private static final String ACTION_PERFORM_CDMA_PROVISIONING = 63639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse "com.android.phone.PERFORM_CDMA_PROVISIONING"; 64639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse 65326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse // Intent actions and extras for communication from DeviceOwnerProvisioningService to Activity. 66326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse protected static final String EXTRA_PROVISIONING_PARAMS = 67326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse "ProvisioningParams"; 68326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse 69326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse // Intent actions and extras for communication from DeviceOwnerProvisioningActivity to Service. 70d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse protected static final String ACTION_PROVISIONING_SUCCESS = 7104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse "com.android.managedprovisioning.provisioning_success"; 72d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse protected static final String ACTION_PROVISIONING_ERROR = 7304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse "com.android.managedprovisioning.error"; 74d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse protected static final String EXTRA_USER_VISIBLE_ERROR_ID_KEY = 75d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse "UserVisibleErrorMessage-Id"; 76d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse protected static final String ACTION_PROGRESS_UPDATE = 7704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse "com.android.managedprovisioning.progress_update"; 78d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse protected static final String EXTRA_PROGRESS_MESSAGE_ID_KEY = 79d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse "ProgressMessageId"; 80326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse protected static final String ACTION_REQUEST_WIFI_PICK = 81326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse "com.android.managedprovisioning.request_wifi_pick"; 8204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 83ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // Intent action used by the HomeReceiverActivity to notify this Service that a HOME intent was 84ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // received, which indicates that the Setup wizard has closed after provisioning completed. 85ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse protected static final String ACTION_HOME_INDIRECT = 86ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse "com.android.managedprovisioning.home_indirect"; 87ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 88326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse // Indicates whether provisioning has started. 89d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse private boolean mProvisioningInFlight = false; 90326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse 91326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse // MessageId of the last progress message. 92d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse private int mLastProgressMessage = -1; 93326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse 94326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse // MessageId of the last error message. 95d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse private int mLastErrorMessage = -1; 96326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse 97326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse // Indicates whether provisioning has finished succesfully (service waiting to stop). 98d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse private boolean mDone = false; 9904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 10028bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse // Provisioning tasks. 10128bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse private AddWifiNetworkTask mAddWifiNetworkTask; 10228bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse private DownloadPackageTask mDownloadPackageTask; 10328bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse private InstallPackageTask mInstallPackageTask; 10428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse private SetDevicePolicyTask mSetDevicePolicyTask; 10528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse private DeleteNonRequiredAppsTask mDeleteNonRequiredAppsTask; 10628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse 107d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse private ProvisioningParams mParams; 108d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse 109ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse private BroadcastReceiver mIndirectHomeReceiver; 110ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 11104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse @Override 11204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse public int onStartCommand(final Intent intent, int flags, int startId) { 113d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse ProvisionLogger.logd("Device owner provisioning service ONSTARTCOMMAND."); 114d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse 115d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse synchronized (this) { // Make operations on mProvisioningInFlight atomic. 116d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse if (mProvisioningInFlight) { 117d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse ProvisionLogger.logd("Provisioning already in flight."); 118d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse 119d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse sendProgressUpdateToActivity(); 120d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse 121d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse // Send error message if currently in error state. 122d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse if (mLastErrorMessage >= 0) { 123d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse sendError(); 124d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse } 125d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse 126326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse // Send success if provisioning was succesful. 127d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse if (mDone) { 128d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse onProvisioningSuccess(mParams.mDeviceAdminPackageName); 129d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse } 130d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse } else { 131d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse mProvisioningInFlight = true; 132d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse ProvisionLogger.logd("First start of the service."); 133d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse progressUpdate(R.string.progress_data_process); 134d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse 135d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse // Load the ProvisioningParams (from message in Intent). 136d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse mParams = (ProvisioningParams) intent.getParcelableExtra(EXTRA_PROVISIONING_PARAMS); 137d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse 138ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse registerHomeIntentReceiver(); 139ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 140d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse // Do the work on a separate thread. 141d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse new Thread(new Runnable() { 142d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse public void run() { 143d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse initializeProvisioningEnvironment(mParams); 144d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse startDeviceOwnerProvisioning(mParams); 145d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse } 146d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse }).start(); 14728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 14804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 14904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse return START_NOT_STICKY; 15004ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 15104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 152ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // Register the receiver for the ACTION_HOME_INDIRECT intent. 153ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // The ACTION_HOME_INDIRECT intent is used to notify this service that the home intent was send. 154ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // After receiving that intent we send the complete intent to the mdm. 155ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // Note: if we would send the complete intent earlier, the home intent can close the mdm. 156ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse private void registerHomeIntentReceiver() { 157ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse mIndirectHomeReceiver = new IndirectHomeReceiver(); 158ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse IntentFilter filter = new IntentFilter(); 159ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse filter.addAction(DeviceOwnerProvisioningService.ACTION_HOME_INDIRECT); 160ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse LocalBroadcastManager.getInstance(this).registerReceiver(mIndirectHomeReceiver, filter); 161ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse } 162ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 163ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse class IndirectHomeReceiver extends BroadcastReceiver { 164ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse @Override 165ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse public void onReceive(Context context, Intent intent) { 166ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse if (!mDone) { 167ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse return; 168ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse } 169ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 170ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // Disable the HomeReceiverActivity. It's no longer of use. 171ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse PackageManager pm = getPackageManager(); 172ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse pm.setComponentEnabledSetting(new ComponentName(DeviceOwnerProvisioningService.this, 173ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse HomeReceiverActivity.class), PackageManager 174ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse .COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 175ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 176ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // Send complete intent to mdm. 177ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse Intent result = new Intent(ACTION_PROFILE_PROVISIONING_COMPLETE); 178ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse result.setPackage(mParams.mDeviceAdminPackageName); 179ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse result.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES | 180ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse Intent.FLAG_RECEIVER_FOREGROUND); 181ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse if (mParams.mAdminExtrasBundle != null) { 182ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse result.putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, 183ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse mParams.mAdminExtrasBundle); 184ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse } 185ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse sendBroadcast(result); 186ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse stopSelf(); 187ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse } 188ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse } 189ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 190ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 19104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse /** 19204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse * This is the core method of this class. It goes through every provisioning step. 19304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse */ 194e96a820ff1c9ba76623c1964e3bb1e9eba7dd5eeSander Alewijnse private void startDeviceOwnerProvisioning(final ProvisioningParams params) { 19504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse ProvisionLogger.logd("Starting device owner provisioning"); 19604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 19704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse // Construct Tasks. Do not start them yet. 19828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse mAddWifiNetworkTask = new AddWifiNetworkTask(this, params.mWifiSsid, 19904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse params.mWifiHidden, params.mWifiSecurityType, params.mWifiPassword, 20028bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse params.mWifiProxyHost, params.mWifiProxyPort, params.mWifiProxyBypassHosts, 2012daab0a2c2bcb07a0595f93c4367ed1ca673e0e6Jason Monk params.mWifiPacUrl, new AddWifiNetworkTask.Callback() { 20228bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse @Override 20328bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse public void onSuccess() { 204aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse if (!TextUtils.isEmpty(params.mDeviceAdminPackageDownloadLocation)) { 205aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse // Download, install, set as device owner, delete apps. 206aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse progressUpdate(R.string.progress_download); 207aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse mDownloadPackageTask.run(); 208aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse } else { 209aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse // Device Admin will not be downloaded (but is already present): 210aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse // Just set as device owner, delete apps. 211aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse progressUpdate(R.string.progress_set_owner); 212aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse mSetDevicePolicyTask.run(); 213aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse } 21428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 21504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 21628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse @Override 21728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse public void onError(){ 21828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse error(R.string.device_owner_error_wifi); 21928bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 22028bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse }); 22128bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse 22228bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse mDownloadPackageTask = new DownloadPackageTask(this, 22356f7157c220d657d48406caf8e0d61904dfd7789Sander Alewijnse params.mDeviceAdminPackageDownloadLocation, params.mDeviceAdminPackageChecksum, 224d8dcb1f2cf3f537a6199671179470828f74236adSander Alewijnse params.mDeviceAdminPackageDownloadCookieHeader, new DownloadPackageTask.Callback() { 22528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse @Override 22628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse public void onSuccess() { 22728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse String downloadLocation = 22828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse mDownloadPackageTask.getDownloadedPackageLocation(); 22928bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse progressUpdate(R.string.progress_install); 230d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse mInstallPackageTask.run(downloadLocation); 23128bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 23204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 23328bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse @Override 23428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse public void onError(int errorCode) { 23528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse switch(errorCode) { 23628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse case DownloadPackageTask.ERROR_HASH_MISMATCH: 23728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse error(R.string.device_owner_error_hash_mismatch); 23828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse break; 23928bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse case DownloadPackageTask.ERROR_DOWNLOAD_FAILED: 24028bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse error(R.string.device_owner_error_download_failed); 24128bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse break; 24228bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse default: 24328bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse error(R.string.device_owner_error_general); 24428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse break; 24528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 24628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 24728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse }); 24804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 24928bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse mInstallPackageTask = new InstallPackageTask(this, 250cdf13b1826bd84f7d5c11ba14d14eb4889c2dda8Sander Alewijnse params.mDeviceAdminPackageName, 25128bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse new InstallPackageTask.Callback() { 25228bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse @Override 25328bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse public void onSuccess() { 25428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse progressUpdate(R.string.progress_set_owner); 25528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse mSetDevicePolicyTask.run(); 25628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 25704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 25828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse @Override 25928bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse public void onError(int errorCode) { 26028bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse switch(errorCode) { 26128bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse case InstallPackageTask.ERROR_PACKAGE_INVALID: 26228bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse error(R.string.device_owner_error_package_invalid); 26328bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse break; 26428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse case InstallPackageTask.ERROR_INSTALLATION_FAILED: 26528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse error(R.string.device_owner_error_installation_failed); 26628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse break; 26728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse default: 26828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse error(R.string.device_owner_error_general); 26928bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse break; 27028bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 27128bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 27228bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse }); 27304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 27428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse mSetDevicePolicyTask = new SetDevicePolicyTask(this, 27556f7157c220d657d48406caf8e0d61904dfd7789Sander Alewijnse params.mDeviceAdminPackageName, 27656f7157c220d657d48406caf8e0d61904dfd7789Sander Alewijnse getResources().getString(R.string.default_owned_device_username), 27728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse new SetDevicePolicyTask.Callback() { 27828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse @Override 27928bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse public void onSuccess() { 28028bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse mDeleteNonRequiredAppsTask.run(); 28128bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 28204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 28328bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse @Override 28428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse public void onError(int errorCode) { 28528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse switch(errorCode) { 28628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse case SetDevicePolicyTask.ERROR_PACKAGE_NOT_INSTALLED: 28728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse error(R.string.device_owner_error_package_not_installed); 28828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse break; 289cdf13b1826bd84f7d5c11ba14d14eb4889c2dda8Sander Alewijnse case SetDevicePolicyTask.ERROR_NO_RECEIVER: 290b6578e78ddd6950a7af450894e0105c49e1857efSander Alewijnse error(R.string.device_owner_error_package_invalid); 291cdf13b1826bd84f7d5c11ba14d14eb4889c2dda8Sander Alewijnse break; 29228bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse default: 29328bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse error(R.string.device_owner_error_general); 29428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse break; 29528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 29628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 29728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse }); 29828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse 2993ebb7b0557876ee6d8b59367f48ae4300a168811Nicolas Prevot mDeleteNonRequiredAppsTask = new DeleteNonRequiredAppsTask( 3003b76f0d34ed293c310605a66711cf3aba42f09e6Nicolas Prevot this, params.mDeviceAdminPackageName, UserHandle.USER_OWNER, 30128bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse R.array.required_apps_managed_device, R.array.vendor_required_apps_managed_device, 302418aaf4c4ff54e5f890bff004e120d8d5e5af755Nicolas Prevot true /* We are creating a new profile */, 3033b76f0d34ed293c310605a66711cf3aba42f09e6Nicolas Prevot false /* Do not disable INSTALL_SHORTCUT listeners */, 30428bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse new DeleteNonRequiredAppsTask.Callback() { 3052818d32aa494363a59d3b0f47695e317f47b689bSander Alewijnse public void onSuccess() { 3062818d32aa494363a59d3b0f47695e317f47b689bSander Alewijnse // Done with provisioning. Success. 307cdf13b1826bd84f7d5c11ba14d14eb4889c2dda8Sander Alewijnse onProvisioningSuccess(params.mDeviceAdminPackageName); 3082818d32aa494363a59d3b0f47695e317f47b689bSander Alewijnse } 3092818d32aa494363a59d3b0f47695e317f47b689bSander Alewijnse 31014eeef9ff6b961f4a746f2953dde1529ad27bc6aJessica Hummel @Override 3112818d32aa494363a59d3b0f47695e317f47b689bSander Alewijnse public void onError() { 3122818d32aa494363a59d3b0f47695e317f47b689bSander Alewijnse error(R.string.device_owner_error_general); 3132818d32aa494363a59d3b0f47695e317f47b689bSander Alewijnse }; 3143ebb7b0557876ee6d8b59367f48ae4300a168811Nicolas Prevot }); 3152818d32aa494363a59d3b0f47695e317f47b689bSander Alewijnse 31604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse // Start first task, which starts next task in its callback, etc. 317e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse startFirstTask(params); 318e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse } 319e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse 320e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse private void startFirstTask(final ProvisioningParams params) { 321aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse if (!TextUtils.isEmpty(params.mWifiSsid)) { 322e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse 323aa937503d97cae1f14a5c8dffff7e9444a1f52bdSander Alewijnse // Connect to wifi. 32404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse progressUpdate(R.string.progress_connect_to_wifi); 32528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse mAddWifiNetworkTask.run(); 326e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse } else if (!TextUtils.isEmpty(params.mDeviceAdminPackageDownloadLocation)) { 327e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse 328e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse // Download, install, set as device owner, delete apps. 329e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse progressUpdate(R.string.progress_download); 330e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse mDownloadPackageTask.run(); 33104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } else { 332e3866c7c1cc0feb307bb9822a313181aed7394beSander Alewijnse 333326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse // Device Admin will not be downloaded (but is already present): 334326bcfdd72218a2d3b35d8e1ca80b8e36263402eSander Alewijnse // Just set as device owner, delete apps. 33504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse progressUpdate(R.string.progress_set_owner); 33628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse mSetDevicePolicyTask.run(); 33704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 33804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 33904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 34004ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse private void error(int dialogMessage) { 341d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse mLastErrorMessage = dialogMessage; 342d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse sendError(); 343d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse // Wait for stopService() call from the activity. 344d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse } 34514eeef9ff6b961f4a746f2953dde1529ad27bc6aJessica Hummel 346d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse private void sendError() { 347d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse ProvisionLogger.logd("Reporting Error: " + getResources().getString(mLastErrorMessage)); 34804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse Intent intent = new Intent(ACTION_PROVISIONING_ERROR); 34914eeef9ff6b961f4a746f2953dde1529ad27bc6aJessica Hummel intent.setClass(this, DeviceOwnerProvisioningActivity.ServiceMessageReceiver.class); 350d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse intent.putExtra(EXTRA_USER_VISIBLE_ERROR_ID_KEY, mLastErrorMessage); 35181fe104ecfc98f1fb4356891acfe696e7445acb8Jessica Hummel LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 35204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 35304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 35404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse private void progressUpdate(int progressMessage) { 35528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse ProvisionLogger.logd("Reporting progress update: " 35628bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse + getResources().getString(progressMessage)); 35704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse mLastProgressMessage = progressMessage; 35804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse sendProgressUpdateToActivity(); 35904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 36004ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 36104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse private void sendProgressUpdateToActivity() { 36204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse Intent intent = new Intent(ACTION_PROGRESS_UPDATE); 36304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse intent.putExtra(EXTRA_PROGRESS_MESSAGE_ID_KEY, mLastProgressMessage); 36414eeef9ff6b961f4a746f2953dde1529ad27bc6aJessica Hummel intent.setClass(this, DeviceOwnerProvisioningActivity.ServiceMessageReceiver.class); 36581fe104ecfc98f1fb4356891acfe696e7445acb8Jessica Hummel LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 36604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 36704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 368cdf13b1826bd84f7d5c11ba14d14eb4889c2dda8Sander Alewijnse private void onProvisioningSuccess(String deviceAdminPackage) { 369d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse ProvisionLogger.logv("Reporting success."); 370d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse mDone = true; 371ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 372ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // Enable the HomeReceiverActivity, since the DeviceOwnerProvisioningActivity will shutdown 373ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // the Setup wizard soon, which will result in a home intent that should be caught by the 374ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse // HomeReceiverActivity. 375ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse PackageManager pm = getPackageManager(); 376ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse pm.setComponentEnabledSetting(new ComponentName(DeviceOwnerProvisioningService.this, 377ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse HomeReceiverActivity.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 378ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse PackageManager.DONT_KILL_APP); 379ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 38014eeef9ff6b961f4a746f2953dde1529ad27bc6aJessica Hummel Intent successIntent = new Intent(ACTION_PROVISIONING_SUCCESS); 38114eeef9ff6b961f4a746f2953dde1529ad27bc6aJessica Hummel successIntent.setClass(this, DeviceOwnerProvisioningActivity.ServiceMessageReceiver.class); 38281fe104ecfc98f1fb4356891acfe696e7445acb8Jessica Hummel LocalBroadcastManager.getInstance(this).sendBroadcast(successIntent); 383d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse // Wait for stopService() call from the activity. 38404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 38504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 38604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse private void initializeProvisioningEnvironment(ProvisioningParams params) { 38704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse setTimeAndTimezone(params.mTimeZone, params.mLocalTime); 38804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse setLocale(params.mLocale); 389639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse 390639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse // Start CDMA activation to enable phone calls. 391639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse final Intent intent = new Intent(ACTION_PERFORM_CDMA_PROVISIONING); 392639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 393639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse ProvisionLogger.logv("Starting cdma activation activity"); 394639e94c29c2ecddea815e2fc878331780086fc5eSander Alewijnse startActivity(intent); // Activity will be a Nop if not a CDMA device. 39504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 39604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 397d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse private void setTimeAndTimezone(String timeZone, long localTime) { 39804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse try { 39904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse final AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 40004ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse if (timeZone != null) { 40104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse ProvisionLogger.logd("Setting time zone to " + timeZone); 40204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse am.setTimeZone(timeZone); 40304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 404d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse if (localTime > 0) { 40504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse ProvisionLogger.logd("Setting time to " + localTime); 40604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse am.setTime(localTime); 40704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 40804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } catch (Exception e) { 40904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse ProvisionLogger.loge("Alarm manager failed to set the system time/timezone."); 41004ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse // Do not stop provisioning process, but ignore this error. 41104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 41204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 41304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 41404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse private void setLocale(Locale locale) { 41504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse if (locale == null || locale.equals(Locale.getDefault())) { 41604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse return; 41704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 41804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse try { 41904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse ProvisionLogger.logd("Setting locale to " + locale); 42004ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse // If locale is different from current locale this results in a configuration change, 42104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse // which will trigger the restarting of the activity. 42204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse LocalePicker.updateLocale(locale); 42304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } catch (Exception e) { 42404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse ProvisionLogger.loge("Failed to set the system locale."); 42504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse // Do not stop provisioning process, but ignore this error. 42604ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 42704ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 42804ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 42904ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse @Override 430d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse public void onCreate () { 431d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse ProvisionLogger.logd("Device owner provisioning service ONCREATE."); 432d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse } 433d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse 434d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse @Override 43528bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse public void onDestroy () { 436d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse ProvisionLogger.logd("Device owner provisioning service ONDESTROY"); 43728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse if (mAddWifiNetworkTask != null) { 438d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse mAddWifiNetworkTask.cleanUp(); 439d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse } 440d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse if (mDownloadPackageTask != null) { 441d70438542632a1c8df15bdd9d91bfee52bf2b655Sander Alewijnse mDownloadPackageTask.cleanUp(); 44228bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 443ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse if (mIndirectHomeReceiver != null) { 444ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse LocalBroadcastManager.getInstance(this).unregisterReceiver(mIndirectHomeReceiver); 445ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse mIndirectHomeReceiver = null; 446ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse } 447ab18ea7a517c14fd46fd211e81846326ff7b60d1Sander Alewijnse 44828bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse } 44928bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse 45028bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse @Override 45104ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse public IBinder onBind(Intent intent) { 45204ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse return null; 45304ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse } 45404ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse} 45504ab6fefe70534edfdd9d809fab45ea51a17526aSander Alewijnse 456