tizen 2.3 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 static Eina_Bool setting_security_engine_list_timer_cb(void *data);
52 //static void __security_exp_cb(void *data, Evas_Object *obj, void *event_info);
53 void __security_sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info);
54
55 #define SECURITY_ENGINE_NAME_MAX_LEN 128
56
57 #define SUPPORT_LOCKTYPE_IN_SECURITY_MENU 0
58 /* ***************************************************
59  **
60  **basic func
61  **
62  ****************************************************/
63
64 static int setting_security_main_create(void *cb)
65 {
66         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
67         SETTING_TRACE_BEGIN;
68         SettingSecurityUG *ad = (SettingSecurityUG *) cb;
69
70         Evas_Object *scroller;
71
72         int ret = 0;
73         int value = 0;
74         int err = 0;
75
76         gboolean b_status = FALSE;
77         int tapi_ret;
78
79         /* add basic layout */
80         char setBtnStr[MAX_DISPLAY_NAME_LEN_ON_UI];
81         snprintf(setBtnStr, sizeof(setBtnStr), "%s",
82                  (char *)dgettext("sys_string", "IDS_COM_BODY_BACK"));
83         ad->ly_main =
84             setting_create_layout_navi_bar_genlist(ad->win_main_layout,
85                                                    ad->win_get,
86                                                    "IDS_ST_BODY_SECURITY",
87                                                    setBtnStr, NULL,
88                                                    (setting_call_back_func)setting_security_main_click_softkey_back_cb,
89                                                    NULL, ad, &scroller,
90                                                    &ad->navi_bar);
91
92         //setting_enable_expandable_genlist(scroller, ad, __security_exp_cb, NULL);
93
94         Elm_Object_Item *item = NULL;
95
96         ADD_GL_SEPARATOR(scroller);
97         (void)setting_create_Gendial_field_titleItem(scroller,
98                                                      &itc_group_item,
99                                                      "IDS_ST_BODY_PHONE_SECURITY", NULL);
100         /* SIM settings */
101         item = elm_genlist_item_append(scroller, &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
102         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
103
104         ad->data_sim_settings = 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,SECURITY_SIM_SETTINGS, 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         }
123         else {
124                 item = elm_genlist_item_append(scroller, &itc_seperator, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
125                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
126                 ad->data_security_update = setting_create_Gendial_field_def(scroller, &(ad->itc_1text_1icon),
127                                                                 setting_security_main_mouse_up_Gendial_list_cb, ad,
128                                                                 SWALLOW_Type_INVALID,
129                                                                 NULL, NULL,
130                                                                 value,_(SECURITY_UPDATE_TEXT), NULL, NULL);
131
132                 if (app_info_destroy(app_info) != 0) {
133                         SETTING_TRACE_ERROR("app_info_destroy error for org.tizen.msa");
134                 }
135         }
136         ADD_GL_SEPARATOR(scroller);
137
138         /* update info */
139         if(ad->data_sim_settings)
140         {
141                 if((ad->handle == NULL) || (isEmulBin() == TRUE))
142                 {
143                         setting_disable_genlist_item(ad->data_sim_settings->item);
144                 }
145                 else
146                 {
147                         ret = setting_get_int_slp_key(INT_SLP_SETTING_SIM_SLOT, &value, &err);
148                         tapi_ret = tel_check_modem_power_status(ad->handle, &b_status);
149                         if((tapi_ret != TAPI_API_SUCCESS)
150                                 || (b_status != TAPI_PHONE_POWER_STATUS_ON)
151                                 || (value != VCONFKEY_TELEPHONY_SIM_INSERTED))
152                         {
153                                 setting_disable_genlist_item(ad->data_sim_settings->item);
154                         }
155                         TelSimCardType_t cardInfo;
156                         tapi_ret = tel_get_sim_type(ad->handle, &cardInfo);
157                         if(tapi_ret == TAPI_API_SIM_PERM_BLOCKED)
158                                 setting_disable_genlist_item(ad->data_sim_settings->item);
159                 }
160
161                 /* If flight mode is ON, can't use sim settings menu */
162                 int status = 0;
163                 vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &status);
164                 if(status == 1)
165                         setting_disable_genlist_item(ad->data_sim_settings->item);
166         }
167
168         setting_view_security_main.is_create = 1;
169
170         g_ad = (SettingSecurityUG *) malloc(sizeof(SettingSecurityUG) *1);
171         retv_if(!g_ad, -1);
172         memcpy(g_ad, ad, sizeof(SettingSecurityUG));
173
174         vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
175                                 setting_security_main_vconf_change_cb, ad);
176         vconf_notify_key_changed(VCONFKEY_WIFI_STATE,
177                                 setting_security_main_vconf_change_cb, ad);
178
179         SETTING_TRACE_END;
180         return SETTING_RETURN_SUCCESS;
181 }
182
183 static int setting_security_main_destroy(void *cb)
184 {
185         SETTING_TRACE_BEGIN;
186         /* error check */
187         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
188
189         SettingSecurityUG *ad = (SettingSecurityUG *) cb;
190 #if SUPPORT_ENCRYPTION
191         if(ad->popup_sd_card_encryption)
192         {
193                 evas_object_del(ad->popup_sd_card_encryption);
194                 ad->popup_sd_card_encryption = NULL;
195         }
196 #endif
197         if(ad->update_view_timer)
198         {
199                 ecore_timer_del(ad->update_view_timer);
200                 ad->update_view_timer = NULL;
201         }
202         if(ad->get_security_list_timer)
203         {
204                 ecore_timer_del(ad->get_security_list_timer);
205                 ad->get_security_list_timer = NULL;
206         }
207         if(ad->remove_sim_popup_timer)
208         {
209                 ecore_timer_del(ad->remove_sim_popup_timer);
210                 ad->remove_sim_popup_timer = NULL;
211         }
212         if(ad->tapi_async_cb_check_timer)
213         {
214                 ecore_timer_del(ad->tapi_async_cb_check_timer);
215                 ad->tapi_async_cb_check_timer = NULL;
216         }
217
218         vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
219                                  setting_security_main_vconf_change_cb);
220         vconf_ignore_key_changed(VCONFKEY_WIFI_STATE,
221                                  setting_security_main_vconf_change_cb);
222         if(ad->secrity_engine_list) {
223                 g_list_free(ad->secrity_engine_list);
224         }
225         if (ad->ly_main != NULL) {
226                 evas_object_del(ad->ly_main);
227
228                 FREE(g_ad);
229         }
230
231         setting_view_security_main.is_create = 0;
232
233         return SETTING_RETURN_SUCCESS;
234 }
235
236 static int setting_security_main_update(void *cb)
237 {
238         SETTING_TRACE_BEGIN;
239         /* error check */
240         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
241         SettingSecurityUG *ad = (SettingSecurityUG *) cb;
242
243         evas_object_show(ad->ly_main);
244
245         return SETTING_RETURN_SUCCESS;
246 }
247
248 static int setting_security_main_cleanup(void *cb)
249 {
250         SETTING_TRACE_BEGIN;
251         /* error check */
252         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
253
254         return SETTING_RETURN_SUCCESS;
255 }
256
257 /* ***************************************************
258  **
259  **call back func
260  **
261  ****************************************************/
262 static Eina_Bool
263 setting_security_main_click_softkey_back_cb(void *data, Elm_Object_Item *it)
264 {
265         SETTING_TRACE_BEGIN;
266         /* error check */
267         retvm_if(data == NULL, EINA_FALSE, "[Setting > Security] Data parameter is NULL");
268
269         SettingSecurityUG *ad = (SettingSecurityUG *) data;
270
271         bool is_running = 0;
272         app_manager_is_running("gr47by21a5.SamsungAccount", &is_running);
273         if(is_running && ad->samsung_account_is_running)        // If samsung account is running from Find my mobile, security ug can't be destroyed.
274         {
275                 return EINA_FALSE;
276         }
277         if(ad->ug_mt)   // If find my mobile ug is running, security ug can't be destroyed.
278         {
279                 return EINA_FALSE;
280         }
281
282         /* Send destroy request */
283         ug_destroy_me(ad->ug);
284         return EINA_TRUE;
285 }
286
287 int _handle_sim_exception(void *data, int sim_status)
288 {
289         retv_if(data == NULL, SETTING_RETURN_FAIL);
290
291         SettingSecurityUG *ad = (SettingSecurityUG *) data;
292
293         switch (sim_status) {
294                 case VCONFKEY_TELEPHONY_SIM_INSERTED:
295                         break;
296
297                 case VCONFKEY_TELEPHONY_SIM_NOT_PRESENT:
298
299                         setting_create_simple_popup(NULL, ad->win_get,
300                                                     NULL, _(SECURITY_SIM_NOT_PRESENT_MSG));
301                         SETTING_TRACE_DEBUG
302                             ("%s*** [ERR] INCORRECTED SIM. sim_slot_type=%d ***%s",
303                              SETTING_FONT_RED, sim_status, SETTING_FONT_BLACK);
304                         return SETTING_RETURN_FAIL;
305
306                         break;
307
308                 case VCONFKEY_TELEPHONY_SIM_CARD_ERROR:
309                 case VCONFKEY_TELEPHONY_SIM_UNKNOWN:
310
311                         setting_create_simple_popup(NULL, ad->win_get,
312                                                     NULL, _("IDS_COM_BODY_INVALID_SIM_CARD"));
313                         SETTING_TRACE_DEBUG
314                             ("%s*** [ERR] INCORRECTED SIM. sim_slot_type=%d ***%s",
315                              SETTING_FONT_RED, sim_status, SETTING_FONT_BLACK);
316                         return SETTING_RETURN_FAIL;
317
318                         break;
319                 default:
320                         break;
321         }
322         return SETTING_RETURN_SUCCESS;
323 }
324
325 static Eina_Bool __remove_sim_popup_cb(void *data)
326 {
327         SETTING_TRACE_BEGIN;
328         retv_if(data == NULL, EINA_FALSE);
329         SettingSecurityUG *ad = (SettingSecurityUG *)data;
330
331         if(ad->sim_popup)
332         {
333                 evas_object_del(ad->sim_popup);
334                 ad->sim_popup = NULL;
335         }
336         ad->remove_sim_popup_timer = NULL;
337         return EINA_FALSE;
338 }
339
340 static Eina_Bool _check_tapi_async_cb_is_called(void *data)
341 {
342         SETTING_TRACE_BEGIN;
343         retv_if(data == NULL, EINA_FALSE);
344
345         SettingSecurityUG *ad = (SettingSecurityUG *)data;
346
347         if(!ad->enter_tapi_async_cb_flag)
348         {
349                 ad->sim_popup = setting_create_popup_without_btn(ad, ad->win_get,
350                                                                                 NULL, _(KeyStr_Security_Waiting_Sim),
351                                                                                 (setting_call_back_func)__remove_sim_popup_cb,
352                                                                                 0, FALSE, FALSE);
353                 ad->remove_sim_popup_timer = ecore_timer_add(1, __remove_sim_popup_cb, ad);
354         }
355         ad->tapi_async_cb_check_timer = NULL;
356
357         return EINA_FALSE;
358 }
359
360 static void
361 setting_security_main_mouse_up_Gendial_list_cb(void *data, Evas_Object *obj,
362                                                void *event_info)
363 {
364         SETTING_TRACE_BEGIN;
365         /* error check */
366         setting_retm_if(data == NULL, "Data parameter is NULL");
367
368         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
369         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
370         elm_genlist_item_selected_set(item, 0);
371         Setting_GenGroupItem_Data *list_item =
372             (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
373
374         SettingSecurityUG *ad = (SettingSecurityUG *) data;
375
376         SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
377
378         if(!safeStrCmp(SECURITY_SIM_SETTINGS, list_item->keyStr)) {
379                 ad->enter_tapi_async_cb_flag = 0;
380                 ad->sim_popup = NULL;
381                 ad->tapi_async_cb_check_timer = ecore_timer_add(0.5, _check_tapi_async_cb_is_called, ad);
382
383                 if (TAPI_API_SUCCESS != tel_get_sim_facility(ad->handle, TAPI_SIM_LOCK_SC, setting_security_pin_get_facility_cb, ad)) {
384                         SETTING_TRACE_ERROR("*** [ERR] tel_get_sim_facility(pin1). ***");
385                 }
386
387                 if(tel_get_sim_lock_info(ad->handle, TAPI_SIM_LOCK_FD, setting_security_pin2_get_lock_info_cb, ad) != 0)
388                 {
389                         SETTING_TRACE_ERROR("failed to call tel_get_sim_lock_info()");
390                 }
391         }
392         else if(!safeStrCmp(_(SECURITY_UPDATE_TEXT), list_item->keyStr))
393         {
394                 setting_view_change(&setting_view_security_main, &setting_view_security_update, ad);
395         }
396 }
397
398 void setting_security_main_vconf_change_cb(keynode_t *key, void *data)
399 {
400         SETTING_TRACE_BEGIN;
401         //ret_if(NULL == data);
402         //SettingSecurityUG *ad = (SettingSecurityUG *) data;
403 }