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