• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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