16e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/* 26e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Copyright (C) 2011 The Android Open Source Project 36e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 46e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 56e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * you may not use this file except in compliance with the License. 66e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * You may obtain a copy of the License at 76e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 86e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 96e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * 106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Unless required by applicable law or agreed to in writing, software 116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * See the License for the specific language governing permissions and 146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * limitations under the License. 156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornpackage com.android.server.wm; 186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.IBinder; 203a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslavimport android.util.Slog; 216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter; 236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/** 256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Container of a set of related windows in the window manager. Often this 266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * is an AppWindowToken, which is the handle for an Activity that it uses 276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * to display windows. For nested windows, there is a WindowToken created for 286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * the parent window to manage its children. 296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */ 306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornclass WindowToken { 316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // The window manager! 326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final WindowManagerService service; 333a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav 346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // The actual token. 356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final IBinder token; 366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // The type of window this token is for, as per WindowManager.LayoutParams. 386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final int windowType; 396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Set if this token was explicitly added by a client, so should 416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // not be removed when all windows are removed. 426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn final boolean explicit; 436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // For printing. 456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn String stringName; 466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // If this is an AppWindowToken, this is non-null. 486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn AppWindowToken appWindowToken; 496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // All of the windows associated with this token. 517b1aa77a9b25b4b1e8070c9cccfadcde39954952Craig Mautner final WindowList windows = new WindowList(); 526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Is key dispatching paused for this token? 546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean paused = false; 556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Should this token's windows be hidden? 576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean hidden; 586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Temporary for finding which tokens no longer have visible windows. 606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean hasVisible; 616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Set to true when this token is in a pending transaction where it 636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // will be shown. 646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean waitingToShow; 656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Set to true when this token is in a pending transaction where it 676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // will be hidden. 686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean waitingToHide; 696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // Set to true when this token is in a pending transaction where its 716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn // windows will be put to the bottom of the list. 726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn boolean sendingToBottom; 736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn WindowToken(WindowManagerService _service, IBinder _token, int type, boolean _explicit) { 756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn service = _service; 766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn token = _token; 776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn windowType = type; 786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn explicit = _explicit; 796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 803a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav 813a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav void removeAllWindows() { 823a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { 833a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav WindowState win = windows.get(winNdx); 843a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav if (WindowManagerService.DEBUG_WINDOW_MOVEMENT) Slog.w(WindowManagerService.TAG, 853a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav "removeAllWindows: removing win=" + win); 863a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav win.mService.removeWindowLocked(win.mSession, win); 873a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav } 883a5c721072c60c7ed9c8a95d0a65d0e3cb4eb9bbSvetoslav } 896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn void dump(PrintWriter pw, String prefix) { 916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("windows="); pw.println(windows); 926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("windowType="); pw.print(windowType); 936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" hidden="); pw.print(hidden); 946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" hasVisible="); pw.println(hasVisible); 95ef25d7a01910d5547b60c9cc52d4fa4a9e40b6faCraig Mautner if (waitingToShow || waitingToHide || sendingToBottom) { 966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(prefix); pw.print("waitingToShow="); pw.print(waitingToShow); 976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" waitingToHide="); pw.print(waitingToHide); 986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn pw.print(" sendingToBottom="); pw.print(sendingToBottom); 996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn 1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn @Override 1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn public String toString() { 1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn if (stringName == null) { 1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn StringBuilder sb = new StringBuilder(); 1066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sb.append("WindowToken{"); 1076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn sb.append(Integer.toHexString(System.identityHashCode(this))); 108ef03a7f441cf0cbef5a5f7fafb58a7d5aea7ef52Dianne Hackborn sb.append(" "); sb.append(token); sb.append('}'); 1096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn stringName = sb.toString(); 1106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn return stringName; 1126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn } 1136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}