aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/audio_request_manager.cc13
-rw-r--r--core/debug_dump_manager.cc2
-rw-r--r--core/gnss_manager.cc13
-rw-r--r--core/include/chre/core/event_loop_manager.h11
-rw-r--r--core/include/chre/core/settings.h88
-rw-r--r--core/settings.cc120
-rw-r--r--platform/shared/chre_api_user_settings.cc4
-rw-r--r--platform/slpi/host_link.cc3
8 files changed, 157 insertions, 97 deletions
diff --git a/core/audio_request_manager.cc b/core/audio_request_manager.cc
index 6c5c5eef..db3edca6 100644
--- a/core/audio_request_manager.cc
+++ b/core/audio_request_manager.cc
@@ -206,7 +206,8 @@ bool AudioRequestManager::doConfigureSource(uint32_t instanceId,
}
if (success &&
- (getSettingState(Setting::MICROPHONE) != SettingState::DISABLED)) {
+ (EventLoopManagerSingleton::get()->getSettingManager().getSettingState(
+ Setting::MICROPHONE) != SettingState::DISABLED)) {
scheduleNextAudioDataEvent(handle);
updatePlatformHandleEnabled(handle, lastNumRequests);
}
@@ -257,7 +258,8 @@ bool AudioRequestManager::createAudioRequest(uint32_t handle,
if (success) {
bool suspended =
- (getSettingState(Setting::MICROPHONE) == SettingState::DISABLED);
+ (EventLoopManagerSingleton::get()->getSettingManager().getSettingState(
+ Setting::MICROPHONE) == SettingState::DISABLED);
postAudioSamplingChangeEvent(instanceId, handle, requestList.available,
suspended);
}
@@ -347,7 +349,9 @@ void AudioRequestManager::handleAudioAvailabilitySync(uint32_t handle,
if (handle < mAudioRequestLists.size()) {
if (mAudioRequestLists[handle].available != available) {
bool suspended =
- (getSettingState(Setting::MICROPHONE) == SettingState::DISABLED);
+ (EventLoopManagerSingleton::get()
+ ->getSettingManager()
+ .getSettingState(Setting::MICROPHONE) == SettingState::DISABLED);
mAudioRequestLists[handle].available = available;
postAudioSamplingChangeEvents(handle, suspended);
}
@@ -359,7 +363,8 @@ void AudioRequestManager::handleAudioAvailabilitySync(uint32_t handle,
}
void AudioRequestManager::scheduleNextAudioDataEvent(uint32_t handle) {
- if (getSettingState(Setting::MICROPHONE) == SettingState::DISABLED) {
+ if (EventLoopManagerSingleton::get()->getSettingManager().getSettingState(
+ Setting::MICROPHONE) == SettingState::DISABLED) {
LOGD("Mic access disabled, doing nothing");
return;
}
diff --git a/core/debug_dump_manager.cc b/core/debug_dump_manager.cc
index a82478b6..a2a5d4ae 100644
--- a/core/debug_dump_manager.cc
+++ b/core/debug_dump_manager.cc
@@ -89,7 +89,7 @@ void DebugDumpManager::collectFrameworkDebugDumps() {
#ifdef CHRE_AUDIO_SUPPORT_ENABLED
eventLoopManager->getAudioRequestManager().logStateToBuffer(mDebugDump);
#endif // CHRE_AUDIO_SUPPORT_ENABLED
- logSettingStateToBuffer(mDebugDump);
+ eventLoopManager->getSettingManager().logStateToBuffer(mDebugDump);
logStateToBuffer(mDebugDump);
}
diff --git a/core/gnss_manager.cc b/core/gnss_manager.cc
index 32d8494e..905de179 100644
--- a/core/gnss_manager.cc
+++ b/core/gnss_manager.cc
@@ -265,7 +265,8 @@ void GnssSession::handleReportEvent(void *event) {
uint16_t reportEventType;
if (!getReportEventType(static_cast<SystemCallbackType>(type),
&reportEventType) ||
- (getSettingState(Setting::LOCATION) == SettingState::DISABLED)) {
+ (EventLoopManagerSingleton::get()->getSettingManager().getSettingState(
+ Setting::LOCATION) == SettingState::DISABLED)) {
freeReportEventCallback(reportEventType, data);
} else {
EventLoopManagerSingleton::get()->getEventLoop().postEventOrDie(
@@ -295,7 +296,9 @@ void GnssSession::onSettingChanged(Setting setting, SettingState state) {
}
bool GnssSession::updatePlatformRequest(bool forceUpdate) {
- SettingState locationSetting = getSettingState(Setting::LOCATION);
+ SettingState locationSetting =
+ EventLoopManagerSingleton::get()->getSettingManager().getSettingState(
+ Setting::LOCATION);
bool desiredPlatformState =
(locationSetting == SettingState::ENABLED) && !mRequests.empty();
@@ -379,7 +382,8 @@ bool GnssSession::configure(Nanoapp *nanoapp, bool enable,
} else if (stateTransitionIsRequired(enable, minInterval, hasRequest,
requestIndex)) {
if (enable &&
- getSettingState(Setting::LOCATION) == SettingState::DISABLED) {
+ EventLoopManagerSingleton::get()->getSettingManager().getSettingState(
+ Setting::LOCATION) == SettingState::DISABLED) {
// Treat as success but post async failure per API.
success = postAsyncResultEvent(instanceId, false /* success */, enable,
minInterval, CHRE_ERROR_FUNCTION_DISABLED,
@@ -680,7 +684,8 @@ void GnssSession::dispatchQueuedStateTransitions() {
if (stateTransitionIsRequired(stateTransition.enable,
stateTransition.minInterval, hasRequest,
requestIndex)) {
- if (getSettingState(Setting::LOCATION) == SettingState::DISABLED) {
+ if (EventLoopManagerSingleton::get()->getSettingManager().getSettingState(
+ Setting::LOCATION) == SettingState::DISABLED) {
postAsyncResultEventFatal(
stateTransition.nanoappInstanceId, false /* success */,
stateTransition.enable, stateTransition.minInterval,
diff --git a/core/include/chre/core/event_loop_manager.h b/core/include/chre/core/event_loop_manager.h
index 1b7e46c2..199dd5b5 100644
--- a/core/include/chre/core/event_loop_manager.h
+++ b/core/include/chre/core/event_loop_manager.h
@@ -21,6 +21,7 @@
#include "chre/core/event_loop.h"
#include "chre/core/event_loop_common.h"
#include "chre/core/host_comms_manager.h"
+#include "chre/core/settings.h"
#include "chre/platform/memory_manager.h"
#include "chre/platform/mutex.h"
#include "chre/util/always_false.h"
@@ -290,6 +291,13 @@ class EventLoopManager : public NonCopyable {
}
/**
+ * @return A reference to the setting manager.
+ */
+ SettingManager &getSettingManager() {
+ return mSettingManager;
+ }
+
+ /**
* Performs second-stage initialization of things that are not necessarily
* required at construction time but need to be completed prior to executing
* any nanoapps.
@@ -342,6 +350,9 @@ class EventLoopManager : public NonCopyable {
//! The DebugDumpManager that handles the debug dump process.
DebugDumpManager mDebugDumpManager;
+
+ //! The SettingManager that manages setting states.
+ SettingManager mSettingManager;
};
//! Provide an alias to the EventLoopManager singleton.
diff --git a/core/include/chre/core/settings.h b/core/include/chre/core/settings.h
index 5c8683ee..63e47431 100644
--- a/core/include/chre/core/settings.h
+++ b/core/include/chre/core/settings.h
@@ -34,42 +34,66 @@ enum class Setting : uint8_t {
enum class SettingState : int8_t { UNKNOWN = -1, DISABLED = 0, ENABLED };
/**
- * Updates the state of a given setting.
- *
- * @param setting The setting to update.
- * @param state The state of the setting.
+ * Stores latest setting state and is responsible for sending setting updates
+ * to nanoapps.
*/
-void postSettingChange(Setting setting, SettingState state);
+class SettingManager {
+ public:
+ SettingManager();
-/**
- * Gets the current state of a given setting. Must be called from the context of
- * the main CHRE thread.
- *
- * @param setting The setting to check the current state of.
- *
- * @return The current state of the setting, SETTING_STATE_UNKNOWN if the
- * provided setting is invalid.
- */
-SettingState getSettingState(Setting setting);
+ /**
+ * Updates the state of a given setting.
+ *
+ * @param setting The setting to update.
+ * @param state The state of the setting.
+ */
+ void postSettingChange(Setting setting, SettingState state);
-/**
- * Gets the current state of a given setting, but returns the state as an
- * int8_t. The state is guaranteed to be a member of enum chreUserSettingState.
- *
- * @param setting The setting to check the current state of (see
- * CHRE_USER_SETTINGS).
- *
- * @return The current state of the setting (see enum chreUserSettingState)
- */
-int8_t getSettingStateAsInt8(uint8_t setting);
+ /**
+ * Gets the current state of a given setting. Must be called from the context
+ * of the main CHRE thread.
+ *
+ * @param setting The setting to check the current state of.
+ *
+ * @return The current state of the setting, SETTING_STATE_UNKNOWN if the
+ * provided setting is invalid.
+ */
+ SettingState getSettingState(Setting setting);
-/**
- * Logs the settings related stats in the debug dump. Must be called from the
- * context of the main CHRE thread.
- *
- * @param debugDump The object that is printed into for debug dump logs.
- */
-void logSettingStateToBuffer(DebugDumpWrapper &debugDump);
+ /**
+ * Gets the current state of a given setting, but returns the state as an
+ * int8_t. The state is guaranteed to be a member of enum
+ * chreUserSettingState.
+ *
+ * @param setting The setting to check the current state of (see
+ * CHRE_USER_SETTINGS).
+ *
+ * @return The current state of the setting (see enum chreUserSettingState)
+ */
+ int8_t getSettingStateAsInt8(uint8_t setting);
+
+ /**
+ * Logs the settings related stats in the debug dump. Must be called from the
+ * context of the main CHRE thread.
+ *
+ * @param debugDump The object that is printed into for debug dump logs.
+ */
+ void logStateToBuffer(DebugDumpWrapper &debugDump);
+
+ private:
+ static constexpr size_t kNumSettings =
+ static_cast<size_t>(Setting::SETTING_MAX);
+
+ //! The current state for each setting.
+ SettingState mSettingStateList[kNumSettings];
+
+ void setSettingState(Setting setting, SettingState state);
+
+ const char *getSettingStateString(Setting setting);
+
+ static void settingChangedCallback(uint16_t type, void *data,
+ void *extraData);
+};
} // namespace chre
diff --git a/core/settings.cc b/core/settings.cc
index dc3786d4..d1494d1d 100644
--- a/core/settings.cc
+++ b/core/settings.cc
@@ -20,6 +20,7 @@
#include "chre/core/event_loop_manager.h"
#include "chre/platform/log.h"
+#include "chre/util/macros.h"
#include "chre/util/nested_data_ptr.h"
#include "chre_api/chre/user_settings.h"
@@ -28,11 +29,6 @@ namespace chre {
namespace {
-constexpr size_t kNumSettings = static_cast<size_t>(Setting::SETTING_MAX);
-
-//! The current state for each setting.
-SettingState gSettingStateList[kNumSettings] = {SettingState::ENABLED};
-
/**
* @param setting The setting to get the index for.
* @param index A non-null pointer to store the index.
@@ -48,30 +44,6 @@ bool getIndexForSetting(Setting setting, size_t *index) {
return false;
}
-void setSettingState(Setting setting, SettingState state) {
- size_t index;
- if (!getIndexForSetting(setting, &index)) {
- LOGE("Unknown setting %" PRId8, static_cast<int8_t>(setting));
- } else {
- gSettingStateList[index] = state;
- }
-}
-
-const char *getSettingStateString(Setting setting) {
- switch (getSettingState(setting)) {
- case SettingState::ENABLED:
- return "enabled";
- break;
- case SettingState::DISABLED:
- return "disabled";
- break;
- default:
- break;
- }
-
- return "unknown";
-}
-
void sendSettingChangedNotification(Setting setting, SettingState state) {
auto *eventData = memoryAlloc<struct chreUserSettingChangedEvent>();
auto settingAsInt = static_cast<uint8_t>(setting);
@@ -88,31 +60,23 @@ void sendSettingChangedNotification(Setting setting, SettingState state) {
}
}
-void settingChangedCallback(uint16_t /* type */, void *data, void *extraData) {
- Setting setting = NestedDataPtr<Setting>(data);
- SettingState settingState = NestedDataPtr<SettingState>(extraData);
-
- setSettingState(setting, settingState);
-
- LOGD("Setting changed callback called for setting %u state %u",
- static_cast<uint8_t>(setting), static_cast<uint8_t>(settingState));
-
-#ifdef CHRE_GNSS_SUPPORT_ENABLED
- EventLoopManagerSingleton::get()->getGnssManager().onSettingChanged(
- setting, settingState);
-#endif // CHRE_GNSS_SUPPORT_ENABLED
+} // anonymous namespace
-#ifdef CHRE_AUDIO_SUPPORT_ENABLED
- EventLoopManagerSingleton::get()->getAudioRequestManager().onSettingChanged(
- setting, settingState);
-#endif // CHRE_AUDIO_SUPPORT_ENABLED
+SettingManager::SettingManager() {
+ // Default most settings to true until the host tells us otherwise so
+ // nanoapps can begin work during boot which will get canceled if the user has
+ // disabled the feature.
+ for (size_t i = 0; i < ARRAY_SIZE(mSettingStateList); ++i) {
+ mSettingStateList[i] = SettingState::ENABLED;
+ }
- sendSettingChangedNotification(setting, settingState);
+ // Airplane mode should be disabled since it being enabled causes API usage
+ // restrictions.
+ auto airplaneIndex = static_cast<uint8_t>(Setting::AIRPLANE_MODE);
+ mSettingStateList[airplaneIndex] = SettingState::DISABLED;
}
-} // anonymous namespace
-
-void postSettingChange(Setting setting, SettingState state) {
+void SettingManager::postSettingChange(Setting setting, SettingState state) {
LOGD("Posting setting change: setting type %" PRIu8 " state %" PRIu8,
static_cast<uint8_t>(setting), static_cast<uint8_t>(state));
@@ -121,17 +85,17 @@ void postSettingChange(Setting setting, SettingState state) {
settingChangedCallback, NestedDataPtr<SettingState>(state));
}
-SettingState getSettingState(Setting setting) {
+SettingState SettingManager::getSettingState(Setting setting) {
size_t index;
if (getIndexForSetting(setting, &index)) {
- return gSettingStateList[index];
+ return mSettingStateList[index];
}
LOGE("Unknown setting %" PRIu8, static_cast<uint8_t>(setting));
return SettingState::UNKNOWN;
}
-int8_t getSettingStateAsInt8(uint8_t setting) {
+int8_t SettingManager::getSettingStateAsInt8(uint8_t setting) {
int8_t state = CHRE_USER_SETTING_STATE_UNKNOWN;
if (setting < static_cast<uint8_t>(Setting::SETTING_MAX)) {
auto settingEnum = static_cast<Setting>(setting);
@@ -140,7 +104,7 @@ int8_t getSettingStateAsInt8(uint8_t setting) {
return state;
}
-void logSettingStateToBuffer(DebugDumpWrapper &debugDump) {
+void SettingManager::logStateToBuffer(DebugDumpWrapper &debugDump) {
debugDump.print("\nSettings:");
debugDump.print("\n Location %s", getSettingStateString(Setting::LOCATION));
debugDump.print("\n WiFi available %s",
@@ -151,4 +115,52 @@ void logSettingStateToBuffer(DebugDumpWrapper &debugDump) {
getSettingStateString(Setting::MICROPHONE));
}
+void SettingManager::settingChangedCallback(uint16_t /* type */, void *data,
+ void *extraData) {
+ Setting setting = NestedDataPtr<Setting>(data);
+ SettingState settingState = NestedDataPtr<SettingState>(extraData);
+
+ EventLoopManagerSingleton::get()->getSettingManager().setSettingState(
+ setting, settingState);
+
+ LOGD("Setting changed callback called for setting %u state %u",
+ static_cast<uint8_t>(setting), static_cast<uint8_t>(settingState));
+
+#ifdef CHRE_GNSS_SUPPORT_ENABLED
+ EventLoopManagerSingleton::get()->getGnssManager().onSettingChanged(
+ setting, settingState);
+#endif // CHRE_GNSS_SUPPORT_ENABLED
+
+#ifdef CHRE_AUDIO_SUPPORT_ENABLED
+ EventLoopManagerSingleton::get()->getAudioRequestManager().onSettingChanged(
+ setting, settingState);
+#endif // CHRE_AUDIO_SUPPORT_ENABLED
+
+ sendSettingChangedNotification(setting, settingState);
+}
+
+void SettingManager::setSettingState(Setting setting, SettingState state) {
+ size_t index;
+ if (!getIndexForSetting(setting, &index)) {
+ LOGE("Unknown setting %" PRId8, static_cast<int8_t>(setting));
+ } else {
+ mSettingStateList[index] = state;
+ }
+}
+
+const char *SettingManager::getSettingStateString(Setting setting) {
+ switch (getSettingState(setting)) {
+ case SettingState::ENABLED:
+ return "enabled";
+ break;
+ case SettingState::DISABLED:
+ return "disabled";
+ break;
+ default:
+ break;
+ }
+
+ return "unknown";
+}
+
} // namespace chre
diff --git a/platform/shared/chre_api_user_settings.cc b/platform/shared/chre_api_user_settings.cc
index d1496888..76e1b290 100644
--- a/platform/shared/chre_api_user_settings.cc
+++ b/platform/shared/chre_api_user_settings.cc
@@ -26,7 +26,9 @@ using chre::Setting;
using chre::SettingState;
DLL_EXPORT int8_t chreUserSettingGetState(uint8_t setting) {
- return chre::getSettingStateAsInt8(setting);
+ return chre::EventLoopManagerSingleton::get()
+ ->getSettingManager()
+ .getSettingStateAsInt8(setting);
}
DLL_EXPORT void chreUserSettingConfigureEvents(uint8_t setting, bool enable) {
diff --git a/platform/slpi/host_link.cc b/platform/slpi/host_link.cc
index a8bdfec9..956413cb 100644
--- a/platform/slpi/host_link.cc
+++ b/platform/slpi/host_link.cc
@@ -944,7 +944,8 @@ void HostMessageHandlers::handleSettingChangeMessage(fbs::Setting setting,
SettingState chreSettingState;
if (HostProtocolChre::getSettingFromFbs(setting, &chreSetting) &&
HostProtocolChre::getSettingStateFromFbs(state, &chreSettingState)) {
- postSettingChange(chreSetting, chreSettingState);
+ EventLoopManagerSingleton::get()->getSettingManager().postSettingChange(
+ chreSetting, chreSettingState);
}
}