17916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn/*
27916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Copyright (C) 2011 The Android Open Source Project
37916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn *
47916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
57916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * you may not use this file except in compliance with the License.
67916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * You may obtain a copy of the License at
77916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn *
87916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
97916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn *
107916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Unless required by applicable law or agreed to in writing, software
117916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
127916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * See the License for the specific language governing permissions and
147916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * limitations under the License.
157916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn */
167916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornpackage com.android.server.wm;
187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
199fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackbornimport java.io.PrintWriter;
209fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn
217916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornimport android.graphics.Matrix;
227916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornimport android.graphics.PixelFormat;
237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornimport android.graphics.Rect;
247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornimport android.util.Slog;
25a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkinimport android.view.Surface.OutOfResourcesException;
263866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornimport android.view.SurfaceSession;
287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn/**
307916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn * Four black surfaces put together to make a black frame.
317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn */
327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackbornpublic class BlackFrame {
337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    class BlackSurface {
347916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        final int left;
357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        final int top;
362fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner        final int layer;
373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        final SurfaceControl surface;
387916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
39b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner        BlackSurface(SurfaceSession session, int layer, int l, int t, int r, int b, int layerStack)
40a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin                throws OutOfResourcesException {
417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            left = l;
427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            top = t;
432fb98b147b58210604dfaf1482f635ce8d8a0575Craig Mautner            this.layer = layer;
4491c9ac05efd7425565b5c8f0f3f8b7b9658ce143Dianne Hackborn            int w = r-l;
4591c9ac05efd7425565b5c8f0f3f8b7b9658ce143Dianne Hackborn            int h = b-t;
4629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian
4729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            if (WindowManagerService.DEBUG_SURFACE_TRACE) {
4829479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                surface = new WindowStateAnimator.SurfaceTrace(session, "BlackSurface("
4929479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                        + l + ", " + t + ")",
5029479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                        w, h, PixelFormat.OPAQUE, SurfaceControl.FX_SURFACE_DIM | SurfaceControl.HIDDEN);
5129479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            } else {
5229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                surface = new SurfaceControl(session, "BlackSurface",
5329479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian                        w, h, PixelFormat.OPAQUE, SurfaceControl.FX_SURFACE_DIM | SurfaceControl.HIDDEN);
54924d9b75d6ec4597264a7af3f8be5b5a7d3a3dd2Craig Mautner            }
5529479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian
56924d9b75d6ec4597264a7af3f8be5b5a7d3a3dd2Craig Mautner            surface.setAlpha(1);
5764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            surface.setLayerStack(layerStack);
58924d9b75d6ec4597264a7af3f8be5b5a7d3a3dd2Craig Mautner            surface.setLayer(layer);
59924d9b75d6ec4597264a7af3f8be5b5a7d3a3dd2Craig Mautner            surface.show();
605fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn            if (WindowManagerService.SHOW_TRANSACTIONS ||
615fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG,
625fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                            "  BLACK " + surface + ": CREATE layer=" + layer);
637916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
647916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
6546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner        void setAlpha(float alpha) {
6646ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner            surface.setAlpha(alpha);
6746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner        }
6846ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner
697916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        void setMatrix(Matrix matrix) {
707916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mTmpMatrix.setTranslate(left, top);
717916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mTmpMatrix.postConcat(matrix);
727916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            mTmpMatrix.getValues(mTmpFloats);
73d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn            surface.setPosition(mTmpFloats[Matrix.MTRANS_X],
74d040edbae968d826aa2c82d382345811a45c646bDianne Hackborn                    mTmpFloats[Matrix.MTRANS_Y]);
757916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            surface.setMatrix(
767916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
777916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
787916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (false) {
797916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                Slog.i(WindowManagerService.TAG, "Black Surface @ (" + left + "," + top + "): ("
807916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        + mTmpFloats[Matrix.MTRANS_X] + ","
817916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        + mTmpFloats[Matrix.MTRANS_Y] + ") matrix=["
827916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        + mTmpFloats[Matrix.MSCALE_X] + ","
837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        + mTmpFloats[Matrix.MSCALE_Y] + "]["
847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        + mTmpFloats[Matrix.MSKEW_X] + ","
857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                        + mTmpFloats[Matrix.MSKEW_Y] + "]");
867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        void clearMatrix() {
907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            surface.setMatrix(1, 0, 0, 1);
917916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
949fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn    final Rect mOuterRect;
959fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn    final Rect mInnerRect;
967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    final Matrix mTmpMatrix = new Matrix();
977916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    final float[] mTmpFloats = new float[9];
987916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    final BlackSurface[] mBlackSurfaces = new BlackSurface[4];
997916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
10046ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner    final boolean mForceDefaultOrientation;
10146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner
1029fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn    public void printTo(String prefix, PrintWriter pw) {
1039fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn        pw.print(prefix); pw.print("Outer: "); mOuterRect.printShortString(pw);
1049fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn                pw.print(" / Inner: "); mInnerRect.printShortString(pw);
1059fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn                pw.println();
1069fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn        for (int i=0; i<mBlackSurfaces.length; i++) {
1079fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn            BlackSurface bs = mBlackSurfaces[i];
1089fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn            pw.print(prefix); pw.print("#"); pw.print(i);
1099fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn                    pw.print(": "); pw.print(bs.surface);
1109fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn                    pw.print(" left="); pw.print(bs.left);
1119fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn                    pw.print(" top="); pw.println(bs.top);
1129fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn        }
1139fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn    }
1149fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn
11546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner    public BlackFrame(SurfaceSession session, Rect outer, Rect inner, int layer, int layerStack,
116a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin            boolean forceDefaultOrientation) throws OutOfResourcesException {
1177916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        boolean success = false;
1187916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
11946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner        mForceDefaultOrientation = forceDefaultOrientation;
12046ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner
1219fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn        mOuterRect = new Rect(outer);
1229fd74805c8be91df78f3eccc40ab2466c8114fc9Dianne Hackborn        mInnerRect = new Rect(inner);
1237916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        try {
1247916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (outer.top < inner.top) {
1257916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackSurfaces[0] = new BlackSurface(session, layer,
126b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner                        outer.left, outer.top, inner.right, inner.top, layerStack);
1277916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
1287916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (outer.left < inner.left) {
1297916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackSurfaces[1] = new BlackSurface(session, layer,
130b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner                        outer.left, inner.top, inner.left, outer.bottom, layerStack);
1317916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
1327916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (outer.bottom > inner.bottom) {
1337916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackSurfaces[2] = new BlackSurface(session, layer,
134b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner                        inner.left, inner.bottom, outer.right, outer.bottom, layerStack);
1357916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
1367916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (outer.right > inner.right) {
1377916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackSurfaces[3] = new BlackSurface(session, layer,
138b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner                        inner.right, outer.top, outer.right, inner.bottom, layerStack);
1397916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
1407916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            success = true;
1417916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        } finally {
1427916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (!success) {
1437916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                kill();
1447916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
1457916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
1467916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
1477916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
1487916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void kill() {
1497916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (mBlackSurfaces != null) {
1507916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            for (int i=0; i<mBlackSurfaces.length; i++) {
1517916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (mBlackSurfaces[i] != null) {
1525fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                    if (WindowManagerService.SHOW_TRANSACTIONS ||
1535fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                            WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(
1545fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                                    WindowManagerService.TAG,
1555fd2169eabd77e6bfafaf456e58051a3bafb2bcaDianne Hackborn                                    "  BLACK " + mBlackSurfaces[i].surface + ": DESTROY");
1567916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackSurfaces[i].surface.destroy();
1577916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackSurfaces[i] = null;
1587916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
1597916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
1607916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
1617916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
1627916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
1637916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void hide() {
1647916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        if (mBlackSurfaces != null) {
1657916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            for (int i=0; i<mBlackSurfaces.length; i++) {
1667916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                if (mBlackSurfaces[i] != null) {
1677916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                    mBlackSurfaces[i].surface.hide();
1687916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                }
1697916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
1707916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
1717916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
1727916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
17346ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner    public void setAlpha(float alpha) {
17446ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner        for (int i=0; i<mBlackSurfaces.length; i++) {
17546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner            if (mBlackSurfaces[i] != null) {
17646ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner                mBlackSurfaces[i].setAlpha(alpha);
17746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner            }
17846ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner        }
17946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner    }
18046ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner
1817916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void setMatrix(Matrix matrix) {
1827916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        for (int i=0; i<mBlackSurfaces.length; i++) {
1837916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBlackSurfaces[i] != null) {
1847916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackSurfaces[i].setMatrix(matrix);
1857916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
1867916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
1877916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
1887916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn
1897916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    public void clearMatrix() {
1907916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        for (int i=0; i<mBlackSurfaces.length; i++) {
1917916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            if (mBlackSurfaces[i] != null) {
1927916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn                mBlackSurfaces[i].clearMatrix();
1937916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn            }
1947916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn        }
1957916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn    }
1967916ac65dc492e4e1431879875c77d7121fbf82eDianne Hackborn}
197