Network layout: Connect new AP when item is selected 13/49513/2
authorHyojung Jo <hj903.jo@samsung.com>
Wed, 14 Oct 2015 06:28:45 +0000 (15:28 +0900)
committerHyojung Jo <hj903.jo@samsung.com>
Wed, 14 Oct 2015 07:15:12 +0000 (16:15 +0900)
Change-Id: I753f617ca8a44cd8163802a4394e4fcf06129898
Signed-off-by: Hyojung Jo <hj903.jo@samsung.com>
19 files changed:
include/datamgr.h
include/layout/network.h
res/images/network_loading_01.png [new file with mode: 0644]
res/images/network_loading_02.png [new file with mode: 0644]
res/images/network_loading_03.png [new file with mode: 0644]
res/images/network_loading_04.png [new file with mode: 0644]
res/images/network_loading_05.png [new file with mode: 0644]
res/images/network_loading_06.png [new file with mode: 0644]
res/images/network_loading_07.png [new file with mode: 0644]
res/images/network_loading_08.png [new file with mode: 0644]
res/images/network_loading_09.png [new file with mode: 0644]
res/images/network_loading_10.png [new file with mode: 0644]
res/images/network_loading_11.png [new file with mode: 0644]
res/images/network_loading_12.png [new file with mode: 0644]
res/widget/gengrid.edc
src/common/datamgr.c
src/common/listmgr.c
src/data/data_wireless.c
src/layout/layout_network.c

index 6f246b2..a955056 100644 (file)
@@ -24,6 +24,7 @@ struct datamgr;
 enum event_type {
        EVENT_DATA_UPDATE_DONE,
        EVENT_DATA_SELECT_DONE,
+       EVENT_DATA_SELECT_FAIL,
 };
 
 struct data_class {
index 801b4e8..523f198 100644 (file)
@@ -41,6 +41,8 @@
 /* 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__ */
diff --git a/res/images/network_loading_01.png b/res/images/network_loading_01.png
new file mode 100644 (file)
index 0000000..5dcaba7
Binary files /dev/null and b/res/images/network_loading_01.png differ
diff --git a/res/images/network_loading_02.png b/res/images/network_loading_02.png
new file mode 100644 (file)
index 0000000..2e8562d
Binary files /dev/null and b/res/images/network_loading_02.png differ
diff --git a/res/images/network_loading_03.png b/res/images/network_loading_03.png
new file mode 100644 (file)
index 0000000..84b608d
Binary files /dev/null and b/res/images/network_loading_03.png differ
diff --git a/res/images/network_loading_04.png b/res/images/network_loading_04.png
new file mode 100644 (file)
index 0000000..3f1d36d
Binary files /dev/null and b/res/images/network_loading_04.png differ
diff --git a/res/images/network_loading_05.png b/res/images/network_loading_05.png
new file mode 100644 (file)
index 0000000..776e460
Binary files /dev/null and b/res/images/network_loading_05.png differ
diff --git a/res/images/network_loading_06.png b/res/images/network_loading_06.png
new file mode 100644 (file)
index 0000000..72b0299
Binary files /dev/null and b/res/images/network_loading_06.png differ
diff --git a/res/images/network_loading_07.png b/res/images/network_loading_07.png
new file mode 100644 (file)
index 0000000..1b15c2b
Binary files /dev/null and b/res/images/network_loading_07.png differ
diff --git a/res/images/network_loading_08.png b/res/images/network_loading_08.png
new file mode 100644 (file)
index 0000000..969cc7a
Binary files /dev/null and b/res/images/network_loading_08.png differ
diff --git a/res/images/network_loading_09.png b/res/images/network_loading_09.png
new file mode 100644 (file)
index 0000000..1dad22a
Binary files /dev/null and b/res/images/network_loading_09.png differ
diff --git a/res/images/network_loading_10.png b/res/images/network_loading_10.png
new file mode 100644 (file)
index 0000000..de91e86
Binary files /dev/null and b/res/images/network_loading_10.png differ
diff --git a/res/images/network_loading_11.png b/res/images/network_loading_11.png
new file mode 100644 (file)
index 0000000..2ebebbc
Binary files /dev/null and b/res/images/network_loading_11.png differ
diff --git a/res/images/network_loading_12.png b/res/images/network_loading_12.png
new file mode 100644 (file)
index 0000000..75f0fdd
Binary files /dev/null and b/res/images/network_loading_12.png differ
index 14aa3ac..949c866 100644 (file)
@@ -30,6 +30,18 @@ group {
                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 {
@@ -223,8 +235,7 @@ group {
                        }
                        description {
                                state, "selected" 0.0;
-                               inherit, "default" 0.0;
-                               color, 64 136 211 255;
+                               inherit, "focused" 0.0;
                        }
                }
 
@@ -291,6 +302,47 @@ group {
                }
 
                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;
@@ -456,5 +508,29 @@ group {
                        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";
+               }
        }
 }
index fc9dfa5..8fec320 100644 (file)
@@ -72,7 +72,7 @@ bool datamgr_update(struct datamgr *dmgr)
        }
 
        if (dmgr->dclass->update)
-               dmgr->dclass->update(dmgr->dclass_data);
+               return dmgr->dclass->update(dmgr->dclass_data);
 
        return true;
 }
@@ -85,7 +85,7 @@ bool datamgr_select(struct datamgr *dmgr, Elm_Object_Item *it, void *data)
        }
 
        if (dmgr->dclass->select)
-               dmgr->dclass->select(dmgr->dclass_data, it, data);
+               return dmgr->dclass->select(dmgr->dclass_data, it, data);
 
        return true;
 }
index 00cf905..efb12f9 100644 (file)
@@ -27,7 +27,7 @@ struct listmgr {
        Eina_List *list;
 };
 
-struct list_item {
+struct list_info {
        char *list_id;
        struct gridmgr *gmgr;
        Evas_Object *grid;
@@ -57,17 +57,17 @@ struct listmgr *listmgr_create(Evas_Object *parent)
 
 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);
@@ -76,18 +76,18 @@ bool listmgr_destroy(struct listmgr *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;
@@ -116,17 +116,17 @@ static void _grid_mouse_move_cb(int id, void *data, Evas *e, Evas_Object *obj,
 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);
 }
@@ -161,7 +161,7 @@ static input_handler _grid_input_handler = {
        .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;
@@ -181,17 +181,17 @@ static bool _add_grid(struct list_item *litem, Evas_Object *parent,
                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;
 }
@@ -201,64 +201,64 @@ bool listmgr_add_list(struct listmgr *listmgr, const char *list_id,
                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;
 }
@@ -266,26 +266,26 @@ bool listmgr_remove_list(struct listmgr *listmgr, const char *list_id)
 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;
 }
@@ -293,21 +293,21 @@ bool listmgr_show_list(struct listmgr *listmgr, const char *list_id,
 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;
 }
index 1fc974c..bcb994e 100644 (file)
@@ -24,6 +24,8 @@ struct _priv {
        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),
@@ -239,29 +241,6 @@ static bool _update(void *dclass_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;
@@ -278,19 +257,22 @@ bool _wifi_set_passcode(wifi_ap_h ap, char *passcode)
        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;
        }
 
@@ -298,10 +280,45 @@ static void _wifi_connected_cb(wifi_error_e err, void *user_data)
                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) {
@@ -310,29 +327,34 @@ static bool _select(void *dclass_data, Elm_Object_Item *it, void *data)
        }
 
        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;
 }
 
index 3880056..78fddba 100644 (file)
@@ -95,7 +95,10 @@ static void _network_type_option_selected(struct _priv *priv, int id,
        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;
 
@@ -217,7 +220,9 @@ static void _action_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
        } 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:
@@ -285,7 +290,18 @@ static void _data_event_cb(enum event_type type, void *data)
                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:
@@ -294,6 +310,29 @@ static void _data_event_cb(enum event_type type, void *data)
        }
 }
 
+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;
@@ -311,7 +350,7 @@ static void _popup_clicked_cb(int id, void *data, Evas_Object *obj)
                break;
 
        case EO_BTN_OK:
-               /* It will be implemented later. */
+               _connect_wifi_with_passcode(priv);
                break;
 
        default:
@@ -332,8 +371,12 @@ static void _popup_key_down_cb(int id, void *data, Evas *e, Evas_Object *obj,
 
        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 = {
@@ -428,7 +471,13 @@ static void _wireless_selected_cb(Elm_Object_Item *it, void *data)
                        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);
        }
 }
 
@@ -552,7 +601,10 @@ static void _show(void *layout_data)
        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);