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