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;
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,
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);
UPDATE_TYPE_RESET,
UPDATE_TYPE_MENU,
UPDATE_TYPE_PIN_CODE,
- UPDATE_TYPE_PIN_RESULT
+ UPDATE_TYPE_PIN_RESULT,
+ UPDATE_TYPE_SWITCH
};
enum menu_type {
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");
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");
NULL, NULL, error);
}
-static bool _switch(char *name, char *password)
+static int _switch(char *name, char *password)
{
GDBusConnection *conn;
GError *error;
guint32 serial;
if (!name || !password)
- return false;
+ return ITEM_SELECT_ERROR_INVALID_PARAMETER;
error = NULL;
conn = _get_bus_connection(&error);
_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,
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;
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,
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;
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);
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);
}
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;
}
#include "defs.h"
#include "view.h"
+#include "datamgr.h"
+
+enum pin_view_type {
+ VIEW_CHECK_PIN,
+ VIEW_SWITCH_PIN
+};
struct _priv {
Evas_Object *win;
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)
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;
}
}
{
struct _priv *priv;
- if (!win) {
+ if (!win || !data) {
_ERR("Invalid argument");
return NULL;
}
}
priv->win = win;
+ priv->dm = data;
viewmgr_set_view_data(VIEW_PIN, priv);
free(priv->pincode);
priv->pincode = NULL;
+ priv->di = NULL;
}
static void _destroy(void *data)
{
struct _priv *priv;
- if (!view_data) {
+ if (!view_data || !data) {
_ERR("Invalid argument");
return;
}
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");
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)
{
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);
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);
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,
{
const char *name, *photo;
char buf[MAX_BUF];
- bool r;
_get_profile(priv, &name, &photo);
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);