/* * Copyright (C) 2017 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. */ #pragma once #include "binder/IBinder.h" #include "config/ConfigKey.h" #include "config/ConfigListener.h" #include <map> #include <mutex> #include <set> #include <string> #include <stdio.h> namespace android { namespace os { namespace statsd { // Util function to build a hard coded config with test metrics. StatsdConfig build_fake_config(); /** * Keeps track of which configurations have been set from various sources. */ class ConfigManager : public virtual android::RefBase { public: ConfigManager(); virtual ~ConfigManager(); /** * Initialize ConfigListener by reading from disk and get updates. */ void Startup(); /* * Dummy initializer for tests. */ void StartupForTest(); /** * Someone else wants to know about the configs. */ void AddListener(const sp<ConfigListener>& listener); /** * A configuration was added or updated. * * Reports this to listeners. */ void UpdateConfig(const ConfigKey& key, const StatsdConfig& data); /** * Sets the broadcast receiver for a configuration key. */ void SetConfigReceiver(const ConfigKey& key, const sp<IBinder>& intentSender); /** * Returns the package name and class name representing the broadcast receiver for this config. */ const sp<android::IBinder> GetConfigReceiver(const ConfigKey& key) const; /** * Returns all config keys registered. */ std::vector<ConfigKey> GetAllConfigKeys() const; /** * Erase any broadcast receiver associated with this config key. */ void RemoveConfigReceiver(const ConfigKey& key); /** * A configuration was removed. * * Reports this to listeners. */ void RemoveConfig(const ConfigKey& key); /** * Remove all of the configs for the given uid. */ void RemoveConfigs(int uid); /** * Remove all of the configs from memory. */ void RemoveAllConfigs(); /** * Text dump of our state for debugging. */ void Dump(FILE* out); private: mutable std::mutex mMutex; /** * Save the configs to disk. */ void update_saved_configs_locked(const ConfigKey& key, const std::vector<uint8_t>& buffer, const int numBytes); /** * Remove saved configs from disk. */ void remove_saved_configs(const ConfigKey& key); /** * Maps from uid to the config keys that have been set. */ std::map<int, std::set<ConfigKey>> mConfigs; /** * Each config key can be subscribed by up to one receiver, specified as IBinder from * PendingIntent. */ std::map<ConfigKey, sp<android::IBinder>> mConfigReceivers; /** * The ConfigListeners that will be told about changes. */ std::vector<sp<ConfigListener>> mListeners; }; } // namespace statsd } // namespace os } // namespace android