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