AppWindowToken.java revision d09cc4ba247e896cc95a57ed7a3247b55b1b68fc
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
216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport com.android.server.wm.WindowManagerService.H;
226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.content.pm.ActivityInfo;
248078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackbornimport android.graphics.Matrix;
256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.Message;
266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.os.RemoteException;
276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.util.Slog;
286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.IApplicationToken;
298078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackbornimport android.view.Surface;
306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.View;
316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.WindowManager;
32e32c30784191a9244a08450759471c934c85034cCraig Mautnerimport android.view.WindowManagerPolicy;
336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.animation.Animation;
346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport android.view.animation.Transformation;
356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.io.PrintWriter;
376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornimport java.util.ArrayList;
386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn/**
406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * Version of WindowToken that is specifically for a particular application (or
416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn * really activity) that is displaying windows.
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
43e32c30784191a9244a08450759471c934c85034cCraig Mautnerclass AppWindowToken extends WindowToken {
446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Non-null only for application tokens.
456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final IApplicationToken appToken;
466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // All of the windows and child windows that are included in this
486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // application token.  Note this list is NOT sorted!
496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final ArrayList<WindowState> allAppWindows = new ArrayList<WindowState>();
506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
51d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner    final WindowAnimator mAnimator;
52d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner
536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int groupId = -1;
546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean appFullscreen;
556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
56a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // The input dispatching timeout for this application token in nanoseconds.
586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    long inputDispatchingTimeoutNanos;
596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // These are used for determining when all windows associated with
616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // an activity have been drawn, so they can be made visible together
626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // at the same time.
63764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    // initialize so that it doesn't match mTransactionSequence which is an int.
64764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    long lastTransactionSequence = Long.MIN_VALUE;
656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int numInterestingWindows;
666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int numDrawnWindows;
676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean inPendingTransaction;
686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean allDrawn;
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    // Have we been asked to have this token keep the screen frozen?
93d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner    // Protect with mAnimator.
946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean freezingScreen;
956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean animating;
976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    Animation animation;
988078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    boolean animInitialized;
996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean hasTransformation;
1006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    final Transformation transformation = new Transformation();
1016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Offset to the window of all layers in the token, for use by
1036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // AppWindowToken animations.
1046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    int animLayerAdjustment;
1056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Information about an application starting window if displayed.
1076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    StartingData startingData;
1086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowState startingWindow;
1096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    View startingView;
1106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean startingDisplayed;
1116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean startingMoved;
1126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    boolean firstWindowDrawn;
1136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1148078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    // Special surface for thumbnail animation.
1158078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    Surface thumbnail;
1168078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    int thumbnailTransactionSeq;
1178078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    int thumbnailX;
1188078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    int thumbnailY;
1198078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    int thumbnailLayer;
1208078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    Animation thumbnailAnimation;
1218078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    final Transformation thumbnailTransformation = new Transformation();
1228078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
1236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // Input application handle used by the input dispatcher.
1249302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    final InputApplicationHandle mInputApplicationHandle;
1256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    AppWindowToken(WindowManagerService _service, IApplicationToken _token) {
1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        super(_service, _token.asBinder(),
1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                WindowManager.LayoutParams.TYPE_APPLICATION, true);
1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        appWindowToken = this;
1306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        appToken = _token;
1316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mInputApplicationHandle = new InputApplicationHandle(this);
132d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner        mAnimator = service.mAnimator;
1336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1358078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public void setAnimation(Animation anim, boolean initialized) {
1366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.localLOGV) Slog.v(
1376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowManagerService.TAG, "Setting animation in " + this + ": " + anim);
1386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        animation = anim;
1396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        animating = false;
1408078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        animInitialized = initialized;
1416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        anim.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION);
1426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        anim.scaleCurrentDuration(service.mTransitionAnimationScale);
1436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int zorder = anim.getZAdjustment();
1446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int adj = 0;
1456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (zorder == Animation.ZORDER_TOP) {
1466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            adj = WindowManagerService.TYPE_LAYER_OFFSET;
1476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else if (zorder == Animation.ZORDER_BOTTOM) {
1486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            adj = -WindowManagerService.TYPE_LAYER_OFFSET;
1496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (animLayerAdjustment != adj) {
1526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            animLayerAdjustment = adj;
1536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateLayers();
1546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
15522ce1414a0073b5cddadf1da8475f6fb7b409e44Craig Mautner        // Start out animation gone if window is gone, or visible if window is visible.
15622ce1414a0073b5cddadf1da8475f6fb7b409e44Craig Mautner        transformation.clear();
15722ce1414a0073b5cddadf1da8475f6fb7b409e44Craig Mautner        transformation.setAlpha(reportedVisible ? 1 : 0);
15822ce1414a0073b5cddadf1da8475f6fb7b409e44Craig Mautner        hasTransformation = true;
1596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void setDummyAnimation() {
1626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (animation == null) {
1636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.localLOGV) Slog.v(
1646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                WindowManagerService.TAG, "Setting dummy animation in " + this);
1656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            animation = WindowManagerService.sDummyAnimation;
1668078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            animInitialized = false;
1676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public void clearAnimation() {
1716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (animation != null) {
1726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            animation = null;
1736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            animating = true;
1748078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            animInitialized = false;
1758078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        }
1768078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        clearThumbnail();
1778078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
1788078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn
1798078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    public void clearThumbnail() {
1808078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (thumbnail != null) {
1818078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            thumbnail.destroy();
1828078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            thumbnail = null;
1836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
1846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
1856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void updateLayers() {
1876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int N = allAppWindows.size();
1886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int adj = animLayerAdjustment;
1898078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        thumbnailLayer = -1;
1906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        for (int i=0; i<N; i++) {
191c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            final WindowState w = allAppWindows.get(i);
192c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            final WindowStateAnimator winAnimator = w.mWinAnimator;
193c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            winAnimator.mAnimLayer = w.mLayer + adj;
194c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            if (winAnimator.mAnimLayer > thumbnailLayer) {
195c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                thumbnailLayer = winAnimator.mAnimLayer;
1968078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            }
1976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_LAYERS) Slog.v(WindowManagerService.TAG, "Updating layer " + w + ": "
198c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                    + winAnimator.mAnimLayer);
1996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (w == service.mInputMethodTarget && !service.mInputMethodTargetWaitingAnim) {
2006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                service.setInputMethodAnimLayerAdjustment(adj);
2016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (w == service.mWallpaperTarget && service.mLowerWallpaperTarget == null) {
2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                service.setWallpaperAnimLayerAdjustmentLocked(adj);
2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void sendAppVisibilityToClients() {
2096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int N = allAppWindows.size();
2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        for (int i=0; i<N; i++) {
2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowState win = allAppWindows.get(i);
2126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (win == startingWindow && clientHidden) {
2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Don't hide the starting window.
2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                continue;
2156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            try {
2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG,
2186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        "Setting visibility of " + win + ": " + (!clientHidden));
2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                win.mClient.dispatchAppVisibility(!clientHidden);
2206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } catch (RemoteException e) {
2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
2226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
22503273d00ce1d7b4ebde95994732dd80204ba7e68Craig Mautner    boolean showAllWindowsLocked() {
22603273d00ce1d7b4ebde95994732dd80204ba7e68Craig Mautner        boolean isAnimating = false;
2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int NW = allAppWindows.size();
2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        for (int i=0; i<NW; i++) {
229c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            WindowStateAnimator winAnimator = allAppWindows.get(i).mWinAnimator;
2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG,
231c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                    "performing show on: " + winAnimator);
232c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            winAnimator.performShowLocked();
233c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            isAnimating |= winAnimator.isAnimating();
2346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
23503273d00ce1d7b4ebde95994732dd80204ba7e68Craig Mautner        return isAnimating;
2366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
2376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2388078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    private void stepThumbnailAnimation(long currentTime) {
2398078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        thumbnailTransformation.clear();
2408078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        thumbnailAnimation.getTransformation(currentTime, thumbnailTransformation);
2418078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        thumbnailTransformation.getMatrix().preTranslate(thumbnailX, thumbnailY);
242d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner        final boolean screenAnimation = mAnimator.mScreenRotationAnimation != null
243d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                && mAnimator.mScreenRotationAnimation.isAnimating();
2448078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (screenAnimation) {
2458078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            thumbnailTransformation.postCompose(
246d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                    mAnimator.mScreenRotationAnimation.getEnterTransformation());
2478078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        }
2488078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        // cache often used attributes locally
2498078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        final float tmpFloats[] = service.mTmpFloats;
2508078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        thumbnailTransformation.getMatrix().getValues(tmpFloats);
251a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner        if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail,
2528078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                "thumbnail", "POS " + tmpFloats[Matrix.MTRANS_X]
2538078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                + ", " + tmpFloats[Matrix.MTRANS_Y], null);
2548078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        thumbnail.setPosition(tmpFloats[Matrix.MTRANS_X], tmpFloats[Matrix.MTRANS_Y]);
255a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner        if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail,
2568078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                "thumbnail", "alpha=" + thumbnailTransformation.getAlpha()
2578078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                + " layer=" + thumbnailLayer
2588078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                + " matrix=[" + tmpFloats[Matrix.MSCALE_X]
2598078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                + "," + tmpFloats[Matrix.MSKEW_Y]
2608078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                + "][" + tmpFloats[Matrix.MSKEW_X]
2618078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                + "," + tmpFloats[Matrix.MSCALE_Y] + "]", null);
2628078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        thumbnail.setAlpha(thumbnailTransformation.getAlpha());
2638078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        // The thumbnail is layered below the window immediately above this
2648078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        // token's anim layer.
2658078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        thumbnail.setLayer(thumbnailLayer + WindowManagerService.WINDOW_LAYER_MULTIPLIER
2668078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                - WindowManagerService.LAYER_OFFSET_THUMBNAIL);
2678078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        thumbnail.setMatrix(tmpFloats[Matrix.MSCALE_X], tmpFloats[Matrix.MSKEW_Y],
2688078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                tmpFloats[Matrix.MSKEW_X], tmpFloats[Matrix.MSCALE_Y]);
2698078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn    }
270e32c30784191a9244a08450759471c934c85034cCraig Mautner
271e32c30784191a9244a08450759471c934c85034cCraig Mautner    private boolean stepAnimation(long currentTime) {
272dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner        if (animation == null) {
273dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner            return false;
274dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner        }
275dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner        transformation.clear();
276dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner        final boolean more = animation.getTransformation(currentTime, transformation);
277dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner        if (WindowManagerService.DEBUG_ANIM) Slog.v(
278dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner            WindowManagerService.TAG, "Stepped animation in " + this +
279dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner            ": more=" + more + ", xform=" + transformation);
280dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner        if (!more) {
281dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner            animation = null;
2828078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            clearThumbnail();
283dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner            if (WindowManagerService.DEBUG_ANIM) Slog.v(
284dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner                WindowManagerService.TAG, "Finished animation in " + this +
285dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner                " @ " + currentTime);
286dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner        }
287dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner        hasTransformation = more;
288dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner        return more;
289dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner    }
290dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner
2916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    // This must be called while inside a transaction.
292e32c30784191a9244a08450759471c934c85034cCraig Mautner    boolean stepAnimationLocked(long currentTime, int dw, int dh) {
2932fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner        if (service.okToDisplay()) {
2946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // We will run animations as long as the display isn't frozen.
2956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (animation == WindowManagerService.sDummyAnimation) {
2976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // This guy is going to animate, but not yet.  For now count
2986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // it as not animating for purposes of scheduling transactions;
2996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // when it is really time to animate, this will be set to
3006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // a real animation and the next call will execute normally.
3016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return false;
3026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if ((allDrawn || animating || startingDisplayed) && animation != null) {
3056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (!animating) {
3066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    if (WindowManagerService.DEBUG_ANIM) Slog.v(
3076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        WindowManagerService.TAG, "Starting animation in " + this +
3086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        " @ " + currentTime + ": dw=" + dw + " dh=" + dh
3096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + " scale=" + service.mTransitionAnimationScale
3106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + " allDrawn=" + allDrawn + " animating=" + animating);
3118078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    if (!animInitialized) {
3128078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        animation.initialize(dw, dh, dw, dh);
3138078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    }
3146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    animation.setStartTime(currentTime);
3156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    animating = true;
3168078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    if (thumbnail != null) {
3178078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        thumbnail.show();
3188078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        thumbnailAnimation.setStartTime(currentTime);
3198078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    }
3206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3211dd3ed09e8623574ef21fd48354eaa46d1edd9eeCraig Mautner                if (stepAnimation(currentTime)) {
3228078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    // animation isn't over, step any thumbnail and that's
3238078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    // it for now.
3248078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    if (thumbnail != null) {
3258078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                        stepThumbnailAnimation(currentTime);
3268078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    }
3271dd3ed09e8623574ef21fd48354eaa46d1edd9eeCraig Mautner                    return true;
3281dd3ed09e8623574ef21fd48354eaa46d1edd9eeCraig Mautner                }
3296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        } else if (animation != null) {
3316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // If the display is frozen, and there is a pending animation,
3326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            // clear it and make sure we run the cleanup code.
3336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            animating = true;
3346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            animation = null;
3356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        hasTransformation = false;
3386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (!animating) {
3406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return false;
3416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
343d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner        mAnimator.mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
344cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
345d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner            service.debugLayoutRepeats("AppWindowToken", mAnimator.mPendingLayoutChanges);
346cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner        }
347cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner
3486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        clearAnimation();
3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        animating = false;
3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (animLayerAdjustment != 0) {
3516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            animLayerAdjustment = 0;
3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            updateLayers();
3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (service.mInputMethodTarget != null && service.mInputMethodTarget.mAppToken == this) {
3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            service.moveInputMethodWindowsIfNeededLocked(true);
3566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_ANIM) Slog.v(
3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                WindowManagerService.TAG, "Animation done in " + this
3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                + ": reportedVisible=" + reportedVisible);
3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        transformation.clear();
3636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int N = windows.size();
3656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        for (int i=0; i<N; i++) {
366a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            windows.get(i).mWinAnimator.finishExit();
3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        updateReportedVisibilityLocked();
3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return false;
3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void updateReportedVisibilityLocked() {
3746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (appToken == null) {
3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            return;
3766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int numInteresting = 0;
3796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int numVisible = 0;
3802c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        int numDrawn = 0;
3816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        boolean nowGone = true;
3826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
383c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner        if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG,
384c8bc97e53044cd62c0e023fdc441fd13127d0283Craig Mautner                "Update reported visibility: " + this);
3856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        final int N = allAppWindows.size();
3866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        for (int i=0; i<N; i++) {
3876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowState win = allAppWindows.get(i);
3886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (win == startingWindow || win.mAppFreezing
3896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || win.mViewVisibility != View.VISIBLE
3906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || win.mAttrs.type == TYPE_APPLICATION_STARTING
3916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || win.mDestroying) {
3926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                continue;
3936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
3946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_VISIBILITY) {
3956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                Slog.v(WindowManagerService.TAG, "Win " + win + ": isDrawn="
3966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        + win.isDrawnLw()
397a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                        + ", isAnimating=" + win.mWinAnimator.isAnimating());
3986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (!win.isDrawnLw()) {
399c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner                    Slog.v(WindowManagerService.TAG, "Not displayed: s=" + win.mWinAnimator.mSurface
4006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                            + " pv=" + win.mPolicyVisibility
401749a7bb28b2aff7a77a8c7dce01e086c2bd82c6bCraig Mautner                            + " mDrawState=" + win.mWinAnimator.mDrawState
4026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                            + " ah=" + win.mAttachedHidden
4036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                            + " th="
4046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                            + (win.mAppToken != null
4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                                    ? win.mAppToken.hiddenRequested : false)
406a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                            + " a=" + win.mWinAnimator.mAnimating);
4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
4086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            numInteresting++;
4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (win.isDrawnLw()) {
4112c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                numDrawn++;
412a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                if (!win.mWinAnimator.isAnimating()) {
4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    numVisible++;
4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                nowGone = false;
416a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner            } else if (win.mWinAnimator.isAnimating()) {
4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                nowGone = false;
4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4212c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        boolean nowDrawn = numInteresting > 0 && numDrawn >= numInteresting;
4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        boolean nowVisible = numInteresting > 0 && numVisible >= numInteresting;
4232c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        if (!nowGone) {
4242c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            // If the app is not yet gone, then it can only become visible/drawn.
4252c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            if (!nowDrawn) {
4262c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                nowDrawn = reportedDrawn;
4272c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            }
4282c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            if (!nowVisible) {
4292c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                nowVisible = reportedVisible;
4302c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            }
4312c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        }
4326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "VIS " + this + ": interesting="
4336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                + numInteresting + " visible=" + numVisible);
4342c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        if (nowDrawn != reportedDrawn) {
4352c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            if (nowDrawn) {
4362c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                Message m = service.mH.obtainMessage(
4372c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                        H.REPORT_APPLICATION_TOKEN_DRAWN, this);
4382c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                service.mH.sendMessage(m);
4392c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            }
4402c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn            reportedDrawn = nowDrawn;
4412c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn        }
4426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (nowVisible != reportedVisible) {
4436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(
4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    WindowManagerService.TAG, "Visibility changed in " + this
4456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    + ": vis=" + nowVisible);
4466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            reportedVisible = nowVisible;
4476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            Message m = service.mH.obtainMessage(
4486e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    H.REPORT_APPLICATION_TOKEN_WINDOWS,
4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    nowVisible ? 1 : 0,
4506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    nowGone ? 1 : 0,
4516e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    this);
4526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            service.mH.sendMessage(m);
4536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    WindowState findMainWindow() {
4576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        int j = windows.size();
4586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        while (j > 0) {
4596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            j--;
4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            WindowState win = windows.get(j);
4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (win.mAttrs.type == WindowManager.LayoutParams.TYPE_BASE_APPLICATION
4626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    || win.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
4636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                return win;
4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return null;
4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
469dbb7991b4e4638b284814b50e79cacc1e1c9d8cdCraig Mautner    @Override
4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    void dump(PrintWriter pw, String prefix) {
4716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        super.dump(pw, prefix);
4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (appToken != null) {
4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.println("app=true");
4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (allAppWindows.size() > 0) {
4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("allAppWindows="); pw.println(allAppWindows);
4776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("groupId="); pw.print(groupId);
4796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" appFullscreen="); pw.print(appFullscreen);
4806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" requestedOrientation="); pw.println(requestedOrientation);
4816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        pw.print(prefix); pw.print("hiddenRequested="); pw.print(hiddenRequested);
4826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" clientHidden="); pw.print(clientHidden);
4836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" willBeHidden="); pw.print(willBeHidden);
4842c84cfc001fb92a71811bf7384b7f865ff31ff9dDianne Hackborn                pw.print(" reportedDrawn="); pw.print(reportedDrawn);
4856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                pw.print(" reportedVisible="); pw.println(reportedVisible);
4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (paused || freezingScreen) {
4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("paused="); pw.print(paused);
4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" freezingScreen="); pw.println(freezingScreen);
4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4906e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (numInterestingWindows != 0 || numDrawnWindows != 0
4916e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                || inPendingTransaction || allDrawn) {
4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("numInterestingWindows=");
4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(numInterestingWindows);
4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" numDrawnWindows="); pw.print(numDrawnWindows);
4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" inPendingTransaction="); pw.print(inPendingTransaction);
4966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" allDrawn="); pw.println(allDrawn);
4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (animating || animation != null) {
4996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("animating="); pw.print(animating);
5006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" animation="); pw.println(animation);
5016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (hasTransformation) {
5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("XForm: ");
5046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    transformation.printShortString(pw);
5056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.println();
5066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (animLayerAdjustment != 0) {
5086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("animLayerAdjustment="); pw.println(animLayerAdjustment);
5096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (startingData != null || removed || firstWindowDrawn) {
5116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("startingData="); pw.print(startingData);
5126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" removed="); pw.print(removed);
5136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" firstWindowDrawn="); pw.println(firstWindowDrawn);
5146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (startingWindow != null || startingView != null
5166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                || startingDisplayed || startingMoved) {
5176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            pw.print(prefix); pw.print("startingWindow="); pw.print(startingWindow);
5186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" startingView="); pw.print(startingView);
5196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" startingDisplayed="); pw.print(startingDisplayed);
5206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    pw.print(" startingMoved"); pw.println(startingMoved);
5216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5228078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        if (thumbnail != null) {
5238078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            pw.print(prefix); pw.print("thumbnail="); pw.print(thumbnail);
5248078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    pw.print(" x="); pw.print(thumbnailX);
5258078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    pw.print(" y="); pw.print(thumbnailY);
5268078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    pw.print(" layer="); pw.println(thumbnailLayer);
5278078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            pw.print(prefix); pw.print("thumbnailAnimation="); pw.println(thumbnailAnimation);
5288078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            pw.print(prefix); pw.print("thumbnailTransformation=");
5298078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                    pw.println(thumbnailTransformation.toShortString());
5308078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn        }
5316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    @Override
5346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    public String toString() {
5356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (stringName == null) {
5366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            StringBuilder sb = new StringBuilder();
5376e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sb.append("AppWindowToken{");
5386e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sb.append(Integer.toHexString(System.identityHashCode(this)));
5396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            sb.append(" token="); sb.append(token); sb.append('}');
5406e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            stringName = sb.toString();
5416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
5426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return stringName;
5436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}