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 static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
214532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brownimport com.android.server.input.InputApplicationHandle;
226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.server.wm.WindowManagerService.H;
236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.pm.ActivityInfo;
256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Message;
266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException;
276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog;
286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IApplicationToken;
296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.View;
306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager;
316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter;
336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/**
356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Version of WindowToken that is specifically for a particular application (or
366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * really activity) that is displaying windows.
376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
38e32c30784191a9244a08450759471c934c85034cCraig Mautnerclass AppWindowToken extends WindowToken {
396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Non-null only for application tokens.
406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final IApplicationToken appToken;
416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // All of the windows and child windows that are included in this
436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // application token.  Note this list is NOT sorted!
44968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner    final WindowList allAppWindows = new WindowList();
45594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final AppWindowAnimator mAppAnimator;
466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
47d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner    final WindowAnimator mAnimator;
48d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner
496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int groupId = -1;
506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean appFullscreen;
516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
525962b12bedc4a1d0354816c1cd6b06ba04f6d807Craig Mautner    boolean showWhenLocked;
53a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // The input dispatching timeout for this application token in nanoseconds.
556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    long inputDispatchingTimeoutNanos;
566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // These are used for determining when all windows associated with
586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // an activity have been drawn, so they can be made visible together
596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // at the same time.
60764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    // initialize so that it doesn't match mTransactionSequence which is an int.
61764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    long lastTransactionSequence = Long.MIN_VALUE;
626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int numInterestingWindows;
636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int numDrawnWindows;
646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean inPendingTransaction;
656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean allDrawn;
667636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner    // Set to true when this app creates a surface while in the middle of an animation. In that
677636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner    // case do not clear allDrawn until the animation completes.
687636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner    boolean deferClearAllDrawn;
696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Is this token going to be hidden in a little while?  If so, it
716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // won't be taken into account for setting the screen orientation.
726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean willBeHidden;
736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Is this window's surface needed?  This is almost like hidden, except
756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // it will sometimes be true a little earlier: when the token has
766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // been shown, but is still waiting for its app transition to execute
776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // before making its windows shown.
786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean hiddenRequested;
796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Have we told the window clients to hide themselves?
816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean clientHidden;
826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Last visibility state we reported to the app token.
846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean reportedVisible;
856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
862c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    // Last drawn state we reported to the app token.
872c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn    boolean reportedDrawn;
882c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn
896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Set to true when the token has been removed from the window mgr.
906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean removed;
916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Information about an application starting window if displayed.
936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    StartingData startingData;
946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowState startingWindow;
956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    View startingView;
966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean startingDisplayed;
976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean startingMoved;
986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean firstWindowDrawn;
996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Input application handle used by the input dispatcher.
1019302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    final InputApplicationHandle mInputApplicationHandle;
1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    AppWindowToken(WindowManagerService _service, IApplicationToken _token) {
1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        super(_service, _token.asBinder(),
1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                WindowManager.LayoutParams.TYPE_APPLICATION, true);
1066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        appWindowToken = this;
1076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        appToken = _token;
1086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mInputApplicationHandle = new InputApplicationHandle(this);
109d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner        mAnimator = service.mAnimator;
110322e40315609acd5a608440bc469d873e09559caCraig Mautner        mAppAnimator = new AppWindowAnimator(this);
1116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void sendAppVisibilityToClients() {
1146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int N = allAppWindows.size();
1156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        for (int i=0; i<N; i++) {
1166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowState win = allAppWindows.get(i);
1176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (win == startingWindow && clientHidden) {
1186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Don't hide the starting window.
1196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                continue;
1206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
1226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG,
1236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        "Setting visibility of " + win + ": " + (!clientHidden));
1246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                win.mClient.dispatchAppVisibility(!clientHidden);
1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (RemoteException e) {
1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void updateReportedVisibilityLocked() {
1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (appToken == null) {
1326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return;
1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int numInteresting = 0;
1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int numVisible = 0;
1372c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        int numDrawn = 0;
1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        boolean nowGone = true;
1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
140c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG,
141c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner                "Update reported visibility: " + this);
1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int N = allAppWindows.size();
1436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        for (int i=0; i<N; i++) {
1446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowState win = allAppWindows.get(i);
1456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (win == startingWindow || win.mAppFreezing
1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || win.mViewVisibility != View.VISIBLE
1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || win.mAttrs.type == TYPE_APPLICATION_STARTING
1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || win.mDestroying) {
1496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                continue;
1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_VISIBILITY) {
1526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Win " + win + ": isDrawn="
1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + win.isDrawnLw()
154a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                        + ", isAnimating=" + win.mWinAnimator.isAnimating());
1556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (!win.isDrawnLw()) {
15629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                    Slog.v(WindowManagerService.TAG, "Not displayed: s=" + win.mWinAnimator.mSurfaceControl
1576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                            + " pv=" + win.mPolicyVisibility
158749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner                            + " mDrawState=" + win.mWinAnimator.mDrawState
1596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                            + " ah=" + win.mAttachedHidden
1606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                            + " th="
1616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                            + (win.mAppToken != null
1626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                                    ? win.mAppToken.hiddenRequested : false)
163a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                            + " a=" + win.mWinAnimator.mAnimating);
1646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
1656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            numInteresting++;
1676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (win.isDrawnLw()) {
1682c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                numDrawn++;
169a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                if (!win.mWinAnimator.isAnimating()) {
1706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    numVisible++;
1716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
1726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                nowGone = false;
173a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            } else if (win.mWinAnimator.isAnimating()) {
1746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                nowGone = false;
1756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
1766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1782c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        boolean nowDrawn = numInteresting > 0 && numDrawn >= numInteresting;
1796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        boolean nowVisible = numInteresting > 0 && numVisible >= numInteresting;
1802c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        if (!nowGone) {
1812c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            // If the app is not yet gone, then it can only become visible/drawn.
1822c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            if (!nowDrawn) {
1832c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                nowDrawn = reportedDrawn;
1842c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            }
1852c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            if (!nowVisible) {
1862c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                nowVisible = reportedVisible;
1872c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            }
1882c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        }
1896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "VIS " + this + ": interesting="
1906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                + numInteresting + " visible=" + numVisible);
1912c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        if (nowDrawn != reportedDrawn) {
1922c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            if (nowDrawn) {
1932c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                Message m = service.mH.obtainMessage(
1942c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                        H.REPORT_APPLICATION_TOKEN_DRAWN, this);
1952c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                service.mH.sendMessage(m);
1962c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            }
1972c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            reportedDrawn = nowDrawn;
1982c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        }
1996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (nowVisible != reportedVisible) {
2006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(
2016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowManagerService.TAG, "Visibility changed in " + this
2026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + ": vis=" + nowVisible);
2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            reportedVisible = nowVisible;
2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Message m = service.mH.obtainMessage(
2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    H.REPORT_APPLICATION_TOKEN_WINDOWS,
2066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    nowVisible ? 1 : 0,
2076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    nowGone ? 1 : 0,
2086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    this);
2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            service.mH.sendMessage(m);
2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowState findMainWindow() {
2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int j = windows.size();
2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        while (j > 0) {
2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            j--;
2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowState win = windows.get(j);
2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (win.mAttrs.type == WindowManager.LayoutParams.TYPE_BASE_APPLICATION
2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || win.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return win;
2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return null;
2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
22672669d18016446d874e4fa1005464e36375124e4Craig Mautner    boolean isVisible() {
22772669d18016446d874e4fa1005464e36375124e4Craig Mautner        final int N = allAppWindows.size();
22872669d18016446d874e4fa1005464e36375124e4Craig Mautner        for (int i=0; i<N; i++) {
22972669d18016446d874e4fa1005464e36375124e4Craig Mautner            WindowState win = allAppWindows.get(i);
23072669d18016446d874e4fa1005464e36375124e4Craig Mautner            if (!win.mAppFreezing
23172669d18016446d874e4fa1005464e36375124e4Craig Mautner                    && (win.mViewVisibility == View.VISIBLE ||
23272669d18016446d874e4fa1005464e36375124e4Craig Mautner                        (win.mWinAnimator.isAnimating() &&
23372669d18016446d874e4fa1005464e36375124e4Craig Mautner                                !service.mAppTransition.isTransitionSet()))
23472669d18016446d874e4fa1005464e36375124e4Craig Mautner                    && !win.mDestroying && win.isDrawnLw()) {
23572669d18016446d874e4fa1005464e36375124e4Craig Mautner                return true;
23672669d18016446d874e4fa1005464e36375124e4Craig Mautner            }
23772669d18016446d874e4fa1005464e36375124e4Craig Mautner        }
23872669d18016446d874e4fa1005464e36375124e4Craig Mautner        return false;
23972669d18016446d874e4fa1005464e36375124e4Craig Mautner    }
24072669d18016446d874e4fa1005464e36375124e4Craig Mautner
241dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner    @Override
2426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void dump(PrintWriter pw, String prefix) {
2436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        super.dump(pw, prefix);
2446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (appToken != null) {
2456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.println("app=true");
2466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (allAppWindows.size() > 0) {
2486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("allAppWindows="); pw.println(allAppWindows);
2496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("groupId="); pw.print(groupId);
2516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" appFullscreen="); pw.print(appFullscreen);
2526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" requestedOrientation="); pw.println(requestedOrientation);
2536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("hiddenRequested="); pw.print(hiddenRequested);
2546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" clientHidden="); pw.print(clientHidden);
2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" willBeHidden="); pw.print(willBeHidden);
2562c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                pw.print(" reportedDrawn="); pw.print(reportedDrawn);
2576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" reportedVisible="); pw.println(reportedVisible);
258594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (paused) {
259594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("paused="); pw.println(paused);
2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (numInterestingWindows != 0 || numDrawnWindows != 0
2626fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                || allDrawn || mAppAnimator.allDrawn) {
2636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("numInterestingWindows=");
2646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(numInterestingWindows);
2656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" numDrawnWindows="); pw.print(numDrawnWindows);
2666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" inPendingTransaction="); pw.print(inPendingTransaction);
2676fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    pw.print(" allDrawn="); pw.print(allDrawn);
2686fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    pw.print(" (animator="); pw.print(mAppAnimator.allDrawn);
2696fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    pw.println(")");
2706fbda63e68513ece4409dac845588711ab25c39dCraig Mautner        }
2716fbda63e68513ece4409dac845588711ab25c39dCraig Mautner        if (inPendingTransaction) {
2726fbda63e68513ece4409dac845588711ab25c39dCraig Mautner            pw.print(prefix); pw.print("inPendingTransaction=");
2736fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    pw.println(inPendingTransaction);
2746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (startingData != null || removed || firstWindowDrawn) {
2766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("startingData="); pw.print(startingData);
2776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" removed="); pw.print(removed);
2786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" firstWindowDrawn="); pw.println(firstWindowDrawn);
2796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (startingWindow != null || startingView != null
2816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                || startingDisplayed || startingMoved) {
2826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("startingWindow="); pw.print(startingWindow);
2836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" startingView="); pw.print(startingView);
2846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" startingDisplayed="); pw.print(startingDisplayed);
2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" startingMoved"); pw.println(startingMoved);
2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
2906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public String toString() {
2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (stringName == null) {
2926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            StringBuilder sb = new StringBuilder();
2936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sb.append("AppWindowToken{");
2946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sb.append(Integer.toHexString(System.identityHashCode(this)));
2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sb.append(" token="); sb.append(token); sb.append('}');
2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            stringName = sb.toString();
2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return stringName;
2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
300e9bdb31ea1dc3c1c2b1833a4bf0031d85928a45bJeff Brown}
301