1 /* 2 * Copyright (C) 2021 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.settingslib.enterprise; 18 19 import static java.util.Objects.requireNonNull; 20 21 import android.app.admin.DevicePolicyManager; 22 import android.content.Context; 23 import android.content.pm.PackageManager; 24 import android.os.UserHandle; 25 import android.os.UserManager; 26 import android.text.TextUtils; 27 28 import androidx.annotation.Nullable; 29 30 import com.android.settingslib.enterprise.ActionDisabledLearnMoreButtonLauncher.ResolveActivityChecker; 31 32 33 /** 34 * An {@link ActionDisabledByAdminController} to be used with managed devices. 35 */ 36 final class ManagedDeviceActionDisabledByAdminController 37 extends BaseActionDisabledByAdminController { 38 39 interface ForegroundUserChecker { isUserForeground(Context context, UserHandle userHandle)40 boolean isUserForeground(Context context, UserHandle userHandle); 41 } 42 43 public final static ForegroundUserChecker DEFAULT_FOREGROUND_USER_CHECKER = 44 ManagedDeviceActionDisabledByAdminController::isUserForeground; 45 46 /** 47 * The {@link UserHandle} which is preferred for launching the web help page in 48 * <p>If not able to launch the web help page in this user, the current user will be used as 49 * fallback instead. If the current user cannot open it either, the admin policies page will 50 * be used instead. 51 */ 52 private final UserHandle mPreferredUserHandle; 53 54 private final ForegroundUserChecker mForegroundUserChecker; 55 private final ResolveActivityChecker mResolveActivityChecker; 56 57 /** 58 * Constructs a {@link ManagedDeviceActionDisabledByAdminController} 59 * @param preferredUserHandle - user on which to launch the help web page, if necessary 60 */ ManagedDeviceActionDisabledByAdminController( DeviceAdminStringProvider stringProvider, UserHandle preferredUserHandle, ForegroundUserChecker foregroundUserChecker, ResolveActivityChecker resolveActivityChecker)61 ManagedDeviceActionDisabledByAdminController( 62 DeviceAdminStringProvider stringProvider, 63 UserHandle preferredUserHandle, 64 ForegroundUserChecker foregroundUserChecker, 65 ResolveActivityChecker resolveActivityChecker) { 66 super(stringProvider); 67 mPreferredUserHandle = requireNonNull(preferredUserHandle); 68 mForegroundUserChecker = requireNonNull(foregroundUserChecker); 69 mResolveActivityChecker = requireNonNull(resolveActivityChecker); 70 } 71 72 @Override setupLearnMoreButton(Context context)73 public void setupLearnMoreButton(Context context) { 74 assertInitialized(); 75 76 String url = mStringProvider.getLearnMoreHelpPageUrl(); 77 78 if (!TextUtils.isEmpty(url) 79 && canLaunchHelpPageInPreferredOrCurrentUser(context, url, mPreferredUserHandle)) { 80 setupLearnMoreButtonToLaunchHelpPage(context, url, mPreferredUserHandle); 81 } else { 82 mLauncher.setupLearnMoreButtonToShowAdminPolicies(context, mEnforcementAdminUserId, 83 mEnforcedAdmin); 84 } 85 } 86 canLaunchHelpPageInPreferredOrCurrentUser( Context context, String url, UserHandle preferredUserHandle)87 private boolean canLaunchHelpPageInPreferredOrCurrentUser( 88 Context context, String url, UserHandle preferredUserHandle) { 89 PackageManager packageManager = context.getPackageManager(); 90 if (mLauncher.canLaunchHelpPage( 91 packageManager, url, preferredUserHandle, mResolveActivityChecker) 92 && mForegroundUserChecker.isUserForeground(context, preferredUserHandle)) { 93 return true; 94 } 95 return mLauncher.canLaunchHelpPage( 96 packageManager, url, context.getUser(), mResolveActivityChecker); 97 } 98 99 /** 100 * Sets up the "Learn more" button to launch the web help page in the {@code 101 * preferredUserHandle} user. If not possible to launch it there, it sets up the button to 102 * launch it in the current user instead. 103 */ setupLearnMoreButtonToLaunchHelpPage( Context context, String url, UserHandle preferredUserHandle)104 private void setupLearnMoreButtonToLaunchHelpPage( 105 Context context, String url, UserHandle preferredUserHandle) { 106 PackageManager packageManager = context.getPackageManager(); 107 if (mLauncher.canLaunchHelpPage( 108 packageManager, url, preferredUserHandle, mResolveActivityChecker) 109 && mForegroundUserChecker.isUserForeground(context, preferredUserHandle)) { 110 mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url, preferredUserHandle); 111 } 112 if (mLauncher.canLaunchHelpPage( 113 packageManager, url, context.getUser(), mResolveActivityChecker)) { 114 mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url, context.getUser()); 115 } 116 } 117 isUserForeground(Context context, UserHandle userHandle)118 private static boolean isUserForeground(Context context, UserHandle userHandle) { 119 return context.createContextAsUser(userHandle, /* flags= */ 0) 120 .getSystemService(UserManager.class).isUserForeground(); 121 } 122 123 @Override getAdminSupportTitle(@ullable String restriction)124 public String getAdminSupportTitle(@Nullable String restriction) { 125 if (restriction == null) { 126 return mStringProvider.getDefaultDisabledByPolicyTitle(); 127 } 128 switch (restriction) { 129 case UserManager.DISALLOW_ADJUST_VOLUME: 130 return mStringProvider.getDisallowAdjustVolumeTitle(); 131 case UserManager.DISALLOW_OUTGOING_CALLS: 132 return mStringProvider.getDisallowOutgoingCallsTitle(); 133 case UserManager.DISALLOW_SMS: 134 return mStringProvider.getDisallowSmsTitle(); 135 case DevicePolicyManager.POLICY_DISABLE_CAMERA: 136 return mStringProvider.getDisableCameraTitle(); 137 case DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE: 138 return mStringProvider.getDisableScreenCaptureTitle(); 139 case DevicePolicyManager.POLICY_SUSPEND_PACKAGES: 140 return mStringProvider.getSuspendPackagesTitle(); 141 default: 142 return mStringProvider.getDefaultDisabledByPolicyTitle(); 143 } 144 } 145 146 @Override getAdminSupportContentString(Context context, CharSequence supportMessage)147 public CharSequence getAdminSupportContentString(Context context, CharSequence supportMessage) { 148 return supportMessage != null 149 ? supportMessage 150 : mStringProvider.getDefaultDisabledByPolicyContent(); 151 } 152 } 153