1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker ** 3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2015, 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_RESOURCEMANAGERSERVICE_H 19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIA_RESOURCEMANAGERSERVICE_H 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker #include <map> 22*ec779b8eSAndroid Build Coastguard Worker #include <set> 23*ec779b8eSAndroid Build Coastguard Worker #include <mutex> 24*ec779b8eSAndroid Build Coastguard Worker #include <string> 25*ec779b8eSAndroid Build Coastguard Worker #include <vector> 26*ec779b8eSAndroid Build Coastguard Worker 27*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/BnResourceManagerService.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaResource.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h> 30*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h> 31*ec779b8eSAndroid Build Coastguard Worker #include <utils/threads.h> 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerServiceUtils.h" 34*ec779b8eSAndroid Build Coastguard Worker 35*ec779b8eSAndroid Build Coastguard Worker namespace android { 36*ec779b8eSAndroid Build Coastguard Worker 37*ec779b8eSAndroid Build Coastguard Worker class ResourceObserverService; 38*ec779b8eSAndroid Build Coastguard Worker class ServiceLog; 39*ec779b8eSAndroid Build Coastguard Worker struct ProcessInfoInterface; 40*ec779b8eSAndroid Build Coastguard Worker class ResourceManagerMetrics; 41*ec779b8eSAndroid Build Coastguard Worker 42*ec779b8eSAndroid Build Coastguard Worker using Status = ::ndk::ScopedAStatus; 43*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::IResourceManagerClient; 44*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::BnResourceManagerService; 45*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaResourceParcel; 46*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::MediaResourcePolicyParcel; 47*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::ClientInfoParcel; 48*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::ClientConfigParcel; 49*ec779b8eSAndroid Build Coastguard Worker 50*ec779b8eSAndroid Build Coastguard Worker class ResourceManagerService : public BnResourceManagerService { 51*ec779b8eSAndroid Build Coastguard Worker public: 52*ec779b8eSAndroid Build Coastguard Worker struct SystemCallbackInterface : public RefBase { 53*ec779b8eSAndroid Build Coastguard Worker virtual void noteStartVideo(int uid) = 0; 54*ec779b8eSAndroid Build Coastguard Worker virtual void noteStopVideo(int uid) = 0; 55*ec779b8eSAndroid Build Coastguard Worker virtual void noteResetVideo() = 0; 56*ec779b8eSAndroid Build Coastguard Worker virtual bool requestCpusetBoost(bool enable) = 0; 57*ec779b8eSAndroid Build Coastguard Worker }; 58*ec779b8eSAndroid Build Coastguard Worker getServiceName()59*ec779b8eSAndroid Build Coastguard Worker static char const *getServiceName() { return "media.resource_manager"; } 60*ec779b8eSAndroid Build Coastguard Worker static void instantiate(); 61*ec779b8eSAndroid Build Coastguard Worker 62*ec779b8eSAndroid Build Coastguard Worker // Static creation methods. 63*ec779b8eSAndroid Build Coastguard Worker static std::shared_ptr<ResourceManagerService> Create(); 64*ec779b8eSAndroid Build Coastguard Worker static std::shared_ptr<ResourceManagerService> Create( 65*ec779b8eSAndroid Build Coastguard Worker const sp<ProcessInfoInterface>& processInfo, 66*ec779b8eSAndroid Build Coastguard Worker const sp<SystemCallbackInterface>& systemResource); 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker virtual binder_status_t dump( 69*ec779b8eSAndroid Build Coastguard Worker int /*fd*/, const char** /*args*/, uint32_t /*numArgs*/); 70*ec779b8eSAndroid Build Coastguard Worker 71*ec779b8eSAndroid Build Coastguard Worker ResourceManagerService(); 72*ec779b8eSAndroid Build Coastguard Worker explicit ResourceManagerService(const sp<ProcessInfoInterface> &processInfo, 73*ec779b8eSAndroid Build Coastguard Worker const sp<SystemCallbackInterface> &systemResource); 74*ec779b8eSAndroid Build Coastguard Worker virtual ~ResourceManagerService(); 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker virtual void setObserverService( 77*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<ResourceObserverService>& observerService); 78*ec779b8eSAndroid Build Coastguard Worker 79*ec779b8eSAndroid Build Coastguard Worker // IResourceManagerService interface 80*ec779b8eSAndroid Build Coastguard Worker Status config(const std::vector<MediaResourcePolicyParcel>& policies) override; 81*ec779b8eSAndroid Build Coastguard Worker 82*ec779b8eSAndroid Build Coastguard Worker Status addResource(const ClientInfoParcel& clientInfo, 83*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<IResourceManagerClient>& client, 84*ec779b8eSAndroid Build Coastguard Worker const std::vector<MediaResourceParcel>& resources) override; 85*ec779b8eSAndroid Build Coastguard Worker 86*ec779b8eSAndroid Build Coastguard Worker Status removeResource(const ClientInfoParcel& clientInfo, 87*ec779b8eSAndroid Build Coastguard Worker const std::vector<MediaResourceParcel>& resources) override; 88*ec779b8eSAndroid Build Coastguard Worker 89*ec779b8eSAndroid Build Coastguard Worker Status removeClient(const ClientInfoParcel& clientInfo) override; 90*ec779b8eSAndroid Build Coastguard Worker 91*ec779b8eSAndroid Build Coastguard Worker // Tries to reclaim resource from processes with lower priority than the calling process 92*ec779b8eSAndroid Build Coastguard Worker // according to the requested resources. 93*ec779b8eSAndroid Build Coastguard Worker // Returns true if any resource has been reclaimed, otherwise returns false. 94*ec779b8eSAndroid Build Coastguard Worker Status reclaimResource(const ClientInfoParcel& clientInfo, 95*ec779b8eSAndroid Build Coastguard Worker const std::vector<MediaResourceParcel>& resources, 96*ec779b8eSAndroid Build Coastguard Worker bool* _aidl_return) override; 97*ec779b8eSAndroid Build Coastguard Worker 98*ec779b8eSAndroid Build Coastguard Worker Status overridePid(int32_t originalPid, int32_t newPid) override; 99*ec779b8eSAndroid Build Coastguard Worker 100*ec779b8eSAndroid Build Coastguard Worker Status overrideProcessInfo(const std::shared_ptr<IResourceManagerClient>& client, 101*ec779b8eSAndroid Build Coastguard Worker int32_t pid, int32_t procState, int32_t oomScore) override; 102*ec779b8eSAndroid Build Coastguard Worker 103*ec779b8eSAndroid Build Coastguard Worker Status markClientForPendingRemoval(const ClientInfoParcel& clientInfo) override; 104*ec779b8eSAndroid Build Coastguard Worker 105*ec779b8eSAndroid Build Coastguard Worker Status reclaimResourcesFromClientsPendingRemoval(int32_t pid) override; 106*ec779b8eSAndroid Build Coastguard Worker 107*ec779b8eSAndroid Build Coastguard Worker Status notifyClientCreated(const ClientInfoParcel& clientInfo) override; 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker Status notifyClientStarted(const ClientConfigParcel& clientConfig) override; 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker Status notifyClientStopped(const ClientConfigParcel& clientConfig) override; 112*ec779b8eSAndroid Build Coastguard Worker 113*ec779b8eSAndroid Build Coastguard Worker Status notifyClientConfigChanged(const ClientConfigParcel& clientConfig) override; 114*ec779b8eSAndroid Build Coastguard Worker 115*ec779b8eSAndroid Build Coastguard Worker protected: 116*ec779b8eSAndroid Build Coastguard Worker // To get notifications when a resource is added for the first time. 117*ec779b8eSAndroid Build Coastguard Worker void onFirstAdded(const MediaResourceParcel& res, uid_t uid); 118*ec779b8eSAndroid Build Coastguard Worker // To get notifications when a resource has been removed at last. 119*ec779b8eSAndroid Build Coastguard Worker void onLastRemoved(const MediaResourceParcel& res, uid_t uid); 120*ec779b8eSAndroid Build Coastguard Worker 121*ec779b8eSAndroid Build Coastguard Worker // Reclaims resources from |clients|. Returns true if reclaim succeeded 122*ec779b8eSAndroid Build Coastguard Worker // for all clients. 123*ec779b8eSAndroid Build Coastguard Worker bool reclaimUnconditionallyFrom(const std::vector<ClientInfo>& targetClients); 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker // A helper function that returns true if the callingPid has higher priority than pid. 126*ec779b8eSAndroid Build Coastguard Worker // Returns false otherwise. 127*ec779b8eSAndroid Build Coastguard Worker bool isCallingPriorityHigher_l(int callingPid, int pid); 128*ec779b8eSAndroid Build Coastguard Worker 129*ec779b8eSAndroid Build Coastguard Worker // To notify the metrics about client being released. 130*ec779b8eSAndroid Build Coastguard Worker void notifyClientReleased(const ClientInfoParcel& clientInfo); 131*ec779b8eSAndroid Build Coastguard Worker 132*ec779b8eSAndroid Build Coastguard Worker virtual Status removeResource(const ClientInfoParcel& clientInfo, bool checkValid); 133*ec779b8eSAndroid Build Coastguard Worker 134*ec779b8eSAndroid Build Coastguard Worker private: 135*ec779b8eSAndroid Build Coastguard Worker friend class ResourceManagerServiceTest; 136*ec779b8eSAndroid Build Coastguard Worker friend class ResourceManagerServiceTestBase; 137*ec779b8eSAndroid Build Coastguard Worker friend class DeathNotifier; 138*ec779b8eSAndroid Build Coastguard Worker friend class OverrideProcessInfoDeathNotifier; 139*ec779b8eSAndroid Build Coastguard Worker 140*ec779b8eSAndroid Build Coastguard Worker // Gets the client who owns biggest piece of specified resource type from pid. 141*ec779b8eSAndroid Build Coastguard Worker // Returns false with no change to client if there are no clients holding resources of this 142*ec779b8eSAndroid Build Coastguard Worker // type. 143*ec779b8eSAndroid Build Coastguard Worker bool getBiggestClient_l(int pid, MediaResource::Type type, 144*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType, 145*ec779b8eSAndroid Build Coastguard Worker ClientInfo& clientsInfo, 146*ec779b8eSAndroid Build Coastguard Worker bool pendingRemovalOnly = false); 147*ec779b8eSAndroid Build Coastguard Worker 148*ec779b8eSAndroid Build Coastguard Worker // A helper function that gets the biggest clients of the process pid that 149*ec779b8eSAndroid Build Coastguard Worker // is marked to be (pending) removed and has the needed resources. 150*ec779b8eSAndroid Build Coastguard Worker bool getBiggestClientPendingRemoval_l(int pid, MediaResource::Type type, 151*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType, 152*ec779b8eSAndroid Build Coastguard Worker ClientInfo& clientsInfo); 153*ec779b8eSAndroid Build Coastguard Worker 154*ec779b8eSAndroid Build Coastguard Worker // From the list of clients, pick/select client(s) based on the reclaim policy. 155*ec779b8eSAndroid Build Coastguard Worker void getClientForResource_l(const ResourceRequestInfo& resourceRequestInfo, 156*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo>& clientsInfo); 157*ec779b8eSAndroid Build Coastguard Worker // A helper function that pushes Reclaim Atom (for metric collection). 158*ec779b8eSAndroid Build Coastguard Worker void pushReclaimAtom(const ClientInfoParcel& clientInfo, 159*ec779b8eSAndroid Build Coastguard Worker const std::vector<ClientInfo>& targetClients, 160*ec779b8eSAndroid Build Coastguard Worker bool reclaimed); 161*ec779b8eSAndroid Build Coastguard Worker 162*ec779b8eSAndroid Build Coastguard Worker // Remove the override info for the given process 163*ec779b8eSAndroid Build Coastguard Worker void removeProcessInfoOverride_l(int pid); 164*ec779b8eSAndroid Build Coastguard Worker 165*ec779b8eSAndroid Build Coastguard Worker // Eventually we want to phase out this implementation of IResourceManagerService 166*ec779b8eSAndroid Build Coastguard Worker // (ResourceManagerService) and replace that with the newer implementation 167*ec779b8eSAndroid Build Coastguard Worker // (ResourceManagerServiceNew). 168*ec779b8eSAndroid Build Coastguard Worker // So, marking the following methods as private virtual and for the newer implementation 169*ec779b8eSAndroid Build Coastguard Worker // to override is the easiest way to maintain both implementation. 170*ec779b8eSAndroid Build Coastguard Worker 171*ec779b8eSAndroid Build Coastguard Worker // Initializes the internal state of the ResourceManagerService 172*ec779b8eSAndroid Build Coastguard Worker virtual void init(); 173*ec779b8eSAndroid Build Coastguard Worker 174*ec779b8eSAndroid Build Coastguard Worker // Gets the list of all the clients who own the list of specified resource type 175*ec779b8eSAndroid Build Coastguard Worker // and satisfy the resource model and the reclaim policy. 176*ec779b8eSAndroid Build Coastguard Worker virtual bool getTargetClients( 177*ec779b8eSAndroid Build Coastguard Worker const ClientInfoParcel& clientInfo, 178*ec779b8eSAndroid Build Coastguard Worker const std::vector<MediaResourceParcel>& resources, 179*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo>& targetClients); 180*ec779b8eSAndroid Build Coastguard Worker 181*ec779b8eSAndroid Build Coastguard Worker // Gets the list of all the clients who own the specified resource type. 182*ec779b8eSAndroid Build Coastguard Worker // Returns false if any client belongs to a process with higher priority than the 183*ec779b8eSAndroid Build Coastguard Worker // calling process. The clients will remain unchanged if returns false. 184*ec779b8eSAndroid Build Coastguard Worker virtual bool getAllClients_l(const ResourceRequestInfo& resourceRequestInfo, 185*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo>& clientsInfo); 186*ec779b8eSAndroid Build Coastguard Worker 187*ec779b8eSAndroid Build Coastguard Worker // Gets the client who owns specified resource type from lowest possible priority process. 188*ec779b8eSAndroid Build Coastguard Worker // Returns false if the calling process priority is not higher than the lowest process 189*ec779b8eSAndroid Build Coastguard Worker // priority. The client will remain unchanged if returns false. 190*ec779b8eSAndroid Build Coastguard Worker virtual bool getLowestPriorityBiggestClient_l( 191*ec779b8eSAndroid Build Coastguard Worker const ResourceRequestInfo& resourceRequestInfo, 192*ec779b8eSAndroid Build Coastguard Worker ClientInfo& clientInfo); 193*ec779b8eSAndroid Build Coastguard Worker 194*ec779b8eSAndroid Build Coastguard Worker // override the pid of given process 195*ec779b8eSAndroid Build Coastguard Worker virtual bool overridePid_l(int32_t originalPid, int32_t newPid); 196*ec779b8eSAndroid Build Coastguard Worker 197*ec779b8eSAndroid Build Coastguard Worker // override the process info of given process 198*ec779b8eSAndroid Build Coastguard Worker virtual bool overrideProcessInfo_l(const std::shared_ptr<IResourceManagerClient>& client, 199*ec779b8eSAndroid Build Coastguard Worker int pid, int procState, int oomScore); 200*ec779b8eSAndroid Build Coastguard Worker 201*ec779b8eSAndroid Build Coastguard Worker // Get priority from process's pid 202*ec779b8eSAndroid Build Coastguard Worker virtual bool getPriority_l(int pid, int* priority) const; 203*ec779b8eSAndroid Build Coastguard Worker 204*ec779b8eSAndroid Build Coastguard Worker // Gets lowest priority process that has the specified resource type. 205*ec779b8eSAndroid Build Coastguard Worker // Returns false if failed. The output parameters will remain unchanged if failed. 206*ec779b8eSAndroid Build Coastguard Worker virtual bool getLowestPriorityPid_l(MediaResource::Type type, MediaResource::SubType subType, 207*ec779b8eSAndroid Build Coastguard Worker int* lowestPriorityPid, int* lowestPriority); 208*ec779b8eSAndroid Build Coastguard Worker 209*ec779b8eSAndroid Build Coastguard Worker // Removes the pid from the override map. 210*ec779b8eSAndroid Build Coastguard Worker virtual void removeProcessInfoOverride(int pid); 211*ec779b8eSAndroid Build Coastguard Worker 212*ec779b8eSAndroid Build Coastguard Worker // Get the client for given pid and the clientId from the map 213*ec779b8eSAndroid Build Coastguard Worker virtual std::shared_ptr<IResourceManagerClient> getClient_l( 214*ec779b8eSAndroid Build Coastguard Worker int pid, const int64_t& clientId) const; 215*ec779b8eSAndroid Build Coastguard Worker 216*ec779b8eSAndroid Build Coastguard Worker // Remove the client for given pid and the clientId from the map 217*ec779b8eSAndroid Build Coastguard Worker virtual bool removeClient_l(int pid, const int64_t& clientId); 218*ec779b8eSAndroid Build Coastguard Worker 219*ec779b8eSAndroid Build Coastguard Worker // Get all the resource status for dump 220*ec779b8eSAndroid Build Coastguard Worker virtual void getResourceDump(std::string& resourceLog) const; 221*ec779b8eSAndroid Build Coastguard Worker 222*ec779b8eSAndroid Build Coastguard Worker // The following utility functions are used only for testing by ResourceManagerServiceTest 223*ec779b8eSAndroid Build Coastguard Worker // START: TEST only functions 224*ec779b8eSAndroid Build Coastguard Worker // Get the peak concurrent pixel count (associated with the video codecs) for the process. 225*ec779b8eSAndroid Build Coastguard Worker long getPeakConcurrentPixelCount(int pid) const; 226*ec779b8eSAndroid Build Coastguard Worker // Get the current concurrent pixel count (associated with the video codecs) for the process. 227*ec779b8eSAndroid Build Coastguard Worker long getCurrentConcurrentPixelCount(int pid) const; 228*ec779b8eSAndroid Build Coastguard Worker // To create object of type ResourceManagerServiceNew 229*ec779b8eSAndroid Build Coastguard Worker static std::shared_ptr<ResourceManagerService> CreateNew( 230*ec779b8eSAndroid Build Coastguard Worker const sp<ProcessInfoInterface>& processInfo, 231*ec779b8eSAndroid Build Coastguard Worker const sp<SystemCallbackInterface>& systemResource); 232*ec779b8eSAndroid Build Coastguard Worker // Returns a unmodifiable reference to the internal resource state as a map getResourceMap()233*ec779b8eSAndroid Build Coastguard Worker virtual const std::map<int, ResourceInfos>& getResourceMap() const { 234*ec779b8eSAndroid Build Coastguard Worker return mMap; 235*ec779b8eSAndroid Build Coastguard Worker } 236*ec779b8eSAndroid Build Coastguard Worker // enable/disable process priority based reclaim and client importance based reclaim setReclaimPolicy(bool processPriority,bool clientImportance)237*ec779b8eSAndroid Build Coastguard Worker virtual void setReclaimPolicy(bool processPriority, bool clientImportance) { 238*ec779b8eSAndroid Build Coastguard Worker // Implemented by the refactored/new RMService 239*ec779b8eSAndroid Build Coastguard Worker (void)processPriority; 240*ec779b8eSAndroid Build Coastguard Worker (void)clientImportance; 241*ec779b8eSAndroid Build Coastguard Worker } 242*ec779b8eSAndroid Build Coastguard Worker // END: TEST only functions 243*ec779b8eSAndroid Build Coastguard Worker 244*ec779b8eSAndroid Build Coastguard Worker protected: 245*ec779b8eSAndroid Build Coastguard Worker mutable std::mutex mLock; 246*ec779b8eSAndroid Build Coastguard Worker sp<ProcessInfoInterface> mProcessInfo; 247*ec779b8eSAndroid Build Coastguard Worker sp<SystemCallbackInterface> mSystemCB; 248*ec779b8eSAndroid Build Coastguard Worker sp<ServiceLog> mServiceLog; 249*ec779b8eSAndroid Build Coastguard Worker bool mSupportsMultipleSecureCodecs; 250*ec779b8eSAndroid Build Coastguard Worker bool mSupportsSecureWithNonSecureCodec; 251*ec779b8eSAndroid Build Coastguard Worker int32_t mCpuBoostCount; 252*ec779b8eSAndroid Build Coastguard Worker 253*ec779b8eSAndroid Build Coastguard Worker private: 254*ec779b8eSAndroid Build Coastguard Worker PidResourceInfosMap mMap; 255*ec779b8eSAndroid Build Coastguard Worker struct ProcessInfoOverride { 256*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<DeathNotifier> deathNotifier = nullptr; 257*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<IResourceManagerClient> client; 258*ec779b8eSAndroid Build Coastguard Worker }; 259*ec779b8eSAndroid Build Coastguard Worker std::map<int, int> mOverridePidMap; 260*ec779b8eSAndroid Build Coastguard Worker std::map<pid_t, ProcessInfoOverride> mProcessInfoOverrideMap; 261*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResourceObserverService> mObserverService; 262*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<ResourceManagerMetrics> mResourceManagerMetrics; 263*ec779b8eSAndroid Build Coastguard Worker }; 264*ec779b8eSAndroid Build Coastguard Worker 265*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------- 266*ec779b8eSAndroid Build Coastguard Worker } // namespace android 267*ec779b8eSAndroid Build Coastguard Worker 268*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_MEDIA_RESOURCEMANAGERSERVICE_H 269