Initialize Tizen 2.3
[apps/connectivity/bt-connection-popup.git] / src / bt-connection-view.c
1 /*
2 * bt-connection-popup
3 *
4 * Copyright 2012 Samsung Electronics Co., Ltd
5 *
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 *           Injun Yang <injun.yang@samsung.com>
8 *           Seungyoun Ju <sy39.ju@samsung.com>
9 *
10 * Licensed under the Flora License, Version 1.1 (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.tizenopensource.org/license
15 *
16 * Unless required by applicable law or agreed to in writing,
17 * software 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
25 #include "bt-connection-main.h"
26 #include "bt-connection-view.h"
27 #include "bt-connection-string.h"
28 #include "bt-connection-handler.h"
29 #include "bt-connection-ipc.h"
30
31
32 static void __bt_draw_popup(bt_app_data_t *ad,
33                         const char *title, const char *msg, char *btn1_text,
34                         char *btn2_text, void (*func) (void *data,
35                         Evas_Object *obj, void *event_info))
36 {
37         Evas_Object *btn1;
38         Evas_Object *btn2;
39         Evas_Object *scroller;
40         Evas_Object *label;
41         char *txt;
42
43         DBG("+");
44
45         ad->popup = elm_popup_add(ad->window);
46         evas_object_size_hint_weight_set(ad->popup, EVAS_HINT_EXPAND,
47                         EVAS_HINT_EXPAND);
48
49         if (title != NULL)
50                 elm_object_part_text_set(ad->popup, "title,text", title);
51
52         if (msg != NULL) {
53                 scroller = elm_scroller_add(ad->popup);
54                 elm_object_style_set(scroller, "effect");
55                 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
56                                 EVAS_HINT_EXPAND);
57                 elm_object_content_set(ad->popup, scroller);
58                 evas_object_show(scroller);
59
60                 label = elm_label_add(scroller);
61                 elm_object_style_set(label, "popup/default");
62                 elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
63
64                 txt = elm_entry_utf8_to_markup(msg);
65                 elm_object_text_set(label, txt);
66                 free(txt);
67
68                 evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND,
69                                 EVAS_HINT_EXPAND);
70                 evas_object_size_hint_align_set(label, EVAS_HINT_FILL,
71                                 EVAS_HINT_FILL);
72                 elm_object_content_set(scroller, label);
73         }
74
75         if ((btn1_text != NULL) && (btn2_text != NULL)) {
76                 btn1 = elm_button_add(ad->popup);
77                 elm_object_style_set(btn1, "popup");
78                 elm_object_text_set(btn1, btn1_text);
79                 elm_object_part_content_set(ad->popup, "button1", btn1);
80                 evas_object_smart_callback_add(btn1, "clicked", func, ad);
81
82                 btn2 = elm_button_add(ad->popup);
83                 elm_object_style_set(btn2, "popup");
84                 elm_object_text_set(btn2, btn2_text);
85                 elm_object_part_content_set(ad->popup, "button2", btn2);
86                 evas_object_smart_callback_add(btn2, "clicked", func, ad);
87         } else if (btn1_text != NULL) {
88                 btn1 = elm_button_add(ad->popup);
89                 elm_object_style_set(btn1, "popup");
90                 elm_object_text_set(btn1, btn1_text);
91                 elm_object_part_content_set(ad->popup, "button1", btn1);
92                 evas_object_smart_callback_add(btn1, "clicked", func, ad);
93         }
94
95         evas_object_show(ad->popup);
96         evas_object_show(ad->window);
97         elm_object_focus_set(ad->popup, EINA_TRUE);
98
99         DBG("-");
100 }
101
102
103 static void __bt_draw_connect_popup(bt_app_data_t *ad,
104                         const char *msg, char *btn_text,
105                         void (*func) (void *data,
106                         Evas_Object *obj, void *event_info))
107 {
108         Evas_Object *btn;
109         Evas_Object *icon;
110         Evas_Object *scroller;
111         Evas_Object *label;
112         Evas_Object *bg;
113         Evas_Object *layout;
114         Evas_Object *default_ly;
115         Evas_Object *scroller_layout;
116         char *txt;
117
118         DBG("+");
119
120         bg = elm_bg_add(ad->window);
121         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
122         elm_win_resize_object_add(ad->window, bg);
123         evas_object_show(bg);
124
125         default_ly = elm_layout_add(bg);
126         elm_layout_theme_set(default_ly, "layout", "application", "default");
127         evas_object_size_hint_weight_set(default_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
128         elm_object_part_content_set(bg, "elm.swallow.content", default_ly);
129         evas_object_show(default_ly);
130
131         /* layout */
132         layout = elm_layout_add(default_ly);
133
134         elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "connect_popup");
135
136         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
137                                                 EVAS_HINT_EXPAND);
138
139         scroller = elm_scroller_add(layout);
140         elm_object_style_set(scroller, "effect");
141         evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
142                         EVAS_HINT_EXPAND);
143         evas_object_show(scroller);
144
145         scroller_layout = elm_layout_add(scroller);
146         elm_layout_file_set(scroller_layout, CUSTOM_POPUP_PATH, "connect_popup_scroller");
147         evas_object_size_hint_weight_set(scroller_layout, EVAS_HINT_EXPAND,
148                                                         EVAS_HINT_EXPAND);
149
150         icon = elm_image_add(scroller_layout);
151         elm_image_file_set(icon, CUSTOM_POPUP_PATH, BT_IMAGE_WATCH);
152         elm_object_part_content_set(scroller_layout, "elm.swallow.img.watch", icon);
153
154         icon = elm_image_add(scroller_layout);
155         elm_image_file_set(icon, CUSTOM_POPUP_PATH, BT_IMAGE_PHONE);
156         elm_object_part_content_set(scroller_layout, "elm.swallow.img.phone", icon);
157
158         label = elm_label_add(scroller_layout);
159         elm_object_style_set(label, "popup/default");
160         elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
161
162         txt = elm_entry_utf8_to_markup(msg);
163         elm_object_text_set(label, txt);
164         free(txt);
165         elm_object_part_content_set(scroller_layout, "elm.text.block", label);
166
167         evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
168         evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
169         elm_object_content_set(scroller, scroller_layout);
170
171         elm_object_part_content_set(layout, "scroller", scroller);
172
173         evas_object_show(layout);
174
175         if (btn_text != NULL) {
176                 btn = elm_button_add(layout);
177                 elm_object_text_set(btn, btn_text);
178                 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
179                 elm_object_part_content_set(layout, "btn", btn);
180                 evas_object_smart_callback_add(btn, "clicked", func, ad);
181         }
182
183         elm_object_part_content_set(default_ly, "elm.swallow.content", layout);
184         elm_object_content_set(ad->window, bg);
185
186         evas_object_show(ad->window);
187
188         DBG("-");
189 }
190
191 static void __bt_draw_connected_popup(bt_app_data_t *ad,
192                         const char *msg, void (*func) (void *data,
193                         Evas_Object *obj, void *event_info))
194 {
195         DBG("+");
196
197         Evas_Object *icon;
198         Evas_Object *scroller;
199         Evas_Object *label;
200         Evas_Object *bg;
201         Evas_Object *layout;
202         Evas_Object *default_ly;
203         Evas_Object *scroller_layout;
204         char *txt;
205
206         bg = elm_bg_add(ad->window);
207         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
208         elm_win_resize_object_add(ad->window, bg);
209         evas_object_show(bg);
210
211         default_ly = elm_layout_add(bg);
212         elm_layout_theme_set(default_ly, "layout", "application", "default");
213         evas_object_size_hint_weight_set(default_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
214         elm_object_part_content_set(bg, "elm.swallow.content", default_ly);
215         evas_object_show(default_ly);
216
217         /* layout */
218         layout = elm_layout_add(default_ly);
219
220         elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "connected_popup");
221
222         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
223                                                 EVAS_HINT_EXPAND);
224
225         scroller = elm_scroller_add(layout);
226         elm_object_style_set(scroller, "effect");
227         evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
228                         EVAS_HINT_EXPAND);
229         evas_object_show(scroller);
230
231         scroller_layout = elm_layout_add(scroller);
232         elm_layout_file_set(scroller_layout, CUSTOM_POPUP_PATH, "connected_popup_scroller");
233         evas_object_size_hint_weight_set(scroller_layout, EVAS_HINT_EXPAND,
234                                                         EVAS_HINT_EXPAND);
235
236         icon = elm_image_add(scroller_layout);
237         elm_image_file_set(icon, CUSTOM_POPUP_PATH, BT_IMAGE_WATCH);
238         elm_object_part_content_set(scroller_layout, "elm.swallow.img.watch", icon);
239
240         icon = elm_image_add(scroller_layout);
241         elm_image_file_set(icon, CUSTOM_POPUP_PATH, BT_IMAGE_PHONE);
242         elm_object_part_content_set(scroller_layout, "elm.swallow.img.phone", icon);
243
244         icon = elm_image_add(scroller_layout);
245         elm_image_file_set(icon, CUSTOM_POPUP_PATH, BT_IMAGE_ICON);
246         elm_object_part_content_set(scroller_layout, "elm.swallow.img.icon", icon);
247
248         icon = elm_image_add(scroller_layout);
249         elm_image_file_set(icon, CUSTOM_POPUP_PATH, BT_IMAGE_CONNECT);
250         elm_object_part_content_set(scroller_layout, "elm.swallow.img.dot1", icon);
251
252         icon = elm_image_add(scroller_layout);
253         elm_image_file_set(icon, CUSTOM_POPUP_PATH, BT_IMAGE_CONNECT);
254         elm_object_part_content_set(scroller_layout, "elm.swallow.img.dot2", icon);
255
256         label = elm_label_add(scroller_layout);
257         elm_object_style_set(label, "popup/default");
258         elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
259
260         txt = elm_entry_utf8_to_markup(msg);
261         elm_object_text_set(label, txt);
262         free(txt);
263         elm_object_part_content_set(scroller_layout, "elm.text.block", label);
264
265         evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
266         evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
267
268         elm_object_content_set(scroller, scroller_layout);
269
270         elm_object_part_content_set(layout, "scroller", scroller);
271
272         evas_object_show(layout);
273
274         elm_object_part_content_set(default_ly, "elm.swallow.content", layout);
275         elm_object_content_set(ad->window, bg);
276
277         evas_object_show(ad->window);
278
279         DBG("-");
280 }
281
282 static void __bt_connection_confirm_cb(void *data,
283                                          Evas_Object *obj, void *event_info)
284 {
285         if (obj == NULL || data == NULL)
286                 return;
287
288         bt_app_data_t *ad = (bt_app_data_t *)data;
289         const char *event = elm_object_text_get(obj);
290
291         if (!g_strcmp0(event, STR_OK)) {
292                 DBG("+ OK");
293                 _bt_destroy_app(ad);
294         } else {
295                 DBG("+ Connect");
296
297                 evas_object_del(obj);
298                 _bt_create_connecting_popup(ad);
299
300                 if (ad->initialize == FALSE) {
301                         ad->initialize = _bt_init(ad);
302                 }
303         }
304 }
305
306 static void __bt_connection_timeout_cb(void *data,
307                                 Evas_Object *obj, void *event_info)
308 {
309         bt_app_data_t *ad = NULL;
310         ad = (bt_app_data_t *)data;
311         if (ad == NULL) {
312                 ERR("Invalid param");
313                 return;
314         }
315
316         if (ad->timer) {
317                 ecore_timer_del(ad->timer);
318                 ad->timer = NULL;
319         }
320
321         _bt_create_connection_timeout_popup(ad);
322 }
323
324 static void __bt_connection_retry_cb(void *data,
325                                          Evas_Object *obj, void *event_info)
326 {
327         if (obj == NULL || data == NULL)
328                 return;
329
330         bt_app_data_t *ad = (bt_app_data_t *)data;
331         const char *event = elm_object_text_get(obj);
332
333         if (!g_strcmp0(event, STR_CANCEL)) {
334                 DBG("+ Cancel");
335                 _bt_destroy_app(ad);
336         } else {
337                 DBG("+ OK");
338
339                 evas_object_del(obj);
340                 _bt_create_connecting_popup(ad);
341
342                 if (ad->initialize == FALSE) {
343                         ad->initialize = _bt_init(ad);
344                 }
345         }
346 }
347
348 static void __bt_connecting_cancel_cb(void *data,
349                                          Evas_Object *obj, void *event_info)
350 {
351         if (obj == NULL || data == NULL)
352                 return;
353
354         bt_app_data_t *ad = (bt_app_data_t *)data;
355         const char *event = elm_object_text_get(obj);
356
357         if (!g_strcmp0(event, STR_CANCEL)) {
358                 DBG("+ Cancel");
359                 _bt_destroy_app(ad);
360         }
361 }
362
363 void _bt_create_connection_query_popup(bt_app_data_t *ad)
364 {
365         DBG("+");
366
367         int ret;
368         char *str = STR_UNABLE_REFRESH_APP_BT_DISCONNECTED;
369         char *value = NULL;
370
371         ret = service_get_extra_data(ad->service, "msg", &value);
372         if (ret == SERVICE_ERROR_NONE) {
373                 if (g_strcmp0(value, "refresh") == 0)
374                         str = STR_UNABLE_REFRESH_APP_BT_DISCONNECTED;
375                 else if (g_strcmp0(value, "perform") == 0) {
376                         str = STR_UNABLE_PERFORM_ACTION_BT_DISCONNECTED;}
377                 else if (g_strcmp0(value, "open") == 0)
378                         str = STR_UNABLE_OPEN_APP_BT_DISCONNECTED;
379
380                 free(value);
381         }
382
383         _bt_destroy_popup(ad);
384
385         __bt_draw_popup(ad, STR_TITLE_ERROR,
386                         str, STR_OK, STR_CONNECT,
387                         __bt_connection_confirm_cb);
388
389         DBG("-");
390 }
391
392 void _bt_create_connecting_popup(bt_app_data_t *ad)
393 {
394         DBG("+");
395
396         _bt_destroy_popup(ad);
397
398         __bt_draw_connect_popup(ad, STR_CONNECTING_BT,
399                 STR_CANCEL, __bt_connecting_cancel_cb);
400
401         ad->timer = ecore_timer_add(CONNECT_TIMEOUT,
402                         (Ecore_Task_Cb) __bt_connection_timeout_cb, ad);
403
404         DBG("-");
405 }
406
407 void _bt_create_connection_timeout_popup(bt_app_data_t *ad)
408 {
409         DBG("+");
410
411         _bt_destroy_popup(ad);
412
413         __bt_draw_popup(ad, STR_TITLE_ERROR,
414                 STR_CONNECTION_TIME_OUT_RETRY,
415                 STR_CANCEL, STR_OK,
416                 __bt_connection_retry_cb);
417
418         DBG("-");
419 }
420
421 void _bt_create_connected_popup(bt_app_data_t *ad)
422 {
423         DBG("+");
424
425         _bt_destroy_popup(ad);
426
427         __bt_draw_connected_popup(ad, STR_CONNECTED_BT, NULL);
428
429         DBG("-");
430 }
431
432 void _bt_update_connect_status_popup(bt_app_data_t *ad)
433 {
434         if (ad == NULL)
435                 return;
436
437         Evas_Object *layout;
438         Evas_Object *button;
439
440         layout = elm_object_content_get(ad->popup);
441         if (layout == NULL) {
442                 ERR("Unable to get object");
443                 return;
444         }
445         elm_object_part_text_set(layout, "elm.text.subtext", STR_CONNECTED_BT);
446
447         button = elm_object_part_content_get(ad->popup, "button1");
448         if (button) {
449                 evas_object_del(button);
450         }
451
452         evas_object_show(ad->popup);
453         evas_object_show(ad->window);
454 }
455
456 void _bt_destroy_popup(bt_app_data_t *ad)
457 {
458         if (ad == NULL)
459                 return;
460
461         DBG("");
462
463         if (ad->popup) {
464                 evas_object_del(ad->popup);
465                 ad->popup = NULL;
466         }
467 }
468
469 void _bt_clean_app(bt_app_data_t *ad)
470 {
471         if (ad == NULL)
472                 return;
473
474         DBG("+");
475
476         if (ad->timer) {
477                 ecore_timer_del(ad->timer);
478                 ad->timer = NULL;
479         }
480
481         if (ad->popup) {
482                 evas_object_del(ad->popup);
483                 ad->popup = NULL;
484         }
485
486         if (ad->window) {
487                 evas_object_del(ad->window);
488                 ad->window = NULL;
489         }
490 }
491
492 void _bt_destroy_app(bt_app_data_t *ad)
493 {
494         DBG("Terminate app");
495
496         _bt_clean_app(ad);
497
498         _bt_dbus_signal_deinit(ad);
499         _bt_unregister_vconf_handler();
500         _bt_deinit(ad);
501
502         elm_exit();
503 }
504