xref: /aosp_15_r20/system/chre/core/settings.cc (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker  *
4*84e33947SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker  *
8*84e33947SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker  *
10*84e33947SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker  * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker  */
16*84e33947SAndroid Build Coastguard Worker 
17*84e33947SAndroid Build Coastguard Worker #include "chre/core/settings.h"
18*84e33947SAndroid Build Coastguard Worker 
19*84e33947SAndroid Build Coastguard Worker #include <cstddef>
20*84e33947SAndroid Build Coastguard Worker 
21*84e33947SAndroid Build Coastguard Worker #include "chre/core/event_loop_manager.h"
22*84e33947SAndroid Build Coastguard Worker #include "chre/platform/log.h"
23*84e33947SAndroid Build Coastguard Worker #include "chre/util/macros.h"
24*84e33947SAndroid Build Coastguard Worker #include "chre/util/nested_data_ptr.h"
25*84e33947SAndroid Build Coastguard Worker #include "chre/util/system/event_callbacks.h"
26*84e33947SAndroid Build Coastguard Worker 
27*84e33947SAndroid Build Coastguard Worker #include "chre_api/chre/user_settings.h"
28*84e33947SAndroid Build Coastguard Worker 
29*84e33947SAndroid Build Coastguard Worker namespace chre {
30*84e33947SAndroid Build Coastguard Worker 
31*84e33947SAndroid Build Coastguard Worker namespace {
32*84e33947SAndroid Build Coastguard Worker 
33*84e33947SAndroid Build Coastguard Worker /**
34*84e33947SAndroid Build Coastguard Worker  * @param setting The setting to get the index for.
35*84e33947SAndroid Build Coastguard Worker  * @param index A non-null pointer to store the index.
36*84e33947SAndroid Build Coastguard Worker  *
37*84e33947SAndroid Build Coastguard Worker  * @return false if the setting was invalid.
38*84e33947SAndroid Build Coastguard Worker  */
getIndexForSetting(Setting setting,size_t * index)39*84e33947SAndroid Build Coastguard Worker bool getIndexForSetting(Setting setting, size_t *index) {
40*84e33947SAndroid Build Coastguard Worker   if (setting < Setting::SETTING_MAX) {
41*84e33947SAndroid Build Coastguard Worker     *index = static_cast<size_t>(setting);
42*84e33947SAndroid Build Coastguard Worker     return true;
43*84e33947SAndroid Build Coastguard Worker   }
44*84e33947SAndroid Build Coastguard Worker 
45*84e33947SAndroid Build Coastguard Worker   return false;
46*84e33947SAndroid Build Coastguard Worker }
47*84e33947SAndroid Build Coastguard Worker 
sendSettingChangedNotification(Setting setting,bool enabled)48*84e33947SAndroid Build Coastguard Worker void sendSettingChangedNotification(Setting setting, bool enabled) {
49*84e33947SAndroid Build Coastguard Worker   auto *eventData = memoryAlloc<struct chreUserSettingChangedEvent>();
50*84e33947SAndroid Build Coastguard Worker   auto settingAsInt = static_cast<uint8_t>(setting);
51*84e33947SAndroid Build Coastguard Worker   uint16_t eventType = CHRE_EVENT_SETTING_CHANGED_FIRST_EVENT + settingAsInt;
52*84e33947SAndroid Build Coastguard Worker 
53*84e33947SAndroid Build Coastguard Worker   if (eventData != nullptr) {
54*84e33947SAndroid Build Coastguard Worker     eventData->setting = settingAsInt;
55*84e33947SAndroid Build Coastguard Worker     eventData->settingState = enabled ? CHRE_USER_SETTING_STATE_ENABLED
56*84e33947SAndroid Build Coastguard Worker                                       : CHRE_USER_SETTING_STATE_DISABLED;
57*84e33947SAndroid Build Coastguard Worker 
58*84e33947SAndroid Build Coastguard Worker     EventLoopManagerSingleton::get()->getEventLoop().postEventOrDie(
59*84e33947SAndroid Build Coastguard Worker         eventType, eventData, freeEventDataCallback, kBroadcastInstanceId);
60*84e33947SAndroid Build Coastguard Worker   } else {
61*84e33947SAndroid Build Coastguard Worker     LOG_OOM();
62*84e33947SAndroid Build Coastguard Worker   }
63*84e33947SAndroid Build Coastguard Worker }
64*84e33947SAndroid Build Coastguard Worker 
65*84e33947SAndroid Build Coastguard Worker }  // anonymous namespace
66*84e33947SAndroid Build Coastguard Worker 
SettingManager()67*84e33947SAndroid Build Coastguard Worker SettingManager::SettingManager() {
68*84e33947SAndroid Build Coastguard Worker   // Default most settings to true until the host tells us otherwise so
69*84e33947SAndroid Build Coastguard Worker   // nanoapps can begin work during boot which will get canceled if the user has
70*84e33947SAndroid Build Coastguard Worker   // disabled the feature.
71*84e33947SAndroid Build Coastguard Worker   for (size_t i = 0; i < ARRAY_SIZE(mSettingStateList); ++i) {
72*84e33947SAndroid Build Coastguard Worker     mSettingStateList[i] = true;
73*84e33947SAndroid Build Coastguard Worker   }
74*84e33947SAndroid Build Coastguard Worker 
75*84e33947SAndroid Build Coastguard Worker   // Airplane mode should be disabled since it being enabled causes API usage
76*84e33947SAndroid Build Coastguard Worker   // restrictions.
77*84e33947SAndroid Build Coastguard Worker   auto airplaneIndex = static_cast<uint8_t>(Setting::AIRPLANE_MODE);
78*84e33947SAndroid Build Coastguard Worker   mSettingStateList[airplaneIndex] = false;
79*84e33947SAndroid Build Coastguard Worker }
80*84e33947SAndroid Build Coastguard Worker 
postSettingChange(Setting setting,bool enabled)81*84e33947SAndroid Build Coastguard Worker void SettingManager::postSettingChange(Setting setting, bool enabled) {
82*84e33947SAndroid Build Coastguard Worker   LOGD("Posting setting change: setting type %" PRIu8 " enabled %d",
83*84e33947SAndroid Build Coastguard Worker        static_cast<uint8_t>(setting), enabled);
84*84e33947SAndroid Build Coastguard Worker 
85*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->deferCallback(
86*84e33947SAndroid Build Coastguard Worker       SystemCallbackType::SettingChangeEvent, NestedDataPtr<Setting>(setting),
87*84e33947SAndroid Build Coastguard Worker       settingChangedCallback, NestedDataPtr<bool>(enabled));
88*84e33947SAndroid Build Coastguard Worker }
89*84e33947SAndroid Build Coastguard Worker 
getSettingEnabled(Setting setting)90*84e33947SAndroid Build Coastguard Worker bool SettingManager::getSettingEnabled(Setting setting) {
91*84e33947SAndroid Build Coastguard Worker   size_t index;
92*84e33947SAndroid Build Coastguard Worker   if (getIndexForSetting(setting, &index)) {
93*84e33947SAndroid Build Coastguard Worker     return mSettingStateList[index];
94*84e33947SAndroid Build Coastguard Worker   }
95*84e33947SAndroid Build Coastguard Worker 
96*84e33947SAndroid Build Coastguard Worker   LOGE("Unknown setting %" PRIu8, static_cast<uint8_t>(setting));
97*84e33947SAndroid Build Coastguard Worker   return false;
98*84e33947SAndroid Build Coastguard Worker }
99*84e33947SAndroid Build Coastguard Worker 
getSettingStateAsInt8(uint8_t setting)100*84e33947SAndroid Build Coastguard Worker int8_t SettingManager::getSettingStateAsInt8(uint8_t setting) {
101*84e33947SAndroid Build Coastguard Worker   int8_t state = CHRE_USER_SETTING_STATE_UNKNOWN;
102*84e33947SAndroid Build Coastguard Worker   if (setting < static_cast<uint8_t>(Setting::SETTING_MAX)) {
103*84e33947SAndroid Build Coastguard Worker     auto settingEnum = static_cast<Setting>(setting);
104*84e33947SAndroid Build Coastguard Worker     state = static_cast<int8_t>(getSettingEnabled(settingEnum));
105*84e33947SAndroid Build Coastguard Worker   }
106*84e33947SAndroid Build Coastguard Worker   return state;
107*84e33947SAndroid Build Coastguard Worker }
108*84e33947SAndroid Build Coastguard Worker 
logStateToBuffer(DebugDumpWrapper & debugDump)109*84e33947SAndroid Build Coastguard Worker void SettingManager::logStateToBuffer(DebugDumpWrapper &debugDump) {
110*84e33947SAndroid Build Coastguard Worker   debugDump.print("\nSettings:");
111*84e33947SAndroid Build Coastguard Worker   debugDump.print("\n Location %s", getSettingEnabledString(Setting::LOCATION));
112*84e33947SAndroid Build Coastguard Worker   debugDump.print("\n WiFi available %s",
113*84e33947SAndroid Build Coastguard Worker                   getSettingEnabledString(Setting::WIFI_AVAILABLE));
114*84e33947SAndroid Build Coastguard Worker   debugDump.print("\n Airplane mode %s",
115*84e33947SAndroid Build Coastguard Worker                   getSettingEnabledString(Setting::AIRPLANE_MODE));
116*84e33947SAndroid Build Coastguard Worker   debugDump.print("\n Microphone Access %s",
117*84e33947SAndroid Build Coastguard Worker                   getSettingEnabledString(Setting::MICROPHONE));
118*84e33947SAndroid Build Coastguard Worker   debugDump.print("\n BLE available %s",
119*84e33947SAndroid Build Coastguard Worker                   getSettingEnabledString(Setting::BLE_AVAILABLE));
120*84e33947SAndroid Build Coastguard Worker }
121*84e33947SAndroid Build Coastguard Worker 
settingChangedCallback(uint16_t,void * data,void * extraData)122*84e33947SAndroid Build Coastguard Worker void SettingManager::settingChangedCallback(uint16_t /* type */, void *data,
123*84e33947SAndroid Build Coastguard Worker                                             void *extraData) {
124*84e33947SAndroid Build Coastguard Worker   Setting setting = NestedDataPtr<Setting>(data);
125*84e33947SAndroid Build Coastguard Worker   bool settingEnabled = NestedDataPtr<bool>(extraData);
126*84e33947SAndroid Build Coastguard Worker 
127*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getSettingManager().setSettingState(
128*84e33947SAndroid Build Coastguard Worker       setting, settingEnabled);
129*84e33947SAndroid Build Coastguard Worker 
130*84e33947SAndroid Build Coastguard Worker   LOGD("Setting changed callback called for setting %u enabled %d",
131*84e33947SAndroid Build Coastguard Worker        static_cast<uint8_t>(setting), settingEnabled);
132*84e33947SAndroid Build Coastguard Worker 
133*84e33947SAndroid Build Coastguard Worker #ifdef CHRE_GNSS_SUPPORT_ENABLED
134*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getGnssManager().onSettingChanged(
135*84e33947SAndroid Build Coastguard Worker       setting, settingEnabled);
136*84e33947SAndroid Build Coastguard Worker #endif  // CHRE_GNSS_SUPPORT_ENABLED
137*84e33947SAndroid Build Coastguard Worker 
138*84e33947SAndroid Build Coastguard Worker #ifdef CHRE_AUDIO_SUPPORT_ENABLED
139*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getAudioRequestManager().onSettingChanged(
140*84e33947SAndroid Build Coastguard Worker       setting, settingEnabled);
141*84e33947SAndroid Build Coastguard Worker #endif  // CHRE_AUDIO_SUPPORT_ENABLED
142*84e33947SAndroid Build Coastguard Worker 
143*84e33947SAndroid Build Coastguard Worker #ifdef CHRE_BLE_SUPPORT_ENABLED
144*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getBleRequestManager().onSettingChanged(
145*84e33947SAndroid Build Coastguard Worker       setting, settingEnabled);
146*84e33947SAndroid Build Coastguard Worker #endif  // CHRE_BLE_SUPPORT_ENABLED
147*84e33947SAndroid Build Coastguard Worker 
148*84e33947SAndroid Build Coastguard Worker #ifdef CHRE_WIFI_SUPPORT_ENABLED
149*84e33947SAndroid Build Coastguard Worker   EventLoopManagerSingleton::get()->getWifiRequestManager().onSettingChanged(
150*84e33947SAndroid Build Coastguard Worker       setting, settingEnabled);
151*84e33947SAndroid Build Coastguard Worker #endif  // CHRE_WIFI_SUPPORT_ENABLED
152*84e33947SAndroid Build Coastguard Worker 
153*84e33947SAndroid Build Coastguard Worker   sendSettingChangedNotification(setting, settingEnabled);
154*84e33947SAndroid Build Coastguard Worker }
155*84e33947SAndroid Build Coastguard Worker 
setSettingState(Setting setting,bool enabled)156*84e33947SAndroid Build Coastguard Worker void SettingManager::setSettingState(Setting setting, bool enabled) {
157*84e33947SAndroid Build Coastguard Worker   size_t index;
158*84e33947SAndroid Build Coastguard Worker   if (!getIndexForSetting(setting, &index)) {
159*84e33947SAndroid Build Coastguard Worker     LOGE("Unknown setting %" PRId8, static_cast<int8_t>(setting));
160*84e33947SAndroid Build Coastguard Worker   } else {
161*84e33947SAndroid Build Coastguard Worker     mSettingStateList[index] = enabled;
162*84e33947SAndroid Build Coastguard Worker   }
163*84e33947SAndroid Build Coastguard Worker }
164*84e33947SAndroid Build Coastguard Worker 
getSettingEnabledString(Setting setting)165*84e33947SAndroid Build Coastguard Worker const char *SettingManager::getSettingEnabledString(Setting setting) {
166*84e33947SAndroid Build Coastguard Worker   if (getSettingEnabled(setting)) {
167*84e33947SAndroid Build Coastguard Worker     return "enabled";
168*84e33947SAndroid Build Coastguard Worker   } else {
169*84e33947SAndroid Build Coastguard Worker     return "disabled";
170*84e33947SAndroid Build Coastguard Worker   }
171*84e33947SAndroid Build Coastguard Worker }
172*84e33947SAndroid Build Coastguard Worker 
173*84e33947SAndroid Build Coastguard Worker }  // namespace chre
174