blob: a12c2c40152d09ed2c21bbd963f8d79c779b211f [file] [log] [blame]
Robert Carr3b716242016-08-16 16:02:21 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.wm;
18
19import android.graphics.Rect;
20import android.graphics.Region;
21import android.os.IBinder;
22import android.os.Parcel;
23import android.util.Slog;
24import android.view.SurfaceControl;
25
26import java.io.FileDescriptor;
27import java.io.FileOutputStream;
28import java.io.DataOutputStream;
29
30// A surface control subclass which logs events to a FD in binary format.
31// This can be used in our CTS tests to enable a pattern similar to mocking
32// the surface control.
33//
34// See cts/hostsidetests/../../SurfaceTraceReceiver.java for parsing side.
Andrii Kulian283acd22017-08-03 04:03:51 -070035class RemoteSurfaceTrace extends SurfaceControlWithBackground {
Robert Carr3b716242016-08-16 16:02:21 -070036 static final String TAG = "RemoteSurfaceTrace";
37
38 final FileDescriptor mWriteFd;
39 final DataOutputStream mOut;
40
41 final WindowManagerService mService;
42 final WindowState mWindow;
43
Andrii Kulian283acd22017-08-03 04:03:51 -070044 RemoteSurfaceTrace(FileDescriptor fd, SurfaceControlWithBackground wrapped,
45 WindowState window) {
Robert Carr3b716242016-08-16 16:02:21 -070046 super(wrapped);
47
48 mWriteFd = fd;
49 mOut = new DataOutputStream(new FileOutputStream(fd, false));
50
51 mWindow = window;
52 mService = mWindow.mService;
53 }
54
55 @Override
56 public void setAlpha(float alpha) {
57 writeFloatEvent("Alpha", alpha);
58 super.setAlpha(alpha);
59 }
60
61 @Override
62 public void setLayer(int zorder) {
63 writeIntEvent("Layer", zorder);
64 super.setLayer(zorder);
65 }
66
67 @Override
68 public void setPosition(float x, float y) {
69 writeFloatEvent("Position", x, y);
70 super.setPosition(x, y);
71 }
72
73 @Override
74 public void setGeometryAppliesWithResize() {
75 writeEvent("GeometryAppliesWithResize");
76 super.setGeometryAppliesWithResize();
77 }
78
79 @Override
80 public void setSize(int w, int h) {
81 writeIntEvent("Size", w, h);
82 super.setSize(w, h);
83 }
84
85 @Override
86 public void setWindowCrop(Rect crop) {
Robert Carr68e5c9e2016-09-14 10:50:09 -070087 writeRectEvent("Crop", crop);
Robert Carr3b716242016-08-16 16:02:21 -070088 super.setWindowCrop(crop);
89 }
90
91 @Override
92 public void setFinalCrop(Rect crop) {
93 writeRectEvent("FinalCrop", crop);
94 super.setFinalCrop(crop);
95 }
96
97 @Override
98 public void setLayerStack(int layerStack) {
99 writeIntEvent("LayerStack", layerStack);
100 super.setLayerStack(layerStack);
101 }
102
103 @Override
104 public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
105 writeFloatEvent("Matrix", dsdx, dtdx, dsdy, dtdy);
106 super.setMatrix(dsdx, dtdx, dsdy, dtdy);
107 }
108
109 @Override
110 public void hide() {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700111 writeEvent("Hide");
Robert Carr3b716242016-08-16 16:02:21 -0700112 super.hide();
113 }
114
115 @Override
116 public void show() {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700117 writeEvent("Show");
Robert Carr3b716242016-08-16 16:02:21 -0700118 super.show();
119 }
120
121 private void writeEvent(String tag) {
122 try {
123 mOut.writeUTF(tag);
124 mOut.writeUTF(mWindow.getWindowTag().toString());
Robert Carrb9411082016-09-15 12:51:46 -0700125 writeSigil();
Robert Carr3b716242016-08-16 16:02:21 -0700126 } catch (Exception e) {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700127 RemoteEventTrace.logException(e);
Robert Carr3b716242016-08-16 16:02:21 -0700128 mService.disableSurfaceTrace();
129 }
130 }
131
132 private void writeIntEvent(String tag, int... values) {
133 try {
134 mOut.writeUTF(tag);
135 mOut.writeUTF(mWindow.getWindowTag().toString());
136 for (int value: values) {
137 mOut.writeInt(value);
138 }
Robert Carrb9411082016-09-15 12:51:46 -0700139 writeSigil();
Robert Carr3b716242016-08-16 16:02:21 -0700140 } catch (Exception e) {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700141 RemoteEventTrace.logException(e);
Robert Carr3b716242016-08-16 16:02:21 -0700142 mService.disableSurfaceTrace();
143 }
144 }
145
146 private void writeFloatEvent(String tag, float... values) {
147 try {
148 mOut.writeUTF(tag);
149 mOut.writeUTF(mWindow.getWindowTag().toString());
150 for (float value: values) {
151 mOut.writeFloat(value);
152 }
Robert Carrb9411082016-09-15 12:51:46 -0700153 writeSigil();
Robert Carr3b716242016-08-16 16:02:21 -0700154 } catch (Exception e) {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700155 RemoteEventTrace.logException(e);
Robert Carr3b716242016-08-16 16:02:21 -0700156 mService.disableSurfaceTrace();
157 }
158 }
159
160 private void writeRectEvent(String tag, Rect value) {
Robert Carr68e5c9e2016-09-14 10:50:09 -0700161 writeFloatEvent(tag, value.left, value.top, value.right, value.bottom);
Robert Carr3b716242016-08-16 16:02:21 -0700162 }
Robert Carrb9411082016-09-15 12:51:46 -0700163
164 private void writeSigil() throws Exception {
165 mOut.write(RemoteEventTrace.sigil, 0, 4);
166 }
Robert Carr3b716242016-08-16 16:02:21 -0700167}