1*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "CaptureStateNotifier" 2*ec779b8eSAndroid Build Coastguard Worker 3*ec779b8eSAndroid Build Coastguard Worker #include "CaptureStateNotifier.h" 4*ec779b8eSAndroid Build Coastguard Worker 5*ec779b8eSAndroid Build Coastguard Worker #include <android/media/ICaptureStateListener.h> 6*ec779b8eSAndroid Build Coastguard Worker #include <binder/IBinder.h> 7*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h> 8*ec779b8eSAndroid Build Coastguard Worker 9*ec779b8eSAndroid Build Coastguard Worker namespace android { 10*ec779b8eSAndroid Build Coastguard Worker 11*ec779b8eSAndroid Build Coastguard Worker using media::ICaptureStateListener; 12*ec779b8eSAndroid Build Coastguard Worker 13*ec779b8eSAndroid Build Coastguard Worker class CaptureStateNotifier::DeathRecipient : public IBinder::DeathRecipient { 14*ec779b8eSAndroid Build Coastguard Worker public: DeathRecipient(CaptureStateNotifier * notifier)15*ec779b8eSAndroid Build Coastguard Worker DeathRecipient(CaptureStateNotifier* notifier) : mNotifier(notifier) {} 16*ec779b8eSAndroid Build Coastguard Worker binderDied(const wp<IBinder> &)17*ec779b8eSAndroid Build Coastguard Worker void binderDied(const wp<IBinder>&) override { 18*ec779b8eSAndroid Build Coastguard Worker mNotifier->binderDied(); 19*ec779b8eSAndroid Build Coastguard Worker } 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker private: 22*ec779b8eSAndroid Build Coastguard Worker CaptureStateNotifier* const mNotifier; 23*ec779b8eSAndroid Build Coastguard Worker }; 24*ec779b8eSAndroid Build Coastguard Worker CaptureStateNotifier(bool initialActive)25*ec779b8eSAndroid Build Coastguard WorkerCaptureStateNotifier::CaptureStateNotifier(bool initialActive) 26*ec779b8eSAndroid Build Coastguard Worker : mDeathRecipient(new DeathRecipient(this)), mActive( 27*ec779b8eSAndroid Build Coastguard Worker initialActive) {} 28*ec779b8eSAndroid Build Coastguard Worker ~CaptureStateNotifier()29*ec779b8eSAndroid Build Coastguard WorkerCaptureStateNotifier::~CaptureStateNotifier() { 30*ec779b8eSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(mListener != nullptr); 31*ec779b8eSAndroid Build Coastguard Worker } 32*ec779b8eSAndroid Build Coastguard Worker RegisterListener(const sp<ICaptureStateListener> & listener)33*ec779b8eSAndroid Build Coastguard Workerbool CaptureStateNotifier::RegisterListener(const sp<ICaptureStateListener>& listener) { 34*ec779b8eSAndroid Build Coastguard Worker std::lock_guard<std::mutex> _l(mMutex); 35*ec779b8eSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(mListener != nullptr); 36*ec779b8eSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(listener == nullptr); 37*ec779b8eSAndroid Build Coastguard Worker 38*ec779b8eSAndroid Build Coastguard Worker ALOGI("Registering a listener"); 39*ec779b8eSAndroid Build Coastguard Worker sp<IBinder> binder = IInterface::asBinder(listener); 40*ec779b8eSAndroid Build Coastguard Worker if (binder != nullptr) { 41*ec779b8eSAndroid Build Coastguard Worker status_t status = binder->linkToDeath(mDeathRecipient); 42*ec779b8eSAndroid Build Coastguard Worker if (status == NO_ERROR) { 43*ec779b8eSAndroid Build Coastguard Worker mListener = listener; 44*ec779b8eSAndroid Build Coastguard Worker } else { 45*ec779b8eSAndroid Build Coastguard Worker ALOGE("Failed to register death listener: %u", status); 46*ec779b8eSAndroid Build Coastguard Worker } 47*ec779b8eSAndroid Build Coastguard Worker } else { 48*ec779b8eSAndroid Build Coastguard Worker ALOGE("Listener failed to cast to a binder."); 49*ec779b8eSAndroid Build Coastguard Worker } 50*ec779b8eSAndroid Build Coastguard Worker return mActive; 51*ec779b8eSAndroid Build Coastguard Worker } 52*ec779b8eSAndroid Build Coastguard Worker setCaptureState(bool active)53*ec779b8eSAndroid Build Coastguard Workervoid CaptureStateNotifier::setCaptureState(bool active) { 54*ec779b8eSAndroid Build Coastguard Worker std::lock_guard<std::mutex> _l(mMutex); 55*ec779b8eSAndroid Build Coastguard Worker mActive = active; 56*ec779b8eSAndroid Build Coastguard Worker if (mListener) { 57*ec779b8eSAndroid Build Coastguard Worker mListener->setCaptureState(active); 58*ec779b8eSAndroid Build Coastguard Worker } 59*ec779b8eSAndroid Build Coastguard Worker } 60*ec779b8eSAndroid Build Coastguard Worker binderDied()61*ec779b8eSAndroid Build Coastguard Workervoid CaptureStateNotifier::binderDied() { 62*ec779b8eSAndroid Build Coastguard Worker std::lock_guard<std::mutex> _l(mMutex); 63*ec779b8eSAndroid Build Coastguard Worker mListener.clear(); 64*ec779b8eSAndroid Build Coastguard Worker ALOGI("Listener binder died"); 65*ec779b8eSAndroid Build Coastguard Worker } 66*ec779b8eSAndroid Build Coastguard Worker 67*ec779b8eSAndroid Build Coastguard Worker } // namespace android