AppWindowToken.java revision e30e02f5d9a9141c9ee70c712d4f9d52c88ea969
1/* 2 * Copyright (C) 2011 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 17package com.android.server.wm; 18 19import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; 20 21import com.android.server.input.InputApplicationHandle; 22import com.android.server.wm.WindowManagerService.H; 23 24import android.content.pm.ActivityInfo; 25import android.os.Message; 26import android.os.RemoteException; 27import android.util.Slog; 28import android.view.IApplicationToken; 29import android.view.View; 30import android.view.WindowManager; 31 32import java.io.PrintWriter; 33import java.util.ArrayList; 34 35class AppTokenList extends ArrayList<AppWindowToken> { 36} 37 38/** 39 * Version of WindowToken that is specifically for a particular application (or 40 * really activity) that is displaying windows. 41 */ 42class AppWindowToken extends WindowToken { 43 // Non-null only for application tokens. 44 final IApplicationToken appToken; 45 46 // All of the windows and child windows that are included in this 47 // application token. Note this list is NOT sorted! 48 final WindowList allAppWindows = new WindowList(); 49 final AppWindowAnimator mAppAnimator; 50 51 final WindowAnimator mAnimator; 52 53 final boolean voiceInteraction; 54 55 int groupId = -1; 56 boolean appFullscreen; 57 int requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 58 boolean layoutConfigChanges; 59 boolean showWhenLocked; 60 61 // The input dispatching timeout for this application token in nanoseconds. 62 long inputDispatchingTimeoutNanos; 63 64 // These are used for determining when all windows associated with 65 // an activity have been drawn, so they can be made visible together 66 // at the same time. 67 // initialize so that it doesn't match mTransactionSequence which is an int. 68 long lastTransactionSequence = Long.MIN_VALUE; 69 int numInterestingWindows; 70 int numDrawnWindows; 71 boolean inPendingTransaction; 72 boolean allDrawn; 73 // Set to true when this app creates a surface while in the middle of an animation. In that 74 // case do not clear allDrawn until the animation completes. 75 boolean deferClearAllDrawn; 76 77 // Is this token going to be hidden in a little while? If so, it 78 // won't be taken into account for setting the screen orientation. 79 boolean willBeHidden; 80 81 // Is this window's surface needed? This is almost like hidden, except 82 // it will sometimes be true a little earlier: when the token has 83 // been shown, but is still waiting for its app transition to execute 84 // before making its windows shown. 85 boolean hiddenRequested; 86 87 // Have we told the window clients to hide themselves? 88 boolean clientHidden; 89 90 // Last visibility state we reported to the app token. 91 boolean reportedVisible; 92 93 // Last drawn state we reported to the app token. 94 boolean reportedDrawn; 95 96 // Set to true when the token has been removed from the window mgr. 97 boolean removed; 98 99 // Information about an application starting window if displayed. 100 StartingData startingData; 101 WindowState startingWindow; 102 View startingView; 103 boolean startingDisplayed; 104 boolean startingMoved; 105 boolean firstWindowDrawn; 106 107 // Input application handle used by the input dispatcher. 108 final InputApplicationHandle mInputApplicationHandle; 109 110 boolean mDeferRemoval; 111 112 AppWindowToken(WindowManagerService _service, IApplicationToken _token, 113 boolean _voiceInteraction) { 114 super(_service, _token.asBinder(), 115 WindowManager.LayoutParams.TYPE_APPLICATION, true); 116 appWindowToken = this; 117 appToken = _token; 118 voiceInteraction = _voiceInteraction; 119 mInputApplicationHandle = new InputApplicationHandle(this); 120 mAnimator = service.mAnimator; 121 mAppAnimator = new AppWindowAnimator(this); 122 } 123 124 void sendAppVisibilityToClients() { 125 final int N = allAppWindows.size(); 126 for (int i=0; i<N; i++) { 127 WindowState win = allAppWindows.get(i); 128 if (win == startingWindow && clientHidden) { 129 // Don't hide the starting window. 130 continue; 131 } 132 try { 133 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, 134 "Setting visibility of " + win + ": " + (!clientHidden)); 135 win.mClient.dispatchAppVisibility(!clientHidden); 136 } catch (RemoteException e) { 137 } 138 } 139 } 140 141 void updateReportedVisibilityLocked() { 142 if (appToken == null) { 143 return; 144 } 145 146 int numInteresting = 0; 147 int numVisible = 0; 148 int numDrawn = 0; 149 boolean nowGone = true; 150 151 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, 152 "Update reported visibility: " + this); 153 final int N = allAppWindows.size(); 154 for (int i=0; i<N; i++) { 155 WindowState win = allAppWindows.get(i); 156 if (win == startingWindow || win.mAppFreezing 157 || win.mViewVisibility != View.VISIBLE 158 || win.mAttrs.type == TYPE_APPLICATION_STARTING 159 || win.mDestroying) { 160 continue; 161 } 162 if (WindowManagerService.DEBUG_VISIBILITY) { 163 Slog.v(WindowManagerService.TAG, "Win " + win + ": isDrawn=" 164 + win.isDrawnLw() 165 + ", isAnimating=" + win.mWinAnimator.isAnimating()); 166 if (!win.isDrawnLw()) { 167 Slog.v(WindowManagerService.TAG, "Not displayed: s=" + win.mWinAnimator.mSurfaceControl 168 + " pv=" + win.mPolicyVisibility 169 + " mDrawState=" + win.mWinAnimator.mDrawState 170 + " ah=" + win.mAttachedHidden 171 + " th=" 172 + (win.mAppToken != null 173 ? win.mAppToken.hiddenRequested : false) 174 + " a=" + win.mWinAnimator.mAnimating); 175 } 176 } 177 numInteresting++; 178 if (win.isDrawnLw()) { 179 numDrawn++; 180 if (!win.mWinAnimator.isAnimating()) { 181 numVisible++; 182 } 183 nowGone = false; 184 } else if (win.mWinAnimator.isAnimating()) { 185 nowGone = false; 186 } 187 } 188 189 boolean nowDrawn = numInteresting > 0 && numDrawn >= numInteresting; 190 boolean nowVisible = numInteresting > 0 && numVisible >= numInteresting; 191 if (!nowGone) { 192 // If the app is not yet gone, then it can only become visible/drawn. 193 if (!nowDrawn) { 194 nowDrawn = reportedDrawn; 195 } 196 if (!nowVisible) { 197 nowVisible = reportedVisible; 198 } 199 } 200 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "VIS " + this + ": interesting=" 201 + numInteresting + " visible=" + numVisible); 202 if (nowDrawn != reportedDrawn) { 203 if (nowDrawn) { 204 Message m = service.mH.obtainMessage( 205 H.REPORT_APPLICATION_TOKEN_DRAWN, this); 206 service.mH.sendMessage(m); 207 } 208 reportedDrawn = nowDrawn; 209 } 210 if (nowVisible != reportedVisible) { 211 if (WindowManagerService.DEBUG_VISIBILITY) Slog.v( 212 WindowManagerService.TAG, "Visibility changed in " + this 213 + ": vis=" + nowVisible); 214 reportedVisible = nowVisible; 215 Message m = service.mH.obtainMessage( 216 H.REPORT_APPLICATION_TOKEN_WINDOWS, 217 nowVisible ? 1 : 0, 218 nowGone ? 1 : 0, 219 this); 220 service.mH.sendMessage(m); 221 } 222 } 223 224 WindowState findMainWindow() { 225 int j = windows.size(); 226 while (j > 0) { 227 j--; 228 WindowState win = windows.get(j); 229 if (win.mAttrs.type == WindowManager.LayoutParams.TYPE_BASE_APPLICATION 230 || win.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { 231 return win; 232 } 233 } 234 return null; 235 } 236 237 boolean isVisible() { 238 final int N = allAppWindows.size(); 239 for (int i=0; i<N; i++) { 240 WindowState win = allAppWindows.get(i); 241 if (!win.mAppFreezing 242 && (win.mViewVisibility == View.VISIBLE || 243 (win.mWinAnimator.isAnimating() && 244 !service.mAppTransition.isTransitionSet())) 245 && !win.mDestroying && win.isDrawnLw()) { 246 return true; 247 } 248 } 249 return false; 250 } 251 252 @Override 253 void dump(PrintWriter pw, String prefix) { 254 super.dump(pw, prefix); 255 if (appToken != null) { 256 pw.print(prefix); pw.print("app=true voiceInteraction="); pw.println(voiceInteraction); 257 } 258 if (allAppWindows.size() > 0) { 259 pw.print(prefix); pw.print("allAppWindows="); pw.println(allAppWindows); 260 } 261 pw.print(prefix); pw.print("groupId="); pw.print(groupId); 262 pw.print(" appFullscreen="); pw.print(appFullscreen); 263 pw.print(" requestedOrientation="); pw.println(requestedOrientation); 264 pw.print(prefix); pw.print("hiddenRequested="); pw.print(hiddenRequested); 265 pw.print(" clientHidden="); pw.print(clientHidden); 266 pw.print(" willBeHidden="); pw.print(willBeHidden); 267 pw.print(" reportedDrawn="); pw.print(reportedDrawn); 268 pw.print(" reportedVisible="); pw.println(reportedVisible); 269 if (paused) { 270 pw.print(prefix); pw.print("paused="); pw.println(paused); 271 } 272 if (numInterestingWindows != 0 || numDrawnWindows != 0 273 || allDrawn || mAppAnimator.allDrawn) { 274 pw.print(prefix); pw.print("numInterestingWindows="); 275 pw.print(numInterestingWindows); 276 pw.print(" numDrawnWindows="); pw.print(numDrawnWindows); 277 pw.print(" inPendingTransaction="); pw.print(inPendingTransaction); 278 pw.print(" allDrawn="); pw.print(allDrawn); 279 pw.print(" (animator="); pw.print(mAppAnimator.allDrawn); 280 pw.println(")"); 281 } 282 if (inPendingTransaction) { 283 pw.print(prefix); pw.print("inPendingTransaction="); 284 pw.println(inPendingTransaction); 285 } 286 if (startingData != null || removed || firstWindowDrawn) { 287 pw.print(prefix); pw.print("startingData="); pw.print(startingData); 288 pw.print(" removed="); pw.print(removed); 289 pw.print(" firstWindowDrawn="); pw.println(firstWindowDrawn); 290 } 291 if (startingWindow != null || startingView != null 292 || startingDisplayed || startingMoved) { 293 pw.print(prefix); pw.print("startingWindow="); pw.print(startingWindow); 294 pw.print(" startingView="); pw.print(startingView); 295 pw.print(" startingDisplayed="); pw.print(startingDisplayed); 296 pw.print(" startingMoved"); pw.println(startingMoved); 297 } 298 } 299 300 @Override 301 public String toString() { 302 if (stringName == null) { 303 StringBuilder sb = new StringBuilder(); 304 sb.append("AppWindowToken{"); 305 sb.append(Integer.toHexString(System.identityHashCode(this))); 306 sb.append(" token="); sb.append(token); sb.append('}'); 307 stringName = sb.toString(); 308 } 309 return stringName; 310 } 311} 312