tizen 2.4 release
[apps/home/settings.git] / setting-security / src / setting-security-main.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 #include <setting-common-data-type.h>
23 #include <setting-common-data-slp-setting.h>
24 #include <setting-common-draw-widget.h>
25 #include <setting-common-view.h>
26
27 #include <setting-security-main.h>
28 #include <setting-debug.h>
29 #include <app.h>
30 #if SUPPORT_ENCRYPTION
31 #include <ode.h>
32 #endif
33
34 static int setting_security_main_create(void *cb);
35 static int setting_security_main_destroy(void *cb);
36 static int setting_security_main_update(void *cb);
37 static int setting_security_main_cleanup(void *cb);
38
39 setting_view setting_view_security_main = {
40         .create = setting_security_main_create,
41         .destroy = setting_security_main_destroy,
42         .update = setting_security_main_update,
43         .cleanup = setting_security_main_cleanup,
44 };
45
46 static Eina_Bool setting_security_main_click_softkey_back_cb(void *data, Elm_Object_Item *it);
47 static void setting_security_main_mouse_up_Gendial_list_cb(void *data,
48                                                            Evas_Object *obj,
49                                                            void *event_info);
50
51 void __security_sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info);
52
53 #define SECURITY_ENGINE_NAME_MAX_LEN 128
54
55 #define SUPPORT_LOCKTYPE_IN_SECURITY_MENU 0
56 /* ***************************************************
57  **
58  **basic func
59  **
60  ****************************************************/
61
62 static int setting_security_main_create(void *cb)
63 {
64         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
65         SETTING_TRACE_BEGIN;
66         SettingSecurityUG *ad = (SettingSecurityUG *) cb;
67
68         Evas_Object *scroller;
69
70         int ret = 0;
71         int value = 0;
72         int err = 0;
73
74         gboolean b_status = FALSE;
75         int tapi_ret;
76
77         /* add basic layout */
78         char setBtnStr[MAX_DISPLAY_NAME_LEN_ON_UI];
79         snprintf(setBtnStr, sizeof(setBtnStr), "%s",
80                  (char *)dgettext("sys_string", "IDS_ST_BUTTON_BACK"));
81         ad->ly_main =
82             setting_create_layout_navi_bar_genlist(ad->win_main_layout,
83                                                    ad->win_get,
84                                                    KeyStr_LockScreen,
85                                                    setBtnStr, NULL,
86                                                    (setting_call_back_func)setting_security_main_click_softkey_back_cb,
87                                                    NULL, ad, &scroller,
88                                                    &ad->navi_bar);
89
90         /*setting_enable_expandable_genlist(scroller, ad, __security_exp_cb, NULL); */
91
92         Elm_Object_Item *item = NULL;
93
94         ADD_GL_SEPARATOR(scroller);
95
96         /* Group List: Lock screen */
97         (void)setting_create_Gendial_field_titleItem(scroller,
98                                                      &itc_group_item,
99                                                      KeyStr_LockScreen, NULL);
100         item = elm_genlist_item_append(scroller, &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
101         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
102
103         /* Lockscreen */
104         setting_create_Gendial_field_def(scroller, &(ad->itc_1text),
105                                          setting_security_main_mouse_up_Gendial_list_cb, ad,
106                                          SWALLOW_Type_INVALID,
107                                          NULL, NULL,
108                                          0, KeyStr_LockScreen, NULL, NULL);
109
110         /*Seperator */
111         elm_genlist_item_select_mode_set(elm_genlist_item_append(scroller, &(itc_seperator), NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL),
112                                          ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
113
114         /*Security update*/
115         app_info_h app_info = NULL;
116         /* replace deprecated API :
117                                         from app_manager_get_app_info()
118                                         to app_info_create()                    */
119         ret = app_info_create("org.tizen.msa", &app_info);
120         if (ret != APP_MANAGER_ERROR_NONE) {
121                 SETTING_TRACE("No corresponding app_id for [%s]\n", "org.tizen.msa");
122         } else {
123                 item = elm_genlist_item_append(scroller, &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
124                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
125                 ad->data_security_update = setting_create_Gendial_field_def(scroller, &(ad->itc_1text_1icon),
126                                                                             setting_security_main_mouse_up_Gendial_list_cb, ad,
127                                                                             SWALLOW_Type_INVALID,
128                                                                             NULL, NULL,
129                                                                             value, _(SECURITY_UPDATE_TEXT), NULL, NULL);
130
131                 if (app_info_destroy(app_info) != 0) {
132                         SETTING_TRACE_ERROR("app_info_destroy error for org.tizen.msa");
133                 }
134         }
135         ADD_GL_SEPARATOR(scroller);
136
137         /* update info */
138         if (ad->data_sim_settings) {
139                 if ((ad->handle == NULL) || (isEmulBin() == TRUE)) {
140                         setting_disable_genlist_item(ad->data_sim_settings->item);
141                 } else {
142                         ret = setting_get_int_slp_key(INT_SLP_SETTING_SIM_SLOT, &value, &err);
143                         tapi_ret = tel_check_modem_power_status(ad->handle, &b_status);
144                         if ((tapi_ret != TAPI_API_SUCCESS)
145                             || (b_status != TAPI_PHONE_POWER_STATUS_ON)
146                             || (value != VCONFKEY_TELEPHONY_SIM_INSERTED)) {
147                                 setting_disable_genlist_item(ad->data_sim_settings->item);
148                         }
149                         TelSimCardType_t cardInfo;
150                         tapi_ret = tel_get_sim_type(ad->handle, &cardInfo);
151                         if (tapi_ret == TAPI_API_SIM_PERM_BLOCKED)
152                                 setting_disable_genlist_item(ad->data_sim_settings->item);
153                 }
154
155                 /* If flight mode is ON, can't use sim settings menu */
156                 int status = 0;
157                 vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &status);
158                 if (status == 1)
159                         setting_disable_genlist_item(ad->data_sim_settings->item);
160         }
161
162         setting_view_security_main.is_create = 1;
163
164         g_ad = (SettingSecurityUG *) malloc(sizeof(SettingSecurityUG)*1);
165         retv_if(!g_ad, -1);
166         memcpy(g_ad, ad, sizeof(SettingSecurityUG));
167
168         vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
169                                  setting_security_main_vconf_change_cb, ad);
170         vconf_notify_key_changed(VCONFKEY_WIFI_STATE,
171                                  setting_security_main_vconf_change_cb, ad);
172
173         SETTING_TRACE_END;
174         return SETTING_RETURN_SUCCESS;
175 }
176
177 static int setting_security_main_destroy(void *cb)
178 {
179         SETTING_TRACE_BEGIN;
180         /* error check */
181         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
182
183         SettingSecurityUG *ad = (SettingSecurityUG *) cb;
184 #if SUPPORT_ENCRYPTION
185         if (ad->popup_sd_card_encryption) {
186                 evas_object_del(ad->popup_sd_card_encryption);
187                 ad->popup_sd_card_encryption = NULL;
188         }
189 #endif
190         if (ad->update_view_timer) {
191                 ecore_timer_del(ad->update_view_timer);
192                 ad->update_view_timer = NULL;
193         }
194         if (ad->get_security_list_timer) {
195                 ecore_timer_del(ad->get_security_list_timer);
196                 ad->get_security_list_timer = NULL;
197         }
198         if (ad->remove_sim_popup_timer) {
199                 ecore_timer_del(ad->remove_sim_popup_timer);
200                 ad->remove_sim_popup_timer = NULL;
201         }
202         if (ad->tapi_async_cb_check_timer) {
203                 ecore_timer_del(ad->tapi_async_cb_check_timer);
204                 ad->tapi_async_cb_check_timer = NULL;
205         }
206
207         vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
208                                  setting_security_main_vconf_change_cb);
209         vconf_ignore_key_changed(VCONFKEY_WIFI_STATE,
210                                  setting_security_main_vconf_change_cb);
211         if (ad->secrity_engine_list) {
212                 g_list_free(ad->secrity_engine_list);
213         }
214         if (ad->ly_main != NULL) {
215                 evas_object_del(ad->ly_main);
216
217                 FREE(g_ad);
218         }
219
220         setting_view_security_main.is_create = 0;
221
222         return SETTING_RETURN_SUCCESS;
223 }
224
225 static int setting_security_main_update(void *cb)
226 {
227         SETTING_TRACE_BEGIN;
228         /* error check */
229         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
230         SettingSecurityUG *ad = (SettingSecurityUG *) cb;
231
232         evas_object_show(ad->ly_main);
233
234         return SETTING_RETURN_SUCCESS;
235 }
236
237 static int setting_security_main_cleanup(void *cb)
238 {
239         SETTING_TRACE_BEGIN;
240         /* error check */
241         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
242
243         return SETTING_RETURN_SUCCESS;
244 }
245
246 /* ***************************************************
247  **
248  **call back func
249  **
250  ****************************************************/
251 static Eina_Bool
252 setting_security_main_click_softkey_back_cb(void *data, Elm_Object_Item *it)
253 {
254         SETTING_TRACE_BEGIN;
255         /* error check */
256         retvm_if(data == NULL, EINA_FALSE, "[Setting > Security] Data parameter is NULL");
257
258         SettingSecurityUG *ad = (SettingSecurityUG *) data;
259
260         bool is_running = 0;
261         app_manager_is_running("gr47by21a5.SamsungAccount", &is_running);
262         if (is_running && ad->samsung_account_is_running) {     /* If samsung account is running from Find my mobile, security ug can't be destroyed. */
263                 return EINA_FALSE;
264         }
265         if (ad->ug_mt) {        /* If find my mobile ug is running, security ug can't be destroyed. */
266                 return EINA_FALSE;
267         }
268
269         /* Send destroy request */
270         ug_destroy_me(ad->ug);
271         return EINA_TRUE;
272 }
273
274 int _handle_sim_exception(void *data, int sim_status)
275 {
276         retv_if(data == NULL, SETTING_RETURN_FAIL);
277
278         SettingSecurityUG *ad = (SettingSecurityUG *) data;
279
280         switch (sim_status) {
281                 case VCONFKEY_TELEPHONY_SIM_INSERTED:
282                         break;
283
284                 case VCONFKEY_TELEPHONY_SIM_NOT_PRESENT:
285
286                         setting_create_popup(NULL, ad->win_get,
287                                                     NULL, _(SECURITY_SIM_NOT_PRESENT_MSG), NULL, 0, false, false, 0);
288                         SETTING_TRACE_DEBUG
289                         ("%s*** [ERR] INCORRECTED SIM. sim_slot_type=%d ***%s",
290                          SETTING_FONT_RED, sim_status, SETTING_FONT_BLACK);
291                         return SETTING_RETURN_FAIL;
292
293                         break;
294
295                 case VCONFKEY_TELEPHONY_SIM_CARD_ERROR:
296                 case VCONFKEY_TELEPHONY_SIM_UNKNOWN:
297
298                         setting_create_popup(NULL, ad->win_get,
299                                                     NULL, _("IDS_SIM_BODY_INVALID_SIM_CARD"), NULL, 0, false, false, 0);
300                         SETTING_TRACE_DEBUG
301                         ("%s*** [ERR] INCORRECTED SIM. sim_slot_type=%d ***%s",
302                          SETTING_FONT_RED, sim_status, SETTING_FONT_BLACK);
303                         return SETTING_RETURN_FAIL;
304
305                         break;
306                 default:
307                         break;
308         }
309         return SETTING_RETURN_SUCCESS;
310 }
311
312 static Eina_Bool __remove_sim_popup_cb(void *data)
313 {
314         SETTING_TRACE_BEGIN;
315         retv_if(data == NULL, EINA_FALSE);
316         SettingSecurityUG *ad = (SettingSecurityUG *)data;
317
318         if (ad->sim_popup) {
319                 evas_object_del(ad->sim_popup);
320                 ad->sim_popup = NULL;
321         }
322         ad->remove_sim_popup_timer = NULL;
323         return EINA_FALSE;
324 }
325
326 static Eina_Bool _check_tapi_async_cb_is_called(void *data)
327 {
328         SETTING_TRACE_BEGIN;
329         retv_if(data == NULL, EINA_FALSE);
330
331         SettingSecurityUG *ad = (SettingSecurityUG *)data;
332
333         if (!ad->enter_tapi_async_cb_flag) {
334                 ad->sim_popup = setting_create_popup(ad, ad->win_get,
335                                                      NULL, KeyStr_Security_Waiting_Sim,
336                                                      (setting_call_back_func)__remove_sim_popup_cb,
337                                                      0, FALSE, FALSE, 0);
338                 ad->remove_sim_popup_timer = ecore_timer_add(1, __remove_sim_popup_cb, ad);
339         }
340         ad->tapi_async_cb_check_timer = NULL;
341
342         return EINA_FALSE;
343 }
344
345 Eina_Bool __freeze_event_timer_cb(void *cb)
346 {
347         SETTING_TRACE_BEGIN;
348         retv_if(cb == NULL, EINA_FALSE);
349
350         SettingSecurityUG *ad = (SettingSecurityUG *)cb;
351
352         evas_object_freeze_events_set(ad->navi_bar, EINA_FALSE);
353         ad->update_view_timer = NULL;
354         return EINA_FALSE;
355 }
356
357 void setting_security_lockscreen_layout_ug_cb(ui_gadget_h ug,
358                                               enum ug_mode mode,
359                                               void *priv)
360 {
361         SETTING_TRACE_BEGIN;
362         Evas_Object *base;
363
364         if (!priv)
365                 return;
366
367         base = (Evas_Object *) ug_get_layout(ug);
368         if (!base)
369                 return;
370
371         switch (mode) {
372                 case UG_MODE_FULLVIEW:
373                         evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
374                                                          EVAS_HINT_EXPAND);
375                         evas_object_show(base);
376                         break;
377                 default:
378                         break;
379         }
380         SETTING_TRACE_END;
381 }
382
383 static void setting_security_lockscreen_destroy_ug_cb(ui_gadget_h ug, void *priv)
384 {
385         SETTING_TRACE_BEGIN;
386         ret_if(priv == NULL);
387         SettingSecurityUG *ad = (SettingSecurityUG *) priv;
388         if (ug) {
389                 setting_ug_destroy(ug);
390         }
391         elm_genlist_realized_items_update(ad->genlist);
392 }
393
394 static void
395 setting_security_main_mouse_up_Gendial_list_cb(void *data, Evas_Object *obj,
396                                                void *event_info)
397 {
398         SETTING_TRACE_BEGIN;
399         /* error check */
400         setting_retm_if(data == NULL, "Data parameter is NULL");
401
402         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
403         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
404         elm_genlist_item_selected_set(item, 0);
405         Setting_GenGroupItem_Data *list_item =
406             (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
407         setting_retm_if(NULL == list_item, "list_item is NULL");
408
409         SettingSecurityUG *ad = (SettingSecurityUG *) data;
410
411         SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
412
413         if (!safeStrCmp(KeyStr_LockScreen, list_item->keyStr)) {
414 #if 0
415                 int window_id = elm_win_xwindow_get(ad->win_get);
416                 if (0 == app_launcher("lockscreen-options")) {
417                         ad->update_view_timer = ecore_timer_add(1, __freeze_event_timer_cb, ad);
418                         evas_object_freeze_events_set(ad->navi_bar, EINA_TRUE);
419                 }
420 #else
421                 retm_if(data == NULL, "Data parameter is NULL");
422
423                 SettingSecurityUG *ad = (SettingSecurityUG *) data;
424
425                 struct ug_cbs *cbs = (struct ug_cbs *)calloc(1, sizeof(struct ug_cbs));
426                 setting_retm_if(!cbs, "calloc failed");
427                 cbs->layout_cb = setting_security_lockscreen_layout_ug_cb;
428                 cbs->result_cb = NULL;
429                 cbs->destroy_cb = setting_security_lockscreen_destroy_ug_cb;
430                 cbs->priv = (void *)ad;
431
432                 elm_object_tree_focus_allow_set(ad->ly_main, EINA_FALSE);
433
434                 SETTING_TRACE("To load ug[%s]", "lockscreen-options");
435                 setting_ug_create(ad->ug, "lockscreen-options", UG_MODE_FULLVIEW, NULL, cbs);
436                 FREE(cbs);
437 #endif
438         }
439 }
440
441 void setting_security_main_vconf_change_cb(keynode_t *key, void *data)
442 {
443         SETTING_TRACE_BEGIN;
444         /*ret_if(NULL == data); */
445         /*SettingSecurityUG *ad = (SettingSecurityUG *) data; */
446 }