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;
206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter;
226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.util.ArrayList;
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;
336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
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.
516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final ArrayList<WindowState> windows = new ArrayList<WindowState>();
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    // Set to true when this token is in a pending transaction where its
756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // windows will be put to the top of the list.
766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean sendingToTop;
776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowToken(WindowManagerService _service, IBinder _token, int type, boolean _explicit) {
796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        service = _service;
806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        token = _token;
816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        windowType = type;
826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        explicit = _explicit;
836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void dump(PrintWriter pw, String prefix) {
866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("token="); pw.println(token);
876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("windows="); pw.println(windows);
886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("windowType="); pw.print(windowType);
896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" hidden="); pw.print(hidden);
906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" hasVisible="); pw.println(hasVisible);
916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (waitingToShow || waitingToHide || sendingToBottom || sendingToTop) {
926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("waitingToShow="); pw.print(waitingToShow);
936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" waitingToHide="); pw.print(waitingToHide);
946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" sendingToBottom="); pw.print(sendingToBottom);
956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" sendingToTop="); pw.println(sendingToTop);
966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public String toString() {
1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (stringName == null) {
1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            StringBuilder sb = new StringBuilder();
1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sb.append("WindowToken{");
1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sb.append(Integer.toHexString(System.identityHashCode(this)));
1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sb.append(" token="); sb.append(token); sb.append('}');
1066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            stringName = sb.toString();
1076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return stringName;
1096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}