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