check pin code when switch user 19/48819/5
authorSoohye Shin <soohye.shin@samsung.com>
Wed, 30 Sep 2015 07:14:14 +0000 (16:14 +0900)
committerSoohye Shin <soohye.shin@samsung.com>
Thu, 1 Oct 2015 00:28:56 +0000 (09:28 +0900)
Change-Id: I25fb66db935e824b7dfd332bc4d79c73d8009e86
Signed-off-by: Soohye Shin <soohye.shin@samsung.com>
include/datamgr.h
include/view.h
src/data/data_home.c
src/data/data_recent.c
src/data/data_user.c
src/data/datamgr.c
src/view/view_action_menu.c
src/view/view_pin.c
src/view/view_user.c
src/view/view_user_edit.c

index ffeee86..657fdd9 100644 (file)
@@ -30,6 +30,13 @@ enum datamgr_item_select_action {
        ITEM_SELECT_ACTION_MAX
 };
 
+enum datamgr_item_select_err {
+       ITEM_SELECT_ERROR_NONE = 0,
+       ITEM_SELECT_ERROR_INVALID_PARAMETER = -1,
+       ITEM_SELECT_ERROR_INVALID_OPERATION = -2,
+       ITEM_SELECT_ERROR_SWITCH = -3
+};
+
 struct datamgr {
        Eina_List *list;
        const char *view_id;
@@ -54,7 +61,7 @@ struct datamgr_item {
 struct data_class {
        bool (*init)(struct datamgr *dm);
        void (*fini)(struct datamgr *dm);
-       bool (*select)(struct datamgr_item *di);
+       int (*select)(struct datamgr_item *di);
        Eina_List *(*get_items)(struct datamgr *dm);
        void (*clear)(struct datamgr *dm);
        bool (*add)(struct datamgr *dm, const char *title, const char *icon,
@@ -65,7 +72,7 @@ struct data_class {
 struct datamgr *datamgr_init(struct data_class *dclass, const char *view_id);
 void datamgr_fini(struct datamgr *dm);
 Eina_List *datamgr_get_items(struct datamgr *dm);
-bool datamgr_select_item(struct datamgr *dm, struct datamgr_item *di);
+int datamgr_select_item(struct datamgr *dm, struct datamgr_item *di);
 void datamgr_clear_item(struct datamgr *dm);
 bool datamgr_add_item(struct datamgr *dm, const char *title, const char *icon,
                const char *parameter);
index b4cdc10..6cdb075 100644 (file)
@@ -27,7 +27,8 @@ enum update_type {
        UPDATE_TYPE_RESET,
        UPDATE_TYPE_MENU,
        UPDATE_TYPE_PIN_CODE,
-       UPDATE_TYPE_PIN_RESULT
+       UPDATE_TYPE_PIN_RESULT,
+       UPDATE_TYPE_SWITCH
 };
 
 enum menu_type {
index 81c4b28..1bf9b23 100644 (file)
@@ -317,20 +317,22 @@ static bool _init(struct datamgr *dm)
        return _load_home(dm);
 }
 
-static bool _select(struct datamgr_item *di)
+static int _select(struct datamgr_item *di)
 {
-       bool r;
+       int r;
 
        if (!di || !di->parameter)
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_PARAMETER;
 
-       r = false;
+       r = ITEM_SELECT_ERROR_INVALID_OPERATION;
        switch (di->action) {
        case ITEM_SELECT_ACTION_LAUNCH:
-               r = utils_launch_app(di->parameter, NULL, NULL);
+               if (utils_launch_app(di->parameter, NULL, NULL))
+                       r = ITEM_SELECT_ERROR_NONE;
                break;
        case ITEM_SELECT_ACTION_PUSH:
-               r = viewmgr_push_view(di->parameter);
+               if (viewmgr_push_view(di->parameter))
+                       r = ITEM_SELECT_ERROR_NONE;
                break;
        default:
                _ERR("Invalid state");
index 5fc9aa8..24ab8c1 100644 (file)
@@ -519,17 +519,18 @@ static bool _init(struct datamgr *dm)
        return true;
 }
 
-static bool _select(struct datamgr_item *di)
+static int _select(struct datamgr_item *di)
 {
-       bool r;
+       int r;
 
        if (!di || !di->parameter)
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_PARAMETER;
 
-       r = false;
+       r = ITEM_SELECT_ERROR_INVALID_OPERATION;
        switch (di->action) {
        case ITEM_SELECT_ACTION_LAUNCH:
-               r = utils_launch_app(di->parameter, di->key, di->value);
+               if (utils_launch_app(di->parameter, di->key, di->value))
+                       r = ITEM_SELECT_ERROR_NONE;
                break;
        default:
                _ERR("Invalid state");
index 06f3fd2..b348ca3 100644 (file)
@@ -73,7 +73,7 @@ static GDBusConnection *_get_bus_connection(GError **error)
                        NULL, NULL, error);
 }
 
-static bool _switch(char *name, char *password)
+static int _switch(char *name, char *password)
 {
        GDBusConnection *conn;
        GError *error;
@@ -82,7 +82,7 @@ static bool _switch(char *name, char *password)
        guint32 serial;
 
        if (!name || !password)
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_PARAMETER;
 
        error = NULL;
        conn = _get_bus_connection(&error);
@@ -90,13 +90,15 @@ static bool _switch(char *name, char *password)
                _ERR("failed to get connection, %s",
                                error ? error->message : "");
                g_error_free(error);
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_OPERATION;
        }
 
        param = _build_env_param(name, password);
        if (!param) {
                _ERR("failed to build env param");
-               goto err;
+               g_object_unref(conn);
+               g_error_free(error);
+               return ITEM_SELECT_ERROR_INVALID_OPERATION;
        }
 
        msg = g_dbus_message_new_method_call(USER_SWITCH_TLM_BUS_NAME,
@@ -110,21 +112,19 @@ static bool _switch(char *name, char *password)
        if (!res) {
                _ERR("failed to send message, %s", error ? error->message : "");
                g_object_unref(msg);
-               goto err;
+               g_object_unref(conn);
+               g_error_free(error);
+               return ITEM_SELECT_ERROR_SWITCH;
        }
 
        g_object_unref(res);
        g_object_unref(msg);
        g_object_unref(conn);
 
-       return true;
-err:
-       g_object_unref(conn);
-       g_error_free(error);
-       return false;
+       return ITEM_SELECT_ERROR_NONE;
 }
 
-static bool _update(struct datamgr_item *di)
+static int _update(struct datamgr_item *di)
 {
        GumUser *user;
        gboolean r;
@@ -132,7 +132,7 @@ static bool _update(struct datamgr_item *di)
        user = gum_user_get_by_name_sync(di->title, FALSE);
        if (!user) {
                _ERR("failed to get user");
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_OPERATION;
        }
 
        g_object_set(G_OBJECT(user), GUM_ATTR_PASSWORD, di->parameter,
@@ -142,15 +142,15 @@ static bool _update(struct datamgr_item *di)
        if (!r) {
                _ERR("failed to update user");
                g_object_unref(user);
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_OPERATION;
        }
 
        g_object_unref(user);
 
-       return true;
+       return ITEM_SELECT_ERROR_NONE;
 }
 
-static bool _delete(struct datamgr_item *di)
+static int _delete(struct datamgr_item *di)
 {
        GumUser *user;
        gboolean r;
@@ -158,41 +158,42 @@ static bool _delete(struct datamgr_item *di)
        user = gum_user_get_by_name_sync(di->title, FALSE);
        if (!user) {
                _ERR("failed to get user");
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_OPERATION;
        }
 
        r = gum_user_delete_sync(user, FALSE);
        if (!r) {
                _ERR("failed to delete user");
                g_object_unref(user);
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_OPERATION;
        }
 
        g_object_unref(user);
 
-       return true;
+       return ITEM_SELECT_ERROR_NONE;
 }
 
-static bool _select(struct datamgr_item *di)
+static int _select(struct datamgr_item *di)
 {
-       bool r;
+       int r;
 
        if (!di) {
                _ERR("Invalid argument");
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_PARAMETER;
        }
 
-       r = false;
+       r = ITEM_SELECT_ERROR_INVALID_OPERATION;
        switch (di->action) {
        case ITEM_SELECT_ACTION_SWITCH:
-               /* It should be implemented later */
-               r = _switch(di->title, "");
+               r = _switch(di->title, di->parameter ? di->parameter : "");
                break;
        case ITEM_SELECT_ACTION_PUSH:
-               r = viewmgr_push_view(di->parameter);
+               if (viewmgr_push_view(di->parameter))
+                       r = ITEM_SELECT_ERROR_NONE;
                break;
        case ITEM_SELECT_ACTION_POP:
-               r = viewmgr_pop_view();
+               if (viewmgr_pop_view())
+                       r = ITEM_SELECT_ERROR_NONE;
                break;
        case ITEM_SELECT_ACTION_UPDATE:
                r = _update(di);
index 6f5e0eb..9a29452 100644 (file)
@@ -73,15 +73,15 @@ Eina_List *datamgr_get_items(struct datamgr *dm)
        return dm->dclass->get_items(dm);
 }
 
-bool datamgr_select_item(struct datamgr *dm, struct datamgr_item *di)
+int datamgr_select_item(struct datamgr *dm, struct datamgr_item *di)
 {
        if (!dm || !dm->dclass || !di) {
                _ERR("Invalid argument");
-               return false;
+               return ITEM_SELECT_ERROR_INVALID_PARAMETER;
        }
 
        if (!dm->dclass->select)
-               return true;
+               return ITEM_SELECT_ERROR_NONE;
 
        return dm->dclass->select(di);
 }
index 01564cc..8e1a5ca 100644 (file)
@@ -206,7 +206,7 @@ static void _delete_user(struct _priv *priv, Evas_Object *obj)
                return;
 
        priv->di->action = ITEM_SELECT_ACTION_DELETE;
-       if (!datamgr_select_item(priv->dm, priv->di)) {
+       if (datamgr_select_item(priv->dm, priv->di) != ITEM_SELECT_ERROR_NONE) {
                _ERR("failed to delete user");
                return;
        }
index 5af4fc4..9d83703 100644 (file)
 
 #include "defs.h"
 #include "view.h"
+#include "datamgr.h"
+
+enum pin_view_type {
+       VIEW_CHECK_PIN,
+       VIEW_SWITCH_PIN
+};
 
 struct _priv {
        Evas_Object *win;
@@ -30,6 +36,10 @@ struct _priv {
        ui_gadget_h ug;
 
        char *pincode;
+       enum pin_view_type type;
+
+       struct datamgr *dm;
+       struct datamgr_item *di;
 };
 
 static void _send_message(struct _priv *priv, const char *result)
@@ -57,12 +67,24 @@ static void _send_message(struct _priv *priv, const char *result)
 
 static void _check_pincode(struct _priv *priv, char *pincode)
 {
-       if (!strcmp(pincode, priv->pincode)) {
-               viewmgr_hide_view(VIEW_PIN);
-               viewmgr_update_view(VIEW_USER_EDIT, UPDATE_TYPE_PIN_RESULT,
-                               pincode);
-       } else {
-               _send_message(priv, MESSAGE_FAIL);
+       switch (priv->type) {
+       case VIEW_CHECK_PIN:
+               if (!strcmp(pincode, priv->pincode)) {
+                       viewmgr_hide_view(VIEW_PIN);
+                       viewmgr_update_view(VIEW_USER_EDIT,
+                                       UPDATE_TYPE_PIN_RESULT, pincode);
+               } else {
+                       _send_message(priv, MESSAGE_FAIL);
+               }
+               break;
+       case VIEW_SWITCH_PIN:
+               priv->di->parameter = pincode;
+               if (datamgr_select_item(priv->dm, priv->di) !=
+                               ITEM_SELECT_ERROR_NONE)
+                       _send_message(priv, MESSAGE_FAIL);
+               break;
+       default:
+               break;
        }
 }
 
@@ -110,7 +132,7 @@ static Evas_Object *_create(Evas_Object *win, void *data)
 {
        struct _priv *priv;
 
-       if (!win) {
+       if (!win || !data) {
                _ERR("Invalid argument");
                return NULL;
        }
@@ -122,6 +144,7 @@ static Evas_Object *_create(Evas_Object *win, void *data)
        }
 
        priv->win = win;
+       priv->dm = data;
 
        viewmgr_set_view_data(VIEW_PIN, priv);
 
@@ -165,6 +188,7 @@ static void _hide(void *data)
 
        free(priv->pincode);
        priv->pincode = NULL;
+       priv->di = NULL;
 }
 
 static void _destroy(void *data)
@@ -185,7 +209,7 @@ static void _update(void *view_data, int update_type, void *data)
 {
        struct _priv *priv;
 
-       if (!view_data) {
+       if (!view_data || !data) {
                _ERR("Invalid argument");
                return;
        }
@@ -194,10 +218,12 @@ static void _update(void *view_data, int update_type, void *data)
 
        switch (update_type) {
        case UPDATE_TYPE_PIN_CODE:
-               if (!data)
-                       return;
-
                priv->pincode = strdup(data);
+               priv->type = VIEW_CHECK_PIN;
+               break;
+       case UPDATE_TYPE_SWITCH:
+               priv->di = data;
+               priv->type = VIEW_SWITCH_PIN;
                break;
        default:
                _ERR("Invalid type");
index 2cfa911..7780377 100644 (file)
@@ -166,6 +166,36 @@ static void _delete_popup(struct _priv *priv)
        priv->popup = NULL;
 }
 
+static void _select(struct _priv *priv)
+{
+       switch (priv->foc->di->action) {
+       case ITEM_SELECT_ACTION_POP:
+               elm_object_signal_emit(priv->base, SIG_HIDE, SRC_PROG);
+               break;
+       case ITEM_SELECT_ACTION_PUSH:
+               if (eina_list_count(priv->list) >= MAX_USER_COUNT) {
+                       _add_popup(priv);
+                       return;
+               }
+
+               viewmgr_update_view(VIEW_USER_EDIT, UPDATE_TYPE_EDIT, NULL);
+               datamgr_select_item(priv->dm, priv->foc->di);
+               break;
+       case ITEM_SELECT_ACTION_SWITCH:
+               if (datamgr_select_item(priv->dm, priv->foc->di) ==
+                               ITEM_SELECT_ERROR_SWITCH) {
+                       viewmgr_update_view(VIEW_PIN, UPDATE_TYPE_SWITCH,
+                                       priv->foc->di);
+                       viewmgr_show_view(VIEW_PIN);
+               }
+
+               break;
+       default:
+               _ERR("Invalid state: %d", priv->foc->di->action);
+               return;
+       }
+}
+
 static void _key_down(int id, void *data, Evas *e, Evas_Object *obj,
                Evas_Event_Key_Down *ev)
 {
@@ -186,21 +216,7 @@ static void _key_down(int id, void *data, Evas *e, Evas_Object *obj,
                break;
        case INPUT_HANDLER_TYPE_BASE:
                if (!strcmp(ev->keyname, KEY_ENTER)) {
-                       if (priv->foc->di->action == ITEM_SELECT_ACTION_POP) {
-                               elm_object_signal_emit(priv->base, SIG_HIDE,
-                                               SRC_PROG);
-                               return;
-                       }
-
-                       if ((priv->foc->di->action == ITEM_SELECT_ACTION_PUSH)
-                                       && (eina_list_count(priv->list)
-                                       >= MAX_USER_COUNT)) {
-                               _add_popup(priv);
-                               return;
-                       }
-                       viewmgr_update_view(VIEW_USER_EDIT, UPDATE_TYPE_EDIT,
-                                       NULL);
-                       datamgr_select_item(priv->dm, priv->foc->di);
+                       _select(priv);
                } else if (!strcmp(ev->keyname, KEY_BACK) ||
                                !strcmp(ev->keyname, KEY_ESC)) {
                        elm_object_signal_emit(priv->base, SIG_HIDE, SRC_PROG);
@@ -289,7 +305,7 @@ static Evas_Object *_create(Evas_Object *win, void *data)
 
        viewmgr_set_view_data(VIEW_USER, priv);
        viewmgr_add_view(view_user_edit_get_vclass(), dm);
-       viewmgr_add_view(view_pin_get_vclass(), NULL);
+       viewmgr_add_view(view_pin_get_vclass(), dm);
        inputmgr_add_callback(base, INPUT_HANDLER_TYPE_BASE, &handler, priv);
        elm_object_signal_callback_add(base, SIG_HIDE_DONE, SRC_EDJE,
                        _hide_done, NULL);
@@ -314,21 +330,12 @@ static void _arrow_clicked(void *data, Evas_Object *obj, const char *emission,
 static void _item_clicked(void *data, Evas_Object *obj, const char *emission,
                const char *source)
 {
-       struct _priv *priv = data;
-
-       if (priv->foc->di->action == ITEM_SELECT_ACTION_POP) {
-               elm_object_signal_emit(priv->base, SIG_HIDE, SRC_PROG);
-                       return;
-       }
-
-       if ((priv->foc->di->action == ITEM_SELECT_ACTION_PUSH)
-                       && (eina_list_count(priv->list) >= MAX_USER_COUNT)) {
-               _add_popup(priv);
+       if (!data) {
+               _ERR("Invalid argument");
                return;
        }
 
-       viewmgr_update_view(VIEW_USER_EDIT, UPDATE_TYPE_EDIT, NULL);
-       datamgr_select_item(priv->dm, priv->foc->di);
+       _select(data);
 }
 
 static struct _bar_item *_pack_bar_item(struct _priv *priv, Evas_Object *box,
index a684e42..bd901d1 100644 (file)
@@ -611,7 +611,6 @@ static void _update_user(struct _priv *priv, const char *pincode)
 {
        const char *name, *photo;
        char buf[MAX_BUF];
-       bool r;
 
        _get_profile(priv, &name, &photo);
 
@@ -622,16 +621,18 @@ static void _update_user(struct _priv *priv, const char *pincode)
                                IMAGE_USER_DEFAULT);
                priv->di->parameter = strdup(pincode ? pincode : "");
                snprintf(buf, sizeof(buf), "%s %s", name, MESSAGE_USER_UPDATE);
-               r = datamgr_select_item(priv->dm, priv->di);
+               if (datamgr_select_item(priv->dm, priv->di) !=
+                               ITEM_SELECT_ERROR_NONE) {
+                       _reset(priv);
+                       return;
+               }
        } else {
                snprintf(buf, sizeof(buf), "%s %s", name, MESSAGE_USER_ADD);
-               r = datamgr_add_item(priv->dm, name, photo,
-                               pincode ? pincode : "");
-       }
-
-       if (!r) {
-               _reset(priv);
-               return;
+               if (!datamgr_add_item(priv->dm, name, photo,
+                               pincode ? pincode : "")) {
+                       _reset(priv);
+                       return;
+               }
        }
 
        utils_add_toast(priv->win, buf);