tizen 2.4 release
[apps/home/settings.git] / setting-password / src / setting-password-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-password.h>
23 #include <setting-password-main.h>
24 #include <setting-common-data-slp-setting.h>
25 #include <setting-debug.h>
26 #include <dd-haptic.h>
27 #if SUPPORT_ENCRYPTION
28 #include <ode.h>
29 #endif
30 #include <Ecore_IMF.h>
31 #include <Ecore_IMF_Evas.h>
32 #include <Ecore_X.h>
33 #include <Ecore.h>
34 #include <utilX.h>
35 #include <time.h>
36 #include <notification.h>
37
38
39 void __add_help_of_password_fails(int ret, SettingPasswordUG *ad);
40
41 static int setting_password_main_create(void *cb);
42 static int setting_password_main_destroy(void *cb);
43 static int setting_password_main_update(void *cb);
44 static int setting_password_main_cleanup(void *cb);
45
46
47 setting_view setting_view_password_main = {
48         .create = setting_password_main_create,
49         .destroy = setting_password_main_destroy,
50         .update = setting_password_main_update,
51         .cleanup = setting_password_main_cleanup,
52 };
53
54
55 static void setting_password_main_done_password(void *data);
56 static int __count_string(const char *str, int *cnt_letter, int *cnt_digit, int *cnt_sym);
57
58 extern struct _pw_item pw_its[];
59
60 /* ***************************************************
61  *
62  *basic func
63  *
64  ***************************************************/
65
66 static Eina_Bool setting_password_main_click_softkey_cancel_cb(void *data, Elm_Object_Item *it)
67 {
68         SETTING_TRACE_BEGIN;
69         /* error check */
70         retvm_if(data == NULL, EINA_FALSE, "[Setting > Password] Data parameter is NULL");
71
72         SettingPasswordUG *ad = (SettingPasswordUG *) data;
73
74         /* if IME is displayed, hide IME. or Destroy password ug. */
75         elm_object_focus_set(ad->ed_pw1->eo_check, EINA_FALSE);
76
77         if (ad->focus_timer) {
78                 ecore_timer_del(ad->focus_timer);
79                 ad->focus_timer = NULL;
80         }
81
82         /* send result : Cancel */
83         app_control_h svc;
84         if (app_control_create(&svc) == 0) {
85                 app_control_add_extra_data(svc, "result", "Cancel");
86                 ug_send_result(ad->ug, svc);
87                 SETTING_TRACE("Send Result : %s\n", "Cancel");
88
89                 app_control_destroy(svc);
90         }
91         /* Send destroy request */
92         ug_destroy_me(ad->ug);
93
94         return EINA_TRUE;
95 }
96
97 Eina_Bool __rotate_cb(void *data)
98 {
99         /* error check */
100         SETTING_TRACE_BEGIN;
101         retv_if(data == NULL, FALSE);
102
103         SettingPasswordUG *ad = (SettingPasswordUG *) data;
104
105         /*SETTING_TRACE_DEBUG("category : 0x%x", pw_its[ad->view_type].category);*/
106
107         /* it can manage the cursor self */
108         if (ad->ed_pw1 && ad->ed_pw1->eo_check) {
109                 SETTING_TRACE_DEBUG("set focus on first entry");
110                 /* no matter how many edifileds, it only need focus on 1st editfiled */
111                 elm_object_focus_set(ad->ed_pw1->eo_check, EINA_TRUE);
112                 elm_entry_cursor_end_set(ad->ed_pw1->eo_check);
113         }
114
115         ad->focus_timer = NULL;
116
117         return ECORE_CALLBACK_CANCEL;
118 }
119
120 static int setting_password_main_create(void *cb)
121 {
122         SETTING_TRACE_BEGIN;
123         /* error check */
124         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
125
126         SettingPasswordUG *ad = (SettingPasswordUG *) cb;
127
128         ad->ly_main = setting_create_layout_navi_bar_genlist(ad->win_main_layout, ad->win_get, "IDS_ST_BODY_PASSWORD",
129                                                              _("IDS_ST_BUTTON_BACK"),
130                                                              NULL,
131                                                              (setting_call_back_func)setting_password_main_click_softkey_cancel_cb,
132                                                              NULL,
133                                                              ad,
134                                                              &(ad->scroller),
135                                                              &(ad->navi_bar));
136
137         ad->navi_it = elm_naviframe_top_item_get(ad->navi_bar);
138
139         ad->bottom_btn = elm_box_add(ad->navi_bar);
140         elm_box_padding_set(ad->bottom_btn, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10));
141         elm_box_horizontal_set(ad->bottom_btn, EINA_TRUE);
142         evas_object_size_hint_weight_set(ad->bottom_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
143         evas_object_size_hint_align_set(ad->bottom_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
144         evas_object_show(ad->bottom_btn);
145         elm_box_pack_end(ad->navi_bar, ad->bottom_btn);
146
147         /* button 1 */
148         Evas_Object *btn = elm_button_add(ad->bottom_btn);
149         elm_object_style_set(btn, "bottom");
150         elm_object_text_set(btn, _("IDS_ST_BUTTON_CANCEL"));
151         evas_object_smart_callback_add(btn, "clicked", setting_password_main_click_softkey_cancel_cb, ad);
152         evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
153         evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.5);
154         evas_object_show(btn);
155         elm_box_pack_end(ad->bottom_btn, btn);
156
157         /* button 2 */
158         ad->bottom_btn1 = elm_button_add(ad->bottom_btn);
159         elm_object_style_set(ad->bottom_btn1, "bottom");
160         if (ad->view_type == SETTING_PW_TYPE_SET_PASSWORD) {
161                 elm_object_text_set(ad->bottom_btn1, _("IDS_ST_BUTTON_CONTINUE"));
162                 evas_object_smart_callback_add(ad->bottom_btn1, "clicked", setting_password_main_click_softkey_continue_cb, ad);
163         } else {
164                 elm_object_text_set(ad->bottom_btn1, _("IDS_SA_BUTTON_DONE_ABB"));
165                 evas_object_smart_callback_add(ad->bottom_btn1, "clicked", setting_password_main_click_softkey_done_cb, ad);
166         }
167         evas_object_size_hint_weight_set(ad->bottom_btn1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
168         evas_object_size_hint_align_set(ad->bottom_btn1, EVAS_HINT_FILL, 0.5);
169         evas_object_show(ad->bottom_btn1);
170         elm_box_pack_end(ad->bottom_btn, ad->bottom_btn1);
171
172         elm_object_item_part_content_set(ad->navi_it, "toolbar", ad->bottom_btn);
173         ADD_GL_SEPARATOR(ad->scroller)
174
175         ad->cur_step = 1;
176         setting_password_main_draw_1line_password(ad, NULL);
177
178         /* Disable Done button if exist */
179         elm_object_disabled_set(ad->bottom_btn1, EINA_TRUE);
180         elm_object_focus_allow_set(ad->bottom_btn1, EINA_FALSE);
181
182         ad->focus_timer = ecore_timer_add(0.5, __rotate_cb, ad);
183
184         setting_view_password_main.is_create = 1;
185
186         SETTING_TRACE_END;
187         return SETTING_RETURN_SUCCESS;
188 }
189
190 static int setting_password_main_destroy(void *cb)
191 {
192         SETTING_TRACE_BEGIN;
193         /* error check */
194         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
195
196         SettingPasswordUG *ad = (SettingPasswordUG *) cb;
197
198         FREE(ad->step1_str);
199
200         if (ad->remove_timer) {
201                 ecore_timer_del(ad->remove_timer);
202                 ad->remove_timer = NULL;
203         }
204
205         if (ad->focus_timer) {
206                 ecore_timer_del(ad->focus_timer);
207                 ad->focus_timer = NULL;
208         }
209
210         if (ad->notify) {
211                 evas_object_del(ad->notify);
212                 ad->notify = NULL;
213         }
214
215         if (ad->ly_main != NULL) {
216                 evas_object_del(ad->ly_main);
217                 ad->ly_main = NULL;
218         }
219
220         setting_view_password_main.is_create = 0;
221         SETTING_TRACE_END;
222         return SETTING_RETURN_SUCCESS;
223 }
224
225 static int setting_password_main_update(void *cb)
226 {
227         SETTING_TRACE_BEGIN;
228         /* error check */
229         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
230
231         SettingPasswordUG *ad = (SettingPasswordUG *) cb;
232
233         if (ad->ly_main != NULL) {
234                 evas_object_show(ad->ly_main);
235         }
236         return SETTING_RETURN_SUCCESS;
237 }
238
239 static int setting_password_main_cleanup(void *cb)
240 {
241         /* error check */
242         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
243
244         SettingPasswordUG *ad = (SettingPasswordUG *) cb;
245
246         if (ad->ly_main != NULL) {
247                 evas_object_hide(ad->ly_main);
248         }
249
250         return SETTING_RETURN_SUCCESS;
251 }
252
253 /* ***************************************************
254  *
255  *general func
256  *
257  ***************************************************/
258
259 static void
260 setting_password_main_entry_changed_cb(void *data, Evas_Object *obj,
261                                        void *event_info)
262 {
263         SETTING_TRACE_BEGIN;
264         retm_if(data == NULL, "[Setting > Password] Data parameter is NULL");
265         retm_if(obj == NULL, "[Setting > Password] Data parameter is NULL");
266         Setting_GenGroupItem_Data *list_item =
267             (Setting_GenGroupItem_Data *) data;
268         SettingPasswordUG *ad = (SettingPasswordUG *) list_item->userdata;
269         const char *entry_str = elm_entry_entry_get(obj);
270         list_item->sub_desc = (char *)g_strdup(entry_str);
271         bool isFoundEmptyEntry = FALSE;
272
273         do {
274                 if (ad->ed_pw1) {
275                         entry_str = ad->ed_pw1->sub_desc;
276                         if (NULL == entry_str || '\0' == entry_str[0]) {
277                                 isFoundEmptyEntry = TRUE;
278                                 elm_object_item_signal_emit(ad->ed_pw1->item, "elm,state,eraser,hide", "");
279                                 break;
280                         } else {
281                                 elm_object_item_signal_emit(ad->ed_pw1->item, "elm,state,eraser,show", "");
282                                 break;
283                         }
284                 }
285         } while (0);
286
287         Eina_Bool item_disabled = elm_object_item_disabled_get(list_item->item);
288         if (item_disabled)
289                 return;
290
291         /* For disable toolbar (done) item */
292         bool disableFlag = isFoundEmptyEntry;
293         if (ad->ed_pw1 && ad->ed_pw1->eo_check && (safeStrLen(elm_entry_entry_get(ad->ed_pw1->eo_check)) < 4))
294                 disableFlag = TRUE;
295
296 #if SUPPORT_BOTTOM_BTNS
297         if (disableFlag) {
298                 elm_object_disabled_set(ad->bottom_btn1, EINA_TRUE);
299                 elm_entry_input_panel_return_key_disabled_set(obj, EINA_TRUE);
300         } else {
301                 elm_object_disabled_set(ad->bottom_btn1, EINA_FALSE);
302                 elm_entry_input_panel_return_key_disabled_set(obj, EINA_FALSE);
303         }
304 #else
305         elm_object_item_disabled_set(elm_toolbar_last_item_get(ad->controllbar), disableFlag);
306 #endif
307
308 }
309
310 static void __reached_max_pwlength_cb(void *data, Evas_Object *obj, void *event_info)
311 {
312         SETTING_TRACE_BEGIN;
313         retm_if(data == NULL, "Data parameter is NULL");
314         retm_if(!elm_object_focus_get(obj), "Entry is not focused");/*notify only when entry is being focused on. */
315
316         int err = 0;
317
318         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
319         SettingPasswordUG *ad = (SettingPasswordUG *) list_item->userdata;
320
321         /* Display help text. */
322         char temp[128] = {0,};
323         snprintf(temp, 128, _(PW_ST_PW_MAX_LENGTH_HELP), list_item->limit_filter_data->max_char_count);
324         setting_password_ug_display_desc(ad, temp, FALSE);
325 }
326
327 static void __entry_activated_cb(void *data, Evas_Object *obj, void *event_info)
328 {
329         SETTING_TRACE_BEGIN;
330         retm_if(data == NULL, "Data parameter is NULL");
331
332         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
333         SettingPasswordUG *ad = (SettingPasswordUG *) list_item->userdata;
334
335         if (ad->bottom_btn) {
336                 if (elm_object_disabled_get(ad->bottom_btn1) == EINA_FALSE) {
337                         /* call done cb. */
338                         if (ad->view_type == SETTING_PW_TYPE_SET_PASSWORD && ad->cur_step == 1) {
339                                 /* Save first input */
340                                 ad->step1_str = (char *)strdup(ad->ed_pw1->sub_desc);
341
342                                 /* Check step1_str : more than 4, not all digits */
343                                 int letter = 0;
344                                 int digit = 0;
345                                 int symbol = 0;
346                                 __count_string(ad->step1_str, &letter, &digit, &symbol);
347                                 if (safeStrLen(ad->step1_str) == digit) {
348                                         __add_help_of_password_fails(SETTING_PW_ERROR_INCLUDE_NO_LETTER, ad);
349                                         FREE(ad->step1_str);
350                                         return;
351                                 }
352
353                                 setting_password_main_clear_1line_password(ad);
354                                 if (ad->err_desc && ad->err_desc->item) {
355                                         elm_object_item_del(ad->err_desc->item);
356                                         ad->err_desc = NULL;
357                                 }
358
359                                 /* Change entry title : PW_SHORT_GUIDE_CONFIRM */
360                                 FREE(ad->ed_pw1->keyStr);
361                                 ad->ed_pw1->keyStr = (char *)strdup(PW_SHORT_GUIDE_CONFIRM);
362                                 elm_genlist_item_fields_update(ad->ed_pw1->item, "elm.text.main", ELM_GENLIST_ITEM_FIELD_TEXT);
363
364
365                                 /* Change button */
366                                 elm_object_text_set(ad->bottom_btn1, _("IDS_SA_BUTTON_DONE_ABB"));
367                                 evas_object_smart_callback_add(ad->bottom_btn1, "clicked", setting_password_main_click_softkey_done_cb, ad);
368                                 elm_object_disabled_set(ad->bottom_btn1, EINA_TRUE);
369                                 elm_entry_input_panel_return_key_disabled_set(obj, EINA_TRUE);
370                                 ad->cur_step++;
371                         } else {
372                                 setting_password_main_done_password(ad);
373                         }
374                 }
375         }
376 }
377
378 static void __entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
379 {
380         SETTING_TRACE_BEGIN;
381         retm_if(data == NULL, "Data parameter is NULL");
382
383         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
384         SettingPasswordUG *ad = (SettingPasswordUG *)list_item->userdata;
385
386         if (!elm_entry_is_empty(obj)) {
387                 elm_object_item_signal_emit(list_item->item, "elm,state,eraser,show", "");
388         }
389         elm_object_item_signal_emit(list_item->item, "elm,state,rename,hide", "");
390 }
391
392 static void __entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
393 {
394         SETTING_TRACE_BEGIN;
395         retm_if(data == NULL, "Data parameter is NULL");
396         retm_if(obj == NULL, "Data parameter is NULL");
397
398         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
399
400         if (list_item->item) {
401                 elm_object_item_signal_emit(list_item->item, "elm,state,eraser,hide", "");
402                 elm_object_item_signal_emit(list_item->item, "elm,state,rename,show", "");
403         }
404 }
405
406 int setting_password_main_draw_1line_password(void *data, void *cb)
407 {
408         SETTING_TRACE_BEGIN;
409         /* error check */
410         retvm_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER,
411                  "[Setting > Password] Data parameter is NULL");
412
413         SettingPasswordUG *ad = (SettingPasswordUG *) data;
414
415         switch (ad->view_type) {
416                 case SETTING_PW_TYPE_PASSWORD:
417                         ad->ed_pw1 =
418                             setting_create_Gendial_field_editfield(ad->scroller,
419                                                                    &(itc_editfield),
420                                                                    NULL, ad,
421                                                                    SWALLOW_Type_LAYOUT_EDITFIELD,
422                                                                    "IDS_ST_BODY_PASSWORD",
423                                                                    NULL,
424                                                                    setting_password_main_entry_changed_cb,
425                                                                    __entry_focused_cb,
426                                                                    __entry_unfocused_cb,
427                                                                    __entry_activated_cb,
428                                                                    __reached_max_pwlength_cb,
429                                                                    ELM_INPUT_PANEL_LAYOUT_PASSWORD,
430                                                                    TRUE, TRUE,
431                                                                    SETTING_PW_UG_NORMAL_PASSWORD_MAX_LENGTH,
432                                                                    0, NULL, NULL);
433                         /* change return key type */
434                         if (ad->ed_pw1) {
435                                 ad->ed_pw1->return_key_type = ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE;
436                                 elm_entry_input_panel_return_key_type_set(ad->ed_pw1->eo_check, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
437                                 elm_object_focus_set(ad->ed_pw1->eo_check, EINA_TRUE);
438                         }
439
440                         break;
441                 case SETTING_PW_TYPE_SET_PASSWORD:
442                         ad->ed_pw1 =
443                             setting_create_Gendial_field_editfield(ad->scroller,
444                                                                    &(itc_editfield),
445                                                                    NULL, ad,
446                                                                    SWALLOW_Type_LAYOUT_EDITFIELD,
447                                                                    PW_SHORT_GUIDE_NEW,
448                                                                    NULL,
449                                                                    setting_password_main_entry_changed_cb,
450                                                                    __entry_focused_cb,
451                                                                    __entry_unfocused_cb,
452                                                                    __entry_activated_cb,
453                                                                    __reached_max_pwlength_cb,
454                                                                    ELM_INPUT_PANEL_LAYOUT_PASSWORD,
455                                                                    TRUE, TRUE,
456                                                                    SETTING_PW_UG_NORMAL_PASSWORD_MAX_LENGTH,
457                                                                    0, NULL, NULL);
458
459                         ad->err_desc = setting_create_Gendial_field_helpitem_without_bottom_separator(
460                                            ad->scroller,
461                                            &(itc_multiline_text),
462                                            SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
463                                            PW_NORMAL_AND_CONTAIN_ALPHANUMER_DESC);
464
465                         /* change return key type */
466                         if (ad->ed_pw1) {
467                                 ad->ed_pw1->return_key_type = ELM_INPUT_PANEL_RETURN_KEY_TYPE_NEXT;
468                                 elm_entry_input_panel_return_key_type_set(ad->ed_pw1->eo_check, ELM_INPUT_PANEL_RETURN_KEY_TYPE_NEXT);
469                                 elm_object_focus_set(ad->ed_pw1->eo_check, EINA_TRUE);
470                         }
471
472                         break;
473                 default:
474                         break;
475         }
476
477         ad->ed_pw2 = NULL;
478         ad->ed_pw3 = NULL;
479
480         return 0;
481 }
482
483 int setting_password_main_clear_1line_password(void *data)
484 {
485         /* error check */
486         retvm_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER,
487                  "[Setting > Password] Data parameter is NULL");
488
489         SettingPasswordUG *ad = (SettingPasswordUG *) data;
490         retv_if(NULL == ad->ed_pw1, -1);
491
492         ad->ed_pw1->sub_desc = NULL;
493         ad->ed_pw1->isFocusFlag = FALSE;
494
495         elm_entry_entry_set(ad->ed_pw1->eo_check, "");
496         elm_object_part_text_set(ad->ed_pw1->eo_check, "elm.guide", _("IDS_ST_BODY_ENTER_PASSWORD"));
497
498         return 0;
499 }
500
501 /* This help is shown on entering new/confirm password view */
502 void __add_help_of_password_policy(SettingPasswordUG *ad)
503 {
504         ret_if(ad == NULL);
505
506         ad->err_desc = setting_create_Gendial_field_helpitem_without_bottom_separator(
507                            ad->scroller,
508                            &(itc_multiline_text),
509                            SWALLOW_Type_LAYOUT_SPECIALIZTION_X,
510                            PW_NORMAL_AND_CONTAIN_ALPHANUMER_DESC);
511
512         if (ad->ed_pw1 && ad->ed_pw1->eo_check) {
513                 SETTING_TRACE_DEBUG("FOCUS IN");
514                 ad->ed_pw1->isFocusFlag = TRUE;
515                 elm_object_focus_set(ad->ed_pw1->eo_check, EINA_TRUE);
516         }
517 }
518
519 /* This help is shown after verifying entered new/confirm password with constraint */
520 void __add_help_of_password_fails(int ret, SettingPasswordUG *ad)
521 {
522         ret_if(ad == NULL);
523
524         switch (ret) {
525                 case SETTING_PW_ERROR_INVALID_LENGTH:
526                         setting_password_ug_display_desc(ad, "Invalid length", FALSE);
527                         break;
528                 case SETTING_PW_ERROR_INCLUDE_NO_LETTER:
529                         setting_password_ug_display_desc(ad, "IDS_ST_BODY_PASSWORD_MUST_CONTAIN_AT_LEAST_1_LETTER", FALSE);
530                         break;
531                 case SETTING_PW_ERROR_NO_MATCH_WITH_POLICY:
532                         setting_password_ug_display_desc(ad, "No match with policy", FALSE);
533                         break;
534                 case SETTING_PW_ERROR_NO_MATCH_MIN_COMPLEX:
535                         setting_password_ug_display_desc(ad, "No match with min complex", FALSE);
536                         break;
537                 case SETTING_PW_ERROR_EXIST_FORBIDDEN_STRING:
538                         setting_password_ug_display_desc(ad, "Exist forbidden string", FALSE);
539                         break;
540                 case SETTING_PW_ERROR_NO_MATCH_MAX_REPEAT_COUNT:
541                         setting_password_ug_display_desc(ad, "No match with max repeat count", FALSE);
542                         break;
543                 case SETTING_PW_ERROR_SIMPLE_STYLE:
544                         setting_password_ug_display_desc(ad, "Exist simple sequence", FALSE);
545                         break;
546                 case SETTING_PW_ERROR_INCLUDE_DIGIT:
547                         setting_password_ug_display_desc(ad, "Password should not include any digit or symbol", FALSE);
548                         break;
549                 case SETTING_PW_ERROR_NO_MATCH_WITH_PATTERN:
550                         setting_password_ug_display_desc(ad, "No match with pattern", FALSE);
551                         break;
552                 case SETTING_PW_ERROR_NO_DIGIT:
553                         setting_password_ug_display_desc(ad, "IDS_ST_BODY_PASSWORD_MUST_CONTAIN_AT_LEAST_1_NUMBER", FALSE);
554                         break;
555                 default:
556                         setting_password_ug_display_desc(ad, PW_ERR_DESC, FALSE);
557                         break;
558         }
559 }
560
561 int setting_password_main_check_1line_password(void *data)
562 {
563         /* error check */
564         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
565
566         SettingPasswordUG *ad = (SettingPasswordUG *) data;
567
568         /*const char *entry_str = ad->ed_pw1->sub_desc; */
569         const char *entry_str = elm_entry_markup_to_utf8(ad->ed_pw1->sub_desc);
570         /*char* plain_str = elm_entry_markup_to_utf8(ad->ed_pw1->sub_desc); */
571         ad->focus_data = ad->ed_pw1;
572
573         /*  Empty Check */
574         if (isEmptyStr(entry_str)) {
575                 setting_password_ug_display_desc(ad, _("IDS_ST_BODY_PASSWORD_EMPTY"), FALSE);
576                 FREE(entry_str);
577                 return SETTING_ENTRY_RETURN_NULL_STR_ERR;
578         }
579
580         /*  Length Check */
581         int entry_str_len = safeStrLen(entry_str);
582         if (entry_str_len < SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH
583             || entry_str_len > SETTING_PW_UG_NORMAL_PASSWORD_MAX_LENGTH) {
584                 setting_password_main_warning_entry_added_byte_popup(ad,
585                                                                      SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH,
586                                                                      SETTING_PW_UG_NORMAL_PASSWORD_MAX_LENGTH);
587                 FREE(entry_str);
588                 return SETTING_ENTRY_REQUIRED_CORRECT_DIGIT_PW;
589         }
590         FREE(entry_str);
591         return SETTING_RETURN_SUCCESS;
592 }
593
594 int setting_password_main_check_2line_password(void *data)
595 {
596         SETTING_TRACE_BEGIN;
597         /* error check */
598         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
599
600         SettingPasswordUG *ad = (SettingPasswordUG *) data;
601         if (ad->ed_pw1 == NULL)
602                 return SETTING_GENERAL_ERR_NULL_DATA_PARAMETER;
603
604         const char *entry_str1 = ad->step1_str;
605         const char *entry_str2 = ad->ed_pw1->sub_desc;
606
607         /*SETTING_TRACE(" entry_str1 : %s ", entry_str1); */
608         /*SETTING_TRACE(" entry_str2 : %s ", entry_str2); */
609
610         /*char* plain_str = elm_entry_markup_to_utf8(str); */
611         const char *entry_str1_mk = elm_entry_markup_to_utf8(entry_str1);
612         const char *entry_str2_mk = elm_entry_markup_to_utf8(entry_str2);
613
614         ad->focus_data = ad->ed_pw1;
615
616         /*  Empty Check */
617         if (isEmptyStr(entry_str1_mk)) {
618                 setting_password_ug_display_desc(ad, _("IDS_ST_BODY_PASSWORD_EMPTY"), FALSE);
619                 FREE(entry_str1_mk);
620                 FREE(entry_str2_mk);
621                 return SETTING_ENTRY_RETURN_NULL_STR_ERR;
622         }
623
624         /*  Match Check */
625         if (0 != safeStrCmp(entry_str1_mk, entry_str2_mk)) {
626                 setting_password_main_clear_1line_password(ad);
627                 setting_password_ug_display_desc(ad, _("IDS_ST_POP_PASSWORDS_DO_NOT_MATCH"), FALSE);
628                 FREE(entry_str1_mk);
629                 FREE(entry_str2_mk);
630                 return SETTING_ENTRY_NOT_MATCH_NEW_CONF_PW;
631         }
632
633         /*  Length Check */
634         int entry_str_len = safeStrLen(entry_str1_mk);
635         if (entry_str_len < SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH
636             || entry_str_len > SETTING_PW_UG_NORMAL_PASSWORD_MAX_LENGTH) {
637                 setting_password_main_warning_entry_added_byte_popup(ad,
638                                                                      SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH,
639                                                                      SETTING_PW_UG_NORMAL_PASSWORD_MAX_LENGTH);
640                 FREE(entry_str1_mk);
641                 FREE(entry_str2_mk);
642                 return SETTING_ENTRY_REQUIRED_CORRECT_DIGIT_PW;
643         }
644
645         FREE(entry_str1_mk);
646         FREE(entry_str2_mk);
647         return SETTING_RETURN_SUCCESS;
648 }
649
650 void setting_password_main_warning_entry_added_byte_popup(SettingPasswordUG *ad,
651                                                           int min, int max)
652 {
653         char str[MAX_SPECIALIZITION_LEN + 1] = { 0 };
654
655         snprintf(str, MAX_SPECIALIZITION_LEN, _("IDS_ST_POP_PASSWORD_MUST_BE_MORE_THAN_P1SD_CHARACTERS_AND_LESS_THAN_P2SD"), min, max);
656         setting_password_ug_display_desc(ad, str, FALSE);
657 }
658
659 static void setting_password_main_done_password(void *data)
660 {
661         ret_if(data == NULL);
662         SettingPasswordUG *ad = (SettingPasswordUG *) data;
663
664         app_control_h svc;
665         if (app_control_create(&svc)) {
666                 SETTING_TRACE_ERROR("app_control_create() failed");
667                 return;
668         }
669
670         SETTING_TRACE("ad->view_type:%d", ad->view_type);
671         int ret = 0;
672
673         switch (ad->view_type) {
674                 case SETTING_PW_TYPE_PASSWORD:
675                         ret = setting_password_main_check_1line_password(ad);
676
677                         if (ret == SETTING_RETURN_SUCCESS) {
678                                 const char *entry_str;
679                                 entry_str = ad->ed_pw1->sub_desc;
680                                 /*SETTING_TRACE(" ----> entry_str : %s ", entry_str); */
681                                 /*SETTING_TRACE(" ----> ad->view_type_string : %s ", ad->view_type_string); */
682                                 unsigned int remain_attempt = ATTEMPT_INFINITE;
683                                 unsigned int valid_seconds = 0;
684
685                                 ret = setting_password_check_password(entry_str, &remain_attempt, &valid_seconds);
686
687                                 if (ret == SETTING_RETURN_SUCCESS) {
688                                         int err;
689
690                                         if (safeStrCmp(ad->view_type_string, "SETTING_PW_TYPE_PASSWORD") == 0) {
691
692                                                 /*  reset VCONF */
693                                                 setting_set_int_slp_key(INT_SLP_SETTING_PHONE_LOCK_ATTEMPTS_LEFT, PHONE_LOCK_ATTEMPS_MAX, &err);
694                                                 if (err == SETTING_RETURN_FAIL) {
695                                                         SETTING_TRACE_ERROR("[Error] set value of vconf fail.");
696                                                         app_control_destroy(svc);
697                                                         return;
698                                                 }
699                                         } else if (0 == safeStrCmp(ad->view_type_string, "SETTING_PW_TYPE_ENTER_LOCK_TYPE")) {
700                                                 app_control_add_extra_data(svc, "current", entry_str);
701                                         }
702                                 } else {
703                                         /*  Incorrect Password. Display Popup.   */
704                                         setting_password_main_clear_1line_password(ad);
705                                         ad->focus_data = ad->ed_pw1;
706                                         /*else */
707                                         /*{ */
708                                         /*      setting_password_ug_check_attemps_left(ad); */
709                                         /*      return; */
710                                         /*} */
711                                         setting_password_ug_display_desc(ad, PW_ERR_DESC, FALSE);
712                                         app_control_destroy(svc);
713                                         return;
714                                 }
715                         } else {
716                                 setting_password_main_clear_1line_password(ad);
717                                 app_control_destroy(svc);
718                                 return;
719                         }
720                         break;
721                 case SETTING_PW_TYPE_SET_PASSWORD: {
722                                 /*SETTING_TRACE("case SETTING_PW_TYPE_SET_PASSWORD"); */
723                                 ret = setting_password_main_check_2line_password(ad);
724                                 /*SETTING_TRACE("setting_password_main_check_2line_password --> ret = %d ", ret); */
725
726                                 if (SETTING_RETURN_SUCCESS == ret) {
727                                         const char *entry_str;
728                                         entry_str = ad->ed_pw1->sub_desc;
729
730                                         if (isEmptyStr(entry_str)) {
731                                                 ad->focus_data = ad->ed_pw1;
732                                                 SETTING_TRACE_DEBUG("%s*** [ERR] elm_entry_entry_get return NULL ***%s",
733                                                                     SETTING_FONT_RED, SETTING_FONT_BLACK);
734                                                 setting_password_ug_create_popup_notitle_nobtn(ad, _("IDS_ST_POP_ERROR"), FALSE);
735                                                 app_control_destroy(svc);
736                                                 return;
737                                         }
738
739                                         ret = setting_password_set_password(ad->cur_pwd, entry_str, ad);
740                                         SETTING_TRACE(" -----------------> setting_password_set_password : %d \n", ret);
741
742                                         /*  Modify Setting Password */
743                                         if (ret > 0) {
744                                                 /*  Display popup */
745                                                 /*service_add_extra_data(svc, "current", entry_str); */
746                                                 if (ad->set_history_timer) {
747                                                         setting_password_ug_create_popup_notitle_nobtn(ad, _("IDS_ST_POP_NEW_PASSWD_SAVED"), FALSE);
748                                                 } else {
749                                                         app_control_add_extra_data(svc, "result", ad->view_type_string);
750                                                         ug_send_result(ad->ug, svc);
751                                                         SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
752
753                                                         app_control_destroy(svc);
754                                                         /* Send destroy request */
755                                                         ug_destroy_me(ad->ug);
756                                                         return;
757                                                 }
758                                                 app_control_destroy(svc);
759                                                 return;
760                                         } else if (ret == SETTING_PW_ERROR_REUSED) {
761                                                 ad->focus_data = ad->ed_pw1;
762                                                 setting_password_main_clear_1line_password(ad);
763                                                 setting_password_ug_display_desc(ad, _(PW_ERR_REUSED), FALSE);
764                                                 app_control_destroy(svc);
765                                                 return;
766                                         } else {
767                                                 ad->focus_data = ad->ed_pw1;
768                                                 setting_password_main_clear_1line_password(ad);
769                                                 setting_password_ug_display_desc(ad, _("IDS_BT_POP_OPERATION_FAILED"), FALSE);
770                                                 app_control_destroy(svc);
771                                                 return;
772                                         }
773                                 } else if (SETTING_ENTRY_NOT_MATCH_NEW_CONF_PW == ret) {
774                                         /* Nothing */
775                                         app_control_destroy(svc);
776                                         setting_password_main_clear_1line_password(ad);
777                                         setting_password_ug_display_desc(ad, PW_ST_PW_DO_NOT_MATCH, FALSE);
778                                         return;
779                                 } else {
780                                         SETTING_TRACE("error : %d", ret);
781                                         setting_password_main_clear_1line_password(ad);
782                                         setting_password_ug_display_desc(ad, PW_ERR_DESC, FALSE);
783                                         app_control_destroy(svc);
784                                         return;
785                                 }
786                         }
787                         break;
788                 default:
789                         app_control_destroy(svc);
790                         return;
791         }
792
793         app_control_add_extra_data(svc, "result", ad->view_type_string);
794         ug_send_result(ad->ug, svc);
795         SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
796
797         app_control_destroy(svc);
798         /* Send destroy request */
799         ug_destroy_me(ad->ug);
800 }
801
802 static int __count_string(const char *str, int *cnt_letter, int *cnt_digit, int *cnt_sym)
803 {
804         SETTING_TRACE_BEGIN;
805         retv_if(str == NULL || cnt_letter == NULL || cnt_digit == NULL || cnt_sym == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
806
807         /*char* plain_str = elm_entry_markup_to_utf8(str); */
808         char *plain_str = str;
809
810         int length = strlen(plain_str);
811         int index = 0;
812         char temp = 0;
813         int letter = 0;
814         int digit = 0;
815         int symbol = 0;
816
817         if (length <= 0) {
818                 SETTING_TRACE_DEBUG("[DEBUG] invalid input length");
819                 return SETTING_RETURN_FAIL;
820         }
821
822         for (index = 0; index < length; index++) {
823                 temp = (char)(plain_str[index]);
824                 SETTING_TRACE_SECURE_DEBUG("temp %c", temp);
825
826                 if ((temp >= '0') && (temp <= '9')) {   /* digit */
827                         digit++;
828                 } else if ((temp >= 'a') && (temp <= 'z')) {    /* lower letter */
829                         letter++;
830                 } else if ((temp >= 'A') && (temp <= 'Z')) {    /* upper letter */
831                         letter++;
832                 } else if ((temp >= ' ') && (temp <= '~')) { /* symbol means special char that enables to input from IME. */
833                         symbol++;
834                 }
835         }
836         SETTING_TRACE_SECURE_DEBUG("%s includes %d letters, %d digits, and %d symbols", plain_str, letter, digit, symbol);
837         *cnt_letter = letter;
838         *cnt_digit = digit;
839         *cnt_sym = symbol;
840         return SETTING_RETURN_SUCCESS;
841 }
842
843 void setting_password_main_click_softkey_continue_cb(void *data, Evas_Object *obj,
844                                                      void *event_info)
845 {
846         /* error check */
847         retm_if(data == NULL, "[Setting > Password] Data parameter is NULL");
848
849         SettingPasswordUG *ad = (SettingPasswordUG *) data;
850
851         /* Save first input */
852         ad->step1_str = (char *)strdup(ad->ed_pw1->sub_desc);
853
854         /* Check step1_str : more than 4, not all digits */
855         int letter = 0;
856         int digit = 0;
857         int symbol = 0;
858         char *plain_str = elm_entry_markup_to_utf8(ad->step1_str);
859         __count_string(plain_str, &letter, &digit, &symbol);
860
861         if (safeStrLen(plain_str) == digit) {
862                 setting_password_main_clear_1line_password(ad);
863                 __add_help_of_password_fails(SETTING_PW_ERROR_INCLUDE_NO_LETTER, ad);
864                 FREE(ad->step1_str);
865                 FREE(plain_str);
866                 return;
867         }
868
869         setting_password_main_clear_1line_password(ad);
870         if (ad->err_desc && ad->err_desc->item) {
871                 elm_object_item_del(ad->err_desc->item);
872                 ad->err_desc = NULL;
873         }
874
875         /* Change entry title : PW_SHORT_GUIDE_CONFIRM */
876         FREE(ad->ed_pw1->keyStr);
877         ad->ed_pw1->keyStr = (char *)strdup(PW_SHORT_GUIDE_CONFIRM);
878         elm_genlist_item_fields_update(ad->ed_pw1->item, "elm.text.main", ELM_GENLIST_ITEM_FIELD_TEXT);
879
880         /* change return key type */
881         ad->ed_pw1->return_key_type = ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE;
882         elm_entry_input_panel_return_key_type_set(ad->ed_pw1->eo_check, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
883         elm_object_focus_set(ad->ed_pw1->eo_check, EINA_TRUE);
884
885         /* Change button */
886         if (ad->bottom_btn) {
887                 ad->bottom_btn = elm_box_add(ad->navi_bar);
888                 elm_box_padding_set(ad->bottom_btn, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10));
889                 elm_box_horizontal_set(ad->bottom_btn, EINA_TRUE);
890                 evas_object_size_hint_weight_set(ad->bottom_btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
891                 evas_object_size_hint_align_set(ad->bottom_btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
892                 evas_object_show(ad->bottom_btn);
893                 elm_box_pack_end(ad->navi_bar, ad->bottom_btn);
894
895                 /* button 1 */
896                 Evas_Object *btn = elm_button_add(ad->bottom_btn);
897                 elm_object_style_set(btn, "bottom");
898                 elm_object_text_set(btn, _("IDS_ST_BUTTON_CANCEL"));
899                 evas_object_smart_callback_add(btn, "clicked", setting_password_main_click_softkey_cancel_cb, ad);
900                 evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
901                 evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.5);
902                 evas_object_show(btn);
903                 elm_box_pack_end(ad->bottom_btn, btn);
904                 elm_object_disabled_set(btn, EINA_FALSE);
905
906                 /* button 2 */
907                 ad->bottom_btn1 = elm_button_add(ad->bottom_btn);
908                 elm_object_style_set(ad->bottom_btn1, "bottom");
909                 elm_object_text_set(ad->bottom_btn1, _("IDS_SA_BUTTON_DONE_ABB"));
910                 evas_object_smart_callback_del(ad->bottom_btn1, "clicked", setting_password_main_click_softkey_continue_cb);
911                 evas_object_smart_callback_add(ad->bottom_btn1, "clicked", setting_password_main_click_softkey_done_cb, ad);
912                 elm_object_disabled_set(ad->bottom_btn1, EINA_TRUE);
913                 evas_object_size_hint_weight_set(ad->bottom_btn1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
914                 evas_object_size_hint_align_set(ad->bottom_btn1, EVAS_HINT_FILL, 0.5);
915                 evas_object_show(ad->bottom_btn1);
916                 elm_box_pack_end(ad->bottom_btn, ad->bottom_btn1);
917                 elm_object_item_part_content_set(ad->navi_it, "toolbar", ad->bottom_btn);
918         }
919
920         ad->cur_step++;
921         FREE(plain_str);
922 }
923
924 void setting_password_main_click_softkey_done_cb(void *data, Evas_Object *obj,
925                                                  void *event_info)
926 {
927         /* error check */
928         retm_if(data == NULL, "[Setting > Password] Data parameter is NULL");
929
930         SettingPasswordUG *ad = (SettingPasswordUG *) data;
931
932         if (ad->ed_pw1 && ad->ed_pw1->eo_check) {
933                 elm_object_focus_set(ad->ed_pw1->eo_check, EINA_FALSE);
934         }
935
936         if (ad->err_desc && ad->err_desc->item) {
937                 elm_object_item_del(ad->err_desc->item);
938                 ad->err_desc = NULL;
939         }
940
941         setting_password_main_done_password(ad);
942 }