3 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
5 * Licensed under the Apache License, Version 2.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #include <Elementary.h>
19 #include <app_debug.h>
28 #define MESSAGE_DELETE_CONTENTS "If you delete this user, their data will also be deleted."
29 #define MESSAGE_DISCARD_CONTENTS "Discard all entered data?<br>If you are out of this screen, data won't be saved"
31 #define MESSAGE_ENTRY_NAME "User Name"
32 #define MESSAGE_ENTRY_PIN "Pin code"
33 #define KEY_ICON "icon"
34 #define KEY_FOCUS_ICON "focusicon"
36 #define CTXPOPUP_X 294
37 #define CTXPOPUP_Y 310
40 enum input_handler_type {
41 INPUT_HANDLER_TYPE_PHOTO,
42 INPUT_HANDLER_TYPE_LOCK,
43 INPUT_HANDLER_TYPE_DELETE,
44 INPUT_HANDLER_TYPE_EO,
45 INPUT_HANDLER_TYPE_BTN_DONE,
46 INPUT_HANDLER_TYPE_BTN_CANCEL,
47 INPUT_HANDLER_TYPE_POPUP_BTN_DISCARD,
48 INPUT_HANDLER_TYPE_POPUP_BTN_CANCEL,
49 INPUT_HANDLER_TYPE_DELETE_POPUP_BTN_DELETE,
50 INPUT_HANDLER_TYPE_DELETE_POPUP_BTN_CANCEL
54 USER_ITEM_NONE = 0x00,
56 USER_ITEM_ADMIN = 0x02,
57 USER_ITEM_NORMAL = 0x08
62 const char *focus_file;
64 const char *focus_message;
76 Evas_Object *focus_icon;
79 Evas_Object *ctxpopup;
82 Evas_Object *lock_icon;
87 struct datamgr_item *di;
90 static void _focused(int id, void *data, Evas_Object *obj,
91 Elm_Object_Item *item)
94 case INPUT_HANDLER_TYPE_PHOTO:
95 case INPUT_HANDLER_TYPE_LOCK:
96 case INPUT_HANDLER_TYPE_DELETE:
97 case INPUT_HANDLER_TYPE_EO:
98 elm_object_signal_emit(obj, SIG_FOCUS, SRC_PROG);
105 static void _unfocused(int id, void *data, Evas_Object *obj,
106 Elm_Object_Item *item)
109 case INPUT_HANDLER_TYPE_PHOTO:
110 case INPUT_HANDLER_TYPE_LOCK:
111 case INPUT_HANDLER_TYPE_DELETE:
112 case INPUT_HANDLER_TYPE_EO:
113 elm_object_signal_emit(obj, SIG_UNFOCUS, SRC_PROG);
120 static void _key_down(int id, void *data, Evas *e, Evas_Object *obj,
121 Evas_Event_Key_Down *ev);
123 static void _mouse_down(int id, void *data, Evas *e, Evas_Object *obj,
124 Evas_Event_Mouse_Down *ev);
126 static input_handler handler = {
128 .unfocused = _unfocused,
129 .key_down = _key_down,
130 .mouse_down = _mouse_down
133 static void _get_profile(struct _priv *priv, const char **name,
134 const char **photo, const char **pin)
136 *name = elm_entry_entry_get(priv->name);
137 *pin = elm_entry_entry_get(priv->pin);
138 elm_image_file_get(priv->icon, photo, NULL);
139 *photo = utils_get_icon_from_photo(*photo);
142 static void _delete_popup(struct _priv *priv, Evas_Object *obj)
144 inputmgr_remove_callback(obj, &handler);
145 evas_object_del(priv->popup);
149 static void _add_discard_popup(struct _priv *priv)
151 Evas_Object *popup, *discard_btn, *cancel_btn;
153 popup = utils_add_popup(priv->base, MESSAGE_DISCARD,
154 MESSAGE_DISCARD_CONTENTS);
156 _ERR("failed to add popup");
161 discard_btn = utils_add_button(popup, MESSAGE_DISCARD,
162 PART_POPUP_BUTTON_1);
164 _ERR("failed to add delete btn");
165 evas_object_del(popup);
168 inputmgr_add_callback(discard_btn, INPUT_HANDLER_TYPE_POPUP_BTN_DISCARD,
171 cancel_btn = utils_add_button(popup, MESSAGE_CANCEL,
172 PART_POPUP_BUTTON_2);
174 _ERR("failed to add cancel btn");
175 evas_object_del(popup);
178 inputmgr_add_callback(cancel_btn, INPUT_HANDLER_TYPE_POPUP_BTN_CANCEL,
180 elm_object_focus_set(cancel_btn, EINA_TRUE);
183 static bool _check_changed_input(struct _priv *priv)
185 const char *photo, *name, *pin;
187 _get_profile(priv, &name, &photo, &pin);
190 if (!strcmp(name, priv->di->title) && !strcmp(pin, "") &&
191 !strcmp(photo, priv->di->icon))
194 if (!strcmp(name, MESSAGE_ENTRY_NAME) &&
195 !strcmp(pin, MESSAGE_ENTRY_PIN) &&
196 !strcmp(photo, IMAGE_USER_DEFAULT))
203 static bool _add_btns(struct _priv *priv)
205 Evas_Object *done, *cancel;
207 done = utils_add_button(priv->base, MESSAGE_DONE,
208 PART_USER_EDIT_BTN_DONE);
210 _ERR("failed to add done btn");
213 inputmgr_add_callback(done, INPUT_HANDLER_TYPE_BTN_DONE, &handler,
216 cancel = utils_add_button(priv->base, MESSAGE_CANCEL,
217 PART_USER_EDIT_BTN_CANCEL);
219 _ERR("failed to add cancel btn");
220 evas_object_del(done);
223 inputmgr_add_callback(cancel, INPUT_HANDLER_TYPE_BTN_CANCEL, &handler,
226 priv->cancel = cancel;
232 static void _load_user_icon(struct _priv *priv, const char *file,
233 const char *focus_file)
235 Evas_Object *icon, *focus_icon;
237 icon = utils_add_icon(priv->photo, file, PART_USER_EDIT_PHOTO);
239 _ERR("failed to add icon");
240 elm_image_fill_outside_set(icon, EINA_TRUE);
242 focus_icon = utils_add_icon(priv->photo, focus_file,
243 PART_USER_EDIT_PHOTO_FOCUS);
245 _ERR("failed to add focus icon");
246 elm_image_fill_outside_set(focus_icon, EINA_TRUE);
249 priv->focus_icon = focus_icon;
252 static Evas_Object *_pack_icon(Evas_Object *table, struct icon_info *_icon_info,
255 Evas_Object *eo, *ic, *focus_ic;
257 eo = utils_add_layout(table, GRP_USER_EDIT_ICON_LIST_ITEM, true, NULL);
259 _ERR("failed to add layout");
262 evas_object_show(eo);
263 elm_table_pack(table, eo, i % 4, i / 4, 1, 1);
265 ic = utils_add_icon(eo, _icon_info->icon_file,
266 PART_USER_EDIT_ICON_LIST_ITEM);
268 _ERR("failed to add icon");
273 focus_ic = utils_add_icon(eo, _icon_info->focus_icon_file,
274 PART_USER_EDIT_ICON_LIST_ITEM_FOCUS);
276 _ERR("failed to add focus icon");
280 evas_object_data_set(eo, KEY_ICON, _icon_info->photo_file);
285 static void _add_icon_list(struct _priv *priv)
287 Evas_Coord x, y, w, h;
288 Evas_Object *ctxpopup, *ly, *table, *eo;
290 struct icon_info *_icon_info;
292 ctxpopup = elm_ctxpopup_add(priv->base);
294 _ERR("failed to add ctxpopup");
297 elm_ctxpopup_horizontal_set(ctxpopup, EINA_TRUE);
298 elm_ctxpopup_auto_hide_disabled_set(ctxpopup, EINA_TRUE);
300 ly = utils_add_layout(ctxpopup, GRP_USER_EDIT_ICON_LIST, false, NULL);
302 _ERR("failed to layout");
303 evas_object_del(ctxpopup);
306 elm_object_content_set(ctxpopup, ly);
307 evas_object_show(ly);
308 evas_object_show(ctxpopup);
310 evas_object_geometry_get(priv->photo, &x, &y, &w, &h);
311 evas_object_move(ctxpopup,
312 (x + w + CTXPOPUP_X) * elm_config_scale_get(),
313 (y + CTXPOPUP_Y) * elm_config_scale_get());
315 table = utils_add_table(ly, true, PART_USER_EDIT_ICON_LIST);
317 _ERR("failed to add table");
318 evas_object_del(ctxpopup);
321 elm_table_padding_set(table, elm_config_scale_get() * 1,
322 elm_config_scale_get() * 1);
323 evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND,
326 _icon_info = utils_get_icon_info();
328 for (i = 0; i < MAX_ITEM_COUNT; i++) {
329 eo = _pack_icon(table, &_icon_info[i], i);
333 inputmgr_add_callback(eo, INPUT_HANDLER_TYPE_EO, &handler,
336 elm_object_focus_set(eo, EINA_TRUE);
339 priv->ctxpopup = ctxpopup;
342 static void _change_entry_status(Evas_Object *pin, Eina_Bool disable,
347 elm_entry_editable_set(pin, disable);
348 parent = elm_object_parent_widget_get(pin);
350 elm_object_signal_emit(parent, signal, SRC_PROG);
352 elm_object_focus_allow_set(pin, disable);
355 static void _load_lock_icon(struct _priv *priv)
357 const char *file = NULL;
359 if (!priv->lock_icon) {
360 priv->lock_icon = utils_add_icon(priv->lock, IMAGE_SWITCH_ON,
361 PART_USER_EDIT_SWITCH);
362 _change_entry_status(priv->pin, EINA_TRUE, SIG_UNFOCUS);
366 elm_image_file_get(priv->lock_icon, &file, NULL);
367 elm_object_part_content_unset(priv->lock, PART_USER_EDIT_SWITCH);
368 evas_object_del(priv->lock_icon);
370 if (!file || !strcmp(file, IMAGE_SWITCH_OFF)) {
371 file = IMAGE_SWITCH_ON;
372 _change_entry_status(priv->pin, EINA_TRUE, SIG_UNFOCUS);
373 elm_entry_entry_set(priv->pin, MESSAGE_ENTRY_PIN);
375 file = IMAGE_SWITCH_OFF;
376 _change_entry_status(priv->pin, EINA_FALSE, SIG_DISABLE);
377 elm_entry_entry_set(priv->pin, "");
380 priv->lock_icon = utils_add_icon(priv->lock, file,
381 PART_USER_EDIT_SWITCH);
384 static Evas_Object *_add_layout(struct _priv *priv)
386 Evas_Object *ly, *photo, *name, *pin, *lock;
388 ly = utils_add_layout(priv->base, GRP_USER_EDIT_CONTENTS, false,
389 PART_USER_EDIT_CONTENTS);
391 _ERR("failed to add layout");
395 photo = utils_add_layout(ly, GRP_USER_EDIT_PHOTO, true,
396 PART_USER_EDIT_CONTENTS_PHOTO);
400 name = utils_add_entry(ly, MESSAGE_ENTRY_NAME, false,
401 PART_USER_EDIT_CONTENTS_NAME);
405 pin = utils_add_entry(ly, MESSAGE_ENTRY_PIN, false,
406 PART_USER_EDIT_CONTENTS_PIN);
410 lock = utils_add_layout(ly, GRP_USER_EDIT_SWITCH, true,
411 PART_USER_EDIT_CONTENTS_LOCK);
415 inputmgr_add_callback(lock, INPUT_HANDLER_TYPE_LOCK, &handler, priv);
416 inputmgr_add_callback(photo, INPUT_HANDLER_TYPE_PHOTO, &handler, priv);
425 _ERR("failed to add layout");
430 static bool _add_user_edit(struct _priv *priv)
434 ly = _add_layout(priv);
436 _ERR("failed to add edit layout");
440 if (!_add_btns(priv)) {
441 _ERR("failed to add buttons");
446 /* It should be implemented later about function btn */
453 static Evas_Object *_create(Evas_Object *win, void *data)
459 _ERR("Invalid argument");
463 priv = calloc(1, sizeof(*priv));
465 _ERR("failed to calloc priv");
469 base = utils_add_layout(win, GRP_USER_EDIT, false, NULL);
471 _ERR("failed to create base");
475 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
477 elm_win_resize_object_add(win, base);
483 if (!_add_user_edit(priv)) {
484 _ERR("failed to add user edit layout");
485 evas_object_del(base);
490 viewmgr_set_view_data(VIEW_USER_EDIT, priv);
491 viewmgr_add_view(view_photo_get_vclass(), NULL);
496 static void _add_delete_popup(struct _priv *priv)
498 Evas_Object *popup, *delete_btn, *cancel_btn;
501 snprintf(buf, sizeof(buf), "%s %s?<br> %s", MESSAGE_DELETE,
502 priv->di->title, MESSAGE_DELETE_CONTENTS);
504 popup = utils_add_popup(priv->base, MESSAGE_DELETE_USER, buf);
506 _ERR("failed to add popup");
511 delete_btn = utils_add_button(popup, MESSAGE_DELETE,
512 PART_POPUP_BUTTON_1);
514 _ERR("failed to add delete btn");
515 evas_object_del(popup);
518 inputmgr_add_callback(delete_btn,
519 INPUT_HANDLER_TYPE_DELETE_POPUP_BTN_DELETE,
522 cancel_btn = utils_add_button(popup, MESSAGE_CANCEL,
523 PART_POPUP_BUTTON_2);
525 _ERR("failed to add cancel btn");
526 evas_object_del(popup);
529 inputmgr_add_callback(cancel_btn,
530 INPUT_HANDLER_TYPE_DELETE_POPUP_BTN_CANCEL,
532 elm_object_focus_set(cancel_btn, EINA_TRUE);
535 static void _select_eo(struct _priv *priv, Evas_Object *obj)
537 const char *file, *focus_file;
539 evas_object_del(priv->ctxpopup);
540 priv->ctxpopup = NULL;
542 file = evas_object_data_get(obj, KEY_ICON);
543 focus_file = utils_get_focus_photo_from_photo(file);
545 if (!strcmp(file, ICON_ADD) || !strcmp(focus_file, ICON_ADD))
546 viewmgr_push_view(VIEW_PHOTO);
548 _load_user_icon(priv, file, focus_file);
551 static void _select_btn_done(struct _priv *priv)
553 const char *name, *pin, *photo;
555 _get_profile(priv, &name, &photo, &pin);
557 priv->di->action = ITEM_SELECT_ACTION_UPDATE;
558 priv->di->title = strdup(name ? name : "");
559 priv->di->icon = strdup(photo ? photo :
561 priv->di->parameter = strdup(pin ? pin : "");
562 datamgr_select_item(priv->dm, priv->di);
564 datamgr_add_item(priv->dm, name, photo, pin);
570 static void _select(struct _priv *priv, int id, Evas_Object *obj)
573 case INPUT_HANDLER_TYPE_PHOTO:
574 _add_icon_list(priv);
576 case INPUT_HANDLER_TYPE_LOCK:
577 _load_lock_icon(priv);
579 case INPUT_HANDLER_TYPE_DELETE:
580 _add_delete_popup(priv);
582 case INPUT_HANDLER_TYPE_EO:
583 _select_eo(priv, obj);
585 case INPUT_HANDLER_TYPE_BTN_DONE:
586 _select_btn_done(priv);
588 case INPUT_HANDLER_TYPE_BTN_CANCEL:
589 if (_check_changed_input(priv)) {
590 _add_discard_popup(priv);
595 case INPUT_HANDLER_TYPE_DELETE_POPUP_BTN_DELETE:
596 _delete_popup(priv, obj);
597 priv->di->action = ITEM_SELECT_ACTION_DELETE;
598 datamgr_select_item(priv->dm, priv->di);
601 case INPUT_HANDLER_TYPE_POPUP_BTN_DISCARD:
602 _delete_popup(priv, obj);
605 case INPUT_HANDLER_TYPE_DELETE_POPUP_BTN_CANCEL:
606 case INPUT_HANDLER_TYPE_POPUP_BTN_CANCEL:
607 _delete_popup(priv, obj);
614 static void _key_down(int id, void *data, Evas *e, Evas_Object *obj,
615 Evas_Event_Key_Down *ev)
620 _ERR("Invalid argument");
625 if (!strcmp(ev->keyname, KEY_BACK) ||
626 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
628 case INPUT_HANDLER_TYPE_EO:
629 evas_object_del(priv->ctxpopup);
630 priv->ctxpopup = NULL;
632 case INPUT_HANDLER_TYPE_DELETE_POPUP_BTN_DELETE:
633 _delete_popup(priv, obj);
635 case INPUT_HANDLER_TYPE_POPUP_BTN_DISCARD:
636 _delete_popup(priv, obj);
638 case INPUT_HANDLER_TYPE_DELETE_POPUP_BTN_CANCEL:
639 case INPUT_HANDLER_TYPE_POPUP_BTN_CANCEL:
640 _delete_popup(priv, obj);
645 } else if(!strcmp(ev->keyname, KEY_ENTER) ||
646 !strcmp(ev->keyname, KEY_ENTER_REMOTE))
647 _select(priv, id, obj);
650 static void _mouse_down(int id, void *data, Evas *e, Evas_Object *obj,
651 Evas_Event_Mouse_Down *ev)
656 _ERR("Invalid argument");
661 _select(priv, id, obj);
664 static void _load_del_btn(struct _priv *priv)
668 if (priv->di->type == USER_ITEM_ADMIN) {
669 btn = utils_add_layout(priv->ly, GRP_USER_EDIT_DELETE, false,
670 PART_USER_EDIT_CONTENTS_DELETE);
672 _ERR("failed to add delete button");
675 elm_object_signal_emit(btn, SIG_DISABLE, SRC_PROG);
680 btn = utils_add_layout(priv->ly, GRP_USER_EDIT_DELETE, true,
681 PART_USER_EDIT_CONTENTS_DELETE);
683 _ERR("failed to add delete button");
686 inputmgr_add_callback(btn, INPUT_HANDLER_TYPE_DELETE, &handler, priv);
691 static void _show(void *data)
694 const char *photo, *focus_photo;
697 _ERR("Invalid argument");
704 elm_object_part_text_set(priv->base, PART_USER_EDIT_TITLE,
706 elm_entry_entry_set(priv->name, priv->di->title);
707 elm_entry_entry_set(priv->pin, "");
708 if (priv->selected_photo) {
709 _load_user_icon(priv, priv->selected_photo,
710 priv->selected_photo);
712 photo = utils_get_photo_from_icon(priv->di->icon);
713 focus_photo = utils_get_focus_photo_from_photo(photo);
714 _load_user_icon(priv, photo, focus_photo);
718 elm_object_part_text_set(priv->base, PART_USER_EDIT_TITLE,
720 elm_entry_entry_set(priv->name, MESSAGE_ENTRY_NAME);
721 elm_entry_entry_set(priv->pin, MESSAGE_ENTRY_PIN);
722 if (priv->selected_photo)
723 _load_user_icon(priv, priv->selected_photo,
724 priv->selected_photo);
726 _load_user_icon(priv, IMAGE_USER_CURRENT_DEFAULT,
727 IMAGE_USER_CURRENT_DEFAULT_FOCUS);
730 _load_lock_icon(priv);
731 evas_object_show(priv->base);
732 elm_object_focus_set(priv->cancel, EINA_TRUE);
735 static void _hide(void *data)
740 _ERR("Invalid argument");
746 inputmgr_remove_callback(priv->del, &handler);
747 evas_object_del(priv->del);
751 if (priv->lock_icon) {
752 evas_object_del(priv->lock_icon);
753 priv->lock_icon = NULL;
756 priv->selected_photo = NULL;
757 evas_object_hide(priv->base);
760 static void _destroy(void *data)
765 _ERR("Invalid argument");
771 inputmgr_remove_callback(priv->photo, &handler);
772 inputmgr_remove_callback(priv->lock, &handler);
773 inputmgr_remove_callback(priv->done, &handler);
774 inputmgr_remove_callback(priv->cancel, &handler);
775 viewmgr_remove_view(VIEW_PHOTO);
776 evas_object_del(priv->base);
780 static void _update(void *view_data, int update_type, void *data)
785 _ERR("Invalid argument");
791 switch (update_type) {
792 case UPDATE_TYPE_EDIT:
795 case UPDATE_TYPE_PHOTO:
796 priv->selected_photo = data;
799 _ERR("Invalid type");
804 static view_class vclass = {
805 .view_id = VIEW_USER_EDIT,
813 view_class *view_user_edit_get_vclass(void)