From 6bd9bff2e278d098e8d3474c27aadd7965144f34 Mon Sep 17 00:00:00 2001 From: Eghosa Ewansiha-Vlachavas Date: Tue, 26 Sep 2023 15:13:11 +0000 Subject: [PATCH] [1/n] Aspect ratio settings app list refinement All apps list for work profile currently only shows work apps that are also installed on the normal user. Update filter for list to show all launcher apps for both users in their respective lists. Fixes: 301373413 Test: atest SettingsUnitTests:UserAspectRatioManagerTest Test: atest SettingsSpaUnitTests:UserAspectRatioAppPreferenceTest Change-Id: Ia0bf15340d1b37dcd926d81598d3e94f448a46fc --- .../appcompat/UserAspectRatioManager.java | 25 +++++++------ .../UserAspectRatioAppPreferenceTest.kt | 33 +++++++++-------- .../appcompat/UserAspectRatioManagerTest.java | 36 +++++++++++-------- 3 files changed, 52 insertions(+), 42 deletions(-) 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); - } }