1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.wm; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.app.WindowConfiguration; 22 import android.content.pm.ActivityInfo; 23 import android.os.UserHandle; 24 import android.util.ArraySet; 25 import android.window.DisplayWindowPolicyController; 26 27 import java.io.PrintWriter; 28 import java.util.List; 29 30 class DisplayWindowPolicyControllerHelper { 31 32 private final DisplayContent mDisplayContent; 33 34 /** 35 * The policy controller of the windows that can be displayed on the virtual display. 36 * 37 * @see DisplayWindowPolicyController 38 */ 39 @Nullable 40 private DisplayWindowPolicyController mDisplayWindowPolicyController; 41 42 /** 43 * The top non-finishing activity of this display. 44 */ 45 private ActivityRecord mTopRunningActivity = null; 46 47 /** 48 * All the uids of non-finishing activity on this display. 49 * @see DisplayWindowPolicyController#onRunningAppsChanged(ArraySet) 50 */ 51 private ArraySet<Integer> mRunningUid = new ArraySet<>(); 52 DisplayWindowPolicyControllerHelper(DisplayContent displayContent)53 DisplayWindowPolicyControllerHelper(DisplayContent displayContent) { 54 mDisplayContent = displayContent; 55 mDisplayWindowPolicyController = mDisplayContent.mWmService.mDisplayManagerInternal 56 .getDisplayWindowPolicyController(mDisplayContent.mDisplayId); 57 } 58 59 /** 60 * Return {@code true} if there is DisplayWindowPolicyController. 61 */ hasController()62 public boolean hasController() { 63 return mDisplayWindowPolicyController != null; 64 } 65 66 /** 67 * @see DisplayWindowPolicyController#canContainActivities(List, int) 68 */ canContainActivities(@onNull List<ActivityInfo> activities, @WindowConfiguration.WindowingMode int windowingMode)69 public boolean canContainActivities(@NonNull List<ActivityInfo> activities, 70 @WindowConfiguration.WindowingMode int windowingMode) { 71 if (mDisplayWindowPolicyController == null) { 72 return true; 73 } 74 return mDisplayWindowPolicyController.canContainActivities(activities, windowingMode); 75 } 76 77 /** 78 * @see DisplayWindowPolicyController#canActivityBeLaunched(ActivityInfo, int, int, boolean) 79 */ canActivityBeLaunched(ActivityInfo activityInfo, @WindowConfiguration.WindowingMode int windowingMode, int launchingFromDisplayId, boolean isNewTask)80 public boolean canActivityBeLaunched(ActivityInfo activityInfo, 81 @WindowConfiguration.WindowingMode int windowingMode, int launchingFromDisplayId, 82 boolean isNewTask) { 83 if (mDisplayWindowPolicyController == null) { 84 return true; 85 } 86 return mDisplayWindowPolicyController.canActivityBeLaunched(activityInfo, windowingMode, 87 launchingFromDisplayId, isNewTask); 88 } 89 90 /** 91 * @see DisplayWindowPolicyController#keepActivityOnWindowFlagsChanged(ActivityInfo, int, int) 92 */ keepActivityOnWindowFlagsChanged(ActivityInfo aInfo, int flagChanges, int privateFlagChanges)93 boolean keepActivityOnWindowFlagsChanged(ActivityInfo aInfo, int flagChanges, 94 int privateFlagChanges) { 95 if (mDisplayWindowPolicyController == null) { 96 return true; 97 } 98 99 if (!mDisplayWindowPolicyController.isInterestedWindowFlags( 100 flagChanges, privateFlagChanges)) { 101 return true; 102 } 103 104 return mDisplayWindowPolicyController.keepActivityOnWindowFlagsChanged( 105 aInfo, flagChanges, privateFlagChanges); 106 } 107 108 /** Update the top activity and the uids of non-finishing activity */ onRunningActivityChanged()109 void onRunningActivityChanged() { 110 if (mDisplayWindowPolicyController == null) { 111 return; 112 } 113 114 // Update top activity. 115 ActivityRecord topActivity = mDisplayContent.getTopActivity(false /* includeFinishing */, 116 true /* includeOverlays */); 117 if (topActivity != mTopRunningActivity) { 118 mTopRunningActivity = topActivity; 119 mDisplayWindowPolicyController.onTopActivityChanged( 120 topActivity == null ? null : topActivity.info.getComponentName(), 121 topActivity == null 122 ? UserHandle.USER_NULL : topActivity.info.applicationInfo.uid); 123 } 124 125 // Update running uid. 126 final boolean[] notifyChanged = {false}; 127 ArraySet<Integer> runningUids = new ArraySet<>(); 128 mDisplayContent.forAllActivities((r) -> { 129 if (!r.finishing) { 130 notifyChanged[0] |= runningUids.add(r.getUid()); 131 } 132 }); 133 134 // We need to compare the size because if it is the following case, we can't know the 135 // existence of 3 in the forAllActivities() loop. 136 // Old set: 1,2,3 137 // New set: 1,2 138 if (notifyChanged[0] || (mRunningUid.size() != runningUids.size())) { 139 mRunningUid = runningUids; 140 mDisplayWindowPolicyController.onRunningAppsChanged(runningUids); 141 } 142 } 143 144 /** 145 * @see DisplayWindowPolicyController#isWindowingModeSupported(int) 146 */ isWindowingModeSupported( @indowConfiguration.WindowingMode int windowingMode)147 public final boolean isWindowingModeSupported( 148 @WindowConfiguration.WindowingMode int windowingMode) { 149 if (mDisplayWindowPolicyController == null) { 150 return true; 151 } 152 return mDisplayWindowPolicyController.isWindowingModeSupported(windowingMode); 153 } 154 155 /** 156 * @see DisplayWindowPolicyController#canShowTasksInRecents() 157 */ canShowTasksInRecents()158 public final boolean canShowTasksInRecents() { 159 if (mDisplayWindowPolicyController == null) { 160 return true; 161 } 162 return mDisplayWindowPolicyController.canShowTasksInRecents(); 163 } 164 dump(String prefix, PrintWriter pw)165 void dump(String prefix, PrintWriter pw) { 166 if (mDisplayWindowPolicyController != null) { 167 pw.println(); 168 mDisplayWindowPolicyController.dump(prefix, pw); 169 } 170 } 171 } 172