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