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