/* * 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. */ #undef LOG_TAG #define LOG_TAG "TunnelModeEnabledReporter" #define ATRACE_TAG ATRACE_TAG_GRAPHICS #include #include "Layer.h" #include "SurfaceFlinger.h" #include "TunnelModeEnabledReporter.h" namespace android { TunnelModeEnabledReporter::TunnelModeEnabledReporter() {} void TunnelModeEnabledReporter::updateTunnelModeStatus() { bool tunnelModeEnabled = mTunnelModeCount > 0; dispatchTunnelModeEnabled(tunnelModeEnabled); } void TunnelModeEnabledReporter::dispatchTunnelModeEnabled(bool tunnelModeEnabled) { std::vector> localListeners; { std::scoped_lock lock(mMutex); if (mTunnelModeEnabled == tunnelModeEnabled) { return; } mTunnelModeEnabled = tunnelModeEnabled; std::transform(mListeners.begin(), mListeners.end(), std::back_inserter(localListeners), [](const std::pair, sp>& entry) { return entry.second; }); } for (sp& listener : localListeners) { listener->onTunnelModeEnabledChanged(tunnelModeEnabled); } } void TunnelModeEnabledReporter::binderDied(const wp& who) { std::scoped_lock lock(mMutex); mListeners.erase(who); } void TunnelModeEnabledReporter::addListener(const sp& listener) { sp asBinder = IInterface::asBinder(listener); asBinder->linkToDeath(this); bool tunnelModeEnabled = false; { std::scoped_lock lock(mMutex); mListeners.emplace(wp(asBinder), listener); tunnelModeEnabled = mTunnelModeEnabled; } listener->onTunnelModeEnabledChanged(tunnelModeEnabled); } void TunnelModeEnabledReporter::removeListener( const sp& listener) { std::lock_guard lock(mMutex); mListeners.erase(wp(IInterface::asBinder(listener))); } } // namespace android