Merge "DPM: Add basic code for device policy manager for BT." into tizen
[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_BT_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_WEARABLE
242 static void __bt_core_power_saving_mode_cb(keynode_t *node, void *data)
243 {
244         int power_saving_mode = 0;
245
246         DBG_SECURE("key=%s", vconf_keynode_get_name(node));
247
248         if (vconf_keynode_get_type(node) != VCONF_TYPE_INT) {
249                 BT_ERR("Wrong vconf type");
250                 return;
251         }
252
253         power_saving_mode = vconf_keynode_get_int(node);
254
255         BT_DBG("value=%d", power_saving_mode);
256
257         __bt_core_handle_adapter_with_power_saving_mode(power_saving_mode);
258 }
259 #endif
260
261 void _bt_core_init_vconf_value(void)
262 {
263         gboolean flight_mode = FALSE;
264 #ifndef ENABLE_TIZEN_2_4
265         int power_saving_mode = 0;
266 #endif
267         int bt_flight_mode = 0;
268         int bt_ps_mode = 0;
269
270         _bt_core_handle_flight_mode_noti();
271         _bt_core_handle_power_saving_mode_noti();
272
273         flight_mode = _bt_core_is_flight_mode_enabled();
274
275 #ifndef TIZEN_WEARABLE
276 #ifndef ENABLE_TIZEN_2_4
277         if (vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &power_saving_mode) != 0)
278                 BT_ERR("Fail to get the power_saving_mode status value");
279         BT_DBG("flight_mode = %d, power_saving_mode = %d", flight_mode, power_saving_mode);
280 #endif
281 #endif
282         BT_DBG("flight_mode = %d, power_saving_mode = %d", flight_mode, power_saving_mode);
283
284         if (vconf_get_int(BT_OFF_DUE_TO_FLIGHT_MODE, &bt_flight_mode))
285                 BT_ERR("Fail get flight mode value");
286         _bt_core_set_bt_status(BT_FLIGHT_MODE, bt_flight_mode);
287
288         if (vconf_get_int(BT_OFF_DUE_TO_POWER_SAVING_MODE, &bt_ps_mode))
289                 BT_ERR("Fail get power saving mode value");
290         _bt_core_set_bt_status(BT_POWER_SAVING_MODE, bt_ps_mode);
291
292         if (flight_mode == TRUE)
293                 __bt_core_handle_adapter_with_flight_mode(flight_mode);
294 #ifndef ENABLE_TIZEN_2_4
295         else if (power_saving_mode > 0)
296                 __bt_core_handle_adapter_with_power_saving_mode(power_saving_mode);
297 #endif
298         else
299                 BT_ERR("");
300 }
301
302 void _bt_core_handle_flight_mode_noti(void)
303 {
304 #ifdef TIZEN_BT_FLIGHTMODE_ENABLED
305         int ret;
306
307         BT_DBG("+");
308
309         ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
310                         (vconf_callback_fn)__bt_core_flight_mode_cb, NULL);
311         if (ret < 0)
312                 BT_ERR("Unable to register key handler");
313 #else
314         BT_DBG("Telephony is disabled");
315 #endif
316 }
317
318 void _bt_core_handle_power_saving_mode_noti(void)
319 {
320 #ifndef TIZEN_WEARABLE
321         int ret = 0;
322
323         BT_DBG("+");
324 #ifdef ENABLE_TIZEN_2_4
325         ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE,
326                         (vconf_callback_fn)__bt_core_power_saving_mode_cb, NULL);
327 #endif
328         if (ret < 0)
329                 BT_ERR("Unable to register key handler");
330 #endif
331 }
332
333 void _bt_core_unregister_vconf_handler(void)
334 {
335 #ifdef TIZEN_BT_FLIGHTMODE_ENABLED
336         vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
337                         (vconf_callback_fn)__bt_core_flight_mode_cb);
338 #endif
339
340 #ifndef TIZEN_WEARABLE
341 #ifdef ENABLE_TIZEN_2_4
342         vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE,
343                         (vconf_callback_fn)__bt_core_power_saving_mode_cb);
344 #endif
345 #endif
346
347         return;
348 }
349