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}