4 * Copyright 2012 Samsung Electronics Co., Ltd
6 * Licensed under the Flora License, Version 1.1 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.tizenopensource.org/license
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
22 #define UG_MODULE_API __attribute__ ((visibility("default")))
28 #include <sys/utsname.h>
31 #include <Elementary.h>
32 #include <ui-gadget-module.h>
33 #include <app_control.h>
36 #include "wfd_ug_view.h"
37 #include "wfd_client.h"
38 #ifdef MOTION_CONTROL_ENABLE
39 #include "wfd_motion_control.h"
42 void initialize_gen_item_class();
44 struct ug_data *global_ugd = NULL;
46 struct ug_data *wfd_get_ug_data()
51 static void __wfd_main_vconf_change_cb(keynode_t *key, void *data)
54 WFD_RET_IF(NULL == key, "ERROR : key is NULL !!\n");
55 WFD_RET_IF(NULL == data, "ERROR : data is NULL");
56 struct ug_data *ugd = (struct ug_data *) data;
58 char *vconf_name = vconf_keynode_get_name(key);
60 if (!g_strcmp0(vconf_name, VCONFKEY_SETAPPL_DEVICE_NAME_STR)) {
61 char *name_value = NULL;
62 name_value = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
63 WFD_RET_IF(!name_value, "Get string is failed");
64 DBG(LOG_INFO, "name : %s", name_value);
66 if (ugd->device_name_item && g_strcmp0(ugd->dev_name, name_value))
67 wfd_ug_view_refresh_glitem(ugd->device_name_item);
71 DBG(LOG_ERROR, "vconf_name is error");
77 static void _wifi_on_state_cb(keynode_t *key, void *data)
79 WFD_RET_IF(NULL == key, "ERROR : key is NULL !!\n");
80 WFD_RET_IF(NULL == data, "ERROR : data is NULL");
82 struct ug_data *ugd = (struct ug_data *)data;
85 if (vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state) < 0) {
86 DBG(LOG_ERROR, "Failed to get vconf VCONFKEY_WIFI_STATE\n");
90 DBG(LOG_INFO, "WiFi State [%d]\n", wifi_state);
91 if (wifi_state > VCONFKEY_WIFI_OFF && wifi_state < VCONFKEY_WIFI_STATE_MAX) {
92 if (WIFI_DIRECT_ERROR_NONE != wifi_direct_get_state(&ugd->wfd_status)) {
93 DBG(LOG_ERROR, "Failed to Get WiFi Direct State");
96 if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
97 DBG(LOG_INFO, "Activate WiFi Direct...");
98 if (FALSE != wfd_client_switch_on(ugd))
99 DBG(LOG_ERROR, "Failed to Activate WiFi Direct");
106 static void __wfd_hotspot_mode_vconf_change_cb(keynode_t *key, void *data)
108 DBG(LOG_INFO, "__wfd_hotspot_mode_vconf_change_cb");
109 if (NULL == key || NULL == data) {
110 DBG(LOG_INFO, "Invalid parameters \n");
113 struct ug_data *ugd = (struct ug_data *) data;
114 int hotspot_mode = 0;
117 res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
119 DBG(LOG_INFO, "Failed to get vconf value for PLMN(%d)", res);
122 DBG(LOG_INFO, "__wfd_hotspot_mode_vconf_change_cb mode %d", hotspot_mode);
124 if (VCONFKEY_MOBILE_HOTSPOT_MODE_NONE == hotspot_mode) {
125 if (NULL != ugd->act_popup)
126 evas_object_del(ugd->act_popup);
128 #ifdef WFD_ON_OFF_GENLIST
129 wfd_ug_refresh_on_off_check(ugd);
131 } else if (hotspot_mode == VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI ||
132 hotspot_mode == VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI_AP) {
133 if (NULL != ugd->warn_popup) {
134 evas_object_del(ugd->warn_popup);
135 ugd->warn_popup = NULL;
142 * This function let the ug create backgroud
144 * @param[in] ugd the pointer to the parent object
145 * @param[in] ugd the pointer to the main data structure
147 static Evas_Object *_create_bg(Evas_Object *parent, char *style)
152 bg = elm_bg_add(parent);
153 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
154 elm_object_style_set(bg, style);
155 evas_object_show(bg);
162 * This function let the ug create full view
164 * @param[in] ugd the pointer to the parent object
165 * @param[in] ugd the pointer to the main data structure
167 static Evas_Object *_create_fullview(Evas_Object *parent, struct ug_data *ugd)
172 if (parent == NULL) {
173 DBG(LOG_ERROR, "Incorrenct parameter");
177 /* Create Full view */
178 base = elm_layout_add(parent);
180 DBG(LOG_ERROR, "Failed to add layout");
184 if (wfd_ug_util_is_profile_common()) {
185 elm_layout_file_set(base, WFD_UG_COMMON_MAIN_LAYOUT_EDJ_PATH, "main_layout");
187 elm_layout_theme_set(base, "layout", "application", "default");
189 ugd->bg = _create_bg(ugd->win, "group_list");
190 elm_object_part_content_set(ugd->base, "elm.swallow.bg", ugd->bg);
191 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
192 evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
200 * This function let the ug create frame view
202 * @param[in] ugd the pointer to the parent object
203 * @param[in] ugd the pointer to the main data structure
205 static Evas_Object *_create_frameview(Evas_Object *parent, struct ug_data *ugd)
210 if (parent == NULL) {
211 DBG(LOG_ERROR, "Incorrenct parameter");
215 /* Create Frame view */
216 base = elm_layout_add(parent);
218 DBG(LOG_ERROR, "Failed to add layout");
222 elm_layout_theme_set(base, "layout", "application", "default");
223 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
224 evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
231 * This function let the ug destroy the ug
233 * @param[in] data the pointer to the main data structure
235 void wfd_destroy_ug(void *data)
238 struct ug_data *ugd = (struct ug_data *) data;
240 DBG(LOG_INFO, "dbus_cancellable is NULL");
241 ug_destroy_me(ugd->ug);
247 static void wfd_ug_layout_del_cb(void *data , Evas *e, Evas_Object *obj, void *event_info)
251 struct ug_data *ugd = (struct ug_data *) data;
253 DBG(LOG_ERROR, "Incorrect parameter(NULL)");
257 wfd_client_free_raw_discovered_peers(ugd);
258 wfd_ug_view_free_peers(ugd);
259 destroy_wfd_ug_view(ugd);
264 static void *on_create(ui_gadget_h ug, enum ug_mode mode, app_control_h control, void *priv)
277 bindtextdomain(PACKAGE, LOCALEDIR);
279 ugd->win = ug_get_window();
284 if (elm_win_wm_rotation_supported_get(ugd->win)) {
285 int rots[4] = {0, 90, 180, 270};
286 elm_win_wm_rotation_available_rotations_set(ugd->win, (const int *)(&rots), 4);
289 /* check the input parameters from app at first */
291 ugd->device_filter = -1; /* show all devices */
292 ugd->is_auto_exit = false;
293 ugd->is_multi_connect = true;
294 ugd->is_init_ok = false;
295 ugd->title = strdup(D_("IDS_WIFI_BODY_WI_FI_DIRECT_ABB"));
299 char *device_filter = NULL;
300 char *auto_exit = NULL;
301 char *multi_connect = NULL;
303 char* viewtype = NULL;
306 * get the control name
307 * default value: Wi-Fi Direct
309 ret = app_control_get_extra_data(control, "wfds", &wfds);
310 if (ret == APP_CONTROL_ERROR_NONE && wfds) {
311 DBG_SECURE(LOG_INFO, "Wfds name: %s", wfds);
312 ugd->wfds = strdup(wfds);
314 WFD_IF_FREE_MEM(wfds);
316 ret = app_control_get_extra_data(control, "viewtype", &viewtype);
317 if (ret == APP_CONTROL_ERROR_NONE && viewtype) {
318 DBG(LOG_INFO, "viewtype: %s\n", viewtype);
319 ugd->view_type = strdup(viewtype);
321 WFD_IF_FREE_MEM(viewtype);
324 * get the device filter
325 * default value: NULL
327 ret = app_control_get_extra_data(control, "device_filter", &device_filter);
328 if (ret == APP_CONTROL_ERROR_NONE && device_filter) {
329 DBG(LOG_INFO, "Device filter: %s", device_filter);
330 if (0 == strncmp(device_filter, "computer", 8))
331 ugd->device_filter = WFD_DEVICE_TYPE_COMPUTER;
332 else if (0 == strncmp(device_filter, "input_device", 12))
333 ugd->device_filter = WFD_DEVICE_TYPE_INPUT_DEVICE;
334 else if (0 == strncmp(device_filter, "printer", 6))
335 ugd->device_filter = WFD_DEVICE_TYPE_PRINTER;
336 else if (0 == strncmp(device_filter, "camera", 6))
337 ugd->device_filter = WFD_DEVICE_TYPE_CAMERA;
338 else if (0 == strncmp(device_filter, "storage", 7))
339 ugd->device_filter = WFD_DEVICE_TYPE_STORAGE;
340 else if (0 == strncmp(device_filter, "network_infra", 13))
341 ugd->device_filter = WFD_DEVICE_TYPE_NW_INFRA;
342 else if (0 == strncmp(device_filter, "display", 7))
343 ugd->device_filter = WFD_DEVICE_TYPE_DISPLAYS;
344 else if (0 == strncmp(device_filter, "multimedia_device", 17))
345 ugd->device_filter = WFD_DEVICE_TYPE_MM_DEVICES;
346 else if (0 == strncmp(device_filter, "game_device", 11))
347 ugd->device_filter = WFD_DEVICE_TYPE_GAME_DEVICES;
348 else if (0 == strncmp(device_filter, "telephone", 9))
349 ugd->device_filter = WFD_DEVICE_TYPE_TELEPHONE;
350 else if (0 == strncmp(device_filter, "audio", 5))
351 ugd->device_filter = WFD_DEVICE_TYPE_AUDIO;
353 ugd->device_filter = WFD_DEVICE_TYPE_OTHER;
355 WFD_IF_FREE_MEM(device_filter);
358 * get whether support auto exit after connection
359 * default value: false
361 ret = app_control_get_extra_data(control, "auto_exit", &auto_exit);
362 if (ret == APP_CONTROL_ERROR_NONE && auto_exit) {
363 DBG(LOG_INFO, "Auto exit: %s", auto_exit);
364 if (0 == strncmp(auto_exit, "on", 2))
365 ugd->is_auto_exit = true;
367 ugd->is_auto_exit = false;
369 WFD_IF_FREE_MEM(auto_exit);
372 * get whether support multi connection,
373 * default value: true
375 ret = app_control_get_extra_data(control, "multi_connect", &multi_connect);
376 if (ret == APP_CONTROL_ERROR_NONE && multi_connect) {
377 DBG(LOG_INFO, "Multi connection: %s", multi_connect);
378 if (0 == strncmp(multi_connect, "off", 2))
379 ugd->is_multi_connect = false;
381 ugd->is_multi_connect = true;
383 WFD_IF_FREE_MEM(multi_connect);
386 * get the title of UG
387 * default value: Wi-Fi Direct
389 ret = app_control_get_extra_data(control, "title_string", &title);
390 if (ret == APP_CONTROL_ERROR_NONE && title) {
391 DBG(LOG_INFO, "Title of UG: %s", title);
392 WFD_IF_FREE_MEM(ugd->title);
393 ugd->title = strdup(title);
395 WFD_IF_FREE_MEM(title);
398 if (mode == UG_MODE_FULLVIEW)
399 ugd->base = _create_fullview(ugd->win, ugd);
401 ugd->base = _create_frameview(ugd->win, ugd);
404 evas_object_event_callback_add(ugd->base, EVAS_CALLBACK_DEL, wfd_ug_layout_del_cb, ugd);
406 DBG(LOG_ERROR, "Failed to create base layout\n");
410 /* check status of wifi-direct from vconf */
411 wfd_status = wfd_get_vconf_status();
416 initialize_gen_item_class();
417 create_wfd_ug_view(ugd);
418 wfd_ug_view_init_genlist(ugd, true);
419 #ifdef MOTION_CONTROL_ENABLE
424 * if not deactivated, do initialization at once;
425 * otherwise, do initialization later
427 if (wfd_status != VCONFKEY_WIFI_DIRECT_DEACTIVATED) {
428 init_wfd_client(ugd);
430 ugd->wfd_status = WIFI_DIRECT_STATE_DEACTIVATED;
432 ret = init_wfd_client(ugd);
433 WFD_RETV_IF(ret != 0, NULL, "Failed to initialize WFD client library\n");
435 /* Activate WiFi Direct */
436 DBG(LOG_INFO, "Activating WiFi Direct...");
437 if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
438 ret = wfd_client_switch_on(ugd);
439 WFD_RETV_IF(ret != 0, NULL, "Failed to activate WFD\n");
442 ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
443 __wfd_main_vconf_change_cb, ugd);
445 DBG(LOG_ERROR, "Failed to set vconf notification callback(VCONFKEY_SETAPPL_DEVICE_NAME_STR)");
448 ret = vconf_notify_key_changed(VCONFKEY_WIFI_STATE, _wifi_on_state_cb, ugd);
450 DBG(LOG_ERROR, "Failed to set vconf notification callback(VCONFKEY_WIFI_STATE)");
453 ret = vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE,
454 __wfd_hotspot_mode_vconf_change_cb, ugd);
456 DBG(LOG_ERROR, "Failed to set vconf notification callback(MOBILE_HOTSPOT_MODE)");
462 static void on_start(ui_gadget_h ug, app_control_h control, void *priv)
473 struct utsname kernel_info;
474 res = uname(&kernel_info);
476 DBG(LOG_ERROR, "Failed to detect target type\n");
478 DBG_SECURE(LOG_INFO, "HW ID of this device [%s]\n", kernel_info.machine);
479 if (strncmp(kernel_info.machine, "arm", 3) != 0) {
480 wfd_ug_warn_popup(ugd, D_("IDS_ST_POP_NOT_SUPPORTED"), POPUP_TYPE_TERMINATE_NOT_SUPPORT);
488 static void on_pause(ui_gadget_h ug, app_control_h control, void *priv)
492 WFD_RET_IF(ug == NULL || priv == NULL, "The param is NULL\n");
493 struct ug_data *ugd = priv;
494 ugd->is_paused = true;
496 wfd_refresh_wifi_direct_state(ugd);
497 DBG(LOG_INFO, "on pause, wfd status: %d\n", ugd->wfd_status);
499 if ((WIFI_DIRECT_STATE_DISCOVERING == ugd->wfd_status) &&
500 (WIFI_DIRECT_ERROR_NONE != wifi_direct_cancel_discovery())) {
501 DBG(LOG_ERROR, "Failed to send cancel discovery state [%d]\n", ugd->wfd_status);
506 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
511 static void on_resume(ui_gadget_h ug, app_control_h control, void *priv)
515 WFD_RET_IF(ug == NULL || priv == NULL, "The param is NULL\n");
516 struct ug_data *ugd = priv;
517 ugd->is_paused = false;
519 wfd_refresh_wifi_direct_state(ugd);
520 DBG(LOG_INFO, "on resume, status: %d\n", ugd->wfd_status);
521 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_STOPPED;
523 elm_genlist_realized_items_update(ugd->genlist);
525 if (ugd->wfd_status > WIFI_DIRECT_STATE_DEACTIVATED && ugd->wfd_status < WIFI_DIRECT_STATE_CONNECTED) {
526 DBG(LOG_INFO, "Start discovery again\n");
527 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
528 ret = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
529 if (ret != WIFI_DIRECT_ERROR_NONE) {
530 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
531 DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", ret);
532 wifi_direct_cancel_discovery();
539 static void on_destroy(ui_gadget_h ug, app_control_h control, void *priv)
543 WFD_RET_IF(ug == NULL || priv == NULL, "The param is NULL\n");
545 struct ug_data *ugd = priv;
547 WFD_RET_IF(ugd->base == NULL, "The param is NULL\n");
549 #ifdef MOTION_CONTROL_ENABLE
553 /* DeInit WiFi Direct */
554 ret = deinit_wfd_client(ugd);
556 DBG(LOG_ERROR, "Failed to DeInit WiFi Direct");
558 if (ugd->scan_toolbar) {
559 wfd_ug_view_refresh_button(ugd->scan_toolbar,
560 D_("IDS_WIFI_SK4_SCAN"), FALSE);
563 ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
564 __wfd_main_vconf_change_cb);
566 DBG(LOG_ERROR, "Failed to ignore vconf key callback\n");
569 ret = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_on_state_cb);
571 DBG(LOG_ERROR, "Failed to ignore vconf key callback\n");
574 ret = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE,
575 __wfd_hotspot_mode_vconf_change_cb);
577 DBG(LOG_ERROR, "Failed to ignore vconf key callback MOBILE_HOTSPOT_MODE\n");
579 wfd_ug_view_free_peers(ugd);
580 WFD_IF_FREE_MEM(ugd->title);
581 WFD_IF_FREE_MEM(ugd->wfds);
582 WFD_IF_FREE_MEM(ugd->view_type);
584 WFD_IF_DEL_OBJ(ugd->bg);
585 WFD_IF_DEL_OBJ(ugd->base);
586 DBG(LOG_INFO, "WFD client deregistered");
592 static void on_message(ui_gadget_h ug, app_control_h msg, app_control_h control, void *priv)
595 char* app_msg = NULL;
596 struct ug_data *ugd = priv;
599 DBG(LOG_ERROR, "The param is NULL\n");
604 app_control_get_extra_data(msg, "msg", &app_msg);
606 DBG(LOG_ERROR, "Failed to get app_msg");
611 DBG(LOG_DEBUG, "Msg from app: %s", app_msg);
612 if (!strcmp(app_msg, "destroy")) {
613 if (!ugd->rename_popup) {
614 DBG(LOG_INFO, "Destroying UG.");
615 wfd_ug_view_free_peers(ugd);
619 WFD_IF_FREE_MEM(app_msg);
624 static void on_event(ui_gadget_h ug, enum ug_event event, app_control_h control, void *priv)
629 DBG(LOG_ERROR, "The param is NULL\n");
634 case UG_EVENT_LOW_MEMORY:
635 DBG(LOG_INFO, "UG_EVENT_LOW_MEMORY\n");
637 case UG_EVENT_LOW_BATTERY:
638 DBG(LOG_INFO, "UG_EVENT_LOW_BATTERY\n");
640 case UG_EVENT_LANG_CHANGE:
641 DBG(LOG_INFO, "UG_EVENT_LANG_CHANGE\n");
643 case UG_EVENT_ROTATE_PORTRAIT:
645 DBG(LOG_INFO, "UG_EVENT_ROTATE_PORTRAIT\n");
647 case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
648 DBG(LOG_INFO, "UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN\n");
650 case UG_EVENT_ROTATE_LANDSCAPE:
652 DBG(LOG_INFO, "UG_EVENT_ROTATE_LANDSCAPE\n");
654 case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
656 DBG(LOG_INFO, "UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN\n");
659 DBG(LOG_INFO, "default\n");
666 static void on_key_event(ui_gadget_h ug, enum ug_key_event event, app_control_h control, void *priv)
671 DBG(LOG_ERROR, "The param is NULL\n");
676 case UG_KEY_EVENT_END:
677 DBG(LOG_INFO, "UG_KEY_EVENT_END\n");
686 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
692 DBG(LOG_ERROR, "The param is NULL\n");
696 ugd = calloc(1, sizeof(struct ug_data));
698 DBG(LOG_ERROR, "Failed to allocate memory for UG data\n");
704 ops->create = on_create;
705 ops->start = on_start;
706 ops->pause = on_pause;
707 ops->resume = on_resume;
708 ops->destroy = on_destroy;
709 ops->message = on_message;
710 ops->event = on_event;
711 ops->key_event = on_key_event;
713 ops->opt = UG_OPT_INDICATOR_ENABLE;
719 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
726 DBG(LOG_ERROR, "The param is NULL\n");
732 WFD_IF_FREE_MEM(ugd);
737 UG_MODULE_API int setting_plugin_reset(app_control_h control, void *priv)
741 wifi_direct_state_e state;
743 res = wifi_direct_initialize();
744 if (res != WIFI_DIRECT_ERROR_NONE) {
745 DBG(LOG_ERROR, "Failed to initialize wifi direct. [%d]\n", res);
749 res = wifi_direct_get_state(&state);
750 if (res != WIFI_DIRECT_ERROR_NONE) {
751 DBG(LOG_ERROR, "Failed to get link status. [%d]\n", res);
755 if (state < WIFI_DIRECT_STATE_ACTIVATING) {
756 DBG(LOG_INFO, "No need to reset Wi-Fi Direct.\n");
758 /*if connected, disconnect all devices*/
759 if (WIFI_DIRECT_STATE_CONNECTED == state) {
760 res = wifi_direct_disconnect_all();
761 if (res != WIFI_DIRECT_ERROR_NONE) {
762 DBG(LOG_ERROR, "Failed to send disconnection request to all. [%d]\n", res);
767 res = wifi_direct_deactivate();
768 if (res != WIFI_DIRECT_ERROR_NONE) {
769 DBG(LOG_ERROR, "Failed to reset Wi-Fi Direct. [%d]\n", res);
774 res = wifi_direct_deinitialize();
775 if (res != WIFI_DIRECT_ERROR_NONE) {
776 DBG(LOG_ERROR, "Failed to deinitialize wifi direct. [%d]\n", res);