Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba8f4420 authored by Bryce Lee's avatar Bryce Lee
Browse files

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
parent f1f320c8
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -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);
+3 −5
Original line number Diff line number Diff line
@@ -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: "
+2 −3
Original line number Diff line number Diff line
@@ -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);

+2 −0
Original line number Diff line number Diff line
@@ -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;
    }