Tethering: Add a vconf for Wi-Fi tethering state
[apps/native/ug-mobile-ap.git] / src / mh_main_ug.c
index 0f791ce..7babc58 100644 (file)
@@ -1,13 +1,13 @@
 /*
 * ug-mobile-ap
 *
-* Copyright 2012  Samsung Electronics Co., Ltd
+* Copyright 2012-2013  Samsung Electronics Co., Ltd
 
-* Licensed under the Flora License, Version 1.0 (the "License");
+* Licensed under the Flora License, Version 1.1 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 
-* http://www.tizenopensource.org/license
+* http://floralicense.org/license
 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 #include "mobile_hotspot.h"
 #include "mh_view_main.h"
 #include "mh_func_onoff.h"
+#include "mh_common_utility.h"
 
-static Evas_Object *create_content(Evas_Object *parent,
-               mh_ugdata_t *ugd, mh_appdata_t *ad)
+static Evas_Object *create_content(mh_appdata_t *ad)
 {
        __MOBILE_AP_FUNC_ENTER__;
 
-       ad->naviframe = _create_naviframe(ugd->base);
+       ad->naviframe = _create_naviframe(ad->layout);
        ap_draw_contents(ad);
 
-       /* init internationalization */
-       dgettext(PACKAGE, LOCALEDIR);
-
        __MOBILE_AP_FUNC_EXIT__;
 
        return ad->naviframe;
 }
 
-static Evas_Object *create_fullview(Evas_Object *parent, mh_ugdata_t *ugd)
-{
-       __MOBILE_AP_FUNC_ENTER__;
-
-       Evas_Object *base;
-       Evas_Object *bg;
-
-       /* Create Full view */
-       base = _create_layout(parent);
-       if (base == NULL) {
-               ERR("base is NULL\n");
-               return NULL;
-       }
-
-       bg = _create_bg(base, "group_list");
-       if (bg == NULL) {
-               ERR("bg is NULL\n");
-               evas_object_del(base);
-               return NULL;
-       }
-       elm_object_part_content_set(base, "elm.swallow.bg", bg);
-
-       elm_win_resize_object_add(parent, base);
-
-       __MOBILE_AP_FUNC_EXIT__;
-       return base;
-}
-
-static Evas_Object *create_frameview(Evas_Object *parent, mh_ugdata_t *ugd)
-{
-       __MOBILE_AP_FUNC_ENTER__;
-
-       Evas_Object *base;
-       Evas_Object *bg;
-
-       /* Create Frame view */
-       base = _create_layout(parent);
-       if (base == NULL) {
-               ERR("base is NULL\n");
-               return NULL;
-       }
-
-       bg = _create_bg(base, "group_list");
-       if (bg == NULL) {
-               ERR("bg is NULL\n");
-               evas_object_del(base);
-               return NULL;
-       }
-       elm_object_part_content_set(base, "elm.swallow.bg", bg);
-
-       elm_win_resize_object_add(parent, base);
-
-       __MOBILE_AP_FUNC_EXIT__;
-       return base;
-}
-
 static void __set_callbacks(tethering_h handle, void *user_data)
 {
-       tethering_set_enabled_cb(handle, TETHERING_TYPE_USB, _enabled_cb, user_data);
-       tethering_set_enabled_cb(handle, TETHERING_TYPE_WIFI, _enabled_cb, user_data);
-       tethering_set_enabled_cb(handle, TETHERING_TYPE_BT, _enabled_cb, user_data);
+       int ret;
+
+       ret = tethering_set_enabled_cb(handle, TETHERING_TYPE_ALL,
+                       _enabled_cb, user_data);
+       if (ret != TETHERING_ERROR_NONE)
+               ERR("tethering_set_enabled_cb [0x%X]\n", ret);
 
-       tethering_set_disabled_cb(handle, TETHERING_TYPE_USB, _disabled_cb, user_data);
-       tethering_set_disabled_cb(handle, TETHERING_TYPE_WIFI, _disabled_cb, user_data);
-       tethering_set_disabled_cb(handle, TETHERING_TYPE_BT, _disabled_cb, user_data);
+       ret = tethering_set_disabled_cb(handle, TETHERING_TYPE_ALL,
+                       _disabled_cb, user_data);
+       if (ret != TETHERING_ERROR_NONE)
+               ERR("tethering_set_disabled_cb [0x%X]\n", ret);
 
-       tethering_set_connection_state_changed_cb(handle, TETHERING_TYPE_USB, _connection_changed_cb, user_data);
-       tethering_set_connection_state_changed_cb(handle, TETHERING_TYPE_WIFI, _connection_changed_cb, user_data);
-       tethering_set_connection_state_changed_cb(handle, TETHERING_TYPE_BT, _connection_changed_cb, user_data);
+       ret = tethering_set_connection_state_changed_cb(handle,
+                       TETHERING_TYPE_ALL,
+                       _connection_changed_cb, user_data);
+       if (ret != TETHERING_ERROR_NONE)
+               ERR("tethering_set_connection_state_changed_cb [0x%X]\n", ret);
 }
 
 static void __unset_callbacks(tethering_h handle)
 {
-       tethering_unset_enabled_cb(handle, TETHERING_TYPE_USB);
-       tethering_unset_enabled_cb(handle, TETHERING_TYPE_WIFI);
-       tethering_unset_enabled_cb(handle, TETHERING_TYPE_BT);
+       int ret;
 
-       tethering_unset_disabled_cb(handle, TETHERING_TYPE_USB);
-       tethering_unset_disabled_cb(handle, TETHERING_TYPE_WIFI);
-       tethering_unset_disabled_cb(handle, TETHERING_TYPE_BT);
+       ret = tethering_unset_connection_state_changed_cb(handle,
+                       TETHERING_TYPE_ALL);
+       if (ret != TETHERING_ERROR_NONE)
+               ERR("tethering_unset_connection_state_changed_cb[0x%X]\n", ret);
+
+       ret = tethering_unset_disabled_cb(handle, TETHERING_TYPE_ALL);
+       if (ret != TETHERING_ERROR_NONE)
+               ERR("tethering_unset_disabled_cb [0x%X]\n", ret);
 
-       tethering_unset_connection_state_changed_cb(handle, TETHERING_TYPE_USB);
-       tethering_unset_connection_state_changed_cb(handle, TETHERING_TYPE_WIFI);
-       tethering_unset_connection_state_changed_cb(handle, TETHERING_TYPE_BT);
+       ret = tethering_unset_enabled_cb(handle, TETHERING_TYPE_ALL);
+       if (ret != TETHERING_ERROR_NONE)
+               ERR("tethering_unset_enabled [0x%X]\n", ret);
 }
 
 static void *on_create(ui_gadget_h ug, enum ug_mode mode,
@@ -137,12 +87,19 @@ static void *on_create(ui_gadget_h ug, enum ug_mode mode,
                return NULL;
        }
 
+       if (mode != UG_MODE_FULLVIEW) {
+               ERR("Only Fullview is supported\n");
+               return NULL;
+       }
+
+       Evas_Object *layout;
        Evas_Object *content;
        mh_ugdata_t *ugd;
        mh_appdata_t *ad;
        int ret;
 
        bindtextdomain(MH_TEXT_DOMAIN, MH_LOCALEDIR);
+       dgettext(PACKAGE, LOCALEDIR);
 
        ad = (mh_appdata_t *)malloc(sizeof(mh_appdata_t));
        if (ad == NULL) {
@@ -152,34 +109,48 @@ static void *on_create(ui_gadget_h ug, enum ug_mode mode,
        }
        memset(ad, 0x0, sizeof(mh_appdata_t));
 
-       if (tethering_create(&ad->handle) != TETHERING_ERROR_NONE) {
-               ERR("tethering_create is failed\n");
+       ugd = (mh_ugdata_t *)priv;
+       ugd->ad = ad;
+       ugd->ug = ug;
+       ad->gadget = ugd;
+
+       ecore_imf_init();
+
+       ret = tethering_create(&ad->handle);
+       if (ret != TETHERING_ERROR_NONE) {
+               ERR("tethering_create is failed : %d\n", ret);
                free(ad);
+               ugd->ad = NULL;
                return NULL;
        }
 
-       ugd = (mh_ugdata_t *)priv;
-       ugd->ad = ad;
-       ugd->ug = ug;
-       ad->gadget= ugd;
        ad->win = ug_get_parent_layout(ug);
        if (!ad->win) {
                ERR("ad->win is NULL\n");
                free(ad);
+               ugd->ad = NULL;
                return NULL;
        }
 
-       if (mode == UG_MODE_FULLVIEW)
-               ugd->base = create_fullview(ad->win, ugd);
-       else
-               ugd->base = create_frameview(ad->win, ugd);
+       layout = _create_win_layout(ad);
+       if (layout == NULL) {
+               ERR("_create_win_layout is failed\n");
+               free(ad);
+               ugd->ad = NULL;
+               return NULL;
+       }
 
-       if (ugd->base) {
-               content = create_content(ad->win, ugd, ad);
-               elm_object_part_content_set(ugd->base, "elm.swallow.content", content);
-               evas_object_show(ugd->base);
+       content = create_content(ad);
+       if (content == NULL) {
+               ERR("create_content is failed\n");
+               free(ad);
+               ugd->ad = NULL;
+               return NULL;
        }
 
+       elm_object_part_content_set(layout, "elm.swallow.content", content);
+       evas_object_show(layout);
+
        ret = connection_create(&ad->conn_handle);
        if (ret != CONNECTION_ERROR_NONE) {
                ERR("connection_create() is failed : %d\n", ret);
@@ -193,7 +164,7 @@ static void *on_create(ui_gadget_h ug, enum ug_mode mode,
        __set_callbacks(ad->handle, (void *)ad);
 
        __MOBILE_AP_FUNC_EXIT__;
-       return ugd->base;
+       return layout;
 }
 
 static void on_start(ui_gadget_h ug, service_h service, void *priv)
@@ -214,51 +185,64 @@ static void on_destroy(ui_gadget_h ug, service_h service, void *priv)
 {
        __MOBILE_AP_FUNC_ENTER__;
 
-       if (!ug || !priv) {
+       if (priv == NULL) {
                ERR("The param is NULL\n");
                return;
        }
 
        mh_ugdata_t *ugd = priv;
+       mh_appdata_t *ad = ugd->ad;
        int ret = 0;
 
-       if (ugd->ad == NULL || ugd->base == NULL) {
+       if (ad == NULL) {
                ERR("The param is NULL\n");
                return;
        }
 
-       __unset_callbacks(ugd->ad->handle);
-
-       _stop_update_data_packet_usage(ugd->ad);
-       DBG("After Stop update data packet usage\n");
+       __unset_callbacks(ad->handle);
+       _stop_update_data_packet_usage(ad);
 
        ret = wifi_deinitialize();
        if (ret != WIFI_ERROR_NONE) {
                ERR("wifi_deinitialize() is failed : %d\n", ret);
        }
 
-       ret = connection_destroy(ugd->ad->conn_handle);
+       ret = connection_destroy(ad->conn_handle);
        if (ret != CONNECTION_ERROR_NONE) {
                ERR("connection_destroy() is failed : %d\n", ret);
        }
 
-       ap_callback_del(ugd->ad);
-       DBG("After deleting callback functions \n");
+       ret = tethering_destroy(ad->handle);
+       if (ret != TETHERING_ERROR_NONE) {
+               ERR("tethering_destroy() is failed : %d\n", ret);
+       }
 
-       ret = tethering_destroy(ugd->ad->handle);
-       DBG("The result of tethering_destroy is %d\n", ret);
+       if (ad->layout == NULL) {
+               ERR("ad->layout is NULL\n");
+               free(ugd->ad);
+               ugd->ad = NULL;
+               return;
+       }
 
-       if (ugd->ad->popup) {
-               evas_object_del(ugd->ad->popup);
-               ugd->ad->popup = NULL;
+       ap_callback_del(ad);
+       if (ad->popup) {
+               evas_object_del(ad->popup);
+               ad->popup = NULL;
        }
-       evas_object_del(ugd->base);
-       ugd->base = NULL;
+
+       evas_object_del(ad->bg);
+       ad->bg = NULL;
+
+       evas_object_del(ad->layout);
+       ad->layout = NULL;
+
+       ecore_imf_shutdown();
 
        free(ugd->ad);
        ugd->ad = NULL;
 
        __MOBILE_AP_FUNC_EXIT__;
+       return;
 }
 
 static void on_message(ui_gadget_h ug, service_h msg,
@@ -266,6 +250,47 @@ static void on_message(ui_gadget_h ug, service_h msg,
 {
 }
 
+static void __rotate_changed_cb(mh_appdata_t *ad, enum ug_event rotate_state)
+{
+       if (ad == NULL) {
+               ERR("ad is NULL\n");
+               return;
+       }
+
+       Elm_Object_Item *top_navi_it = NULL;
+       mh_wifi_setting_view_t *st = &ad->setup;
+
+       ad->rotate_state = rotate_state;
+
+       top_navi_it = elm_naviframe_top_item_get(ad->naviframe);
+       if (top_navi_it == NULL) {
+               ERR("elm_naviframe_top_item_get returns NULL\n");
+               return;
+       }
+
+       if (top_navi_it != st->navi_it) {
+               return;
+       }
+
+       if (rotate_state == UG_EVENT_ROTATE_PORTRAIT ||
+                       rotate_state == UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN) {
+               DBG("Naviframe title is shown\n");
+               elm_naviframe_item_title_visible_set(st->navi_it,
+                               EINA_TRUE);
+       } else if (rotate_state == UG_EVENT_ROTATE_LANDSCAPE ||
+                       rotate_state == UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN) {
+               if (ad->imf_state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+                       DBG("Naviframe title is hided\n");
+                       elm_naviframe_item_title_visible_set(st->navi_it,
+                                       EINA_FALSE);
+               }
+       } else {
+               ERR("Unknown rotate_state : %d\n", rotate_state);
+       }
+
+       return;
+}
+
 static void on_event(ui_gadget_h ug, enum ug_event event,
                service_h service, void *priv)
 {
@@ -276,6 +301,9 @@ static void on_event(ui_gadget_h ug, enum ug_event event,
                return;
        }
 
+       mh_ugdata_t *ugd = (mh_ugdata_t *)priv;
+       mh_appdata_t *ad = ugd->ad;
+
        switch (event) {
        case UG_EVENT_LOW_MEMORY:
                DBG("UG_EVENT_LOW_MEMORY\n");
@@ -287,16 +315,14 @@ static void on_event(ui_gadget_h ug, enum ug_event event,
                DBG("UG_EVENT_LANG_CHANGE\n");
                break;
        case UG_EVENT_ROTATE_PORTRAIT:
-               DBG("UG_EVENT_ROTATE_PORTRAIT\n");
-               break;
        case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
-               DBG("UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN\n");
+               DBG("UG_EVENT_ROTATE_PORTRAIT[_UPSIDEDOWN]\n");
+               __rotate_changed_cb(ad, event);
                break;
        case UG_EVENT_ROTATE_LANDSCAPE:
-               DBG("UG_EVENT_ROTATE_LANDSCAPE\n");
-               break;
        case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
-               DBG("UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN\n");
+               DBG("UG_EVENT_ROTATE_LANDSCAPE[_UPSIDEDOWN]\n");
+               __rotate_changed_cb(ad, event);
                break;
        default:
                DBG("default\n");
@@ -317,7 +343,7 @@ static void on_key_event(ui_gadget_h ug, enum ug_key_event event,
        }
 
        mh_ugdata_t *ugd = (mh_ugdata_t *)priv;
-       mh_appdata_t *ad = (mh_appdata_t *)ugd->ad;
+       mh_appdata_t *ad = ugd->ad;
 
        if (ad == NULL) {
                ERR("ad is NULL\n");
@@ -326,17 +352,11 @@ static void on_key_event(ui_gadget_h ug, enum ug_key_event event,
 
        switch (event) {
        case UG_KEY_EVENT_END:
-               DBG("UG_KEY_EVENT_END is received  :  %p\n", ad->popup);
-               if (NULL == ad->popup) {
+               DBG("UG_KEY_EVENT_END is received : %p\n", ad->popup);
+               if (NULL == ad->popup)
                        ug_destroy_me(ug);
-                       break;
-               }
-
-               if (ad->popup_type != MH_POP_INFORMATION_WO_BUTTON) {
-                       evas_object_del(ad->popup);
-                       ad->popup = NULL;
-                       ad->popup_type = MH_POPUP_NONE;
-               }
+               else
+                       _destroy_popup(ad);
                break;
 
        default:
@@ -387,8 +407,7 @@ UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
                return;
        }
 
-       mh_ugdata_t *ugd;
-       ugd = ops->priv;
+       mh_ugdata_t *ugd = (mh_ugdata_t *)ops->priv;
 
        if (ugd)
                free(ugd);