153ef440c91134b836cb0a064378dfc7f8386fe6
[platform/core/connectivity/bluetooth-frwk.git] / bt-core / bt-core-noti-handler.c
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *              http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <vconf.h>
19 #include <vconf-keys.h>
20
21 #include "bt-core-adapter.h"
22 #include "bt-core-common.h"
23 #include "bt-core-noti-handler.h"
24
25 static gboolean flightmode_request = FALSE;
26
27 void _bt_set_flightmode_request(gboolean value)
28 {
29         flightmode_request = value;
30 }
31
32 gboolean _bt_is_flightmode_request(void)
33 {
34         return flightmode_request;
35 }
36
37 static gboolean __bt_off_cause_conflict_check(void)
38 {
39         int flight_mode_value = 0;
40         int ps_mode_value = 0;
41         gboolean ret = FALSE;
42
43         retv_if(vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE,
44                                         &flight_mode_value) != 0, FALSE);
45         retv_if(vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE,
46                                         &ps_mode_value) != 0, FALSE);
47
48         if (flight_mode_value == 1 || ps_mode_value > 0) {
49                 BT_DBG("Bt should not turn on");
50                 ret = TRUE;
51         }
52
53         return ret;
54 }
55
56 static void __bt_core_handle_adapter_with_flight_mode(gboolean flight_mode)
57 {
58         bt_status_t adapter_status;
59         bt_le_status_t adapter_status_le;
60
61         adapter_status = _bt_core_get_status();
62         adapter_status_le = _bt_core_get_le_status();
63
64         BT_INFO("bt status %d, le status %d", adapter_status, adapter_status_le);
65         if (flight_mode == TRUE) {
66                 BT_INFO_C("Flight mode on. Turn off BT");
67
68                 if (adapter_status == BT_ACTIVATING || adapter_status_le == BT_LE_ACTIVATING) {
69                         BT_INFO("BT adapter is activating. Turn off BT after activation");
70                         _bt_set_flightmode_request(TRUE);
71                         return;
72                 }
73                 if (adapter_status != BT_ACTIVATED && adapter_status_le != BT_LE_ACTIVATED) {
74                         BT_INFO("No need to control bt status");
75                         return;
76                 }
77
78                 if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 1) != 0)
79                         BT_ERR("Set vconf failed");
80
81                 if (adapter_status == BT_ACTIVATED) {
82                         int bt_status_before_mode = 0;
83
84                         if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status_before_mode) == 0)
85                                 _bt_core_set_bt_status(BT_FLIGHT_MODE, bt_status_before_mode);
86
87                         _bt_core_service_request_adapter(BT_DISABLE_ADAPTER);
88 #ifndef USB_BLUETOOTH
89                         _bt_disable_adapter();
90 #endif
91                 }
92
93                 if (adapter_status_le == BT_LE_ACTIVATED) {
94                         int bt_le_status_before_mode = 0;
95
96                         if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status_before_mode) == 0)
97                                 _bt_core_set_bt_le_status(BT_FLIGHT_MODE, bt_le_status_before_mode);
98
99                         _bt_core_service_request_adapter(BT_DISABLE_ADAPTER_LE);
100 #ifndef USB_BLUETOOTH
101                         _bt_disable_adapter_le();
102 #endif
103                 }
104         } else {
105                 int flight_mode_value = 0;
106
107                 BT_INFO_C("Flight mode off. Turn on BT");
108
109                 if (adapter_status == BT_DEACTIVATING || adapter_status_le == BT_LE_DEACTIVATING) {
110                         BT_INFO("BT adapter is activating. Turn off BT after activation");
111                         _bt_set_flightmode_request(TRUE);
112                         return;
113                 }
114                 if (adapter_status != BT_DEACTIVATED && adapter_status_le != BT_LE_DEACTIVATED) {
115                         BT_INFO("No need to control bt status");
116                         return;
117                 }
118
119                 if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE, &flight_mode_value))
120                         BT_ERR("Fail get flight mode value");
121
122                 if (flight_mode_value == 0)
123                         return;
124
125                 if (vconf_set_int(BT_OFF_DUE_TO_FLIGHT_MODE, 0) != 0)
126                         BT_ERR("Set vconf failed");
127
128                 ret_if(__bt_off_cause_conflict_check());
129
130                 if (adapter_status == BT_DEACTIVATED &&
131                     _bt_core_get_bt_status(BT_FLIGHT_MODE) != 0) {
132                         _bt_core_set_bt_status(BT_FLIGHT_MODE, 0);
133                         _bt_core_service_request_adapter(BT_ENABLE_ADAPTER);
134 #ifndef USB_BLUETOOTH
135                         _bt_enable_adapter();
136 #endif
137                 }
138
139                 if (adapter_status_le == BT_LE_DEACTIVATED &&
140                     _bt_core_get_bt_le_status(BT_FLIGHT_MODE) != 0) {
141                         _bt_core_set_bt_le_status(BT_FLIGHT_MODE, 0);
142                         _bt_core_service_request_adapter(BT_ENABLE_ADAPTER_LE);
143 #ifndef USB_BLUETOOTH
144                         _bt_enable_adapter_le();
145 #endif
146                 }
147         }
148 }
149
150 static void __bt_core_handle_adapter_with_power_saving_mode(int power_saving_mode)
151 {
152         bt_status_t adapter_status;
153         bt_le_status_t adapter_status_le;
154
155         adapter_status = _bt_core_get_status();
156         adapter_status_le = _bt_core_get_le_status();
157
158         if (power_saving_mode == 2) {
159                 BT_DBG("Deactivate Bluetooth Service");
160                 if (vconf_set_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, 1) != 0)
161                         BT_ERR("Set vconf failed");
162
163                 if (adapter_status == BT_ACTIVATED) {
164                         int bt_status_before_mode = 0;
165                         if (vconf_get_int(VCONFKEY_BT_STATUS, &bt_status_before_mode) == 0)
166                                 _bt_core_set_bt_status(BT_POWER_SAVING_MODE, bt_status_before_mode);
167
168                         _bt_core_service_request_adapter(BT_DISABLE_ADAPTER);
169 #ifndef USB_BLUETOOTH
170                         _bt_disable_adapter();
171 #endif
172                 }
173                 if (adapter_status_le == BT_LE_ACTIVATED) {
174                         int bt_le_status_before_mode = 0;
175
176                         if (vconf_get_int(VCONFKEY_BT_LE_STATUS, &bt_le_status_before_mode) == 0)
177                                 _bt_core_set_bt_le_status(BT_POWER_SAVING_MODE, bt_le_status_before_mode);
178
179                         /* Disable the BT LE */
180                         _bt_core_service_request_adapter(BT_DISABLE_ADAPTER_LE);
181 #ifndef USB_BLUETOOTH
182                         _bt_disable_adapter_le();
183 #endif
184                 }
185         } else {
186                 int ps_mode_value = 0;
187
188                 if (vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, &ps_mode_value))
189                         BT_ERR("Fail get power saving mode value");
190
191                 if (ps_mode_value == 0)
192                         return;
193
194                 BT_DBG("Activate Bluetooth");
195                 if (vconf_set_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, 0))
196                         BT_ERR("Set vconf failed");
197
198                 ret_if(__bt_off_cause_conflict_check());
199
200                 BT_DBG("BT status before Emergency mode() :%d",
201                         _bt_core_get_bt_status(BT_POWER_SAVING_MODE));
202
203                 if (adapter_status == BT_DEACTIVATED && (_bt_core_get_bt_status(BT_POWER_SAVING_MODE) != 0)) {
204                         _bt_core_set_bt_status(BT_POWER_SAVING_MODE, 0);
205                         _bt_core_service_request_adapter(BT_ENABLE_ADAPTER);
206 #ifndef USB_BLUETOOTH
207                         _bt_enable_adapter();
208 #endif
209                 }
210                 BT_DBG("BT LE status before Emergency mode() :%d", _bt_core_get_bt_le_status(BT_POWER_SAVING_MODE));
211                 if (adapter_status_le == BT_LE_DEACTIVATED &&  _bt_core_get_bt_le_status(BT_POWER_SAVING_MODE) != 0) {
212                         _bt_core_set_bt_le_status(BT_POWER_SAVING_MODE, 0);
213                         /* Enable the BT LE */
214                         _bt_core_service_request_adapter(BT_ENABLE_ADAPTER_LE);
215 #ifndef USB_BLUETOOTH
216                         _bt_enable_adapter_le();
217 #endif
218                 }
219         }
220 }
221 #ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
222 static void __bt_core_flight_mode_cb(keynode_t *node, void *data)
223 {
224         gboolean flight_mode = FALSE;
225         int type;
226
227         BT_DBG("key = %s", vconf_keynode_get_name(node));
228
229         type = vconf_keynode_get_type(node);
230         if (type != VCONF_TYPE_BOOL) {
231                 BT_ERR("Invaild vconf key type : %d", type);
232                 return;
233         }
234
235         flight_mode = vconf_keynode_get_bool(node);
236
237         __bt_core_handle_adapter_with_flight_mode(flight_mode);
238 }
239 #endif
240
241 #ifndef TIZEN_PROFILE_WEARABLE
242 #ifdef ENABLE_TIZEN_2_4
243 static void __bt_core_power_saving_mode_cb(keynode_t *node, void *data)
244 {
245         int power_saving_mode = 0;
246
247         DBG_SECURE("key=%s", vconf_keynode_get_name(node));
248
249         if (vconf_keynode_get_type(node) != VCONF_TYPE_INT) {
250                 BT_ERR("Wrong vconf type");
251                 return;
252         }
253
254         power_saving_mode = vconf_keynode_get_int(node);
255
256         BT_DBG("value=%d", power_saving_mode);
257
258         __bt_core_handle_adapter_with_power_saving_mode(power_saving_mode);
259 }
260 #endif
261 #endif
262
263 void _bt_core_init_vconf_value(void)
264 {
265         gboolean flight_mode = FALSE;
266 #ifndef ENABLE_TIZEN_2_4
267         int power_saving_mode = 0;
268 #endif
269         int bt_flight_mode = 0;
270         int bt_ps_mode = 0;
271
272         _bt_core_handle_flight_mode_noti();
273         _bt_core_handle_power_saving_mode_noti();
274
275         flight_mode = _bt_core_is_flight_mode_enabled();
276
277 #ifndef TIZEN_PROFILE_WEARABLE
278 #ifndef ENABLE_TIZEN_2_4
279         if (vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &power_saving_mode) != 0)
280                 BT_ERR("Fail to get the power_saving_mode status value");
281         BT_DBG("flight_mode = %d, power_saving_mode = %d", flight_mode, power_saving_mode);
282 #endif
283 #endif
284         BT_DBG("flight_mode = %d, power_saving_mode = %d", flight_mode, power_saving_mode);
285
286         if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE, &bt_flight_mode))
287                 BT_ERR("Fail get flight mode value");
288         _bt_core_set_bt_status(BT_FLIGHT_MODE, bt_flight_mode);
289
290         if (vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, &bt_ps_mode))
291                 BT_ERR("Fail get power saving mode value");
292         _bt_core_set_bt_status(BT_POWER_SAVING_MODE, bt_ps_mode);
293
294         if (flight_mode == TRUE)
295                 __bt_core_handle_adapter_with_flight_mode(flight_mode);
296 #ifndef ENABLE_TIZEN_2_4
297         else if (power_saving_mode > 0)
298                 __bt_core_handle_adapter_with_power_saving_mode(power_saving_mode);
299 #endif
300         else
301                 BT_ERR("");
302 }
303
304 void _bt_core_handle_flight_mode_noti(void)
305 {
306 #ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
307         int ret;
308
309         BT_DBG("+");
310
311         ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
312                         (vconf_callback_fn)__bt_core_flight_mode_cb, NULL);
313         if (ret < 0)
314                 BT_ERR("Unable to register key handler");
315 #else
316         BT_DBG("Telephony is disabled");
317 #endif
318 }
319
320 void _bt_core_handle_power_saving_mode_noti(void)
321 {
322 #ifndef TIZEN_PROFILE_WEARABLE
323         int ret = 0;
324
325         BT_DBG("+");
326 #ifdef ENABLE_TIZEN_2_4
327         ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
328                         (vconf_callback_fn)__bt_core_power_saving_mode_cb, NULL);
329 #endif
330         if (ret < 0)
331                 BT_ERR("Unable to register key handler");
332 #endif
333 }
334
335 void _bt_core_unregister_vconf_handler(void)
336 {
337 #ifdef TIZEN_FEATURE_FLIGHTMODE_ENABLED
338         vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
339                         (vconf_callback_fn)__bt_core_flight_mode_cb);
340 #endif
341
342 #ifndef TIZEN_PROFILE_WEARABLE
343 #ifdef ENABLE_TIZEN_2_4
344         vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE,
345                         (vconf_callback_fn)__bt_core_power_saving_mode_cb);
346 #endif
347 #endif
348
349         return;
350 }
351