13b716249cc2f94aa9842576b618998c28593be90Robert Carr/*
23b716249cc2f94aa9842576b618998c28593be90Robert Carr * Copyright (C) 2016 The Android Open Source Project
33b716249cc2f94aa9842576b618998c28593be90Robert Carr *
43b716249cc2f94aa9842576b618998c28593be90Robert Carr * Licensed under the Apache License, Version 2.0 (the "License");
53b716249cc2f94aa9842576b618998c28593be90Robert Carr * you may not use this file except in compliance with the License.
63b716249cc2f94aa9842576b618998c28593be90Robert Carr * You may obtain a copy of the License at
73b716249cc2f94aa9842576b618998c28593be90Robert Carr *
83b716249cc2f94aa9842576b618998c28593be90Robert Carr *      http://www.apache.org/licenses/LICENSE-2.0
93b716249cc2f94aa9842576b618998c28593be90Robert Carr *
103b716249cc2f94aa9842576b618998c28593be90Robert Carr * Unless required by applicable law or agreed to in writing, software
113b716249cc2f94aa9842576b618998c28593be90Robert Carr * distributed under the License is distributed on an "AS IS" BASIS,
123b716249cc2f94aa9842576b618998c28593be90Robert Carr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133b716249cc2f94aa9842576b618998c28593be90Robert Carr * See the License for the specific language governing permissions and
143b716249cc2f94aa9842576b618998c28593be90Robert Carr * limitations under the License.
153b716249cc2f94aa9842576b618998c28593be90Robert Carr */
163b716249cc2f94aa9842576b618998c28593be90Robert Carr
173b716249cc2f94aa9842576b618998c28593be90Robert Carrpackage com.android.server.wm;
183b716249cc2f94aa9842576b618998c28593be90Robert Carr
193b716249cc2f94aa9842576b618998c28593be90Robert Carrimport android.graphics.Rect;
203b716249cc2f94aa9842576b618998c28593be90Robert Carrimport android.graphics.Region;
213b716249cc2f94aa9842576b618998c28593be90Robert Carrimport android.os.IBinder;
223b716249cc2f94aa9842576b618998c28593be90Robert Carrimport android.os.Parcel;
233b716249cc2f94aa9842576b618998c28593be90Robert Carrimport android.util.Slog;
243b716249cc2f94aa9842576b618998c28593be90Robert Carrimport android.view.SurfaceControl;
253b716249cc2f94aa9842576b618998c28593be90Robert Carr
263b716249cc2f94aa9842576b618998c28593be90Robert Carrimport java.io.FileDescriptor;
273b716249cc2f94aa9842576b618998c28593be90Robert Carrimport java.io.FileOutputStream;
283b716249cc2f94aa9842576b618998c28593be90Robert Carrimport java.io.DataOutputStream;
293b716249cc2f94aa9842576b618998c28593be90Robert Carr
303b716249cc2f94aa9842576b618998c28593be90Robert Carr// A surface control subclass which logs events to a FD in binary format.
313b716249cc2f94aa9842576b618998c28593be90Robert Carr// This can be used in our CTS tests to enable a pattern similar to mocking
323b716249cc2f94aa9842576b618998c28593be90Robert Carr// the surface control.
333b716249cc2f94aa9842576b618998c28593be90Robert Carr//
343b716249cc2f94aa9842576b618998c28593be90Robert Carr// See cts/hostsidetests/../../SurfaceTraceReceiver.java for parsing side.
353b716249cc2f94aa9842576b618998c28593be90Robert Carrclass RemoteSurfaceTrace extends SurfaceControl {
363b716249cc2f94aa9842576b618998c28593be90Robert Carr    static final String TAG = "RemoteSurfaceTrace";
373b716249cc2f94aa9842576b618998c28593be90Robert Carr
383b716249cc2f94aa9842576b618998c28593be90Robert Carr    final FileDescriptor mWriteFd;
393b716249cc2f94aa9842576b618998c28593be90Robert Carr    final DataOutputStream mOut;
403b716249cc2f94aa9842576b618998c28593be90Robert Carr
413b716249cc2f94aa9842576b618998c28593be90Robert Carr    final WindowManagerService mService;
423b716249cc2f94aa9842576b618998c28593be90Robert Carr    final WindowState mWindow;
433b716249cc2f94aa9842576b618998c28593be90Robert Carr
443b716249cc2f94aa9842576b618998c28593be90Robert Carr    RemoteSurfaceTrace(FileDescriptor fd, SurfaceControl wrapped, WindowState window) {
453b716249cc2f94aa9842576b618998c28593be90Robert Carr        super(wrapped);
463b716249cc2f94aa9842576b618998c28593be90Robert Carr
473b716249cc2f94aa9842576b618998c28593be90Robert Carr        mWriteFd = fd;
483b716249cc2f94aa9842576b618998c28593be90Robert Carr        mOut = new DataOutputStream(new FileOutputStream(fd, false));
493b716249cc2f94aa9842576b618998c28593be90Robert Carr
503b716249cc2f94aa9842576b618998c28593be90Robert Carr        mWindow = window;
513b716249cc2f94aa9842576b618998c28593be90Robert Carr        mService = mWindow.mService;
523b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
533b716249cc2f94aa9842576b618998c28593be90Robert Carr
543b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
553b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void setAlpha(float alpha) {
563b716249cc2f94aa9842576b618998c28593be90Robert Carr        writeFloatEvent("Alpha", alpha);
573b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.setAlpha(alpha);
583b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
593b716249cc2f94aa9842576b618998c28593be90Robert Carr
603b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
613b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void setLayer(int zorder) {
623b716249cc2f94aa9842576b618998c28593be90Robert Carr        writeIntEvent("Layer", zorder);
633b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.setLayer(zorder);
643b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
653b716249cc2f94aa9842576b618998c28593be90Robert Carr
663b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
673b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void setPosition(float x, float y) {
683b716249cc2f94aa9842576b618998c28593be90Robert Carr        writeFloatEvent("Position", x, y);
693b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.setPosition(x, y);
703b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
713b716249cc2f94aa9842576b618998c28593be90Robert Carr
723b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
733b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void setGeometryAppliesWithResize() {
743b716249cc2f94aa9842576b618998c28593be90Robert Carr        writeEvent("GeometryAppliesWithResize");
753b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.setGeometryAppliesWithResize();
763b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
773b716249cc2f94aa9842576b618998c28593be90Robert Carr
783b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
793b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void setSize(int w, int h) {
803b716249cc2f94aa9842576b618998c28593be90Robert Carr        writeIntEvent("Size", w, h);
813b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.setSize(w, h);
823b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
833b716249cc2f94aa9842576b618998c28593be90Robert Carr
843b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
853b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void setWindowCrop(Rect crop) {
8668e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr        writeRectEvent("Crop", crop);
873b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.setWindowCrop(crop);
883b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
893b716249cc2f94aa9842576b618998c28593be90Robert Carr
903b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
913b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void setFinalCrop(Rect crop) {
923b716249cc2f94aa9842576b618998c28593be90Robert Carr        writeRectEvent("FinalCrop", crop);
933b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.setFinalCrop(crop);
943b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
953b716249cc2f94aa9842576b618998c28593be90Robert Carr
963b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
973b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void setLayerStack(int layerStack) {
983b716249cc2f94aa9842576b618998c28593be90Robert Carr        writeIntEvent("LayerStack", layerStack);
993b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.setLayerStack(layerStack);
1003b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
1013b716249cc2f94aa9842576b618998c28593be90Robert Carr
1023b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
1033b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
1043b716249cc2f94aa9842576b618998c28593be90Robert Carr        writeFloatEvent("Matrix", dsdx, dtdx, dsdy, dtdy);
1053b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.setMatrix(dsdx, dtdx, dsdy, dtdy);
1063b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
1073b716249cc2f94aa9842576b618998c28593be90Robert Carr
1083b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
1093b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void hide() {
11068e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr        writeEvent("Hide");
1113b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.hide();
1123b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
1133b716249cc2f94aa9842576b618998c28593be90Robert Carr
1143b716249cc2f94aa9842576b618998c28593be90Robert Carr    @Override
1153b716249cc2f94aa9842576b618998c28593be90Robert Carr    public void show() {
11668e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr        writeEvent("Show");
1173b716249cc2f94aa9842576b618998c28593be90Robert Carr        super.show();
1183b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
1193b716249cc2f94aa9842576b618998c28593be90Robert Carr
1203b716249cc2f94aa9842576b618998c28593be90Robert Carr    private void writeEvent(String tag) {
1213b716249cc2f94aa9842576b618998c28593be90Robert Carr        try {
1223b716249cc2f94aa9842576b618998c28593be90Robert Carr            mOut.writeUTF(tag);
1233b716249cc2f94aa9842576b618998c28593be90Robert Carr            mOut.writeUTF(mWindow.getWindowTag().toString());
124b941108d39d32f81b41c0dd3c5cb26240036c2c0Robert Carr            writeSigil();
1253b716249cc2f94aa9842576b618998c28593be90Robert Carr        } catch (Exception e) {
12668e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr            RemoteEventTrace.logException(e);
1273b716249cc2f94aa9842576b618998c28593be90Robert Carr            mService.disableSurfaceTrace();
1283b716249cc2f94aa9842576b618998c28593be90Robert Carr        }
1293b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
1303b716249cc2f94aa9842576b618998c28593be90Robert Carr
1313b716249cc2f94aa9842576b618998c28593be90Robert Carr    private void writeIntEvent(String tag, int... values) {
1323b716249cc2f94aa9842576b618998c28593be90Robert Carr        try {
1333b716249cc2f94aa9842576b618998c28593be90Robert Carr            mOut.writeUTF(tag);
1343b716249cc2f94aa9842576b618998c28593be90Robert Carr            mOut.writeUTF(mWindow.getWindowTag().toString());
1353b716249cc2f94aa9842576b618998c28593be90Robert Carr            for (int value: values) {
1363b716249cc2f94aa9842576b618998c28593be90Robert Carr                mOut.writeInt(value);
1373b716249cc2f94aa9842576b618998c28593be90Robert Carr            }
138b941108d39d32f81b41c0dd3c5cb26240036c2c0Robert Carr            writeSigil();
1393b716249cc2f94aa9842576b618998c28593be90Robert Carr        } catch (Exception e) {
14068e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr            RemoteEventTrace.logException(e);
1413b716249cc2f94aa9842576b618998c28593be90Robert Carr            mService.disableSurfaceTrace();
1423b716249cc2f94aa9842576b618998c28593be90Robert Carr        }
1433b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
1443b716249cc2f94aa9842576b618998c28593be90Robert Carr
1453b716249cc2f94aa9842576b618998c28593be90Robert Carr    private void writeFloatEvent(String tag, float... values) {
1463b716249cc2f94aa9842576b618998c28593be90Robert Carr        try {
1473b716249cc2f94aa9842576b618998c28593be90Robert Carr            mOut.writeUTF(tag);
1483b716249cc2f94aa9842576b618998c28593be90Robert Carr            mOut.writeUTF(mWindow.getWindowTag().toString());
1493b716249cc2f94aa9842576b618998c28593be90Robert Carr            for (float value: values) {
1503b716249cc2f94aa9842576b618998c28593be90Robert Carr                mOut.writeFloat(value);
1513b716249cc2f94aa9842576b618998c28593be90Robert Carr            }
152b941108d39d32f81b41c0dd3c5cb26240036c2c0Robert Carr            writeSigil();
1533b716249cc2f94aa9842576b618998c28593be90Robert Carr        } catch (Exception e) {
15468e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr            RemoteEventTrace.logException(e);
1553b716249cc2f94aa9842576b618998c28593be90Robert Carr            mService.disableSurfaceTrace();
1563b716249cc2f94aa9842576b618998c28593be90Robert Carr        }
1573b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
1583b716249cc2f94aa9842576b618998c28593be90Robert Carr
1593b716249cc2f94aa9842576b618998c28593be90Robert Carr    private void writeRectEvent(String tag, Rect value) {
16068e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr        writeFloatEvent(tag, value.left, value.top, value.right, value.bottom);
1613b716249cc2f94aa9842576b618998c28593be90Robert Carr    }
162b941108d39d32f81b41c0dd3c5cb26240036c2c0Robert Carr
163b941108d39d32f81b41c0dd3c5cb26240036c2c0Robert Carr    private void writeSigil() throws Exception {
164b941108d39d32f81b41c0dd3c5cb26240036c2c0Robert Carr        mOut.write(RemoteEventTrace.sigil, 0, 4);
165b941108d39d32f81b41c0dd3c5cb26240036c2c0Robert Carr    }
1663b716249cc2f94aa9842576b618998c28593be90Robert Carr}
167