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 static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
20 
21 import android.annotation.UserIdInt;
22 import android.app.Activity;
23 import android.app.admin.DevicePolicyManager;
24 import android.content.ComponentName;
25 import android.content.Context;
26 import android.content.DialogInterface;
27 import android.os.Process;
28 import android.os.UserHandle;
29 import android.view.LayoutInflater;
30 import android.view.View;
31 import android.view.ViewGroup;
32 import android.widget.ImageView;
33 import android.widget.TextView;
34 
35 import androidx.annotation.NonNull;
36 import androidx.annotation.VisibleForTesting;
37 import androidx.appcompat.app.AlertDialog;
38 
39 import com.android.settings.R;
40 import com.android.settingslib.RestrictedLockUtils;
41 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
42 import com.android.settingslib.RestrictedLockUtilsInternal;
43 import com.android.settingslib.Utils;
44 import com.android.settingslib.enterprise.ActionDisabledByAdminController;
45 import com.android.settingslib.enterprise.ActionDisabledByAdminControllerFactory;
46 
47 import java.util.Objects;
48 
49 /**
50  * Helper class for {@link ActionDisabledByAdminDialog} which sets up the dialog.
51  */
52 public final class ActionDisabledByAdminDialogHelper {
53 
54     private static final String TAG = ActionDisabledByAdminDialogHelper.class.getName();
55     @VisibleForTesting EnforcedAdmin mEnforcedAdmin;
56     private ViewGroup mDialogView;
57     private String mRestriction;
58     private final ActionDisabledByAdminController mActionDisabledByAdminController;
59     private final Activity mActivity;
60 
ActionDisabledByAdminDialogHelper(Activity activity)61     public ActionDisabledByAdminDialogHelper(Activity activity) {
62         this(activity, null /* restriction */);
63     }
64 
ActionDisabledByAdminDialogHelper(Activity activity, String restriction)65     public ActionDisabledByAdminDialogHelper(Activity activity, String restriction) {
66         mActivity = activity;
67         mDialogView = (ViewGroup) LayoutInflater.from(mActivity).inflate(
68                 R.layout.support_details_dialog, null);
69         mActionDisabledByAdminController = ActionDisabledByAdminControllerFactory
70                 .createInstance(mActivity, restriction,
71                         new DeviceAdminStringProviderImpl(mActivity),
72                         UserHandle.SYSTEM);
73         DevicePolicyManager devicePolicyManager =
74                 mActivity.getSystemService(DevicePolicyManager.class);
75 
76         TextView title = mDialogView.findViewById(R.id.admin_support_dialog_title);
77         title.setText(devicePolicyManager.getResources().getString(DISABLED_BY_IT_ADMIN_TITLE,
78                 () -> mActivity.getString(R.string.disabled_by_policy_title)));
79 
80     }
81 
getEnforcementAdminUserId(@onNull EnforcedAdmin admin)82     private @UserIdInt int getEnforcementAdminUserId(@NonNull EnforcedAdmin admin) {
83         return admin.user == null ? UserHandle.USER_NULL : admin.user.getIdentifier();
84     }
85 
getEnforcementAdminUserId()86     private @UserIdInt int getEnforcementAdminUserId() {
87         return getEnforcementAdminUserId(mEnforcedAdmin);
88     }
89 
prepareDialogBuilder(String restriction, EnforcedAdmin enforcedAdmin)90     public AlertDialog.Builder prepareDialogBuilder(String restriction,
91             EnforcedAdmin enforcedAdmin) {
92         DialogInterface.OnClickListener listener = mActionDisabledByAdminController
93                 .getPositiveButtonListener(mActivity, enforcedAdmin);
94         AlertDialog.Builder builder = new AlertDialog.Builder(mActivity)
95                 .setPositiveButton(listener == null
96                         ? R.string.suggestion_button_close : R.string.okay, listener)
97                 .setView(mDialogView);
98         prepareDialogBuilder(builder, restriction, enforcedAdmin);
99         return builder;
100     }
101 
102     @VisibleForTesting
prepareDialogBuilder(AlertDialog.Builder builder, String restriction, EnforcedAdmin enforcedAdmin)103     void prepareDialogBuilder(AlertDialog.Builder builder, String restriction,
104             EnforcedAdmin enforcedAdmin) {
105         mActionDisabledByAdminController.initialize(
106                 new ActionDisabledLearnMoreButtonLauncherImpl(mActivity, builder));
107 
108         mEnforcedAdmin = enforcedAdmin;
109         mRestriction = restriction;
110         initializeDialogViews(mDialogView, mEnforcedAdmin, getEnforcementAdminUserId(),
111                 mRestriction);
112         mActionDisabledByAdminController.setupLearnMoreButton(mActivity);
113     }
114 
updateDialog(String restriction, EnforcedAdmin admin)115     public void updateDialog(String restriction, EnforcedAdmin admin) {
116         if (mEnforcedAdmin.equals(admin) && Objects.equals(mRestriction, restriction)) {
117             return;
118         }
119         mEnforcedAdmin = admin;
120         mRestriction = restriction;
121         initializeDialogViews(mDialogView, mEnforcedAdmin, getEnforcementAdminUserId(),
122                 mRestriction);
123     }
124 
initializeDialogViews(View root, EnforcedAdmin enforcedAdmin, int userId, String restriction)125     private void initializeDialogViews(View root, EnforcedAdmin enforcedAdmin, int userId,
126             String restriction) {
127         ComponentName admin = enforcedAdmin.component;
128         if (admin == null) {
129             return;
130         }
131 
132         mActionDisabledByAdminController.updateEnforcedAdmin(enforcedAdmin, userId);
133         setAdminSupportIcon(root, admin, userId);
134 
135         if (isNotCurrentUserOrProfile(admin, userId)) {
136             admin = null;
137         }
138 
139         setAdminSupportTitle(root, restriction);
140 
141         final UserHandle user;
142         if (userId == UserHandle.USER_NULL) {
143             user = null;
144         } else {
145             user = UserHandle.of(userId);
146         }
147 
148         setAdminSupportDetails(mActivity, root, new EnforcedAdmin(admin, user));
149     }
150 
isNotCurrentUserOrProfile(ComponentName admin, int userId)151     private boolean isNotCurrentUserOrProfile(ComponentName admin, int userId) {
152         return !RestrictedLockUtilsInternal.isAdminInCurrentUserOrProfile(mActivity, admin)
153                 || !RestrictedLockUtils.isCurrentUserOrProfile(mActivity, userId);
154     }
155 
156     @VisibleForTesting
setAdminSupportIcon(View root, ComponentName admin, int userId)157     void setAdminSupportIcon(View root, ComponentName admin, int userId) {
158         ImageView supportIconView = root.requireViewById(R.id.admin_support_icon);
159         supportIconView.setImageDrawable(
160                 mActivity.getDrawable(R.drawable.ic_lock_closed));
161 
162         supportIconView.setImageTintList(Utils.getColorAccent(mActivity));
163     }
164 
165     @VisibleForTesting
setAdminSupportTitle(View root, String restriction)166     void setAdminSupportTitle(View root, String restriction) {
167         final TextView titleView = root.findViewById(R.id.admin_support_dialog_title);
168         if (titleView == null) {
169             return;
170         }
171         titleView.setText(mActionDisabledByAdminController.getAdminSupportTitle(restriction));
172     }
173 
174     @VisibleForTesting
setAdminSupportDetails(final Activity activity, final View root, final EnforcedAdmin enforcedAdmin)175     void setAdminSupportDetails(final Activity activity, final View root,
176             final EnforcedAdmin enforcedAdmin) {
177         if (enforcedAdmin == null || enforcedAdmin.component == null) {
178             return;
179         }
180 
181         final DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService(
182                 Context.DEVICE_POLICY_SERVICE);
183         CharSequence supportMessage = null;
184         if (!RestrictedLockUtilsInternal.isAdminInCurrentUserOrProfile(activity,
185                 enforcedAdmin.component) || !RestrictedLockUtils.isCurrentUserOrProfile(
186                 activity, getEnforcementAdminUserId(enforcedAdmin))) {
187             enforcedAdmin.component = null;
188         } else {
189             if (enforcedAdmin.user == null) {
190                 enforcedAdmin.user = UserHandle.of(UserHandle.myUserId());
191             }
192             if (UserHandle.isSameApp(Process.myUid(), Process.SYSTEM_UID)) {
193                 supportMessage = dpm.getShortSupportMessageForUser(enforcedAdmin.component,
194                         getEnforcementAdminUserId(enforcedAdmin));
195             }
196         }
197         final CharSequence supportContentString =
198                 mActionDisabledByAdminController.getAdminSupportContentString(
199                         mActivity, supportMessage);
200         final TextView textView = root.findViewById(R.id.admin_support_msg);
201         if (supportContentString != null) {
202             textView.setText(supportContentString);
203         }
204     }
205 }
206