add exception handling popup for checking changed input when cancel button is pressed 94/43594/1
authorSoohye Shin <soohye.shin@samsung.com>
Fri, 10 Jul 2015 10:39:42 +0000 (19:39 +0900)
committerSoohye Shin <soohye.shin@samsung.com>
Fri, 10 Jul 2015 10:39:42 +0000 (19:39 +0900)
Change-Id: If6b9e63b8fec241dda26d3118a0be2adeb793d68
Signed-off-by: Soohye Shin <soohye.shin@samsung.com>
include/defs.h
src/view/view_user_edit.c

index e4f9f8a..09c2534 100644 (file)
 #define MESSAGE_CANCEL "Cancel"
 #define MESSAGE_OK "OK"
 #define MESSAGE_DONE "Done"
+#define MESSAGE_DISCARD "Discard"
 
 #endif /* __AIR_HOME_DEFS_H__ */
index fc80dfc..9905b6b 100644 (file)
@@ -27,6 +27,7 @@
 #include "utils.h"
 
 #define MESSAGE_DELETE_CONTENTS "If you delete this user, their data will also be deleted."
+#define MESSAGE_DISCARD_CONTENTS "Discard all entered data?<br>If you are out of this screen, data won't be saved"
 
 #define MESSAGE_ENTRY_NAME "User Name"
 #define MESSAGE_ENTRY_PIN "Pin code"
@@ -64,6 +65,15 @@ struct _priv {
        struct datamgr_item *di;
 };
 
+static void _discard_key_down(int id, void *data, Evas *e, Evas_Object *obj,
+               Evas_Event_Key_Down *ev);
+
+static void _cancel_user_key_down(int id, void *data, Evas *e, Evas_Object *obj,
+               Evas_Event_Key_Down *ev);
+
+static void _delete_user_key_down(int id, void *data, Evas *e, Evas_Object *obj,
+               Evas_Event_Key_Down *ev);
+
 static void _get_profile(struct _priv *priv, const char **name,
                const char **photo, const char **pin)
 {
@@ -106,10 +116,125 @@ static input_handler done_handler = {
        .key_down = _done_key_down
 };
 
+static void _delete_popup(struct _priv *priv, input_handler *handler,
+               Evas_Object *obj)
+{
+       inputmgr_remove_callback(obj, handler);
+       evas_object_del(priv->popup);
+       priv->popup = NULL;
+}
+
+static input_handler cancel_user_handler = {
+       .key_down = _cancel_user_key_down
+};
+
+static void _cancel_user_key_down(int id, void *data, Evas *e, Evas_Object *obj,
+               Evas_Event_Key_Down *ev)
+{
+       struct _priv *priv;
+
+       if (!data) {
+               _ERR("Invalid argument");
+               return;
+       }
+
+       priv = data;
+
+       if (!strcmp(ev->keyname, KEY_ENTER) ||
+                       !strcmp(ev->keyname, KEY_ENTER_REMOTE) ||
+                       !strcmp(ev->keyname, KEY_BACK) ||
+                       !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
+               _delete_popup(priv, &cancel_user_handler, obj);
+       }
+}
+
+static input_handler discard_handler = {
+       .key_down = _discard_key_down
+};
+
+static void _discard_key_down(int id, void *data, Evas *e, Evas_Object *obj,
+               Evas_Event_Key_Down *ev)
+{
+       struct _priv *priv;
+
+       if (!data) {
+               _ERR("Invalid argument");
+               return;
+       }
+
+       priv = data;
+
+       if (!strcmp(ev->keyname, KEY_ENTER) ||
+                       !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
+               _delete_popup(priv, &discard_handler, obj);
+               viewmgr_pop_view();
+       } else if (!strcmp(ev->keyname, KEY_BACK) ||
+                       !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
+               _delete_popup(priv, &discard_handler, obj);
+       }
+}
+
+static void _add_discard_popup(struct _priv *priv)
+{
+       Evas_Object *popup, *discard_btn, *cancel_btn;
+
+       popup = utils_add_popup(priv->base, MESSAGE_DISCARD,
+                       MESSAGE_DISCARD_CONTENTS);
+       if (!popup) {
+               _ERR("failed to add popup");
+               return;
+       }
+       priv->popup = popup;
+
+       discard_btn = utils_add_button(popup, MESSAGE_DISCARD,
+                       PART_POPUP_BUTTON_1);
+       if (!discard_btn) {
+               _ERR("failed to add delete btn");
+               evas_object_del(popup);
+               return;
+       }
+       inputmgr_add_callback(discard_btn, 0, &discard_handler, priv);
+
+       cancel_btn = utils_add_button(popup, MESSAGE_CANCEL,
+                       PART_POPUP_BUTTON_2);
+       if (!cancel_btn) {
+               _ERR("failed to add cancel btn");
+               evas_object_del(popup);
+               return;
+       }
+       inputmgr_add_callback(cancel_btn, 0, &cancel_user_handler, priv);
+       elm_object_focus_set(cancel_btn, EINA_TRUE);
+}
+
+static bool _check_changed_input(struct _priv *priv)
+{
+       const char *photo, *name, *pin;
+
+       _get_profile(priv, &name, &photo, &pin);
+
+       if (priv->di) {
+               if (!strcmp(name, priv->di->title) && !strcmp(pin, "") &&
+                               !strcmp(photo, priv->di->icon))
+                       return false;
+       } else {
+               if (!strcmp(name, MESSAGE_ENTRY_NAME) &&
+                               !strcmp(pin, MESSAGE_ENTRY_PIN) &&
+                               !strcmp(photo, IMAGE_USER_DEFAULT))
+                       return false;
+       }
+
+       return true;
+}
+
 static void _cancel_key_down(int id, void *data, Evas *e, Evas_Object *obj,
                Evas_Event_Key_Down *ev)
 {
        if (!strcmp(ev->keyname, KEY_ENTER)) {
+               if (_check_changed_input(data)) {
+                       _add_discard_popup(data);
+                       return;
+               }
+
                viewmgr_pop_view();
        }
 }
@@ -137,7 +262,7 @@ static bool _add_btns(struct _priv *priv)
                evas_object_del(done);
                return false;
        }
-       inputmgr_add_callback(cancel, 0, &cancel_handler, NULL);
+       inputmgr_add_callback(cancel, 0, &cancel_handler, priv);
 
        priv->cancel = cancel;
        priv->done = done;
@@ -461,6 +586,10 @@ static Evas_Object *_create(Evas_Object *win, void *data)
        return base;
 }
 
+static input_handler delete_user_handler = {
+       .key_down = _delete_user_key_down
+};
+
 static void _delete_user_key_down(int id, void *data, Evas *e, Evas_Object *obj,
                Evas_Event_Key_Down *ev)
 {
@@ -475,47 +604,16 @@ static void _delete_user_key_down(int id, void *data, Evas *e, Evas_Object *obj,
 
        if (!strcmp(ev->keyname, KEY_ENTER) ||
                        !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
-               evas_object_del(priv->popup);
-               priv->popup = NULL;
+               _delete_popup(priv, &delete_user_handler, obj);
                priv->di->action = ITEM_SELECT_ACTION_DELETE;
                datamgr_select_item(priv->dm, priv->di);
                viewmgr_pop_view();
        } else if (!strcmp(ev->keyname, KEY_BACK) ||
                        !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
-               evas_object_del(priv->popup);
-               priv->popup = NULL;
+               _delete_popup(priv, &delete_user_handler, obj);
        }
 }
 
-static input_handler delete_user_handler = {
-       .key_down = _delete_user_key_down
-};
-
-static void _cancel_user_key_down(int id, void *data, Evas *e, Evas_Object *obj,
-               Evas_Event_Key_Down *ev)
-{
-       struct _priv *priv;
-
-       if (!data) {
-               _ERR("Invalid argument");
-               return;
-       }
-
-       priv = data;
-
-       if (!strcmp(ev->keyname, KEY_ENTER) ||
-                       !strcmp(ev->keyname, KEY_ENTER_REMOTE) ||
-                       !strcmp(ev->keyname, KEY_BACK) ||
-                       !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
-               evas_object_del(priv->popup);
-               priv->popup = NULL;
-       }
-}
-
-static input_handler cancel_user_handler = {
-       .key_down = _cancel_user_key_down
-};
-
 static void _add_delete_popup(struct _priv *priv)
 {
        Evas_Object *popup, *delete_btn, *cancel_btn;