From ba8f44209520bf524043bdb2076a17813a397cc3 Mon Sep 17 00:00:00 2001 From: Bryce Lee Date: Mon, 20 Nov 2017 12:35:57 -0800 Subject: [PATCH] Get PackageManager on demand in ActivityStarter. PackageManager may not be ready by the time ActivityStarter is created. As a result we cannot pass it in as an argument at construction time. This changelist addresses this by adding an accessor in ActivityManagerService, which fetches the service on demand. Change-Id: I117af29170cc70198072908da1d728d4e9317e46 Fixes: 69550166 Test: cts/tests/framework/base/activitymanager/util/run-test CtsVoiceSettingsTestCases android.voicesettings.cts.AirplaneModeTest --- .../com/android/server/am/ActivityManagerService.java | 11 ++++++++++- .../java/com/android/server/am/ActivityStarter.java | 8 +++----- .../com/android/server/am/ActivityStarterTests.java | 5 ++--- .../src/com/android/server/am/ActivityTestsBase.java | 2 ++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index b3b831edcab79..26d871f9acb37 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2793,7 +2793,7 @@ public class ActivityManagerService extends IActivityManager.Stub mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler); mTaskChangeNotificationController = new TaskChangeNotificationController(this, mStackSupervisor, mHandler); - mActivityStarter = new ActivityStarter(this, AppGlobals.getPackageManager()); + mActivityStarter = new ActivityStarter(this); mRecentTasks = createRecentTasks(); mStackSupervisor.setRecentTasks(mRecentTasks); mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mHandler); @@ -11715,6 +11715,15 @@ public class ActivityManagerService extends IActivityManager.Stub return true; } + /** + * Returns the PackageManager. Used by classes hosted by {@link ActivityManagerService}. The + * PackageManager could be unavailable at construction time and therefore needs to be accessed + * on demand. + */ + IPackageManager getPackageManager() { + return AppGlobals.getPackageManager(); + } + PackageManagerInternal getPackageManagerInternalLocked() { if (mPackageManagerInt == null) { mPackageManagerInt = LocalServices.getService(PackageManagerInternal.class); diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 9b8cbc1043a57..03162bbe01999 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -134,7 +134,6 @@ class ActivityStarter { private static final int INVALID_LAUNCH_MODE = -1; private final ActivityManagerService mService; - private final IPackageManager mPackageManager; private final ActivityStackSupervisor mSupervisor; private final ActivityStartInterceptor mInterceptor; @@ -234,9 +233,8 @@ class ActivityStarter { mIntentDelivered = false; } - ActivityStarter(ActivityManagerService service, IPackageManager packageManager) { + ActivityStarter(ActivityManagerService service) { mService = service; - mPackageManager = packageManager; mSupervisor = mService.mStackSupervisor; mInterceptor = new ActivityStartInterceptor(mService, mSupervisor); } @@ -379,7 +377,7 @@ class ActivityStarter { && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) { try { intent.addCategory(Intent.CATEGORY_VOICE); - if (!mPackageManager.activitySupportsIntent( + if (!mService.getPackageManager().activitySupportsIntent( intent.getComponent(), intent, resolvedType)) { Slog.w(TAG, "Activity being started in current voice task does not support voice: " @@ -397,7 +395,7 @@ class ActivityStarter { // If the caller is starting a new voice session, just make sure the target // is actually allowing it to run this way. try { - if (!mPackageManager.activitySupportsIntent(intent.getComponent(), + if (!mService.getPackageManager().activitySupportsIntent(intent.getComponent(), intent, resolvedType)) { Slog.w(TAG, "Activity being started in new voice task does not support: " diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java index f9933fb63f122..bc503c49a99a8 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java @@ -95,8 +95,7 @@ public class ActivityStarterTests extends ActivityTestsBase { public void setUp() throws Exception { super.setUp(); mService = createActivityManagerService(); - mPackageManager = mock(IPackageManager.class); - mStarter = new ActivityStarter(mService, mPackageManager); + mStarter = new ActivityStarter(mService); } @Test @@ -178,7 +177,7 @@ public class ActivityStarterTests extends ActivityTestsBase { int expectedResult) { final ActivityManagerService service = createActivityManagerService(); final IPackageManager packageManager = mock(IPackageManager.class); - final ActivityStarter starter = new ActivityStarter(service, packageManager); + final ActivityStarter starter = new ActivityStarter(service); final IApplicationThread caller = mock(IApplicationThread.class); diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java index 9c949ad348441..9683e229d50f7 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java @@ -36,6 +36,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageManager; import android.content.res.Configuration; import android.graphics.Rect; import android.hardware.display.DisplayManager; @@ -90,6 +91,7 @@ public class ActivityTestsBase { protected ActivityManagerService setupActivityManagerService(ActivityManagerService service) { service = spy(service); + doReturn(mock(IPackageManager.class)).when(service).getPackageManager(); service.mWindowManager = prepareMockWindowManager(); return service; }