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