Fix N_SE-17884,N_SE-13031,N_SE-13756,N_SE-17900 .
[apps/core/preloaded/settings.git] / setting-about / src / setting-about.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
6  * Contact: MyoungJune Park <mj2004.park@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 /**
23  *@defgroup setting-about
24  *UG creation code for setting-about
25  *
26  * - Device Info
27  *  - Name
28  *  - My number
29  *    - Get info from SIM card and display it.
30  *    - if there's no phone number, it shows 'unavailable'.
31  *  - Model
32  *  - Version
33  *  - Bluetooth
34  *  - Wi-Fi
35  *  - Battery
36  *  - CPU usage
37  *  - Software update
38  *  - Certificates
39  */
40 #include <setting-about.h>
41 #include <setting-about-main.h>
42
43 #ifndef UG_MODULE_API
44 #define UG_MODULE_API __attribute__ ((visibility("default")))
45 #endif
46
47 /**
48 * Event process when the sizeof UG view changes
49 *
50 * @param data
51 * @param e
52 * @param obj
53 * @param event_info
54 */
55 static void setting_about_ug_cb_resize(void *data, Evas *e, Evas_Object *obj,
56                                        void *event_info)
57 {
58         SettingAboutUG *ad = (SettingAboutUG *) data;
59         setting_view_update(&setting_view_about_main, ad);
60 }
61
62 /**
63 * on_create function of the UG
64 *
65 * @param ug
66 * @param mode
67 * @param data
68 * @param priv
69 *
70 * @return
71 */
72 static void *setting_about_ug_on_create(ui_gadget_h ug, enum ug_mode mode,
73                                         service_h service, void *priv)
74 {
75         SETTING_TRACE_BEGIN;
76         setting_retvm_if((NULL == priv), NULL, "NULL == priv");
77         SettingAboutUG *aboutUG = priv;
78         aboutUG->ug = ug;
79
80         aboutUG->win_main_layout = (Evas_Object *) ug_get_parent_layout(ug);
81         aboutUG->win_get = (Evas_Object *) ug_get_window();
82         evas_object_show(aboutUG->win_main_layout);
83         aboutUG->evas = evas_object_evas_get(aboutUG->win_main_layout);
84
85         setting_retvm_if(aboutUG->win_main_layout == NULL, NULL,
86                          "cannot get main window ");
87
88         setting_set_i18n(SETTING_PACKAGE, SETTING_LOCALEDIR);
89
90         /* register view node table */
91         setting_view_node_table_intialize();
92         setting_view_node_table_register(&setting_view_about_main, NULL);
93
94         /* setting_view_node_table_register(&setting_view_about_about_view, &setting_view_about_main); */
95
96         /*  creating a view. */
97         setting_create_Gendial_itc("dialogue/1text", &(aboutUG->itc_1text));
98         setting_create_Gendial_itc("dialogue/multiline/2text", &(aboutUG->itc_2text_2));
99         setting_create_Gendial_itc("dialogue/title", &(aboutUG->itc_group_item));
100         setting_create_Gendial_itc("dialogue/2text.3/expandable", &(aboutUG->itc_2text_3_parent));
101         setting_create_Gendial_itc("dialogue/1text.1icon/expandable2", &(aboutUG->itc_1icon_1text_sub));
102         setting_create_Gendial_itc("multiline/1text", &(aboutUG->itc_help_style));
103
104         aboutUG->itc_seperator.item_style = "dialogue/separator";
105         aboutUG->itc_seperator.func.text_get = NULL;
106         aboutUG->itc_seperator.func.content_get = NULL;
107         aboutUG->itc_seperator.func.state_get = NULL;
108         aboutUG->itc_seperator.func.del = NULL;
109
110         setting_view_node_set_cur_view(&setting_view_about_main);
111         setting_view_create(&setting_view_about_main, (void *)aboutUG);
112         evas_object_event_callback_add(aboutUG->win_main_layout, EVAS_CALLBACK_RESIZE, setting_about_ug_cb_resize, aboutUG);
113
114         aboutUG->popup_showed_flag = FALSE;
115         return aboutUG->ly_main;
116 }
117
118 static void setting_about_ug_on_start(ui_gadget_h ug, service_h service,
119                                       void *priv)
120 {
121 }
122
123 static void setting_about_ug_on_pause(ui_gadget_h ug, service_h service,
124                                       void *priv)
125 {
126         SETTING_TRACE_BEGIN;
127         SettingAboutUG *SettingAboutUG = priv;
128         SettingAboutUG->pause_flag = TRUE;
129 }
130
131 static void setting_about_ug_on_resume(ui_gadget_h ug, service_h service,
132                                        void *priv)
133 {
134         SETTING_TRACE_BEGIN;
135         setting_retm_if((!priv), "!priv");
136         SettingAboutUG *aboutUG = priv;
137         aboutUG->pause_flag = FALSE;
138
139         char str[MAX_DISPLAY_STR_LEN_ON_PHONE_INFO] = { 0, };
140
141         memset(str, 0x00, MAX_DISPLAY_STR_LEN_ON_PHONE_INFO);
142         if(aboutUG->item_data_wifi)
143         {
144                 setting_about_main_get_wifi_mac_address_string(str, MAX_DISPLAY_STR_LEN_ON_PHONE_INFO);
145                 aboutUG->item_data_wifi->sub_desc = (char*)g_strdup(str);
146                 elm_object_item_data_set(aboutUG->item_data_wifi->item, aboutUG->item_data_wifi);
147                 elm_genlist_item_update(aboutUG->item_data_wifi->item);
148         }
149         memset(str, 0x00, MAX_DISPLAY_STR_LEN_ON_PHONE_INFO);
150         if(aboutUG->item_data_bt)
151         {
152                 setting_about_main_get_bluetooth_address_string(str, MAX_DISPLAY_STR_LEN_ON_PHONE_INFO);
153                 aboutUG->item_data_bt->sub_desc = (char*)g_strdup(str);
154                 elm_object_item_data_set(aboutUG->item_data_bt->item, aboutUG->item_data_bt);
155                 elm_genlist_item_update(aboutUG->item_data_bt->item);
156         }
157 }
158
159 /**
160 * on_destroy function of the UG
161 *
162 * @param ug
163 * @param data
164 * @param priv
165 */
166 static void setting_about_ug_on_destroy(ui_gadget_h ug, service_h service,
167                                         void *priv)
168 {
169         SETTING_TRACE_BEGIN;
170         setting_retm_if((!priv), "!priv");
171         SettingAboutUG *aboutUG = priv;
172
173         evas_object_event_callback_del(aboutUG->win_main_layout, EVAS_CALLBACK_RESIZE, setting_about_ug_cb_resize);     /* fix flash issue for gallery */
174         aboutUG->ug = ug;
175
176         /*  delete the allocated objects. */
177         setting_view_destroy(&setting_view_about_main, aboutUG);
178         if (NULL != ug_get_layout(aboutUG->ug)) {
179                 evas_object_hide((Evas_Object *) ug_get_layout(aboutUG->ug));
180                 evas_object_del((Evas_Object *) ug_get_layout(aboutUG->ug));
181         }
182
183         SETTING_TRACE_END;
184 }
185
186 static void setting_about_ug_on_message(ui_gadget_h ug, service_h msg,
187                                         service_h service, void *priv)
188 {
189         SETTING_TRACE_BEGIN;
190 }
191
192 static void setting_about_ug_on_event(ui_gadget_h ug, enum ug_event event,
193                                       service_h service, void *priv)
194 {
195         SETTING_TRACE_BEGIN;
196         switch (event) {
197         case UG_EVENT_LOW_MEMORY:
198                 break;
199         case UG_EVENT_LOW_BATTERY:
200                 break;
201         case UG_EVENT_LANG_CHANGE:
202                 break;
203         case UG_EVENT_ROTATE_PORTRAIT:
204                 break;
205         case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
206                 break;
207         case UG_EVENT_ROTATE_LANDSCAPE:
208                 break;
209         case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
210                 break;
211         case UG_EVENT_REGION_CHANGE:
212                 break;
213         default:
214                 break;
215         }
216 }
217
218 static void setting_about_ug_on_key_event(ui_gadget_h ug,
219                                           enum ug_key_event event,
220                                           service_h service, void *priv)
221 {
222         SETTING_TRACE_BEGIN;
223         SettingAboutUG *ad = (SettingAboutUG *) priv;
224         if (!ug)
225                 return;
226
227         switch (event) {
228         case UG_KEY_EVENT_END:
229                 {
230                         if (elm_naviframe_top_item_get(ad->navi_bar) ==
231                            elm_naviframe_bottom_item_get(ad->navi_bar)) {
232                                 ug_destroy_me(ug);
233                         } else {
234                                 /* elm_naviframe_item_pop(ad->navi_bar); */
235                                 setting_view_cb_at_endKey(ad);
236                         }
237                 }
238                 break;
239         default:
240                 break;
241         }
242 }
243
244 static void __about_gl_sel_expand(void *data, Evas_Object *obj,
245                                    void *event_info)
246 {
247         /* SETTING_TRACE_BEGIN; */
248         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
249         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
250         elm_genlist_item_selected_set(item, 0);
251         bool status = !elm_genlist_item_expanded_get(item);
252         elm_genlist_item_expanded_set(item, status);
253 }
254
255 /**
256  * @see __on_sim_get_msisdn (caller)
257  */
258 Eina_Bool __insert_item_idler(void *data)
259 {
260         SETTING_TRACE_BEGIN;
261         retv_if(!data, FALSE);
262         SettingAboutUG *ad = data;
263         if (ad->item_dev_name) //the genlist exists already.
264         {
265                 SETTING_TRACE("Beging to insert items...");
266                 // [UI] My number
267                 int err;
268                 char sel_num[TAPI_SIM_XDN_DIALING_NUMBER_LEN + 1] = { 0, };
269                 setting_get_string_slp_key(STR_SLP_SETTING_SELECT_NUM, sel_num, &err);
270
271                 Setting_GenGroupItem_Data *item_data = NULL;
272                 if (ad->my_numbers.count == 1) {
273                         item_data = calloc(1, sizeof(Setting_GenGroupItem_Data));
274                         setting_retvm_if(!item_data, FALSE, "calloc item_data failed");
275                         item_data->keyStr = (char *)g_strdup("IDS_ST_BODY_MY_NUMBER");
276                         item_data->sub_desc = (char *)g_strdup(sel_num);
277                         item_data->swallow_type = SWALLOW_Type_INVALID;
278
279                         item_data->item = elm_genlist_item_insert_after(ad->genlsit, &(ad->itc_2text_2),
280                                                               item_data, NULL,
281                                                               ad->item_dev_name->item,
282                                                               ELM_GENLIST_ITEM_NONE,
283                                                               NULL, NULL);
284                         elm_genlist_item_select_mode_set(item_data->item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
285
286                 } else if (ad->my_numbers.count > 1) {
287                         setting_enable_expandable_genlist(ad->genlsit, ad,
288                                                   setting_about_main_exp_cb, NULL);
289                         item_data = calloc(1, sizeof(Setting_GenGroupItem_Data));
290                         setting_retvm_if(!item_data, FALSE, "calloc item_data failed");
291                         item_data->keyStr = (char *)g_strdup("IDS_ST_BODY_MY_NUMBER");
292                         item_data->sub_desc = (char *)g_strdup(sel_num);
293                         item_data->swallow_type = SWALLOW_Type_INVALID;
294
295                         item_data->int_slp_setting_binded = STR_SLP_SETTING_SELECT_NUM;
296                         item_data->item = elm_genlist_item_insert_after(ad->genlsit, &(ad->itc_2text_3_parent),
297                                                               item_data, NULL,
298                                                               ad->item_dev_name->item,
299                                                               ELM_GENLIST_ITEM_TREE,
300                                                               __about_gl_sel_expand, NULL);
301                 }
302         }
303
304         return FALSE;
305 }
306
307 /**
308  * called at initialization of About UG
309  * @see tel_get_sim_msisdn
310  */
311 static void __on_sim_get_msisdn(TapiHandle *handle, int result, void *data, void *user_data)
312 {
313         SETTING_TRACE_BEGIN;
314         ret_if(!user_data || !data);
315         SettingAboutUG *ad = user_data;
316         TelSimAccessResult_t access_rt = result;
317         //TelSimMsisdnList_t *list = data;
318         int i =0;
319
320         SETTING_TRACE("access_rt[%d]", access_rt);
321
322         //#define TEST
323         #ifndef TEST
324         memcpy(&(ad->my_numbers), data, sizeof(TelSimMsisdnList_t));
325         #else
326         TelSimMsisdnList_t r_numbers;
327         r_numbers.count = 3;
328         safeCopyStr(r_numbers.list[0].name, "n1", 30);
329         safeCopyStr(r_numbers.list[1].name, "n2", 30);
330         safeCopyStr(r_numbers.list[2].name, "n3", 30);
331         safeCopyStr(r_numbers.list[0].num, "1111111111", 30);
332         safeCopyStr(r_numbers.list[1].num, "2222222222", 30);
333         safeCopyStr(r_numbers.list[2].num, "3333333333", 30);
334         memcpy(&(ad->my_numbers), &r_numbers, sizeof(TelSimMsisdnList_t));
335         #endif
336
337         int err;
338         char sel_num[TAPI_SIM_XDN_DIALING_NUMBER_LEN + 1] = { 0, };
339         setting_get_string_slp_key(STR_SLP_SETTING_SELECT_NUM, sel_num, &err);
340
341         bool isFound = FALSE;
342         SETTING_TRACE("ad->my_numbers.count[%d]", ad->my_numbers.count);
343
344         for (i = 0; i < ad->my_numbers.count && i < SETTING_ABOUT_MY_NUMBERS_LEN; i++) {
345                 SETTING_TRACE("index[%d] - name[%s], num[%s]", i, ad->my_numbers.list[i].name, ad->my_numbers.list[i].num);
346                 if (0 == safeStrCmp(sel_num, ad->my_numbers.list[i].num)) {
347                         isFound = TRUE;
348                 }
349         }
350         if (!isFound && ad->my_numbers.count > 0) {//if not found, set as the first num of returned-list
351                 SETTING_TRACE("Selected-num hasn't been found, to let the first one as defalut one");
352                 setting_set_string_slp_key(STR_SLP_SETTING_SELECT_NUM, ad->my_numbers.list[0].num, &err);
353         }
354
355         ad->tapi_responsed = TRUE;
356         if (ad->popup) {
357                 evas_object_del(ad->popup);
358                 ad->popup = NULL;
359         }
360         setting_about_generate_genlist((void *)ad);
361 }
362
363 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
364 {
365         SETTING_TRACE_BEGIN;
366         SettingAboutUG *aboutUG = calloc(1, sizeof(SettingAboutUG));
367         setting_retvm_if(!aboutUG, -1, "Create SettingAboutUG obj failed");
368
369         ops->create = setting_about_ug_on_create;
370         ops->start = setting_about_ug_on_start;
371         ops->pause = setting_about_ug_on_pause;
372         ops->resume = setting_about_ug_on_resume;
373         ops->destroy = setting_about_ug_on_destroy;
374         ops->message = setting_about_ug_on_message;
375         ops->event = setting_about_ug_on_event;
376         ops->key_event = setting_about_ug_on_key_event;
377         ops->priv = aboutUG;
378         ops->opt = UG_OPT_INDICATOR_ENABLE;
379
380         // init aboutUG
381
382         int err = 0;
383         int value;
384         setting_get_int_slp_key(INT_SLP_SETTING_SIM_SLOT, &value, &err);
385         if (VCONFKEY_TELEPHONY_SIM_INSERTED == value)//There is a sim card, so do display to user
386         {
387                 aboutUG->handle = tel_init(NULL);
388
389
390                 SETTING_TRACE("aboutUG->handle:%p", aboutUG->handle);
391                 if (aboutUG->handle) {
392                         SETTING_TRACE("tel_init sucessed, and there is at least one sim card, now trying to get misidns");
393                         if (tel_get_sim_msisdn(aboutUG->handle, __on_sim_get_msisdn, aboutUG) == TAPI_API_SUCCESS) {
394                                 SETTING_TRACE("tel_get_sim_msisdn sent");
395                         }
396                 }
397         }
398         else
399         {
400                 SETTING_TRACE_DEBUG("There is no sim card, so skip getting misidns");
401         }
402         return 0;
403 }
404
405 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
406 {
407         SETTING_TRACE_BEGIN;
408         SettingAboutUG *aboutUG;
409         setting_retm_if(!ops, "ops == NULL");
410
411         aboutUG = ops->priv;
412         if (aboutUG) {
413                 if (aboutUG->handle
414                     && tel_deinit(aboutUG->handle) == TAPI_API_SUCCESS) {
415                         SETTING_TRACE("tel_deinit sucessed");
416                 }
417                 FREE(aboutUG);
418         }
419 }
420
421 /* ***************************************************
422  **
423  **general func
424  **
425  ****************************************************/
426 void setting_about_layout_ug_cb(ui_gadget_h ug, enum ug_mode mode,
427                                   void *priv)
428 {
429         SettingAboutUG *ad = (SettingAboutUG *) priv;
430         Evas_Object *base;
431
432         if (!priv)
433                 return;
434         SETTING_TRACE_BEGIN;
435
436         base = (Evas_Object *) ug_get_layout(ug);
437         if (!base)
438                 return;
439
440         switch (mode) {
441         case UG_MODE_FULLVIEW:
442                 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
443                                                  EVAS_HINT_EXPAND);
444                 elm_win_resize_object_add(ad->win_get, base);
445                 evas_object_show(base);
446                 break;
447         default:
448                 break;
449         }
450
451         SETTING_TRACE_END;
452 }
453
454 static void __setting_about_sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info)
455 {
456         SETTING_TRACE_BEGIN;
457         /* error check */
458         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
459         Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
460         Elm_Object_Item *parentItem = elm_genlist_item_parent_get(subitem);
461         elm_genlist_item_selected_set(subitem, 0);
462         Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
463         Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);      /* parent data */
464         ret_if(NULL == data_subItem || NULL == data_parentItem);
465
466
467         int err;
468         setting_set_string_slp_key(data_parentItem->int_slp_setting_binded, data_subItem->keyStr, &err);
469         setting_retm_if(0 != err, "Set vconf error[%d]",data_parentItem->int_slp_setting_binded);
470
471         data_parentItem->sub_desc = (char *)g_strdup(_(data_subItem->keyStr));
472         elm_object_item_data_set(data_parentItem->item, data_parentItem);
473         elm_genlist_item_update(data_parentItem->item);
474         elm_radio_value_set(data_subItem->rgd, data_subItem->chk_status);
475 }
476
477 static void __setting_about_sub_list_rd_change(void *data, Evas_Object *obj, void *event_info)
478
479 {
480         SETTING_TRACE_BEGIN;
481         retm_if(data == NULL, "Data parameter is NULL");
482         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
483
484         Elm_Object_Item *subItem = list_item->item;
485         Elm_Object_Item *parentItem = elm_genlist_item_parent_get(subItem);
486
487         Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subItem);    /* subItem data */
488         Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);      /* parent data */
489         ret_if(NULL == data_subItem || NULL == data_parentItem);
490
491         int err;
492         setting_set_string_slp_key(data_parentItem->int_slp_setting_binded, data_subItem->keyStr, &err);
493
494         ret_if(0 != err);
495         data_parentItem->sub_desc = (char *)g_strdup(_(data_subItem->keyStr));
496         elm_object_item_data_set(data_parentItem->item, data_parentItem);
497         elm_genlist_item_update(data_parentItem->item);
498         elm_radio_value_set(obj, data_subItem->chk_status);
499 }
500
501 void setting_about_main_exp_cb(void *data, Evas_Object *obj, void *event_info)
502 {
503         SETTING_TRACE_BEGIN;
504         setting_retm_if(data == NULL, "Data parameter is NULL");
505         setting_retm_if(event_info == NULL, "event_info parameter is NULL");
506
507         SettingAboutUG *ad = (SettingAboutUG *) data;
508         Elm_Object_Item *parentItem = event_info;       /* parent item */
509         Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);
510         Evas_Object *scroller = elm_object_item_widget_get(parentItem);
511
512         Evas_Object *rgd = elm_radio_add(scroller);
513         elm_radio_value_set(rgd, -1);
514
515         int err;
516         char sel_num[TAPI_SIM_XDN_DIALING_NUMBER_LEN + 1] = { 0, };
517         setting_get_string_slp_key(data_parentItem->int_slp_setting_binded, sel_num, &err);
518         SETTING_TRACE("binded: %d, checked: %s, err: %d", data_parentItem->int_slp_setting_binded, sel_num, err);
519
520         int i = 0;
521         int sel_idx = -1;
522         Setting_GenGroupItem_Data *item_data = NULL;
523
524         for(; i < ad->my_numbers.count; i++) {
525                 if (ad->my_numbers.list[i].num == NULL) {
526                         break;
527                 }
528
529                 if (sel_idx == -1 && 0 == safeStrCmp(sel_num, ad->my_numbers.list[i].num)) {
530                         sel_idx = i;
531                 }
532                 item_data = setting_create_Gendial_exp_sub_field(scroller,
533                                         &(ad->itc_1icon_1text_sub),
534                                         __setting_about_sub_list_sel_cb, ad, parentItem,
535                                         SWALLOW_Type_1RADIO, rgd,
536                                         i,
537                                         ad->my_numbers.list[i].num, __setting_about_sub_list_rd_change);
538                 if (item_data) {
539                         item_data->userdata = ad;
540                 } else {
541                         SETTING_TRACE_ERROR("item_data is NULL");
542                 }
543         }
544
545         elm_radio_value_set(rgd, sel_idx);
546 }
547
548
549 /**
550 * Reset function to 'reset' the settings of the UG, it will be invoked by 'Reset' UG
551 *
552 * @param[in] data
553 * @param[in] priv
554 */
555 UG_MODULE_API int setting_plugin_reset(service_h service, void *priv)
556 {
557         SETTING_TRACE_BEGIN;
558 #if SUPPORT_RUN_SYSTEM_COMMAND
559         return excuteCmd(SETTING_POSTINST_FILE, 1, "about");
560 #else
561         return vconf_set_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR, SETTING_ABOUT_DEFAULT_DEVICE_NAME);
562 #endif
563 }
564
565