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

Commit f904f325 authored by Bryce Lee's avatar Bryce Lee Committed by Android (Google) Code Review
Browse files

Merge changes I93fef3dc,I19647b24

* changes:
  Add tests to exercise ActivityStarter precondition failures.
  Make ActivityStackSupervisor instrumentable for unit tests.
parents 6322e778 93e7f79f
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -2779,12 +2779,12 @@ public class ActivityManagerService extends IActivityManager.Stub
        mConfigurationSeq = mTempConfig.seq = 1;
        mStackSupervisor = createStackSupervisor();
        mStackSupervisor.onConfigurationChanged(mTempConfig);
        mKeyguardController = mStackSupervisor.mKeyguardController;
        mKeyguardController = mStackSupervisor.getKeyguardController();
        mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
        mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
        mTaskChangeNotificationController =
                new TaskChangeNotificationController(this, mStackSupervisor, mHandler);
        mActivityStarter = new ActivityStarter(this);
        mActivityStarter = new ActivityStarter(this, AppGlobals.getPackageManager());
        mRecentTasks = createRecentTasks();
        mStackSupervisor.setRecentTasks(mRecentTasks);
        mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mHandler);
@@ -2828,7 +2828,9 @@ public class ActivityManagerService extends IActivityManager.Stub
    }
    protected ActivityStackSupervisor createStackSupervisor() {
        return new ActivityStackSupervisor(this, mHandler.getLooper());
        final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mHandler.getLooper());
        supervisor.initialize();
        return supervisor;
    }
    protected RecentTasks createRecentTasks() {
@@ -5354,8 +5356,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        return -1;
    }
    final ProcessRecord getRecordForAppLocked(
            IApplicationThread thread) {
    ProcessRecord getRecordForAppLocked(IApplicationThread thread) {
        if (thread == null) {
            return null;
        }
@@ -7121,7 +7122,7 @@ public class ActivityManagerService extends IActivityManager.Stub
            }
            checkTime(startTime, "attachApplicationLocked: immediately before bindApplication");
            mStackSupervisor.mActivityMetricsLogger.notifyBindApplication(app);
            mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(app);
            if (app.isolatedEntryPoint != null) {
                // This is an isolated process which should just call an entry point instead of
                // being bound to an application.
@@ -23890,7 +23891,7 @@ public class ActivityManagerService extends IActivityManager.Stub
        @Override
        public void notifyAppTransitionStarting(SparseIntArray reasons, long timestamp) {
            synchronized (ActivityManagerService.this) {
                mStackSupervisor.mActivityMetricsLogger.notifyTransitionStarting(
                mStackSupervisor.getActivityMetricsLogger().notifyTransitionStarting(
                        reasons, timestamp);
            }
        }
+4 −4
Original line number Diff line number Diff line
@@ -1529,7 +1529,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo

    void setVisibility(boolean visible) {
        mWindowContainerController.setVisibility(visible, mDeferHidingClient);
        mStackSupervisor.mActivityMetricsLogger.notifyVisibilityChanged(this);
        mStackSupervisor.getActivityMetricsLogger().notifyVisibilityChanged(this);
    }

    // TODO: Look into merging with #setVisibility()
@@ -1810,7 +1810,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
            }
            stack.mFullyDrawnStartTime = 0;
        }
        mStackSupervisor.mActivityMetricsLogger.logAppTransitionReportedDrawn(this,
        mStackSupervisor.getActivityMetricsLogger().logAppTransitionReportedDrawn(this,
                restoredFromBundle);
        fullyDrawnStartTime = 0;
    }
@@ -1852,7 +1852,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
    @Override
    public void onStartingWindowDrawn(long timestamp) {
        synchronized (service) {
            mStackSupervisor.mActivityMetricsLogger.notifyStartingWindowDrawn(
            mStackSupervisor.getActivityMetricsLogger().notifyStartingWindowDrawn(
                    getStackId(), timestamp);
        }
    }
@@ -1860,7 +1860,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
    @Override
    public void onWindowsDrawn(long timestamp) {
        synchronized (service) {
            mStackSupervisor.mActivityMetricsLogger.notifyWindowsDrawn(getStackId(), timestamp);
            mStackSupervisor.getActivityMetricsLogger().notifyWindowsDrawn(getStackId(), timestamp);
            if (displayStartTime != 0) {
                reportLaunchTimeLocked(timestamp);
            }
+9 −9
Original line number Diff line number Diff line
@@ -1669,7 +1669,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
            boolean preserveWindows) {
        mTopActivityOccludesKeyguard = false;
        mTopDismissingKeyguardActivity = null;
        mStackSupervisor.mKeyguardController.beginActivityVisibilityUpdate();
        mStackSupervisor.getKeyguardController().beginActivityVisibilityUpdate();
        try {
            ActivityRecord top = topRunningActivityLocked();
            if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "ensureActivitiesVisible behind " + top
@@ -1777,7 +1777,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
                notifyActivityDrawnLocked(null);
            }
        } finally {
            mStackSupervisor.mKeyguardController.endActivityVisibilityUpdate();
            mStackSupervisor.getKeyguardController().endActivityVisibilityUpdate();
        }
    }

@@ -1828,9 +1828,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
    boolean checkKeyguardVisibility(ActivityRecord r, boolean shouldBeVisible,
            boolean isTop) {
        final boolean isInPinnedStack = r.inPinnedWindowingMode();
        final boolean keyguardShowing = mStackSupervisor.mKeyguardController.isKeyguardShowing(
        final boolean keyguardShowing = mStackSupervisor.getKeyguardController().isKeyguardShowing(
                mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY);
        final boolean keyguardLocked = mStackSupervisor.mKeyguardController.isKeyguardLocked();
        final boolean keyguardLocked = mStackSupervisor.getKeyguardController().isKeyguardLocked();
        final boolean showWhenLocked = r.canShowWhenLocked() && !isInPinnedStack;
        final boolean dismissKeyguard = r.hasDismissKeyguardWindows();
        if (shouldBeVisible) {
@@ -1845,7 +1845,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
            }

            final boolean canShowWithKeyguard = canShowWithInsecureKeyguard()
                    && mStackSupervisor.mKeyguardController.canDismissKeyguard();
                    && mStackSupervisor.getKeyguardController().canDismissKeyguard();
            if (canShowWithKeyguard) {
                return true;
            }
@@ -1854,10 +1854,10 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai

            // If keyguard is showing, nothing is visible, except if we are able to dismiss Keyguard
            // right away.
            return shouldBeVisible && mStackSupervisor.mKeyguardController
            return shouldBeVisible && mStackSupervisor.getKeyguardController()
                    .canShowActivityWhileKeyguardShowing(r, dismissKeyguard);
        } else if (keyguardLocked) {
            return shouldBeVisible && mStackSupervisor.mKeyguardController.canShowWhileOccluded(
            return shouldBeVisible && mStackSupervisor.getKeyguardController().canShowWhileOccluded(
                    dismissKeyguard, showWhenLocked);
        } else {
            return shouldBeVisible;
@@ -2421,7 +2421,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
                    // if needed to get the correct rotation behavior.
                    // TODO: Remove this once visibilities are set correctly immediately when
                    // starting an activity.
                    if (mStackSupervisor.mKeyguardController.isKeyguardLocked()) {
                    if (mStackSupervisor.getKeyguardController().isKeyguardLocked()) {
                        mStackSupervisor.ensureActivitiesVisibleLocked(null /* starting */,
                                0 /* configChanges */, false /* preserveWindows */);
                    }
@@ -4889,7 +4889,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
                voiceInteractor);
        // add the task to stack first, mTaskPositioner might need the stack association
        addTask(task, toTop, "createTaskRecord");
        final boolean isLockscreenShown = mService.mStackSupervisor.mKeyguardController
        final boolean isLockscreenShown = mService.mStackSupervisor.getKeyguardController()
                .isKeyguardShowing(mDisplayId != INVALID_DISPLAY ? mDisplayId : DEFAULT_DISPLAY);
        if (!mStackSupervisor.getLaunchingBoundsController().layoutTask(task, info.windowLayout)
                && mBounds != null && task.isResizeable() && !isLockscreenShown) {
+25 −8
Original line number Diff line number Diff line
@@ -295,7 +295,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
    WindowManagerService mWindowManager;
    DisplayManager mDisplayManager;

    private final LaunchingBoundsController mLaunchingBoundsController;
    private LaunchingBoundsController mLaunchingBoundsController;

    /** Counter for next free stack ID to use for dynamic activity stacks. */
    private int mNextFreeStackId = 0;
@@ -395,7 +395,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
    private final SparseArray<IntArray> mDisplayAccessUIDs = new SparseArray<>();

    private DisplayManagerInternal mDisplayManagerInternal;
    private InputManagerInternal mInputManagerInternal;

    /** Used to keep resumeTopActivityUncheckedLocked() from being entered recursively */
    boolean inResumeTopActivity;
@@ -414,7 +413,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
    // Whether tasks have moved and we need to rank the tasks before next OOM scoring
    private boolean mTaskLayersChanged = true;

    final ActivityMetricsLogger mActivityMetricsLogger;
    private ActivityMetricsLogger mActivityMetricsLogger;

    private final ArrayList<ActivityRecord> mTmpActivityList = new ArrayList<>();

@@ -534,11 +533,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
     */
    boolean mIsDockMinimized;

    final KeyguardController mKeyguardController;
    private KeyguardController mKeyguardController;

    private PowerManager mPowerManager;
    private int mDeferResumeCount;

    private boolean mInitialized;

    /**
     * Description of a request to start a new activity, which has been held
     * due to app switches being disabled.
@@ -574,14 +575,32 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
    public ActivityStackSupervisor(ActivityManagerService service, Looper looper) {
        mService = service;
        mHandler = new ActivityStackSupervisorHandler(looper);
    }

    public void initialize() {
        if (mInitialized) {
            return;
        }

        mInitialized = true;
        mRunningTasks = createRunningTasks();
        mActivityMetricsLogger = new ActivityMetricsLogger(this, mService.mContext, looper);
        mKeyguardController = new KeyguardController(service, this);
        mActivityMetricsLogger = new ActivityMetricsLogger(this, mService.mContext,
                mHandler.getLooper());
        mKeyguardController = new KeyguardController(mService, this);

        mLaunchingBoundsController = new LaunchingBoundsController();
        mLaunchingBoundsController.registerDefaultPositioners(this);
    }


    public ActivityMetricsLogger getActivityMetricsLogger() {
        return mActivityMetricsLogger;
    }

    public KeyguardController getKeyguardController() {
        return mKeyguardController;
    }

    void setRecentTasks(RecentTasks recentTasks) {
        mRecentTasks = recentTasks;
        mRecentTasks.registerCallback(this);
@@ -624,8 +643,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D

            mHomeStack = mFocusedStack = mLastFocusedStack = getDefaultDisplay().getOrCreateStack(
                    WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, ON_TOP);

            mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
        }
    }

+15 −7
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ import android.content.IntentSender;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.AuxiliaryResolveInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
@@ -133,6 +134,7 @@ 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;

@@ -232,8 +234,9 @@ class ActivityStarter {
        mIntentDelivered = false;
    }

    ActivityStarter(ActivityManagerService service) {
    ActivityStarter(ActivityManagerService service, IPackageManager packageManager) {
        mService = service;
        mPackageManager = packageManager;
        mSupervisor = mService.mStackSupervisor;
        mInterceptor = new ActivityStartInterceptor(mService, mSupervisor);
    }
@@ -264,8 +267,12 @@ class ActivityStarter {
            outActivity[0] = mLastStartActivityRecord[0];
        }

        return getExternalResult(mLastStartActivityResult);
    }

    public static int getExternalResult(int result) {
        // Aborted results are treated as successes externally, but we must track them internally.
        return mLastStartActivityResult != START_ABORTED ? mLastStartActivityResult : START_SUCCESS;
        return result != START_ABORTED ? result : START_SUCCESS;
    }

    /** DO NOT call this method directly. Use {@link #startActivityLocked} instead. */
@@ -295,7 +302,8 @@ class ActivityStarter {
            }
        }

        final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
        final int userId = aInfo != null && aInfo.applicationInfo != null
                ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;

        if (err == ActivityManager.START_SUCCESS) {
            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
@@ -371,7 +379,7 @@ class ActivityStarter {
                    && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) {
                try {
                    intent.addCategory(Intent.CATEGORY_VOICE);
                    if (!AppGlobals.getPackageManager().activitySupportsIntent(
                    if (!mPackageManager.activitySupportsIntent(
                            intent.getComponent(), intent, resolvedType)) {
                        Slog.w(TAG,
                                "Activity being started in current voice task does not support voice: "
@@ -389,7 +397,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 (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(),
                if (!mPackageManager.activitySupportsIntent(intent.getComponent(),
                        intent, resolvedType)) {
                    Slog.w(TAG,
                            "Activity being started in new voice task does not support: "
@@ -665,7 +673,7 @@ class ActivityStarter {
        if (intent != null && intent.hasFileDescriptors()) {
            throw new IllegalArgumentException("File descriptors passed in Intent");
        }
        mSupervisor.mActivityMetricsLogger.notifyActivityLaunching();
        mSupervisor.getActivityMetricsLogger().notifyActivityLaunching();
        boolean componentSpecified = intent.getComponent() != null;

        // Save a copy in case ephemeral needs it
@@ -859,7 +867,7 @@ class ActivityStarter {
                }
            }

            mSupervisor.mActivityMetricsLogger.notifyActivityLaunched(res, outRecord[0]);
            mSupervisor.getActivityMetricsLogger().notifyActivityLaunched(res, outRecord[0]);
            return res;
        }
    }
Loading