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