diff options
| author | 2019-04-23 09:44:21 -0700 | |
|---|---|---|
| committer | 2019-04-23 18:11:06 -0700 | |
| commit | 4626518fcd65b8b0698e45c1faca4d3e77d0cef3 (patch) | |
| tree | b4f55891b1522aaa5f4a3e25d692fe61657be2d6 | |
| parent | c7c2a50e7d1db824e572d83c77066a2390c4b7d6 (diff) | |
Add useSystemProvidedLauncherForSecondary config
- Enabling this flag allows product to use the same secondary home launcher
specified in config_secondaryHomeComponent always.
- In product like car, some secondary displays, only built-in secondary home
launcher should be used.
Bug: 131112301
Test: Run added test
Change-Id: I8ec0c21685dacfeb142c34b1362586c15f87fe20
4 files changed, 76 insertions, 2 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 21a8f4c7ff89..6416c10713f6 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3862,6 +3862,10 @@ {@see android.view.Display#FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS} --> <string name="config_secondaryHomeComponent" translatable="false">com.android.launcher3/com.android.launcher3.SecondaryDisplayLauncher</string> + <!-- Force secondary home launcher specified in config_secondaryHomeComponent always. If this is + not set, secondary home launcher can be replaced by user. --> + <bool name ="config_useSystemProvidedLauncherForSecondary">false</bool> + <!-- If device supports corner radius on windows. This should be turned off on low-end devices to improve animation performance. --> <bool name="config_supportsRoundedCornersOnWindows">true</bool> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 186b84ceb255..9b918ecc3204 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3673,6 +3673,7 @@ <!-- For Secondary Launcher --> <java-symbol type="string" name="config_secondaryHomeComponent" /> + <java-symbol type="bool" name="config_useSystemProvidedLauncherForSecondary" /> <java-symbol type="string" name="battery_saver_notification_channel_name" /> <java-symbol type="string" name="battery_saver_sticky_disabled_notification_title" /> diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index ee6cf541547b..0ae1ff503094 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -5798,8 +5798,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { */ Intent getSecondaryHomeIntent(String preferredPackage) { final Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null); - if (preferredPackage == null) { - // Using the component stored in config if no package name. + final boolean useSystemProvidedLauncher = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_useSystemProvidedLauncherForSecondary); + if (preferredPackage == null || useSystemProvidedLauncher) { + // Using the component stored in config if no package name or forced. final String secondaryHomeComponent = mContext.getResources().getString( com.android.internal.R.string.config_secondaryHomeComponent); intent.setComponent(ComponentName.unflattenFromString(secondaryHomeComponent)); diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java index 94def2bb7846..f6c57b0ef2a1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java @@ -31,6 +31,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.wm.ActivityDisplay.POSITION_TOP; @@ -55,6 +56,7 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ResolveInfo; +import android.content.res.Resources; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; import android.util.Pair; @@ -495,6 +497,71 @@ public class RootActivityContainerTests extends ActivityTestsBase { } /** + * Tests that the default secondary home activity is always picked when it is in forced by + * config_useSystemProvidedLauncherForSecondary. + */ + @Test + public void testResolveSecondaryHomeActivityForced() { + Resources resources = mContext.getResources(); + spyOn(resources); + final String defaultSecondaryHome = + "com.android.test/com.android.test.TestDefaultSecondaryHome"; + final ComponentName secondaryComp = ComponentName.unflattenFromString(defaultSecondaryHome); + doReturn(defaultSecondaryHome).when(resources).getString( + com.android.internal.R.string.config_secondaryHomeComponent); + doReturn(true).when(resources).getBoolean( + com.android.internal.R.bool.config_useSystemProvidedLauncherForSecondary); + + final Intent secondaryHomeIntent = mService.getSecondaryHomeIntent(null); + assertEquals(secondaryComp, secondaryHomeIntent.getComponent()); + + final ActivityInfo aInfoSecondary = new ActivityInfo(); + aInfoSecondary.name = secondaryComp.getClassName(); + aInfoSecondary.applicationInfo = new ApplicationInfo(); + aInfoSecondary.applicationInfo.packageName = secondaryComp.getPackageName(); + doReturn(aInfoSecondary).when(mRootActivityContainer).resolveHomeActivity(anyInt(), + refEq(secondaryHomeIntent)); + + final Intent homeIntent = mService.getHomeIntent(); + final ActivityInfo aInfoDefault = new ActivityInfo(); + aInfoDefault.name = "fakeHomeActivity"; + aInfoDefault.applicationInfo = new ApplicationInfo(); + aInfoDefault.applicationInfo.packageName = "fakeHomePackage"; + doReturn(aInfoDefault).when(mRootActivityContainer).resolveHomeActivity(anyInt(), + refEq(homeIntent)); + + // Let resolveActivities call to validate both main launcher and second launcher so that + // resolveActivities call does not work as enabler for secondary. + final List<ResolveInfo> resolutions1 = new ArrayList<>(); + final ResolveInfo resolveInfo1 = new ResolveInfo(); + resolveInfo1.activityInfo = new ActivityInfo(); + resolveInfo1.activityInfo.name = aInfoDefault.name; + resolveInfo1.activityInfo.applicationInfo = aInfoDefault.applicationInfo; + resolutions1.add(resolveInfo1); + doReturn(resolutions1).when(mRootActivityContainer).resolveActivities(anyInt(), + refEq(homeIntent)); + final List<ResolveInfo> resolutions2 = new ArrayList<>(); + final ResolveInfo resolveInfo2 = new ResolveInfo(); + resolveInfo2.activityInfo = new ActivityInfo(); + resolveInfo2.activityInfo.name = aInfoSecondary.name; + resolveInfo2.activityInfo.applicationInfo = aInfoSecondary.applicationInfo; + resolutions2.add(resolveInfo2); + doReturn(resolutions2).when(mRootActivityContainer).resolveActivities(anyInt(), + refEq(secondaryHomeIntent)); + + doReturn(true).when(mRootActivityContainer).canStartHomeOnDisplay( + any(), anyInt(), anyBoolean()); + + final Pair<ActivityInfo, Intent> resolvedInfo = mRootActivityContainer + .resolveSecondaryHomeActivity(0 /* userId */, 1 /* displayId */); + + assertEquals(secondaryComp.getClassName(), resolvedInfo.first.name); + assertEquals(secondaryComp.getPackageName(), + resolvedInfo.first.applicationInfo.packageName); + assertEquals(aInfoSecondary.name, resolvedInfo.first.name); + } + + /** * Tests that secondary home should be selected if default home not support secondary displays * or there is no matched activity in the same package as selected default home. */ |