1e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr/* 2e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * Copyright (C) 2015 The Android Open Source Project 3e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * 4e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * Licensed under the Apache License, Version 2.0 (the "License"); 5e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * you may not use this file except in compliance with the License. 6e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * You may obtain a copy of the License at 7e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * 8e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * http://www.apache.org/licenses/LICENSE-2.0 9e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * 10e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * Unless required by applicable law or agreed to in writing, software 11e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * distributed under the License is distributed on an "AS IS" BASIS, 12e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * See the License for the specific language governing permissions and 14e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr * limitations under the License. 15e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr */ 16e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 17e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrpackage com.android.server.wm; 18e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 194958ad283f06452480569f317feea862ad5981e4Wale Ogunwaleimport static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; 20af03df6a7a93c832e0bc77b88607ef9161f0791bSteven Timotiusimport static android.view.Surface.SCALING_MODE_SCALE_TO_WINDOW; 21af03df6a7a93c832e0bc77b88607ef9161f0791bSteven Timotius 22722ff89fd1684179c342c3e9b6014c5499f90b90Wale Ogunwaleimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_SURFACE_ALLOC; 230bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; 240bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; 250bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; 260bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; 270bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 286c6e9cab42bccb44ebb4b30e7eab7394c0dbb759Yi Jinimport static com.android.server.wm.WindowSurfaceControllerProto.LAYER; 296c6e9cab42bccb44ebb4b30e7eab7394c0dbb759Yi Jinimport static com.android.server.wm.WindowSurfaceControllerProto.SHOWN; 30e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 31e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.graphics.Point; 32e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.graphics.PointF; 33e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.graphics.Rect; 34e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.graphics.Region; 35e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.os.IBinder; 36e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.os.Debug; 374958ad283f06452480569f317feea862ad5981e4Wale Ogunwaleimport android.os.Trace; 38af03df6a7a93c832e0bc77b88607ef9161f0791bSteven Timotiusimport android.util.proto.ProtoOutputStream; 39e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.view.Surface; 40e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.view.SurfaceControl; 41e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.view.SurfaceSession; 42e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.view.WindowContentFrameStats; 43e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.view.Surface.OutOfResourcesException; 44e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 45e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport android.util.Slog; 46e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 473b716249cc2f94aa9842576b618998c28593be90Robert Carrimport java.io.FileDescriptor; 48e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport java.io.PrintWriter; 49e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrimport java.util.ArrayList; 50e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 51e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carrclass WindowSurfaceController { 520bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfaceController" : TAG_WM; 53e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 54e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr final WindowStateAnimator mAnimator; 55e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 564d18a2e4a9cf0e5f7b78c2f5dda2a1fc9c90e4ffAdrian Roos SurfaceControl mSurfaceControl; 57e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 58943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale // Should only be set from within setShown(). 59e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr private boolean mSurfaceShown = false; 60e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr private float mSurfaceX = 0; 61e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr private float mSurfaceY = 0; 62a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi private int mSurfaceW = 0; 63a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi private int mSurfaceH = 0; 64e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 658dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack // Initialize to the identity matrix. 668dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack private float mLastDsdx = 1; 678dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack private float mLastDtdx = 0; 688dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack private float mLastDsdy = 0; 698dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack private float mLastDtdy = 1; 708dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack 71e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr private float mSurfaceAlpha = 0; 72e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 73e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr private int mSurfaceLayer = 0; 74e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 75e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr // Surface flinger doesn't support crop rectangles where width or height is non-positive. 76e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr // However, we need to somehow handle the situation where the cropping would completely hide 77e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr // the window. We achieve this by explicitly hiding the surface and not letting it be shown. 78e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr private boolean mHiddenForCrop = false; 791eb39b009ef6cfa133cbd5d6ea8caaac64ee1559Jorim Jaggi 801eb39b009ef6cfa133cbd5d6ea8caaac64ee1559Jorim Jaggi // Initially a surface is hidden after just being created. 811eb39b009ef6cfa133cbd5d6ea8caaac64ee1559Jorim Jaggi private boolean mHiddenForOtherReasons = true; 82e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr private final String title; 83e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 8468e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr private final WindowManagerService mService; 8568e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr 86943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale private final int mWindowType; 87943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale private final Session mWindowSession; 88943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale 89b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction(); 90b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten 913bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk public WindowSurfaceController(SurfaceSession s, String name, int w, int h, int format, 923bf2e57f8d8823f02c4e1d7bc954c4ed7c68ab84Albert Chaulk int flags, WindowStateAnimator animator, int windowType, int ownerUid) { 93e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mAnimator = animator; 94e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 95e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceW = w; 96e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceH = h; 97e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 98e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr title = name; 99e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 10068e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr mService = animator.mService; 101943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale final WindowState win = animator.mWin; 102943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale mWindowType = windowType; 103943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale mWindowSession = win.mSession; 10468e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr 105283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "new SurfaceControl"); 106b1579c8d898811010b60eab4e996f3d071980155Robert Carr final SurfaceControl.Builder b = win.makeSurface() 107b1579c8d898811010b60eab4e996f3d071980155Robert Carr .setParent(win.getSurfaceControl()) 108e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr .setName(name) 109e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr .setSize(w, h) 110e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr .setFormat(format) 111e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr .setFlags(flags) 112e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr .setMetadata(windowType, ownerUid); 1134d18a2e4a9cf0e5f7b78c2f5dda2a1fc9c90e4ffAdrian Roos mSurfaceControl = b.build(); 114283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); 1153b716249cc2f94aa9842576b618998c28593be90Robert Carr } 1163b716249cc2f94aa9842576b618998c28593be90Robert Carr 117e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale private void logSurface(String msg, RuntimeException where) { 118e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr String str = " SURFACE " + msg + ": " + title; 119e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (where != null) { 120e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr Slog.i(TAG, str, where); 121e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } else { 122e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr Slog.i(TAG, str); 123e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 124e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 125e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 126d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr void reparentChildrenInTransaction(WindowSurfaceController other) { 127d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr if (SHOW_TRANSACTIONS) Slog.i(TAG, "REPARENT from: " + this + " to: " + other); 128d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr if ((mSurfaceControl != null) && (other.mSurfaceControl != null)) { 129d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr mSurfaceControl.reparentChildren(other.getHandle()); 130d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr } 131d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr } 132d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr 133d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr void detachChildren() { 134d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr if (SHOW_TRANSACTIONS) Slog.i(TAG, "SEVER CHILDREN"); 135d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr if (mSurfaceControl != null) { 136d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr mSurfaceControl.detachChildren(); 137d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr } 138d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr } 139d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr 140b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten void hide(SurfaceControl.Transaction transaction, String reason) { 14163a35e2343468a04e360f0514c6c9dc03068c185Filip Gruszczynski if (SHOW_TRANSACTIONS) logSurface("HIDE ( " + reason + " )", null); 1425e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi mHiddenForOtherReasons = true; 1433cc58ddd3c39580d0c008d1cf7138d5634be1b90Chong Zhang 1443cc58ddd3c39580d0c008d1cf7138d5634be1b90Chong Zhang mAnimator.destroyPreservedSurfaceLocked(); 145b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten if (mSurfaceShown) { 146b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten hideSurface(transaction); 147b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten } 1485e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi } 1495e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi 150b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten private void hideSurface(SurfaceControl.Transaction transaction) { 151943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale if (mSurfaceControl == null) { 152943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale return; 153943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale } 154943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale setShown(false); 155943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale try { 156b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten transaction.hide(mSurfaceControl); 157943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale } catch (RuntimeException e) { 158943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale Slog.w(TAG, "Exception hiding surface in " + this); 159e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 160e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 161e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 162a882886f80bdf08f6ee8812bf59819af180ab9b9Robert Carr void destroyNotInTransaction() { 163ad23b3fa1154eabbda1648f184c9ef7e115cb06cChong Zhang if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 164ad23b3fa1154eabbda1648f184c9ef7e115cb06cChong Zhang Slog.i(TAG, "Destroying surface " + this + " called by " + Debug.getCallers(8)); 165ad23b3fa1154eabbda1648f184c9ef7e115cb06cChong Zhang } 166e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr try { 167722ff89fd1684179c342c3e9b6014c5499f90b90Wale Ogunwale if (mSurfaceControl != null) { 168722ff89fd1684179c342c3e9b6014c5499f90b90Wale Ogunwale mSurfaceControl.destroy(); 169722ff89fd1684179c342c3e9b6014c5499f90b90Wale Ogunwale } 170e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } catch (RuntimeException e) { 171e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr Slog.w(TAG, "Error destroying surface in: " + this, e); 172722ff89fd1684179c342c3e9b6014c5499f90b90Wale Ogunwale } finally { 173943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale setShown(false); 174722ff89fd1684179c342c3e9b6014c5499f90b90Wale Ogunwale mSurfaceControl = null; 175e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 176e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 177e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 17847e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang void disconnectInTransaction() { 17947e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { 18047e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang Slog.i(TAG, "Disconnecting client: " + this); 18147e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang } 18247e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang 18347e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang try { 18447e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang if (mSurfaceControl != null) { 18547e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang mSurfaceControl.disconnect(); 18647e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang } 18747e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang } catch (RuntimeException e) { 18847e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang Slog.w(TAG, "Error disconnecting surface in: " + this, e); 18947e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang } 19047e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang } 19147e36a3e270ff3e94750d730ac2a9f0bdfe96c04Chong Zhang 192e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr void setCropInTransaction(Rect clipRect, boolean recoveringMemory) { 193e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_TRANSACTIONS) logSurface( 194e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr "CROP " + clipRect.toShortString(), null); 195e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr try { 1964320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr if (clipRect.width() > 0 && clipRect.height() > 0) { 197e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceControl.setWindowCrop(clipRect); 198e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mHiddenForCrop = false; 1995e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi updateVisibility(); 200e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } else { 201e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mHiddenForCrop = true; 2023cc58ddd3c39580d0c008d1cf7138d5634be1b90Chong Zhang mAnimator.destroyPreservedSurfaceLocked(); 2035e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi updateVisibility(); 204e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 205e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } catch (RuntimeException e) { 206e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr Slog.w(TAG, "Error setting crop surface of " + this 207e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr + " crop=" + clipRect.toShortString(), e); 208e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (!recoveringMemory) { 209e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mAnimator.reclaimSomeSurfaceMemory("crop", true); 210e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 211e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 212e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 213e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 2144320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr void clearCropInTransaction(boolean recoveringMemory) { 2154320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr if (SHOW_TRANSACTIONS) logSurface( 2164320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr "CLEAR CROP", null); 2174320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr try { 2184320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr Rect clipRect = new Rect(0, 0, -1, -1); 2194320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr mSurfaceControl.setWindowCrop(clipRect); 2204320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr } catch (RuntimeException e) { 2214320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr Slog.w(TAG, "Error setting clearing crop of " + this, e); 2224320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr if (!recoveringMemory) { 2234320d33a065173dff97ddb462c8a6a0a649a41e5Robert Carr mAnimator.reclaimSomeSurfaceMemory("crop", true); 224e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 225e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 226e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 227e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 2286a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi void setFinalCropInTransaction(Rect clipRect) { 2296a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi if (SHOW_TRANSACTIONS) logSurface( 2306a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi "FINAL CROP " + clipRect.toShortString(), null); 2316a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi try { 2326a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi mSurfaceControl.setFinalCrop(clipRect); 2336a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi } catch (RuntimeException e) { 2346a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi Slog.w(TAG, "Error disconnecting surface in: " + this, e); 2356a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi } 2366a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi } 2376a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi 238da61ba9d4e6a826a4921e3a9c69e46a9497f891dRobert Carr void setLayerStackInTransaction(int layerStack) { 239da61ba9d4e6a826a4921e3a9c69e46a9497f891dRobert Carr if (mSurfaceControl != null) { 240da61ba9d4e6a826a4921e3a9c69e46a9497f891dRobert Carr mSurfaceControl.setLayerStack(layerStack); 241da61ba9d4e6a826a4921e3a9c69e46a9497f891dRobert Carr } 242da61ba9d4e6a826a4921e3a9c69e46a9497f891dRobert Carr } 243da61ba9d4e6a826a4921e3a9c69e46a9497f891dRobert Carr 244e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr void setPositionInTransaction(float left, float top, boolean recoveringMemory) { 24519cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr setPosition(null, left, top, recoveringMemory); 24619cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr } 24719cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr 24819cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr void setPosition(SurfaceControl.Transaction t, float left, float top, 24919cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr boolean recoveringMemory) { 250e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr final boolean surfaceMoved = mSurfaceX != left || mSurfaceY != top; 251e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (surfaceMoved) { 252e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceX = left; 253e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceY = top; 254e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 255e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr try { 256ae35fef616c14f721cf12d6a0f78bef9fef5df9dChong Zhang if (SHOW_TRANSACTIONS) logSurface( 257ae35fef616c14f721cf12d6a0f78bef9fef5df9dChong Zhang "POS (setPositionInTransaction) @ (" + left + "," + top + ")", null); 258ae35fef616c14f721cf12d6a0f78bef9fef5df9dChong Zhang 25919cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr if (t == null) { 26019cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr mSurfaceControl.setPosition(left, top); 26119cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr } else { 26219cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr t.setPosition(mSurfaceControl, left, top); 26319cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr } 264e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } catch (RuntimeException e) { 265e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr Slog.w(TAG, "Error positioning surface of " + this 266e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr + " pos=(" + left + "," + top + ")", e); 267e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (!recoveringMemory) { 268e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mAnimator.reclaimSomeSurfaceMemory("position", true); 269e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 270e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 271e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 272e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 273e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 2746da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr void setGeometryAppliesWithResizeInTransaction(boolean recoveringMemory) { 2756da3cc0237d2483ead16a7013d1326bccc5112afRobert Carr mSurfaceControl.setGeometryAppliesWithResize(); 276a9408d4a4809dd229fb7fb8f9594cb6db4b1da64Robert Carr } 277a9408d4a4809dd229fb7fb8f9594cb6db4b1da64Robert Carr 278283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian void setMatrixInTransaction(float dsdx, float dtdx, float dtdy, float dsdy, 279e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr boolean recoveringMemory) { 28019cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr setMatrix(null, dsdx, dtdx, dtdy, dsdy, false); 28119cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr } 28219cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr 28319cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr void setMatrix(SurfaceControl.Transaction t, float dsdx, float dtdx, 28419cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr float dtdy, float dsdy, boolean recoveringMemory) { 2858dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack final boolean matrixChanged = mLastDsdx != dsdx || mLastDtdx != dtdx || 286283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian mLastDtdy != dtdy || mLastDsdy != dsdy; 2878dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack if (!matrixChanged) { 2888dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack return; 2898dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack } 2908dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack 2918dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack mLastDsdx = dsdx; 2928dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack mLastDtdx = dtdx; 2938dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack mLastDtdy = dtdy; 294283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian mLastDsdy = dsdy; 2958dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack 296e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr try { 297e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr if (SHOW_TRANSACTIONS) logSurface( 298283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian "MATRIX [" + dsdx + "," + dtdx + "," + dtdy + "," + dsdy + "]", null); 29919cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr if (t == null) { 30019cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr mSurfaceControl.setMatrix(dsdx, dtdx, dtdy, dsdy); 30119cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr } else { 30219cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr t.setMatrix(mSurfaceControl, dsdx, dtdx, dtdy, dsdy); 30319cdd09a60cb870f50e6fcd45f4d339466086f45Robert Carr } 304e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr } catch (RuntimeException e) { 305e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr // If something goes wrong with the surface (such 306e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr // as running out of memory), don't take down the 307e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr // entire system. 308e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr Slog.e(TAG, "Error setting matrix on surface surface" + title 309283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian + " MATRIX [" + dsdx + "," + dtdx + "," + dtdy + "," + dsdy + "]", null); 310e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr if (!recoveringMemory) { 311e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr mAnimator.reclaimSomeSurfaceMemory("matrix", true); 312e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr } 313e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr } 314e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr } 315e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr 316e1034cc39a574c3e8dc481810fb8f24571c41d70Robert Carr boolean setSizeInTransaction(int width, int height, boolean recoveringMemory) { 317e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr final boolean surfaceResized = mSurfaceW != width || mSurfaceH != height; 318e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (surfaceResized) { 319e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceW = width; 320e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceH = height; 321e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 322e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr try { 323e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_TRANSACTIONS) logSurface( 324e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr "SIZE " + width + "x" + height, null); 325e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceControl.setSize(width, height); 326e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } catch (RuntimeException e) { 327e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr // If something goes wrong with the surface (such 328e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr // as running out of memory), don't take down the 329e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr // entire system. 330e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr Slog.e(TAG, "Error resizing surface of " + title 331e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr + " size=(" + width + "x" + height + ")", e); 332e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (!recoveringMemory) { 333e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mAnimator.reclaimSomeSurfaceMemory("size", true); 334e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 335e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return false; 336e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 337e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return true; 338e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 339e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return false; 340e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 341e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 342af422a8c5b902831cbd2c97c71bbeed71604dd2eRobert Carr boolean prepareToShowInTransaction(float alpha, 343da61ba9d4e6a826a4921e3a9c69e46a9497f891dRobert Carr float dsdx, float dtdx, float dsdy, 344e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr float dtdy, boolean recoveringMemory) { 345e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (mSurfaceControl != null) { 346e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr try { 347e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceAlpha = alpha; 348e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceControl.setAlpha(alpha); 3498dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack mLastDsdx = dsdx; 3508dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack mLastDtdx = dtdx; 3518dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack mLastDsdy = dsdy; 3528dd88f649b0cee33588a154a942195c0920d59a1Matthew Bouyack mLastDtdy = dtdy; 353e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceControl.setMatrix( 354e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr dsdx, dtdx, dsdy, dtdy); 355e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } catch (RuntimeException e) { 356e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr Slog.w(TAG, "Error updating surface in " + title, e); 357e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (!recoveringMemory) { 358e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mAnimator.reclaimSomeSurfaceMemory("update", true); 359e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 360e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return false; 361e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 362e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 363e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return true; 364e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 365e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 366e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr void setTransparentRegionHint(final Region region) { 367e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (mSurfaceControl == null) { 368e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true"); 369e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return; 370e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 371e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setTransparentRegion"); 37268e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr mService.openSurfaceTransaction(); 373e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr try { 374e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceControl.setTransparentRegionHint(region); 375e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } finally { 376111aff959919c7b838b107e62e1baef77e3f6382Adrian Roos mService.closeSurfaceTransaction("setTransparentRegion"); 377e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 378e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr "<<< CLOSE TRANSACTION setTransparentRegion"); 379e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 380e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 381e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 382e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr void setOpaque(boolean isOpaque) { 383e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_TRANSACTIONS) logSurface("isOpaque=" + isOpaque, 384e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr null); 385e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 386e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (mSurfaceControl == null) { 387e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return; 388e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 389e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setOpaqueLocked"); 39068e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr mService.openSurfaceTransaction(); 391e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr try { 392e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceControl.setOpaque(isOpaque); 393e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } finally { 394111aff959919c7b838b107e62e1baef77e3f6382Adrian Roos mService.closeSurfaceTransaction("setOpaqueLocked"); 395e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION setOpaqueLocked"); 396e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 397e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 398e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 399e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr void setSecure(boolean isSecure) { 400e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_TRANSACTIONS) logSurface("isSecure=" + isSecure, 401e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr null); 402e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 403e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (mSurfaceControl == null) { 404e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return; 405e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 406e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setSecureLocked"); 40768e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr mService.openSurfaceTransaction(); 408e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr try { 409e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceControl.setSecure(isSecure); 410e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } finally { 411111aff959919c7b838b107e62e1baef77e3f6382Adrian Roos mService.closeSurfaceTransaction("setSecure"); 412e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION setSecureLocked"); 413e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 414e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 415e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 416283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian void getContainerRect(Rect rect) { 417283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian mAnimator.getContainerRect(rect); 418283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian } 419283acd20ca279aefbd69826e3b8cc3741bd2b3d6Andrii Kulian 420e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr boolean showRobustlyInTransaction() { 42119723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski if (SHOW_TRANSACTIONS) logSurface( 42219723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski "SHOW (performLayout)", null); 42319723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this 42419723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski + " during relayout"); 4255e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi mHiddenForOtherReasons = false; 4265e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi return updateVisibility(); 4275e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi } 428e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 4295e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi private boolean updateVisibility() { 4305e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi if (mHiddenForCrop || mHiddenForOtherReasons) { 4315e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi if (mSurfaceShown) { 432b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten hideSurface(mTmpTransaction); 433b736e3215b8e0afeecd053a43fde6c002ca5c2a0Chavi Weingarten SurfaceControl.mergeToGlobalTransaction(mTmpTransaction); 4345e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi } 435e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return false; 4365e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi } else { 4375e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi if (!mSurfaceShown) { 4385e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi return showSurface(); 4395e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi } else { 4405e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi return true; 4415e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi } 442e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 4435e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi } 444e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 4455e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi private boolean showSurface() { 446e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr try { 447943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale setShown(true); 448e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceControl.show(); 449e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return true; 450e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } catch (RuntimeException e) { 451e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr Slog.w(TAG, "Failure showing surface " + mSurfaceControl + " in " + this, e); 452e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 453e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 454e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mAnimator.reclaimSomeSurfaceMemory("show", true); 455e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 456e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return false; 457e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 458e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 459e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr void deferTransactionUntil(IBinder handle, long frame) { 460e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr // TODO: Logging 461e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr mSurfaceControl.deferTransactionUntil(handle, frame); 462e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 463e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 4641ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr void forceScaleableInTransaction(boolean force) { 4651ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr // -1 means we don't override the default or client specified 4661ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr // scaling mode. 4671ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr int scalingMode = force ? SCALING_MODE_SCALE_TO_WINDOW : -1; 4681ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr mSurfaceControl.setOverrideScalingMode(scalingMode); 4691ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr } 4701ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr 471e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr boolean clearWindowContentFrameStats() { 472e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (mSurfaceControl == null) { 473e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return false; 474e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 475e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return mSurfaceControl.clearContentFrameStats(); 476e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 477e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 478e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr boolean getWindowContentFrameStats(WindowContentFrameStats outStats) { 479e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (mSurfaceControl == null) { 480e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return false; 481e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 482e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return mSurfaceControl.getContentFrameStats(outStats); 483e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 484e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 485e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 486e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr boolean hasSurface() { 487e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return mSurfaceControl != null; 488e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 489e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 490e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr IBinder getHandle() { 491e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (mSurfaceControl == null) { 492e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return null; 493e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 494e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return mSurfaceControl.getHandle(); 495e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 496e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 497e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr void getSurface(Surface outSurface) { 498e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr outSurface.copyFrom(mSurfaceControl); 499e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 500e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 501e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr int getLayer() { 502e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return mSurfaceLayer; 503e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 504e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 505e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr boolean getShown() { 506e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return mSurfaceShown; 507e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 508e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 50910a80e0b5b2efb3a65b66dfa8b6fee6d0904ea42Filip Gruszczynski void setShown(boolean surfaceShown) { 51010a80e0b5b2efb3a65b66dfa8b6fee6d0904ea42Filip Gruszczynski mSurfaceShown = surfaceShown; 511943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale 51201ad4345f92080439a5ccde9cb085f3f90d8709bWale Ogunwale mService.updateNonSystemOverlayWindowsVisibilityIfNeeded(mAnimator.mWin, surfaceShown); 51301ad4345f92080439a5ccde9cb085f3f90d8709bWale Ogunwale 514943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale if (mWindowSession != null) { 515943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale mWindowSession.onWindowSurfaceVisibilityChanged(this, mSurfaceShown, mWindowType); 516943002b47346ea82b4e69dca033cc03086969dd1Wale Ogunwale } 51710a80e0b5b2efb3a65b66dfa8b6fee6d0904ea42Filip Gruszczynski } 51810a80e0b5b2efb3a65b66dfa8b6fee6d0904ea42Filip Gruszczynski 519e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr float getX() { 520e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return mSurfaceX; 521e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 522e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 523e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr float getY() { 524e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr return mSurfaceY; 525e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 526e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 527a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi int getWidth() { 528fed100742011bbc3092925c37e9f2df4ab04b6b5Robert Carr return mSurfaceW; 529fed100742011bbc3092925c37e9f2df4ab04b6b5Robert Carr } 530fed100742011bbc3092925c37e9f2df4ab04b6b5Robert Carr 531a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi int getHeight() { 532fed100742011bbc3092925c37e9f2df4ab04b6b5Robert Carr return mSurfaceH; 533fed100742011bbc3092925c37e9f2df4ab04b6b5Robert Carr } 534fed100742011bbc3092925c37e9f2df4ab04b6b5Robert Carr 535af03df6a7a93c832e0bc77b88607ef9161f0791bSteven Timotius void writeToProto(ProtoOutputStream proto, long fieldId) { 536af03df6a7a93c832e0bc77b88607ef9161f0791bSteven Timotius final long token = proto.start(fieldId); 537af03df6a7a93c832e0bc77b88607ef9161f0791bSteven Timotius proto.write(SHOWN, mSurfaceShown); 538af03df6a7a93c832e0bc77b88607ef9161f0791bSteven Timotius proto.write(LAYER, mSurfaceLayer); 539af03df6a7a93c832e0bc77b88607ef9161f0791bSteven Timotius proto.end(token); 540af03df6a7a93c832e0bc77b88607ef9161f0791bSteven Timotius } 541fed100742011bbc3092925c37e9f2df4ab04b6b5Robert Carr 542e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr public void dump(PrintWriter pw, String prefix, boolean dumpAll) { 543e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr if (dumpAll) { 544e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr pw.print(prefix); pw.print("mSurface="); pw.println(mSurfaceControl); 545e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 546e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown); 547e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr pw.print(" layer="); pw.print(mSurfaceLayer); 548e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr pw.print(" alpha="); pw.print(mSurfaceAlpha); 549e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr pw.print(" rect=("); pw.print(mSurfaceX); 550e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr pw.print(","); pw.print(mSurfaceY); 551e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr pw.print(") "); pw.print(mSurfaceW); 552d878e4cfee6bc35f961866106b5bc795b97d05a6Jorim Jaggi pw.print(" x "); pw.print(mSurfaceH); 553d878e4cfee6bc35f961866106b5bc795b97d05a6Jorim Jaggi pw.print(" transform=("); pw.print(mLastDsdx); pw.print(", "); 554d878e4cfee6bc35f961866106b5bc795b97d05a6Jorim Jaggi pw.print(mLastDtdx); pw.print(", "); pw.print(mLastDsdy); 555d878e4cfee6bc35f961866106b5bc795b97d05a6Jorim Jaggi pw.print(", "); pw.print(mLastDtdy); pw.println(")"); 556e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr } 557e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr 55878a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski @Override 55978a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski public String toString() { 56078a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski return mSurfaceControl.toString(); 56178a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski } 562e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr} 563