diff --git a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java index b056b2042b3..ca8dda3b167 100644 --- a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java +++ b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java @@ -29,6 +29,8 @@ import com.android.internal.util.CollectionUtils; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import java.util.concurrent.Executor; + /* * Abstract base controller for the default app shortcut preferences that launches the default app * settings with the corresponding default app highlighted. @@ -41,6 +43,8 @@ public abstract class DefaultAppShortcutPreferenceControllerBase extends BasePre private final RoleManager mRoleManager; + private boolean mRoleVisible; + private boolean mAppQualified; private PreferenceScreen mPreferenceScreen; @@ -56,8 +60,13 @@ public abstract class DefaultAppShortcutPreferenceControllerBase extends BasePre final PermissionControllerManager permissionControllerManager = mContext.getSystemService(PermissionControllerManager.class); - permissionControllerManager.isApplicationQualifiedForRole(mRoleName, mPackageName, - mContext.getMainExecutor(), qualified -> { + final Executor executor = mContext.getMainExecutor(); + permissionControllerManager.isRoleVisible(mRoleName, executor, visible -> { + mRoleVisible = visible; + refreshAvailability(); + }); + permissionControllerManager.isApplicationQualifiedForRole(mRoleName, mPackageName, executor, + qualified -> { mAppQualified = qualified; refreshAvailability(); }); @@ -85,7 +94,7 @@ public abstract class DefaultAppShortcutPreferenceControllerBase extends BasePre if (mContext.getSystemService(UserManager.class).isManagedProfile()) { return DISABLED_FOR_USER; } - return mAppQualified ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + return mRoleVisible && mAppQualified ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java index f3f4ca6f1f6..7b9bc253425 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBaseTest.java @@ -101,35 +101,72 @@ public class DefaultAppShortcutPreferenceControllerBaseTest { @Test public void - getAvailabilityStatus_noCallbackForIsApplicationNotQualifiedForRole_shouldReturnUnsupported() { + getAvailabilityStatus_noCallback_shouldReturnUnsupported() { + assertThat(mController.getAvailabilityStatus()).isEqualTo( + DefaultAppShortcutPreferenceControllerBase.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void + getAvailabilityStatus_noCallbackForIsRoleNotVisible_shouldReturnUnsupported() { + setApplicationIsQualifiedForRole(true); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + DefaultAppShortcutPreferenceControllerBase.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailabilityStatus_RoleIsNotVisible_shouldReturnUnsupported() { + setRoleIsVisible(false); + setApplicationIsQualifiedForRole(true); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + DefaultAppShortcutPreferenceControllerBase.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void + getAvailabilityStatus_noCallbackForIsApplicationQualifiedForRole_shouldReturnUnsupported() { + setRoleIsVisible(true); + assertThat(mController.getAvailabilityStatus()).isEqualTo( DefaultAppShortcutPreferenceControllerBase.UNSUPPORTED_ON_DEVICE); } @Test public void getAvailabilityStatus_applicationIsNotQualifiedForRole_shouldReturnUnsupported() { - final ArgumentCaptor> callbackCaptor = ArgumentCaptor.forClass( - Consumer.class); - verify(mPermissionControllerManager).isApplicationQualifiedForRole(eq(TEST_ROLE_NAME), eq( - TEST_PACKAGE_NAME), any(Executor.class), callbackCaptor.capture()); - final Consumer callback = callbackCaptor.getValue(); - callback.accept(false); + setRoleIsVisible(true); + setApplicationIsQualifiedForRole(false); assertThat(mController.getAvailabilityStatus()).isEqualTo( DefaultAppShortcutPreferenceControllerBase.UNSUPPORTED_ON_DEVICE); } @Test - public void getAvailabilityStatus_applicationIsQualifiedForRole_shouldReturnAvailable() { + public void getAvailabilityStatus_RoleVisibleAndApplicationQualified_shouldReturnAvailable() { + setRoleIsVisible(true); + setApplicationIsQualifiedForRole(true); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + DefaultAppShortcutPreferenceControllerBase.AVAILABLE); + } + + private void setRoleIsVisible(boolean visible) { + final ArgumentCaptor> callbackCaptor = ArgumentCaptor.forClass( + Consumer.class); + verify(mPermissionControllerManager).isRoleVisible(eq(TEST_ROLE_NAME), any(Executor.class), + callbackCaptor.capture()); + final Consumer callback = callbackCaptor.getValue(); + callback.accept(visible); + } + + private void setApplicationIsQualifiedForRole(boolean qualified) { final ArgumentCaptor> callbackCaptor = ArgumentCaptor.forClass( Consumer.class); verify(mPermissionControllerManager).isApplicationQualifiedForRole(eq(TEST_ROLE_NAME), eq( TEST_PACKAGE_NAME), any(Executor.class), callbackCaptor.capture()); final Consumer callback = callbackCaptor.getValue(); - callback.accept(true); - - assertThat(mController.getAvailabilityStatus()).isEqualTo( - DefaultAppShortcutPreferenceControllerBase.AVAILABLE); + callback.accept(qualified); } @Test