diff options
| author | 2021-07-28 14:13:41 +0000 | |
|---|---|---|
| committer | 2021-07-28 14:13:41 +0000 | |
| commit | da685b239c0a6441b8c02b53e55cf53e63b306f0 (patch) | |
| tree | 59eaf56962f3c5770617ad328efe4b76d09e3a3a | |
| parent | 842ebcdb4470d6aff8843ae7f3bc30516e44c3ae (diff) | |
| parent | 187f33a0a355c46627ac22ed9d1a4ed8346fb61a (diff) | |
Merge "Revert "Revert "Revert "Revert "Launch admin policies settings screen if not possible to""" into sc-dev
5 files changed, 190 insertions, 15 deletions
diff --git a/packages/SettingsLib/lint-baseline.xml b/packages/SettingsLib/lint-baseline.xml index f6d6ca62e78c..d6ea73d1ef3d 100644 --- a/packages/SettingsLib/lint-baseline.xml +++ b/packages/SettingsLib/lint-baseline.xml @@ -892,4 +892,26 @@ column="59"/> </issue> + <issue + id="NewApi" + message="Call requires API level S (current min is 29): `android.os.UserManager#isUserForeground`" + errorLine1=" .getSystemService(UserManager.class).isUserForeground();" + errorLine2=" ~~~~~~~~~~~~~~~~"> + <location + file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java" + line="120" + column="54"/> + </issue> + + <issue + id="NewApi" + message="Call requires API level 31 (current min is 29): `android.os.UserManager#isUserForeground`" + errorLine1=" .getSystemService(UserManager.class).isUserForeground();" + errorLine2=" ~~~~~~~~~~~~~~~~"> + <location + file="frameworks/base/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java" + line="120" + column="54"/> + </issue> + </issues> diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java index bd9e0d341b2e..7275d6be99ad 100644 --- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java +++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerFactory.java @@ -18,6 +18,9 @@ package com.android.settingslib.enterprise; import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; +import static com.android.settingslib.enterprise.ActionDisabledLearnMoreButtonLauncher.DEFAULT_RESOLVE_ACTIVITY_CHECKER; +import static com.android.settingslib.enterprise.ManagedDeviceActionDisabledByAdminController.DEFAULT_FOREGROUND_USER_CHECKER; + import android.app.admin.DevicePolicyManager; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; @@ -43,7 +46,11 @@ public final class ActionDisabledByAdminControllerFactory { } else if (isFinancedDevice(context)) { return new FinancedDeviceActionDisabledByAdminController(stringProvider); } else { - return new ManagedDeviceActionDisabledByAdminController(stringProvider, userHandle); + return new ManagedDeviceActionDisabledByAdminController( + stringProvider, + userHandle, + DEFAULT_FOREGROUND_USER_CHECKER, + DEFAULT_RESOLVE_ACTIVITY_CHECKER); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java index 411487976fe5..f9d3aaf6b383 100644 --- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java +++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncher.java @@ -22,6 +22,7 @@ import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.UserHandle; import android.os.UserManager; @@ -34,6 +35,17 @@ import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; */ public abstract class ActionDisabledLearnMoreButtonLauncher { + public static ResolveActivityChecker DEFAULT_RESOLVE_ACTIVITY_CHECKER = + (packageManager, url, userHandle) -> packageManager.resolveActivityAsUser( + createLearnMoreIntent(url), + PackageManager.MATCH_DEFAULT_ONLY, + userHandle.getIdentifier()) != null; + + interface ResolveActivityChecker { + boolean canResolveActivityAsUser( + PackageManager packageManager, String url, UserHandle userHandle); + } + /** * Sets up a "learn more" button which shows a screen with device policy settings */ @@ -111,6 +123,14 @@ public abstract class ActionDisabledLearnMoreButtonLauncher { finishSelf(); } + protected final boolean canLaunchHelpPage( + PackageManager packageManager, + String url, + UserHandle userHandle, + ResolveActivityChecker resolveActivityChecker) { + return resolveActivityChecker.canResolveActivityAsUser(packageManager, url, userHandle); + } + private void showAdminPolicies(Context context, EnforcedAdmin enforcedAdmin) { if (enforcedAdmin.component != null) { launchShowAdminPolicies(context, enforcedAdmin.user, enforcedAdmin.component); diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java index 93e811d6baaa..c2034f89e18a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java +++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminController.java @@ -20,13 +20,14 @@ import static java.util.Objects.requireNonNull; import android.app.admin.DevicePolicyManager; import android.content.Context; +import android.content.pm.PackageManager; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import androidx.annotation.Nullable; -import java.util.Objects; +import com.android.settingslib.enterprise.ActionDisabledLearnMoreButtonLauncher.ResolveActivityChecker; /** @@ -35,17 +36,37 @@ import java.util.Objects; final class ManagedDeviceActionDisabledByAdminController extends BaseActionDisabledByAdminController { - private final UserHandle mUserHandle; + interface ForegroundUserChecker { + boolean isUserForeground(Context context, UserHandle userHandle); + } + + public final static ForegroundUserChecker DEFAULT_FOREGROUND_USER_CHECKER = + ManagedDeviceActionDisabledByAdminController::isUserForeground; + + /** + * The {@link UserHandle} which is preferred for launching the web help page in + * <p>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 d9be4f336797..509e12d241dd 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; |