Loading libs/gui/ISurfaceComposer.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -824,6 +824,36 @@ public: return error; } virtual status_t addTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) { Parcel data, reply; SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor()); SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener)); const status_t error = remote()->transact(BnSurfaceComposer::ADD_TUNNEL_MODE_ENABLED_LISTENER, data, &reply); if (error != NO_ERROR) { ALOGE("addTunnelModeEnabledListener: Failed to transact"); } return error; } virtual status_t removeTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) { Parcel data, reply; SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor()); SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener)); const status_t error = remote()->transact(BnSurfaceComposer::REMOVE_TUNNEL_MODE_ENABLED_LISTENER, data, &reply); if (error != NO_ERROR) { ALOGE("removeTunnelModeEnabledListener: Failed to transact"); } return error; } status_t setDesiredDisplayModeSpecs(const sp<IBinder>& displayToken, ui::DisplayModeId defaultMode, bool allowGroupSwitching, float primaryRefreshRateMin, float primaryRefreshRateMax, Loading Loading @@ -1740,6 +1770,26 @@ status_t BnSurfaceComposer::onTransact( } return removeFpsListener(listener); } case ADD_TUNNEL_MODE_ENABLED_LISTENER: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<gui::ITunnelModeEnabledListener> listener; status_t result = data.readNullableStrongBinder(&listener); if (result != NO_ERROR) { ALOGE("addTunnelModeEnabledListener: Failed to read listener"); return result; } return addTunnelModeEnabledListener(listener); } case REMOVE_TUNNEL_MODE_ENABLED_LISTENER: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<gui::ITunnelModeEnabledListener> listener; status_t result = data.readNullableStrongBinder(&listener); if (result != NO_ERROR) { ALOGE("removeTunnelModeEnabledListener: Failed to read listener"); return result; } return removeTunnelModeEnabledListener(listener); } case SET_DESIRED_DISPLAY_MODE_SPECS: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<IBinder> displayToken = data.readStrongBinder(); Loading libs/gui/Surface.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -1268,8 +1268,11 @@ int Surface::query(int what, int* value) const { if (err == NO_ERROR) { return NO_ERROR; } if (composerService()->authenticateSurfaceTexture( mGraphicBufferProducer)) { sp<ISurfaceComposer> surfaceComposer = composerService(); if (surfaceComposer == nullptr) { return -EPERM; // likely permissions error } if (surfaceComposer->authenticateSurfaceTexture(mGraphicBufferProducer)) { *value = 1; } else { *value = 0; Loading libs/gui/SurfaceComposerClient.cpp +18 −7 Original line number Diff line number Diff line Loading @@ -65,12 +65,12 @@ ComposerService::ComposerService() connectLocked(); } void ComposerService::connectLocked() { bool ComposerService::connectLocked() { const String16 name("SurfaceFlinger"); while (getService(name, &mComposerService) != NO_ERROR) { usleep(250000); mComposerService = waitForService<ISurfaceComposer>(name); if (mComposerService == nullptr) { return false; // fatal error or permission problem } assert(mComposerService != nullptr); // Create the death listener. class DeathObserver : public IBinder::DeathRecipient { Loading @@ -86,16 +86,17 @@ void ComposerService::connectLocked() { mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver); return true; } /*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { ComposerService& instance = ComposerService::getInstance(); Mutex::Autolock _l(instance.mLock); if (instance.mComposerService == nullptr) { ComposerService::getInstance().connectLocked(); assert(instance.mComposerService != nullptr); if (ComposerService::getInstance().connectLocked()) { ALOGD("ComposerService reconnected"); } } return instance.mComposerService; } Loading Loading @@ -2077,6 +2078,16 @@ status_t SurfaceComposerClient::removeFpsListener(const sp<gui::IFpsListener>& l return ComposerService::getComposerService()->removeFpsListener(listener); } status_t SurfaceComposerClient::addTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) { return ComposerService::getComposerService()->addTunnelModeEnabledListener(listener); } status_t SurfaceComposerClient::removeTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) { return ComposerService::getComposerService()->removeTunnelModeEnabledListener(listener); } bool SurfaceComposerClient::getDisplayBrightnessSupport(const sp<IBinder>& displayToken) { bool support = false; ComposerService::getComposerService()->getDisplayBrightnessSupport(displayToken, &support); Loading libs/gui/aidl/android/gui/ITunnelModeEnabledListener.aidl 0 → 100644 +29 −0 Original line number Diff line number Diff line /* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.gui; /** @hide */ oneway interface ITunnelModeEnabledListener { /** * Called when tunnel mode status has changed. Tunnel mode is: * - enabled when there is a sideband stream attached to one of the layers in * surface flinger * - disabled when there is no layer with a sideband stream */ void onTunnelModeEnabledChanged(boolean enabled); } libs/gui/include/gui/ISurfaceComposer.h +18 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <android/gui/IHdrLayerInfoListener.h> #include <android/gui/IScreenCaptureListener.h> #include <android/gui/ITransactionTraceListener.h> #include <android/gui/ITunnelModeEnabledListener.h> #include <binder/IBinder.h> #include <binder/IInterface.h> #include <gui/FrameTimelineInfo.h> Loading Loading @@ -377,6 +378,21 @@ public: */ virtual status_t removeFpsListener(const sp<gui::IFpsListener>& listener) = 0; /* Registers a listener to receive tunnel mode enabled updates from SurfaceFlinger. * * Requires ACCESS_SURFACE_FLINGER permission. */ virtual status_t addTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) = 0; /* * Removes a listener that was receiving tunnel mode enabled updates from SurfaceFlinger. * * Requires ACCESS_SURFACE_FLINGER permission. */ virtual status_t removeTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) = 0; /* Sets the refresh rate boundaries for the display. * * The primary refresh rate range represents display manager's general guidance on the display Loading Loading @@ -607,6 +623,8 @@ public: ADD_HDR_LAYER_INFO_LISTENER, REMOVE_HDR_LAYER_INFO_LISTENER, ON_PULL_ATOM, ADD_TUNNEL_MODE_ENABLED_LISTENER, REMOVE_TUNNEL_MODE_ENABLED_LISTENER, // Always append new enum to the end. }; Loading Loading
libs/gui/ISurfaceComposer.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -824,6 +824,36 @@ public: return error; } virtual status_t addTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) { Parcel data, reply; SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor()); SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener)); const status_t error = remote()->transact(BnSurfaceComposer::ADD_TUNNEL_MODE_ENABLED_LISTENER, data, &reply); if (error != NO_ERROR) { ALOGE("addTunnelModeEnabledListener: Failed to transact"); } return error; } virtual status_t removeTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) { Parcel data, reply; SAFE_PARCEL(data.writeInterfaceToken, ISurfaceComposer::getInterfaceDescriptor()); SAFE_PARCEL(data.writeStrongBinder, IInterface::asBinder(listener)); const status_t error = remote()->transact(BnSurfaceComposer::REMOVE_TUNNEL_MODE_ENABLED_LISTENER, data, &reply); if (error != NO_ERROR) { ALOGE("removeTunnelModeEnabledListener: Failed to transact"); } return error; } status_t setDesiredDisplayModeSpecs(const sp<IBinder>& displayToken, ui::DisplayModeId defaultMode, bool allowGroupSwitching, float primaryRefreshRateMin, float primaryRefreshRateMax, Loading Loading @@ -1740,6 +1770,26 @@ status_t BnSurfaceComposer::onTransact( } return removeFpsListener(listener); } case ADD_TUNNEL_MODE_ENABLED_LISTENER: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<gui::ITunnelModeEnabledListener> listener; status_t result = data.readNullableStrongBinder(&listener); if (result != NO_ERROR) { ALOGE("addTunnelModeEnabledListener: Failed to read listener"); return result; } return addTunnelModeEnabledListener(listener); } case REMOVE_TUNNEL_MODE_ENABLED_LISTENER: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<gui::ITunnelModeEnabledListener> listener; status_t result = data.readNullableStrongBinder(&listener); if (result != NO_ERROR) { ALOGE("removeTunnelModeEnabledListener: Failed to read listener"); return result; } return removeTunnelModeEnabledListener(listener); } case SET_DESIRED_DISPLAY_MODE_SPECS: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<IBinder> displayToken = data.readStrongBinder(); Loading
libs/gui/Surface.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -1268,8 +1268,11 @@ int Surface::query(int what, int* value) const { if (err == NO_ERROR) { return NO_ERROR; } if (composerService()->authenticateSurfaceTexture( mGraphicBufferProducer)) { sp<ISurfaceComposer> surfaceComposer = composerService(); if (surfaceComposer == nullptr) { return -EPERM; // likely permissions error } if (surfaceComposer->authenticateSurfaceTexture(mGraphicBufferProducer)) { *value = 1; } else { *value = 0; Loading
libs/gui/SurfaceComposerClient.cpp +18 −7 Original line number Diff line number Diff line Loading @@ -65,12 +65,12 @@ ComposerService::ComposerService() connectLocked(); } void ComposerService::connectLocked() { bool ComposerService::connectLocked() { const String16 name("SurfaceFlinger"); while (getService(name, &mComposerService) != NO_ERROR) { usleep(250000); mComposerService = waitForService<ISurfaceComposer>(name); if (mComposerService == nullptr) { return false; // fatal error or permission problem } assert(mComposerService != nullptr); // Create the death listener. class DeathObserver : public IBinder::DeathRecipient { Loading @@ -86,16 +86,17 @@ void ComposerService::connectLocked() { mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver); return true; } /*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { ComposerService& instance = ComposerService::getInstance(); Mutex::Autolock _l(instance.mLock); if (instance.mComposerService == nullptr) { ComposerService::getInstance().connectLocked(); assert(instance.mComposerService != nullptr); if (ComposerService::getInstance().connectLocked()) { ALOGD("ComposerService reconnected"); } } return instance.mComposerService; } Loading Loading @@ -2077,6 +2078,16 @@ status_t SurfaceComposerClient::removeFpsListener(const sp<gui::IFpsListener>& l return ComposerService::getComposerService()->removeFpsListener(listener); } status_t SurfaceComposerClient::addTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) { return ComposerService::getComposerService()->addTunnelModeEnabledListener(listener); } status_t SurfaceComposerClient::removeTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) { return ComposerService::getComposerService()->removeTunnelModeEnabledListener(listener); } bool SurfaceComposerClient::getDisplayBrightnessSupport(const sp<IBinder>& displayToken) { bool support = false; ComposerService::getComposerService()->getDisplayBrightnessSupport(displayToken, &support); Loading
libs/gui/aidl/android/gui/ITunnelModeEnabledListener.aidl 0 → 100644 +29 −0 Original line number Diff line number Diff line /* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.gui; /** @hide */ oneway interface ITunnelModeEnabledListener { /** * Called when tunnel mode status has changed. Tunnel mode is: * - enabled when there is a sideband stream attached to one of the layers in * surface flinger * - disabled when there is no layer with a sideband stream */ void onTunnelModeEnabledChanged(boolean enabled); }
libs/gui/include/gui/ISurfaceComposer.h +18 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <android/gui/IHdrLayerInfoListener.h> #include <android/gui/IScreenCaptureListener.h> #include <android/gui/ITransactionTraceListener.h> #include <android/gui/ITunnelModeEnabledListener.h> #include <binder/IBinder.h> #include <binder/IInterface.h> #include <gui/FrameTimelineInfo.h> Loading Loading @@ -377,6 +378,21 @@ public: */ virtual status_t removeFpsListener(const sp<gui::IFpsListener>& listener) = 0; /* Registers a listener to receive tunnel mode enabled updates from SurfaceFlinger. * * Requires ACCESS_SURFACE_FLINGER permission. */ virtual status_t addTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) = 0; /* * Removes a listener that was receiving tunnel mode enabled updates from SurfaceFlinger. * * Requires ACCESS_SURFACE_FLINGER permission. */ virtual status_t removeTunnelModeEnabledListener( const sp<gui::ITunnelModeEnabledListener>& listener) = 0; /* Sets the refresh rate boundaries for the display. * * The primary refresh rate range represents display manager's general guidance on the display Loading Loading @@ -607,6 +623,8 @@ public: ADD_HDR_LAYER_INFO_LISTENER, REMOVE_HDR_LAYER_INFO_LISTENER, ON_PULL_ATOM, ADD_TUNNEL_MODE_ENABLED_LISTENER, REMOVE_TUNNEL_MODE_ENABLED_LISTENER, // Always append new enum to the end. }; Loading