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