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