diff --git a/src/com/android/settings/applications/appcompat/UserAspectRatioManager.java b/src/com/android/settings/applications/appcompat/UserAspectRatioManager.java index 2c157c44228..b940dc844a5 100644 --- a/src/com/android/settings/applications/appcompat/UserAspectRatioManager.java +++ b/src/com/android/settings/applications/appcompat/UserAspectRatioManager.java @@ -16,6 +16,7 @@ package com.android.settings.applications.appcompat; +import static android.os.UserHandle.getUserHandleForUid; import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE; import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE; @@ -26,8 +27,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; +import android.content.pm.LauncherApps; import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.os.RemoteException; import android.provider.DeviceConfig; import android.util.ArrayMap; @@ -40,7 +41,6 @@ import com.android.settings.Utils; import com.google.common.annotations.VisibleForTesting; -import java.util.List; import java.util.Map; /** @@ -63,15 +63,12 @@ public class UserAspectRatioManager { private final Context mContext; private final IPackageManager mIPm; /** Apps that have launcher entry defined in manifest */ - private final List mInfoHasLauncherEntryList; private final Map mUserAspectRatioMap; private final Map mUserAspectRatioA11yMap; public UserAspectRatioManager(@NonNull Context context) { mContext = context; mIPm = AppGlobals.getPackageManager(); - mInfoHasLauncherEntryList = mContext.getPackageManager().queryIntentActivities( - UserAspectRatioManager.LAUNCHER_ENTRY_INTENT, PackageManager.GET_META_DATA); mUserAspectRatioA11yMap = new ArrayMap<>(); mUserAspectRatioMap = getUserMinAspectRatioMapping(); } @@ -159,9 +156,7 @@ public class UserAspectRatioManager { Boolean appAllowsUserAspectRatioOverride = readComponentProperty( mContext.getPackageManager(), app.packageName, PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE); - boolean hasLauncherEntry = mInfoHasLauncherEntryList.stream() - .anyMatch(info -> info.activityInfo.packageName.equals(app.packageName)); - return !FALSE.equals(appAllowsUserAspectRatioOverride) && hasLauncherEntry; + return !FALSE.equals(appAllowsUserAspectRatioOverride) && hasLauncherEntry(app); } /** @@ -178,6 +173,15 @@ public class UserAspectRatioManager { DEFAULT_VALUE_ENABLE_USER_ASPECT_RATIO_FULLSCREEN); } + LauncherApps getLauncherApps() { + return mContext.getSystemService(LauncherApps.class); + } + + private boolean hasLauncherEntry(@NonNull ApplicationInfo app) { + return !getLauncherApps().getActivityList(app.packageName, getUserHandleForUid(app.uid)) + .isEmpty(); + } + private static boolean getValueFromDeviceConfig(String name, boolean defaultValue) { return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_WINDOW_MANAGER, name, defaultValue); } @@ -267,9 +271,4 @@ public class UserAspectRatioManager { } return null; } - - @VisibleForTesting - void addInfoHasLauncherEntry(@NonNull ResolveInfo infoHasLauncherEntry) { - mInfoHasLauncherEntryList.add(infoHasLauncherEntry); - } } diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreferenceTest.kt index 9a17032d3e8..dd5b929ea3c 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appcompat/UserAspectRatioAppPreferenceTest.kt @@ -17,10 +17,10 @@ package com.android.settings.spa.app.appcompat import android.content.Context -import android.content.pm.ActivityInfo import android.content.pm.ApplicationInfo +import android.content.pm.LauncherActivityInfo +import android.content.pm.LauncherApps import android.content.pm.PackageManager -import android.content.pm.ResolveInfo import android.provider.DeviceConfig.NAMESPACE_WINDOW_MANAGER import android.view.WindowManager.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE import androidx.compose.runtime.CompositionLocalProvider @@ -46,9 +46,9 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock import org.mockito.Mockito.any -import org.mockito.Mockito.anyInt import org.mockito.MockitoSession import org.mockito.Spy import org.mockito.quality.Strictness @@ -76,6 +76,12 @@ class UserAspectRatioAppPreferenceTest { @Mock private lateinit var packageManager: PackageManager + @Mock + private lateinit var launcherApps: LauncherApps + + @Mock + private lateinit var launcherActivities: List + @Before fun setUp() { mockSession = ExtendedMockito.mockitoSession() @@ -86,6 +92,8 @@ class UserAspectRatioAppPreferenceTest { .startMocking() whenever(context.resources).thenReturn(resources) whenever(context.packageManager).thenReturn(packageManager) + whenever(context.getSystemService(Context.LAUNCHER_APPS_SERVICE)).thenReturn(launcherApps) + whenever(launcherApps.getActivityList(anyString(), any())).thenReturn(launcherActivities) // True is ignored but need this here or getBoolean will complain null object mockProperty(PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE, true) } @@ -107,6 +115,8 @@ class UserAspectRatioAppPreferenceTest { @Test fun whenCannotDisplayAspectRatioUi_notDisplayed() { + whenever(launcherActivities.isEmpty()).thenReturn(true) + setContent() composeTestRule.onRoot().assertIsNotDisplayed() @@ -115,8 +125,7 @@ class UserAspectRatioAppPreferenceTest { @Test fun whenCanDisplayAspectRatioUiAndConfigFalse_notDisplayed() { setConfig(false) - whenever(packageManager.queryIntentActivities(any(), anyInt())) - .thenReturn(listOf(RESOLVE_INFO)) + whenever(launcherActivities.isEmpty()).thenReturn(false) setContent() @@ -127,6 +136,8 @@ class UserAspectRatioAppPreferenceTest { fun whenCannotDisplayAspectRatioUiAndConfigTrue_notDisplayed() { setConfig(true) + whenever(launcherActivities.isEmpty()).thenReturn(true) + setContent() composeTestRule.onRoot().assertIsNotDisplayed() @@ -135,9 +146,7 @@ class UserAspectRatioAppPreferenceTest { @Test fun whenCanDisplayAspectRatioUiAndConfigTrue_Displayed() { setConfig(true) - whenever(packageManager.queryIntentActivities(any(), anyInt())) - .thenReturn(listOf(RESOLVE_INFO)) - + whenever(launcherActivities.isEmpty()).thenReturn(false) setContent() composeTestRule.onNode( @@ -151,8 +160,7 @@ class UserAspectRatioAppPreferenceTest { @Test fun onClick_startActivity() { setConfig(true) - whenever(packageManager.queryIntentActivities(any(), anyInt())) - .thenReturn(listOf(RESOLVE_INFO)) + whenever(launcherActivities.isEmpty()).thenReturn(false) setContent() composeTestRule.onRoot().performClick() @@ -196,10 +204,5 @@ class UserAspectRatioAppPreferenceTest { packageName = PACKAGE_NAME uid = UID } - private val RESOLVE_INFO = ResolveInfo().apply { - activityInfo = ActivityInfo().apply { - packageName = PACKAGE_NAME - } - } } } \ No newline at end of file diff --git a/tests/unit/src/com/android/settings/applications/appcompat/UserAspectRatioManagerTest.java b/tests/unit/src/com/android/settings/applications/appcompat/UserAspectRatioManagerTest.java index 6cc386bd1a5..81078e83a5d 100644 --- a/tests/unit/src/com/android/settings/applications/appcompat/UserAspectRatioManagerTest.java +++ b/tests/unit/src/com/android/settings/applications/appcompat/UserAspectRatioManagerTest.java @@ -32,15 +32,18 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; -import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.LauncherActivityInfo; +import android.content.pm.LauncherApps; import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.provider.DeviceConfig; @@ -55,6 +58,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.List; + /** * To run this test: atest SettingsUnitTests:UserAspectRatioManagerTest */ @@ -67,14 +72,23 @@ public class UserAspectRatioManagerTest { private String mOriginalSettingsFlag; private String mOriginalFullscreenFlag; private String mPackageName = "com.test.mypackage"; - + private LauncherApps mLauncherApps; + private List mLauncherActivities; @Before public void setUp() { mContext = spy(ApplicationProvider.getApplicationContext()); mResources = spy(mContext.getResources()); - mUtils = new UserAspectRatioManager(mContext); + mLauncherApps = mock(LauncherApps.class); + mLauncherActivities = mock(List.class); + mUtils = new UserAspectRatioManager(mContext) { + @Override + LauncherApps getLauncherApps() { + return mLauncherApps; + } + }; when(mContext.getResources()).thenReturn(mResources); + doReturn(mLauncherActivities).when(mLauncherApps).getActivityList(anyString(), any()); mOriginalSettingsFlag = DeviceConfig.getProperty( DeviceConfig.NAMESPACE_WINDOW_MANAGER, KEY_ENABLE_USER_ASPECT_RATIO_SETTINGS); @@ -98,13 +112,14 @@ public class UserAspectRatioManagerTest { public void testCanDisplayAspectRatioUi() { final ApplicationInfo canDisplay = new ApplicationInfo(); canDisplay.packageName = "com.app.candisplay"; - addResolveInfoLauncherEntry(canDisplay.packageName); + doReturn(false).when(mLauncherActivities).isEmpty(); assertTrue(mUtils.canDisplayAspectRatioUi(canDisplay)); final ApplicationInfo noLauncherEntry = new ApplicationInfo(); noLauncherEntry.packageName = "com.app.nolauncherentry"; + doReturn(true).when(mLauncherActivities).isEmpty(); assertFalse(mUtils.canDisplayAspectRatioUi(noLauncherEntry)); } @@ -112,10 +127,10 @@ public class UserAspectRatioManagerTest { public void testCanDisplayAspectRatioUi_hasLauncher_propertyFalse_returnFalse() throws PackageManager.NameNotFoundException { mockProperty(PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE, false); + doReturn(true).when(mLauncherActivities).isEmpty(); final ApplicationInfo canDisplay = new ApplicationInfo(); canDisplay.packageName = mPackageName; - addResolveInfoLauncherEntry(canDisplay.packageName); assertFalse(mUtils.canDisplayAspectRatioUi(canDisplay)); } @@ -124,6 +139,7 @@ public class UserAspectRatioManagerTest { public void testCanDisplayAspectRatioUi_noLauncher_propertyTrue_returnFalse() throws PackageManager.NameNotFoundException { mockProperty(PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE, true); + doReturn(true).when(mLauncherActivities).isEmpty(); final ApplicationInfo noLauncherEntry = new ApplicationInfo(); noLauncherEntry.packageName = mPackageName; @@ -267,12 +283,4 @@ public class UserAspectRatioManagerTest { DeviceConfig.setProperty(DeviceConfig.NAMESPACE_WINDOW_MANAGER, KEY_ENABLE_USER_ASPECT_RATIO_FULLSCREEN, enabled, makeDefault); } - - private void addResolveInfoLauncherEntry(String packageName) { - final ResolveInfo resolveInfo = mock(ResolveInfo.class); - final ActivityInfo activityInfo = mock(ActivityInfo.class); - activityInfo.packageName = packageName; - resolveInfo.activityInfo = activityInfo; - mUtils.addInfoHasLauncherEntry(resolveInfo); - } }