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

Commit 1cb61528 authored by Chilun's avatar Chilun
Browse files

Ask the policy controller for launching activities

Ask the policy controller whether an activity can be displayed on the
virtual display when it is going to launch or reparent.

Also notify the policy controller the activity changes on the virtual
display.

Bug: 201712607
Test: atest DisplayWindowPolicyControllerHelperTests
      atest ActivityRecordTests
      atest ActivityTaskSupervisorTests
      atest TaskTests
      atest TaskFragmentTest
      atest WindowManagerServiceTests

Change-Id: I11fcc38782b21ccb2f0474777242dbf5901c59e1
parent 967a70e5
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.window;
import android.annotation.NonNull;
import android.content.ComponentName;
import android.content.pm.ActivityInfo;
import android.util.ArraySet;

import java.io.PrintWriter;
import java.util.List;
@@ -81,8 +82,10 @@ public abstract class DisplayWindowPolicyController {

    /**
     * This is called when the apps that contains running activities on the display has changed.
     * The running activities refer to the non-finishing activities regardless of they are running
     * in a process.
     */
    public void onRunningAppsChanged(int[] runningUids) {}
    public void onRunningAppsChanged(ArraySet<Integer> runningUids) {}

    /** Dump debug data */
    public void dump(String prefix, final PrintWriter pw) {
+2 −4
Original line number Diff line number Diff line
@@ -84,11 +84,9 @@ class GenericWindowPolicyController extends DisplayWindowPolicyController {
    }

    @Override
    public void onRunningAppsChanged(int[] runningUids) {
    public void onRunningAppsChanged(ArraySet<Integer> runningUids) {
        mRunningUids.clear();
        for (int i = 0; i < runningUids.length; i++) {
            mRunningUids.add(runningUids[i]);
        }
        mRunningUids.addAll(runningUids);
    }

    /**
+9 −1
Original line number Diff line number Diff line
@@ -1546,10 +1546,17 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    void onDisplayChanged(DisplayContent dc) {
        DisplayContent prevDc = mDisplayContent;
        super.onDisplayChanged(dc);
        if (prevDc == null || prevDc == mDisplayContent) {
        if (prevDc == mDisplayContent) {
            return;
        }

        mDisplayContent.onRunningActivityChanged();

        if (prevDc == null) {
            return;
        }
        prevDc.onRunningActivityChanged();

        // TODO(b/169035022): move to a more-appropriate place.
        mTransitionController.collect(this);
        if (prevDc.mOpeningApps.remove(this)) {
@@ -3900,6 +3907,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A

        // Reset the last saved PiP snap fraction on removal.
        mDisplayContent.mPinnedTaskController.onActivityHidden(mActivityComponent);
        mDisplayContent.onRunningActivityChanged();
        mWmService.mEmbeddedWindowController.onActivityRemoved(this);
        mRemovingFromDisplay = false;
    }
+30 −0
Original line number Diff line number Diff line
@@ -364,6 +364,17 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
    /** Check if placing task or activity on specified display is allowed. */
    boolean canPlaceEntityOnDisplay(int displayId, int callingPid, int callingUid,
            ActivityInfo activityInfo) {
        return canPlaceEntityOnDisplay(displayId, callingPid, callingUid, null /* task */,
                activityInfo);
    }

    boolean canPlaceEntityOnDisplay(int displayId, int callingPid, int callingUid, Task task) {
        return canPlaceEntityOnDisplay(displayId, callingPid, callingUid, task,
                null /* activityInfo */);
    }

    private boolean canPlaceEntityOnDisplay(int displayId, int callingPid, int callingUid,
            Task task, ActivityInfo activityInfo) {
        if (displayId == DEFAULT_DISPLAY) {
            // No restrictions for the default display.
            return true;
@@ -372,12 +383,31 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
            // Can't launch on secondary displays if feature is not supported.
            return false;
        }

        if (!isCallerAllowedToLaunchOnDisplay(callingPid, callingUid, displayId, activityInfo)) {
            // Can't place activities to a display that has restricted launch rules.
            // In this case the request should be made by explicitly adding target display id and
            // by caller with corresponding permissions. See #isCallerAllowedToLaunchOnDisplay().
            return false;
        }

        final DisplayContent displayContent =
                mRootWindowContainer.getDisplayContentOrCreate(displayId);
        if (displayContent != null && displayContent.mDwpcHelper.hasController()) {
            final ArrayList<ActivityInfo> activities = new ArrayList<>();
            if (activityInfo != null) {
                activities.add(activityInfo);
            }
            if (task != null) {
                task.forAllActivities((r) -> {
                    activities.add(r.info);
                });
            }
            if (!displayContent.mDwpcHelper.canContainActivities(activities)) {
                return false;
            }
        }

        return true;
    }

+10 −11
Original line number Diff line number Diff line
@@ -222,7 +222,6 @@ import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.WindowManager.DisplayImePolicy;
import android.view.WindowManagerPolicyConstants.PointerEventListener;
import android.window.DisplayWindowPolicyController;
import android.window.IDisplayAreaOrganizer;
import android.window.TransitionRequestInfo;

@@ -698,12 +697,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
    boolean mDontMoveToTop;

    /**
     * The policy controller of the windows that can be displayed on the virtual display.
     * The helper of policy controller.
     *
     * @see DisplayWindowPolicyController
     * @see DisplayWindowPolicyControllerHelper
     */
    @Nullable
    DisplayWindowPolicyController mDisplayWindowPolicyController;
    DisplayWindowPolicyControllerHelper mDwpcHelper;

    private final Consumer<WindowState> mUpdateWindowsForAnimator = w -> {
        WindowStateAnimator winAnimator = w.mWinAnimator;
@@ -2739,8 +2737,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                mDisplayInfo.copyFrom(newDisplayInfo);
            }

            mDisplayWindowPolicyController =
                    displayManagerInternal.getDisplayWindowPolicyController(mDisplayId);
            mDwpcHelper = new DisplayWindowPolicyControllerHelper(this);
        }

        updateBaseDisplayMetrics(mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight,
@@ -3450,10 +3447,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        mInputMonitor.dump(pw, "  ");
        pw.println();
        mInsetsStateController.dump(prefix, pw);
        if (mDisplayWindowPolicyController != null) {
            pw.println();
            mDisplayWindowPolicyController.dump(prefix, pw);
        }
        mDwpcHelper.dump(prefix, pw);
    }

    @Override
@@ -3681,6 +3675,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        return true;
    }

    /** Update the top activity and the uids of non-finishing activity */
    void onRunningActivityChanged() {
        mDwpcHelper.onRunningActivityChanged();
    }

    /** Called when the focused {@link TaskDisplayArea} on this display may have changed. */
    void onLastFocusedTaskDisplayAreaChanged(@Nullable TaskDisplayArea taskDisplayArea) {
        // Only record the TaskDisplayArea that handles orientation request.
Loading