enum event_type {
EVENT_DATA_UPDATE_DONE,
EVENT_DATA_SELECT_DONE,
+ EVENT_DATA_SELECT_FAIL,
};
struct data_class {
/* Signal for network layout */
#define SIG_NO_WIRELESS "sig.no.wireless"
#define SIG_WIRELESS_EXISTS "sig.wireless.exists"
+#define SIG_LOADING_START "sig.loading.start"
+#define SIG_LOADING_STOP "sig.loading.stop"
/* String for network layout */
#define STR_WIRELESS "Wireless"
#define IC_LOCK_NETWORK_FOC_04_PNG "ic_lock_network_foc_04.png"
#define IC_CHECK_NOR_PNG "ic_thumb_check_sel.png"
#define IC_CHECK_FOC_PNG "ic_thumb_check_foc.png"
+#define IC_NETWORK_LOADING_01_PNG "network_loading_01.png"
+#define IC_NETWORK_LOADING_02_PNG "network_loading_02.png"
+#define IC_NETWORK_LOADING_03_PNG "network_loading_03.png"
+#define IC_NETWORK_LOADING_04_PNG "network_loading_04.png"
+#define IC_NETWORK_LOADING_05_PNG "network_loading_05.png"
+#define IC_NETWORK_LOADING_06_PNG "network_loading_06.png"
+#define IC_NETWORK_LOADING_07_PNG "network_loading_07.png"
+#define IC_NETWORK_LOADING_08_PNG "network_loading_08.png"
+#define IC_NETWORK_LOADING_09_PNG "network_loading_09.png"
+#define IC_NETWORK_LOADING_10_PNG "network_loading_10.png"
+#define IC_NETWORK_LOADING_11_PNG "network_loading_11.png"
+#define IC_NETWORK_LOADING_12_PNG "network_loading_12.png"
#endif /* __AIR_SETTINGS_LAYOUT_NETWORK_H__ */
image, IC_LOCK_NETWORK_FOC_04_PNG COMP;
image, IC_CHECK_NOR_PNG COMP;
image, IC_CHECK_FOC_PNG COMP;
+ image, IC_NETWORK_LOADING_01_PNG COMP;
+ image, IC_NETWORK_LOADING_02_PNG COMP;
+ image, IC_NETWORK_LOADING_03_PNG COMP;
+ image, IC_NETWORK_LOADING_04_PNG COMP;
+ image, IC_NETWORK_LOADING_05_PNG COMP;
+ image, IC_NETWORK_LOADING_06_PNG COMP;
+ image, IC_NETWORK_LOADING_07_PNG COMP;
+ image, IC_NETWORK_LOADING_08_PNG COMP;
+ image, IC_NETWORK_LOADING_09_PNG COMP;
+ image, IC_NETWORK_LOADING_10_PNG COMP;
+ image, IC_NETWORK_LOADING_11_PNG COMP;
+ image, IC_NETWORK_LOADING_12_PNG COMP;
}
script {
}
description {
state, "selected" 0.0;
- inherit, "default" 0.0;
- color, 64 136 211 255;
+ inherit, "focused" 0.0;
}
}
}
part {
+ name, "part.loading.icon";
+ type, IMAGE;
+ scale, 1;
+ description {
+ state, "default" 0.0;
+ min, 50 50;
+ rel1 {
+ to, "padding.check.icon";
+ relative, 0.0 0.5;
+ }
+ rel2 {
+ to, "padding.check.icon";
+ relative, 0.0 0.5;
+ }
+ align, 1.0 0.5;
+ fixed, 1 1;
+ image.normal, IC_NETWORK_LOADING_01_PNG;
+ visible, 0;
+ }
+ description {
+ state, "visible" 0.0;
+ inherit, "default" 0.0;
+ image {
+ normal, IC_NETWORK_LOADING_01_PNG;
+ tween, IC_NETWORK_LOADING_02_PNG;
+ tween, IC_NETWORK_LOADING_03_PNG;
+ tween, IC_NETWORK_LOADING_04_PNG;
+ tween, IC_NETWORK_LOADING_05_PNG;
+ tween, IC_NETWORK_LOADING_06_PNG;
+ tween, IC_NETWORK_LOADING_07_PNG;
+ tween, IC_NETWORK_LOADING_08_PNG;
+ tween, IC_NETWORK_LOADING_09_PNG;
+ tween, IC_NETWORK_LOADING_10_PNG;
+ tween, IC_NETWORK_LOADING_11_PNG;
+ tween, IC_NETWORK_LOADING_12_PNG;
+ }
+ visible, 1;
+ }
+ }
+
+ part {
name, "part.inside.line.up";
type, RECT;
scale, 1;
name, "item_selected";
action, SIGNAL_EMIT SIG_ITEM_SELECTED SRC_EDC;
}
+
+ program {
+ name, "loading_state_loop";
+ signal, SIG_LOADING_START;
+ source, SRC_ELM;
+ action, STATE_SET "visible" 0.0;
+ target, "part.loading.icon";
+ transition, LINEAR 0.5;
+ after, "after_loading_started";
+ }
+
+ program {
+ name, "after_loading_started";
+ script {
+ run_program(PROGRAM:"loading_state_loop");
+ }
+ }
+
+ program {
+ signal, SIG_LOADING_STOP;
+ source, SRC_ELM;
+ action, STATE_SET "default" 0.0;
+ target, "part.loading.icon";
+ }
}
}
}
if (dmgr->dclass->update)
- dmgr->dclass->update(dmgr->dclass_data);
+ return dmgr->dclass->update(dmgr->dclass_data);
return true;
}
}
if (dmgr->dclass->select)
- dmgr->dclass->select(dmgr->dclass_data, it, data);
+ return dmgr->dclass->select(dmgr->dclass_data, it, data);
return true;
}
Eina_List *list;
};
-struct list_item {
+struct list_info {
char *list_id;
struct gridmgr *gmgr;
Evas_Object *grid;
bool listmgr_destroy(struct listmgr *listmgr)
{
- struct list_item *litem;
+ struct list_info *linfo;
if (!listmgr) {
_ERR("Invalid argument.");
return false;
}
- EINA_LIST_FREE(listmgr->list, litem) {
- gridmgr_destroy(litem->gmgr);
- free(litem->list_id);
- free(litem);
+ EINA_LIST_FREE(listmgr->list, linfo) {
+ gridmgr_destroy(linfo->gmgr);
+ free(linfo->list_id);
+ free(linfo);
}
free(listmgr);
return true;
}
-static struct list_item *_get_list_item(struct listmgr *listmgr,
+static struct list_info *_get_list_info(struct listmgr *listmgr,
const char *list_id)
{
Eina_List *l;
- struct list_item *litem;
+ struct list_info *linfo;
- EINA_LIST_FOREACH(listmgr->list, l, litem) {
- if (!litem)
+ EINA_LIST_FOREACH(listmgr->list, l, linfo) {
+ if (!linfo)
continue;
- if (!strcmp(litem->list_id, list_id))
- return litem;
+ if (!strcmp(linfo->list_id, list_id))
+ return linfo;
}
return NULL;
static void _grid_item_selected_cb(void *data, Elm_Object_Item *it,
const char *emission, const char *source)
{
- struct list_item *litem;
+ struct list_info *linfo;
if (!data || !it) {
_ERR("Invalid argument.");
return;
}
- litem = data;
+ linfo = data;
- if (litem->selected_cb)
- litem->selected_cb(it, litem->cb_data);
+ if (linfo->selected_cb)
+ linfo->selected_cb(it, linfo->cb_data);
elm_gengrid_item_selected_set(it, EINA_FALSE);
}
.unrealized = _grid_unrealized_cb
};
-static bool _add_grid(struct list_item *litem, Evas_Object *parent,
+static bool _add_grid(struct list_info *linfo, Evas_Object *parent,
struct grid_class *gclass)
{
struct gridmgr *gmgr;
return false;
}
- if (!gridmgr_add_grid(gmgr, litem->list_id, grid, gclass)) {
+ if (!gridmgr_add_grid(gmgr, linfo->list_id, grid, gclass)) {
_ERR("Gridmgr add grid failed.");
evas_object_del(grid);
gridmgr_destroy(gmgr);
return false;
}
- inputmgr_add_callback(grid, 0, &_grid_input_handler, litem);
+ inputmgr_add_callback(grid, 0, &_grid_input_handler, linfo);
- litem->gmgr = gmgr;
- litem->grid = grid;
+ linfo->gmgr = gmgr;
+ linfo->grid = grid;
return true;
}
void (*selected_cb)(Elm_Object_Item *it, void *data),
void *cb_data)
{
- struct list_item *litem;
+ struct list_info *linfo;
if (!listmgr || !list_id || !gclass) {
_ERR("Invalid argument.");
return false;
}
- litem = _get_list_item(listmgr, list_id);
- if (litem) {
+ linfo = _get_list_info(listmgr, list_id);
+ if (linfo) {
_ERR("LIST ID [%s] already exists.", list_id);
return false;
}
- litem = calloc(1, sizeof(*litem));
- if (!litem) {
+ linfo = calloc(1, sizeof(*linfo));
+ if (!linfo) {
_ERR("Calloc failed.");
return false;
}
- litem->list_id = strdup(list_id);
+ linfo->list_id = strdup(list_id);
if (selected_cb)
- litem->selected_cb = selected_cb;
+ linfo->selected_cb = selected_cb;
if (cb_data)
- litem->cb_data = cb_data;
+ linfo->cb_data = cb_data;
- if (!_add_grid(litem, listmgr->parent, gclass)) {
+ if (!_add_grid(linfo, listmgr->parent, gclass)) {
_ERR("Add grid failed.");
- free(litem);
+ free(linfo);
return false;
}
- listmgr->list = eina_list_append(listmgr->list, litem);
+ listmgr->list = eina_list_append(listmgr->list, linfo);
return true;
}
bool listmgr_remove_list(struct listmgr *listmgr, const char *list_id)
{
- struct list_item *litem;
+ struct list_info *linfo;
if (!listmgr || !list_id) {
_ERR("Invalid argument.");
return false;
}
- litem = _get_list_item(listmgr, list_id);
- if (!litem) {
+ linfo = _get_list_info(listmgr, list_id);
+ if (!linfo) {
_ERR("List %s does not exist.", list_id);
return false;
}
- gridmgr_destroy(litem->gmgr);
+ gridmgr_destroy(linfo->gmgr);
- free(litem->list_id);
+ free(linfo->list_id);
- listmgr->list = eina_list_remove(listmgr->list, litem);
+ listmgr->list = eina_list_remove(listmgr->list, linfo);
return true;
}
bool listmgr_show_list(struct listmgr *listmgr, const char *list_id,
const char *part, Eina_List *list)
{
- struct list_item *litem;
+ struct list_info *linfo;
if (!listmgr || !list_id || !part || !list) {
_ERR("Invalid argument.");
return false;
}
- litem = _get_list_item(listmgr, list_id);
- if (!litem) {
+ linfo = _get_list_info(listmgr, list_id);
+ if (!linfo) {
_ERR("List %s does not exist.", list_id);
return false;
}
- if (!gridmgr_append_list(litem->gmgr, list_id, list)) {
+ if (!gridmgr_append_list(linfo->gmgr, list_id, list)) {
_ERR("Gridmgr append list failed.");
return false;
}
- elm_object_part_content_set(listmgr->parent, part, litem->grid);
- evas_object_show(litem->grid);
+ elm_object_part_content_set(listmgr->parent, part, linfo->grid);
+ evas_object_show(linfo->grid);
return true;
}
bool listmgr_hide_list(struct listmgr *listmgr, const char *list_id,
const char *part)
{
- struct list_item *litem;
+ struct list_info *linfo;
if (!listmgr || !list_id || !part) {
_ERR("Invalid argument.");
return false;
}
- litem = _get_list_item(listmgr, list_id);
- if (!litem) {
+ linfo = _get_list_info(listmgr, list_id);
+ if (!linfo) {
_ERR("List %s does not exist.", list_id);
return false;
}
elm_object_part_content_unset(listmgr->parent, part);
- evas_object_hide(litem->grid);
+ evas_object_hide(linfo->grid);
return true;
}
Eina_List *list;
void (*event_cb)(enum event_type type, void *data);
void *cb_data;
+ char *new_passcode;
+ Elm_Object_Item *new_ap;
};
static void *_create(void (*event_cb)(enum event_type type, void *data),
return true;
}
-bool _wifi_forget_last_ap(void)
-{
- wifi_ap_h ap;
- int r;
-
- r = wifi_get_connected_ap(&ap);
- if (r == WIFI_ERROR_NO_CONNECTION) {
- return true;
- } else if (r != WIFI_ERROR_NONE) {
- _ERR("Get connected ap failed.");
- return false;
- }
-
- r = wifi_forget_ap(ap);
- if (r != WIFI_ERROR_NONE) {
- _ERR("Forget ap failed.");
- wifi_ap_destroy(ap);
- return false;
- }
-
- return true;
-}
-
bool _wifi_set_passcode(wifi_ap_h ap, char *passcode)
{
int r;
return true;
}
-static void _wifi_connected_cb(wifi_error_e err, void *user_data)
+static void _wifi_connected_cb(wifi_error_e err, void *data)
{
struct _priv *priv;
- if (!user_data) {
+ if (!data) {
_ERR("Invalid argument.");
return;
}
- priv = user_data;
+ priv = data;
if (err != WIFI_ERROR_NONE) {
_ERR("Connect ap failed.");
+ if (priv->event_cb)
+ priv->event_cb(EVENT_DATA_SELECT_FAIL, priv->cb_data);
+
return;
}
priv->event_cb(EVENT_DATA_SELECT_DONE, priv->cb_data);
}
+static void _wifi_connect_new_ap(struct _priv *priv)
+{
+ struct wifi_ap_info *ap_info;
+ int r;
+
+ ap_info = elm_object_item_data_get(priv->new_ap);
+ if (!ap_info || !ap_info->ap)
+ return;
+
+ if (priv->new_passcode) {
+ if (!_wifi_set_passcode(ap_info->ap, priv->new_passcode)) {
+ _ERR("Set passcode failed.");
+ return;
+ }
+ }
+
+ r = wifi_connect(ap_info->ap, _wifi_connected_cb, priv);
+ if (r != WIFI_ERROR_NONE)
+ _ERR("Wifi connect failed.");
+}
+
+static void _wifi_prev_ap_disconnected(wifi_error_e err, void *data)
+{
+ struct _priv *priv;
+
+ if (!data) {
+ _ERR("Invalid argument.");
+ return;
+ }
+
+ priv = data;
+
+ _wifi_connect_new_ap(priv);
+}
+
static bool _select(void *dclass_data, Elm_Object_Item *it, void *data)
{
struct _priv *priv;
- struct wifi_ap_info *ap_info;
+ wifi_ap_h prev_ap;
int r;
if (!dclass_data || !it) {
}
priv = dclass_data;
+ priv->new_ap = it;
- ap_info = elm_object_item_data_get(it);
- if (!ap_info || !ap_info->ap)
- return false;
-
- if (!_wifi_forget_last_ap()) {
- _ERR("Forget last ap failed.");
- return false;
+ if (priv->new_passcode) {
+ free(priv->new_passcode);
+ priv->new_passcode = NULL;
}
- if (data) {
- if (!_wifi_set_passcode(ap_info->ap, (char *)data)) {
- _ERR("Set passcode failed.");
- return false;
- }
+ if (data)
+ priv->new_passcode = (char *)data;
+
+ r = wifi_get_connected_ap(&prev_ap);
+ if (r == WIFI_ERROR_NO_CONNECTION) {
+ _wifi_connect_new_ap(priv);
+ return true;
+ } else if (r != WIFI_ERROR_NONE) {
+ _ERR("Get connected ap failed.");
+ return false;
}
- r = wifi_connect(ap_info->ap, _wifi_connected_cb, priv);
+ r = wifi_disconnect(prev_ap, _wifi_prev_ap_disconnected, priv);
if (r != WIFI_ERROR_NONE) {
- _ERR("Wifi connect failed.");
+ _ERR("Forget ap failed.");
+ wifi_ap_destroy(prev_ap);
return false;
}
+ wifi_ap_destroy(prev_ap);
+
return true;
}
case TYPE_WIRELESS:
elm_object_text_set(priv->action_btn, STR_REFRESH);
- datamgr_update(priv->wirelessmgr);
+ if (!datamgr_update(priv->wirelessmgr)) {
+ _ERR("Unavailable status for updating list.");
+ return;
+ }
break;
} else if (!strcmp(ev->keyname, KEY_ENTER)) {
switch (priv->cur_type) {
case TYPE_WIRELESS:
- datamgr_update(priv->wirelessmgr);
+ if (!datamgr_update(priv->wirelessmgr))
+ _ERR("Unavailable status for updating list.");
+
break;
case TYPE_WIRED:
break;
case EVENT_DATA_SELECT_DONE:
- /* It should be implemented later. */
+ /* FIXME: Currently, layout is refreshed when AP connected. */
+ if (!datamgr_update(priv->wirelessmgr)) {
+ _ERR("Unavailable status for updating list.");
+ return;
+ }
+
+ elm_object_item_signal_emit(priv->selected_wireless_item,
+ SIG_LOADING_STOP, SRC_ELM);
+ break;
+
+ case EVENT_DATA_SELECT_FAIL:
+ /* FIXME: It will be implemeted later as follinw GUI guide. */
break;
default:
}
}
+static void _connect_wifi_with_passcode(struct _priv *priv)
+{
+ char *passcode;
+
+ passcode = elm_entry_markup_to_utf8
+ (elm_entry_entry_get(priv->passcode_entry));
+ if (!passcode) {
+ _ERR("Passcode is NULL.");
+ return;
+ }
+
+ if (!datamgr_select(priv->wirelessmgr, priv->selected_wireless_item,
+ passcode)) {
+ _ERR("Unavailable status for selecting wifi.");
+ return;
+ }
+
+ elm_object_item_signal_emit(priv->selected_wireless_item,
+ SIG_LOADING_START, SRC_ELM);
+
+ evas_object_del(priv->passcode_popup);
+}
+
static void _popup_clicked_cb(int id, void *data, Evas_Object *obj)
{
struct _priv *priv;
break;
case EO_BTN_OK:
- /* It will be implemented later. */
+ _connect_wifi_with_passcode(priv);
break;
default:
priv = data;
- if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_ESC))
+ if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_ESC)) {
evas_object_del(priv->passcode_popup);
+ } else if (!strcmp(ev->keyname, KEY_ENTER)) {
+ if (id == EO_ENTRY_PASSCODE)
+ _connect_wifi_with_passcode(priv);
+ }
}
static input_handler _popup_input_handler = {
return;
}
} else {
- datamgr_select(priv->wirelessmgr, it, NULL);
+ if (!datamgr_select(priv->wirelessmgr, it, NULL)) {
+ _ERR("Unavailable status for selecting wifi.");
+ return;
+ }
+
+ elm_object_item_signal_emit(priv->selected_wireless_item,
+ SIG_LOADING_START, SRC_ELM);
}
}
priv = layout_data;
if (priv->ly) {
- datamgr_update(priv->wirelessmgr);
+ if (!datamgr_update(priv->wirelessmgr)) {
+ _ERR("Unavailable status for updating list.");
+ return;
+ }
evas_object_show(priv->ly);
elm_object_part_content_set(priv->base, PART_CONTENT, priv->ly);