xref: /aosp_15_r20/frameworks/native/services/surfaceflinger/FrontEnd/LayerHandle.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2022 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include "LayerHandle.h"
18*38e8c45fSAndroid Build Coastguard Worker #include <cstdint>
19*38e8c45fSAndroid Build Coastguard Worker #include "Layer.h"
20*38e8c45fSAndroid Build Coastguard Worker #include "LayerCreationArgs.h"
21*38e8c45fSAndroid Build Coastguard Worker #include "SurfaceFlinger.h"
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker namespace android::surfaceflinger {
24*38e8c45fSAndroid Build Coastguard Worker 
LayerHandle(const sp<android::SurfaceFlinger> & flinger,const sp<android::Layer> & layer)25*38e8c45fSAndroid Build Coastguard Worker LayerHandle::LayerHandle(const sp<android::SurfaceFlinger>& flinger,
26*38e8c45fSAndroid Build Coastguard Worker                          const sp<android::Layer>& layer)
27*38e8c45fSAndroid Build Coastguard Worker       : mFlinger(flinger), mLayer(layer), mLayerId(static_cast<uint32_t>(layer->getSequence())) {}
28*38e8c45fSAndroid Build Coastguard Worker 
~LayerHandle()29*38e8c45fSAndroid Build Coastguard Worker LayerHandle::~LayerHandle() {
30*38e8c45fSAndroid Build Coastguard Worker     if (mFlinger) {
31*38e8c45fSAndroid Build Coastguard Worker         mFlinger->onHandleDestroyed(mLayer, mLayerId);
32*38e8c45fSAndroid Build Coastguard Worker     }
33*38e8c45fSAndroid Build Coastguard Worker }
34*38e8c45fSAndroid Build Coastguard Worker 
35*38e8c45fSAndroid Build Coastguard Worker const String16 LayerHandle::kDescriptor = String16("android.Layer.LayerHandle");
36*38e8c45fSAndroid Build Coastguard Worker 
fromIBinder(const sp<IBinder> & binder)37*38e8c45fSAndroid Build Coastguard Worker sp<LayerHandle> LayerHandle::fromIBinder(const sp<IBinder>& binder) {
38*38e8c45fSAndroid Build Coastguard Worker     if (binder == nullptr) {
39*38e8c45fSAndroid Build Coastguard Worker         return nullptr;
40*38e8c45fSAndroid Build Coastguard Worker     }
41*38e8c45fSAndroid Build Coastguard Worker 
42*38e8c45fSAndroid Build Coastguard Worker     BBinder* b = binder->localBinder();
43*38e8c45fSAndroid Build Coastguard Worker     if (b == nullptr || b->getInterfaceDescriptor() != LayerHandle::kDescriptor) {
44*38e8c45fSAndroid Build Coastguard Worker         ALOGD("handle does not have a valid descriptor");
45*38e8c45fSAndroid Build Coastguard Worker         return nullptr;
46*38e8c45fSAndroid Build Coastguard Worker     }
47*38e8c45fSAndroid Build Coastguard Worker 
48*38e8c45fSAndroid Build Coastguard Worker     // We can safely cast this binder since its local and we verified its interface descriptor.
49*38e8c45fSAndroid Build Coastguard Worker     return sp<LayerHandle>::cast(binder);
50*38e8c45fSAndroid Build Coastguard Worker }
51*38e8c45fSAndroid Build Coastguard Worker 
getLayer(const sp<IBinder> & binder)52*38e8c45fSAndroid Build Coastguard Worker sp<android::Layer> LayerHandle::getLayer(const sp<IBinder>& binder) {
53*38e8c45fSAndroid Build Coastguard Worker     sp<LayerHandle> handle = LayerHandle::fromIBinder(binder);
54*38e8c45fSAndroid Build Coastguard Worker     return handle ? handle->mLayer : nullptr;
55*38e8c45fSAndroid Build Coastguard Worker }
56*38e8c45fSAndroid Build Coastguard Worker 
getLayerId(const sp<IBinder> & binder)57*38e8c45fSAndroid Build Coastguard Worker uint32_t LayerHandle::getLayerId(const sp<IBinder>& binder) {
58*38e8c45fSAndroid Build Coastguard Worker     sp<LayerHandle> handle = LayerHandle::fromIBinder(binder);
59*38e8c45fSAndroid Build Coastguard Worker     return handle ? handle->mLayerId : UNASSIGNED_LAYER_ID;
60*38e8c45fSAndroid Build Coastguard Worker }
61*38e8c45fSAndroid Build Coastguard Worker 
62*38e8c45fSAndroid Build Coastguard Worker } // namespace android::surfaceflinger
63