• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2024 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 
17 #pragma once
18 
19 #include <gui/fake/BufferData.h>
20 #include <renderengine/mock/FakeExternalTexture.h>
21 #include <ui/ShadowSettings.h>
22 
23 #include <Client.h> // temporarily needed for LayerCreationArgs
24 #include <FrontEnd/LayerCreationArgs.h>
25 #include <FrontEnd/LayerHierarchy.h>
26 #include <FrontEnd/LayerLifecycleManager.h>
27 #include <FrontEnd/LayerSnapshotBuilder.h>
28 #include <Layer.h> // needed for framerate
29 
30 namespace android::surfaceflinger::frontend {
31 
32 class LayerLifecycleManagerHelper {
33 public:
LayerLifecycleManagerHelper(LayerLifecycleManager & layerLifecycleManager)34     LayerLifecycleManagerHelper(LayerLifecycleManager& layerLifecycleManager)
35           : mLifecycleManager(layerLifecycleManager) {}
36     ~LayerLifecycleManagerHelper() = default;
37 
createArgs(uint32_t id,bool canBeRoot,uint32_t parentId,uint32_t layerIdToMirror)38     static LayerCreationArgs createArgs(uint32_t id, bool canBeRoot, uint32_t parentId,
39                                         uint32_t layerIdToMirror) {
40         LayerCreationArgs args(std::make_optional(id));
41         args.name = "testlayer";
42         args.addToRoot = canBeRoot;
43         args.parentId = parentId;
44         args.layerIdToMirror = layerIdToMirror;
45         return args;
46     }
47 
createDisplayMirrorArgs(uint32_t id,ui::LayerStack layerStackToMirror)48     static LayerCreationArgs createDisplayMirrorArgs(uint32_t id,
49                                                      ui::LayerStack layerStackToMirror) {
50         LayerCreationArgs args(std::make_optional(id));
51         args.name = "testlayer";
52         args.addToRoot = true;
53         args.layerStackToMirror = layerStackToMirror;
54         return args;
55     }
56 
rootLayer(uint32_t id)57     static std::unique_ptr<RequestedLayerState> rootLayer(uint32_t id) {
58         return std::make_unique<RequestedLayerState>(createArgs(/*id=*/id, /*canBeRoot=*/true,
59                                                                 /*parent=*/UNASSIGNED_LAYER_ID,
60                                                                 /*mirror=*/UNASSIGNED_LAYER_ID));
61     }
62 
childLayer(uint32_t id,uint32_t parentId)63     static std::unique_ptr<RequestedLayerState> childLayer(uint32_t id, uint32_t parentId) {
64         return std::make_unique<RequestedLayerState>(createArgs(/*id=*/id, /*canBeRoot=*/false,
65                                                                 parentId,
66                                                                 /*mirror=*/UNASSIGNED_LAYER_ID));
67     }
68 
setZTransaction(uint32_t id,int32_t z)69     static std::vector<QueuedTransactionState> setZTransaction(uint32_t id, int32_t z) {
70         std::vector<QueuedTransactionState> transactions;
71         transactions.emplace_back();
72         transactions.back().states.push_back({});
73 
74         transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
75         transactions.back().states.front().layerId = id;
76         transactions.back().states.front().state.z = z;
77         return transactions;
78     }
79 
createRootLayer(uint32_t id)80     void createRootLayer(uint32_t id) {
81         std::vector<std::unique_ptr<RequestedLayerState>> layers;
82         layers.emplace_back(std::make_unique<RequestedLayerState>(
83                 createArgs(/*id=*/id, /*canBeRoot=*/true, /*parent=*/UNASSIGNED_LAYER_ID,
84                            /*mirror=*/UNASSIGNED_LAYER_ID)));
85         mLifecycleManager.addLayers(std::move(layers));
86     }
87 
createRootLayerWithUid(uint32_t id,gui::Uid uid)88     void createRootLayerWithUid(uint32_t id, gui::Uid uid) {
89         std::vector<std::unique_ptr<RequestedLayerState>> layers;
90         auto args = createArgs(/*id=*/id, /*canBeRoot=*/true, /*parent=*/UNASSIGNED_LAYER_ID,
91                                /*mirror=*/UNASSIGNED_LAYER_ID);
92         args.ownerUid = uid.val();
93         layers.emplace_back(std::make_unique<RequestedLayerState>(args));
94         mLifecycleManager.addLayers(std::move(layers));
95     }
96 
createDisplayMirrorLayer(uint32_t id,ui::LayerStack layerStack)97     void createDisplayMirrorLayer(uint32_t id, ui::LayerStack layerStack) {
98         std::vector<std::unique_ptr<RequestedLayerState>> layers;
99         layers.emplace_back(std::make_unique<RequestedLayerState>(
100                 createDisplayMirrorArgs(/*id=*/id, layerStack)));
101         mLifecycleManager.addLayers(std::move(layers));
102     }
103 
createLayer(uint32_t id,uint32_t parentId)104     void createLayer(uint32_t id, uint32_t parentId) {
105         std::vector<std::unique_ptr<RequestedLayerState>> layers;
106         layers.emplace_back(std::make_unique<RequestedLayerState>(
107                 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
108                            /*mirror=*/UNASSIGNED_LAYER_ID)));
109         mLifecycleManager.addLayers(std::move(layers));
110     }
111 
reparentLayerTransaction(uint32_t id,uint32_t newParentId)112     std::vector<QueuedTransactionState> reparentLayerTransaction(uint32_t id,
113                                                                  uint32_t newParentId) {
114         std::vector<QueuedTransactionState> transactions;
115         transactions.emplace_back();
116         transactions.back().states.push_back({});
117         transactions.back().states.front().parentId = newParentId;
118         transactions.back().states.front().state.what = layer_state_t::eReparent;
119         transactions.back().states.front().relativeParentId = UNASSIGNED_LAYER_ID;
120         transactions.back().states.front().layerId = id;
121         return transactions;
122     }
123 
reparentLayer(uint32_t id,uint32_t newParentId)124     void reparentLayer(uint32_t id, uint32_t newParentId) {
125         mLifecycleManager.applyTransactions(reparentLayerTransaction(id, newParentId));
126     }
127 
relativeLayerTransaction(uint32_t id,uint32_t relativeParentId)128     std::vector<QueuedTransactionState> relativeLayerTransaction(uint32_t id,
129                                                                  uint32_t relativeParentId) {
130         std::vector<QueuedTransactionState> transactions;
131         transactions.emplace_back();
132         transactions.back().states.push_back({});
133         transactions.back().states.front().relativeParentId = relativeParentId;
134         transactions.back().states.front().state.what = layer_state_t::eRelativeLayerChanged;
135         transactions.back().states.front().layerId = id;
136         return transactions;
137     }
138 
reparentRelativeLayer(uint32_t id,uint32_t relativeParentId)139     void reparentRelativeLayer(uint32_t id, uint32_t relativeParentId) {
140         mLifecycleManager.applyTransactions(relativeLayerTransaction(id, relativeParentId));
141     }
142 
removeRelativeZ(uint32_t id)143     void removeRelativeZ(uint32_t id) {
144         std::vector<QueuedTransactionState> transactions;
145         transactions.emplace_back();
146         transactions.back().states.push_back({});
147         transactions.back().states.front().state.what = layer_state_t::eLayerChanged;
148         transactions.back().states.front().layerId = id;
149         mLifecycleManager.applyTransactions(transactions);
150     }
151 
setPosition(uint32_t id,float x,float y)152     void setPosition(uint32_t id, float x, float y) {
153         std::vector<QueuedTransactionState> transactions;
154         transactions.emplace_back();
155         transactions.back().states.push_back({});
156         transactions.back().states.front().state.what = layer_state_t::ePositionChanged;
157         transactions.back().states.front().state.x = x;
158         transactions.back().states.front().state.y = y;
159         transactions.back().states.front().layerId = id;
160         mLifecycleManager.applyTransactions(transactions);
161     }
162 
mirrorLayer(uint32_t id,uint32_t parentId,uint32_t layerIdToMirror)163     void mirrorLayer(uint32_t id, uint32_t parentId, uint32_t layerIdToMirror) {
164         std::vector<std::unique_ptr<RequestedLayerState>> layers;
165         layers.emplace_back(std::make_unique<RequestedLayerState>(
166                 createArgs(/*id=*/id, /*canBeRoot=*/false, /*parent=*/parentId,
167                            /*mirror=*/layerIdToMirror)));
168         mLifecycleManager.addLayers(std::move(layers));
169     }
170 
updateBackgroundColor(uint32_t id,half alpha)171     void updateBackgroundColor(uint32_t id, half alpha) {
172         std::vector<QueuedTransactionState> transactions;
173         transactions.emplace_back();
174         transactions.back().states.push_back({});
175         transactions.back().states.front().state.what = layer_state_t::eBackgroundColorChanged;
176         transactions.back().states.front().state.bgColor.a = alpha;
177         transactions.back().states.front().layerId = id;
178         mLifecycleManager.applyTransactions(transactions);
179     }
180 
destroyLayerHandle(uint32_t id)181     void destroyLayerHandle(uint32_t id) { mLifecycleManager.onHandlesDestroyed({{id, "test"}}); }
182 
setZ(uint32_t id,int32_t z)183     void setZ(uint32_t id, int32_t z) {
184         mLifecycleManager.applyTransactions(setZTransaction(id, z));
185     }
186 
setCrop(uint32_t id,const FloatRect & crop)187     void setCrop(uint32_t id, const FloatRect& crop) {
188         std::vector<QueuedTransactionState> transactions;
189         transactions.emplace_back();
190         transactions.back().states.push_back({});
191 
192         transactions.back().states.front().state.what = layer_state_t::eCropChanged;
193         transactions.back().states.front().layerId = id;
194         transactions.back().states.front().state.crop = crop;
195         mLifecycleManager.applyTransactions(transactions);
196     }
197 
setCrop(uint32_t id,const Rect & crop)198     void setCrop(uint32_t id, const Rect& crop) { setCrop(id, crop.toFloatRect()); }
199 
setFlags(uint32_t id,uint32_t mask,uint32_t flags)200     void setFlags(uint32_t id, uint32_t mask, uint32_t flags) {
201         std::vector<QueuedTransactionState> transactions;
202         transactions.emplace_back();
203         transactions.back().states.push_back({});
204 
205         transactions.back().states.front().state.what = layer_state_t::eFlagsChanged;
206         transactions.back().states.front().state.flags = flags;
207         transactions.back().states.front().state.mask = mask;
208         transactions.back().states.front().layerId = id;
209         mLifecycleManager.applyTransactions(transactions);
210     }
211 
setAlpha(uint32_t id,float alpha)212     void setAlpha(uint32_t id, float alpha) {
213         std::vector<QueuedTransactionState> transactions;
214         transactions.emplace_back();
215         transactions.back().states.push_back({});
216 
217         transactions.back().states.front().state.what = layer_state_t::eAlphaChanged;
218         transactions.back().states.front().layerId = id;
219         transactions.back().states.front().state.color.a = static_cast<half>(alpha);
220         mLifecycleManager.applyTransactions(transactions);
221     }
222 
setAutoRefresh(uint32_t id,bool autoRefresh)223     void setAutoRefresh(uint32_t id, bool autoRefresh) {
224         std::vector<QueuedTransactionState> transactions;
225         transactions.emplace_back();
226         transactions.back().states.push_back({});
227 
228         transactions.back().states.front().state.what = layer_state_t::eAutoRefreshChanged;
229         transactions.back().states.front().layerId = id;
230         transactions.back().states.front().state.autoRefresh = autoRefresh;
231         mLifecycleManager.applyTransactions(transactions);
232     }
233 
hideLayer(uint32_t id)234     void hideLayer(uint32_t id) {
235         setFlags(id, layer_state_t::eLayerHidden, layer_state_t::eLayerHidden);
236     }
237 
showLayer(uint32_t id)238     void showLayer(uint32_t id) { setFlags(id, layer_state_t::eLayerHidden, 0); }
239 
240     void setColor(uint32_t id, half3 rgb = half3(1._hf, 1._hf, 1._hf)) {
241         std::vector<QueuedTransactionState> transactions;
242         transactions.emplace_back();
243         transactions.back().states.push_back({});
244         transactions.back().states.front().state.what = layer_state_t::eColorChanged;
245         transactions.back().states.front().state.color.rgb = rgb;
246         transactions.back().states.front().layerId = id;
247         mLifecycleManager.applyTransactions(transactions);
248     }
249 
setLayerStack(uint32_t id,int32_t layerStack)250     void setLayerStack(uint32_t id, int32_t layerStack) {
251         std::vector<QueuedTransactionState> transactions;
252         transactions.emplace_back();
253         transactions.back().states.push_back({});
254 
255         transactions.back().states.front().state.what = layer_state_t::eLayerStackChanged;
256         transactions.back().states.front().layerId = id;
257         transactions.back().states.front().state.layerStack = ui::LayerStack::fromValue(layerStack);
258         mLifecycleManager.applyTransactions(transactions);
259     }
260 
setTouchableRegion(uint32_t id,Region region)261     void setTouchableRegion(uint32_t id, Region region) {
262         std::vector<QueuedTransactionState> transactions;
263         transactions.emplace_back();
264         transactions.back().states.push_back({});
265 
266         transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
267         transactions.back().states.front().layerId = id;
268         auto inputInfo = transactions.back().states.front().state.editWindowInfo();
269         *inputInfo = {};
270         inputInfo->touchableRegion = region;
271         inputInfo->token = sp<BBinder>::make();
272         mLifecycleManager.applyTransactions(transactions);
273     }
274 
setInputInfo(uint32_t id,std::function<void (gui::WindowInfo &)> configureInput)275     void setInputInfo(uint32_t id, std::function<void(gui::WindowInfo&)> configureInput) {
276         std::vector<QueuedTransactionState> transactions;
277         transactions.emplace_back();
278         transactions.back().states.push_back({});
279 
280         transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
281         transactions.back().states.front().layerId = id;
282         auto inputInfo = transactions.back().states.front().state.editWindowInfo();
283         *inputInfo = {};
284         if (!inputInfo->token) {
285             inputInfo->token = sp<BBinder>::make();
286         }
287         configureInput(*inputInfo);
288 
289         mLifecycleManager.applyTransactions(transactions);
290     }
291 
setTouchableRegionCrop(uint32_t id,Region region,uint32_t touchCropId,bool replaceTouchableRegionWithCrop)292     void setTouchableRegionCrop(uint32_t id, Region region, uint32_t touchCropId,
293                                 bool replaceTouchableRegionWithCrop) {
294         std::vector<QueuedTransactionState> transactions;
295         transactions.emplace_back();
296         transactions.back().states.push_back({});
297 
298         transactions.back().states.front().state.what = layer_state_t::eInputInfoChanged;
299         transactions.back().states.front().layerId = id;
300         auto inputInfo = transactions.back().states.front().state.editWindowInfo();
301         *inputInfo = {};
302         inputInfo->touchableRegion = region;
303         inputInfo->replaceTouchableRegionWithCrop = replaceTouchableRegionWithCrop;
304         transactions.back().states.front().touchCropId = touchCropId;
305 
306         inputInfo->token = sp<BBinder>::make();
307         mLifecycleManager.applyTransactions(transactions);
308     }
309 
setBackgroundBlurRadius(uint32_t id,uint32_t backgroundBlurRadius)310     void setBackgroundBlurRadius(uint32_t id, uint32_t backgroundBlurRadius) {
311         std::vector<QueuedTransactionState> transactions;
312         transactions.emplace_back();
313         transactions.back().states.push_back({});
314 
315         transactions.back().states.front().state.what = layer_state_t::eBackgroundBlurRadiusChanged;
316         transactions.back().states.front().layerId = id;
317         transactions.back().states.front().state.backgroundBlurRadius = backgroundBlurRadius;
318         mLifecycleManager.applyTransactions(transactions);
319     }
320 
setFrameRateSelectionPriority(uint32_t id,int32_t priority)321     void setFrameRateSelectionPriority(uint32_t id, int32_t priority) {
322         std::vector<QueuedTransactionState> transactions;
323         transactions.emplace_back();
324         transactions.back().states.push_back({});
325 
326         transactions.back().states.front().state.what = layer_state_t::eFrameRateSelectionPriority;
327         transactions.back().states.front().layerId = id;
328         transactions.back().states.front().state.frameRateSelectionPriority = priority;
329         mLifecycleManager.applyTransactions(transactions);
330     }
331 
setFrameRate(uint32_t id,float frameRate,int8_t compatibility,int8_t changeFrameRateStrategy)332     void setFrameRate(uint32_t id, float frameRate, int8_t compatibility,
333                       int8_t changeFrameRateStrategy) {
334         std::vector<QueuedTransactionState> transactions;
335         transactions.emplace_back();
336         transactions.back().states.push_back({});
337 
338         transactions.back().states.front().state.what = layer_state_t::eFrameRateChanged;
339         transactions.back().states.front().layerId = id;
340         transactions.back().states.front().state.frameRate = frameRate;
341         transactions.back().states.front().state.frameRateCompatibility = compatibility;
342         transactions.back().states.front().state.changeFrameRateStrategy = changeFrameRateStrategy;
343         mLifecycleManager.applyTransactions(transactions);
344     }
345 
setFrameRate(uint32_t id,Layer::FrameRate framerate)346     void setFrameRate(uint32_t id, Layer::FrameRate framerate) {
347         std::vector<QueuedTransactionState> transactions;
348         transactions.emplace_back();
349         transactions.back().states.push_back({});
350 
351         transactions.back().states.front().state.what = layer_state_t::eFrameRateChanged;
352         transactions.back().states.front().layerId = id;
353         transactions.back().states.front().state.frameRate = framerate.vote.rate.getValue();
354         transactions.back().states.front().state.frameRateCompatibility = 0;
355         transactions.back().states.front().state.changeFrameRateStrategy = 0;
356         mLifecycleManager.applyTransactions(transactions);
357     }
358 
setFrameRateCategory(uint32_t id,int8_t frameRateCategory)359     void setFrameRateCategory(uint32_t id, int8_t frameRateCategory) {
360         std::vector<QueuedTransactionState> transactions;
361         transactions.emplace_back();
362         transactions.back().states.push_back({});
363 
364         transactions.back().states.front().state.what = layer_state_t::eFrameRateCategoryChanged;
365         transactions.back().states.front().layerId = id;
366         transactions.back().states.front().state.frameRateCategory = frameRateCategory;
367         mLifecycleManager.applyTransactions(transactions);
368     }
369 
setFrameRateSelectionStrategy(uint32_t id,int8_t strategy)370     void setFrameRateSelectionStrategy(uint32_t id, int8_t strategy) {
371         std::vector<QueuedTransactionState> transactions;
372         transactions.emplace_back();
373         transactions.back().states.push_back({});
374 
375         transactions.back().states.front().state.what =
376                 layer_state_t::eFrameRateSelectionStrategyChanged;
377         transactions.back().states.front().layerId = id;
378         transactions.back().states.front().state.frameRateSelectionStrategy = strategy;
379         mLifecycleManager.applyTransactions(transactions);
380     }
381 
setDefaultFrameRateCompatibility(uint32_t id,int8_t defaultFrameRateCompatibility)382     void setDefaultFrameRateCompatibility(uint32_t id, int8_t defaultFrameRateCompatibility) {
383         std::vector<QueuedTransactionState> transactions;
384         transactions.emplace_back();
385         transactions.back().states.push_back({});
386 
387         transactions.back().states.front().state.what =
388                 layer_state_t::eDefaultFrameRateCompatibilityChanged;
389         transactions.back().states.front().layerId = id;
390         transactions.back().states.front().state.defaultFrameRateCompatibility =
391                 defaultFrameRateCompatibility;
392         mLifecycleManager.applyTransactions(transactions);
393     }
394 
setRoundedCorners(uint32_t id,float radius)395     void setRoundedCorners(uint32_t id, float radius) {
396         std::vector<QueuedTransactionState> transactions;
397         transactions.emplace_back();
398         transactions.back().states.push_back({});
399 
400         transactions.back().states.front().state.what = layer_state_t::eCornerRadiusChanged;
401         transactions.back().states.front().layerId = id;
402         transactions.back().states.front().state.cornerRadius = radius;
403         mLifecycleManager.applyTransactions(transactions);
404     }
405 
setBuffer(uint32_t id,std::shared_ptr<renderengine::ExternalTexture> texture)406     void setBuffer(uint32_t id, std::shared_ptr<renderengine::ExternalTexture> texture) {
407         std::vector<QueuedTransactionState> transactions;
408         transactions.emplace_back();
409         transactions.back().states.push_back({});
410 
411         transactions.back().states.front().state.what = layer_state_t::eBufferChanged;
412         transactions.back().states.front().layerId = id;
413         transactions.back().states.front().externalTexture = texture;
414         transactions.back().states.front().state.bufferData =
415                 std::make_shared<fake::BufferData>(texture->getId(), texture->getWidth(),
416                                                    texture->getHeight(), texture->getPixelFormat(),
417                                                    texture->getUsage());
418         mLifecycleManager.applyTransactions(transactions);
419     }
420 
setBuffer(uint32_t id)421     void setBuffer(uint32_t id) {
422         static uint64_t sBufferId = 1;
423         setBuffer(id,
424                   std::make_shared<renderengine::mock::
425                                            FakeExternalTexture>(1U /*width*/, 1U /*height*/,
426                                                                 sBufferId++,
427                                                                 HAL_PIXEL_FORMAT_RGBA_8888,
428                                                                 GRALLOC_USAGE_PROTECTED /*usage*/));
429     }
430 
setFrontBuffer(uint32_t id)431     void setFrontBuffer(uint32_t id) {
432         static uint64_t sBufferId = 1;
433         setBuffer(id,
434                   std::make_shared<renderengine::mock::FakeExternalTexture>(
435                           1U /*width*/, 1U /*height*/, sBufferId++, HAL_PIXEL_FORMAT_RGBA_8888,
436                           GRALLOC_USAGE_PROTECTED | AHARDWAREBUFFER_USAGE_FRONT_BUFFER /*usage*/));
437     }
438 
setBufferCrop(uint32_t id,const Rect & bufferCrop)439     void setBufferCrop(uint32_t id, const Rect& bufferCrop) {
440         std::vector<QueuedTransactionState> transactions;
441         transactions.emplace_back();
442         transactions.back().states.push_back({});
443 
444         transactions.back().states.front().state.what = layer_state_t::eBufferCropChanged;
445         transactions.back().states.front().layerId = id;
446         transactions.back().states.front().state.bufferCrop = bufferCrop;
447         mLifecycleManager.applyTransactions(transactions);
448     }
449 
setDamageRegion(uint32_t id,const Region & damageRegion)450     void setDamageRegion(uint32_t id, const Region& damageRegion) {
451         std::vector<QueuedTransactionState> transactions;
452         transactions.emplace_back();
453         transactions.back().states.push_back({});
454 
455         transactions.back().states.front().layerId = id;
456         transactions.back().states.front().state.updateSurfaceDamageRegion(damageRegion);
457         mLifecycleManager.applyTransactions(transactions);
458     }
459 
setDataspace(uint32_t id,ui::Dataspace dataspace)460     void setDataspace(uint32_t id, ui::Dataspace dataspace) {
461         std::vector<QueuedTransactionState> transactions;
462         transactions.emplace_back();
463         transactions.back().states.push_back({});
464 
465         transactions.back().states.front().state.what = layer_state_t::eDataspaceChanged;
466         transactions.back().states.front().layerId = id;
467         transactions.back().states.front().state.dataspace = dataspace;
468         mLifecycleManager.applyTransactions(transactions);
469     }
470 
setMatrix(uint32_t id,float dsdx,float dtdx,float dtdy,float dsdy)471     void setMatrix(uint32_t id, float dsdx, float dtdx, float dtdy, float dsdy) {
472         layer_state_t::matrix22_t matrix{dsdx, dtdx, dtdy, dsdy};
473 
474         std::vector<QueuedTransactionState> transactions;
475         transactions.emplace_back();
476         transactions.back().states.push_back({});
477 
478         transactions.back().states.front().state.what = layer_state_t::eMatrixChanged;
479         transactions.back().states.front().layerId = id;
480         transactions.back().states.front().state.matrix = matrix;
481         mLifecycleManager.applyTransactions(transactions);
482     }
483 
setClientDrawnCornerRadius(uint32_t id,float clientDrawnCornerRadius)484     void setClientDrawnCornerRadius(uint32_t id, float clientDrawnCornerRadius) {
485         std::vector<QueuedTransactionState> transactions;
486         transactions.emplace_back();
487         transactions.back().states.push_back({});
488 
489         transactions.back().states.front().state.what =
490                 layer_state_t::eClientDrawnCornerRadiusChanged;
491         transactions.back().states.front().layerId = id;
492         transactions.back().states.front().state.clientDrawnCornerRadius = clientDrawnCornerRadius;
493         mLifecycleManager.applyTransactions(transactions);
494     }
495 
setShadowRadius(uint32_t id,float shadowRadius)496     void setShadowRadius(uint32_t id, float shadowRadius) {
497         std::vector<QueuedTransactionState> transactions;
498         transactions.emplace_back();
499         transactions.back().states.push_back({});
500 
501         transactions.back().states.front().state.what = layer_state_t::eShadowRadiusChanged;
502         transactions.back().states.front().layerId = id;
503         transactions.back().states.front().state.shadowRadius = shadowRadius;
504         mLifecycleManager.applyTransactions(transactions);
505     }
506 
setBorderSettings(uint32_t id,gui::BorderSettings settings)507     void setBorderSettings(uint32_t id, gui::BorderSettings settings) {
508         std::vector<QueuedTransactionState> transactions;
509         transactions.emplace_back();
510         transactions.back().states.push_back({});
511 
512         transactions.back().states.front().state.what = layer_state_t::eBorderSettingsChanged;
513         transactions.back().states.front().layerId = id;
514         transactions.back().states.front().state.borderSettings = settings;
515         mLifecycleManager.applyTransactions(transactions);
516     }
517 
setTrustedOverlay(uint32_t id,gui::TrustedOverlay trustedOverlay)518     void setTrustedOverlay(uint32_t id, gui::TrustedOverlay trustedOverlay) {
519         std::vector<QueuedTransactionState> transactions;
520         transactions.emplace_back();
521         transactions.back().states.push_back({});
522 
523         transactions.back().states.front().state.what = layer_state_t::eTrustedOverlayChanged;
524         transactions.back().states.front().layerId = id;
525         transactions.back().states.front().state.trustedOverlay = trustedOverlay;
526         mLifecycleManager.applyTransactions(transactions);
527     }
528 
setDropInputMode(uint32_t id,gui::DropInputMode dropInputMode)529     void setDropInputMode(uint32_t id, gui::DropInputMode dropInputMode) {
530         std::vector<QueuedTransactionState> transactions;
531         transactions.emplace_back();
532         transactions.back().states.push_back({});
533 
534         transactions.back().states.front().state.what = layer_state_t::eDropInputModeChanged;
535         transactions.back().states.front().layerId = id;
536         transactions.back().states.front().state.dropInputMode = dropInputMode;
537         mLifecycleManager.applyTransactions(transactions);
538     }
539 
setGameMode(uint32_t id,gui::GameMode gameMode)540     void setGameMode(uint32_t id, gui::GameMode gameMode) {
541         std::vector<QueuedTransactionState> transactions;
542         transactions.emplace_back();
543         transactions.back().states.push_back({});
544         transactions.back().states.front().state.what = layer_state_t::eMetadataChanged;
545         transactions.back().states.front().state.metadata = LayerMetadata();
546         transactions.back().states.front().state.metadata.setInt32(METADATA_GAME_MODE,
547                                                                    static_cast<int32_t>(gameMode));
548         transactions.back().states.front().layerId = id;
549         mLifecycleManager.applyTransactions(transactions);
550     }
551 
setEdgeExtensionEffect(uint32_t id,int edge)552     void setEdgeExtensionEffect(uint32_t id, int edge) {
553         std::vector<QueuedTransactionState> transactions;
554         transactions.emplace_back();
555         transactions.back().states.push_back({});
556 
557         transactions.back().states.front().layerId = id;
558         transactions.back().states.front().state.what |= layer_state_t::eEdgeExtensionChanged;
559         transactions.back().states.front().state.edgeExtensionParameters =
560                 gui::EdgeExtensionParameters();
561         transactions.back().states.front().state.edgeExtensionParameters.extendLeft = edge & LEFT;
562         transactions.back().states.front().state.edgeExtensionParameters.extendRight = edge & RIGHT;
563         transactions.back().states.front().state.edgeExtensionParameters.extendTop = edge & TOP;
564         transactions.back().states.front().state.edgeExtensionParameters.extendBottom =
565                 edge & BOTTOM;
566         mLifecycleManager.applyTransactions(transactions);
567     }
568 
569 private:
570     LayerLifecycleManager& mLifecycleManager;
571 };
572 
573 } // namespace android::surfaceflinger::frontend
574