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
This commit is contained in:
Keun young Park
2019-04-23 09:44:21 -07:00
parent c7c2a50e7d
commit 4626518fcd
4 changed files with 76 additions and 2 deletions

View File

@@ -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>

View File

@@ -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" />

View File

@@ -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));

View File

@@ -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;
@@ -494,6 +496,71 @@ public class RootActivityContainerTests extends ActivityTestsBase {
assertEquals(comp.getClassName(), resolvedInfo.first.name);
}
/**
* 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.