Handle event on WiFi receiver removal 18/102518/1
authorJiwan Kim <ji-wan.kim@samsung.com>
Tue, 6 Dec 2016 04:58:54 +0000 (13:58 +0900)
committerJiwan Kim <ji-wan.kim@samsung.com>
Tue, 6 Dec 2016 04:58:54 +0000 (13:58 +0900)
 - Fix for TSAM-10923 / TSAM-10950
 - Store WiFi device state and print message on error case
 - Support WiFi connection event to show valid WiFi state

Change-Id: Ia29e50953cd92301227c01f07e765cac45ae5aa7
Signed-off-by: Jiwan Kim <ji-wan.kim@samsung.com>
include/common/datamgr.h
src/data/system/data_wireless.c
src/layout/layout_network.c

index c5164e3..67ae396 100644 (file)
@@ -23,6 +23,7 @@
 struct datamgr;
 
 enum event_type {
+       EVENT_DATA_INIT_DONE_WIRELESS,
        EVENT_DATA_INIT_FAIL_WIRELESS,
        EVENT_DATA_UPDATE_DONE,
        EVENT_DATA_SELECT_DONE,
index a60ec3a..1652018 100644 (file)
@@ -45,10 +45,61 @@ static WIFI_SIGNAL_LEVEL __convert_rssi_value(int rssi_dBm)
        return level;
 }
 
+static const char *wifi_error_to_string(wifi_error_e err_type)
+{
+       switch (err_type) {
+       case WIFI_ERROR_NONE:
+               return "NONE";
+       case WIFI_ERROR_INVALID_PARAMETER:
+               return "INVALID_PARAMETER";
+       case WIFI_ERROR_OUT_OF_MEMORY:
+               return "OUT_OF_MEMORY";
+       case WIFI_ERROR_INVALID_OPERATION:
+               return "INVALID_OPERATION";
+       case WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED:
+               return "ADDRESS_FAMILY_NOT_SUPPORTED";
+       case WIFI_ERROR_OPERATION_FAILED:
+               return "OPERATION_FAILED";
+       case WIFI_ERROR_NO_CONNECTION:
+               return "NO_CONNECTION";
+       case WIFI_ERROR_NOW_IN_PROGRESS:
+               return "NOW_IN_PROGRESS";
+       case WIFI_ERROR_ALREADY_EXISTS:
+               return "ALREADY_EXISTS";
+       case WIFI_ERROR_OPERATION_ABORTED:
+               return "OPERATION_ABORTED";
+       case WIFI_ERROR_DHCP_FAILED:
+               return "DHCP_FAILED";
+       case WIFI_ERROR_INVALID_KEY:
+               return "INVALID_KEY";
+       case WIFI_ERROR_NO_REPLY:
+               return "NO_REPLY";
+       case WIFI_ERROR_SECURITY_RESTRICTED:
+               return "SECURITY_RESTRICTED";
+       case WIFI_ERROR_PERMISSION_DENIED:
+               return "PERMISSION_DENIED";
+       case WIFI_ERROR_NOT_SUPPORTED:
+               return "NOT_SUPPORTED";
+       }
+
+       return "UNKNOWN";
+}
+
+static void __wireless_device_state_callback(wifi_device_state_e state, void* user_data)
+{
+       if (state == WIFI_DEVICE_STATE_ACTIVATED) {
+               _DBG("Device state changed callback state : Activated");
+       } else {
+               _DBG("Device state changed callback state : Deactivated");
+       }
+}
+
 static void *_create(void (*event_cb)(enum event_type type, void *data),
                void *cb_data)
 {
        struct _priv *priv;
+       bool state = false;
+       int rv = 0;
 
        priv = calloc(1, sizeof(*priv));
        if (!priv) {
@@ -64,14 +115,26 @@ static void *_create(void (*event_cb)(enum event_type type, void *data),
 
        if (wifi_initialize() != WIFI_ERROR_NONE) {
                _ERR("wifi_initialize failed.");
-               if (event_cb)
-                       event_cb(EVENT_DATA_INIT_FAIL_WIRELESS, cb_data);
+               goto FAIL;
+       }
 
-               free(priv);
-               return NULL;
+       rv = wifi_is_activated(&state);
+       if (rv != WIFI_ERROR_NONE) {
+               _ERR("Fail to get Wi-Fi device state [%s]", wifi_error_to_string(rv));
+               goto FAIL;
        }
 
+       /* Set device state callback */
+       wifi_set_device_state_changed_cb(__wireless_device_state_callback, priv);
+
        return priv;
+
+FAIL:
+       if (event_cb)
+               event_cb(EVENT_DATA_INIT_FAIL_WIRELESS, cb_data);
+
+       free(priv);
+       return NULL;
 }
 
 static void _free_wifi_list(Eina_List *list)
@@ -267,6 +330,8 @@ static void _wifi_scan_finished_cb(wifi_error_e err, void *data)
 
        if (!activated) {
                _ERR("wifi device is not activated.");
+               if (priv->event_cb)
+                       priv->event_cb(EVENT_DATA_INIT_FAIL_WIRELESS, priv->cb_data);
                return;
        }
 
@@ -285,6 +350,7 @@ static void _wifi_scan_finished_cb(wifi_error_e err, void *data)
 
 static void _wifi_activated_cb(wifi_error_e err, void *data)
 {
+       struct _priv *priv;
        int r;
 
        if (!data) {
@@ -292,8 +358,12 @@ static void _wifi_activated_cb(wifi_error_e err, void *data)
                return;
        }
 
+       priv = data;
+
        if (err != WIFI_ERROR_NONE) {
                _ERR("wifi activation failed.");
+               if (priv->event_cb)
+                       priv->event_cb(EVENT_DATA_INIT_FAIL_WIRELESS, priv->cb_data);
                return;
        }
 
index 7de3d99..83d3880 100644 (file)
@@ -340,17 +340,6 @@ static void _retry_wired_network(struct _priv *priv)
 
 static void _retry_wireless_network(struct _priv *priv)
 {
-       /* If device doesn't support wireless
-        * i.e. emulator */
-       if (!priv->wireless_support) {
-               elm_object_signal_emit(priv->ly, SIG_NO_WIRELESS, SRC_ELM);
-               elm_object_signal_emit(priv->ly, SIG_LOADING_STOP, SRC_ELM);
-               elm_object_part_text_set(priv->ly, PART_NO_NETWORK_TEXT, STR_NO_NETWORK);
-               listmgr_hide_grid(priv->listmgr, LIST_WIRELESS,
-                       PART_WIRELESS_LIST);
-               return;
-       }
-
        /* If wireless scan is already requested,
         * do not update again. it would returns error. */
        if (priv->wireless_update_requested) {
@@ -529,8 +518,10 @@ static input_handler _grid_input_handler = {
 static void _draw_no_contents_message(struct _priv *priv)
 {
        elm_object_signal_emit(priv->ly, SIG_NO_WIRELESS, SRC_ELM);
-       elm_object_part_text_set(priv->ly, PART_NO_NETWORK_TEXT,
-                       STR_NO_NETWORK);
+       elm_object_signal_emit(priv->ly, SIG_LOADING_STOP, SRC_ELM);
+       elm_object_part_text_set(priv->ly, PART_NO_NETWORK_TEXT, STR_NO_NETWORK);
+       listmgr_hide_grid(priv->listmgr, LIST_WIRELESS,
+               PART_WIRELESS_LIST);
 }
 
 static void _wireless_data_found_done(struct _priv *priv, Eina_List *list)
@@ -624,7 +615,9 @@ static void _data_event_cb(enum event_type type, void *data)
        switch (type) {
        case EVENT_DATA_INIT_FAIL_WIRELESS:
                /* Failed to initialize wireless */
+               _DBG("Wireless is not activated");
                priv->wireless_support = false;
+               priv->wireless_update_requested = false;
 
                elm_object_signal_emit(priv->ly, SIG_NO_WIRELESS, SRC_ELM);
                elm_object_signal_emit(priv->ly, SIG_LOADING_STOP, SRC_ELM);
@@ -797,7 +790,6 @@ static void _popup_entry_key_down_cb(void *data, Evas *e, Evas_Object *obj, void
 {
        struct _priv *priv = (struct _priv *)data;
        Evas_Event_Key_Down *ev = (Evas_Event_Key_Down*)event_info;
-       const char *str = NULL;
 
        if (!priv || !ev) {
                _ERR("Invalid callback data !");