Remove X dependency (x11, utilX, ecore-x)
[profile/tv/apps/native/settings.git] / src / view_pwd_popup.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "dbg.h"
18 #include "def.h"
19 #include "view_pwd_popup.h"
20 #include "utils.h"
21 #include "settings_provider.h"
22
23 #define PWD_DATA_ID "change_passcode_data"
24 #define CTXPOPUP_WIDTH 688
25 #define CTXPOPUP_HEIGHT 411
26 #define PWD_SIZE 5
27
28 #define BOX_HPADDING 10
29 #define BOX_VPADDING 0
30
31 #define MSGID_PWD_TITLE "Change passcode"
32 #define MSGID_UPTEXT "Enter your old passcode"
33 #define MSGID_DOWNTEXT "Default passcode is 0000"
34 #define MSGID_INVALID_PWD "Failed passcode attempt"
35 #define MSGID_NEW_PWD "Enter your new passcode"
36 #define MSGID_REENTER_PWD "Re-enter your new passcode"
37 #define MSGID_DIFFER_PWD "Not same passcode. Enter again"
38 #define MSGID_CANCEL "Cancel"
39 #define PWD_SYMBOL "*"
40 #define PWD_RANGE "0123456789"
41
42 #define SIG_CLICKED "clicked"
43 #define SIG_DISMISSED "dismissed"
44
45 enum {
46         ENTRY_0,
47         ENTRY_1,
48         ENTRY_2,
49         ENTRY_3,
50         ENTRY_MAX
51 };
52
53 struct _pwd_data {
54         Evas_Object *win;
55         Evas_Object *bg;
56         Evas_Object *base;
57         Evas_Object *cancel_btn;
58         Evas_Object *ctxpopup;
59         Evas_Object *box;
60
61         Eina_Array *array;
62
63         char pwd[PWD_SIZE];
64         char entered_pwd[PWD_SIZE];
65         char reentered_pwd[PWD_SIZE];
66
67         int new_flag;
68         int renew_flag;
69         int wrong_flag;
70
71         struct setting_mgr *mgr;
72         struct settingview_data *view;
73 };
74
75 static void _hide(Evas_Object *base);
76
77 /**
78 * Free user data.
79 *
80 * @param[in]: data : the user data of change passcode view.
81 *
82 * @return: void.
83 */
84 static void _free_pwd_data(struct _pwd_data *data)
85 {
86         if (!data)
87                 return;
88
89         if (data->bg)
90                 evas_object_del(data->bg);
91
92         if (data->base)
93                 evas_object_del(data->base);
94
95         if (data->ctxpopup)
96                 evas_object_del(data->ctxpopup);
97
98         if (data->array)
99                 eina_array_free(data->array);
100
101         free(data);
102 }
103
104 /**
105 * Create background of change passcode view.
106 *
107 * @param[in]: win : the window this view created on.
108 *
109 * @return: the created background of type evas object.
110 */
111 static Evas_Object *_add_pwd_bg(Evas_Object *win)
112 {
113         Evas_Object *bg;
114
115         if (!win)
116                 return NULL;
117
118         bg = utils_add_base(win);
119         if (!bg) {
120                 _ERR("elm layout add failed.");
121                 return NULL;
122         }
123
124         elm_layout_file_set(bg, EDJ_FILE, GRP_PWD_BG);
125
126         return bg;
127 }
128
129 /**
130 * Create the base layout of change passcode view.
131 *
132 * @param[in]: ctxpopup : the ctxpopup which contains change passcode view.
133 *
134 * @return: the created base layout of change passcode view.
135 */
136 static Evas_Object *_add_pwd_base(Evas_Object *ctxpopup)
137 {
138         Evas_Object *base;
139
140         if (!ctxpopup)
141                 return NULL;
142
143         base = utils_add_base(ctxpopup);
144         if (!base) {
145                 _ERR("elm layout add failed.");
146                 return NULL;
147         }
148
149         elm_layout_file_set(base, EDJ_FILE, GRP_PWD_VIEW);
150
151         elm_object_part_text_set(base, PART_TITLE,
152                         utils_get_translation_str(MSGID_PWD_TITLE));
153         elm_object_part_text_set(base, PART_UPTEXT,
154                         utils_get_translation_str(MSGID_UPTEXT));
155         elm_object_part_text_set(base, PART_DOWNTEXT,
156                         utils_get_translation_str(MSGID_DOWNTEXT));
157
158         return base;
159 }
160
161 /**
162 * Evas_Smart_Cb type callback for handling click event.
163 *
164 * @param[in]: priv : the user data.
165 * @param[in]: obj : the corresponding object which the click event occurred.
166 * @param[in]: ev : event info.
167 *
168 * @return: void.
169 */
170 static void _cancelbtn_clicked_cb(void *priv, Evas_Object *obj, void *ev)
171 {
172         struct _pwd_data *data;
173
174         if (!priv || !obj)
175                 return;
176
177         data = (struct _pwd_data *) priv;
178
179         settingmgr_view_pop(data->mgr);
180 }
181
182 /**
183 * Create cancel button of change passcode view.
184 *
185 * @param[in]: data : the user data of change passcode view.
186 *
187 * @return: the created cancel button or null if error occurred.
188 */
189 static Evas_Object *_add_pwd_cancel_btn(struct _pwd_data *data)
190 {
191         Evas_Object *btn;
192
193         if (!data || !data->base)
194                 return NULL;
195
196         btn = utils_add_btn(data->base, PWD_BASIC_BTN,
197                         utils_get_translation_str((const char *) MSGID_CANCEL), EINA_TRUE);
198         if (!btn) {
199                 _ERR("utils add button failed.");
200                 return NULL;
201         }
202
203         evas_object_smart_callback_add(btn, SIG_CLICKED,
204                         _cancelbtn_clicked_cb, data);
205
206         elm_object_part_content_set(data->base, SWALLOW_CANCEL_BTN, btn);
207
208         elm_object_focus_allow_set(btn, EINA_TRUE);
209
210         return btn;
211 }
212
213 /**
214 * Set the move directions of focus between entries and cancel button.
215 *
216 * @param[in]: array : eina array containing entries.
217 * @param[in]: cancel_btn : the cancel button.
218 *
219 * @return: void.
220 */
221 static void _set_entry_directions(Eina_Array *array, Evas_Object *cancel_btn)
222 {
223         Evas_Object *en;
224         Evas_Object *lasten;
225         int i;
226
227         if (!array || !cancel_btn)
228                 return;
229
230         for (i = ENTRY_0; i < ENTRY_3; i++) {
231                 en = (Evas_Object *) eina_array_data_get(array, i);
232                 if (!en)
233                         return;
234
235                 elm_object_focus_next_object_set(en,
236                                 (Evas_Object *) eina_array_data_get(array, i + 1),
237                                 ELM_FOCUS_NEXT);
238                 elm_object_focus_next_object_set(en, en, ELM_FOCUS_LEFT);
239                 elm_object_focus_next_object_set(en, en, ELM_FOCUS_RIGHT);
240                 elm_object_focus_next_object_set(en, en, ELM_FOCUS_UP);
241                 elm_object_focus_next_object_set(en, cancel_btn,
242                                 ELM_FOCUS_DOWN);
243         }
244
245         lasten = (Evas_Object *) eina_array_data_get(array, ENTRY_3);
246         elm_object_focus_next_object_set(lasten, lasten, ELM_FOCUS_UP);
247         elm_object_focus_next_object_set(lasten, cancel_btn, ELM_FOCUS_DOWN);
248         elm_object_focus_next_object_set(lasten, lasten, ELM_FOCUS_LEFT);
249         elm_object_focus_next_object_set(lasten, lasten, ELM_FOCUS_RIGHT);
250
251         elm_object_focus_next_object_set(cancel_btn, cancel_btn,
252                         ELM_FOCUS_LEFT);
253         elm_object_focus_next_object_set(cancel_btn, cancel_btn,
254                         ELM_FOCUS_RIGHT);
255         elm_object_focus_next_object_set(cancel_btn,
256                         (Evas_Object *) eina_array_data_get(array, ENTRY_0), ELM_FOCUS_UP);
257         elm_object_focus_next_object_set(cancel_btn, cancel_btn,
258                         ELM_FOCUS_DOWN);
259 }
260
261 /**
262 * Get the passcode.
263 *
264 * @param[in]: vdata : view data.
265 *
266 * @return: the passcode.
267 */
268 static char *_get_pwd(struct settingview_data *vdata)
269 {
270         struct settingitem *item;
271
272         if (!vdata)
273                 return NULL;
274
275         item = viewdata_get_parentitem(vdata);
276         if (!item) {
277                 _ERR("get parent item failed.");
278                 return NULL;
279         }
280
281         return provider_get_list_value(item);
282 }
283
284 /**
285 * Check if the input passcode is right.
286 *
287 * @param[in]: data : the user data of change passcode view.
288 *
289 * @return: 0 - wrong passcode, 1 - right passcode.
290 */
291 static int _check_pwd(struct _pwd_data *data)
292 {
293         char *pwd;
294
295         if (!data || !data->view)
296                 return 0;
297
298         pwd = _get_pwd(data->view);
299         if (!pwd) {
300                 _ERR("get passcode failed.");
301                 return 0;
302         }
303
304         if (strncmp(data->pwd, pwd, strlen(pwd))) {
305                 free(pwd);
306                 return 0;
307         }
308
309         free(pwd);
310
311         return 1;
312 }
313
314 /**
315 * Clear passcode.
316 *
317 * @param[in]: pwd : the passcode.
318 *
319 * @return: void.
320 */
321 static void _clear_pwd(char *pwd)
322 {
323         if (!pwd)
324                 return;
325
326         while (pwd) {
327                 if (*pwd == '\0')
328                         break;
329
330                 *pwd = 'F';
331                 pwd++;
332         }
333 }
334
335 /**
336 * Clear passcode.
337 *
338 * This function clears displayed passcode in entries when user
339 * inputs wrong passcode.
340 *
341 * @param[in]: data : the user data of change passcode view.
342 *
343 * @return: void.
344 */
345 static void _reset_pwd(struct _pwd_data *data)
346 {
347         Evas_Object *btn, *first;
348         Eina_Array *array;
349         int i;
350
351         if (!data || !data->array || !data->base)
352                 return;
353
354         array = data->array;
355
356         first = (Evas_Object *) eina_array_data_get(array, ENTRY_0);
357         if (!first)
358                 return;
359
360         elm_object_focus_set(first, EINA_TRUE);
361         elm_object_focus_next_object_set(data->cancel_btn, first, ELM_FOCUS_UP);
362
363         for (i = ENTRY_0; i < ENTRY_MAX; i++) {
364                 btn = (Evas_Object *)eina_array_data_get(array, i);
365                 if (!btn)
366                         return;
367
368                 elm_object_text_set(btn, "");
369         }
370 }
371
372 /**
373 * Set passcode to system.
374 *
375 * @param[in]: data : the user data of change passcode view.
376 *
377 * @return: 0 - Success, -1 - Fail.
378 */
379 static int _set_pwd(struct _pwd_data *data)
380 {
381         int ret;
382         struct settingitem *item;
383
384         if (!data || !data->view)
385                 return -1;
386
387         item = viewdata_get_parentitem(data->view);
388         if (!item) {
389                 _ERR("get parent item failed.");
390                 return -1;
391         }
392
393         ret = provider_set_list_value(item, data->pwd);
394         if (ret == -1) {
395                 _ERR("set passcode failed.");
396                 return -1;
397         }
398
399         return 0;
400 }
401
402 /**
403 * Check if the reentered passcode is right.
404 *
405 * @param[in]: data : the user data of change passcode view.
406 *
407 * @return: 0 - Success, -1 - Fail.
408 */
409 static int _check_reentered_pwd(struct _pwd_data *data)
410 {
411         if (!data)
412                 return 0;
413
414         if (strncmp(data->entered_pwd, data->reentered_pwd,
415                         PWD_SIZE - 1))
416                 return 0;
417
418         return 1;
419 }
420
421 /**
422 * Update text of change passcode view.
423 *
424 * @param[in]: data : the user data of change passcode view.
425 * @param[in]: part : edje part of text.
426 * @param[in]: msgid : the message id of text.
427 *
428 * @return: void.
429 */
430 static void _update_pwd_ui(struct _pwd_data *data,
431                 const char *part, const char *msgid)
432 {
433         char *text;
434
435         if (!data || !data->base || !msgid || !part)
436                 return;
437
438         _reset_pwd(data);
439
440         text = utils_get_translation_str(msgid);
441         elm_object_part_text_set(data->base, part, text);
442 }
443
444 /**
445 * Evas_Object_Event_Cb type callback for handling key press event.
446 *
447 * @param[in]: priv : the user data.
448 * @param[in]: e : the evas canvas.
449 * @param[in]: obj : the corresponding object which the key press event occurred.
450 * @param[in]: ei : event info.
451 *
452 * @return: void.
453 */
454 static void _entry_keypress_cb(void *priv, Evas *e,
455                 Evas_Object *obj, void *ei)
456 {
457         Evas_Event_Key_Down *event;
458         Eina_Array *array;
459         Evas_Object *next_entry;
460         struct _pwd_data *data;
461         const char *keyname;
462         int entry_idx, i;
463
464         if (!priv || !ei || !obj)
465                 return;
466
467         data = (struct _pwd_data *) priv;
468         array = data->array;
469         if (!array)
470                 return;
471
472         event = (Evas_Event_Key_Down *) ei;
473         keyname = event->keyname;
474         if (!keyname)
475                 return;
476
477         entry_idx = -1;
478         for (i = ENTRY_0; i < ENTRY_MAX; i++) {
479                 if (obj == eina_array_data_get(array, i)) {
480                         entry_idx = i;
481                         break;
482                 }
483         }
484
485         if (!strncmp(keyname, KEY_BACK, strlen(keyname)) || !strncmp(keyname, KEY_BACK_REMOTE, strlen(keyname))) {
486                 settingmgr_view_pop(data->mgr);
487         } else if (!strncmp(keyname, KEY_DOWN, strlen(keyname))) {
488                 elm_object_focus_set(data->cancel_btn, EINA_TRUE);
489         } else if (!strncmp(keyname, KEY_0, strlen(keyname)) ||
490                         !strncmp(keyname, KEY_1, strlen(keyname)) ||
491                         !strncmp(keyname, KEY_2, strlen(keyname)) ||
492                         !strncmp(keyname, KEY_3, strlen(keyname)) ||
493                         !strncmp(keyname, KEY_4, strlen(keyname)) ||
494                         !strncmp(keyname, KEY_5, strlen(keyname)) ||
495                         !strncmp(keyname, KEY_6, strlen(keyname)) ||
496                         !strncmp(keyname, KEY_7, strlen(keyname)) ||
497                         !strncmp(keyname, KEY_8, strlen(keyname)) ||
498                         !strncmp(keyname, KEY_9, strlen(keyname))) {
499                 elm_entry_entry_set(obj, PWD_SYMBOL);
500
501                 data->pwd[entry_idx] = keyname[0];
502
503                 if (data->new_flag && !data->renew_flag)
504                         data->entered_pwd[entry_idx] = keyname[0];
505
506                 if (data->renew_flag)
507                         data->reentered_pwd[entry_idx] = keyname[0];
508
509                 if (entry_idx < ENTRY_3) {
510                         elm_object_focus_next(obj, ELM_FOCUS_NEXT);
511                         next_entry = elm_object_focus_next_object_get(obj,
512                                         ELM_FOCUS_NEXT);
513                         if (!next_entry) {
514                                 _ERR("next entry is null.");
515                                 return;
516                         }
517
518                         elm_object_focus_next_object_set(data->cancel_btn,
519                                         next_entry, ELM_FOCUS_UP);
520                 } else {
521                         if (!data->new_flag) {
522                                 if (_check_pwd(data)) {
523                                         _update_pwd_ui(data, PART_UPTEXT,
524                                                         MSGID_NEW_PWD);
525
526                                         data->new_flag = 1;
527                                 } else {
528                                         _update_pwd_ui(data, PART_UPTEXT,
529                                                         MSGID_INVALID_PWD);
530                                 }
531                         } else if (!data->renew_flag) {
532                                 _update_pwd_ui(data, PART_UPTEXT,
533                                                 MSGID_REENTER_PWD);
534
535                                 data->renew_flag = 1;
536                         } else {
537                                 if (_check_reentered_pwd(data)) {
538                                         if (_set_pwd(data) != 0) {
539                                                 _ERR("set passcode failed.");
540                                                 return;
541                                         }
542
543                                         data->new_flag = 0;
544                                         data->renew_flag = 0;
545
546                                         settingmgr_view_pop(data->mgr);
547                                 } else {
548                                         _update_pwd_ui(data, PART_UPTEXT,
549                                                         MSGID_DIFFER_PWD);
550
551                                         data->renew_flag = 0;
552                                         data->new_flag = 1;
553                                 }
554                         }
555                 }
556         }
557 }
558
559 /**
560 * Create entry.
561 *
562 * @param[in]: parent : object the entry will be created on.
563 *
564 * @return: the created entry or null if error occurred.
565 */
566 static Evas_Object *_add_entry(Evas_Object *parent)
567 {
568         Evas_Object *entry;
569         Elm_Entry_Filter_Limit_Size length = {
570                 .max_char_count = 1
571         };
572         Elm_Entry_Filter_Accept_Set type = {
573                 .accepted = PWD_RANGE
574         };
575
576         if (!parent)
577                 return NULL;
578
579         entry = utils_add_entry(parent);
580         if (!entry) {
581                 _ERR("utils add entry failed.");
582                 return NULL;
583         }
584
585         elm_entry_markup_filter_append(entry,
586                         elm_entry_filter_limit_size, &length);
587         elm_entry_markup_filter_append(entry,
588                         elm_entry_filter_accept_set, &type);
589
590         elm_object_style_set(entry, STYLE_PWD_ENTRY);
591
592         elm_entry_text_style_user_push(entry, STYLE_ENTRY_TEXT);
593         elm_object_part_content_set(parent, SWALLOW_ENTRY, entry);
594
595         return entry;
596 }
597
598 /**
599 * Create entries for inputting passcode.
600 *
601 * @param[in]: data : the user data of change passcode view.
602 *
603 * @return: 0 - Success, -1 - Fail.
604 */
605 static int _add_pwd_entry(struct _pwd_data *data)
606 {
607         Eina_Array *array;
608         Evas_Object *box;
609         Evas_Object *entry;
610         Evas_Object *entry_base;
611         int i;
612
613         if (!data || !data->base) {
614                 _ERR("invalid arguments.");
615                 return -1;
616         }
617
618         box = utils_add_box(data->base);
619         if (!box) {
620                 _ERR("add box failed.");
621                 return -1;
622         }
623
624         elm_box_horizontal_set(box, EINA_TRUE);
625         elm_box_padding_set(box, BOX_HPADDING, BOX_VPADDING);
626
627         array = eina_array_new(1);
628         if (!array) {
629                 _ERR("new eina array failed.");
630                 evas_object_del(box);
631                 return -1;
632         }
633
634         for (i = ENTRY_0; i < ENTRY_MAX; i++) {
635                 entry_base = utils_add_base(data->base);
636                 if (!entry_base) {
637                         _ERR("entry base created failed.");
638                         evas_object_del(box);
639                         eina_array_free(array);
640                         return -1;
641                 }
642
643                 elm_layout_file_set(entry_base, EDJ_FILE, GRP_PWD_ENTRY);
644
645                 entry = _add_entry(entry_base);
646                 if (!entry) {
647                         _ERR("add entry failed.");
648                         evas_object_del(box);
649                         evas_object_del(entry_base);
650                         eina_array_free(array);
651                         return -1;
652                 }
653
654                 eina_array_push(array, entry);
655                 elm_box_pack_end(box, entry_base);
656
657                 evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN,
658                                 _entry_keypress_cb, data);
659         }
660
661         elm_object_part_content_set(data->base, SWALLOW_CONTENT_AREA, box);
662
663         elm_object_focus_allow_set(
664                         (Evas_Object *) eina_array_data_get(array, ENTRY_0), EINA_TRUE);
665         elm_object_focus_set(
666                         (Evas_Object *)eina_array_data_get(array, ENTRY_0), EINA_TRUE);
667
668         _set_entry_directions(array, data->cancel_btn);
669
670         data->box = box;
671         data->array = array;
672
673         return 0;
674 }
675
676 /**
677 * Evas_Smart_Cb type callback for handling ctxpopup dismissed event.
678 *
679 * @param[in]: priv : the user data.
680 * @param[in]: obj : the corresponding object which the dismissed event occurred.
681 * @param[in]: ev : event info.
682 *
683 * @return: void.
684 */
685 static void _ctxpopup_dismissed(void *priv, Evas_Object *obj,
686                 void *ev)
687 {
688         struct _pwd_data *data;
689
690         if (!priv || !obj)
691                 return;
692
693         data = (struct _pwd_data *) priv;
694
695         if (!data->base || !data->mgr)
696                 return;
697
698         _hide(data->base);
699
700         settingmgr_view_pop(data->mgr);
701 }
702
703 /**
704 * Create all the UI components of change passcode view.
705 *
706 * @param[in]: mgr : view manager of settings views.
707 * @param[in]: view : data of view.
708 * @prev[in]: prev : the user data.
709 *
710 * @return: the base layout of change passcode view or null
711 *                if error occurred.
712 */
713 static Evas_Object *_create(struct setting_mgr *mgr,
714                 struct settingview_data *view, void *prev)
715 {
716         Evas_Object *base, *bg;
717         Evas_Object *win;
718         Evas_Object *cancel_btn;
719         Evas_Object *ctxpopup;
720         struct _pwd_data *data;
721         int ret;
722         int width, height;
723         int xpos, ypos;
724
725         if (!mgr || !view) {
726                 _ERR("invalid argument.");
727                 return NULL;
728         }
729
730         win = settingmgr_get_win(mgr);
731         if (!win) {
732                 _ERR("settingmgr get window failed.");
733                 return NULL;
734         }
735
736         data = (struct _pwd_data *)calloc(1, sizeof(*data));
737         if (!data) {
738                 _ERR("calloc _change_passcode_data failed.");
739                 return NULL;
740         }
741
742         data->win = win;
743
744         _clear_pwd(data->pwd);
745
746         bg = _add_pwd_bg(win);
747         if (!bg) {
748                 _ERR("add change passcode background failed.");
749                 goto error;
750         }
751
752         ctxpopup = utils_add_ctxpopup(win, (char *) CHANGE_PWD_CTXPOPUP_STYLE);
753         if (!ctxpopup) {
754                 _ERR("add ctxpopup failed.");
755                 goto error;
756         }
757
758         data->ctxpopup = ctxpopup;
759
760         base = _add_pwd_base(data->ctxpopup);
761         if (!base) {
762                 _ERR("add change passcode base layout failed.");
763                 goto error;
764         }
765
766         data->base = base;
767
768         elm_object_content_set(ctxpopup, base);
769
770         width = WIN_WIDTH;
771         height = WIN_HEIGHT;
772
773         xpos = (width - CTXPOPUP_WIDTH) / 2;
774         ypos = (height - CTXPOPUP_HEIGHT) / 2;
775         evas_object_move(data->ctxpopup, xpos * ELM_SCALE, ypos * ELM_SCALE);
776
777         cancel_btn = _add_pwd_cancel_btn(data);
778         if (!cancel_btn) {
779                 _ERR("add change passcode cancel button failed.");
780                 goto error;
781         }
782
783         data->cancel_btn = cancel_btn;
784
785         ret = _add_pwd_entry(data);
786         if (ret != 0) {
787                 _ERR("add change passcode input buttons failed.");
788                 goto error;
789         }
790
791         data->mgr = mgr;
792         data->bg = bg;
793         data->view = view;
794
795         evas_object_smart_callback_add(data->ctxpopup,
796                         SIG_DISMISSED, _ctxpopup_dismissed, data);
797
798         evas_object_data_set(base, PWD_DATA_ID, data);
799
800         return base;
801
802 error:
803         _free_pwd_data(data);
804         return NULL;
805 }
806
807 /**
808 * Show the change passcode view.
809 *
810 * @param[in]: base : the base layout of change passcode view.
811 *
812 * @return: void.
813 */
814 static void _show(Evas_Object *base)
815 {
816         struct _pwd_data *data;
817
818         if (!base)
819                 return;
820
821         data = (struct _pwd_data *)evas_object_data_get(base, PWD_DATA_ID);
822         if (!data) {
823                 _ERR("get data from base failed. ID: %s.", PWD_DATA_ID);
824                 return;
825         }
826
827         evas_object_show(data->ctxpopup);
828 }
829
830 /**
831 * Destroy the change passcode view.
832 *
833 * @param[in]: base : the base layout of change passcode view.
834 *
835 * @return: void.
836 */
837 static void _destroy(Evas_Object *base)
838 {
839         struct _pwd_data *data;
840
841         if (!base)
842                 return;
843
844         data = (struct _pwd_data *)evas_object_data_get(base, PWD_DATA_ID);
845         if (!data) {
846                 _ERR("get data from base failed. ID: %s.", PWD_DATA_ID);
847                 return;
848         }
849
850         _free_pwd_data(data);
851 }
852
853 /**
854 * Hide the change passcode view.
855 *
856 * @param[in]: base : the base layout of change passcode view.
857 *
858 * @return: void.
859 */
860 static void _hide(Evas_Object *base)
861 {
862         struct _pwd_data *data;
863
864         if (!base)
865                 return;
866
867         data = (struct _pwd_data *)evas_object_data_get(base, PWD_DATA_ID);
868         if (!data) {
869                 _ERR("get data from base failed. ID: %s.",
870                                 PWD_DATA_ID);
871                 return;
872         }
873
874         evas_object_hide(data->bg);
875         evas_object_hide(data->ctxpopup);
876 }
877
878 /**
879 * view class of change passcode view.
880 */
881 static struct setting_class _vclass = {
882         VCLASS_TITLE_CHANGE_PASSCODE,
883         _create,
884         _show,
885         NULL,
886         NULL,
887         NULL,
888         NULL,
889         _hide,
890         _destroy,
891         NULL,
892         NULL,
893         NULL,
894         0
895 };
896
897 /**
898 * Return view class of change passcode view.
899 *
900 * @param: null.
901 *
902 * @return: the view class of change passcode view.
903 */
904 struct setting_class *view_passcode_popup_get_vclass(void)
905 {
906         return &_vclass;
907 }