Loading api/system-current.txt +3 −2 Original line number Diff line number Diff line Loading @@ -30,8 +30,8 @@ package android { field public static final java.lang.String BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE = "android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE"; field public static final java.lang.String BIND_SETTINGS_SUGGESTIONS_SERVICE = "android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE"; field public static final java.lang.String BIND_TELEPHONY_DATA_SERVICE = "android.permission.BIND_TELEPHONY_DATA_SERVICE"; field public static final java.lang.String BIND_TEXTCLASSIFIER_SERVICE = "android.permission.BIND_TEXTCLASSIFIER_SERVICE"; field public static final java.lang.String BIND_TELEPHONY_NETWORK_SERVICE = "android.permission.BIND_TELEPHONY_NETWORK_SERVICE"; field public static final java.lang.String BIND_TEXTCLASSIFIER_SERVICE = "android.permission.BIND_TEXTCLASSIFIER_SERVICE"; field public static final java.lang.String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT"; field public static final java.lang.String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE"; field public static final java.lang.String BLUETOOTH_PRIVILEGED = "android.permission.BLUETOOTH_PRIVILEGED"; Loading Loading @@ -361,11 +361,12 @@ package android.app { } public final class StatsManager { method public boolean addConfiguration(long, byte[], java.lang.String, java.lang.String); method public boolean addConfiguration(long, byte[]); method public byte[] getData(long); method public byte[] getMetadata(); method public boolean removeConfiguration(long); method public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent); method public boolean setDataFetchOperation(long, android.app.PendingIntent); field public static final java.lang.String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED"; field public static final java.lang.String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY"; field public static final java.lang.String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID"; Loading cmds/statsd/src/StatsService.cpp +35 −10 Original line number Diff line number Diff line Loading @@ -84,12 +84,11 @@ StatsService::StatsService(const sp<Looper>& handlerLooper) auto receiver = mConfigManager->GetConfigReceiver(key); if (sc == nullptr) { VLOG("Could not find StatsCompanionService"); } else if (receiver.first.size() == 0) { } else if (receiver == nullptr) { VLOG("Statscompanion could not find a broadcast receiver for %s", key.ToString().c_str()); } else { sc->sendBroadcast(String16(receiver.first.c_str()), String16(receiver.second.c_str())); sc->sendDataBroadcast(receiver); } }); Loading Loading @@ -367,12 +366,14 @@ status_t StatsService::cmd_trigger_broadcast(FILE* out, Vector<String8>& args) { } auto receiver = mConfigManager->GetConfigReceiver(ConfigKey(uid, StrToInt64(name))); sp<IStatsCompanionService> sc = getStatsCompanionService(); if (sc != nullptr) { sc->sendBroadcast(String16(receiver.first.c_str()), String16(receiver.second.c_str())); if (sc == nullptr) { VLOG("Could not access statsCompanion"); } else if (receiver == nullptr) { VLOG("Could not find receiver for %s, %s", args[1].c_str(), args[2].c_str()) } else { sc->sendDataBroadcast(receiver); VLOG("StatsService::trigger broadcast succeeded to %s, %s", args[1].c_str(), args[2].c_str()); } else { VLOG("Could not access statsCompanion"); } return NO_ERROR; Loading Loading @@ -800,7 +801,6 @@ Status StatsService::getMetadata(vector<uint8_t>* output) { Status StatsService::addConfiguration(int64_t key, const vector <uint8_t>& config, const String16& package, const String16& cls, bool* success) { IPCThreadState* ipc = IPCThreadState::self(); if (checkCallingPermission(String16(kPermissionDump))) { Loading @@ -811,8 +811,33 @@ Status StatsService::addConfiguration(int64_t key, return Status::ok(); } mConfigManager->UpdateConfig(configKey, cfg); mConfigManager->SetConfigReceiver(configKey, string(String8(package).string()), string(String8(cls).string())); *success = true; return Status::ok(); } else { *success = false; return Status::fromExceptionCode(binder::Status::EX_SECURITY); } } Status StatsService::removeDataFetchOperation(int64_t key, bool* success) { IPCThreadState* ipc = IPCThreadState::self(); if (checkCallingPermission(String16(kPermissionDump))) { ConfigKey configKey(ipc->getCallingUid(), key); mConfigManager->RemoveConfigReceiver(configKey); *success = true; return Status::ok(); } else { *success = false; return Status::fromExceptionCode(binder::Status::EX_SECURITY); } } Status StatsService::setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender, bool* success) { IPCThreadState* ipc = IPCThreadState::self(); if (checkCallingPermission(String16(kPermissionDump))) { ConfigKey configKey(ipc->getCallingUid(), key); mConfigManager->SetConfigReceiver(configKey, intentSender); *success = true; return Status::ok(); } else { Loading cmds/statsd/src/StatsService.h +13 −3 Original line number Diff line number Diff line Loading @@ -91,8 +91,18 @@ public: * should requestData for this configuration. */ virtual Status addConfiguration(int64_t key, const vector<uint8_t>& config, const String16& package, const String16& cls, bool* success) override; bool* success) override; /** * Binder call to let clients register the data fetch operation for a configuration. */ virtual Status setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender, bool* success) override; /** * Binder call to remove the data fetch operation for the specified config key. */ virtual Status removeDataFetchOperation(int64_t key, bool* success) override; /** * Binder call to allow clients to remove the specified configuration. Loading cmds/statsd/src/config/ConfigManager.cpp +5 −6 Original line number Diff line number Diff line Loading @@ -75,8 +75,8 @@ void ConfigManager::UpdateConfig(const ConfigKey& key, const StatsdConfig& confi } } void ConfigManager::SetConfigReceiver(const ConfigKey& key, const string& pkg, const string& cls) { mConfigReceivers[key] = pair<string, string>(pkg, cls); void ConfigManager::SetConfigReceiver(const ConfigKey& key, const sp<IBinder>& intentSender) { mConfigReceivers[key] = intentSender; } void ConfigManager::RemoveConfigReceiver(const ConfigKey& key) { Loading Loading @@ -159,10 +159,10 @@ vector<ConfigKey> ConfigManager::GetAllConfigKeys() const { return ret; } const pair<string, string> ConfigManager::GetConfigReceiver(const ConfigKey& key) const { const sp<android::IBinder> ConfigManager::GetConfigReceiver(const ConfigKey& key) const { auto it = mConfigReceivers.find(key); if (it == mConfigReceivers.end()) { return pair<string,string>(); return nullptr; } else { return it->second; } Loading @@ -175,8 +175,7 @@ void ConfigManager::Dump(FILE* out) { fprintf(out, " %6d %lld\n", key.GetUid(), (long long)key.GetId()); auto receiverIt = mConfigReceivers.find(key); if (receiverIt != mConfigReceivers.end()) { fprintf(out, " -> received by %s, %s\n", receiverIt->second.first.c_str(), receiverIt->second.second.c_str()); fprintf(out, " -> received by PendingIntent as binder\n"); } } } Loading cmds/statsd/src/config/ConfigManager.h +6 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include "binder/IBinder.h" #include "config/ConfigKey.h" #include "config/ConfigListener.h" Loading Loading @@ -68,12 +69,12 @@ public: /** * Sets the broadcast receiver for a configuration key. */ void SetConfigReceiver(const ConfigKey& key, const std::string& pkg, const std::string& cls); void SetConfigReceiver(const ConfigKey& key, const sp<IBinder>& intentSender); /** * Returns the package name and class name representing the broadcast receiver for this config. */ const std::pair<std::string, std::string> GetConfigReceiver(const ConfigKey& key) const; const sp<android::IBinder> GetConfigReceiver(const ConfigKey& key) const; /** * Returns all config keys registered. Loading Loading @@ -124,10 +125,10 @@ private: std::set<ConfigKey> mConfigs; /** * Each config key can be subscribed by up to one receiver, specified as the package name and * class name. * Each config key can be subscribed by up to one receiver, specified as IBinder from * PendingIntent. */ std::map<ConfigKey, std::pair<std::string, std::string>> mConfigReceivers; std::map<ConfigKey, sp<android::IBinder>> mConfigReceivers; /** * The ConfigListeners that will be told about changes. Loading Loading
api/system-current.txt +3 −2 Original line number Diff line number Diff line Loading @@ -30,8 +30,8 @@ package android { field public static final java.lang.String BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE = "android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE"; field public static final java.lang.String BIND_SETTINGS_SUGGESTIONS_SERVICE = "android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE"; field public static final java.lang.String BIND_TELEPHONY_DATA_SERVICE = "android.permission.BIND_TELEPHONY_DATA_SERVICE"; field public static final java.lang.String BIND_TEXTCLASSIFIER_SERVICE = "android.permission.BIND_TEXTCLASSIFIER_SERVICE"; field public static final java.lang.String BIND_TELEPHONY_NETWORK_SERVICE = "android.permission.BIND_TELEPHONY_NETWORK_SERVICE"; field public static final java.lang.String BIND_TEXTCLASSIFIER_SERVICE = "android.permission.BIND_TEXTCLASSIFIER_SERVICE"; field public static final java.lang.String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT"; field public static final java.lang.String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE"; field public static final java.lang.String BLUETOOTH_PRIVILEGED = "android.permission.BLUETOOTH_PRIVILEGED"; Loading Loading @@ -361,11 +361,12 @@ package android.app { } public final class StatsManager { method public boolean addConfiguration(long, byte[], java.lang.String, java.lang.String); method public boolean addConfiguration(long, byte[]); method public byte[] getData(long); method public byte[] getMetadata(); method public boolean removeConfiguration(long); method public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent); method public boolean setDataFetchOperation(long, android.app.PendingIntent); field public static final java.lang.String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED"; field public static final java.lang.String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY"; field public static final java.lang.String EXTRA_STATS_CONFIG_UID = "android.app.extra.STATS_CONFIG_UID"; Loading
cmds/statsd/src/StatsService.cpp +35 −10 Original line number Diff line number Diff line Loading @@ -84,12 +84,11 @@ StatsService::StatsService(const sp<Looper>& handlerLooper) auto receiver = mConfigManager->GetConfigReceiver(key); if (sc == nullptr) { VLOG("Could not find StatsCompanionService"); } else if (receiver.first.size() == 0) { } else if (receiver == nullptr) { VLOG("Statscompanion could not find a broadcast receiver for %s", key.ToString().c_str()); } else { sc->sendBroadcast(String16(receiver.first.c_str()), String16(receiver.second.c_str())); sc->sendDataBroadcast(receiver); } }); Loading Loading @@ -367,12 +366,14 @@ status_t StatsService::cmd_trigger_broadcast(FILE* out, Vector<String8>& args) { } auto receiver = mConfigManager->GetConfigReceiver(ConfigKey(uid, StrToInt64(name))); sp<IStatsCompanionService> sc = getStatsCompanionService(); if (sc != nullptr) { sc->sendBroadcast(String16(receiver.first.c_str()), String16(receiver.second.c_str())); if (sc == nullptr) { VLOG("Could not access statsCompanion"); } else if (receiver == nullptr) { VLOG("Could not find receiver for %s, %s", args[1].c_str(), args[2].c_str()) } else { sc->sendDataBroadcast(receiver); VLOG("StatsService::trigger broadcast succeeded to %s, %s", args[1].c_str(), args[2].c_str()); } else { VLOG("Could not access statsCompanion"); } return NO_ERROR; Loading Loading @@ -800,7 +801,6 @@ Status StatsService::getMetadata(vector<uint8_t>* output) { Status StatsService::addConfiguration(int64_t key, const vector <uint8_t>& config, const String16& package, const String16& cls, bool* success) { IPCThreadState* ipc = IPCThreadState::self(); if (checkCallingPermission(String16(kPermissionDump))) { Loading @@ -811,8 +811,33 @@ Status StatsService::addConfiguration(int64_t key, return Status::ok(); } mConfigManager->UpdateConfig(configKey, cfg); mConfigManager->SetConfigReceiver(configKey, string(String8(package).string()), string(String8(cls).string())); *success = true; return Status::ok(); } else { *success = false; return Status::fromExceptionCode(binder::Status::EX_SECURITY); } } Status StatsService::removeDataFetchOperation(int64_t key, bool* success) { IPCThreadState* ipc = IPCThreadState::self(); if (checkCallingPermission(String16(kPermissionDump))) { ConfigKey configKey(ipc->getCallingUid(), key); mConfigManager->RemoveConfigReceiver(configKey); *success = true; return Status::ok(); } else { *success = false; return Status::fromExceptionCode(binder::Status::EX_SECURITY); } } Status StatsService::setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender, bool* success) { IPCThreadState* ipc = IPCThreadState::self(); if (checkCallingPermission(String16(kPermissionDump))) { ConfigKey configKey(ipc->getCallingUid(), key); mConfigManager->SetConfigReceiver(configKey, intentSender); *success = true; return Status::ok(); } else { Loading
cmds/statsd/src/StatsService.h +13 −3 Original line number Diff line number Diff line Loading @@ -91,8 +91,18 @@ public: * should requestData for this configuration. */ virtual Status addConfiguration(int64_t key, const vector<uint8_t>& config, const String16& package, const String16& cls, bool* success) override; bool* success) override; /** * Binder call to let clients register the data fetch operation for a configuration. */ virtual Status setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender, bool* success) override; /** * Binder call to remove the data fetch operation for the specified config key. */ virtual Status removeDataFetchOperation(int64_t key, bool* success) override; /** * Binder call to allow clients to remove the specified configuration. Loading
cmds/statsd/src/config/ConfigManager.cpp +5 −6 Original line number Diff line number Diff line Loading @@ -75,8 +75,8 @@ void ConfigManager::UpdateConfig(const ConfigKey& key, const StatsdConfig& confi } } void ConfigManager::SetConfigReceiver(const ConfigKey& key, const string& pkg, const string& cls) { mConfigReceivers[key] = pair<string, string>(pkg, cls); void ConfigManager::SetConfigReceiver(const ConfigKey& key, const sp<IBinder>& intentSender) { mConfigReceivers[key] = intentSender; } void ConfigManager::RemoveConfigReceiver(const ConfigKey& key) { Loading Loading @@ -159,10 +159,10 @@ vector<ConfigKey> ConfigManager::GetAllConfigKeys() const { return ret; } const pair<string, string> ConfigManager::GetConfigReceiver(const ConfigKey& key) const { const sp<android::IBinder> ConfigManager::GetConfigReceiver(const ConfigKey& key) const { auto it = mConfigReceivers.find(key); if (it == mConfigReceivers.end()) { return pair<string,string>(); return nullptr; } else { return it->second; } Loading @@ -175,8 +175,7 @@ void ConfigManager::Dump(FILE* out) { fprintf(out, " %6d %lld\n", key.GetUid(), (long long)key.GetId()); auto receiverIt = mConfigReceivers.find(key); if (receiverIt != mConfigReceivers.end()) { fprintf(out, " -> received by %s, %s\n", receiverIt->second.first.c_str(), receiverIt->second.second.c_str()); fprintf(out, " -> received by PendingIntent as binder\n"); } } } Loading
cmds/statsd/src/config/ConfigManager.h +6 −5 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include "binder/IBinder.h" #include "config/ConfigKey.h" #include "config/ConfigListener.h" Loading Loading @@ -68,12 +69,12 @@ public: /** * Sets the broadcast receiver for a configuration key. */ void SetConfigReceiver(const ConfigKey& key, const std::string& pkg, const std::string& cls); void SetConfigReceiver(const ConfigKey& key, const sp<IBinder>& intentSender); /** * Returns the package name and class name representing the broadcast receiver for this config. */ const std::pair<std::string, std::string> GetConfigReceiver(const ConfigKey& key) const; const sp<android::IBinder> GetConfigReceiver(const ConfigKey& key) const; /** * Returns all config keys registered. Loading Loading @@ -124,10 +125,10 @@ private: std::set<ConfigKey> mConfigs; /** * Each config key can be subscribed by up to one receiver, specified as the package name and * class name. * Each config key can be subscribed by up to one receiver, specified as IBinder from * PendingIntent. */ std::map<ConfigKey, std::pair<std::string, std::string>> mConfigReceivers; std::map<ConfigKey, sp<android::IBinder>> mConfigReceivers; /** * The ConfigListeners that will be told about changes. Loading