• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.managedprovisioning;
2 /*
3  * Copyright 2015, The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 import android.annotation.Nullable;
19 import android.app.Dialog;
20 import android.app.DialogFragment;
21 import android.content.ComponentName;
22 import android.content.DialogInterface;
23 import android.graphics.drawable.Drawable;
24 import android.os.Bundle;
25 import android.view.View;
26 import android.view.View.OnClickListener;
27 import android.widget.Button;
28 import android.widget.ImageView;
29 import android.widget.TextView;
30 
31 import com.android.managedprovisioning.common.MdmPackageInfo;
32 import com.android.managedprovisioning.common.Utils;
33 import com.android.setupwizardlib.util.SystemBarHelper;
34 
35 /**
36  * Displays information about an existing managed profile and asks the user if it should be deleted.
37  *
38  * <p>Expects parent component to implement {@link DeleteManagedProfileCallback} for user-response
39  * handling.
40  */
41 public class DeleteManagedProfileDialog extends DialogFragment {
42     private static final String KEY_USER_PROFILE_CALLBACK_ID = "user_profile_callback_id";
43     private static final String KEY_MDM_PACKAGE_NAME = "mdm_package_name";
44     private static final String KEY_PROFILE_OWNER_DOMAIN = "profile_owner_domain";
45 
46     private final Utils mUtils = new Utils();
47 
48     /**
49      * @param managedProfileUserId user-id for the managed profile which will be passed back to the
50      *     parent component in the {@link DeleteManagedProfileCallback#onRemoveProfileApproval(int)}
51      *     call
52      * @param mdmPackagename package name of the MDM application for the current managed profile, or
53      *     null if the managed profile has no profile owner associated.
54      * @param profileOwnerDomain domain name of the organization which owns the managed profile, or
55      *     null if not known
56      * @return initialized dialog
57      */
newInstance( int managedProfileUserId, @Nullable ComponentName mdmPackagename, @Nullable String profileOwnerDomain)58     public static DeleteManagedProfileDialog newInstance(
59             int managedProfileUserId, @Nullable ComponentName mdmPackagename,
60             @Nullable String profileOwnerDomain) {
61         Bundle args = new Bundle();
62         args.putInt(KEY_USER_PROFILE_CALLBACK_ID, managedProfileUserId);
63         // The device could be in a inconsistent state where it has a managed profile but no
64         // associated profile owner package, for example after an unexpected reboot in the middle
65         // of provisioning.
66         if (mdmPackagename != null) {
67             args.putString(KEY_MDM_PACKAGE_NAME, mdmPackagename.getPackageName());
68         }
69         args.putString(KEY_PROFILE_OWNER_DOMAIN, profileOwnerDomain);
70 
71         DeleteManagedProfileDialog dialog = new DeleteManagedProfileDialog();
72         dialog.setArguments(args);
73         return dialog;
74     }
75 
76     @Override
onCreateDialog(Bundle savedInstanceState)77     public Dialog onCreateDialog(Bundle savedInstanceState) {
78         if (!(getActivity() instanceof DeleteManagedProfileCallback)) {
79             throw new IllegalStateException("Calling activity must implement " +
80                     "DeleteManagedProfileCallback, found: " + getActivity().getLocalClassName());
81         }
82 
83         Bundle arguments = getArguments();
84         final int callbackUserProfileId = arguments.getInt(KEY_USER_PROFILE_CALLBACK_ID);
85         String mdmPackageName = arguments.getString(KEY_MDM_PACKAGE_NAME);
86 
87         String appLabel;
88         Drawable appIcon;
89         MdmPackageInfo mdmPackageInfo = null;
90         if (mdmPackageName != null) {
91             mdmPackageInfo = MdmPackageInfo.createFromPackageName(getActivity(), mdmPackageName);
92         }
93         if (mdmPackageInfo != null) {
94             appLabel = mdmPackageInfo.appLabel;
95             appIcon = mdmPackageInfo.packageIcon;
96         } else {
97             appLabel= getResources().getString(android.R.string.unknownName);
98             appIcon = getActivity().getPackageManager().getDefaultActivityIcon();
99         }
100 
101         final Dialog dialog = new Dialog(getActivity(), R.style.ManagedProvisioningDialogTheme);
102         dialog.setTitle(R.string.delete_profile_title);
103         dialog.setContentView(R.layout.delete_managed_profile_dialog);
104         dialog.setCanceledOnTouchOutside(false);
105         if (!mUtils.isUserSetupCompleted(getActivity())) {
106             SystemBarHelper.hideSystemBars(dialog);
107         }
108 
109         ImageView imageView = (ImageView) dialog.findViewById(
110                 R.id.device_manager_icon_view);
111         imageView.setImageDrawable(appIcon);
112         imageView.setContentDescription(
113                     getResources().getString(R.string.mdm_icon_label, appLabel));
114 
115         TextView deviceManagerName = (TextView) dialog.findViewById(
116                 R.id.device_manager_name);
117         deviceManagerName.setText(appLabel);
118 
119         Button positiveButton = (Button) dialog.findViewById(
120                 R.id.delete_managed_profile_positive_button);
121         positiveButton.setOnClickListener(new OnClickListener() {
122                 @Override
123                 public void onClick(View v) {
124                     dialog.dismiss();
125                     ((DeleteManagedProfileCallback) getActivity())
126                             .onRemoveProfileApproval(callbackUserProfileId);
127                 }
128             });
129 
130         Button negativeButton = (Button) dialog.findViewById(
131                 R.id.delete_managed_profile_negative_button);
132         negativeButton.setOnClickListener(new OnClickListener() {
133                 @Override
134                 public void onClick(View v) {
135                     dialog.dismiss();
136                     ((DeleteManagedProfileCallback) getActivity()).onRemoveProfileCancel();
137                 }
138             });
139 
140         return dialog;
141     }
142 
143     @Override
onCancel(DialogInterface dialog)144     public void onCancel(DialogInterface dialog) {
145         dialog.dismiss();
146         ((DeleteManagedProfileCallback) getActivity()).onRemoveProfileCancel();
147     }
148 
149     /**
150      * Callback interface for outcome of {@link DeleteManagedProfileDialog} presentation.
151      */
152     public interface DeleteManagedProfileCallback {
153 
154         /**
155          * Invoked if the user hits the positive response (perform removal) button.
156          *
157          * @param managedProfileUserId user-id of the managed-profile that the dialog was presented
158          *                             for
159          */
onRemoveProfileApproval(int managedProfileUserId)160         public abstract void onRemoveProfileApproval(int managedProfileUserId);
161 
162         /**
163          * Invoked if the user hits the negative response (DO NOT perform removal) button, or the
164          * dialog was otherwise dismissed.
165          */
onRemoveProfileCancel()166         public abstract void onRemoveProfileCancel();
167     }
168 }
169