2 * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "ug-nfc-share-main.h"
19 #include "ug-nfc-share-tag.h"
20 #include "ug-nfc-share-popup.h"
23 #include <Elementary.h>
28 #include <sys/types.h>
31 /* external library header */
36 #define UG_MODULE_API __attribute__ ((visibility("default")))
40 #define NET_NFC_SHARE_REQUEST_TYPE_BUFFER "data_buffer"
42 #define DISPLAY_STRING_MAX_SIZE 90
43 #define ABBREVIATION_TEXT "..."
45 void ug_nfc_share_create_base_view(void *user_data);
46 void ug_nfc_share_create_nfc_share_view(void *user_data);
47 bool ug_nfc_share_check_nfc_isAvailable(void *user_data);
48 static void ug_nfc_share_create_data(ugdata_t* ug_data);
53 /* TODO : will be added */
57 const char *_get_font_name(int font)
59 const char *name = NULL;
61 /* TODO : will be improved */
62 if (_get_theme_type() == 0)
70 case UG_FONT_SBEAM_TITLE :
74 case UG_FONT_LIVEBOX :
83 UG_NFC_SHARE_DEBUG_ERR("unknown font type [%d]", font);
91 uint32_t _get_font_color(int font)
93 uint32_t color = 0x00808080;
95 /* TODO : will be improved */
96 if (_get_theme_type() == 0)
104 case UG_FONT_SBEAM_TITLE :
108 case UG_FONT_LIVEBOX :
117 UG_NFC_SHARE_DEBUG_ERR("unknown font type [%d]", font);
125 int _get_font_size(int font)
129 /* TODO : will be improved */
130 if (_get_theme_type() == 0)
138 case UG_FONT_SBEAM_TITLE :
142 case UG_FONT_LIVEBOX :
151 UG_NFC_SHARE_DEBUG_ERR("unknown font type [%d]", font);
159 const char *_get_font_style(int font)
161 const char *style = NULL;
163 /* TODO : will be improved */
164 if (_get_theme_type() == 0)
172 case UG_FONT_SBEAM_TITLE :
176 case UG_FONT_LIVEBOX :
185 UG_NFC_SHARE_DEBUG_ERR("unknown font type [%d]", font);
193 void _get_image_path(const char *image, char *path, int len)
195 const char *prefix = NULL;
197 switch (_get_theme_type())
199 /* TODO : will be improved */
201 prefix = IMAGES_PATH"/white";
205 prefix = IMAGES_PATH"/black";
211 snprintf(path, len, "%s/%s", prefix, image);
215 snprintf(path, len, "%s", prefix);
219 /******************* UI Functions *************/
220 static Evas_Object *_create_button(Evas_Object *parent, void (*func)(void *data, Evas_Object *obj, void *event_info), const char *label, const char *swallow, const char *style, void *data)
224 retv_if(parent == NULL, NULL);
226 button = elm_button_add(parent);
229 elm_object_style_set(button, style);
234 elm_object_text_set(button, label);
237 evas_object_smart_callback_add(button, "clicked", func, (void*)data);
238 evas_object_show(button);
239 elm_object_part_content_set(parent, swallow, button);
244 static Evas_Object *_create_image(Evas_Object *parent, const char *file_path, const char *swallow, void *data)
248 retv_if(parent == NULL, NULL);
249 retv_if(file_path == NULL, NULL);
250 retv_if(swallow == NULL, NULL);
252 image = elm_image_add(parent);
253 retv_if(image == NULL, NULL);
255 elm_image_file_set(image, file_path, NULL);
256 elm_image_no_scale_set(image, 1);
257 elm_image_resizable_set(image, 0, 0);
258 elm_object_part_content_set(parent, swallow, image);
263 static Evas_Object *_create_bg(Evas_Object *win)
265 Evas_Object *bg = elm_bg_add(win);
267 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
268 elm_win_resize_object_add(win, bg);
270 evas_object_show(bg);
275 static Evas_Object *_create_main_layout(Evas_Object* parent)
282 layout = elm_layout_add(parent);
284 elm_layout_theme_set(layout, "layout", "application", "default");
286 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
288 evas_object_show(layout);
293 static void _activation_completed_cb(nfc_error_e error, void *user_data)
295 ugdata_t *ug_data = (ugdata_t *)user_data;
297 UG_NFC_SHARE_BEGIN();
299 ret_if(ug_data == NULL);
301 /* create share view */
302 ug_nfc_share_create_nfc_share_view(ug_data);
307 static void _setting_on_YesNo_popup_response_cb(void *data, Evas_Object *obj, void *event_info)
309 ugdata_t *ug_data = (ugdata_t *)data;
310 int result = (int)event_info;
312 UG_NFC_SHARE_BEGIN();
314 ret_if(ug_data == NULL);
318 case UG_NFC_POPUP_RESP_OK :
320 UG_NFC_SHARE_DEBUG("setting is on >>>>");
322 result = nfc_manager_set_activation(true, _activation_completed_cb, ug_data);
323 if (result != NFC_ERROR_NONE)
325 UG_NFC_SHARE_DEBUG_ERR("nfc_manager_set_activation failed");
329 case UG_NFC_POPUP_RESP_CANCEL :
331 UG_NFC_SHARE_DEBUG("ug_destroy_me >>>>");
332 ug_destroy_me(ug_data->nfc_share_ug);
342 static void _setting_on_YesNo_popup(void *data)
344 ugdata_t *ug_data = (ugdata_t *)data;
345 char popup_str[POPUP_TEXT_SIZE] = { 0, };
347 UG_NFC_SHARE_BEGIN();
349 ret_if(ug_data == NULL);
351 memcpy(popup_str, IDS_SERVICE_NOT_AVAILABLE_NFC_TURNED_OFF_TURN_ON_NFC_Q, strlen(IDS_SERVICE_NOT_AVAILABLE_NFC_TURNED_OFF_TURN_ON_NFC_Q));
353 ug_nfc_share_create_popup(ug_data, ug_data->base_layout, popup_str, IDS_YES, UG_NFC_POPUP_RESP_OK, IDS_NO, UG_NFC_POPUP_RESP_CANCEL, NULL, 0, false, false, _setting_on_YesNo_popup_response_cb);
358 static void _app_error_popup_response_cb(void *data, Evas_Object *obj, void *event_info)
360 ugdata_t *ug_data = (ugdata_t *)data;
361 int result = (int)event_info;
363 UG_NFC_SHARE_BEGIN();
370 case UG_NFC_POPUP_RESP_CLOSE :
372 UG_NFC_SHARE_DEBUG("ug_destroy_me >>>>");
373 ug_destroy_me(ug_data->nfc_share_ug);
383 static void _show_app_error_popup(void *data)
385 ugdata_t *ug_data = (ugdata_t *)data;
386 char popup_str[POPUP_TEXT_SIZE] = { 0, };
388 UG_NFC_SHARE_BEGIN();
393 memcpy(popup_str, IDS_NFC_SERVICE_IS_NOT_SUPPORTED, strlen(IDS_NFC_SERVICE_IS_NOT_SUPPORTED));
395 ug_nfc_share_create_popup(ug_data, ug_data->base_layout, popup_str, IDS_CLOSE, UG_NFC_POPUP_RESP_CLOSE, NULL, 0, NULL, 0, false, false, _app_error_popup_response_cb);
400 static void _back_clicked_cb(void *data, Evas_Object *obj, void *event_info)
402 UG_NFC_SHARE_BEGIN();
410 static void _lang_changed(void *data)
412 UG_NFC_SHARE_BEGIN();
414 ugdata_t* ug_data = (ugdata_t*)data;
415 ret_if(ug_data == NULL);
417 edje_object_part_text_set(elm_layout_edje_get(ug_data->layout), "title", IDS_GENTLY_TOUCH_PHONES_TOGETHER_TO_SHARE);
419 elm_object_text_set(ug_data->cancel_btn, IDS_CANCEL);
424 static Evas_Object *ug_nfc_share_create_layout(void *data)
426 ugdata_t* ug_data = (ugdata_t*)data;
428 Evas_Object *layout = NULL;
429 Evas_Object *cancel_btn = NULL;
430 Evas_Object *access_layout = NULL;
431 Evas_Object *access_object = NULL;
434 UG_NFC_SHARE_BEGIN();
436 ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height);
437 UG_NFC_SHARE_DEBUG("width[%d] / height[%d]", width, height);
439 /* create base layout */
440 layout = elm_layout_add(ug_data->base_layout);
441 retv_if(layout == NULL, NULL);
442 ug_data->layout = layout;
444 if (width == 480) // WVGA
446 elm_layout_file_set(layout, EDJ_FILE, "share_via_nfc_wvga");
450 elm_layout_file_set(layout, EDJ_FILE, "share_via_nfc");
452 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
453 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
454 evas_object_show(layout);
456 /* create message label */
457 edje_object_part_text_set(elm_layout_edje_get(layout), "title", IDS_GENTLY_TOUCH_PHONES_TOGETHER_TO_SHARE);
460 Evas_Object *image = NULL;
461 char path[1024] = { 0, };
462 if (width == 480) // WVGA
464 _get_image_path("U05_AfterSelect_Share_help_popup.png", path, sizeof(path));
468 _get_image_path("U05_AfterSelect_Share_help.png", path, sizeof(path));
470 image = _create_image(layout, path, "image", ug_data);
471 retv_if(image == NULL, NULL);
472 evas_object_show(image);
474 /* create cancel button */
475 cancel_btn = _create_button(layout, _back_clicked_cb, IDS_CANCEL, "cancel_btn", "style1", ug_data->nfc_share_ug);
476 retv_if(cancel_btn == NULL, NULL);
477 ug_data->cancel_btn = cancel_btn;
478 evas_object_show(cancel_btn);
481 access_layout = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(layout), "access");
482 retv_if(access_layout == NULL, NULL);
483 access_object = elm_access_object_register(access_layout, elm_layout_edje_get(layout));
484 retv_if(access_object == NULL, NULL);
485 elm_access_info_set(access_object, ELM_ACCESS_INFO, IDS_GENTLY_TOUCH_PHONES_TOGETHER_TO_SHARE);
487 if (NFC_ERROR_NONE == nfc_manager_initialize(NULL, NULL))
489 UG_NFC_SHARE_DEBUG("nfc_manager_initialize success");
490 ug_nfc_set_nfc_callback(ug_data);
494 UG_NFC_SHARE_DEBUG_ERR("nfc_manager_initialize FAIL!!!!");
500 /******************* UI Functions ENDZZZ*************/
502 void ug_nfc_share_create_base_view(void *user_data)
504 ugdata_t* ug_data = (ugdata_t*)user_data;
506 UG_NFC_SHARE_BEGIN();
508 /* create base layout */
509 ug_data->base_layout = _create_main_layout(ug_data->ug_win_main);
510 ug_data->bg = _create_bg(ug_data->ug_win_main);
511 elm_object_part_content_set(ug_data->base_layout, "elm.swallow.bg", ug_data->bg);
512 evas_object_show(ug_data->base_layout);
517 void ug_nfc_share_create_nfc_share_view(void *user_data)
519 ugdata_t* ug_data = (ugdata_t*)user_data;
520 Evas_Object* nfc_share_layout = NULL;
522 UG_NFC_SHARE_BEGIN();
526 ug_nfc_share_create_data(ug_data);
528 /* create share layout */
529 nfc_share_layout = ug_nfc_share_create_layout(ug_data);
531 if (nfc_share_layout == NULL)
533 UG_NFC_SHARE_DEBUG_ERR("nfc_share_layout is NULL");
537 elm_object_part_content_set(ug_data->base_layout, "elm.swallow.content", nfc_share_layout);
542 bool ug_nfc_share_check_nfc_isAvailable(void *user_data)
544 ugdata_t *ug_data = (ugdata_t *)user_data;
547 UG_NFC_SHARE_BEGIN();
549 retv_if(ug_data == NULL, false);
551 /* check if nfc is on */
552 if ((result = vconf_get_bool(VCONFKEY_NFC_STATE, &on)) == 0)
554 UG_NFC_SHARE_DEBUG("vconf_get_bool status [%d]", on);
557 /* show nfc on/off popup */
558 _setting_on_YesNo_popup(ug_data);
564 UG_NFC_SHARE_DEBUG_ERR("vconf_get_bool failed");
573 static void ug_nfc_share_create_data(ugdata_t* ug_data)
575 bundle *bd = ug_data->bd;
578 UG_NFC_SHARE_BEGIN();
580 int result = UG_NFC_SHARE_ERROR;
581 nfc_ndef_message_h msg = NULL;
582 char *request_data = (char *)bundle_get_val(bd, "request_data");
585 if (request_data == NULL)
587 UG_NFC_SHARE_DEBUG_ERR("request_data IS NULL");
592 UG_NFC_SHARE_DEBUG("request_data : %s request_data strlen %d", GET_SAFE_STRING(request_data), strlen(request_data));
594 if (strlen(request_data) == 0)
596 UG_NFC_SHARE_DEBUG_ERR("bundle data is wrong ");
601 type = ug_nfc_share_get_tag_type();
605 case UG_NFC_SHARE_TAG_URL :
607 /* nfc_handover now no user case of multi recored for buffered string*/
608 nfc_ndef_record_h record = NULL;
610 /* make memo NDEF message */
611 UG_NFC_SHARE_DEBUG("data is string");
613 result = nfc_ndef_record_create_uri(&record, request_data);
614 if (result != NFC_ERROR_NONE)
616 UG_NFC_SHARE_DEBUG_ERR("nfc_ndef_record_create failed (%d)", result);
621 result = nfc_ndef_message_create(&msg);
622 if (result != NFC_ERROR_NONE)
624 UG_NFC_SHARE_DEBUG_ERR("nfc_ndef_message_create failed (%d)", result);
625 nfc_ndef_record_destroy(record);
629 /* append record to ndef msg */
630 result = nfc_ndef_message_append_record(msg, record);
631 if (result != NFC_ERROR_NONE)
633 UG_NFC_SHARE_DEBUG_ERR("nfc_ndef_message_create failed (%d)", result);
634 nfc_ndef_message_destroy(msg);
635 nfc_ndef_record_destroy(record);
641 case UG_NFC_SHARE_TAG_MEMO :
643 /* nfc_handover now no user case of multi recored for buffered string*/
644 nfc_ndef_record_h record = NULL;
646 /* make memo NDEF message */
647 UG_NFC_SHARE_DEBUG("UG_NFC_SHARE_TAG_MEMO");
649 result = nfc_ndef_record_create_text(&record, request_data, "en-US", NFC_ENCODE_UTF_8);
650 if (result != NFC_ERROR_NONE)
652 UG_NFC_SHARE_DEBUG_ERR("nfc_ndef_record_create failed (%d)", result);
657 result = nfc_ndef_message_create(&msg);
658 if (result != NFC_ERROR_NONE)
660 UG_NFC_SHARE_DEBUG_ERR("nfc_ndef_message_create failed (%d)", result);
661 nfc_ndef_record_destroy(record);
665 /* append record to ndef msg */
666 result = nfc_ndef_message_append_record(msg, record);
667 if (result != NFC_ERROR_NONE)
669 UG_NFC_SHARE_DEBUG_ERR("nfc_ndef_message_create failed (%d)", result);
670 nfc_ndef_message_destroy(msg);
671 nfc_ndef_record_destroy(record);
681 result = ug_nfc_share_set_current_ndef(ug_data, msg);
682 if (result != UG_NFC_SHARE_OK)
684 UG_NFC_SHARE_DEBUG_ERR("ug_nfc_share_set_current_ndef failed (%d)", result);
685 nfc_ndef_message_destroy(msg);
691 static bool ug_nfc_share_parse_bundle(bundle *bd)
693 char *request_type = (char *)bundle_get_val(bd, "request_type");
694 char *request_data = (char *)bundle_get_val(bd, "request_data");
696 UG_NFC_SHARE_BEGIN();
698 if (request_type == NULL || request_data == NULL)
700 UG_NFC_SHARE_DEBUG_ERR("request_data or request_data IS NULL");
705 UG_NFC_SHARE_DEBUG("request_type : %s, request_data : %s request_data strlen %d", GET_SAFE_STRING(request_type), GET_SAFE_STRING(request_data), strlen(request_data));
707 if (strlen(request_data) == 0)
709 UG_NFC_SHARE_DEBUG_ERR("bundle data is wrong ");
714 /* process data and store specific space for sharing data */
715 if (strncmp(request_type, NET_NFC_SHARE_REQUEST_TYPE_BUFFER, strlen(NET_NFC_SHARE_REQUEST_TYPE_BUFFER)) == 0)
717 if ((strncmp(request_data, "http://", strlen("http://")) == 0) || (strncmp(request_data, "https://", strlen("https://")) == 0))
719 UG_NFC_SHARE_DEBUG("data is URI");
721 ug_nfc_share_set_tag_type(UG_NFC_SHARE_TAG_URL);
725 UG_NFC_SHARE_DEBUG("data is MEMO");
727 ug_nfc_share_set_tag_type(UG_NFC_SHARE_TAG_MEMO);
732 UG_NFC_SHARE_DEBUG_ERR("request_type is wrong ");
742 static void *__ug_nfc_share_create(ui_gadget_h ug, enum ug_mode mode, service_h service, void *priv)
744 ugdata_t *ug_data = (ugdata_t *)priv;
746 UG_NFC_SHARE_BEGIN();
748 /* set text domain */
749 bindtextdomain(NFCUG_TEXT_DOMAIN, NFCUG_LOCALEDIR);
752 ug_data->ug_win_main = ug_get_parent_layout(ug);
753 ug_data->nfc_share_ug = ug;
755 if (SERVICE_ERROR_NONE != service_export_as_bundle(service, &ug_data->bd))
759 char *request_type = NULL;
760 char *request_data = NULL;
762 bd = bundle_create();
766 service_get_extra_data(service, "request_type", &request_type);
767 service_get_extra_data(service, "request_data", &request_data);
769 bundle_add(bd, "request_type", request_type);
770 bundle_add(bd, "request_data", request_data);
775 /* parse pameter, and them set request type */
776 if (!ug_nfc_share_parse_bundle(ug_data->bd))
779 /* create base layout */
780 ug_nfc_share_create_base_view(ug_data);
782 /* create share view */
783 ug_nfc_share_create_nfc_share_view(ug_data);
787 return ug_data->base_layout;
790 static void __ug_nfc_share_destroy(ui_gadget_h ug, service_h service, void *priv)
792 ugdata_t *ug_data = (ugdata_t *)priv;
794 UG_NFC_SHARE_BEGIN();
800 ug_nfc_unset_nfc_callback();
803 if (nfc_manager_deinitialize() != NFC_ERROR_NONE)
805 UG_NFC_SHARE_DEBUG_ERR("nfc_manager_deinitialize failed");
808 if (ug_data->bd != NULL)
810 bundle_free(ug_data->bd);
814 evas_object_del(ug_get_layout(ug));
819 static void __ug_nfc_share_start(ui_gadget_h ug, service_h service, void *priv)
821 UG_NFC_SHARE_BEGIN();
823 ugdata_t *ug_data = (ugdata_t *)priv;
825 /* check nfc-device*/
826 if (!nfc_manager_is_supported())
828 UG_NFC_SHARE_DEBUG_ERR("It is not nfc device >>>>");
829 _show_app_error_popup(ug_data);
833 ug_nfc_share_check_nfc_isAvailable(ug_data);
838 static void __ug_nfc_share_pause(ui_gadget_h ug, service_h service, void *priv)
840 UG_NFC_SHARE_BEGIN();
845 static void __ug_nfc_share_resume(ui_gadget_h ug, service_h service, void *priv)
847 UG_NFC_SHARE_BEGIN();
852 static void __ug_nfc_share_message(ui_gadget_h ug, service_h msg, service_h service, void *priv)
854 UG_NFC_SHARE_BEGIN();
859 static void __ug_nfc_share_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv)
861 UG_NFC_SHARE_BEGIN();
863 ugdata_t *ug_data = (ugdata_t *)priv;
865 UG_NFC_SHARE_DEBUG("event[%d]", event);
868 case UG_EVENT_LOW_MEMORY:
869 UG_NFC_SHARE_DEBUG("UG_EVENT_LOW_MEMORY");
871 case UG_EVENT_LOW_BATTERY:
872 UG_NFC_SHARE_DEBUG("UG_EVENT_LOW_BATTERY");
874 case UG_EVENT_LANG_CHANGE:
875 UG_NFC_SHARE_DEBUG("UG_EVENT_LANG_CHANGE");
876 _lang_changed(ug_data);
878 case UG_EVENT_ROTATE_PORTRAIT:
879 elm_win_rotation_with_resize_set(ug_data->ug_win_main, 0);
880 UG_NFC_SHARE_DEBUG("UG_EVENT_ROTATE_PORTRAIT");
882 case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
883 elm_win_rotation_with_resize_set(ug_data->ug_win_main, 0);
884 UG_NFC_SHARE_DEBUG("UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN");
886 case UG_EVENT_ROTATE_LANDSCAPE:
887 UG_NFC_SHARE_DEBUG("UG_EVENT_ROTATE_LANDSCAPE");
888 elm_win_rotation_with_resize_set(ug_data->ug_win_main, 0);
890 case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
891 UG_NFC_SHARE_DEBUG("UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN");
892 elm_win_rotation_with_resize_set(ug_data->ug_win_main, 0);
894 case UG_EVENT_REGION_CHANGE:
895 UG_NFC_SHARE_DEBUG("UG_EVENT_REGION_CHANGE");
904 UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
906 ugdata_t *ug_data; // User defined private data
908 UG_NFC_SHARE_BEGIN();
913 ug_data = (ugdata_t *)malloc(sizeof(ugdata_t));
917 memset(ug_data, 0x00, sizeof(ugdata_t));
919 ops->create = __ug_nfc_share_create;
920 ops->start = __ug_nfc_share_start;
921 ops->pause = __ug_nfc_share_pause;
922 ops->resume = __ug_nfc_share_resume;
923 ops->destroy = __ug_nfc_share_destroy;
924 ops->message = __ug_nfc_share_message;
925 ops->event = __ug_nfc_share_event;
927 ops->opt = UG_OPT_INDICATOR_ENABLE;
934 UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
938 UG_NFC_SHARE_BEGIN();