• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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.settings.enterprise;
18 
19 import android.app.Activity;
20 import android.app.AlertDialog;
21 import android.app.admin.DevicePolicyManager;
22 import android.content.ComponentName;
23 import android.content.Context;
24 import android.content.Intent;
25 import android.graphics.drawable.Drawable;
26 import android.os.Process;
27 import android.os.UserHandle;
28 import android.os.UserManager;
29 import android.support.annotation.VisibleForTesting;
30 import android.util.IconDrawableFactory;
31 import android.view.LayoutInflater;
32 import android.view.View;
33 import android.view.ViewGroup;
34 import android.widget.ImageView;
35 import android.widget.TextView;
36 
37 import com.android.settings.DeviceAdminAdd;
38 import com.android.settings.R;
39 import com.android.settings.Settings;
40 import com.android.settings.Utils;
41 import com.android.settingslib.RestrictedLockUtils;
42 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
43 
44 import java.util.Objects;
45 
46 /**
47  * Helper class for {@link ActionDisabledByAdminDialog} which sets up the dialog.
48  */
49 public class ActionDisabledByAdminDialogHelper {
50 
51     private static final String TAG = ActionDisabledByAdminDialogHelper.class.getName();
52     private EnforcedAdmin mEnforcedAdmin;
53     private ViewGroup mDialogView;
54     private String mRestriction = null;
55     private Activity mActivity;
56 
ActionDisabledByAdminDialogHelper(Activity activity)57     public ActionDisabledByAdminDialogHelper(Activity activity) {
58         mActivity = activity;
59     }
60 
prepareDialogBuilder(String restriction, EnforcedAdmin enforcedAdmin)61     public AlertDialog.Builder prepareDialogBuilder(String restriction,
62             EnforcedAdmin enforcedAdmin) {
63         mEnforcedAdmin = enforcedAdmin;
64         mRestriction = restriction;
65 
66         final AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
67         mDialogView = (ViewGroup) LayoutInflater.from(builder.getContext()).inflate(
68                 R.layout.admin_support_details_dialog, null);
69         initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId,
70                 mRestriction);
71         return builder
72             .setPositiveButton(R.string.okay, null)
73             .setNeutralButton(R.string.learn_more,
74                     (dialog, which) -> {
75                         showAdminPolicies(mEnforcedAdmin, mActivity);
76                         mActivity.finish();
77                     })
78             .setView(mDialogView);
79     }
80 
updateDialog(String restriction, EnforcedAdmin admin)81     public void updateDialog(String restriction, EnforcedAdmin admin) {
82         if (mEnforcedAdmin.equals(admin) && Objects.equals(mRestriction, restriction)) {
83             return;
84         }
85         mEnforcedAdmin = admin;
86         mRestriction = restriction;
87         initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId,
88                 mRestriction);
89     }
90 
initializeDialogViews(View root, ComponentName admin, int userId, String restriction)91     private void initializeDialogViews(View root, ComponentName admin, int userId,
92             String restriction) {
93         if (admin == null) {
94             return;
95         }
96         if (!RestrictedLockUtils.isAdminInCurrentUserOrProfile(mActivity, admin)
97                 || !RestrictedLockUtils.isCurrentUserOrProfile(mActivity, userId)) {
98             admin = null;
99         } else {
100             final Drawable badgedIcon = Utils.getBadgedIcon(
101                     IconDrawableFactory.newInstance(mActivity),
102                     mActivity.getPackageManager(),
103                     admin.getPackageName(),
104                     userId);
105             ((ImageView) root.findViewById(R.id.admin_support_icon)).setImageDrawable(badgedIcon);
106         }
107 
108         setAdminSupportTitle(root, restriction);
109         setAdminSupportDetails(mActivity, root, new EnforcedAdmin(admin, userId));
110     }
111 
112     @VisibleForTesting
setAdminSupportTitle(View root, String restriction)113     void setAdminSupportTitle(View root, String restriction) {
114         final TextView titleView = root.findViewById(R.id.admin_support_dialog_title);
115         if (titleView == null) {
116             return;
117         }
118         if (restriction == null) {
119             titleView.setText(R.string.disabled_by_policy_title);
120             return;
121         }
122         switch (restriction) {
123             case UserManager.DISALLOW_ADJUST_VOLUME:
124                 titleView.setText(R.string.disabled_by_policy_title_adjust_volume);
125                 break;
126             case UserManager.DISALLOW_OUTGOING_CALLS:
127                 titleView.setText(R.string.disabled_by_policy_title_outgoing_calls);
128                 break;
129             case UserManager.DISALLOW_SMS:
130                 titleView.setText(R.string.disabled_by_policy_title_sms);
131                 break;
132             case DevicePolicyManager.POLICY_DISABLE_CAMERA:
133                 titleView.setText(R.string.disabled_by_policy_title_camera);
134                 break;
135             case DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE:
136                 titleView.setText(R.string.disabled_by_policy_title_screen_capture);
137                 break;
138             case DevicePolicyManager.POLICY_MANDATORY_BACKUPS:
139                 titleView.setText(R.string.disabled_by_policy_title_turn_off_backups);
140                 break;
141             case DevicePolicyManager.POLICY_SUSPEND_PACKAGES:
142                 titleView.setText(R.string.disabled_by_policy_title_suspend_packages);
143                 break;
144             default:
145                 // Use general text if no specialized title applies
146                 titleView.setText(R.string.disabled_by_policy_title);
147         }
148     }
149 
150     @VisibleForTesting
setAdminSupportDetails(final Activity activity, final View root, final EnforcedAdmin enforcedAdmin)151     void setAdminSupportDetails(final Activity activity, final View root,
152             final EnforcedAdmin enforcedAdmin) {
153         if (enforcedAdmin == null || enforcedAdmin.component == null) {
154             return;
155         }
156         final DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService(
157                 Context.DEVICE_POLICY_SERVICE);
158         if (!RestrictedLockUtils.isAdminInCurrentUserOrProfile(activity,
159                 enforcedAdmin.component) || !RestrictedLockUtils.isCurrentUserOrProfile(
160                 activity, enforcedAdmin.userId)) {
161             enforcedAdmin.component = null;
162         } else {
163             if (enforcedAdmin.userId == UserHandle.USER_NULL) {
164                 enforcedAdmin.userId = UserHandle.myUserId();
165             }
166             CharSequence supportMessage = null;
167             if (UserHandle.isSameApp(Process.myUid(), Process.SYSTEM_UID)) {
168                 supportMessage = dpm.getShortSupportMessageForUser(
169                         enforcedAdmin.component, enforcedAdmin.userId);
170             }
171             if (supportMessage != null) {
172                 final TextView textView = root.findViewById(R.id.admin_support_msg);
173                 textView.setText(supportMessage);
174             }
175         }
176     }
177 
178     @VisibleForTesting
showAdminPolicies(final EnforcedAdmin enforcedAdmin, final Activity activity)179     void showAdminPolicies(final EnforcedAdmin enforcedAdmin, final Activity activity) {
180         final Intent intent = new Intent();
181         if (enforcedAdmin.component != null) {
182             intent.setClass(activity, DeviceAdminAdd.class);
183             intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
184                     enforcedAdmin.component);
185             intent.putExtra(DeviceAdminAdd.EXTRA_CALLED_FROM_SUPPORT_DIALOG, true);
186             // DeviceAdminAdd class may need to run as managed profile.
187             activity.startActivityAsUser(intent,
188                     new UserHandle(enforcedAdmin.userId));
189         } else {
190             intent.setClass(activity, Settings.DeviceAdminSettingsActivity.class);
191             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
192             // Activity merges both managed profile and parent users
193             // admins so show as same user as this activity.
194             activity.startActivity(intent);
195         }
196     }
197 }
198