1*ec779b8eSAndroid Build Coastguard Worker /** 2*ec779b8eSAndroid Build Coastguard Worker * 3*ec779b8eSAndroid Build Coastguard Worker * Copyright 2020, The Android Open Source Project 4*ec779b8eSAndroid Build Coastguard Worker * 5*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 8*ec779b8eSAndroid Build Coastguard Worker * 9*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*ec779b8eSAndroid Build Coastguard Worker * 11*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 16*ec779b8eSAndroid Build Coastguard Worker */ 17*ec779b8eSAndroid Build Coastguard Worker 18*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_MEDIA_RESOURCE_OBSERVER_SERVICE_H 19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIA_RESOURCE_OBSERVER_SERVICE_H 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker #include <map> 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/BnResourceObserverService.h> 24*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerService.h" 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker namespace android { 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker using Status = ::ndk::ScopedAStatus; 29*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::BnResourceObserverService; 30*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::IResourceObserver; 31*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaObservableFilter; 32*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaObservableParcel; 33*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaObservableType; 34*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaObservableEvent; 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker class ResourceObserverService : public BnResourceObserverService { 37*ec779b8eSAndroid Build Coastguard Worker public: 38*ec779b8eSAndroid Build Coastguard Worker getServiceName()39*ec779b8eSAndroid Build Coastguard Worker static char const *getServiceName() { return "media.resource_observer"; } 40*ec779b8eSAndroid Build Coastguard Worker static std::shared_ptr<ResourceObserverService> instantiate(); 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker virtual inline binder_status_t dump( 43*ec779b8eSAndroid Build Coastguard Worker int /*fd*/, const char** /*args*/, uint32_t /*numArgs*/); 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker ResourceObserverService(); ~ResourceObserverService()46*ec779b8eSAndroid Build Coastguard Worker virtual ~ResourceObserverService() {} 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker // IResourceObserverService interface 49*ec779b8eSAndroid Build Coastguard Worker Status registerObserver(const std::shared_ptr<IResourceObserver>& in_observer, 50*ec779b8eSAndroid Build Coastguard Worker const std::vector<MediaObservableFilter>& in_filters) override; 51*ec779b8eSAndroid Build Coastguard Worker 52*ec779b8eSAndroid Build Coastguard Worker Status unregisterObserver(const std::shared_ptr<IResourceObserver>& in_observer) override; 53*ec779b8eSAndroid Build Coastguard Worker // ~IResourceObserverService interface 54*ec779b8eSAndroid Build Coastguard Worker 55*ec779b8eSAndroid Build Coastguard Worker // Called by ResourceManagerService when resources are added. 56*ec779b8eSAndroid Build Coastguard Worker void onResourceAdded(int uid, int pid, const ResourceList &resources); 57*ec779b8eSAndroid Build Coastguard Worker 58*ec779b8eSAndroid Build Coastguard Worker // Called by ResourceManagerService when resources are removed. 59*ec779b8eSAndroid Build Coastguard Worker void onResourceRemoved(int uid, int pid, const ResourceList &resources); 60*ec779b8eSAndroid Build Coastguard Worker 61*ec779b8eSAndroid Build Coastguard Worker private: 62*ec779b8eSAndroid Build Coastguard Worker struct ObserverInfo { 63*ec779b8eSAndroid Build Coastguard Worker ::ndk::SpAIBinder binder; 64*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<IResourceObserver> observer; 65*ec779b8eSAndroid Build Coastguard Worker std::vector<MediaObservableFilter> filters; 66*ec779b8eSAndroid Build Coastguard Worker }; 67*ec779b8eSAndroid Build Coastguard Worker struct DeathRecipient; 68*ec779b8eSAndroid Build Coastguard Worker 69*ec779b8eSAndroid Build Coastguard Worker // Below maps are all keyed on the observer's binder ptr value. 70*ec779b8eSAndroid Build Coastguard Worker using ObserverInfoMap = std::map<uintptr_t, ObserverInfo>; 71*ec779b8eSAndroid Build Coastguard Worker using SubscriberMap = std::map<uintptr_t, std::shared_ptr<IResourceObserver>>; 72*ec779b8eSAndroid Build Coastguard Worker 73*ec779b8eSAndroid Build Coastguard Worker std::mutex mObserverLock; 74*ec779b8eSAndroid Build Coastguard Worker // Binder->ObserverInfo 75*ec779b8eSAndroid Build Coastguard Worker ObserverInfoMap mObserverInfoMap GUARDED_BY(mObserverLock); 76*ec779b8eSAndroid Build Coastguard Worker // Observable(<type,event>)->Subscribers 77*ec779b8eSAndroid Build Coastguard Worker std::map<MediaObservableFilter, SubscriberMap> mObservableToSubscribersMap 78*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mObserverLock); 79*ec779b8eSAndroid Build Coastguard Worker 80*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient; 81*ec779b8eSAndroid Build Coastguard Worker 82*ec779b8eSAndroid Build Coastguard Worker // Binder death handling. 83*ec779b8eSAndroid Build Coastguard Worker static std::mutex sDeathRecipientLock; 84*ec779b8eSAndroid Build Coastguard Worker static std::map<uintptr_t, std::shared_ptr<DeathRecipient>> sDeathRecipientMap 85*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(sDeathRecipientLock); 86*ec779b8eSAndroid Build Coastguard Worker static void BinderDiedCallback(void* cookie); 87*ec779b8eSAndroid Build Coastguard Worker 88*ec779b8eSAndroid Build Coastguard Worker void notifyObservers(MediaObservableEvent event, 89*ec779b8eSAndroid Build Coastguard Worker int uid, int pid, const ResourceList &resources); 90*ec779b8eSAndroid Build Coastguard Worker }; 91*ec779b8eSAndroid Build Coastguard Worker 92*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------- 93*ec779b8eSAndroid Build Coastguard Worker } // namespace android 94*ec779b8eSAndroid Build Coastguard Worker 95*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_MEDIA_RESOURCE_OBSERVER_SERVICE_H 96