• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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.preprovisioning;
18 
19 
20 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SUPPORTED_MODES;
21 import static android.app.admin.DevicePolicyManager.FLAG_SUPPORTED_MODES_DEVICE_OWNER;
22 
23 import android.app.Activity;
24 import android.app.admin.DevicePolicyManager;
25 import android.content.DialogInterface;
26 import android.content.Intent;
27 import android.os.Bundle;
28 
29 import androidx.appcompat.app.AlertDialog;
30 
31 import com.android.managedprovisioning.R;
32 import com.android.managedprovisioning.common.ProvisionLogger;
33 import com.android.managedprovisioning.common.SettingsFacade;
34 import com.android.managedprovisioning.common.ThemedAlertDialog;
35 
36 import com.google.android.setupdesign.util.DeviceHelper;
37 
38 //TODO(b/181323689) Create tests for activity
39 //TODO(b/213177227) Extract business logic to a controller for testability
40 public class PreProvisioningActivityViaNfc extends Activity {
41     @Override
onCreate(Bundle savedInstanceState)42     protected void onCreate(Bundle savedInstanceState) {
43         super.onCreate(savedInstanceState);
44 
45         if (new SettingsFacade().isDeviceProvisioned(this)) {
46             ProvisionLogger.loge("Device already provisioned, aborting NFC provisioning.");
47             createDeviceAlreadySetupDialog().show();
48         } else {
49             Intent provisioningIntent = transformIntentToProvisioningIntent();
50             if (provisioningIntent != null) {
51                 Intent provisioningIntentWithAdditionalExtras =
52                         addAdditionalExtras(provisioningIntent);
53                 startActivity(provisioningIntentWithAdditionalExtras);
54                 finish();
55             } else {
56                 ProvisionLogger.loge("NFC tag data is invalid.");
57                 createCantSetupDeviceDialog().show();
58             }
59         }
60     }
61 
addAdditionalExtras(Intent provisioningIntent)62     private Intent addAdditionalExtras(Intent provisioningIntent) {
63         return new Intent(provisioningIntent).putExtra(
64                 EXTRA_PROVISIONING_SUPPORTED_MODES, FLAG_SUPPORTED_MODES_DEVICE_OWNER);
65     }
66 
transformIntentToProvisioningIntent()67     private Intent transformIntentToProvisioningIntent() {
68         DevicePolicyManager devicePolicyManager =
69                 getApplicationContext().getSystemService(DevicePolicyManager.class);
70         return devicePolicyManager.createProvisioningIntentFromNfcIntent(getIntent());
71     }
72 
createCantSetupDeviceDialog()73     private AlertDialog createCantSetupDeviceDialog() {
74         return ThemedAlertDialog.newBuilder(this)
75                 .setMessage(R.string.contact_your_admin_for_help)
76                 .setTitle(R.string.cant_set_up_device)
77                 .setPositiveButton(android.R.string.ok, createDialogOnClickListener())
78                 .setCancelable(false)
79                 .create();
80     }
81 
createDeviceAlreadySetupDialog()82     private AlertDialog createDeviceAlreadySetupDialog() {
83         var context = getApplicationContext();
84         return ThemedAlertDialog.newBuilder(this)
85                 .setMessage(R.string.if_questions_contact_admin)
86                 .setTitle(context.getString(
87                         R.string.device_already_set_up, DeviceHelper.getDeviceName(context)))
88                 .setPositiveButton(android.R.string.ok, createDialogOnClickListener())
89                 .setCancelable(false)
90                 .create();
91     }
92 
createDialogOnClickListener()93     private DialogInterface.OnClickListener createDialogOnClickListener() {
94         return (dialog, id) -> finish();
95     }
96 }
97