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