diff --git a/packages/SettingsLib/lint-baseline.xml b/packages/SettingsLib/lint-baseline.xml
index f6d6ca62e78c4..3691d0bd9831a 100644
--- a/packages/SettingsLib/lint-baseline.xml
+++ b/packages/SettingsLib/lint-baseline.xml
@@ -892,4 +892,15 @@
column="59"/>
+
If not able to launch the web help page in this user, the current user will be used as + * fallback instead. If the current user cannot open it either, the admin policies page will + * be used instead. + */ + private final UserHandle mPreferredUserHandle; + + private final ForegroundUserChecker mForegroundUserChecker; + private final ResolveActivityChecker mResolveActivityChecker; /** * Constructs a {@link ManagedDeviceActionDisabledByAdminController} - * @param userHandle - user on which to launch the help web page, if necessary + * @param preferredUserHandle - user on which to launch the help web page, if necessary */ ManagedDeviceActionDisabledByAdminController( DeviceAdminStringProvider stringProvider, - UserHandle userHandle) { + UserHandle preferredUserHandle, + ForegroundUserChecker foregroundUserChecker, + ResolveActivityChecker resolveActivityChecker) { super(stringProvider); - mUserHandle = requireNonNull(userHandle); + mPreferredUserHandle = requireNonNull(preferredUserHandle); + mForegroundUserChecker = requireNonNull(foregroundUserChecker); + mResolveActivityChecker = requireNonNull(resolveActivityChecker); } @Override @@ -53,14 +74,52 @@ final class ManagedDeviceActionDisabledByAdminController assertInitialized(); String url = mStringProvider.getLearnMoreHelpPageUrl(); - if (TextUtils.isEmpty(url)) { + + if (!TextUtils.isEmpty(url) + && canLaunchHelpPageInPreferredOrCurrentUser(context, url, mPreferredUserHandle)) { + setupLearnMoreButtonToLaunchHelpPage(context, url, mPreferredUserHandle); + } else { mLauncher.setupLearnMoreButtonToShowAdminPolicies(context, mEnforcementAdminUserId, mEnforcedAdmin); - } else { - mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url, mUserHandle); } } + private boolean canLaunchHelpPageInPreferredOrCurrentUser( + Context context, String url, UserHandle preferredUserHandle) { + PackageManager packageManager = context.getPackageManager(); + if (mLauncher.canLaunchHelpPage( + packageManager, url, preferredUserHandle, mResolveActivityChecker) + && mForegroundUserChecker.isUserForeground(context, preferredUserHandle)) { + return true; + } + return mLauncher.canLaunchHelpPage( + packageManager, url, context.getUser(), mResolveActivityChecker); + } + + /** + * Sets up the "Learn more" button to launch the web help page in the {@code + * preferredUserHandle} user. If not possible to launch it there, it sets up the button to + * launch it in the current user instead. + */ + private void setupLearnMoreButtonToLaunchHelpPage( + Context context, String url, UserHandle preferredUserHandle) { + PackageManager packageManager = context.getPackageManager(); + if (mLauncher.canLaunchHelpPage( + packageManager, url, preferredUserHandle, mResolveActivityChecker) + && mForegroundUserChecker.isUserForeground(context, preferredUserHandle)) { + mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url, preferredUserHandle); + } + if (mLauncher.canLaunchHelpPage( + packageManager, url, context.getUser(), mResolveActivityChecker)) { + mLauncher.setupLearnMoreButtonToLaunchHelpPage(context, url, context.getUser()); + } + } + + private static boolean isUserForeground(Context context, UserHandle userHandle) { + return context.createContextAsUser(userHandle, /* flags= */ 0) + .getSystemService(UserManager.class).isUserForeground(); + } + @Override public String getAdminSupportTitle(@Nullable String restriction) { if (restriction == null) { diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java index d9be4f336797d..509e12d241ddd 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java @@ -30,6 +30,8 @@ import static com.google.common.truth.Truth.assertThat; import android.app.Activity; import android.content.Context; +import android.content.pm.ResolveInfo; +import android.os.UserHandle; import android.os.UserManager; import androidx.test.core.app.ApplicationProvider; @@ -45,9 +47,11 @@ import org.robolectric.android.controller.ActivityController; @RunWith(RobolectricTestRunner.class) public class ManagedDeviceActionDisabledByAdminControllerTest { + private static UserHandle MANAGED_USER = UserHandle.of(123); private static final String RESTRICTION = UserManager.DISALLOW_ADJUST_VOLUME; private static final String EMPTY_URL = ""; private static final String SUPPORT_TITLE_FOR_RESTRICTION = DISALLOW_ADJUST_VOLUME_TITLE; + public static final ResolveInfo TEST_RESULT_INFO = new ResolveInfo(); private final Context mContext = ApplicationProvider.getApplicationContext(); private final Activity mActivity = ActivityController.of(new Activity()).get(); @@ -60,8 +64,21 @@ public class ManagedDeviceActionDisabledByAdminControllerTest { } @Test - public void setupLearnMoreButton_validUrl_negativeButtonSet() { - ManagedDeviceActionDisabledByAdminController controller = createController(URL); + public void setupLearnMoreButton_noUrl_negativeButtonSet() { + ManagedDeviceActionDisabledByAdminController controller = createController(EMPTY_URL); + + controller.setupLearnMoreButton(mContext); + + mTestUtils.assertLearnMoreAction(LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES); + } + + @Test + public void setupLearnMoreButton_validUrl_foregroundUser_launchesHelpPage() { + ManagedDeviceActionDisabledByAdminController controller = createController( + URL, + /* isUserForeground= */ true, + /* preferredUserHandle= */ MANAGED_USER, + /* userContainingBrowser= */ MANAGED_USER); controller.setupLearnMoreButton(mContext); @@ -69,8 +86,38 @@ public class ManagedDeviceActionDisabledByAdminControllerTest { } @Test - public void setupLearnMoreButton_noUrl_negativeButtonSet() { - ManagedDeviceActionDisabledByAdminController controller = createController(EMPTY_URL); + public void setupLearnMoreButton_validUrl_browserInPreferredUser_notForeground_showsAdminPolicies() { + ManagedDeviceActionDisabledByAdminController controller = createController( + URL, + /* isUserForeground= */ false, + /* preferredUserHandle= */ MANAGED_USER, + /* userContainingBrowser= */ MANAGED_USER); + + controller.setupLearnMoreButton(mContext); + + mTestUtils.assertLearnMoreAction(LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES); + } + + @Test + public void setupLearnMoreButton_validUrl_browserInCurrentUser_launchesHelpPage() { + ManagedDeviceActionDisabledByAdminController controller = createController( + URL, + /* isUserForeground= */ false, + /* preferredUserHandle= */ MANAGED_USER, + /* userContainingBrowser= */ mContext.getUser()); + + controller.setupLearnMoreButton(mContext); + + mTestUtils.assertLearnMoreAction(LEARN_MORE_ACTION_LAUNCH_HELP_PAGE); + } + + @Test + public void setupLearnMoreButton_validUrl_browserNotOnAnyUser_showsAdminPolicies() { + ManagedDeviceActionDisabledByAdminController controller = createController( + URL, + /* isUserForeground= */ false, + /* preferredUserHandle= */ MANAGED_USER, + /* userContainingBrowser= */ null); controller.setupLearnMoreButton(mContext); @@ -110,13 +157,33 @@ public class ManagedDeviceActionDisabledByAdminControllerTest { } private ManagedDeviceActionDisabledByAdminController createController() { - return createController(/* url= */ null); + return createController( + /* url= */ null, + /* foregroundUserChecker= */ true, + mContext.getUser(), + /* userContainingBrowser= */ null); } private ManagedDeviceActionDisabledByAdminController createController(String url) { + return createController( + url, + /* foregroundUserChecker= */ true, + mContext.getUser(), + /* userContainingBrowser= */ null); + } + + private ManagedDeviceActionDisabledByAdminController createController( + String url, + boolean isUserForeground, + UserHandle preferredUserHandle, + UserHandle userContainingBrowser) { ManagedDeviceActionDisabledByAdminController controller = new ManagedDeviceActionDisabledByAdminController( - new FakeDeviceAdminStringProvider(url), mContext.getUser()); + new FakeDeviceAdminStringProvider(url), + preferredUserHandle, + /* foregroundUserChecker= */ (context, userHandle) -> isUserForeground, + /* resolveActivityChecker= */ (packageManager, __, userHandle) -> + userHandle.equals(userContainingBrowser)); controller.initialize(mTestUtils.createLearnMoreButtonLauncher()); controller.updateEnforcedAdmin(ENFORCED_ADMIN, ENFORCEMENT_ADMIN_USER_ID); return controller;