From b45433e2aabb06be4d9e51afe72a968be71e0be9 Mon Sep 17 00:00:00 2001 From: DoHyun Pyun Date: Fri, 11 Nov 2016 17:33:51 +0900 Subject: [PATCH] Apply new BT share UI for tizen 3.0 Change-Id: I41bb48eacbd97fbfe159b98cc7f221f7399df2dd Signed-off-by: DoHyun Pyun --- CMakeLists.txt | 1 - data/edc/bt-share-layout.edc | 361 ++-- data/edc/bt_share_icon_animation.edc | 178 ++ data/edc/images.edc | 8 +- data/images/bluetooth_download_00.png | Bin 0 -> 1484 bytes data/images/bluetooth_download_01.png | Bin 0 -> 1484 bytes data/images/bluetooth_download_02.png | Bin 0 -> 1479 bytes data/images/bluetooth_download_03.png | Bin 0 -> 1471 bytes data/images/bluetooth_download_04.png | Bin 0 -> 1480 bytes data/images/bluetooth_download_05.png | Bin 0 -> 1481 bytes data/images/bluetooth_download_complete.png | Bin 0 -> 1584 bytes data/images/bluetooth_download_failed.png | Bin 0 -> 1708 bytes data/images/bluetooth_inbound_transfer_failed.png | Bin 1484 -> 0 bytes .../bluetooth_inbound_transfer_successed.png | Bin 1229 -> 0 bytes data/images/bluetooth_outbound_transfer_failed.png | Bin 1479 -> 0 bytes .../bluetooth_outbound_transfer_successed.png | Bin 1237 -> 0 bytes data/images/bluetooth_upload_00.png | Bin 0 -> 1487 bytes data/images/bluetooth_upload_01.png | Bin 0 -> 1489 bytes data/images/bluetooth_upload_02.png | Bin 0 -> 1492 bytes data/images/bluetooth_upload_03.png | Bin 0 -> 1492 bytes data/images/bluetooth_upload_04.png | Bin 0 -> 1494 bytes data/images/bluetooth_upload_05.png | Bin 0 -> 1481 bytes data/images/bluetooth_upload_complete.png | Bin 0 -> 1592 bytes data/images/bluetooth_upload_failed.png | Bin 0 -> 1754 bytes packaging/org.tizen.bluetooth-share-ui.spec | 3 +- src/applog.h | 8 - src/bt-share-ui-ipc.c | 765 +++++++-- src/bt-share-ui-ipc.h | 109 +- src/bt-share-ui-main.c | 338 ++-- src/bt-share-ui-main.h | 88 +- src/bt-share-ui-popup.c | 812 ++------- src/bt-share-ui-popup.h | 25 +- src/bt-share-ui-resource.h | 84 +- src/bt-share-ui-view.c | 1775 +++++++++++++------- src/bt-share-ui-view.h | 22 +- src/bt-share-ui-widget.c | 120 +- src/bt-share-ui-widget.h | 23 +- 37 files changed, 2653 insertions(+), 2067 deletions(-) create mode 100644 data/edc/bt_share_icon_animation.edc create mode 100644 data/images/bluetooth_download_00.png create mode 100644 data/images/bluetooth_download_01.png create mode 100644 data/images/bluetooth_download_02.png create mode 100644 data/images/bluetooth_download_03.png create mode 100644 data/images/bluetooth_download_04.png create mode 100644 data/images/bluetooth_download_05.png create mode 100644 data/images/bluetooth_download_complete.png create mode 100644 data/images/bluetooth_download_failed.png delete mode 100644 data/images/bluetooth_inbound_transfer_failed.png delete mode 100644 data/images/bluetooth_inbound_transfer_successed.png delete mode 100644 data/images/bluetooth_outbound_transfer_failed.png delete mode 100644 data/images/bluetooth_outbound_transfer_successed.png create mode 100644 data/images/bluetooth_upload_00.png create mode 100644 data/images/bluetooth_upload_01.png create mode 100644 data/images/bluetooth_upload_02.png create mode 100644 data/images/bluetooth_upload_03.png create mode 100644 data/images/bluetooth_upload_04.png create mode 100644 data/images/bluetooth_upload_05.png create mode 100644 data/images/bluetooth_upload_complete.png create mode 100644 data/images/bluetooth_upload_failed.png mode change 100755 => 100644 src/bt-share-ui-main.h mode change 100755 => 100644 src/bt-share-ui-popup.c mode change 100755 => 100644 src/bt-share-ui-view.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 677c81f..29d90e2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,6 @@ pkg_check_modules(pkgs REQUIRED efl-extension evas gobject-2.0 - bluetooth-api aul capi-appfw-application capi-network-bluetooth diff --git a/data/edc/bt-share-layout.edc b/data/edc/bt-share-layout.edc index 944e215..6f09f30 100644 --- a/data/edc/bt-share-layout.edc +++ b/data/edc/bt-share-layout.edc @@ -13,29 +13,26 @@ #define POPUP_TEXT_FONT_SIZE1 30 #define POPUP_TEXT_FONT_SIZE2 24 -//#define POPUP_PROGRESSBAR_2TEXT_VIEW_LAYOUT_BG_MIN_INC 0 168 -#define POPUP_PROGRESSBAR_2TEXT_VIEW_LAYOUT_BG_MIN_INC 0 175 +#define POPUP_PROGRESSBAR_2TEXT_VIEW_LAYOUT_BG_MIN_INC 0 190 #define POPUP_PROGRESSBAR_VIEW_LAYOUT_PADDING_INC 15 27 #define POPUP_PROGRESSBAR_VIEW_LAYOUT_TEXT_FONT_SIZE_INC 0 38 #define POPUP_PROGRESSBAR_VIEW_LAYOUT_SUBTEXT_FONT_SIZE_INC 0 32 -#define POPUP_PROGRESSBAR_VIEW_LAYOUT_BG_INC 0 69 +#define POPUP_PROGRESSBAR_VIEW_LAYOUT_BG_INC 0 7 + +#define POPUP_PROCESSING_VIEW_LAYOUT_BG_MIN_INC 0 90 +#define POPUP_PROCESSING_SWALLOW_VIEW_LAYOUT_MIN_INC 36 36 +#define POPUP_PROCESSING_SWALLOW_VIEW_LAYOUT_MAX_INC 36 36 +#define POPUP_PROCESSING_SWALLOW_VIEW_LAYOUT_PADDING_AFTER_INC 32 90 +#define POPUP_PROCESSING_SWALLOW_VIEW_LAYOUT_TEXT_MIN_INC 0 90 +#define POPUP_CONTENT_DEFAULT_PADDING_LEFT_MIN_INC 32 collections { base_scale: 1.8; - group { - name: "popup_2text_progressbar_view_layout"; + group { name: "turning_on_view_layout"; styles { style { - name: "popup_processing_style"; - base: "font=Tizen:style=Regular font_size="POPUP_TEXT_FONT_SIZE1" align=left color=#070707FF wrap=mixed text_class=tizen"; - // base: "font=Tizen:style=Regular align=left font_size="POPUP_TEXT_FONT_SIZE1" color=#FFFFFF color_class=T123 wrap=mixed ellipsis=1.0 text_class=T123"; - tag: "br" "\n"; - tag: "tab" "\t"; - } - style { - name: "popup_subtext_style"; - base: "font=Tizen:style=Regular font_size="POPUP_TEXT_FONT_SIZE2" align=left color=#070707FF wrap=mixed text_class=tizen"; - // base: "font=Tizen:style=Regular align=left font_size="POPUP_TEXT_FONT_SIZE2" color=#FFFFFF color_class=T024 wrap=mixed ellipsis=1.0 text_class=T024"; + name: "turning_on_processing_style"; + base: "font=Tizen:style=Regular align=left font_size="POPUP_TEXT_FONT_SIZE1" color=#000000 wrap=mixed ellipsis=1.0 text_class=tizen"; tag: "br" "\n"; tag: "tab" "\t"; } @@ -45,225 +42,93 @@ collections { name: "bg"; type: SPACER; scale: 1; - description { - state: "default" 0.0; - min: POPUP_PROGRESSBAR_2TEXT_VIEW_LAYOUT_BG_MIN_INC; - fixed: 1 0; + description { state: "default" 0.0; + min: POPUP_PROCESSING_VIEW_LAYOUT_BG_MIN_INC; + fixed: 1 0; } } - part { name: "pad_l_t"; + part { + name: "pad_l"; type: SPACER; scale: 1; description { state: "default" 0.0; - min: POPUP_PROGRESSBAR_VIEW_LAYOUT_PADDING_INC; - max: POPUP_PROGRESSBAR_VIEW_LAYOUT_PADDING_INC; - fixed: 1 1; - rel2.relative: 0.0 0.0; + min: POPUP_CONTENT_DEFAULT_PADDING_LEFT_MIN_INC 0; + fixed: 1 0; + rel1.relative: 0.0 0.0; + rel2.relative: 0.0 1.0; align: 0.0 0.0; } } - part { name: "pad_r_t"; + part { + name: "pad_r"; type: SPACER; scale: 1; description { state: "default" 0.0; - min: POPUP_PROGRESSBAR_VIEW_LAYOUT_PADDING_INC; - max: POPUP_PROGRESSBAR_VIEW_LAYOUT_PADDING_INC; - fixed: 1 1; - rel1.relative: 1.0 1.0; - align: 1.0 1.0; - } - } - part { name: "elm.text.description"; - type: TEXTBLOCK; - scale: 1; - description { - state: "default" 0.0; - min: POPUP_PROGRESSBAR_VIEW_LAYOUT_TEXT_FONT_SIZE_INC; - fixed: 0 1; - rel1 { - relative: 1.0 1.0; - to: "pad_l_t"; - } - rel2 { - relative: 0.0 1.0; - to_x: "pad_r_t"; - to_y: "pad_l_t"; - } - text { - style: "popup_processing_style"; - min: 0 1; - } - align: 0.0 0.0; + min: POPUP_CONTENT_DEFAULT_PADDING_LEFT_MIN_INC 0; + fixed: 1 0; + rel1.relative: 1.0 0.0; + rel2.relative: 1.0 1.0; + align: 1.0 0.0; } } - part { name: "elm.subtext.description"; - type: TEXTBLOCK; + part { + name: "processing"; + type: SWALLOW; scale: 1; description { state: "default" 0.0; - min: POPUP_PROGRESSBAR_VIEW_LAYOUT_SUBTEXT_FONT_SIZE_INC; fixed: 1 1; + min: POPUP_PROCESSING_SWALLOW_VIEW_LAYOUT_MIN_INC; + max: POPUP_PROCESSING_SWALLOW_VIEW_LAYOUT_MAX_INC; rel1 { - relative: 1.0 1.0; - to_x: "pad_l_t"; - to_y: "elm.text.description"; + relative: 1.0 0.0; + to_x: "pad_l"; } rel2 { relative: 0.0 1.0; - to_x: "pad_r_t"; - to_y: "elm.text.description"; - } - text { - style: "popup_subtext_style"; - min: 0 1; + to_x: "pad_r"; } - align: 0.0 0.0; + align: 0.0 0.5; } } part { - name: "progressbar_bg"; + name: "pad_after_processing"; type: SPACER; scale: 1; description { state: "default" 0.0; - fixed: 0 1; - min: POPUP_PROGRESSBAR_VIEW_LAYOUT_BG_INC; + fixed: 1 1; + min: POPUP_PROCESSING_SWALLOW_VIEW_LAYOUT_PADDING_AFTER_INC; rel1 { - relative: 1.0 1.0; - to_x: "pad_l_t"; - to_y: "elm.subtext.description"; - offset: 0 7; - - } - rel2 { - relative: 0.0 1.0; - to_x: "pad_r_t"; - to_y: "elm.subtext.description"; + relative: 1.0 0.0; + to: "processing"; } - align: 0.0 0.0; + rel2.to: "processing"; + align: 0.0 0.5; } } part { - name: "progressbar"; - type: SWALLOW; + name: "elm.text"; + type: TEXTBLOCK; scale: 1; description { state: "default" 0.0; + min: POPUP_PROCESSING_SWALLOW_VIEW_LAYOUT_TEXT_MIN_INC; fixed: 0 1; - rel1.to: "progressbar_bg"; - rel2.to: "progressbar_bg"; - } - } - } - } - - - group { name: "progress_popup"; - parts { - part { name: "pad_t"; - type: SPACER; - scale: 1; - description { state: "default" 0.0; - align: 0.5 0.0; - min: 0 BT_POPUP_PAD_H; - fixed: 0 1; - rel1 { - relative: 1.0 0.0;to_x: "pad_l"; - } - rel2 { - relative: 0.0 0.0;to_x: "pad_r"; - } - } - } - part { name: "pad_l"; - type: SPACER; - scale: 1; - description { state: "default" 0.0; - min: BT_POPUP_PAD_W 0; - max: BT_POPUP_PAD_W 0; - fixed: 1 0; - rel1 { - relative: 0.0 0.0; - } - rel2 { - relative: 0.0 1.0; - } - align: 0.0 0.0; - } - } - part { name: "pad_r"; - type: SPACER; - scale: 1; - description { state: "default" 0.0; - min: BT_POPUP_PAD_W 0; - max: BT_POPUP_PAD_W 0; - fixed: 1 0; rel1 { relative: 1.0 0.0; - } - rel2 { - relative: 1.0 1.0; - } - align: 1.0 0.0; - } - } - - part { name:"elm.swallow.content"; - type: SWALLOW; - scale: 1; - description { state: "default" 0.0; - min: BT_POPUP_PROGRESSVIEW_CONTENT_MIN; - align: 0.5 0.5; - fixed: 1 0; - rel1 { - relative: 1.0 1.0; - to_x: "pad_l"; - to_y: "pad_t"; - } - rel2 { - relative: 0.0 0.0; - to_x: "pad_r"; - to_y: "pad_pb"; - } - } - } - part { name: "elm.swallow.progressbar"; - type: SWALLOW; - scale: 1; - mouse_events: 1; - repeat_events: 1; - description { state: "default" 0.0; - align: 0.5 1.0; - min: BT_POPUP_PROGRESSVIEW_PROGRESS_MIN; - fixed: 1 1; - rel1 { - relative: 1.0 0.0; - to_x: "pad_l"; - to_y: "pad_pb"; + to: "pad_after_processing"; } rel2 { relative: 0.0 1.0; to_x: "pad_r"; - to_y: "pad_pb"; } - } - } - part { name: "pad_pb"; - type: SPACER; - scale: 1; - description { state: "default" 0.0; - align: 0.5 1.0; - min: 320 55; - fixed: 1 1; - rel1 { - relative: 1.0 1.0; - to_x: "pad_l"; - } - rel2 { - relative: 0.0 1.0; - to_x: "pad_r"; + align: 0.0 0.5; + text { + style: "turning_on_processing_style"; + min: 0 1; } } } @@ -281,7 +146,7 @@ collections { state: "default" 0; rel1 { relative: 0 0; } rel2 { relative: 1 1; } - color: 20 107 147 255; + color_class: "B011"; } } @@ -338,5 +203,123 @@ collections { } } } + group { name: "toolbar_button_ly"; + parts { + part { name: "bg"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + } + } + part { + name: "left_padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 80 0; + fixed: 1 0; + align: 0.0 0.0; + rel1.to: "bg"; + rel2.to: "bg"; + rel2.relative: 0.0 1.0; + } + } + part{ + name: "right_padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 80 0; + fixed: 1 0; + align: 1.0 0.0; + rel1 { + to: "bg"; + relative: 1.0 0.0; + } + rel2.to: "bg"; + } + } + part { + name: "button"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { + relative : 1.0 0.0; + to: "left_padding"; + } + rel2 { + relative : 0.0 1.0; + to: "right_padding"; + } + align: 0.0 0.5; + } + } + } + } + group { name: "gl_custom_item"; + parts { + part { name: "base"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + min: 0 120; //GENLIST_ITEM_1LINE_HEIGHT + } + } + part { name: "left_padding"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + min: 24 0; + align: 0.0 0.0; + rel1 { to: "base"; relative: 0.0 0.0; } + rel2 { to: "base"; relative: 0.0 1.0; } + } + } + part { name: "right_padding"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + min: 24 0; + align: 1.0 0.0; + rel1 { to: "base"; relative: 1.0 0.0; } + rel2 { to: "base"; relative: 1.0 1.0; } + } + } + part { name: "top_padding"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + min: 0 10; + align: 0.0 0.0; + rel1 { to_x: "left_padding"; to_y: "base"; relative: 1.0 0.0; } + rel2 { to_x: "right_padding"; to_y: "base"; relative: 0.0 0.0; } + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + align: 0.5 0.0; + rel1 { to: "top_padding"; relative: 0.0 1.0; } + rel2 { to: "bottom_padding"; relative: 1.0 0.0; } + } + } + part { name: "bottom_padding"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + min: 0 10; + align: 0.5 1.0; + rel1 { to: "base"; relative: 0.0 1.0; } + rel2 { to: "base"; relative: 1.0 1.0; } + } + } + } + } } - diff --git a/data/edc/bt_share_icon_animation.edc b/data/edc/bt_share_icon_animation.edc new file mode 100644 index 0000000..435ce01 --- /dev/null +++ b/data/edc/bt_share_icon_animation.edc @@ -0,0 +1,178 @@ +#define LEFT_PADDING_WIDTH 32 +#define ICON_SIZE 64 64 +#define TIMER_INTERVAL 0.3 + +#define DSC_FROM_L( STATE, PARAM ) \ + description { state: STATE; \ + fixed: 1 0; \ + align: 0.0 0.5; \ + rel2.relative: 0.0 1.0; \ + PARAM \ + } + +#define DSC_FROM_R( STATE, PARAM ) \ + description { state: STATE; \ + fixed: 1 0; \ + align: 1.0 0.5; \ + rel1.relative: 1 0; \ + PARAM \ + } + +#define LR_PADDING() \ + part { \ + name: "elm.padding.left"; \ + type: SPACER; \ + scale: 1; \ + DSC_FROM_L("default" 0.0, \ + min: LEFT_PADDING_WIDTH 0; \ + max: LEFT_PADDING_WIDTH -1; \ + ) \ + } \ + part { \ + name: "elm.padding.right"; \ + type: SPACER; \ + scale: 1; \ + DSC_FROM_R("default" 0.0, \ + min: 0 0; \ + max: 0 -1; \ + ) \ + } + +#define DESCRIPTION( STATE, NORMAL ) \ + description { state: STATE; \ + inherit: "default" 0.0; \ + image { \ + normal: NORMAL; \ + border: 0 0 0 0; \ + border_scale: 1; \ + } \ + visible: 1; \ + color_class: "AO002"; \ + } + +#define ROTATE_DESCRIPTION( STATE, ANGLE) \ + description { state: STATE; \ + inherit: "default" 0.0; \ + map { \ + on: 1; \ + smooth: 0; \ + rotation { \ + z: ANGLE; \ + } \ + } \ + color_class: "AO002"; \ + } + +#define PROGRAM(NAME, STATE, INTERVAL, AFTER) \ + program { name: NAME; \ + action: STATE_SET STATE; \ + target: "elm.image.icon.ani"; \ + transition: LINEAR INTERVAL; \ + after: AFTER; \ + } + +#define IMAGES( PARAM ) \ + images { \ + image: "bluetooth_" ## PARAM ## "_00.png" COMP; \ + image: "bluetooth_" ## PARAM ## "_01.png" COMP; \ + image: "bluetooth_" ## PARAM ## "_02.png" COMP; \ + image: "bluetooth_" ## PARAM ## "_03.png" COMP; \ + image: "bluetooth_" ## PARAM ## "_04.png" COMP; \ + image: "bluetooth_" ## PARAM ## "_05.png" COMP; \ + } + +collections { + base_scale: 2.6; + + group { + name: "bt_share_download"; + + IMAGES( "download" ) + + parts { + + LR_PADDING() + + part { + name: "elm.image.icon.ani"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 1 0; to_x: "elm.padding.left"; } + rel2 { relative: 0 1; to_x: "elm.padding.right"; } + min: ICON_SIZE; + max: ICON_SIZE; + color_class: "W0114"; + } + + DESCRIPTION( "downloading0" 0.0, "bluetooth_download_00.png" ) + DESCRIPTION( "downloading1" 0.0, "bluetooth_download_01.png" ) + DESCRIPTION( "downloading2" 0.0, "bluetooth_download_02.png" ) + DESCRIPTION( "downloading3" 0.0, "bluetooth_download_03.png" ) + DESCRIPTION( "downloading4" 0.0, "bluetooth_download_04.png" ) + DESCRIPTION( "downloading5" 0.0, "bluetooth_download_05.png" ) + } + } + + programs { + program { + signal: "load"; + source: ""; + after: "animation0"; + } + PROGRAM("animation0", "downloading0" 0.0, 0.0, "animation1") + PROGRAM("animation1", "downloading1" 0.0, TIMER_INTERVAL, "animation2") + PROGRAM("animation2", "downloading2" 0.0, TIMER_INTERVAL, "animation3") + PROGRAM("animation3", "downloading3" 0.0, TIMER_INTERVAL, "animation4") + PROGRAM("animation4", "downloading4" 0.0, TIMER_INTERVAL, "animation5") + PROGRAM("animation5", "downloading5" 0.0, TIMER_INTERVAL, "animation0") + } + } + + group { + name: "bt_share_upload"; + + IMAGES( "upload" ) + + parts { + + LR_PADDING() + + part { + name: "elm.image.icon.ani"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 1 0; to_x: "elm.padding.left"; } + rel2 { relative: 0 1; to_x: "elm.padding.right"; } + min: ICON_SIZE; + max: ICON_SIZE; + color_class: "W0114"; + } + + DESCRIPTION( "uploading0" 0.0, "bluetooth_upload_00.png" ) + DESCRIPTION( "uploading1" 0.0, "bluetooth_upload_01.png" ) + DESCRIPTION( "uploading2" 0.0, "bluetooth_upload_02.png" ) + DESCRIPTION( "uploading3" 0.0, "bluetooth_upload_03.png" ) + DESCRIPTION( "uploading4" 0.0, "bluetooth_upload_04.png" ) + DESCRIPTION( "uploading5" 0.0, "bluetooth_upload_05.png" ) + } + } + + programs { + program { + signal: "load"; + source: ""; + after: "animation0"; + } + PROGRAM("animation0", "uploading0" 0.0, 0.0, "animation1") + PROGRAM("animation1", "uploading1" 0.0, TIMER_INTERVAL, "animation2") + PROGRAM("animation2", "uploading2" 0.0, TIMER_INTERVAL, "animation3") + PROGRAM("animation3", "uploading3" 0.0, TIMER_INTERVAL, "animation4") + PROGRAM("animation4", "uploading4" 0.0, TIMER_INTERVAL, "animation5") + PROGRAM("animation5", "uploading5" 0.0, TIMER_INTERVAL, "animation0") + } + } +} diff --git a/data/edc/images.edc b/data/edc/images.edc index 89c0dfb..2b88bd9 100644 --- a/data/edc/images.edc +++ b/data/edc/images.edc @@ -2,8 +2,8 @@ collections { base_scale: 1.8; - RESOURCE_IMAGE_TRANSFER("bluetooth_inbound_transfer_failed.png"); - RESOURCE_IMAGE_TRANSFER("bluetooth_inbound_transfer_successed.png"); - RESOURCE_IMAGE_TRANSFER("bluetooth_outbound_transfer_failed.png"); - RESOURCE_IMAGE_TRANSFER("bluetooth_outbound_transfer_successed.png"); + RESOURCE_IMAGE_TRANSFER("bluetooth_download_failed.png"); + RESOURCE_IMAGE_TRANSFER("bluetooth_download_complete.png"); + RESOURCE_IMAGE_TRANSFER("bluetooth_upload_failed.png"); + RESOURCE_IMAGE_TRANSFER("bluetooth_upload_complete.png"); } diff --git a/data/images/bluetooth_download_00.png b/data/images/bluetooth_download_00.png new file mode 100644 index 0000000000000000000000000000000000000000..a172fa84544577f1d58ef27141224140317a4d78 GIT binary patch literal 1484 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$*tGSD- zk%h6LiHoa=p`nwhv757nqpPE%rKOvNn+41ata{y?9i7|^olOi3T?`FfO)U&fjGdjG zT`ipqO^hteEn#{+^NLFn^O93x_GW_Yh3Iv{tJli8C^fMpzbGU>KL?fq0y6ST@{2R_ z3lyA#%@j1kGxJjN%ZoKZ(F5_VOKMSOS!#+~QGTuhIDD-#vDoiuXyRn%9*0syHR(we_L#TsmPzh;xV_LGK z?{4UgZKuEPdf*(V!?NTcISM#smWGa53+qv37`bOAebB{MoksszfNeu{Vk~Mg<`L5y&#_wuZ7&E`- zehaVo$2o&1`P%wa#VLU^FT_6E!)?Hq=d*@ovzD-t-23<@!-CW-O`VI&r=8sL`iJR^ z0Lg@zIu1!5sfYYm)^IPodSm-5$A%*vS_O6oZ7fzDZGUk7v4{iXpXL_5Cc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$*tGSD- zk%h6LiHoa=p`nwhv757nqpPE%rKOvNn+41ata^=HElmy0%uNgoT?`FfO`R-U4J^zI z9oKL?fq0y6ST@{2R_ z3lyA#%@j1kGxJjN%ZoKZ(F5_VOKMSOS!#+~QGTuhIDD-#vDoiuXyRn%osh(tS(gn2@tWQtnqfMPEA{x|j$6#wqRAf9{8`WL zJPQOTOE8o0xAh zPC3i8ue>#gz4MLS8`p_n9}6v5tRZylR?T|0GKae^%YEXzU#~6nOsP03e1q-$GAohe zt2c5^49NKThxN@Vo&Zm=1uBZu>SU&V)!tYe`CE&ZX-ZD-=b~fwY~_U|P3wR;bgv)o5Z9$mbDc7d6rw}SHT z;&o4pZKa=8m9V`Kelp=W<7x>tcAjSU`Hx?D^mBcX?n(aTreWx5@KNwt)Sir837xNH z9!zImBcnc@fwg2G%a>MHTgK!ZmZ!TGNG{-a{8jbp@~4C0kvz!ZTXAGM12ec-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$*tGSD- zk%h6LiHoa=p`nwhv757nqpPE%rKOvNn+41ata{B2O`MHfj7KL?fq0y6ST@{2R_ z3lyA#%@j1kGxJjN%ZoKZ(F5_VOKMSOS!#+~QGTuhIDD-#vDoiuXyRn%L?VZ}M65+v;tzFB|>6*1#xwNwX%<;lyW$AX$iqh2jUhmR6`!Ilk6^@pe zvhmdCbJs9jZ!ZtPPkEbh3u8~=nW_+% z?*9FawJ#a9PBKmL=~x=Sa??H`>nR)8Us7;5d1;4+STIz!3U9f6aDHVRg~|UwQ0PIi;8+Bj*?E?tgu6 z!-eIx4(St=-*@V)03td98r=VI7%(_|oc8JcEP?-^ OqSe#Y&t;ucLK6VX>io9= literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_download_03.png b/data/images/bluetooth_download_03.png new file mode 100644 index 0000000000000000000000000000000000000000..cf943f9a01a5fce16a7cd6166eb723cc4411f746 GIT binary patch literal 1471 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$*tGSD- zk%h6LiHoa=p`nwhv757nqpPE%rKOvNn+41ata>dC&CEKL?fq0y6ST@{2R_ z3lyA#%@j1kGxJjN%ZoKZ(F5_VOKMSOS!#+~QGTuhIDD-#vDoiuXyRn%kk2Xf$>zPme_NFIhJD@5-IL`#3np-#^ZUiPgm3O#s~>F| zkB$qn2g-<)7Hs$t6gWZZzx#a0tV!E8`c_T<&%A%>lSy~_cR!!E`^rZf|D~2PTniXr zsA0=7hcoAIGsz#|ejqy~M~*RG;r63h{u8!`I_%~z)@WctK?{~o4E=a4?bi0gwc>ka z7^@`s-E(Gtzo}HM_LM<j~B^aErtb6WtL(XNsrx>?C*wp=fH$(X{ z-R9;5&NKf%+g*Raa>aKIbK3!<8QnMjvB|7H7P)9+>x4MYu7que%f3JG2xEAx?HI1I zW%dcVgO2)}>Lx8Ma8&WxvSS_BH;1#w_BO;xg}b!H?`eqrko7vvm`YeJ z9|b3fE_%`s_(3LMUEkN04GYd$6wc>}oXoPeU*q_r)*a?Lo>v(iEf1WiE8+@pcpmH^ zA8|$JMY65V_10d7SeBQMSLPqKj(?ceffTq0)azIz80KGGck3DNBvDY2>gnp|vd$@? F2>`?)4I=;m literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_download_04.png b/data/images/bluetooth_download_04.png new file mode 100644 index 0000000000000000000000000000000000000000..c277c02f09c709ff7aeb062b5a9cbc07d54b4aeb GIT binary patch literal 1480 zcmbVMeM}o=7{3k}1Z5*rU_ds`;^r2hcURiudeD`-en8oZrPP4SR7!im0oOaOhb=5Y zKoVt91It2|C8(ftFq26&;M|;p4K@)si4%hu8HwH8bYofkVs2C40!3rU{_yhL`*qLn z_k6zBZY|7;e+ZWc_5lCe}O<|`zxLu4Sz#g{X%nR8S! zHpby5+Y01ZJoI-lTh)-V!W&Q!8)t^C%>({h+~ zY2_tq3u+PcOck5oC^E&3g?49SjZ@>2>vq67J`xacjO2iQT&>$f`n2*zUJ|T>$A}zW zRFP`5@+GHAEmm01iwvw*WM()~41;l8fvMCuj-|s&6jLH75Ih4@k!qY&X2Hvk99R=w z6{O8zTDAptT6vWu2_%AeyH0cS-NKqP%i7*i%j#aTViW6#MmI}oT7-m${1f{1n$}Ai#QHnxCShL$B zIowVrWS0%vUBcoI#FBcEaY(#q=lR-D2Ux3kiT70T0<15_;cX?X+r@i5+k@p)Z{AaLP~!Gp|9~6&_2edc)*98Zq2UKMy}%zUAD-iPG>1@;jNW zHYR;c`Z!tW97Xe$k&g~19sKKuy7`gBYd;bXz0z8bCiw4%5pfrH_YPf}+t~NwHyt-O zkF*Q%=E3*E3JU1KFYdoF(kXOJzPi2bvjY0?`6lsbHni!Hv=Mfo$K@MKn~vn)={lpV zIMBAg=598zt9LpPm(g2BPZV@018IJz`Zr^Ic$8ZGwY|=>?)5K^M}4yS2oyaRxq&JQ zkC|LkQda!1Fu0Wt4CBYwet722bZ_i5Ju8!`Zl3l}y=6J1$~opm`Ye;NpZ4GR=-SNe zzS|nzd`DcMEwAON*Y<}68lV04$e!*bo2;qZ-+Q(B^Czh9Q&V~@4U_BB*(q6*CU>Gq zjI!n~JO(GElWTwRCm;B!bsl;;eEdp(%7yI9fwQp@RwyLRdH14GNb|?3_^)D*ylh literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_download_05.png b/data/images/bluetooth_download_05.png new file mode 100644 index 0000000000000000000000000000000000000000..245f811cd5a7dbd9e57806ada9aa79b715cf4e2f GIT binary patch literal 1481 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$*tGSD- zk%h6LiHoa=p`nwhv757nqpPE%rKOvNn+41ata@E6%uGxTEldmyT?`FfO)X6=OfAfe z%pINF9E~ju&0u;x^NLFn^O93x_GW_Yh3GZMtJli8C^fMpzbGU>KL?fq0y6ST@{2R_ z3lyA#%@j1kGxJjN%ZoKZ(F5_VOKMSOS!#+~QGTuhIDD-#vDoiuXyRn%F!Z)WY)KawDGJi5H-$)i0-RM{rGv`F;0ZS>G_)BfMkxxe9I z+GSmj95L?ZgAFc+G}O|~BAyh)IjwlFKX2u&=j%#y*PpMgKbf9!dHLJVFF${Jefd`3 z1WFyye?&Hc>v+YI>!K0ah!Gy4vco#VE1hVK{L4q@z#JF|>|YXKT+n8Gz- zYg^p)eeGz)|@8 zcK&mh&Dc(Cx~4ee@AJyO157_W9_vhCKfdaJTW7EVf81po-cvpWOv{+2?Pe){aIwW^ z!HRj$Dw>bSH_y~?`>P_nkSXHRjK{kDF^SSwe9o}^KDcSpL(xljwjY?ha^;323non{ ze_PLHU1;)q39ARs%6Au*ZhJcUhTe|;-)@usSXl9hh4$@de>Z6dXPw+~2CfJELc2~h z3ax0+-jH;3N0hLVQG##kB=c+U&x_5yC3K0&WXjzA8>5!{Oqyczt~@y0?K-PbR^7Rs z-@LOWvM-7$NT&3=H-&N-vz>^JxvC!fHan29ZtBLzae_u^0w#8w6imBSk2U4sqBIBD{UynB*RgsCshkeJuerWvroOX?10x*CeN;Zc@bb+rrW#+@ QSD?bx)78&qol`;+0ED>@i2wiq literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_download_complete.png b/data/images/bluetooth_download_complete.png new file mode 100644 index 0000000000000000000000000000000000000000..461ca3f950e5ae5d8888d47f80f5367578b65fd1 GIT binary patch literal 1584 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij|>-v89=@ zrLnQOfw`-Rp`oRzfq|oip}CQPnSra3u>s5sYU`j9pzU zO&rY}EzM0G&COwYJ@bl767!N%VfJPM?S<+!!mHQHxhOTUB)=#mKR*YS0s=DfOY(~| z@(UE4gUu8)!ZY(y^2>`gLD2*8txIZAW?5>ATTy5Px?R(JoBXH0dq_d zFl#ivS;ox3z?9(W;uunK>&>jw+Ae`I$KShNoHAuolCs#QAThH=H=@18{xPkeWb;|0 zvvbOkW2>*|q%2)CWl~DArluq}&moQePrLRlx6IsicBk>i2)_ zir;;-PG6TN(KhYm#HFbf6BvXXm^>Ib6&O_-SWa}Qeqij;usb+Qi*eVJpdanA!560S z$L+CWD(T*qGm9Cf4n@TRg-+~>1$U;GD*~Os@ba>SI%TI zsq>FMs&rwmPJ^M6M_r`rCoL9(W4vT83j zcU(BvYXi%hM*j``U7>u}SzfT&FSArjNawrZ_bjDL@T%1Mu;WK}v%Y$?$A78>t8mk{ z;ML5&xR(U%<{xp@9L@AN>M<|uV8#mK;8>&5#nma(r|WGAdWCrszuSC%ZHsq?f-9oD%< z3*KP88ui3*R_O(`7rz;#4hHTLbz1tTH0(m$3Dq|ZVvh5p?aF1WcdC9uS)Rtl@N7J^Oy6%lx80j&Am?kdWA``XfPD2z z^LmLwqpAZ_UgoRUY~xQoR8%qR|848*O8uAeKIYp!IdU@7xus544HUuPh%+*)W0hd& XP+L)*DzQu#REB%H`njxgN@xNA*-SGO literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_download_failed.png b/data/images/bluetooth_download_failed.png new file mode 100644 index 0000000000000000000000000000000000000000..ecef32a6b3fbcd0c596a17630757daff3a8bcc72 GIT binary patch literal 1708 zcmbVNdrT8|94{y^A3Q`v0cA(kMU?jL`tI3MO0ShVfesq!d|*p^g&VY2?haZ6r7H@Z zne)MPadU1uAyITgoMMy-7}1z*KG{?-!W7UY6L2z^iOyXS*p?Xo*yZkikNbW;-`D4t z`#_hrEO=`4R2GXBtW7~Pm@&!syb;K}595V*nIVc+8|X~JN;^#?#!^~{91PIfOu1MF zX0ntNUczK7)+8&gH_(RE6^NOzaZNrOuFK|N&@7fr;c}SF`4|o4V7a(m&K@|^%m#3a zoSh|1g;E_VEDujvPhy$t)AZ)``DUqwtw;o9E`%YlVYCTw*$V6w;*zsRc@bvr+XmUd zs0p1fXTJ=}kg5Yz1c?DcE}vtDU>FdIxUfJd62S=o4}y6h#M~kdEI@=JgeL~ZE;i$h zv{;c0R5Rv_S;^UXH0?k@(CKt?oqR4q=7O+PD)n*jcpS!pLzUQRlZ#`g=8rR=7-c4L z2aOYUz{hCHA&O`@n~C&g3N}Y->IAW!8Y>i2GSFpmfG`&VZ8l$Cqt+Cif&CN4E3GMg zi30;OFp4N5%}hV6^T)wV?OyN5XUIf@q?0()6jK38n2T(foz|jqHuHsR!7T_Z;Y&q) zDW5Nf#A*QyON9`ml)z#hB!bjDJ~YnpDy&$fK~Yq~7r{7Na6az(mgEEf$KCH3BuNQKM3&RLCB~TK-SX zKqeT_CysxKWqgZKpl>=MeP%IncrZJ2Vo2s_-0Xc@!(#d0(V|MdtK+v%f6Q-Bnp1V0 zWB7IPmh4qSS6Au=!NH!Is*V$n4!`ia!gd_+#-fLUzbE*aHV2*Fv(2*ahXwrVzOt?n5&3ONjLg8AX7o#N z2h_77Tl{x!3I8*oY%_A|yKH}QO8VxkHfb=vT6yB9(xl5ff4+RhXY(Jx=;C%H6nNH6 zOkQ2q-qYMywxK^y)wA?gq)M((=0=vb#1C{8XSL5MN(@9p9p?)btM(SUY%dBocxJ}M zlxH9MDmbD=;+pgxFMU>1;6ey^Qj_NH?um|3)PBtI)VO=^dVUd14ci-X%Uj1Q4>}dq zFyf6p7H{*HNo#F|^Ll#PuApTbWz!eOY5hD@<+QVLF$0&H?|UCJpf$j3#IIu){LO_8 zR|AGU4=O8nE5V0>)eDYp*Z6sk8w2iSM1%Y84WvveUVe5>CQ$wK%#4yfUtBo0h_AdBkgHt# zQR~`}(iV^DL&dc_`0`l&^xk#qDE}J=8_t9T=sD>_4QkKP$LzD38G{x2;oJM&*1~JL z{^iwVQD@0#oGSbt?^gfADBZ66hS?aDe4z;$e$!o1*^sl&lp9&RDREO?lQ(*idrRE& z%#|n4_X#id3AWC5J_|2d+TPQ-KfL~K3-SKJoKQ)GF?M@apWo?5)w-1r{N@=06Y$fG z_>qx{`0F!wYoDqI6Q;?#>t$VDj5BynHyr=aZ)wZtr*8T;&kTn`MHic*6WWeNN8}GF zrfBn4G@M8NdZ(^GXmZU$=caSI_Jkd_QjaQMzU=yo_~_xzHkQOc#GP2LzC5?9;*;)u rd!eJXz2AqG&&4KG#fT)O^w}&Ut1P4-j%pl;_x(S#>NNE0WTWSAuvc{= literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_inbound_transfer_failed.png b/data/images/bluetooth_inbound_transfer_failed.png deleted file mode 100644 index 303e9749299acb71ee322081f4c3da9eda279b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1484 zcmeAS@N?(olHy`uVBq!ia0vp^dLYcf1|-9GYMTQo$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y=b2Bw} zF)=lQ>2=9ZF3nBND}m`vLFhHXsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6rPIL(9V zO~LIJBb<8mfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tj|o}5XZp4xO!uW$mB!ERts?V zr_GjGQ6Zoh`JY?=gG8G8?zBy62K;pfm7kxzwLg5@(k$n8*$T$uUd(fWu}E@yV@cPiI2Z<+Yq%bIsV*`bF56?;F2a zYnYxoSIO>Hd!*0QYh_C9k!MmXk4<+t<{Zp#PkIc_kp(GmOnaQFmI9if!^4=d79TYf3WzW@Mu^KHdk2KSu)pKOBL(&wzYRycQ? zgXMSD|Jy#CNp1SQt<~^%o%d2P>1A{HC+%CZXv;R0kLMk^*5_#DX`h_-SW$YAd7zyngIG z7sh{llFQLK`%F{&8q#W_X5`+R9oxP(_0D0YK|V*==5my)>ObV$du8>R=|Z1h z{(G@1m!2+{v*Fi~Pu7w89Mms8A%4*VfhnS|>t`k{%ByVB5xscq wAlD40K(oWoA27tQ{!F}Ib8=PMekLAo8F>JQ#l02Z$dp00i_>zopr00d4il3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)yr*nFEgLTg9c{4 z9bua9r+M8lwOy?HR;VUr<@(YeT}A6IzCTiH&0HVwjAylz{*L_Rdgs^=`~7#?UKu{| z!?g>!_xZU0O#IAkb?M%cX`d$B@AZ)2)Ra^gxs{vlT)E0Wc4^(E&Y5LF&m``07Re_LJeIpdNKIwAqz{;)cHEL^a4zlQaxg}%kOOG*H-J8BEYvmH%L;6!V`)6|m2=856efQ6Ax!AV+mNLfaA9^pYdvJ8t{?E^Z m>W$m__j7~1d*E{ww*kYRy;A#EyGJX63K&mUKbLh*2~7YL^{k2j diff --git a/data/images/bluetooth_outbound_transfer_failed.png b/data/images/bluetooth_outbound_transfer_failed.png deleted file mode 100644 index a668c13529da6ac5a63b0269c4ccc9882bdb00fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1479 zcmeAS@N?(olHy`uVBq!ia0vp^dLYcf1|-9GYMTQo$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y>2=9ZF3nBND}m`vLFhHdsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6qEIL(9V zO~LIJQ=EGBfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8taE>VD`j9{vi5Xw45_&F zX69*amq3~0ce8bFB=}F+6d-mfWnqg@Z_b`$ZZ{*Ubajs1Pe@J8OifNz^_4uC-0G5& zKFLV#tO18{%>Cf!*FL`9_rxyk)t^_B&+UBv=UsYV_4)VbVq7n8nUut{b%}>_mv^D2 z-qEEy)E}8X;Ca)SrGHdZTw8teJvQDwwH#FryC#J1ndY%MgSBvdSX`;6mE#iI>EX6h zzJ>g=zi#pSg7|`q4=c(vOGQt0rT;hhwlko7s@DX;TmB2Y#1z2BicEhLbZ60@?(_Gy zhlxsmX%;PD{q%r!PIKyo%xbf+Pq8T+OB{qsX7psTvCpc_X|mc}ELqyu=wA0pZn}Mh z{E4h{kNH~WcC1#=_1RMrxJz^o*UtO8Ek~2jEWhWsXOhZ^9V)U+%Wa;UcQAZQu{wXd z>d66%`No=GjyDU*3l`Z;NDhv%JAVA--={~GzSV#9zc+7Q`P?u4(kJ*Q?~|Ch`Ni@I z(eu^LzdkEueUzVNdZP5n^dId7we^xR=ReDy=``uCE}WAU;L;bX<#GQ{{)r_QHootP zSNm+TpL>F2dCJ!py&f~wcJp>SuNM8TwaufNX$|LFNdeJY-U@EdRGK0_Dt5muIQOJ2 z_2`G-8RFZtf5ruH`L!^a9QZB9lNV9DT1NG}?*1YzyM51d7bP0l+XkK-&rpL diff --git a/data/images/bluetooth_outbound_transfer_successed.png b/data/images/bluetooth_outbound_transfer_successed.png deleted file mode 100644 index 157f7bb7bd3cd40b07186e04131971a613f88a5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1237 zcmeAS@N?(olHy`uVBq!ia0vp^dLYcf1|-9GYMTQo$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y*A8>2=9ZF3nBND}m`vLFhHcsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6p(IL(9V zO~LIJL!5f`fsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tTQyP{9<5W^z?Lb45_&F z=H|hyW(NVb1m7y2FH`op^qu7XlBTzEuS&bj<#g^Znl?{ne35vuH-x#e!O8Q+nL|^$ zdLCu9h5lf#iztn?n|3smr`OO?K3m|+76x{if&+}Jh)lxLtVdOnHrkS3l-H^cT$tt+{Plx4sQFeP#K*g zY%CTJ8kqSk9*9nTdTY7e!TS<_d~a@%NO$zKocO26@x4~-8BNV}y_oCgCKVa}|El_R za-L7I`OX yIQQbd2ld%@kIz0`dQw8MPMitoyoTGmI1Ly$8--^5SNBx_6*Qi%elF{r5}E+T54HaQ diff --git a/data/images/bluetooth_upload_00.png b/data/images/bluetooth_upload_00.png new file mode 100644 index 0000000000000000000000000000000000000000..87262c929cf014d086e5ef1cdc00717a24c143ac GIT binary patch literal 1487 zcmbVMeM}o=7{9U>MuoT`3(k$?cAK&}=-u_>+PhGp?X^<3c6>BhnV503*KvdE-L6+! zAkG42N|;+5#4yc-EE~@Gv8b3B&D;o!C}fI`Db9`I3}#a|(9A!8Aif1UH6i=M%X9D7 zJ-^@c`Ce@>JAmuO?FxuOP%Eo*Rld<``|(vK880p~|4K)|yy14sGVV2FyEkp*4~tmDTh z0xzh@HD+YdDX*&-wh0mo8#KB+ABN*FL1=Kjfgtc)Sc~CW6azx!;d;tIP+B9r^dP{R zuI|l$E^mP!)CJBEf$h=m>i}A$8uP$(MD)VlTnZ1G>+R1q}FD!*{u$%gCvbcgEfJ5 z217Cv^sx!M9I(5DCGLx*Y!b`Jg5(i|+C&EwR|~Qbsuo1pRz|>^cXC0$5D9IGmuE3r znw7XZ*6)x69$v^V#Vupsg6pk>)o#FTdJK#pZj;Vr!7VxxGuliJ2eO3q|DT+pz!@~& z9RF&T#1ZJg`0`%sgU!9m!v?{Pk-*iM@4Q(BL5g`NZSh2}{PwDOTYurh17*8Qeph9V z^tr?gdDt$lQm(GJ@co11<0rb#pZuULEN0|nWz*uY<(RUBF5Xw7)*zp5ed?w87Xq6N zXL~+$HAd!B_IEsA@y+bSojs+{9#uiI;!Hw z>ei<Y;N{UANG;1yfDjjcmLdtw1ct6hg7{SEzsQD%7e{0?aJO}^O?z% z)LV#e{F+j6u`(s?XRmv3dkj6M8foDLaVUp4pILNsb9ZuWgKN6rz2u(0!|tR_eY;ZH zRn+y2&aa*4O{0%bk+XfRnm4EFo4O{BY#6&qB#$(G*>U@`SY%3d_vG!itY5iR0c6wR z{sCyfnKV+>UpqW=3sV(C|B=xR_C^K<|OqwY=ghw=``w_>Z35(uKp9v~{P3z9k(!gLJ35EcTpdqQo(C zsU^L>aCm3=u95aiX+N*O!gTf=fdECY3*@H-JOuB*4>I^ XD5>5&<{36^P7?yIw!8*BiC8z3Zr>6`>pGlyI~MoX}pm9<&fl zfGNw8fdomIM3l^pWVlUdR8UYL%Lbcsi@{Cp{7SY2)JB#iGT3nQEl_3**&kk>d%y1a z{hrVF4i(sU%Mwx&APACK^Qb~F=Z4?-I4}-!wLgO?S)@zEBECZOGXe`4U3@tUTir}0 zTgWo5hT02k4g^J4aE=nO#FkGwc{jp@b&!DD3(ydhV+eQ|XEiIrXH36Oxm&58^haMyTzWI!)p<|V;8e2mKB zWfienFJE!0#8v>Cd4YvBh$`Euz%Urc5lpSYacn27RA5R}0R+#+)T9O{m0Ec9kppXj ztAZ?~EUUJ_PA{(#MK6h>e!m~_s}NqOL@}LC7v@kZvw=poufZcSfozX2J;Fe-KBvHW zMUMBtVMeB$uM_oh;OR;TZm-R@M(pveCJLks4KQ95Llmgn9gb^R+b0&X58YT-+vjNT zvS=aeo1ES~Fp>$XBth|C2KmID>|p z<6q4ZIRYIRUaqx1*sNV1)&p*g0Ir6qW3dB*q9j(z=m-Quz4|?8bCV{~tApRZa(qv$ zw5N4JvIHZo{qc6Y{qAEgk-O>=6VDl?PZ?fEuFuQcFktE;qZ3{KOxH;zL#M4vc z#pBXYYY(wu>WB6#pDf&$gj((p2~)xLD?^Jv>A#nz)o$)QGubpTGdDNh(g&xbWidOi zzcBXZaO}bUL{`Fm7&8!kZ7gbce=;qJE=%0kd&TD~#gVjXw(%-rrhz4z$lt)2BJ=i4TF-)MZdKa}TazXKXy`9G_DrG^WDdvezZiV`ue_02Nox1kV`sh@up4%K_T${A#oIpE z4&%RsN^k8troHsq$I_|!#UtWaRZ*;d&j==zVupJ?9Kjty@afbPT#%8VN) zQl5|)h1`tm7q;h0`Zl#Ze=Fqxj*kj`#hW_m&e1P}hXXghYDzi^CGSu1U)PMgYF{{aC!2=4#@ literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_upload_02.png b/data/images/bluetooth_upload_02.png new file mode 100644 index 0000000000000000000000000000000000000000..3339605c673de6084be743eb0b4f68db3002b37e GIT binary patch literal 1492 zcmbVMdrTX396z9pQJCT$3JUX9CIbe&yS`{oN;%q|lu;g~u1sa)Xs_)7?H$)+El47J z1h*L?nTe8(WFW&BHDk`q;2y$!0+JbB{KL5|WPl8T47a%q=N5kj%KU@u4=>;Qz3%(@ ze4oENSW@)T8u7DY2!hs_@(mU+=LX-^tHAgXQ+Ewa34*a)C}W+1pWF>WYMW|a|x_xc^Xzq<(YOA!(f$4iYb&T6_x?ZP)vrPKvbES0#~YVSr)wXNPsoo z;lwQla>*9hX(et!;BW--`~6bCT*~q;1k-3VK@OQL6KG`m8oUA($n^S>LktGmXXhDC zU|264WTdLtdO<4zo-T&q;mqb`Vy|y0Q6ObVfZ`BLiXt9QFs=n{pJ1UMxv`?Q&)UGz zh=umC^}HR_!zC5%S+!!8Qjlj-}A3{*L$Yda_fy*;T&KG=L65sMp^~=?# zf9~14ZyRwALcTG^t-mldWa=I0`K&DIQ2w_>)Rx|_Ochp+kVcK@f&8Eqz`3Gw+oythQNLirBl4Z%gheiHQL?rGh=n#z$i1UB#pY9Y@*TuC( zehkm5rJ0q_WKU(lc3aLE|8V2X9$Ql6@!4V5i?8{khDR&5gr%MRak6RW8!>lh!(_L@ z$$?YaKm6;mMj=Ia1|0qFfG}|Dz0tTPvUC6{7tQOgO(rHrY%K^cJPA2p7y8S%_pcM{ z4n2I(^yF3qi%RL5t^1$4-3f^wNpm0BZYmuT>HfYlZ$266PVJ=bZL3k%Z-Ao@^KaH{p8ukII({yx zyK-=%<6LaRrHb5ISD5&~^$hsnNO<2WSLIdr#6S0yMA7rci!To~ks{WPcDC4xh zR!F^lZ2jfzo1fbfdZn;x*Ua`g`EljQ9VVvj&V2h=dlQFkbi{J6o@qH_ot0flxASR* zVYA7DM>kCsZ>SK75+Wo!ig$;JZ+saucw%DuX69dggOav literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_upload_03.png b/data/images/bluetooth_upload_03.png new file mode 100644 index 0000000000000000000000000000000000000000..335b5a8447a09a51627e1119b5a3717c0dc6f5f3 GIT binary patch literal 1492 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$*tGSD- zk%h6LiHoa=p`nwhv757nqpPE%rKOvNn+41aYBC3|$NjT}>U$jLe)& zEi7FO%uQV^%;0)G^NLFn^O93x_GSX@h3YlOtJli8C^fMpzbGU>KL?fq0y6ST@{2R_ z3lyA#%@j1kGxJjN%ZoKZ(F5_VOKMSOS!#+~QGTuhIDD-#vDoiuXyRn%koOxh7=SO2rS(Cb$-y}-xoQAW}EcdZnUhluV_=VRDAyO=U<`An{<@V zB?d9D2EdWS4@1^xj?6NRUUOKU9N_Y}x&QS7maIa739PFX-dgDCCWza-)KN$dw|iXl zPwq`)xGd|Ex2MvrW6If2J&09j)ZBgkc}-kB_qVr;A%f+n{k`WhGR)duOggR}aJ4ml1!3n1=Dom0x6$tWkX_Ws6;3(wRC zWqjUqJ1%w4u7(>m8>0`NpK#6K@^W2=OV5-0l0O|hS~0=!K<e$>c$tT*L$KGbeg={4)ITMT2(V~wj#(c fP}E@dQS|^rTu7T956_gPpmNsJ)z4*}Q$iB}Ca4Z4 literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_upload_04.png b/data/images/bluetooth_upload_04.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2f798193fe35f7bd1a641f3400a53511c9eefd GIT binary patch literal 1494 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$*tGSD- zk%h6LiHoa=p`nwhv757nqpPE%rKOvNn+41aYFdDoy<)P3|$NjT}>_BTuq!! zjV#OzO-+H=38vRGuec;JFF6%vZzj-Qs9rO?daay`QWHz^i$e1Ab6_bTAS1sdzc?em zK*2fKOhF?&GcP5-yjT+yJrLizq!wkCrKY$Q<>xAZ!`CVki~Wv7g>=oo!a;y_9)Fd<+H1To=BAIO1cp42>Gjwu3W z4ZE8^~)nPu&LI6$Ipa#m>8-U~~cn!O$WF#Zz|cMM=rS6BbbsyBD; zs{j`*J}Zl#+Hb;2@y?&+kc#O1Y?YrorI$9u<@EM8DNZlmB>8FK?uLC_ zTpqg^_B#d$&2%kbK6kL~;;EnCvrnX*5!=CXJ>hnSYWiL0s0Mb`*ZDcWro2==YIc72 zTm&v=i_7;;$t=%&VHTjsHc1h+tn|4f0%eCg&eriSxSFpoxj?Km@ ze^;*RZZJr8(0P4Q&w+7nIb&sZ_06ffa$yv4fT0U& bbu1DLssGyaHg4wV2bHv*u6{1-oD!Mc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$*tGSD- zk%h6LiHoa=p`nwhv757nqpPE%rKOvNn+41aYA{O3|$NjT}>U0fSR4m zU7ehrObne3O<{UH^NLFn^O93x_GSX@h3YlJtJli8C^fMpzbGU>KL?fq0y6ST@{2R_ z3lyA#%@j1kGxJjN%ZoKZ(F5_VOKMSOS!#+~QGTuhIDD-#vDoiuXyRn%D0YRxb9EayJ;K-r5aXw~`Ww#)W2-Og&b66c^lBY1J0av^6~!^+JKdIsEX zHP7sscRz@BXOvA~>-o2NPVxqRow+P3SD&Qq@_f3s*>x_9PgAqnbW29Q=89m)Bbqz% zlPa&jn(w&UZ~;G0=-+b{HO)rCGV6DiG24~S=Q#Q1{Xu7|NPeESuK}LQ&m0*=98i%! z$qByo)0Zxn3}r035m@G_JbS)$B3H)IixKuOw(V4JS9~8Rej&_}u~7Vh8OOHq{A`B}~WU~z%j>sN_}v~OwK zXqL6El@IVwaavU~v0IUA0Rs#*SbbDJz`)GimameNIR#X> Ndb;|#taD0e0ssfb0%`yN literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_upload_complete.png b/data/images/bluetooth_upload_complete.png new file mode 100644 index 0000000000000000000000000000000000000000..a2449be5fdbf2de62cd2f79dbaf37525c93e7709 GIT binary patch literal 1592 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij|>-v89=@ zrLnQOfw`-Rp`oRzfq|oip}CQPnSra3u>s5sY#)ER9VJ%^eL5T}>S=&CT7+ zj9rY4og58Z%`IViJ@bl767!N%VfJPM?S<+!!mHQHxhOTUB)=#mKR*YS0s=DfOY(~| z@(UE4gUu8)!ZY(y^2>`gLD2*8txIZAW?5>ATTyHa(nd9%jo;kMlK-=7U#}iJ1+GdB`Zfcaxo%eZp7y^d@5kq4w8088c^PX?3+7s8y<-CFTsV-T~Py z4oqLTe+10w{^7`QpKEsiq&L+L&Nsb99r^!x>+oJ_h}pn-E;QcnW5lODo3`+E9r?(; zf_ZgWyMx^gru+oyCp&F^_U51b?7?62*6p;i+ufR@0h{Ohf5}_dB5-5+8{?SOb<(f- zG`b7lv~hIK)1NZu{-4v%7b=VvipF?;syQR>eNMi?tKfUQnp2H)DpO3e_Jt=YpVH7AT(&x18$A8AyMjn>kz<%nW z@e20M3Re%k?{{onI?w#4*o;eCqO^Z*(}-f~b=o)6V&m*Rx5b@#ANd8W4fi`bS9sg) zj@jbQ-H(d>jClNA&$s`-)NxzesXNI+f?F$H>8G^)lp{avU9(*KKRh2%Q~loCII7?LS_H} literal 0 HcmV?d00001 diff --git a/data/images/bluetooth_upload_failed.png b/data/images/bluetooth_upload_failed.png new file mode 100644 index 0000000000000000000000000000000000000000..72966d9cf4f108303289e592f030a4b5225cf203 GIT binary patch literal 1754 zcmbVNc~BE)6kqPEKnsi&t*|T+>p`-cJAnux8xAE%F-V-TLP!>}Lb4%Ql7L!~Yf!Yd z7AqAMm6m!{pxBYAR1PUvEGmLJNC&Ax%P5Lgbet;C4TtR?j(>D#ci;DY``+*U-Zi@; zJ}%1Lb%84Y0PZo-XaXg}t&g)K^*)Jb4N$_Dlq$%zL>g&U8ZbbtCQ>mlMypK65-_DY zC+in16aehfaJhn1$YO;mLQ7X#b?6qYp0Wmj&@hW$smj1eFcnM3bs}i&d=muXY7vyg zk-;*(1k>Qrxdv=)Zk$||o1qe@p|F);s6|KtXfaX=TC|xuqtGIPrg4ST+Iq}@z-bjS zLj=u`Qpn;#31PrM4xJUOf)NDda_I=0!{s6?KqibZ88CHogAuln!xb`l;Oqra-VEwA zVFDUC>xCDpG8OYYaG56lEq#sIs+~j*LM?5cP$w#??ZE&k}H1 z0v3x0^Q3G95pZBw%tv@km8B}o|M1d%z{0r47wB#atD4@%Z@!4H#gotiKk zms-m+6D^7va1*AEG!R;FI=@2v4gS#xHp)SGC>Lf^%&E9}99~2uTZ%?XQGr-Mai6hO z|DT*OC^8IdbNr`S=8mWiv@Tz_KDBv0JeZD}7y~sL-V-JlYT{gDP_f){d-On4hL6~% zV=Q6AcwC95sy!l*Hj}ai|_~$#Oz9$n?EyG>Kg?)5(KJb1~lY4JHUU_Buu4U3(gZ1z!wSKWlEw2QH^lu;^XlXN%n3w=eqq{ey_dyWv}10ciNk28c#(!&k`zWgn5w?|Q|9ZG;BDB1_v$E$|=Qh)(;ip5q_mYcGc5BP~Le5SdhemeqA4Oh_ z#9m&e@72q$jN}ZT`;})Z2v|VBylVaS$(sH;z9ih#lGK}+T(GWGG+5B__hjqi>TK5| zLmy3P4+cDrHkxi71F%Xky)(+bseScJzo@+A1NFo_hvR7*E3encPn`4m^J0ml3*@ zJn&9&(>T@pWq;e^QS0*C_0HV8hdp0BjLs9(e)=e2Uk_ zv%*)j`{f(vA81kR;#GRPgf5w1bWB+~y5BprtT2$t{l1m?V6*+`H$xqcJ3k03;0^jY w#2)ob`&tZ4!mYNozzV>vc}ApMoOFhP<2PRJkiJ|JWc}O3NaN5m5h?lq0NPoSqW}N^ literal 0 HcmV?d00001 diff --git a/packaging/org.tizen.bluetooth-share-ui.spec b/packaging/org.tizen.bluetooth-share-ui.spec index 979a85e..158a163 100755 --- a/packaging/org.tizen.bluetooth-share-ui.spec +++ b/packaging/org.tizen.bluetooth-share-ui.spec @@ -3,7 +3,7 @@ Name: org.tizen.bluetooth-share-ui Summary: bluetooth share UI application -Version: 0.0.89 +Version: 0.1.0 Release: 1 Group: TO_BE_FILLED License: Flora-1.1 @@ -24,7 +24,6 @@ BuildRequires: pkgconfig(edje) BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(efl-extension) BuildRequires: pkgconfig(evas) -BuildRequires: pkgconfig(bluetooth-api) BuildRequires: pkgconfig(aul) BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(capi-network-bluetooth) diff --git a/src/applog.h b/src/applog.h index 2acc160..a2fdffd 100644 --- a/src/applog.h +++ b/src/applog.h @@ -29,9 +29,6 @@ extern "C" { #endif /* - * warn_if(exrp, fmt, ...) - * If expr is true, The fmt string is printed using ERR(). - * * ret_if(), retv_if(), retm_if(), retvm_if() * If expr is true, current function return. * Postfix 'v' means that it has a return value and @@ -61,11 +58,6 @@ extern "C" { #define FN_START DBG("[ENTER FUNC]"); #define FN_END DBG("[EXIT FUNC]"); -#define warn_if(expr, fmt, arg...) do { \ - if (expr) { \ - ERR(fmt, ##arg); \ - } \ - } while (0) #define ret_if(expr) do { \ if (expr) { \ return; \ diff --git a/src/bt-share-ui-ipc.c b/src/bt-share-ui-ipc.c index 53d3597..e06d9a0 100644 --- a/src/bt-share-ui-ipc.c +++ b/src/bt-share-ui-ipc.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include "applog.h" #include "bt-share-ui-main.h" @@ -33,23 +34,30 @@ #include "bt-share-ui-view.h" #include "bt-share-ui-popup.h" #include "bt-share-ui-resource.h" - +#include "bt-share-ui-widget.h" #define BT_ADDRESS_LENGTH_MAX 6 #define DBUS_CORE_APPS_PATH "/Org/Tizen/Coreapps/home/raise" #define DBUS_CORE_APPS_INTERFACE "org.tizen.coreapps.home.raise" #define DBUS_CORE_APPS_MEMBER "homeraise" +static gboolean opc_launched_session; + +void _bt_set_opc_launched_session(gboolean value) +{ + opc_launched_session = value; +} static void __handle_opp_client_signal(void *data, DBusMessage *msg) { - bluetooth_event_param_t event_info = { 0, }; - int result = BLUETOOTH_ERROR_NONE; + bt_share_event_param_t event_info = { 0, }; + int result = BT_SHARE_UI_ERROR_NONE; const char *member = dbus_message_get_member(msg); retm_if(data == NULL, "Invalid argument: data is NULL\n"); retm_if(msg == NULL, "Invalid argument: msg is NULL\n"); - + bt_share_appdata_t *ad = (bt_share_appdata_t *)data; + retm_if(ad->tr_type == BT_TR_INBOUND, "Invalid tr_type: BT_TR_INBOUND"); if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL) return; @@ -64,7 +72,7 @@ static void __handle_opp_client_signal(void *data, DBusMessage *msg) if (strcasecmp(member, BT_OPP_CONNECTED) == 0) { char *address = NULL; int request_id = 0; - + DBG("BT_OPP_CONNECTED signal"); if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &result, DBUS_TYPE_STRING, &address, @@ -73,19 +81,60 @@ static void __handle_opp_client_signal(void *data, DBusMessage *msg) ERR("Unexpected parameters in signal"); return; } - event_info.event = BLUETOOTH_EVENT_OPC_CONNECTED; + event_info.event = BT_SHARE_UI_EVENT_OPC_CONNECTED; event_info.param_data = address; event_info.result = result; event_info.user_data = data; + DBG("Event BT_SHARE_UI_EVENT_OPC_CONNECTED"); + _bt_share_ui_event_handler(BT_SHARE_UI_EVENT_OPC_CONNECTED, + &event_info, event_info.user_data); + } else if (strcasecmp(member, BT_TRANSFER_STARTED) == 0) { + char *file_path = NULL; + char *file_name = NULL; + char *device_addr = NULL; + int request_id = 0; + guint64 size = 0; + bt_share_transfer_info_t transfer_info; + + if (!dbus_message_get_args(msg, NULL, + DBUS_TYPE_INT32, &result, + DBUS_TYPE_STRING, &device_addr, + DBUS_TYPE_STRING, &file_path, + DBUS_TYPE_UINT64, &size, + DBUS_TYPE_INT32, &request_id, + DBUS_TYPE_INVALID)) { + ERR("Unexpected parameters in signal"); + return; + } + + file_name = g_path_get_basename(file_path); + DBG("file_name:%s file_path:%s", file_name, file_path); + + memset(&transfer_info, 0x00, sizeof(bt_share_transfer_info_t)); + + transfer_info.device_addr = g_strdup(device_addr); + transfer_info.filename = g_strdup(file_name); + transfer_info.size = size; + transfer_info.percentage = 0; - _bt_share_ui_event_handler(BLUETOOTH_EVENT_OPC_CONNECTED, + event_info.event = BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED; + event_info.param_data = &transfer_info; + event_info.result = result; + event_info.user_data = data; + + _bt_share_ui_event_handler( + BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED, &event_info, event_info.user_data); + + g_free(transfer_info.device_addr); + g_free(transfer_info.filename); + g_free(file_name); } else if (strcasecmp(member, BT_TRANSFER_PROGRESS) == 0) { char *file_name = NULL; int request_id = 0; guint64 size = 0; int progress = 0; - bt_opc_transfer_info_t transfer_info; + bt_share_transfer_info_t transfer_info; if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &result, @@ -98,33 +147,32 @@ static void __handle_opp_client_signal(void *data, DBusMessage *msg) return; } - memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t)); + memset(&transfer_info, 0x00, sizeof(bt_share_transfer_info_t)); transfer_info.filename = g_strdup(file_name); transfer_info.size = size; transfer_info.percentage = progress; - event_info.event = BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS; + event_info.event = BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS; event_info.param_data = &transfer_info; event_info.result = result; event_info.user_data = data; _bt_share_ui_event_handler( - BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS, + BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS, &event_info, event_info.user_data); g_free(transfer_info.filename); } else if (strcasecmp(member, BT_TRANSFER_COMPLETED) == 0) { char *file_name = NULL; - char *address = NULL; - + char *device_addr = NULL; int request_id = 0; guint64 size = 0; - bt_opc_transfer_info_t transfer_info; + bt_share_transfer_info_t transfer_info; if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &result, - DBUS_TYPE_STRING, &address, + DBUS_TYPE_STRING, &device_addr, DBUS_TYPE_STRING, &file_name, DBUS_TYPE_UINT64, &size, DBUS_TYPE_INT32, &request_id, @@ -133,33 +181,58 @@ static void __handle_opp_client_signal(void *data, DBusMessage *msg) return; } - memset(&transfer_info, 0x00, sizeof(bt_opc_transfer_info_t)); + memset(&transfer_info, 0x00, sizeof(bt_share_transfer_info_t)); + transfer_info.device_addr = g_strdup(device_addr); transfer_info.filename = g_strdup(file_name); transfer_info.size = size; - event_info.event = BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE; + event_info.event = BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE; event_info.param_data = &transfer_info; event_info.result = result; event_info.user_data = data; _bt_share_ui_event_handler( - BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE, + BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE, &event_info, event_info.user_data); + g_free(transfer_info.device_addr); g_free(transfer_info.filename); + } else if (strcasecmp(member, BT_OPP_CLIENT_DISCONNECTED) == 0) { + DBG("BT_OPP_CLIENT_DISCONNECTED signal"); + char *device_addr = NULL; + int request_id = 0; + + if (!dbus_message_get_args(msg, NULL, + DBUS_TYPE_INT32, &result, + DBUS_TYPE_STRING, &device_addr, + DBUS_TYPE_INT32, &request_id, + DBUS_TYPE_INVALID)) { + ERR("Unexpected parameters in signal"); + return; + } + + event_info.event = BT_SHARE_UI_EVENT_OPC_DISCONNECTED; + event_info.param_data = device_addr; + event_info.result = result; + event_info.user_data = data; + + _bt_share_ui_event_handler( + BT_SHARE_UI_EVENT_OPC_DISCONNECTED, + &event_info, event_info.user_data); } } static void __handle_obex_server_signal(void *data, DBusMessage *msg) { - bluetooth_event_param_t event_info = { 0, }; - int result = BLUETOOTH_ERROR_NONE; + bt_share_event_param_t event_info = { 0, }; + int result = BT_SHARE_UI_ERROR_NONE; const char *member = dbus_message_get_member(msg); retm_if(data == NULL, "Invalid argument: data is NULL\n"); retm_if(msg == NULL, "Invalid argument: msg is NULL\n"); - + bt_share_appdata_t *ad = (bt_share_appdata_t *)data; + retm_if(ad->tr_type == BT_TR_OUTBOUND, "Invalid tr_type: BT_TR_OUTBOUND"); if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL) return; @@ -178,7 +251,7 @@ static void __handle_obex_server_signal(void *data, DBusMessage *msg) int transfer_id = 0; int server_type = 0; /* bt_server_type_t */ guint64 size = 0; - bt_obex_server_transfer_info_t transfer_info; + bt_share_server_transfer_info_t transfer_info; if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &result, @@ -195,7 +268,7 @@ static void __handle_obex_server_signal(void *data, DBusMessage *msg) } memset(&transfer_info, 0x00, - sizeof(bt_obex_server_transfer_info_t)); + sizeof(bt_share_server_transfer_info_t)); transfer_info.device_name = g_strdup(device_name); transfer_info.address = g_strdup(device_addr); @@ -205,13 +278,13 @@ static void __handle_obex_server_signal(void *data, DBusMessage *msg) transfer_info.transfer_id = transfer_id; transfer_info.percentage = 0; - event_info.event = BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED; + event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED; event_info.param_data = &transfer_info; event_info.result = result; event_info.user_data = data; _bt_share_ui_event_handler( - BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED, + BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED, &event_info, event_info.user_data); g_free(transfer_info.device_name); @@ -227,7 +300,7 @@ static void __handle_obex_server_signal(void *data, DBusMessage *msg) int progress = 0; int server_type = 0; /* bt_server_type_t */ guint64 size = 0; - bt_obex_server_transfer_info_t transfer_info; + bt_share_server_transfer_info_t transfer_info; if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &result, @@ -245,7 +318,7 @@ static void __handle_obex_server_signal(void *data, DBusMessage *msg) } memset(&transfer_info, 0x00, - sizeof(bt_obex_server_transfer_info_t)); + sizeof(bt_share_server_transfer_info_t)); transfer_info.device_name = g_strdup(device_name); transfer_info.address = g_strdup(device_addr); @@ -255,13 +328,13 @@ static void __handle_obex_server_signal(void *data, DBusMessage *msg) transfer_info.transfer_id = transfer_id; transfer_info.percentage = progress; - event_info.event = BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS; + event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS; event_info.param_data = &transfer_info; event_info.result = result; event_info.user_data = data; _bt_share_ui_event_handler( - BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS, + BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS, &event_info, event_info.user_data); g_free(transfer_info.device_name); @@ -277,7 +350,7 @@ static void __handle_obex_server_signal(void *data, DBusMessage *msg) int transfer_id = 0; int server_type = 0; /* bt_server_type_t */ guint64 size = 0; - bt_obex_server_transfer_info_t transfer_info; + bt_share_server_transfer_info_t transfer_info; if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &result, @@ -295,7 +368,7 @@ static void __handle_obex_server_signal(void *data, DBusMessage *msg) } memset(&transfer_info, 0x00, - sizeof(bt_obex_server_transfer_info_t)); + sizeof(bt_share_server_transfer_info_t)); transfer_info.filename = g_strdup(file_name); transfer_info.type = g_strdup(type); @@ -305,13 +378,13 @@ static void __handle_obex_server_signal(void *data, DBusMessage *msg) transfer_info.file_size = size; transfer_info.transfer_id = transfer_id; - event_info.event = BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED; + event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED; event_info.param_data = &transfer_info; event_info.result = result; event_info.user_data = data; _bt_share_ui_event_handler( - BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED, + BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED, &event_info, event_info.user_data); g_free(transfer_info.filename); @@ -344,6 +417,55 @@ static void __handle_update_view_signal(void *data, DBusMessage * msg) _bt_share_ui_handle_update_view(ad, db); } +static void __handle_opp_disconnect_signal(void *data, DBusMessage * msg) +{ + DBG("+"); + bt_share_event_param_t event_info = { 0, }; + bt_share_server_transfer_info_t transfer_info = { 0, }; + char *address = NULL; + char *member = NULL; + int result = BT_SHARE_UI_ERROR_NONE; + int transfer_id = -1; + + retm_if(data == NULL, "Invalid argument: data is NULL\n"); + retm_if(msg == NULL, "Invalid argument: msg is NULL\n"); + + member = (char *)dbus_message_get_member(msg); + retm_if(member == NULL, "Invalid argument: member is NULL\n"); + + if (strcasecmp(member, BT_OPP_CLIENT_DISCONNECTED) == 0) { + DBG("BT_OPP_CLIENT_DISCONNECTED"); + event_info.event = BT_SHARE_UI_EVENT_OPC_DISCONNECTED; + } else if (strcasecmp(member, BT_OPP_SERVER_DISCONNECTED) == 0) { + DBG("BT_OPP_SERVER_DISCONNECTED"); + event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED; + } else { + DBG("Unhandled Signal"); + return; + } + + if (!dbus_message_get_args(msg, NULL, + DBUS_TYPE_INT32, &result, + DBUS_TYPE_STRING, &address, + DBUS_TYPE_INT32, &transfer_id, + DBUS_TYPE_INVALID)) { + ERR("get_args failed"); + return; + } + + transfer_info.file_path = address; + transfer_info.transfer_id = transfer_id; + + event_info.result = result; + event_info.user_data = data; + event_info.param_data = &transfer_info; + + _bt_share_ui_event_handler(event_info.event, &event_info, + event_info.user_data); + + DBG("-"); +} + static void __handle_home_key_signal(void *data, DBusMessage *msg) { const char *member; @@ -363,46 +485,126 @@ static void __handle_home_key_signal(void *data, DBusMessage *msg) DBG("Received signal : %s", member); - if (strcasecmp(member, DBUS_CORE_APPS_MEMBER) == 0) { + if (strcasecmp(member, DBUS_CORE_APPS_MEMBER) == 0) _bt_terminate_app(); - } } static void __bt_add_tr_data_list(bt_share_appdata_t *ad, int transfer_type) { GSList *list = NULL; + GSList *next = NULL; sqlite3 *db = NULL; bt_tr_data_t *info = NULL; + bt_tr_data_t *tr_data = NULL; + int success = 0; + int failed = 0; int len = 0; int i; + retm_if(!ad, "ad is NULL!"); + + GSList *tr_data_list = ad->tr_data_list; + retm_if(!tr_data_list, "tr_data_list is NULL!"); + + Elm_Object_Item *git = elm_genlist_item_next_get(ad->file_title_item); db = bt_share_open_db(); if (!db) return; - list = bt_share_get_completed_tr_data_list(db, transfer_type); - if (list == NULL) { - bt_share_close_db(db); - return; - } + list = bt_share_get_all_tr_data_by_sid(db, transfer_type, + ad->transfer_info->device_address, ad->transfer_info->db_sid); bt_share_close_db(db); + retm_if(!list, "fail to get tr list!"); /* Append new tr data to tr_data_list */ len = g_slist_length(list); + next = list; for (i = 0; i < len; i++) { - info = list->data; + info = next->data; + + if (info == NULL) { + next = g_slist_next(next); + if (tr_data_list) + tr_data_list = g_slist_next(tr_data_list); + if (git) + git = elm_genlist_item_next_get(git); + + if (next == NULL) + break; + else + continue; + } + + if (info->tr_status == BT_TRANSFER_SUCCESS) + success++; + else if (info->tr_status == BT_TRANSFER_FAIL) + failed++; + + DBG_SECURE("ID :%d Status:%d Filename :%s", info->id, + info->tr_status, info->file_path); + + if (transfer_type == BT_TR_OUTBOUND && - info->id > ad->outbound_latest_id) - ad->tr_data_list = g_slist_append(ad->tr_data_list, info); - else if (transfer_type == BT_TR_INBOUND && - info->id > ad->inbound_latest_id) - ad->tr_data_list = g_slist_append(ad->tr_data_list, info); - - list = g_slist_next(list); - if (list == NULL) - return; + info->id > ad->outbound_latest_id) { + tr_data = g_new0(bt_tr_data_t, 1); + tr_data->id = info->id; + tr_data->sid = info->sid; + tr_data->tr_status = info->tr_status; + tr_data->file_path = g_strdup(info->file_path); + tr_data->dev_name = g_strdup(info->dev_name); + tr_data->timestamp = info->timestamp; + tr_data->addr = g_strdup(info->addr); + tr_data->type = g_strdup(info->type); + tr_data->content = g_strdup(info->content); + tr_data->size = info->size; + ad->tr_data_list = g_slist_append(ad->tr_data_list, tr_data); + } else if (transfer_type == BT_TR_INBOUND && + info->id > ad->inbound_latest_id) { + tr_data = g_new0(bt_tr_data_t, 1); + tr_data->id = info->id; + tr_data->sid = info->sid; + tr_data->tr_status = info->tr_status; + tr_data->file_path = g_strdup(info->file_path); + tr_data->dev_name = g_strdup(info->dev_name); + tr_data->timestamp = info->timestamp; + tr_data->addr = g_strdup(info->addr); + tr_data->type = g_strdup(info->type); + tr_data->content = g_strdup(info->content); + tr_data->size = info->size; + ad->tr_data_list = g_slist_append(ad->tr_data_list, tr_data); + } else { + // Update data in list + bt_tr_data_t *list_info = NULL; + list_info = tr_data_list->data; + if (list_info->id == info->id) { + list_info->timestamp = info->timestamp; + list_info->tr_status = info->tr_status; + list_info->size = info->size; + if (list_info->type == NULL) + list_info->type = g_strdup(info->type); + + if (list_info->tr_status == BT_TRANSFER_ONGOING) + ad->current_item = git; + } + } + + next = g_slist_next(next); + if (next == NULL) + break; + + if (tr_data_list) + tr_data_list = g_slist_next(tr_data_list); + if (git) + git = elm_genlist_item_next_get(git); } + ad->transfer_info->success = success; + ad->transfer_info->failed = failed; + DBG("SUCCESS:%d, FAILED:%d", success, failed); + if (ad->status_item) + elm_genlist_item_fields_update(ad->status_item, "*", + ELM_GENLIST_ITEM_FIELD_TEXT); + bt_share_release_tr_data_list(list); } @@ -421,7 +623,7 @@ void _bt_signal_init(bt_share_appdata_t *ad) NULL, BT_OPP_CLIENT_PATH, BT_EVENT_SERVICE, - BT_TRANSFER_CONNECTED, + BT_OPP_CONNECTED, __handle_opp_client_signal, ad); retm_if(sh == NULL, "Connect Event register failed\n"); ad->client_connected_sh = sh; @@ -430,6 +632,15 @@ void _bt_signal_init(bt_share_appdata_t *ad) NULL, BT_OPP_CLIENT_PATH, BT_EVENT_SERVICE, + BT_TRANSFER_STARTED, + __handle_opp_client_signal, ad); + retm_if(sh == NULL, "started Event register failed\n"); + ad->client_started_sh = sh; + + sh = e_dbus_signal_handler_add(conn, + NULL, + BT_OPP_CLIENT_PATH, + BT_EVENT_SERVICE, BT_TRANSFER_PROGRESS, __handle_opp_client_signal, ad); retm_if(sh == NULL, "progress Event register failed\n"); @@ -448,6 +659,15 @@ void _bt_signal_init(bt_share_appdata_t *ad) NULL, BT_OPP_SERVER_PATH, BT_EVENT_SERVICE, + BT_TRANSFER_STARTED, + __handle_obex_server_signal, ad); + retm_if(sh == NULL, "started Event register failed\n"); + ad->server_started_sh = sh; + + sh = e_dbus_signal_handler_add(conn, + NULL, + BT_OPP_SERVER_PATH, + BT_EVENT_SERVICE, BT_TRANSFER_PROGRESS, __handle_obex_server_signal, ad); retm_if(sh == NULL, "progress Event register failed\n"); @@ -473,6 +693,24 @@ void _bt_signal_init(bt_share_appdata_t *ad) ad->update_sh = sh; sh = e_dbus_signal_handler_add(conn, + NULL, + BT_SHARE_ENG_OBJECT, + BT_SHARE_ENG_INTERFACE, + BT_OPP_CLIENT_DISCONNECTED, + __handle_opp_disconnect_signal, ad); + retm_if(sh == NULL, "Disconnected Event register failed\n"); + ad->client_disconnected_sh = sh; + + sh = e_dbus_signal_handler_add(conn, + NULL, + BT_SHARE_ENG_OBJECT, + BT_SHARE_ENG_INTERFACE, + BT_OPP_SERVER_DISCONNECTED, + __handle_opp_disconnect_signal, ad); + retm_if(sh == NULL, "Disconnected Event register failed\n"); + ad->server_disconnected_sh = sh; + + sh = e_dbus_signal_handler_add(conn, NULL, DBUS_CORE_APPS_PATH, DBUS_CORE_APPS_INTERFACE, @@ -486,28 +724,64 @@ void _bt_signal_init(bt_share_appdata_t *ad) return; } - void _bt_signal_deinit(bt_share_appdata_t *ad) { ret_if(ad == NULL); - e_dbus_signal_handler_del(ad->dbus_conn, ad->client_connected_sh); - e_dbus_signal_handler_del(ad->dbus_conn, ad->client_progress_sh); - e_dbus_signal_handler_del(ad->dbus_conn, ad->client_completed_sh); - e_dbus_signal_handler_del(ad->dbus_conn, ad->server_progress_sh); - e_dbus_signal_handler_del(ad->dbus_conn, ad->server_completed_sh); - e_dbus_signal_handler_del(ad->dbus_conn, ad->update_sh); - e_dbus_signal_handler_del(ad->dbus_conn, ad->app_core_sh); + if (ad->client_connected_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->client_connected_sh); + ad->client_connected_sh = NULL; + } + if (ad->client_started_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->client_started_sh); + ad->client_started_sh = NULL; + } + if (ad->client_progress_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->client_progress_sh); + ad->client_progress_sh = NULL; + } + if (ad->client_completed_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->client_completed_sh); + ad->client_completed_sh = NULL; + } + if (ad->server_started_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->server_started_sh); + ad->server_started_sh = NULL; + } + if (ad->server_progress_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->server_progress_sh); + ad->server_progress_sh = NULL; + } + if (ad->server_completed_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->server_completed_sh); + ad->server_completed_sh = NULL; + } + if (ad->client_disconnected_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->client_disconnected_sh); + ad->client_disconnected_sh = NULL; + } + if (ad->server_disconnected_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->server_disconnected_sh); + ad->server_disconnected_sh = NULL; + } + if (ad->update_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->update_sh); + ad->update_sh = NULL; + } + if (ad->app_core_sh) { + e_dbus_signal_handler_del(ad->dbus_conn, ad->app_core_sh); + ad->app_core_sh = NULL; + } return; } int _bt_abort_signal_send(bt_share_appdata_t *ad, - bt_share_popup_data_t *pb_data) + bt_share_abort_data_t *abort_data) { DBG("+"); DBusMessage *msg = NULL; - retvm_if(pb_data == NULL, -1, + retvm_if(abort_data == NULL, -1, "progressbar data is NULL\n"); retvm_if(ad->dbus_conn == NULL, -1, "Invalid argument: ad->dbus_conn is NULL\n"); @@ -519,8 +793,8 @@ int _bt_abort_signal_send(bt_share_appdata_t *ad, retvm_if(msg == NULL, -1, "msg is NULL\n"); if (!dbus_message_append_args(msg, - DBUS_TYPE_STRING, &pb_data->transfer_type, - DBUS_TYPE_INT32, &pb_data->transfer_id, + DBUS_TYPE_STRING, &abort_data->transfer_type, + DBUS_TYPE_INT32, &abort_data->transfer_id, DBUS_TYPE_INVALID)) { ERR("Abort sending failed"); dbus_message_unref(msg); @@ -529,8 +803,8 @@ int _bt_abort_signal_send(bt_share_appdata_t *ad, ad->opp_transfer_abort = TRUE; /* Transfer aborted by user */ - INFO("pb_data->transfer_type = %s", pb_data->transfer_type); - INFO("pb_data->transfer_id = %d", pb_data->transfer_id); + INFO("abort_data->transfer_type = %s", abort_data->transfer_type); + INFO("abort_data->transfer_id = %d", abort_data->transfer_id); e_dbus_message_send(ad->dbus_conn, msg, NULL, -1, NULL); dbus_message_unref(msg); @@ -558,7 +832,7 @@ static void __bt_conv_addr_string_to_addr_type(char *addr, } } -int _bt_share_ui_ipc_retry_send(bt_share_appdata_t *ad, bt_tr_data_t *info) +int _bt_share_ui_retry_failed(bt_share_appdata_t *ad) { DBG("+"); DBusMessage *msg = NULL; @@ -566,58 +840,73 @@ int _bt_share_ui_ipc_retry_send(bt_share_appdata_t *ad, bt_tr_data_t *info) DBusMessageIter array_iter; DBusMessageIter file_iter; DBusMessageIter filepath_iter; - const char *bd_addr = NULL; - char **file_path; + char *bd_addr = NULL; + char **file_path = NULL; int i; + int count; + bt_tr_data_t *info = NULL; + int files_count; + int valid_files_count; + GSList *current = NULL; + GSList *failed = NULL; - retvm_if(info == NULL, -1, "Invalid argument: info is NULL\n"); + DBG_SECURE("Device:%s SID:%s", ad->transfer_info->device_address, + ad->transfer_info->db_sid); - retvm_if(ad->dbus_conn == NULL, -1, - "Invalid argument: ad->dbus_conn is NULL\n"); + failed = ad->tr_data_list; - bd_addr = (char *)calloc(sizeof(char), BT_ADDRESS_LENGTH_MAX); - if (bd_addr == NULL) { - return -1; - } + retvm_if(failed == NULL, -1, "Invalid argument: info is NULL\n"); - __bt_conv_addr_string_to_addr_type((char *)bd_addr, info->addr); - DBG("%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", - bd_addr[0], bd_addr[1], bd_addr[2], - bd_addr[3], bd_addr[4], bd_addr[5]); + retvm_if(ad->dbus_conn == NULL, -1, + "Invalid argument: ad->dbus_conn is NULL\n"); + files_count = g_slist_length(failed); msg = dbus_message_new_signal(BT_SHARE_ENG_OBJECT, BT_SHARE_UI_INTERFACE, BT_SHARE_UI_SIGNAL_SEND_FILE); + if (msg == NULL) { ERR("msg is NULL"); - free((void *)bd_addr); return -1; } - if (!g_utf8_validate(info->file_path, -1, NULL)) { - ERR("Invalid filepath"); - free((void *)bd_addr); + bd_addr = g_new0(char, BT_ADDRESS_LENGTH_MAX); + __bt_conv_addr_string_to_addr_type((char *)bd_addr, + ad->transfer_info->device_address); - _bt_create_info_popup(ad, BT_STR_INFORMATION, - BT_STR_UNABLE_TO_SEND); + file_path = g_new0(char *, files_count); + current = failed; + count = 0; + DBG("Total files: %d", files_count); - return -1; - } -/* file validation check begin*/ + while (current && (count < files_count)) { + info = current->data; - if (access(info->file_path, F_OK) != 0) { - ERR("access failed. May be file is deleted from the Device"); - free((void *)bd_addr); + if (info->tr_status != BT_TRANSFER_FAIL) { + current = g_slist_next(current); + continue; + } - _bt_create_info_popup(ad, BT_STR_INFORMATION, - BT_STR_FILE_NOT_EXIST); + /* check for valid utf8 file*/ + if (!g_utf8_validate(info->file_path, -1, NULL)) { + ERR_SECURE("Invalid filepath: %s", info->file_path); + notification_status_message_post(BT_STR_UNABLE_TO_SEND); + goto done; + } - return 0; - } -/* file validation check end*/ + /* file validation check begin*/ + if (access(info->file_path, F_OK) != 0) { + ERR_SECURE("access failed for %s. May be file is deleted from the Device", info->file_path); + notification_status_message_post(BT_STR_FILE_NOT_EXIST); + goto done; + } + /* file validation check end*/ + + file_path[count] = g_strdup(info->content); - file_path = g_new0(char *, 1); - file_path[0] = g_strdup(info->content); + current = g_slist_next(current); + count++; + } dbus_message_iter_init_append(msg, &iter); @@ -630,37 +919,48 @@ int _bt_share_ui_ipc_retry_send(bt_share_appdata_t *ad, bt_tr_data_t *info) } dbus_message_iter_close_container(&iter, &array_iter); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, - &info->dev_name); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, - &info->type); + if (info) { + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, + &info->dev_name); + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, + &info->type); + } dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING, &file_iter); - dbus_message_iter_open_container(&file_iter, DBUS_TYPE_ARRAY, - DBUS_TYPE_BYTE_AS_STRING, &filepath_iter); - - for (i = 0; i < strlen(file_path[0]); i++) { - dbus_message_iter_append_basic(&filepath_iter, - DBUS_TYPE_BYTE, &file_path[0][i]); + if (file_path) { + valid_files_count = count; + for (count = 0; count < valid_files_count; count++) { + int file_length; + dbus_message_iter_open_container(&file_iter, DBUS_TYPE_ARRAY, + DBUS_TYPE_BYTE_AS_STRING, &filepath_iter); + file_length = strlen(file_path[count]); + for (i = 0; i < file_length; i++) { + dbus_message_iter_append_basic(&filepath_iter, DBUS_TYPE_BYTE, + &file_path[count][i]); + } + dbus_message_iter_close_container(&file_iter, &filepath_iter); + } } - - dbus_message_iter_close_container(&file_iter, &filepath_iter); dbus_message_iter_close_container(&iter, &file_iter); e_dbus_message_send(ad->dbus_conn, msg, NULL, -1, NULL); + +done: dbus_message_unref(msg); - free((void *)bd_addr); - g_free(file_path[0]); - g_free(file_path); + g_free(bd_addr); + if (file_path) { + for (count = 0; count < files_count; count++) + g_free(file_path[count]); + g_free(file_path); + } DBG("-"); return 0; } - int _bt_share_ui_ipc_info_update(bt_share_appdata_t *ad, int uid) { DBG("+"); @@ -707,7 +1007,7 @@ void _bt_share_ui_handle_update_view(bt_share_appdata_t *ad, GSList *list_iter = NULL; bt_tr_data_t *info = NULL; int transfer_type; - + Elm_Object_Item *git; DBG("+"); if (g_strcmp0(table, BT_INBOUND_TABLE) == 0) @@ -724,22 +1024,37 @@ void _bt_share_ui_handle_update_view(bt_share_appdata_t *ad, if (transfer_type == BT_TR_INBOUND && ad->tr_type == BT_TR_INBOUND) { while (NULL != list_iter) { info = list_iter->data; - if (info->id > ad->inbound_latest_id) - _bt_prepend_genlist_tr_data_item + if (info->id > ad->inbound_latest_id) { + _bt_genlist_append_tr_data_item (ad, info, transfer_type); + } + list_iter = g_slist_next(list_iter); } } else if (transfer_type == BT_TR_OUTBOUND && ad->tr_type == BT_TR_OUTBOUND) { while (NULL != list_iter) { info = list_iter->data; - if (info->id > ad->outbound_latest_id) - _bt_prepend_genlist_tr_data_item + if (info->id > ad->outbound_latest_id) { + _bt_genlist_append_tr_data_item (ad, info, transfer_type); + } list_iter = g_slist_next(list_iter); } } + /* Update Finished and Processing Items */ + if (ad->current_item) { + _bt_share_genlist_item_content_update(ad->current_item, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_ICON); + _bt_share_genlist_item_text_update(ad->current_item, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_TEXT); + _bt_share_genlist_item_text_update(ad->current_item, BT_SHARE_ITEM_PART_FILE_SIZE); + + git = elm_genlist_item_prev_get(ad->current_item); + _bt_share_genlist_item_content_update(git, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_ICON); + _bt_share_genlist_item_text_update(git, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_TEXT); + _bt_share_genlist_item_text_update(git, BT_SHARE_ITEM_PART_FILE_SIZE); + } + evas_object_show(ad->tr_genlist); DBG("-"); } @@ -749,79 +1064,83 @@ static void __bt_share_ui_handle_progress(bt_share_appdata_t *ad, gboolean completed, int error_type) { - if (completed == FALSE) { - _bt_update_progress_popup(ad, transfer_id, name, percentage); - } else { - if (error_type == BLUETOOTH_ERROR_NONE) { - if (ad->progress_popup && - (ad->pb_transfer_id == transfer_id)) - _bt_destroy_progress_popup(ad); - } else { - DBG("Don,t terminate. Warning Popup will be shown."); - } - } + if (completed == FALSE) + _bt_update_progressbar(ad, transfer_id, name, percentage); } static void __bt_share_ui_handle_error(bt_share_appdata_t *ad, int error_type, bt_share_tr_type_e trans_type) { - DBG("Error type : %d", error_type); switch (error_type) { - case BLUETOOTH_ERROR_NOT_CONNECTED: - _bt_destroy_progress_popup(ad); - _bt_create_info_popup(ad, BT_STR_INFORMATION, - BT_STR_UNABLE_TO_SEND); + case BT_SHARE_UI_ERROR_NOT_CONNECTED: + _bt_create_info_popup(ad, BT_STR_UNABLE_TO_SEND); break; - case BLUETOOTH_ERROR_CANCEL: - _bt_destroy_progress_popup(ad); + case BT_SHARE_UI_ERROR_CANCEL: DBG("opp_transfer_abort by user:%d, trans_type = %d", ad->opp_transfer_abort, ad->tr_type); - if (ad->ft_type != BT_FT_RETRY_POPUP && - ad->ft_type != BT_FT_SENT_POPUP && - ad->ft_type != BT_FT_FILE_NOT_EXIST && - (trans_type == BT_TR_INBOUND) && + if ((trans_type == BT_TR_INBOUND) && !ad->opp_transfer_abort) - _bt_create_info_popup(ad, BT_STR_INFORMATION, - BT_STR_UNABLE_TO_RECEIVE); + _bt_create_info_popup(ad, BT_STR_UNABLE_TO_RECEIVE); else if (!ad->opp_transfer_abort && (trans_type == BT_TR_OUTBOUND)) - _bt_create_info_popup(ad, BT_STR_INFORMATION, - BT_STR_UNABLE_TO_SEND); + _bt_create_info_popup(ad, BT_STR_UNABLE_TO_SEND); ad->opp_transfer_abort = FALSE; break; - case BLUETOOTH_ERROR_CANCEL_BY_USER: - case BLUETOOTH_ERROR_ACCESS_DENIED: - case BLUETOOTH_ERROR_OUT_OF_MEMORY: - case BLUETOOTH_ERROR_INTERNAL: - _bt_destroy_progress_popup(ad); - break; default: break; } } -void _bt_share_ui_event_handler(int event, bluetooth_event_param_t *param, +void _bt_share_ui_event_handler(int event, bt_share_event_param_t *param, void *user_data){ - bt_obex_server_transfer_info_t *transfer_info; - bt_opc_transfer_info_t *client_info; + FN_START; + bt_share_server_transfer_info_t *transfer_info = NULL; + bt_share_transfer_info_t *client_info = NULL; char *name = NULL; int percentage = 0; bt_share_appdata_t *ad = (bt_share_appdata_t *)user_data; switch (event) { - case BLUETOOTH_EVENT_OPC_CONNECTED: - INFO("BLUETOOTH_EVENT_OPC_CONNECTED"); - if (param->result != BLUETOOTH_ERROR_NONE) { + case BT_SHARE_UI_EVENT_OPC_CONNECTED: + INFO("BT_SHARE_UI_EVENT_OPC_CONNECTED"); + if (param->result != BT_SHARE_UI_ERROR_NONE) { __bt_share_ui_handle_error(ad, param->result, BT_TR_OUTBOUND); _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE); } + + /* Set to false when new Outbound OPP session is started*/ + opc_launched_session = FALSE; + break; + + case BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED: + if (opc_launched_session == FALSE) { + /* Do not process events for new OPP Session */ + INFO("TRANSFER_STARTED: Different Obex Session"); + return; + } + + INFO("BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED"); + if (param->result == BT_SHARE_UI_ERROR_NONE) { + client_info = (bt_share_transfer_info_t *)param->param_data; + if (client_info) { + _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE); + _bt_share_ui_handle_transfer_started(ad, + client_info->device_addr, client_info->filename, + client_info->size, 0, BT_TR_OUTBOUND); + } + } break; - case BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS: - client_info = (bt_opc_transfer_info_t *)param->param_data; + case BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS: + if (opc_launched_session == FALSE) { + /* Do not process events for new OPP Session */ + return; + } + + client_info = (bt_share_transfer_info_t *)param->param_data; name = strrchr(client_info->filename, '/'); if (name) @@ -831,22 +1150,33 @@ void _bt_share_ui_event_handler(int event, bluetooth_event_param_t *param, percentage = client_info->percentage; __bt_share_ui_handle_progress(ad, 0, name, percentage, - FALSE, BLUETOOTH_ERROR_NONE); + FALSE, BT_SHARE_UI_ERROR_NONE); break; - case BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE: - INFO("BT_SHARE_EVENT_OPC_TRANSFER_COMPLETE "); - client_info = (bt_opc_transfer_info_t *)param->param_data; + case BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE: + if (opc_launched_session == FALSE) { + /* Do not process events for new OPP Session */ + INFO("TRANSFER_COMPLETE: Different Obex Session"); + return; + } + + INFO("BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE "); + client_info = (bt_share_transfer_info_t *)param->param_data; - if (param->result != BLUETOOTH_ERROR_NONE) { + if (g_strcmp0(ad->transfer_info->device_address, client_info->device_addr)) + return; + + if (param->result != BT_SHARE_UI_ERROR_NONE) { __bt_share_ui_handle_error(ad, param->result, BT_TR_OUTBOUND); - if (ad->tr_view) _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE); else if (ad->info_popup == NULL) _bt_terminate_app(); + _bt_share_ui_handle_transfer_complete(ad, client_info->device_addr, + BT_TR_OUTBOUND); + return; } @@ -868,49 +1198,128 @@ void _bt_share_ui_event_handler(int event, bluetooth_event_param_t *param, else _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE); + _bt_share_ui_handle_transfer_complete(ad, client_info->device_addr, + BT_TR_OUTBOUND); + + break; + case BT_SHARE_UI_EVENT_OPC_DISCONNECTED: { + GSList *failed = NULL; + sqlite3 *db = NULL; + + INFO("BT_SHARE_UI_EVENT_OPC_DISCONNECTED"); + + db = bt_share_open_db(); + retm_if(!db, "fail to open db!"); + + failed = bt_share_get_failed_tr_data_by_sid(db, + ad->tr_type, ad->transfer_info->device_address, + ad->transfer_info->db_sid); + bt_share_close_db(db); + + if (failed) { + /* Some failed items are there */ + elm_object_text_set(ad->toolbar_button, + BT_STR_RESEND_FAILED_FILES); + elm_object_disabled_set(ad->toolbar_button, FALSE); + /*free list*/ + bt_share_release_tr_data_list(failed); + } else + _bt_share_delete_toolbar_button(ad); + ad->launch_mode = BT_LAUNCH_TRANSFER_LIST; + + _bt_share_ui_handle_transfer_disconnected(ad, BT_TR_OUTBOUND); + _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE); + + elm_genlist_realized_items_update(ad->tr_genlist); + break; + } + case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED: + INFO("BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED"); + if (param->result == BT_SHARE_UI_ERROR_NONE) { + transfer_info = param->param_data; - case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS: - if (param->result == BLUETOOTH_ERROR_NONE) { + if (transfer_info->transfer_id != ad->transfer_info->transfer_id) { + /* Different session */ + INFO("TRANSFER_STARTED: Different Session"); + return; + } + + _bt_share_ui_handle_transfer_started(ad, transfer_info->address, + transfer_info->filename, transfer_info->file_size, transfer_info->transfer_id, + BT_TR_INBOUND); + } + break; + case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS: + if (param->result == BT_SHARE_UI_ERROR_NONE) { transfer_info = param->param_data; + + if (transfer_info->transfer_id != ad->transfer_info->transfer_id) { + /* Different session */ + return; + } __bt_share_ui_handle_progress(ad, transfer_info->transfer_id, transfer_info->filename, transfer_info->percentage, - FALSE, BLUETOOTH_ERROR_NONE); + FALSE, BT_SHARE_UI_ERROR_NONE); } break; - case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED: - INFO("BT_EVENT_OBEX_TRANSFER_COMPLETED "); + case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED: + INFO("BT_SHARE_UI_EVENT_OBEX_TRANSFER_COMPLETED "); - if (param->result != BLUETOOTH_ERROR_NONE) { + transfer_info = param->param_data; + if (g_strcmp0(ad->transfer_info->device_address, transfer_info->address)) + return; + + if (transfer_info->transfer_id != ad->transfer_info->transfer_id) { + /* Different session */ + INFO("TRANSFER_STARTED: Different Session"); + return; + } + + if (param->result != BT_SHARE_UI_ERROR_NONE) { __bt_share_ui_handle_error(ad, param->result, BT_TR_INBOUND); - if (ad->tr_view) _bt_share_ui_handle_update_view(ad, BT_INBOUND_TABLE); + _bt_share_ui_handle_transfer_complete(ad, transfer_info->address, + BT_TR_INBOUND); return; } - transfer_info = param->param_data; - - __bt_share_ui_handle_progress(ad, transfer_info->transfer_id, - transfer_info->filename, - transfer_info->percentage, TRUE, param->result); - if (ad->tr_view == NULL) _bt_terminate_app(); else _bt_share_ui_handle_update_view(ad, BT_INBOUND_TABLE); + _bt_share_ui_handle_transfer_complete(ad, transfer_info->address, + BT_TR_INBOUND); break; + case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED: { + DBG("BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED"); + transfer_info = param->param_data; + INFO("transfer_info->transfer_id: [%d]", transfer_info->transfer_id); + INFO("ad->transfer_info->transfer_id: [%d]", ad->transfer_info->transfer_id); + if (transfer_info->transfer_id == ad->transfer_info->transfer_id) { + DBG("Same session"); + _bt_share_delete_toolbar_button(ad); + _bt_share_ui_handle_transfer_disconnected(ad, BT_TR_INBOUND); + + _bt_share_ui_handle_update_view(ad, BT_INBOUND_TABLE); + elm_genlist_realized_items_update(ad->tr_genlist); + } + } + break; + default: DBG("Unhandled event %x", event); break; } + FN_END; } diff --git a/src/bt-share-ui-ipc.h b/src/bt-share-ui-ipc.h index 4552bea..7eedbd2 100644 --- a/src/bt-share-ui-ipc.h +++ b/src/bt-share-ui-ipc.h @@ -29,18 +29,14 @@ extern "C" { #endif #include "bluetooth-share-api.h" -#include #define BT_SHARE_UI_INTERFACE "User.BluetoothShare.UI" #define BT_SHARE_UI_SIGNAL_OPPABORT "opp_abort" -#define BT_SHARE_UI_SIGNAL_GET_TR_DATA "get_data" #define BT_SHARE_UI_SIGNAL_SEND_FILE "send_file" #define BT_SHARE_UI_SIGNAL_INFO_UPDATE "info_update" #define BT_SHARE_ENG_INTERFACE "User.BluetoothShare.Engine" #define BT_SHARE_ENG_OBJECT "/org/projectx/transfer_info" -#define BT_SHARE_ENG_SIGNAL_PROGRESS "transfer_progress" -#define BT_SHARE_ENG_SIGNAL_ERROR "error_type" #define BT_SHARE_ENG_SIGNAL_UPDATE_VIEW "update_view" #define BT_INBOUND_TABLE "inbound" #define BT_OUTBOUND_TABLE "outbound" @@ -49,37 +45,112 @@ extern "C" { #define BT_OPP_CLIENT_PATH "/org/projectx/bt/opp_client" #define BT_OPP_SERVER_PATH "/org/projectx/bt/opp_server" #define BT_OPP_CONNECTED "OppConnected" +#define BT_OPP_CLIENT_DISCONNECTED "ShareOppClientDisconnected" +#define BT_OPP_SERVER_DISCONNECTED "ShareOppServerDisconnected" #define BT_TRANSFER_STARTED "TransferStarted" #define BT_TRANSFER_PROGRESS "TransferProgress" #define BT_TRANSFER_COMPLETED "TransferCompleted" -#define BT_TRANSFER_CONNECTED "TransferConnected" +#define BT_SHARE_UI_EVENT_BASE ((int)(0x0000)) /**< No event */ +#define BT_SHARE_UI_EVENT_GAP_BASE ((int)(BT_SHARE_UI_EVENT_BASE + 0x0010)) + /**< Base ID for GAP Event */ +#define BT_SHARE_UI_EVENT_SDP_BASE ((int)(BT_SHARE_UI_EVENT_GAP_BASE + 0x0020)) + /**< Base ID for SDP events */ +#define BT_SHARE_UI_EVENT_RFCOMM_BASE ((int)(BT_SHARE_UI_EVENT_SDP_BASE + 0x0020)) + /**< Base ID for RFCOMM events */ +#define BT_SHARE_UI_EVENT_NETWORK_BASE ((int)(BT_SHARE_UI_EVENT_RFCOMM_BASE + 0x0020)) + /**< Base ID for NETWORK events */ +#define BT_SHARE_UI_EVENT_HDP_BASE ((int)(BT_SHARE_UI_EVENT_NETWORK_BASE + 0x0020)) + /**< Base ID for HDP events */ +#define BT_SHARE_UI_EVENT_OPC_BASE ((int)(BT_SHARE_UI_EVENT_HDP_BASE + 0x0020)) + /**< Base ID for OPC events */ +#define BT_SHARE_UI_EVENT_OBEX_SERVER_BASE ((int)(BT_SHARE_UI_EVENT_OPC_BASE + 0x0020)) + /**< Base ID for Obex Server events */ + +#define BT_SHARE_UI_ERROR_BASE ((int)0) /**< Error code base */ +#define BT_SHARE_UI_ERROR_NONE ((int)0) /**< No error #0 */ +#define BT_SHARE_UI_ERROR_CANCEL ((int)BT_SHARE_UI_ERROR_BASE - 0x01) +#define BT_SHARE_UI_ERROR_NOT_CONNECTED ((int)BT_SHARE_UI_ERROR_BASE - 0x15) +#define BT_SHARE_UI_ERROR_CANCEL_BY_USER ((int)BT_SHARE_UI_ERROR_BASE - 0x1b) + +/** + * Bluetooth share event type + */ +typedef enum { + BT_SHARE_UI_EVENT_OPC_CONNECTED = BT_SHARE_UI_EVENT_OPC_BASE, + /* OPC Connected event */ + BT_SHARE_UI_EVENT_OPC_DISCONNECTED, /* OPC Disonnected event */ + BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED, /* OPC Transfer started event */ + BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS, /* OPC Transfer progress event */ + BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE, /* OPC Transfer Complete event */ + + BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE = BT_SHARE_UI_EVENT_OBEX_SERVER_BASE, + /* Obex server authorize event*/ + BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED, /* Obex Server transfer started event*/ + BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,/* Obex Server transfer progress event*/ + BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,/* Obex Server transfer complete event*/ + BT_SHARE_UI_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE, + BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_CONNECTED, /* Obex Transfer connected event */ + BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED, /* Obex Transfer disconnected event */ +} bt_share_ui_event_type_t; + +/** + * Server type + */ typedef enum { - BT_TR_ONGOING = -1, - BT_TR_SUCCESS, - BT_TR_FAIL -} bt_app_tr_status_t; + OPP_SERVER = 0x0, + FTP_SERVER +} bt_share_server_type_t; +/** + * Stucture to hold event information + */ typedef struct { - int uid; - int tr_status; + int event; /**< event type */ + int result; /**< Success or error value */ + void *param_data; + /** #include +#include #include bt_share_appdata_t *app_state = NULL; @@ -58,165 +60,211 @@ static void __bt_lang_changed_cb(app_event_info_h event_info, void *data) bt_share_appdata_t *ad = (bt_share_appdata_t *)data; - if (ad->tr_genlist) { + if (ad->tr_genlist) elm_genlist_realized_items_update(ad->tr_genlist); - } - if (ad->navi_it) { - elm_object_item_text_set(ad->navi_it, - (ad->tr_type == BT_TR_INBOUND) ? - BT_STR_RECEIVED_FILES : - BT_STR_SENT_FILES); - Evas_Object *nocontents = elm_object_item_part_content_get( - ad->navi_it, - "elm.swallow.content"); - elm_object_part_text_set(nocontents, "elm.text", - BT_STR_NO_TRANSFER_HISTORY); - } + if (ad->toolbar_button) { + DBG("Changing language for toolbar_button: ad->launch_mode: %d", + ad->launch_mode); - if (ad->ft_popup) { - _bt_lang_changed_ft_popup(ad); + if ((ad->tr_type == BT_TR_INBOUND) || (ad->launch_mode == BT_LAUNCH_ONGOING)) + elm_object_text_set(ad->toolbar_button, BT_STR_STOP); + else + elm_object_text_set(ad->toolbar_button, BT_STR_RESEND_FAILED_FILES); } - if (ad->progress_popup) { - _bt_lang_changed_progress_popup(ad); - } } -static int __bt_parse_launch_mode(bt_share_appdata_t *ad, bundle *b) +static bt_share_launch_mode_t __bt_parse_launch_mode(bt_share_appdata_t *ad, bundle *b) { const char *launch_type = NULL; - + bt_share_launch_mode_t launch_mode = BT_LAUNCH_NONE; retvm_if(ad == NULL, -1, "Invalid param"); retvm_if(b == NULL, -1, "Invalid param"); launch_type = bundle_get_val(b, "launch-type"); retv_if(!launch_type, -1); - if (!strcasecmp(launch_type, "ongoing")) { - ad->launch_mode = BT_LAUNCH_ONGOING; - } else if (!strcasecmp(launch_type, "warning_popup")) { - ad->launch_mode = BT_LAUNCH_WARNING_POPUP; - } else if (!strcasecmp(launch_type, "transfer_list")) { - ad->launch_mode = BT_LAUNCH_TRANSFER_LIST; - } else { + if (!strcasecmp(launch_type, "ongoing")) + launch_mode = BT_LAUNCH_ONGOING; + else if (!strcasecmp(launch_type, "transfer_list")) + launch_mode = BT_LAUNCH_TRANSFER_LIST; + else ERR("Invalid bundle value"); - return -1; - } - return 0; + + return launch_mode; +} + +static void __bt_share_free_tr_data(bt_share_transfer_data_t *tr_data) +{ + FN_START; + ret_if(tr_data == NULL); + + g_free((char *) tr_data->device_name); + g_free((char *) tr_data->device_address); + g_free((char *) tr_data->transfer_type); + g_free((char *) tr_data->db_sid); + g_free((char *) tr_data->filename); + g_free(tr_data); + FN_END; } -static int __bt_share_launch_handler(bt_share_appdata_t *ad, bundle *b) +static int __bt_share_launch_handler(bt_share_appdata_t *ad, bundle *b, + bt_share_launch_mode_t launch_mode) { - INFO("+"); - bt_share_popup_data_t *pb_data = NULL; - const char *str = NULL; + FN_START; const char *transfer_type = NULL; const char *temp = NULL; + unsigned char tranferred; int tr_type = 0; sqlite3 *db = NULL; - bt_adapter_state_e bt_state = BT_ADAPTER_DISABLED; retvm_if(ad == NULL, -1, "Invalid param"); retvm_if(b == NULL, -1, "Invalid param"); - if (ad->launch_mode == BT_LAUNCH_ONGOING) { - INFO("BT_LAUNCH_ONGOING"); - - /*Check adapter state, if disabled then return */ - if (bt_adapter_get_state(&bt_state) == BT_ERROR_NONE) { - if (bt_state == BT_ADAPTER_DISABLED) { - DBG("Adapter disabled, returning"); - return 0; - } - } else - ERR("bt_adapter_get_state() failed"); - + if (launch_mode == BT_LAUNCH_TRANSFER_LIST || + launch_mode == BT_LAUNCH_ONGOING) { + INFO("%s", launch_mode == BT_LAUNCH_TRANSFER_LIST ? + "BT_LAUNCH_TRANSFER_LIST" : "BT_LAUNCH_ONGOING"); + bt_share_transfer_data_t *transfer_data = NULL; - - if (ad->tr_view == NULL) { - Evas_Object *e = NULL; - Ecore_Evas *ee = NULL; - e = evas_object_evas_get(ad->win); - ee = ecore_evas_ecore_evas_get(e); - ecore_evas_name_class_set(ee,"APP_POPUP","APP_POPUP"); - } - - pb_data = g_new0(bt_share_popup_data_t, 1); - pb_data->filename = g_strdup(bundle_get_val(b, "filename")); - pb_data->percentage = g_strdup(bundle_get_val(b, "percentage")); - pb_data->transfer_type = g_strdup( - bundle_get_val(b, "transfer_type")); - temp = bundle_get_val(b, "transfer_id"); - if (temp != NULL) - pb_data->transfer_id = atoi(temp); - if (g_strcmp0(pb_data->transfer_type, "outbound") == 0) { - pb_data->progress_cnt = g_strdup(bundle_get_val(b, "progress_cnt")); - INFO("progress cnt : %s", pb_data->progress_cnt); - ad->ft_type = BT_FT_SENT_POPUP; - } - - INFO_SECURE("filename %s", pb_data->filename); - INFO("percentage %s", pb_data->percentage); - INFO("transfer_type %s", pb_data->transfer_type); - INFO("transfer_id %d", pb_data->transfer_id); - /* Notificaton id of ongoing item */ - if (ad->progress_popup) - _bt_destroy_progress_popup(ad); - ad->progress_popup = _bt_create_progress_popup(pb_data); - retvm_if (ad->progress_popup == NULL, -1, "fail to create progress popup"); - - evas_object_data_set(ad->progress_popup, "progressbar_data", pb_data); - } else if (ad->launch_mode == BT_LAUNCH_WARNING_POPUP) { - INFO("BT_LAUNCH_WARNING_POPUP"); - if (ad->progress_popup) - _bt_destroy_progress_popup(ad); - str = bundle_get_val(b, "message"); - _bt_create_extinctive_info_popup(ad, BT_STR_INFORMATION, str); - } else if (ad->launch_mode == BT_LAUNCH_TRANSFER_LIST) { - INFO("BT_LAUNCH_TRANSFER_LIST"); elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW); elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE); - if (ad->progress_popup) - _bt_destroy_progress_popup(ad); transfer_type = bundle_get_val(b, "transfer_type"); - retvm_if (!transfer_type, -1, "Invalid transfer type!"); + retvm_if(!transfer_type, -1, "Invalid transfer type!"); if (!strcmp(transfer_type, "outbound")) tr_type = BT_TR_OUTBOUND; else tr_type = BT_TR_INBOUND; - retvm_if(ad->tr_view && ad->tr_type == tr_type, 0, - "same view. no need to create transfer view!"); + /* Open the DB */ + db = bt_share_open_db(); + retvm_if(!db, -1, "fail to open db!"); + + /* Create Transfer Data */ + transfer_data = g_new0(bt_share_transfer_data_t, 1); + transfer_data->device_name = g_strdup(bundle_get_val(b, "device_name")); + transfer_data->device_address = g_strdup(bundle_get_val(b, "device_addr")); + transfer_data->transfer_type = g_strdup(bundle_get_val(b, "transfer_type")); + transfer_data->db_sid = g_strdup(bundle_get_val(b, "db_sid")); + + INFO("Create Transfer data - Name: %s, Address :%s, type: %s, SID: %s", + transfer_data->device_name, transfer_data->device_address, + transfer_data->transfer_type, transfer_data->db_sid); + + if (launch_mode == BT_LAUNCH_TRANSFER_LIST) { + temp = bundle_get_val(b, "transfer_id"); + if (temp != NULL) { + transfer_data->transfer_id = atoi(temp); + INFO_SECURE("Transfer ID: %d", transfer_data->transfer_id); + + if (tr_type == BT_TR_INBOUND) { + int noti_id; + DBG("INBOUND TRANSFER"); + + /* Check if noti_id is updated or not. If noti_id is not updated it means + * it's an ongoing transfer. If its an ongoing transfer then redirect it to + * progress view, otherwise just launch the transfer list. + */ + noti_id = bt_share_get_noti_id(db, BT_DB_INBOUND, transfer_data->db_sid); + + DBG("noti_id: [%d]", noti_id); + /* Get transfer progress only if its an ongoing transfer. */ + if (!noti_id && bt_opp_get_transfer_progress(BT_TRANSFER_INBOUND, + transfer_data->transfer_id, &tranferred) == 0) { + DBG("INBOUND ONGOING TRANSFER"); + launch_mode = BT_LAUNCH_ONGOING; + transfer_data->percentage = tranferred; + + transfer_data->filename = g_strdup(bundle_get_val(b, "filename")); + INFO_SECURE("File Name: %s", transfer_data->filename); + } + } + } + _bt_set_opc_launched_session(FALSE); + } else { + /* Create Progress Data */ + transfer_data->filename = g_strdup(bundle_get_val(b, "filename")); + INFO_SECURE("Create Progress Data : File Name: %s", transfer_data->filename); + temp = bundle_get_val(b, "size"); + if (temp != NULL) + transfer_data->size = atol(temp); + temp = bundle_get_val(b, "transfer_id"); + if (temp != NULL) { + transfer_data->transfer_id = atoi(temp); + INFO_SECURE("Transfer ID: %d", transfer_data->transfer_id); + } + + temp = bundle_get_val(b, "progress_cnt"); + if (temp != NULL) { + int current, total; + INFO("PROGRESS TEXT: %s", temp); + sscanf(temp, "[%d/%d]", ¤t, &total); + transfer_data->current_file = current; + transfer_data->total_files = total; + } + INFO("File Progress: [%d/%d]", transfer_data->current_file, + transfer_data->total_files); + + if (tr_type == BT_TR_OUTBOUND) { + bt_opp_get_transfer_progress(BT_TRANSFER_OUTBOUND, + -1, &tranferred); + _bt_set_opc_launched_session(TRUE); + } else { + bt_opp_get_transfer_progress(BT_TRANSFER_INBOUND, + transfer_data->transfer_id, &tranferred); + } + transfer_data->percentage = tranferred; + } + + if (ad->tr_view && ad->tr_type == tr_type && ad->launch_mode == launch_mode && + g_strcmp0(ad->db_sid, transfer_data->db_sid) == 0) { + ERR("Same view. no need to create transfer view!"); + + /* Show the TOP of List */ + elm_genlist_item_show(ad->device_item, ELM_GENLIST_ITEM_SCROLLTO_TOP); + __bt_share_free_tr_data(transfer_data); + bt_share_close_db(db); + return 0; + } + + __bt_share_free_tr_data(ad->transfer_info); + ad->transfer_info = transfer_data; + transfer_data->success = 0; + transfer_data->failed = 0; + ad->launch_mode = launch_mode; - INFO("Transfer type : %s", transfer_type); ad->tr_type = tr_type; /* Get data from share DB */ - db = bt_share_open_db(); - retvm_if(!db, -1, "fail to open db!"); + if (ad->db_sid) { + g_free(ad->db_sid); + ad->db_sid = NULL; + } + ad->db_sid = g_strdup(transfer_data->db_sid); + INFO_SECURE("Device Address: %s", transfer_data->device_address); + ad->tr_data_list = bt_share_get_all_tr_data_by_sid(db, + ad->tr_type, transfer_data->device_address, + transfer_data->db_sid); - ad->tr_data_list = bt_share_get_completed_tr_data_list(db, ad->tr_type); bt_share_close_db(db); - if (ad->tr_data_list) - _bt_create_transfer_view(ad); - else - _bt_nocontent_set(ad, TRUE); + _bt_create_transfer_view(ad); } else { ERR("Invalid bundle value"); return -1; } + FN_END; return 0; } static bool __app_create(void *data) { - INFO(" __app_create"); + FN_START; bt_share_appdata_t *ad = data; Evas_Object *win = NULL; int ret; @@ -236,6 +284,7 @@ static bool __app_create(void *data) if (bt_adapter_get_state(&status) != BT_ERROR_NONE) ERR("bt_adapter_get_state() failed!"); + DBG("bt_status : %d", status); ad->bt_status = status; @@ -244,6 +293,7 @@ static bool __app_create(void *data) bt_adapter_set_state_changed_cb(_bt_cb_state_changed, (void *)ad); if (ret != BT_ERROR_NONE) ERR("bt_adapter_set_state_changed_cb failed"); + FN_END; return true; } @@ -253,58 +303,25 @@ static void __app_service(app_control_h app_control, void *user_data) bt_share_appdata_t *ad = user_data; int ret; bundle *b = NULL; + bt_share_launch_mode_t launch_mode; ret_if(ad == NULL); ret = app_control_export_as_bundle(app_control, &b); - if (ad->dbus_conn == NULL) { + if (ad->dbus_conn == NULL) _bt_signal_init(ad); - } - if(__bt_parse_launch_mode(ad, b) == -1) { + launch_mode = __bt_parse_launch_mode(ad, b); + if (launch_mode == BT_LAUNCH_NONE) { if (b) bundle_free(b); return; } - if (ad->launch_mode == BT_LAUNCH_ONGOING || - ad->launch_mode == BT_LAUNCH_WARNING_POPUP) { - if (ad->tr_view == NULL) { - if (elm_win_alpha_get(ad->win) == FALSE) { - elm_win_alpha_set(ad->win, TRUE); - int ret = 0; -#if 0 - Display *dpy; - Window win; - - dpy = ecore_x_display_get(); - win = elm_win_xwindow_get(ad->win); - - ret = utilx_set_window_opaque_state(dpy, - win, UTILX_OPAQUE_STATE_ON); -#endif - - if (!ret) - { - ERR("Error! Failed to set opaque state."); - } - } - } - } else if (elm_win_alpha_get(ad->win)) - elm_win_alpha_set(ad->win, FALSE); - - - /* Set rotation Callback */ - if (elm_win_wm_rotation_supported_get(ad->win)) { - int rots[4] = { 0, 90, 180, 270 }; - elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4); - } - - ret = __bt_share_launch_handler(ad, b); + ret = __bt_share_launch_handler(ad, b, launch_mode); if (ret < 0) _bt_terminate_app(); - evas_object_show(ad->win); elm_win_activate(ad->win); bundle_free(b); @@ -312,21 +329,46 @@ static void __app_service(app_control_h app_control, void *user_data) static void __app_terminate(void *data) { - INFO("__app_terminate "); + FN_START; bt_share_appdata_t *ad = data; int err; _bt_destroy_info_popup(ad); _bt_signal_deinit(ad); + if (ad->tr_device_itc) { + elm_genlist_item_class_free(ad->tr_device_itc); + ad->tr_device_itc = NULL; + } + if (ad->tr_status_itc) { + elm_genlist_item_class_free(ad->tr_status_itc); + ad->tr_status_itc = NULL; + } + if (ad->tr_progress_itc) { + elm_genlist_item_class_free(ad->tr_progress_itc); + ad->tr_progress_itc = NULL; + } + if (ad->tr_file_title_itc) { + elm_genlist_item_class_free(ad->tr_file_title_itc); + ad->tr_file_title_itc = NULL; + } if (ad->tr_data_itc) { elm_genlist_item_class_free(ad->tr_data_itc); ad->tr_data_itc = NULL; } + if (ad->transfer_info) { + __bt_share_free_tr_data(ad->transfer_info); + ad->transfer_info = NULL; + } - if (ad->win) - evas_object_del(ad->win); - + if (ad->idler) { + ecore_idler_del(ad->idler); + ad->idler = NULL; + } + if (ad->db_sid) { + g_free(ad->db_sid); + ad->db_sid = NULL; + } err = bt_adapter_unset_state_changed_cb(); if (err != BT_ERROR_NONE) ERR("unset of state change cb failed: %d", err); @@ -334,8 +376,7 @@ static void __app_terminate(void *data) err = bt_deinitialize(); if (err != BT_ERROR_NONE) ERR("bt_deinitialize failed: %d", err); - - + FN_END; } static void __app_pause(void *data) @@ -366,9 +407,8 @@ EXPORT int main(int argc, char *argv[]) DBG("ui_app_main() is called."); int ret = ui_app_main(argc, argv, &callback, &app_data); - if (ret != APP_ERROR_NONE) { + if (ret != APP_ERROR_NONE) ERR("ui_app_main() is failed. err = %d", ret); - } DBG("End bluetooth-share-ui main()"); return ret; diff --git a/src/bt-share-ui-main.h b/src/bt-share-ui-main.h old mode 100755 new mode 100644 index 5a54113..cd0881f --- a/src/bt-share-ui-main.h +++ b/src/bt-share-ui-main.h @@ -46,7 +46,7 @@ extern "C" { #define EDJDIR "/usr/apps/org.tizen.bluetooth-share-ui/res/edje" #define EDJFILE EDJDIR"/bt-share-layout.edj" #define EDJ_IMAGES EDJDIR "/images.edj" - +#define EDJ_BT_ICON_ANIMATION EDJDIR "/bt_share_icon_animation.edj" #endif @@ -55,86 +55,108 @@ typedef enum { BT_TR_INBOUND } bt_share_tr_type_e; -typedef enum { - CSC_DCM, - CSC_FTM, -} bt_share_csc_type_t; - -typedef enum { - BT_FT_RECV_FAIL_POPUP, - BT_FT_RECV_SUCCESS_POPUP, - BT_FT_SENT_POPUP, - BT_FT_RETRY_POPUP, - BT_FT_FILE_NOT_EXIST -} bt_share_ft_popup_type_e; +typedef struct { + const char *transfer_type; + int transfer_id; +} bt_share_abort_data_t; typedef struct { - const char *filename; - const char *percentage; + /* common fields */ + const char *device_name; + const char *device_address; const char *transfer_type; - const char *progress_cnt; + const char *db_sid; + /* Progress specific */ + const char *filename; + char percentage; + int current_file; + int total_files; + unsigned long size; int transfer_id; -} bt_share_popup_data_t; + /* Transfer specific */ + int success; + int failed; +} bt_share_transfer_data_t; typedef struct { bt_tr_data_t *tr_data; gboolean highlighted; + gboolean tr_inbound; } bt_gl_data_t; typedef enum { - BT_LAUNCH_ONGOING = 0x00, - BT_LAUNCH_WARNING_POPUP = 0x01, - BT_LAUNCH_TRANSFER_LIST = 0x02, + BT_LAUNCH_NONE = -1, + BT_LAUNCH_ONGOING, + BT_LAUNCH_TRANSFER_LIST } bt_share_launch_mode_t; typedef struct { bt_share_launch_mode_t launch_mode; bt_adapter_state_e bt_status; Evas_Object *win; + Eina_List *table; Evas_Object *bg; Evas_Object *conform; Evas_Object *tr_view; Evas_Object *navi_fr; Elm_Object_Item *navi_it; - Evas_Object *toolbar_btn; + Evas_Object *toolbar_button; + Evas_Object *toolbar_ly; + + /* Transfer Information */ + bt_share_transfer_data_t *transfer_info; - /* Progress Popup */ Evas_Object *progress_layout; - Evas_Object *progress_popup; - Evas_Object *pb; - int pb_transfer_id; - bt_share_popup_data_t *progress_data; + Evas_Object *progressbar; + Elm_Object_Item *device_item; + Elm_Object_Item *progress_item; + Elm_Object_Item *status_item; + Elm_Object_Item *file_title_item; + Elm_Object_Item *current_item; - /* File transfer status popup*/ - Evas_Object *ft_popup; - bt_share_ft_popup_type_e ft_type; - bt_tr_data_t *ft_info; + /* Turning on popup */ + Evas_Object *turning_on_popup; /* Information Popup */ Evas_Object *info_popup; /* Transfer data list*/ Evas_Object *tr_genlist; + Elm_Genlist_Item_Class *tr_device_itc; + Elm_Genlist_Item_Class *tr_status_itc; + Elm_Genlist_Item_Class *tr_progress_itc; + Elm_Genlist_Item_Class *tr_file_title_itc; Elm_Genlist_Item_Class *tr_data_itc; - Elm_Object_Item *selected_item; + GSList *tr_data_list; - /* Timer Handler */ - int timer; + /* Idler */ + Ecore_Idler *idler; E_DBus_Connection *dbus_conn; + /* Events from Service for OPP Client*/ E_DBus_Signal_Handler *client_connected_sh; + E_DBus_Signal_Handler *client_started_sh; E_DBus_Signal_Handler *client_progress_sh; E_DBus_Signal_Handler *client_completed_sh; + /* Events from Service for OPP Server*/ + E_DBus_Signal_Handler *server_started_sh; E_DBus_Signal_Handler *server_progress_sh; E_DBus_Signal_Handler *server_completed_sh; + /* Events from Bluetooth-Share*/ E_DBus_Signal_Handler *update_sh; + E_DBus_Signal_Handler *client_disconnected_sh; + E_DBus_Signal_Handler *server_disconnected_sh; + /* Events from Appcore*/ E_DBus_Signal_Handler *app_core_sh; bt_share_tr_type_e tr_type; + char *db_sid; + int inbound_latest_id; int outbound_latest_id; bool opp_transfer_abort; + bool send_after_turning_on; } bt_share_appdata_t; #ifdef __cplusplus diff --git a/src/bt-share-ui-popup.c b/src/bt-share-ui-popup.c old mode 100755 new mode 100644 index 8d5db96..24516c3 --- a/src/bt-share-ui-popup.c +++ b/src/bt-share-ui-popup.c @@ -35,7 +35,6 @@ #include #include #include -#include #include "applog.h" #include "bt-share-ui-view.h" @@ -45,685 +44,30 @@ #include "bt-share-ui-widget.h" #include "bt-share-ui-main.h" -#define NEW_LINE "\n" - extern bt_share_appdata_t *app_state; - -static void __bt_destroy_ft_popup(bt_share_appdata_t *ad) -{ - DBG(""); - ret_if(ad == NULL); - - if (ad->ft_popup) { - DBG("delete ft_popup"); - evas_object_del(ad->ft_popup); - ad->ft_popup = NULL; - } - - return; -} - -static void __bt_ft_retry_ok_cb(void *data, Evas_Object *obj, void *event_info) -{ - DBG("+"); - - ret_if(data == NULL); - bt_share_appdata_t *ad = app_state; - bt_tr_data_t *info = (bt_tr_data_t *)data; - - __bt_destroy_ft_popup(ad); - - if (ad->bt_status == BT_ADAPTER_ENABLED) { - if (!_bt_share_ui_ipc_retry_send(ad, info)) { - INFO(" info->id %d", info->id); - _bt_share_ui_ipc_info_update(ad, info->id); - _bt_delete_selected_item(ad); - } - } - - DBG("-"); - return; -} - -static void __bt_ft_retry_cancel_cb(void *data, Evas_Object *obj, void *event_info) -{ - DBG("+"); - - ret_if(data == NULL); - bt_share_appdata_t *ad = app_state; - - __bt_destroy_ft_popup(ad); - - DBG("-"); - return; -} - -static void __bt_ft_retry_mouseup_cb(void *data, - Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Mouse_Up *ev = event_info; - bt_share_appdata_t *ad = app_state; - bt_tr_data_t *info = (bt_tr_data_t *)data; - - DBG("Mouse event callback function is called +"); - if (ev->button == 3) { - __bt_destroy_ft_popup(ad); - _bt_share_ui_ipc_info_update(ad, info->id); - } - - DBG("Mouse event callback -"); -} - -static void __bt_ft_ok_popup_cb(void *data, Evas_Object *obj, - void *event_info) -{ - DBG(" +"); - ret_if(data == NULL); - ret_if(!obj); - bt_share_appdata_t *ad = app_state; - bt_tr_data_t *info = (bt_tr_data_t *)data; - - const char *text = elm_object_text_get(obj); - - if (!g_strcmp0(text, BT_STR_RETRY)) { - __bt_ft_retry_ok_cb(data, obj, event_info); - return; - } - - __bt_destroy_ft_popup(ad); - - if (ad->bt_status == BT_ADAPTER_DISABLED) - _bt_update_tr_notification(info); - else /*Adapter enabled case */ - _bt_share_ui_ipc_info_update(ad, info->id); - - _bt_delete_selected_item(ad); - - DBG("-"); - return; -} - -static void __bt_ft_ok_mouseup_cb(void *data, - Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Mouse_Up *ev = event_info; - bt_share_appdata_t *ad = app_state; - bt_tr_data_t *info = (bt_tr_data_t *)data; - - DBG("Mouse event callback function is called +"); - - if (ev->button == 3) { - __bt_destroy_ft_popup(ad); - _bt_share_ui_ipc_info_update(ad, info->id); - _bt_delete_selected_item(ad); - } - DBG("Mouse event callback -"); -} - -static Evas_Object *__bt_create_popup_layout(Evas_Object *parent, bt_share_appdata_t *ad) -{ - Evas_Object *layout = NULL; - - layout = elm_layout_add(parent); - elm_layout_file_set(layout, EDJFILE, "ft_popup"); - evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - ad->progress_layout = layout; - return layout; -} - -static Evas_Object *__bt_create_progressbar(Evas_Object *parent, bt_share_appdata_t *ad) -{ - Evas_Object *progressbar = NULL; - progressbar = elm_progressbar_add(parent); - elm_object_style_set(progressbar, "list_progress"); - elm_progressbar_horizontal_set(progressbar, EINA_TRUE); - evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5); - evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_object_signal_emit(progressbar, "elm,units,show", "elm"); - elm_progressbar_value_set(progressbar, 0.0); - evas_object_show(progressbar); - return progressbar; -} - -static Evas_Object *__bt_create_popup_pb_layout(Evas_Object *parent, bt_share_appdata_t *ad) -{ - Evas_Object *layout = NULL; - - layout = elm_layout_add(parent); - elm_layout_file_set(layout, EDJFILE, "popup_2text_progressbar_view_layout"); - evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - ad->progress_layout = layout; - return layout; -} - -Evas_Object *_bt_create_ft_popup(bt_share_ft_popup_type_e type, bt_tr_data_t *info) -{ - DBG(" +"); - bt_share_appdata_t *ad = app_state; - Evas_Object *popup = NULL; - char msg[BT_GLOBALIZATION_STR_LENGTH] = { 0 }; - char tmp[BT_GLOBALIZATION_STR_LENGTH] = { 0 }; - char *name = NULL; - char *markup_text = NULL; - char *stms_str = NULL; - - if (info->file_path == NULL) { - ERR("Invalid data"); - return NULL; - } - - popup = elm_popup_add(ad->win); - evas_object_size_hint_weight_set(popup, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - - INFO("Popup type : %d", type); - ad->ft_type = type; - ad->ft_info = info; - - if (type == BT_FT_SENT_POPUP) { - DBG("BT_FT_SENT_POPUP"); - elm_object_part_text_set(popup, "title,text", BT_STR_SENT_FILES); - char file_size_str[BT_FILE_SIZE_STR] = { 0 }; - - stms_str = BT_STR_TO_S; - snprintf(msg, sizeof(msg), stms_str, info->dev_name); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - name = strrchr(info->file_path, '/'); - if (name != NULL) - name++; - else - name = info->file_path; - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, name); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - /* file size */ - if (info->size < 1024) - snprintf(file_size_str, sizeof(file_size_str), - "%dB", info->size); - else if (info->size > 1024 * 1024) - snprintf(file_size_str, sizeof(file_size_str), - "%dMB", info->size / (1024 * 1024)); - else - snprintf(file_size_str, sizeof(file_size_str), - "%dKB", info->size / 1024); - - stms_str = BT_STR_FILE_SIZE_S; - snprintf(tmp, sizeof(tmp), stms_str, file_size_str); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(popup, markup_text); - } else if (type == BT_FT_RECV_SUCCESS_POPUP) { - DBG("BT_FT_RECV_SUCCESS_POPUP"); - elm_object_part_text_set(popup, "title,text", BT_STR_RECEIVED_FILES); - char file_size_str[BT_FILE_SIZE_STR] = { 0 }; - - stms_str = BT_STR_FROM_S; - snprintf(msg, sizeof(msg), stms_str, info->dev_name); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - name = strrchr(info->file_path, '/'); - if (name != NULL) - name++; - else - name = info->file_path; - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, name); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - /* file size */ - if (info->size < 1024) - snprintf(file_size_str, sizeof(file_size_str), - "%dB", info->size); - else if (info->size > 1024 * 1024) - snprintf(file_size_str, sizeof(file_size_str), - "%dMB", info->size / (1024 * 1024)); - else - snprintf(file_size_str, sizeof(file_size_str), - "%dKB", info->size / 1024); - - stms_str = BT_STR_FILE_SIZE_S; - snprintf(tmp, sizeof(tmp), stms_str, file_size_str); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(popup, markup_text); - } else if (type == BT_FT_RECV_FAIL_POPUP) { - DBG("BT_FT_RECV_FAIL_POPUP"); - elm_object_part_text_set(popup, "title,text", BT_STR_UNABLE_TO_RECEIVED_FILES); - - g_strlcat(msg, BT_STR_FILE_NOT_RECV, BT_GLOBALIZATION_STR_LENGTH); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, info->file_path); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(popup, markup_text); - } else if (type == BT_FT_FILE_NOT_EXIST) { - elm_object_part_text_set(popup, "title,text", BT_STR_RECEIVED_FILES); - __bt_create_popup_layout(popup, ad); - - g_strlcat(msg, BT_STR_FILE_NOT_EXIST, BT_GLOBALIZATION_STR_LENGTH); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, info->file_path); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(popup, markup_text); - } else if (type == BT_FT_RETRY_POPUP) { - elm_object_part_text_set(popup, "title,text", BT_STR_UNABLE_TO_SEND_FILES); - - stms_str = BT_STR_SEND_FAIL_TO_S; - snprintf(msg, sizeof(msg), stms_str, info->dev_name); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - name = strrchr(info->file_path, '/'); - if (name != NULL) - name++; - else - name = info->file_path; - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, name); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(popup, markup_text); - } - - evas_object_show(popup); - - if (type == BT_FT_RETRY_POPUP) { - if (ad->bt_status == BT_ADAPTER_DISABLED || - access(info->file_path, F_OK) != 0) { - _bt_create_button(popup, "popup", "button1", - BT_STR_OK, NULL, __bt_ft_ok_popup_cb, info); - } else { - _bt_create_button(popup, "popup", "button1", - BT_STR_RETRY, NULL, __bt_ft_retry_ok_cb, info); - } - eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, - __bt_ft_retry_cancel_cb, info); - evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP, - __bt_ft_retry_mouseup_cb, info); - } else { - _bt_create_button(popup, "popup", "button1", - BT_STR_OK, NULL, __bt_ft_ok_popup_cb, info); - eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, - __bt_ft_ok_popup_cb, info); - evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP, - __bt_ft_ok_mouseup_cb, info); - } - - if(markup_text) - free(markup_text); - - DBG("-"); - return popup; -} - -void _bt_lang_changed_ft_popup(bt_share_appdata_t *ad) -{ - DBG(" +"); - char msg[BT_GLOBALIZATION_STR_LENGTH] = { 0 }; - char tmp[BT_GLOBALIZATION_STR_LENGTH] = { 0 }; - char *name = NULL; - char *markup_text = NULL; - char *stms_str = NULL; - Evas_Object *btn1 = NULL; - - if (ad->ft_type == BT_FT_SENT_POPUP) { - elm_object_part_text_set(ad->ft_popup, "title,text", BT_STR_SENT_FILES); - char file_size_str[BT_FILE_SIZE_STR] = { 0 }; - - stms_str = BT_STR_FROM_S; - snprintf(msg, sizeof(msg), stms_str, ad->ft_info->dev_name); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - name = strrchr(ad->ft_info->file_path, '/'); - if (name != NULL) - name++; - else - name = ad->ft_info->file_path; - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, name); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - /* file size */ - if (ad->ft_info->size < 1024) - snprintf(file_size_str, sizeof(file_size_str), - "%dB", ad->ft_info->size); - else if (ad->ft_info->size > 1024 * 1024) - snprintf(file_size_str, sizeof(file_size_str), - "%dMB", ad->ft_info->size / (1024 * 1024)); - else - snprintf(file_size_str, sizeof(file_size_str), - "%dKB", ad->ft_info->size / 1024); - - stms_str = BT_STR_FILE_SIZE_S; - snprintf(tmp, sizeof(tmp), stms_str, file_size_str); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(ad->ft_popup, markup_text); - } else if (ad->ft_type == BT_FT_RECV_SUCCESS_POPUP) { - elm_object_part_text_set(ad->ft_popup, "title,text", BT_STR_RECEIVED_FILES); - char file_size_str[BT_FILE_SIZE_STR] = { 0 }; - - stms_str = BT_STR_FROM_S; - snprintf(msg, sizeof(msg), stms_str, ad->ft_info->dev_name); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - name = strrchr(ad->ft_info->file_path, '/'); - if (name != NULL) - name++; - else - name = ad->ft_info->file_path; - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, name); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - /* file size */ - if (ad->ft_info->size < 1024) - snprintf(file_size_str, sizeof(file_size_str), - "%dB", ad->ft_info->size); - else if (ad->ft_info->size > 1024 * 1024) - snprintf(file_size_str, sizeof(file_size_str), - "%dMB", ad->ft_info->size / (1024 * 1024)); - else - snprintf(file_size_str, sizeof(file_size_str), - "%dKB", ad->ft_info->size / 1024); - - stms_str = BT_STR_FILE_SIZE_S; - snprintf(tmp, sizeof(tmp), stms_str, file_size_str); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(ad->ft_popup, markup_text); - } else if (ad->ft_type == BT_FT_RECV_FAIL_POPUP) { - elm_object_part_text_set(ad->ft_popup, "title,text", BT_STR_UNABLE_TO_RECEIVED_FILES); - - g_strlcat(msg, BT_STR_FILE_NOT_RECV, BT_GLOBALIZATION_STR_LENGTH); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, ad->ft_info->file_path); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - stms_str = BT_STR_FAIL_S; - snprintf(tmp, sizeof(tmp), stms_str, BT_STR_TR_CANCELLED); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(ad->ft_popup, markup_text); - } else if (ad->ft_type == BT_FT_FILE_NOT_EXIST) { - elm_object_part_text_set(ad->ft_popup, "title,text", BT_STR_RECEIVED_FILES); - - g_strlcat(msg, BT_STR_FILE_NOT_EXIST, BT_GLOBALIZATION_STR_LENGTH); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, ad->ft_info->file_path); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(ad->ft_popup, markup_text); - } else if (ad->ft_type == BT_FT_RETRY_POPUP) { - elm_object_part_text_set(ad->ft_popup, "title,text", BT_STR_UNABLE_TO_SEND_FILES); - - stms_str = BT_STR_SEND_FAIL_TO_S; - snprintf(msg, sizeof(msg), stms_str, ad->ft_info->dev_name); - g_strlcat(msg, NEW_LINE, BT_GLOBALIZATION_STR_LENGTH); - - name = strrchr(ad->ft_info->file_path, '/'); - if (name != NULL) - name++; - else - name = ad->ft_info->file_path; - - stms_str = BT_STR_FILE_S; - snprintf(tmp, sizeof(tmp), stms_str, name); - g_strlcat(msg, tmp, BT_GLOBALIZATION_STR_LENGTH); - - markup_text = elm_entry_utf8_to_markup(msg); - elm_object_text_set(ad->ft_popup, markup_text); - } - - if (ad->ft_type == BT_FT_RETRY_POPUP) { - btn1 = elm_object_part_content_get(ad->ft_popup, "button1"); - if (ad->bt_status == BT_ADAPTER_DISABLED) { - if (btn1) - elm_object_text_set(btn1, BT_STR_OK); - } else { - if (btn1) - elm_object_text_set(btn1, BT_STR_RETRY); - } - } else { - btn1 = elm_object_part_content_get(ad->ft_popup, "button1"); - if (btn1) - elm_object_text_set(btn1, BT_STR_OK); - } - - if(markup_text) - free(markup_text); - - DBG(" -"); -} - -static void __bt_progress_ok_cb(void *data, Evas_Object *obj, void *event_info) -{ - DBG(" +"); - ret_if(data == NULL); - - bt_share_appdata_t *ad = NULL; - - ad = (bt_share_appdata_t *)data; - - _bt_destroy_progress_popup(ad); - - if (ad->tr_view == NULL) - _bt_terminate_app(); - - DBG("-"); - return; -} - -static void __bt_progress_cancel_cb(void *data, Evas_Object *obj, - void *event_info) -{ - DBG(" +"); - ret_if(data == NULL); - - bt_share_appdata_t *ad = NULL; - bt_share_popup_data_t *pb_data = NULL; - - ad = (bt_share_appdata_t *)data; - pb_data = evas_object_data_get(ad->progress_popup, "progressbar_data"); - _bt_abort_signal_send(ad, pb_data); - - _bt_destroy_progress_popup(ad); - - if (ad->tr_view == NULL) - _bt_terminate_app(); - - DBG("-"); - return; -} - -static void __bt_progress_mouseup_cb(void *data, - Evas *e, Evas_Object *obj, void *event_info) -{ - Evas_Event_Mouse_Up *ev = event_info; - bt_share_appdata_t *ad = NULL; - bt_share_popup_data_t *pb_data = NULL; - - ad = (bt_share_appdata_t *)data; - pb_data = evas_object_data_get(ad->progress_popup, "progressbar_data"); - - DBG("Mouse event callback function is called +"); - - if (ev->button == 3) { - _bt_abort_signal_send(ad, pb_data); - _bt_destroy_progress_popup(ad); - - if (ad->tr_view == NULL) - _bt_terminate_app(); - } - DBG("Mouse event callback -"); -} - -Evas_Object *_bt_create_progress_popup(bt_share_popup_data_t *data) -{ - DBG(" +"); - retv_if(data == NULL, NULL); - Evas_Object *popup = NULL; - Evas_Object *layout = NULL; - Evas_Object *progressbar = NULL; - bt_share_appdata_t *ad = app_state; - char temp[BT_PERCENT_STR_LEN] = { 0 }; - float i = 0.0; - int tmp = 0; - char *markup_text = NULL; - - popup = elm_popup_add(ad->win); - evas_object_size_hint_weight_set(popup, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - - layout = __bt_create_popup_pb_layout(popup, ad); - - elm_object_part_text_set(popup, "title,text", (!strcmp(data->transfer_type, "outbound")) ? - BT_STR_SEND_FILES : BT_STR_RECEIVE_FILES); - elm_object_part_text_set(layout, "elm.text.description", (!strcmp(data->transfer_type, "outbound")) ? - BT_STR_SENDING : BT_STR_RECEIVING); - - markup_text = elm_entry_utf8_to_markup(data->filename); - elm_object_part_text_set(layout, "elm.subtext.description", markup_text); - - if(markup_text) - free(markup_text); - - progressbar = __bt_create_progressbar(popup, ad); - elm_object_part_content_set(layout, "progressbar", progressbar); - ad->pb = progressbar; - - tmp = atoi(data->percentage); - elm_progressbar_unit_format_set(ad->pb, NULL); - i = (float)tmp / (float)100.0; - elm_progressbar_value_set(ad->pb, i); - evas_object_show(ad->pb); - - snprintf(temp, BT_PERCENT_STR_LEN, "%d%%", tmp); - elm_object_part_text_set(progressbar,"elm.text.bottom.left", temp); - elm_object_signal_emit(progressbar, "elm.text.bottom.show", "elm"); - - ad->pb_transfer_id = data->transfer_id; - elm_object_content_set(popup, layout); - - _bt_create_button(popup, "popup", "button1", - BT_STR_RESUME, NULL, __bt_progress_ok_cb, ad); - _bt_create_button(popup, "popup", "button2", - BT_STR_CANCEL, NULL, __bt_progress_cancel_cb, ad); - eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, - __bt_progress_ok_cb, ad); - evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP, - __bt_progress_mouseup_cb, ad); - - evas_object_show(popup); - - DBG("-"); - ad->progress_data = data; - return popup; -} - -int _bt_destroy_progress_popup(bt_share_appdata_t *ad) -{ - DBG("+"); - - retvm_if(ad == NULL, 0, - "Invalid argument: ad is NULL"); - bt_share_popup_data_t *pb_data = NULL; - - if (ad->progress_popup) { - pb_data = evas_object_data_get(ad->progress_popup, - "progressbar_data"); - if (pb_data) { - g_free((gpointer)pb_data->filename); - g_free((gpointer)pb_data->percentage); - g_free((gpointer)pb_data->transfer_type); - g_free((gpointer)pb_data); - } - - evas_object_del(ad->progress_popup); - ad->progress_popup = NULL; - } - - DBG("-"); - return 0; -} - -void _bt_lang_changed_progress_popup(bt_share_appdata_t *ad) -{ - DBG(" +"); - ret_if(ad == NULL); - Evas_Object *btn1 = NULL; - Evas_Object *btn2 = NULL; - - elm_object_part_text_set(ad->progress_popup, "title,text", - (!strcmp(ad->progress_data->transfer_type, "outbound")) ? - BT_STR_SEND_FILES : BT_STR_RECEIVE_FILES); - elm_object_part_text_set(ad->progress_layout, "elm.text.description", - (!strcmp(ad->progress_data->transfer_type, "outbound")) ? - BT_STR_SENDING : BT_STR_RECEIVING); - - btn1 = elm_object_part_content_get(ad->progress_popup, "button1"); - if (btn1) - elm_object_text_set(btn1, BT_STR_RESUME); - btn2 = elm_object_part_content_get(ad->progress_popup, "button2"); - if (btn2) - elm_object_text_set(btn2, BT_STR_CANCEL); - - DBG(" -"); -} - -int _bt_update_progress_popup(bt_share_appdata_t *ad, +int _bt_update_progressbar(bt_share_appdata_t *ad, int transfer_id, const char *name, int percentage) { - char temp[BT_PERCENT_STR_LEN] = {0}; - retvm_if(ad == NULL, 0, "Invalid argument: ad is NULL"); - retvm_if(ad->pb_transfer_id != transfer_id, 0, "Invalid transfer_id!"); - retvm_if(!ad->progress_popup, 0, "No progress_popup!"); - - float i = 0.0; - i = (float)(percentage) / (float)100.0; - elm_progressbar_value_set(ad->pb, i); - evas_object_show(ad->pb); + retvm_if(ad->transfer_info == NULL, 0, "Invalid argument: transfer_info is NULL"); + retvm_if(ad->transfer_info->transfer_id != transfer_id, 0, "Invalid transfer_id!"); + + if (ad->transfer_info) { + ad->transfer_info->percentage = percentage; + if (ad->progress_item && ad->progressbar) { + float i; + i = (float)(percentage) / (float)100.0; + elm_progressbar_value_set(ad->progressbar, i); + + elm_object_part_text_set(ad->progressbar, "elm.text.bottom.left", + g_strdup_printf("%d%%", percentage)); + } - snprintf(temp, BT_PERCENT_STR_LEN, "%d%%", percentage); - elm_object_part_text_set(ad->pb,"elm.text.bottom.left", temp); - elm_object_signal_emit(ad->pb, "elm,bottom,text,show", "elm"); + } return 0; } - static gboolean __bt_info_popup_timer_cb(void *data, Evas_Object *obj, void *event_info) { @@ -733,21 +77,21 @@ static gboolean __bt_info_popup_timer_cb(void *data, Evas_Object *obj, _bt_destroy_info_popup(ad); - if (ad->tr_view == NULL) { + if (ad->tr_view == NULL) _bt_terminate_app(); - } + DBG("-"); return FALSE; } Evas_Object *_bt_create_info_popup(bt_share_appdata_t *ad, - const char *title, const char *text) + const char *text) { - DBG("+"); + FN_START; Evas_Object *popup = NULL; - retv_if((!ad || !title || !text), NULL); - retv_if (ad->info_popup != NULL, NULL); + retv_if((!ad || !text), NULL); + retv_if(ad->info_popup != NULL, NULL); popup = elm_popup_add(ad->win); elm_object_style_set(popup, "toast"); @@ -755,12 +99,12 @@ Evas_Object *_bt_create_info_popup(bt_share_appdata_t *ad, EVAS_HINT_EXPAND); eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, - eext_popup_back_cb, NULL); - elm_object_text_set(popup, text); + (Evas_Smart_Cb)__bt_info_popup_timer_cb, ad); + elm_object_part_text_set(popup, "elm.text", text); evas_object_smart_callback_add(popup, "block,clicked", (Evas_Smart_Cb)__bt_info_popup_timer_cb, ad); - if(!elm_config_access_get()) { + if (!elm_config_access_get()) { elm_popup_timeout_set(popup, BT_INFO_POPUP_TIMEOUT_IN_SEC); evas_object_smart_callback_add(popup, "timeout", (Evas_Smart_Cb) __bt_info_popup_timer_cb, ad); @@ -772,64 +116,100 @@ Evas_Object *_bt_create_info_popup(bt_share_appdata_t *ad, evas_object_show(popup); ad->info_popup = popup; - DBG("-"); + FN_END; return popup; } -static gboolean __bt_extinctive_info_popup_timer_cb(void *data, - Evas_Object *obj, void *event_info) +static void +__bt_share_popup_block_clicked_cb(void *data, Evas_Object *obj, void *event_info) { - bt_share_appdata_t *ad; - ad = (bt_share_appdata_t *)data; - retv_if(ad == NULL, FALSE); + elm_popup_dismiss(obj); +} - _bt_destroy_info_popup(ad); +static void +__bt_share_popup_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + elm_popup_dismiss(obj); +} - if (!ad->tr_view) - _bt_terminate_app(); +static void +__bt_share_popup_hide_finished_cb(void *data, Evas_Object *obj, void *event_info) +{ + evas_object_del(obj); +} - return FALSE; +static void +__bt_share_progressbar_popup_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Ecore_Timer *timer = data; + ecore_timer_del(timer); } -Evas_Object *_bt_create_extinctive_info_popup(bt_share_appdata_t *ad, - const char *title, const char *text) +static Eina_Bool +__bt_share_progressbar_timer_cb(void *data) { - DBG("+"); - Evas_Object *popup = NULL; + retv_if(!data, ECORE_CALLBACK_CANCEL); - retv_if((!ad || !title || !text), NULL); + Evas_Object *popup = data; + Evas_Object *progressbar = evas_object_data_get(popup, "progressbar"); + double value; - if (ad->info_popup != NULL) - return NULL; + value = elm_progressbar_value_get(progressbar); + if (value == 1.0) { + evas_object_data_del(popup, "timer"); + evas_object_del(popup); + return ECORE_CALLBACK_CANCEL; + } + value = value + 0.01; + elm_progressbar_value_set(progressbar, value); + + return ECORE_CALLBACK_RENEW; +} + +Evas_Object *_bt_share_add_turning_on_popup(bt_share_appdata_t *ad) +{ + FN_START; + retv_if(ad == NULL, NULL); + Evas_Object *popup = NULL; + Evas_Object *layout = NULL; + Evas_Object *progressbar = NULL; + Ecore_Timer *timer = NULL; popup = elm_popup_add(ad->win); - elm_object_style_set(popup, "toast"); - evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, - eext_popup_back_cb, NULL); - elm_object_text_set(popup, text); - evas_object_smart_callback_add(popup, "block,clicked", - (Evas_Smart_Cb)__bt_extinctive_info_popup_timer_cb, ad); + eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, __bt_share_popup_hide_cb, NULL); + evas_object_smart_callback_add(popup, "dismissed", __bt_share_popup_hide_finished_cb, NULL); + evas_object_smart_callback_add(popup, "block,clicked", __bt_share_popup_block_clicked_cb, NULL); - if(!elm_config_access_get()) { - elm_popup_timeout_set(popup, BT_INFO_POPUP_TIMEOUT_IN_SEC); - evas_object_smart_callback_add(popup, "timeout", - (Evas_Smart_Cb) __bt_extinctive_info_popup_timer_cb, ad); - } else { - evas_object_smart_callback_add(popup, "access,read,stop", - (Evas_Smart_Cb) __bt_extinctive_info_popup_timer_cb, ad); - } + /* layout */ + layout = elm_layout_add(popup); + elm_layout_file_set(layout, EDJFILE, "turning_on_view_layout"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(layout, "elm.text", BT_STR_TURNING_ON_BLUETOOTH_ING); + + progressbar = elm_progressbar_add(layout); + elm_object_style_set(progressbar, "process_medium"); + evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_pulse(progressbar, EINA_TRUE); + elm_object_part_content_set(layout, "processing", progressbar); + timer = ecore_timer_add(0.1, __bt_share_progressbar_timer_cb, popup); + + elm_object_content_set(popup, layout); + + evas_object_data_set(popup, "progressbar", progressbar); + evas_object_data_set(popup, "timer", timer); + evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, + __bt_share_progressbar_popup_del_cb, timer); evas_object_show(popup); - ad->info_popup = popup; - DBG("-"); + FN_END; return popup; } - int _bt_destroy_info_popup(bt_share_appdata_t *ad) { DBG("+"); diff --git a/src/bt-share-ui-popup.h b/src/bt-share-ui-popup.h index 8d8bed3..27ed7be 100644 --- a/src/bt-share-ui-popup.h +++ b/src/bt-share-ui-popup.h @@ -31,34 +31,15 @@ extern "C" { #include #include "bt-share-ui-main.h" - -#define BT_POPUP_TEXT_LEN \ - (BT_GLOBALIZATION_STR_LENGTH + BT_FILE_NAME_LEN_MAX) -#define BT_PERCENT_STR_LEN 5 -#define BT_MIME_TYPE_MAX_LEN 20 #define BT_FILE_SIZE_STR 10 #define BT_INFO_POPUP_TIMEOUT_IN_SEC 2 +Evas_Object *_bt_share_add_turning_on_popup(bt_share_appdata_t *ad); -Evas_Object *_bt_create_ft_popup(bt_share_ft_popup_type_e type, - bt_tr_data_t *info); - -void _bt_lang_changed_ft_popup(bt_share_appdata_t *ad); - -Evas_Object *_bt_create_progress_popup(bt_share_popup_data_t *data); -void _bt_lang_changed_progress_popup(bt_share_appdata_t *ad); - -int _bt_update_progress_popup(bt_share_appdata_t *ad, int transfer_id, +int _bt_update_progressbar(bt_share_appdata_t *ad, int transfer_id, const char *name, int percentage); -int _bt_destroy_progress_popup(bt_share_appdata_t *ad); - - -Evas_Object *_bt_create_info_popup(bt_share_appdata_t *ad, const char *title, - const char *text); - -Evas_Object *_bt_create_extinctive_info_popup(bt_share_appdata_t *ad, - const char *title, const char *text); +Evas_Object *_bt_create_info_popup(bt_share_appdata_t *ad, const char *text); int _bt_destroy_info_popup(bt_share_appdata_t *ad); diff --git a/src/bt-share-ui-resource.h b/src/bt-share-ui-resource.h index 8bcc941..ae310b3 100644 --- a/src/bt-share-ui-resource.h +++ b/src/bt-share-ui-resource.h @@ -37,79 +37,85 @@ extern "C" { #define BT_PKGNAME "org.tizen.bluetooth-share-ui" #define BT_PREFIX "/usr/apps/"BT_PKGNAME -#define BT_ICON_RECV_FAIL "bluetooth_inbound_transfer_failed.png" -#define BT_ICON_RECV_PASS "bluetooth_inbound_transfer_successed.png" -#define BT_ICON_SEND_FAIL "bluetooth_outbound_transfer_failed.png" -#define BT_ICON_SEND_PASS "bluetooth_outbound_transfer_successed.png" +#define BT_ICON_RECV_FAIL "bluetooth_download_failed.png" +#define BT_ICON_RECV_PASS "bluetooth_download_complete.png" +#define BT_ICON_SEND_FAIL "bluetooth_upload_failed.png" +#define BT_ICON_SEND_PASS "bluetooth_upload_complete.png" -#define BT_STR_MEMORY_FULL \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_MEMORYFULL") #define BT_STR_UNABLE_TO_SEND \ dgettext(BT_COMMON_PKG, "IDS_BT_POP_SENDINGFAIL") -#define BT_STR_FT \ - dgettext(BT_COMMON_PKG, "IDS_ST_BODY_TRANSFER_FILES") -#define BT_STR_SEND_FILES \ - dgettext(BT_COMMON_PKG, "IDS_SMT_POP_SEND_FILES") + #define BT_STR_SENDING \ dgettext(BT_COMMON_PKG, "IDS_BT_POP_SENDING_ING") #define BT_STR_RECEIVING \ dgettext(BT_COMMON_PKG, "IDS_BT_POP_RECEIVING_ING") -#define BT_STR_CLR_LIST \ - dgettext(BT_COMMON_PKG, "IDS_BT_BODY_CLEAR_LIST") #define BT_STR_FILE_NOT_EXIST \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_FILE_DOES_NOT_EXIST") -#define BT_STR_NO_TRANSFER_HISTORY \ - dgettext(BT_COMMON_PKG, "IDS_BT_BODY_NO_TRANSFER_HISTORY") -#define BT_STR_SEND_FAIL_TO_S \ - dgettext(BT_COMMON_PKG, "IDS_BT_BODY_SENDING_FAILED_TO_PS") + dgettext(BT_COMMON_PKG, "IDS_BT_TPOP_FILE_NOT_FOUND") #define BT_STR_FILE_NOT_RECV \ dgettext(BT_COMMON_PKG, "IDS_BT_POP_FILE_NOT_RECEIVED") #define BT_STR_FILE_S \ dgettext(BT_COMMON_PKG, "IDS_BT_POP_FILE_C_PS") #define BT_STR_FAIL_S \ dgettext(BT_COMMON_PKG, "IDS_BT_POP_FAILURE_REASON_C_PS") -#define BT_STR_TO_S \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_TO_C_PS") -#define BT_STR_FILE_TYPE_S \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_FILE_TYPE_C_PS") #define BT_STR_FILE_SIZE_S \ dgettext(BT_COMMON_PKG, "IDS_BT_POP_FILE_SIZE_C_PS") #define BT_STR_FROM_S \ dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_FROM_C_PS") -#define BT_STR_TR_CANCELLED \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_TRANSFER_CANCELLED") #define BT_STR_UNABLE_TO_RECEIVE \ dgettext(BT_COMMON_PKG, "IDS_BT_BODY_UNABLE_TO_RECEIVE") #define BT_STR_SENT_FILES \ dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_SENT_FILES") #define BT_STR_RECEIVED_FILES \ dgettext(BT_COMMON_PKG, "IDS_BT_OPT_RECEIVED_FILES") -#define BT_STR_RECEIVE_FILES \ - dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_RECEIVE_FILES_ABB") #define BT_STR_UNABLE_TO_RECEIVED_FILES \ dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_UNABLE_TO_RECEIVE_FILES_ABB") -#define BT_STR_UNABLE_TO_SEND_FILES \ - dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_UNABLE_TO_SEND_FILES_ABB") #define BT_STR_UNABLE_TO_FIND_APPLICATION \ dgettext(BT_COMMON_PKG, "IDS_MF_TPOP_UNABLE_TO_FIND_APPLICATION_TO_PERFORM_THIS_ACTION") -#define BT_STR_TR_COPIED_STATUS \ - dgettext(BT_COMMON_PKG, "IDS_BT_MBODY_P1SD_FILES_COPIED_P2SD_FAILED_ABB") #define BT_STR_TR_1FILE_COPIED_STATUS \ dgettext(BT_COMMON_PKG, "IDS_BT_MBODY_1_FILE_COPIED_PD_FAILED_ABB") - -#define BT_STR_INFORMATION dgettext(BT_COMMON_PKG, "IDS_ST_BODY_INFORMATION") -#define BT_STR_OK dgettext(BT_COMMON_PKG, "IDS_BT_BUTTON_OK") -#define BT_STR_HIDE dgettext(BT_COMMON_PKG, "IDS_CST_OPT_HIDE") -#define BT_STR_RESUME dgettext(BT_COMMON_PKG, "IDS_MAPS_POP_RESUME") -#define BT_STR_CANCEL dgettext(BT_COMMON_PKG, "IDS_BR_SK_CANCEL") -#define BT_STR_CLOSE dgettext(BT_COMMON_PKG, "IDS_CAM_SK_CLOSE") -#define BT_STR_YESTERDAY dgettext(BT_COMMON_PKG, "IDS_ST_BODY_YESTERDAY") -#define BT_STR_RETRY dgettext(BT_COMMON_PKG, "IDS_ST_BUTTON_RETRY") +#define BT_STR_DEVICENAME dgettext(BT_COMMON_PKG, "IDS_BT_BODY_DEVICENAME") +#define BT_STR_RECEIVING_FAILED dgettext(BT_COMMON_PKG, "IDS_BT_MBODY_RECEIVING_FAILED") +#define BT_STR_FILE_RECEIVED dgettext(BT_COMMON_PKG, "IDS_BT_MBODY_FILE_RECEIVED") +#define BT_STR_SENDING_FAILED dgettext(BT_COMMON_PKG, "IDS_BT_MBODY_SENDING_FAILED") +#define BT_STR_FILE_SENT dgettext(BT_COMMON_PKG, "IDS_BT_MBODY_FILE_SENT") +#define BT_STR_FILE_LIST dgettext(BT_COMMON_PKG, "IDS_FV_HEADER_FILE_LIST") +#define BT_STR_RECEIVED dgettext(BT_COMMON_PKG, "IDS_MSG_BUTTON_RECEIVED_M_MESSAGE") +#define BT_STR_SENT dgettext(BT_COMMON_PKG, "IDS_MSG_BODY_SENT_ABB") +#define BT_STR_FAILED dgettext(BT_COMMON_PKG, "IDS_EMAIL_BODY_FAILED_M_STATUS") +#define BT_STR_STOP dgettext(BT_COMMON_PKG, "IDS_BT_SK4_STOP") +#define BT_STR_WAITING dgettext(BT_COMMON_PKG, "IDS_ST_BODY_WAITING_ING") +#define BT_STR_RESEND_FAILED_FILES dgettext(BT_COMMON_PKG, "IDS_WIFI_POP_RESEND_FAILED_FILES") +#define BT_STR_VCF_FILES_ARE_TEMPORARY_AND_CANT_BE_OPENED dgettext(BT_COMMON_PKG, "IDS_BT_TPOP_VCF_FILES_ARE_TEMPORARY_AND_CANT_BE_OPENED") +#define BT_STR_RECEIVED_VCF_FILE_ALREADY_IMPORTED_TO_CONTACTS dgettext(BT_COMMON_PKG, "IDS_BT_TPOP_RECEIVED_VCF_FILE_ALREADY_IMPORTED_TO_CONTACTS") +#define BT_STR_PD_RECEIVED dgettext(BT_COMMON_PKG, "IDS_SAS_SBODY_PD_RECEIVED") +#define BT_STR_PD_SENT dgettext(BT_COMMON_PKG, "IDS_WIFI_SBODY_PD_SENT_M_STATUS") +#define BT_STR_PD_FAILED dgettext(BT_COMMON_PKG, "IDS_WIFI_SBODY_PD_FAILED") +#define BT_STR_TURNING_ON_BLUETOOTH_ING \ + dgettext(BT_COMMON_PKG, "IDS_BT_BODY_TURNING_ON_BLUETOOTH_ING") /* Access information */ #define BT_STR_ACCES_INFO_MAX_LEN 512 #define BT_STR_ACC_ICON "Icon" -#define BT_STR_ACC_TITLE "Title" + +/* Length of Strings*/ +#define BT_STR_PROGRESS_MAX_LEN 30 + +/* Genlist item parts */ +#define BT_SHARE_ITEM_PART_DEVICE_NAME_TITLE "elm.text" +#define BT_SHARE_ITEM_PART_DEVICE_NAME "elm.text.sub" + +#define BT_SHARE_ITEM_PART_TRANSFER_TYPE_TITLE "elm.text" +#define BT_SHARE_ITEM_PART_TRANSFER_STATUS "elm.text.sub" + +#define BT_SHARE_ITEM_PART_PROGRESSBAR_FILE_NAME "elm.text.main" +#define BT_SHARE_ITEM_PART_PROGRESSBAR_ICON "elm.swallow.content" + +#define BT_SHARE_ITEM_PART_FILE_LIST_TITLE "elm.text" + +#define BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_ICON "elm.swallow.icon" +#define BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_TEXT "elm.text.sub" +#define BT_SHARE_ITEM_PART_FILE_NAME "elm.text" +#define BT_SHARE_ITEM_PART_FILE_SIZE "elm.text.sub.end" #ifdef __cplusplus } diff --git a/src/bt-share-ui-view.c b/src/bt-share-ui-view.c old mode 100755 new mode 100644 index 8118bfe..6a5c20b --- a/src/bt-share-ui-view.c +++ b/src/bt-share-ui-view.c @@ -36,13 +36,10 @@ #include #include #include -#include +#include #include -#if 0 -#include -#endif -#include #include +#include #include "applog.h" #include "bt-share-ui-view.h" @@ -52,65 +49,169 @@ #include "bt-share-ui-widget.h" #include "bt-share-ui-main.h" +#define NOTI_OPS_APP_ID "bluetooth-share-opp-server" +#define NOTI_OPC_APP_ID "bluetooth-share-opp-client" + +#define BT_DEFAULT_MEM_PHONE 0 +#define BT_DEFAULT_MEM_MMC 1 -#define BT_TIMESTAMP_LEN_MAX 18 #define BT_DOWNLOAD_PHONE_FOLDER "/opt/usr/media/Downloads" #define BT_DOWNLOAD_MMC_FOLDER "/opt/storage/sdcard/Downloads" -#define BT_FILE_PATH_LEN_MAX (4096 + 10) +#define BT_CONTACT_SHARE_TMP_DIR BT_DOWNLOAD_PHONE_FOLDER "/.bluetooth" extern bt_share_appdata_t *app_state; -static char *month_str[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; -static void __bt_more_menu_cb(void *data, - Evas_Object *obj, void *event_info); +static Evas_Object *__bt_add_tr_data_genlist(Evas_Object *parent, + bt_share_appdata_t *ad); -Evas_Object *_bt_create_win(const char *name) +void _bt_delete_selected_notification(bt_share_tr_type_e tr_type, + int noti_id, const char *opp_role) { - Evas_Object *eo = NULL; + notification_list_h list_head; + notification_list_h list_traverse; + notification_h noti; + int priv_id; -#if 0 - eo = (Evas_Object *)app_get_preinitialized_window(name); -#endif - if (eo == NULL) { - ERR("app_get_preinitialized_window fail!"); - eo = elm_win_add(NULL, name, ELM_WIN_BASIC); + notification_get_list(NOTIFICATION_TYPE_NOTI, -1, &list_head); + list_traverse = list_head; + + while (list_traverse != NULL) { + noti = notification_list_get_data(list_traverse); + notification_get_id(noti, NULL, &priv_id); + if (priv_id == noti_id) { + DBG_SECURE("Deleting Notification ID: %d", noti_id); + if (notification_delete_by_priv_id(opp_role, + NOTIFICATION_TYPE_NOTI, priv_id) + != NOTIFICATION_ERROR_NONE) + ERR("Could Not Delete Notification"); + break; + } + list_traverse = notification_list_get_next(list_traverse); } - retv_if(!eo, NULL); +} - elm_win_title_set(eo, name); - elm_win_borderless_set(eo, EINA_TRUE); -#if 0 - ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); - evas_object_resize(eo, w, h); -#endif +static void __bt_get_noti_id_opp_role_and_table(bt_share_appdata_t *ad, int *noti_id, + char **opp_role, bt_tr_db_table_e *table) +{ + sqlite3 *db = bt_share_open_db(); - return eo; + if (ad->tr_type == BT_TR_OUTBOUND) { + *noti_id = bt_share_get_noti_id(db, BT_DB_OUTBOUND, ad->transfer_info->db_sid); + *opp_role = NOTI_OPC_APP_ID; + *table = BT_DB_OUTBOUND; + } else { + *noti_id = bt_share_get_noti_id(db, BT_DB_INBOUND, ad->transfer_info->db_sid); + *opp_role = NOTI_OPS_APP_ID; + *table = BT_DB_INBOUND; + } + + bt_share_close_db(db); } -void _bt_terminate_app(void) +void _bt_share_ui_handle_transfer_disconnected(bt_share_appdata_t *ad, + bt_share_tr_type_e type) { - DBG("Terminate BT SHARE UI"); - elm_exit(); + FN_START; + ret_if(ad == NULL); + + if (ad->progress_item) { + DBG("Updating Status"); + Elm_Object_Item *git = elm_genlist_item_insert_after(ad->tr_genlist, + ad->tr_status_itc, ad, NULL, + ad->device_item, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + if (git == NULL) { + ERR("elm_genlist_item_insert_after is failed!"); + } else { + elm_genlist_item_select_mode_set(git, + ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + ad->status_item = git; + } + + elm_object_item_del(ad->progress_item); + ad->progress_item = NULL; + ad->progressbar = NULL; + } + + FN_END; } -void _bt_delete_selected_item(bt_share_appdata_t *ad) +void _bt_share_ui_handle_transfer_complete(bt_share_appdata_t *ad, + char *address, bt_share_tr_type_e type) { - DBG("+"); - ret_if(ad == NULL); + FN_START; + ret_if(ad == NULL || ad->transfer_info == NULL || ad->transfer_info->device_address == NULL); + DBG_SECURE("Received Address: %s", address); + DBG_SECURE("Device Address: %s", ad->transfer_info->device_address); - if (ad->selected_item == NULL) - return; + ret_if(g_strcmp0(ad->transfer_info->device_address, address)); - elm_object_item_del(ad->selected_item); - ad->selected_item = NULL; + FN_END; +} - if (elm_genlist_items_count(ad->tr_genlist) == 0) { - _bt_nocontent_set(ad, TRUE); - ad->tr_genlist = NULL; +void _bt_share_ui_handle_transfer_started(bt_share_appdata_t *ad, + char *address, char *file_name, unsigned long size, int transfer_id, + bt_share_tr_type_e type) +{ + FN_START; + ret_if(ad == NULL || ad->transfer_info == NULL || ad->transfer_info->device_address == NULL); + DBG_SECURE("Received Address: %s", address); + DBG_SECURE("Device Address: %s", ad->transfer_info->device_address); + ret_if(g_strcmp0(ad->transfer_info->device_address, address)); + + ad->transfer_info->filename = g_strdup(file_name); + DBG_SECURE("Transfer ID: %d", transfer_id); + ad->transfer_info->size = size; + ad->transfer_info->percentage = 0; + ad->transfer_info->current_file++; + + if (ad->status_item) { + elm_object_item_del(ad->status_item); + ad->status_item = NULL; + } + + if (ad->progress_item) { + _bt_share_genlist_item_text_update(ad->progress_item, BT_SHARE_ITEM_PART_PROGRESSBAR_FILE_NAME); + _bt_share_genlist_item_content_update(ad->progress_item, BT_SHARE_ITEM_PART_PROGRESSBAR_ICON); + } else { + /* Create Progress bar if not present */ + Elm_Object_Item *git = elm_genlist_item_insert_after(ad->tr_genlist, + ad->tr_progress_itc, ad, NULL, ad->device_item, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + if (git == NULL) { + ERR("elm_genlist_item_append is failed!"); + } else { + elm_genlist_item_select_mode_set(git, + ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + ad->progress_item = git; + } } + + if (!ad->toolbar_button) { + /* Create Stop Button if not present */ + ad->toolbar_button = _bt_share_create_toolbar_button(ad, + BT_STR_STOP); + } + + FN_END; +} + +Evas_Object *_bt_create_win(const char *name) +{ + Evas_Object *eo = NULL; + + eo = elm_win_add(NULL, name, ELM_WIN_BASIC); + retv_if(!eo, NULL); + + elm_win_title_set(eo, name); + elm_win_borderless_set(eo, EINA_TRUE); + return eo; +} + +void _bt_terminate_app(void) +{ + DBG("Terminate BT SHARE UI"); + elm_exit(); } static void __bt_clear_view(void *data) @@ -123,11 +224,12 @@ static void __bt_clear_view(void *data) if (ad->tr_genlist) { elm_genlist_clear(ad->tr_genlist); ad->tr_genlist = NULL; - } - - if (ad->toolbar_btn) { - evas_object_del(ad->toolbar_btn); - ad->toolbar_btn = NULL; + ad->device_item = NULL; + ad->progress_item = NULL; + ad->status_item = NULL; + ad->file_title_item = NULL; + ad->tr_data_itc = NULL; + ad->progressbar = NULL; } if (ad->navi_fr) { @@ -165,206 +267,601 @@ static Eina_Bool __bt_back_button_cb(void *data, Elm_Object_Item *it) return EINA_FALSE; } -static void __bt_clear_list_btn_cb(void *data, - Evas_Object *obj, - void *event_info) +static Evas_Object *__bt_tr_progress_icon_get(void *data, Evas_Object *obj, + const char *part) { - bt_share_appdata_t *ad = (bt_share_appdata_t *)data; - int clear_list = -1; - int ret; + FN_START; - DBG("Clear genlist item"); + Evas_Object *progress_layout = NULL; + Evas_Object *progressbar = NULL; + bt_share_appdata_t *ad = NULL; - notification_h noti = NULL; - int priv_id = 0; - notification_list_h list_head = NULL; - notification_list_h list_traverse = NULL; - char *app_id = NULL; - char *opp_role = NULL; + retv_if(data == NULL, NULL); + ad = (bt_share_appdata_t *)data; - if (ad->bt_status == BT_ADAPTER_DISABLED) { - sqlite3 *db = NULL; - bt_tr_db_table_e table; + bt_share_transfer_data_t *transfer_info = ad->transfer_info; + + if (!strcmp(part, BT_SHARE_ITEM_PART_PROGRESSBAR_ICON)) { + char buff[BT_STR_PROGRESS_MAX_LEN] = { 0, }; + char *markup_text = NULL; + + if (ad->progress_layout == NULL) { + DBG("Creating new progress layout!!!"); + progress_layout = elm_layout_add(obj); + elm_layout_file_set(progress_layout, EDJFILE, "gl_custom_item"); + evas_object_size_hint_align_set(progress_layout, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(progress_layout, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_show(progress_layout); + ad->progress_layout = progress_layout; + } else { + progress_layout = ad->progress_layout; + } - /* Update bt-share DB */ - db = bt_share_open_db(); - if (!db) - return; + if (ad->progressbar == NULL) { + DBG("Creating new progressbar!!!"); + progressbar = elm_progressbar_add(progress_layout); - table = ad->tr_type ? BT_TR_INBOUND : BT_TR_OUTBOUND; - bt_share_remove_all_tr_data(db, table); - bt_share_close_db(db); + elm_progressbar_unit_format_set(progressbar, NULL); + elm_progressbar_horizontal_set(progressbar, EINA_TRUE); + evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_progressbar_pulse(progressbar, EINA_TRUE); - /* Delete notification */ - notification_get_list(NOTIFICATION_TYPE_NOTI, -1, &list_head); - list_traverse = list_head; + evas_object_show(progressbar); + ad->progressbar = progressbar; + } else { + progressbar = ad->progressbar; + } - if (ad->tr_type == BT_TR_INBOUND) - opp_role = "bluetooth-share-opp-server"; - else - opp_role = "bluetooth-share-opp-client"; + elm_object_part_content_set(progress_layout, "elm.swallow.content", progressbar); + + elm_progressbar_value_set(progressbar, + (double) transfer_info->percentage / 100); + + elm_object_signal_emit(progressbar, "elm,bottom,text,show", "elm"); + + markup_text = elm_entry_utf8_to_markup(transfer_info->filename); + DBG_SECURE("Filename: %s", markup_text); + + DBG("Filename: %s", markup_text); + elm_object_part_text_set(progressbar, "elm.text.top.right", markup_text); + g_free(markup_text); + + snprintf(buff, BT_STR_PROGRESS_MAX_LEN - 1 , "%d%%", transfer_info->percentage); + elm_object_part_text_set(progressbar, "elm.text.bottom.left", buff); - while (list_traverse != NULL) { - noti = notification_list_get_data(list_traverse); - notification_get_pkgname(noti, &app_id); + if (ad->launch_mode == BT_LAUNCH_ONGOING && + ad->tr_type == BT_TR_OUTBOUND) { + memset(buff, 0, BT_STR_PROGRESS_MAX_LEN); + snprintf(buff, BT_STR_PROGRESS_MAX_LEN - 1 , "[%d/%d]", + transfer_info->current_file, transfer_info->total_files); + elm_object_part_text_set(progressbar, "elm.text.bottom.right", buff); + } + } + + return progress_layout; +} + + +static Evas_Object *__bt_tr_icon_get(void *data, Evas_Object *obj, + const char *part) +{ + Evas_Object *ly = NULL; + Evas_Object *icon = NULL; + bt_tr_data_t *info = NULL; + bt_share_appdata_t *ad = app_state; + char *img = NULL; + bt_gl_data_t *gl_data = NULL; + + retv_if(!data, NULL); + gl_data = (bt_gl_data_t *)data; - if (g_strcmp0(app_id, opp_role) == 0) { - notification_get_id(noti, NULL, &priv_id); - notification_delete_by_priv_id(app_id, NOTIFICATION_TYPE_NOTI, priv_id); - priv_id = 0; + info = gl_data->tr_data; + retv_if(!info, NULL); + + if (!strcmp(part, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_ICON)) { + ly = elm_layout_add(obj); + if (info->tr_status == BT_TRANSFER_SUCCESS || + info->tr_status == BT_TRANSFER_FAIL) { + icon = elm_image_add(obj); + if (ad->tr_type == BT_TR_OUTBOUND) { + img = (info->tr_status == BT_TRANSFER_SUCCESS) ? + BT_ICON_SEND_PASS : BT_ICON_SEND_FAIL; + } else { + img = (info->tr_status == BT_TRANSFER_SUCCESS) ? + BT_ICON_RECV_PASS : BT_ICON_RECV_FAIL; } - list_traverse = notification_list_get_next(list_traverse); + + elm_image_file_set(icon, EDJ_IMAGES, img); + evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + evas_object_show(icon); + evas_object_size_hint_min_set(icon, ELM_SCALE_SIZE(40), ELM_SCALE_SIZE(40)); + return icon; + } else if (info->tr_status == BT_TRANSFER_ONGOING) { +#if 0 + int ret; + ret = elm_layout_file_set(ly, EDJ_BT_ICON_ANIMATION, + (ad->tr_type == BT_TR_OUTBOUND ? BT_ANI_UPLOAD : BT_ANI_DOWNLOAD)); + if (ret == EINA_FALSE) + ERR("Error in setting layout file"); +#endif + icon = elm_progressbar_add(obj); + elm_object_style_set(icon, "process_medium"); + evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_pulse(icon, TRUE); + return icon; + } else if (info->tr_status == BT_TRANSFER_PENDING) { + icon = elm_progressbar_add(obj); + elm_object_style_set(icon, "process_medium"); + evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_pulse(icon, TRUE); + return icon; } + } + return ly; +} - if (list_head != NULL) { - notification_free_list(list_head); - list_head = NULL; +#if 0 +void _bt_util_get_number(char *source, char *dest) +{ + int len = 7; + int slen = 0; + char buf[9]; + + slen = strlen(source); + slen--; + buf[8] = '\0'; + while (len > -1) { + if (slen > -1) { + if (isdigit(source[slen])) { + buf[len] = source[slen]; + --len; + } + --slen; + } else { + break; } - } else { - _bt_share_ui_ipc_info_update(ad, clear_list); } + if (len < 0) + len = 0; + strcpy(dest, &buf[len]); +} - if (ad->tr_genlist) { - elm_genlist_clear(ad->tr_genlist); - ad->tr_genlist = NULL; +void _bt_util_get_contact_name(int lcontact_id, char **contact_name) +{ + int ret = 0; + int count = 0; + contacts_filter_h filter = NULL; + contacts_query_h query = NULL; + contacts_list_h list = NULL; + contacts_record_h record = NULL; + char *name = NULL; + + DBG("+"); + ret = contacts_filter_create(_contacts_contact._uri, &filter); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to create filter for contacts"); + goto fail; } - if (ad->tr_data_list) { - ret = bt_share_release_tr_data_list(ad->tr_data_list); - if (ret != BT_SHARE_ERR_NONE) - ERR("Transfer data release failed "); - ad->tr_data_list = NULL; + ret = contacts_filter_add_int(filter, _contacts_contact.id, + CONTACTS_MATCH_EXACTLY, lcontact_id); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to add str to filter for contacts"); + goto fail; + } + + ret = contacts_query_create(_contacts_contact._uri, &query); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to create qurey for contacts"); + goto fail; + } + + ret = contacts_query_set_filter(query, filter); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to set filter for contacts"); + goto fail; } - _bt_nocontent_set(ad, TRUE); + ret = contacts_db_get_count_with_query(query, &count); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to get count from db"); + goto fail; + } + if (count < 1) { + DBG("No match"); + goto fail; + } + DBG("count = %d", count); + ret = contacts_db_get_records_with_query(query, 0, 0, &list); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to get records from db"); + goto fail; + } + contacts_list_first(list); + + while (ret == CONTACTS_ERROR_NONE) { + contacts_list_get_current_record_p(list, &record); + contacts_record_get_str_p(record, + _contacts_contact.display_name, + &name); + if (name != NULL) { + *contact_name = g_strdup(name); + break; + } + + ret = contacts_list_next(list); + } + +fail: + if (filter) + contacts_filter_destroy(filter); + + if (query) + contacts_query_destroy(query); + + if (list) + contacts_list_destroy(list, true); + DBG("-"); + return; } -static char *__bt_get_tr_timedate(time_t timestamp) +unsigned int bt_crc32(const void *src, unsigned long src_sz) { - struct tm pt; - struct tm current_time; - time_t rawtime; - char buf[BT_TIMESTAMP_LEN_MAX] = { 0 }; - int cy; - int cm; - int cd; - int ry; - int rm; - int rd; - - /* Get current time */ - time(&rawtime); - localtime_r(&rawtime, ¤t_time); - - cy = current_time.tm_year + 1900; - cm = current_time.tm_mon + 1; - cd = current_time.tm_mday; - - /* Get recorded time */ - localtime_r(×tamp, &pt); - ry = pt.tm_year + 1900; - rm = pt.tm_mon + 1; - rd = pt.tm_mday; - - if (cy == ry && cm == rm && cd == rd) { - int format = 0; - if (vconf_get_int(VCONFKEY_REGIONFORMAT_TIME1224, &format) != 0) { - ERR("vconf get failed"); - } + return (crc32(0, src, src_sz) & 0xFFFF); +} - if (format == VCONFKEY_TIME_FORMAT_12) - if (pt.tm_hour >=0 && pt.tm_hour < 12) - strftime(buf, sizeof(buf), "%I:%M AM", &pt); - else - strftime(buf, sizeof(buf), "%I:%M PM", &pt); - else - strftime(buf, sizeof(buf), "%H:%M", &pt); - } else if (cy == ry && cm == rm && cd - 1 == rd) { - return g_strdup(BT_STR_YESTERDAY); - } else { - snprintf(buf, sizeof(buf), "%d %s %d", rd, month_str[rm - 1], ry); +void _bt_util_get_contact_info(unsigned char *auth_info, int *contact_id, char **contact_name) +{ + unsigned int shash = 0; + unsigned int chash = 0; + char pnumber[20] = {0,}; + char str_hash[7] = {0,}; + int ret = CONTACTS_ERROR_NONE; + char *number = NULL; + int lcontact_id = 0; + int count = 0; + + contacts_filter_h filter = NULL; + contacts_query_h query = NULL; + contacts_list_h list = NULL; + contacts_record_h record = NULL; + + retm_if(!auth_info, "auth_info is NULL"); + retm_if(!contact_id, "contact_id is NULL"); + retm_if(!contact_name, "contact_name is NULL"); + DBG("+"); + if (contacts_connect() != CONTACTS_ERROR_NONE) { + ERR("contacts_connect failed"); + return; + } + + memcpy(&shash, auth_info, 3); + shash = ntohl(shash); + shash >>= 8; + + memcpy(&chash, &auth_info[3], 2); + chash = ntohl(chash); + chash >>= 16; + + g_snprintf(str_hash, 7, "%X", shash); + + ret = contacts_filter_create(_contacts_quick_connect_info._uri, &filter); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to create filter for contacts"); + goto fail; + } + + ret = contacts_filter_add_str(filter, _contacts_quick_connect_info.hash, + CONTACTS_MATCH_EXACTLY, str_hash); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to add str to filter for contacts"); + goto fail; + } + + ret = contacts_query_create(_contacts_quick_connect_info._uri, &query); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to create qurey for contacts"); + goto fail; + } + + ret = contacts_query_set_filter(query, filter); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to set filter for contacts"); + goto fail; + } + + ret = contacts_db_get_count_with_query(query, &count); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to get count from db"); + goto fail; + } + + if (count < 1) { + DBG("No match"); + goto fail; + } + + ret = contacts_db_get_records_with_query(query, 0, 0, &list); + if (ret != CONTACTS_ERROR_NONE) { + ERR("Fail to get records from db"); + goto fail; + } + + contacts_list_first(list); + + while (ret == CONTACTS_ERROR_NONE) { + contacts_list_get_current_record_p(list, &record); + contacts_record_get_str_p(record, + _contacts_quick_connect_info.number, + &number); + DBG_SECURE("number: [%s]", number); + if (number != NULL) { + _bt_util_get_number(number, pnumber); + DBG_SECURE("pnumber: [%s]", pnumber); + + DBG_SECURE("CRC [%X], [%X]", chash, bt_crc32(pnumber, strlen(pnumber))); + + if (bt_crc32(pnumber , strlen(pnumber)) == chash) { + contacts_record_get_int(record, + _contacts_quick_connect_info.contact_id, + &lcontact_id); + *contact_id = lcontact_id; + _bt_util_get_contact_name(lcontact_id, contact_name); + DBG_SECURE("contact id : %d", lcontact_id); + break; + } + } + ret = contacts_list_next(list); } - return g_strdup(buf); +fail: + if (filter) + contacts_filter_destroy(filter); + + if (query) + contacts_query_destroy(query); + + if (list) + contacts_list_destroy(list, true); + + contacts_disconnect(); + + DBG("-"); } +#endif -static Evas_Object *__bt_tr_icon_get(void *data, Evas_Object *obj, - const char *part) +static char *__bt_tr_device_label_get(void *data, Evas_Object *obj, + const char *part) { - Evas_Object *icon = NULL; - bt_tr_data_t *info = NULL; - bt_share_appdata_t *ad = app_state; - char *img; - bt_gl_data_t *gl_data; + FN_START; + retv_if(data == NULL, NULL); + bt_share_appdata_t *ad = (bt_share_appdata_t *)data; + char *markup_text = NULL; + + retv_if(ad->transfer_info == NULL, NULL); + + if (!strcmp(part, BT_SHARE_ITEM_PART_DEVICE_NAME_TITLE)) { + return g_strdup(BT_STR_DEVICENAME); + } else if (!strcmp(part, BT_SHARE_ITEM_PART_DEVICE_NAME)) { + bt_share_transfer_data_t *transfer_info = ad->transfer_info; + DBG_SECURE("Device : %s", transfer_info->device_name); + if (ad->bt_status == BT_ADAPTER_ENABLED) { + bt_error_e ret = BT_ERROR_NONE; + bt_device_info_s *dev_info = NULL; + + /* Get the contact name from manufacturer data */ + DBG_SECURE("Address : %s", transfer_info->device_address); + ret = bt_adapter_get_bonded_device_info(transfer_info->device_address, &dev_info); + if (ret == BT_ERROR_NONE) { + DBG_SECURE("Using remote name [%s] only.", dev_info->remote_name); + markup_text = elm_entry_utf8_to_markup(dev_info->remote_name); +#if 0 + unsigned char auth_info[5] = {0, }; + int contact_id = -1; + char *contact_name = NULL; + gboolean is_alias_set = FALSE; + ret = bt_adapter_get_bonded_device_is_alias_set(dev_info->remote_address, &is_alias_set); + if (ret != BT_ERROR_NONE) + ERR("bt_adapter_get_bonded_device_is_alias_set() is failed!!! error: 0x%04X", ret); + + if (is_alias_set == TRUE) { + DBG_SECURE("Device alias is set. Using remote name [%s] only.", dev_info->remote_name); + markup_text = elm_entry_utf8_to_markup(dev_info->remote_name); + } else if (dev_info->manufacturer_data_len >= 30 && + dev_info->manufacturer_data[0] == 0x00 && + dev_info->manufacturer_data[1] == 0x75) { + unsigned char auth_info_null[5]; + memset(auth_info_null, 0X0, 5); + memcpy(auth_info, &(dev_info->manufacturer_data[10]), 5); + + /* Check for validity of auth_info */ + if (memcmp(auth_info, auth_info_null, 5)) { + _bt_util_get_contact_info(auth_info, &contact_id, &contact_name); + DBG_SECURE("contact id : %d | contact name : %s", contact_id, contact_name); + if (contact_name) { + markup_text = elm_entry_utf8_to_markup(contact_name); + g_free(contact_name); + } + } + } +#endif + bt_adapter_free_device_info(dev_info); + } else { + ERR("bt_adapter_get_bonded_device_info() is failed!!! error: 0x%04X", ret); + } + } + + if (!markup_text) + markup_text = elm_entry_utf8_to_markup(transfer_info->device_name); + + return markup_text; + } + FN_END; + return NULL; +} +static char *__bt_tr_status_label_get(void *data, Evas_Object *obj, + const char *part) +{ + FN_START; retv_if(data == NULL, NULL); + bt_share_appdata_t *ad = (bt_share_appdata_t *)data; + bt_share_transfer_data_t *transfer_info = ad->transfer_info; + char *tmp_success = NULL; + char *tmp_failed = NULL; + char *ret_str = NULL; - gl_data = (bt_gl_data_t *)data; + retv_if(transfer_info == NULL, NULL); - info = gl_data->tr_data; - retv_if(info == NULL, NULL); + if (!strcmp(part, BT_SHARE_ITEM_PART_TRANSFER_TYPE_TITLE)) { + if (ad->tr_type == BT_TR_INBOUND) + return (transfer_info->success > 0) ? + g_strdup(BT_STR_FILE_RECEIVED) : + g_strdup(BT_STR_RECEIVING_FAILED); + else + return (transfer_info->success > 0) ? + g_strdup(BT_STR_FILE_SENT) : + g_strdup(BT_STR_SENDING_FAILED); + } else if (!strcmp(part, BT_SHARE_ITEM_PART_TRANSFER_STATUS)) { + char *stms_str = NULL; - if (!strcmp("elm.swallow.icon", part)) { - icon = elm_image_add(obj); - if (ad->tr_type == BT_TR_OUTBOUND) { - img = (info->tr_status == BT_TR_SUCCESS) ? - BT_ICON_SEND_PASS : BT_ICON_SEND_FAIL; - } else { - img = (info->tr_status == BT_TR_SUCCESS) ? - BT_ICON_RECV_PASS : BT_ICON_RECV_FAIL; - } + DBG_SECURE("Success %d, Failed %d", transfer_info->success, transfer_info->failed); + if (transfer_info->success == 0 && + transfer_info->failed == 0) + return NULL; + + stms_str = (ad->tr_type == BT_TR_INBOUND) ? BT_STR_PD_RECEIVED : BT_STR_PD_SENT; + tmp_success = g_strdup_printf(stms_str, transfer_info->success); + + stms_str = BT_STR_PD_FAILED; + tmp_failed = g_strdup_printf(stms_str, transfer_info->failed); + + ret_str = g_strdup_printf("%s, %s", tmp_success, tmp_failed); + + g_free(tmp_success); + g_free(tmp_failed); + return ret_str; + } + FN_END; + return NULL; +} - elm_image_file_set(icon, EDJ_IMAGES, img); - evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_min_set(icon, ELM_SCALE_SIZE(40), ELM_SCALE_SIZE(40)); +#if 0 +static char *__bt_tr_progress_label_get(void *data, Evas_Object *obj, + const char *part) +{ + FN_START; + retv_if(data == NULL, NULL); + bt_share_appdata_t *ad = (bt_share_appdata_t *)data; + char *markup_text = NULL; - evas_object_color_set(icon, 76, 76, 76 , 255); + retv_if(ad->transfer_info == NULL, NULL); - evas_object_show(icon); + if (!strcmp(part, BT_SHARE_ITEM_PART_PROGRESSBAR_FILE_NAME)) { + bt_share_transfer_data_t *transfer_info = ad->transfer_info; + markup_text = elm_entry_utf8_to_markup(transfer_info->filename); + DBG_SECURE("Filename: %s", markup_text); + return markup_text; } - return icon; + FN_END; + return NULL; +} +#endif + +static char *__bt_tr_file_title_label_get(void *data, Evas_Object *obj, + const char *part) +{ + FN_START; + if (!strcmp(part, BT_SHARE_ITEM_PART_FILE_LIST_TITLE)) { + DBG("File List"); + return g_strdup(BT_STR_FILE_LIST); + } + FN_END; + return NULL; } static char *__bt_tr_label_get(void *data, Evas_Object *obj, const char *part) { + FN_START; bt_tr_data_t *info = NULL; char *name = NULL; char buf[BT_GLOBALIZATION_STR_LENGTH] = { 0 }; - bt_gl_data_t *gl_data; - + bt_gl_data_t *gl_data = NULL; + char *markup_text = NULL; retv_if(data == NULL, NULL); gl_data = (bt_gl_data_t *)data; + retvm_if(gl_data == NULL, NULL, "gl_data is NULL!"); info = gl_data->tr_data; retv_if(info == NULL, NULL); - if (!strcmp("elm.text", part)) { + if (!strcmp(part, BT_SHARE_ITEM_PART_FILE_NAME)) { name = strrchr(info->file_path, '/'); if (name != NULL) name++; else name = info->file_path; + markup_text = elm_entry_utf8_to_markup(name); + + g_strlcpy(buf, markup_text, BT_GLOBALIZATION_STR_LENGTH); + } else if (!strcmp(part, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_TEXT)) { + DBG("info->tr_status : %d", info->tr_status); + if (info->tr_status == BT_TRANSFER_SUCCESS) { + if (gl_data->tr_inbound) + g_strlcpy(buf, BT_STR_RECEIVED, BT_GLOBALIZATION_STR_LENGTH); + else + g_strlcpy(buf, BT_STR_SENT, BT_GLOBALIZATION_STR_LENGTH); + } else if (info->tr_status == BT_TRANSFER_FAIL) { + g_strlcpy(buf, BT_STR_FAILED, BT_GLOBALIZATION_STR_LENGTH); + } else if (info->tr_status == BT_TRANSFER_ONGOING) { + if (gl_data->tr_inbound) + g_strlcpy(buf, BT_STR_RECEIVING, BT_GLOBALIZATION_STR_LENGTH); + else + g_strlcpy(buf, BT_STR_SENDING, BT_GLOBALIZATION_STR_LENGTH); + } else if (info->tr_status == BT_TRANSFER_PENDING) { + g_strlcpy(buf, BT_STR_WAITING, BT_GLOBALIZATION_STR_LENGTH); + } + } else if (!strcmp(part, BT_SHARE_ITEM_PART_FILE_SIZE)) { + char *size; + + if ((info->tr_status == BT_TRANSFER_ONGOING || + info->tr_status == BT_TRANSFER_PENDING) && gl_data->tr_inbound) + return NULL; + + if (info->size > 1024 * 1024 * 1024) { //GB + size = g_strdup_printf("%.2f GB", (float)info->size / (1024 * 1024 * 1024)); + } else if (info->size > 1024 * 1024) { //MB + size = g_strdup_printf("%.1f MB", (float)info->size / (1024 * 1024)); + } else if (info->size > 1024) { //KB + size = g_strdup_printf("%.1f KB", (float)info->size / (1024)); + } else { + size = g_strdup_printf("%d B", info->size); + } - g_strlcpy(buf, name, BT_GLOBALIZATION_STR_LENGTH); - } else if (!strcmp("elm.text.sub", part)) { - char *marked_name = elm_entry_utf8_to_markup(info->dev_name); - g_strlcpy(buf, marked_name, BT_GLOBALIZATION_STR_LENGTH); - if (marked_name) - free(marked_name); - } else if (!strcmp("elm.text.sub.end", part)) { - char *date = NULL; - date = __bt_get_tr_timedate((time_t)(info->timestamp)); - snprintf(buf, BT_GLOBALIZATION_STR_LENGTH, "%s", date); - g_free(date); + g_strlcpy(buf, size, BT_GLOBALIZATION_STR_LENGTH); + g_free(size); } else { DBG("empty text for label."); return NULL; } + if (markup_text) + free(markup_text); + FN_END; return strdup(buf); } @@ -376,6 +873,7 @@ static void __bt_tr_del(void *data, Evas_Object *obj) g_free(gl_data); } +#if 0 static void __bt_genlist_realized_cb(void *data, Evas_Object *obj, void *event_info) { @@ -416,33 +914,36 @@ static void __bt_genlist_realized_cb(void *data, #endif g_free(date); } +#endif static void __bt_popup_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - DBG("+"); + FN_START; retm_if(data == NULL, "data is NULL"); bt_share_appdata_t *ad = (bt_share_appdata_t *)data; - evas_object_del(ad->info_popup); - ad->info_popup = NULL; - DBG("-"); + if (ad->info_popup) { + evas_object_del(ad->info_popup); + ad->info_popup = NULL; + } + FN_END; } void __bt_popup_del_by_timeout(void *data, Evas_Object *obj, void *event_info) { - DBG("+"); + FN_START; bt_share_appdata_t *ad = (bt_share_appdata_t *)data; ret_if(!ad); - if (ad->info_popup){ + if (ad->info_popup) { evas_object_del(ad->info_popup); ad->info_popup = NULL; } - DBG("-"); + FN_END; } Evas_Object *__bt_create_error_popup(bt_share_appdata_t *ad) { - DBG("+"); + FN_START; Evas_Object *popup = NULL; retvm_if(ad == NULL, NULL, "ad is NULL"); @@ -461,13 +962,13 @@ Evas_Object *__bt_create_error_popup(bt_share_appdata_t *ad) ad->info_popup = popup; - DBG("-"); + FN_END; return popup; } -static gboolean __bt_open_received_file(const char *path) +static gboolean __bt_open_file(const char *path) { - DBG("+"); + FN_START; app_control_h handle; int ret; bt_share_appdata_t *ad = app_state; @@ -480,292 +981,237 @@ static gboolean __bt_open_received_file(const char *path) if (ret == APP_CONTROL_ERROR_APP_NOT_FOUND) __bt_create_error_popup(ad); - app_control_destroy(handle); - DBG("-"); - return TRUE; -} - -static gint __handle_compare(gconstpointer a, gconstpointer b) -{ - bt_tr_data_t *info = (bt_tr_data_t *)a; - int id = (int) b; - - if (info->id == id) - return 0; - else - return -1; -} - -static void __bt_remove_tr_data_node(bt_share_appdata_t *ad, int id) -{ - DBG("+"); - GSList *l = NULL; - bt_tr_data_t *info = NULL; - l = g_slist_find_custom(ad->tr_data_list, (gconstpointer)id, - __handle_compare); - if (l) { - info = l->data; - ad->tr_data_list = g_slist_remove(ad->tr_data_list, info); - } - - if (g_slist_length(ad->tr_data_list) == 0) { - _bt_nocontent_set(ad, TRUE); - ad->tr_genlist = NULL; - } -} - -void _bt_update_tr_notification(void *data) -{ - ret_if(data == NULL); - - bt_share_appdata_t *ad = app_state; - bt_tr_data_t *info = NULL; - sqlite3 *db = NULL; - int success = 0; - int fail = 0; - char *opp_role = NULL; - notification_h noti = NULL; - int priv_id = 0; - notification_list_h list_head = NULL; - notification_list_h list_traverse = NULL; - char *app_id = NULL; - - info = (bt_tr_data_t *)data; - - DBG("Transfer type: %s", ad->tr_type == BT_TR_INBOUND ? "Receive" : "Sent"); - - db = bt_share_open_db(); - if (!db) - return; - - if (ad->tr_type == BT_TR_INBOUND) - opp_role = "bluetooth-share-opp-server"; - else - opp_role = "bluetooth-share-opp-client"; - - - /* Delete selected outbound db / notification info */ - if (bt_share_remove_tr_data_by_id(db, ad->tr_type, info->id) == 0) - DBG("successfully TR ID removed from DB"); -#if 0 - bt_share_get_tr_result_count(db, ad->tr_type, &success, &fail); -#endif - DBG("success: %d, fail: %d", success, fail); - - /* Delete notification */ - notification_get_list(NOTIFICATION_TYPE_NOTI, -1, &list_head); - list_traverse = list_head; - - while (list_traverse != NULL) { - noti = notification_list_get_data(list_traverse); - notification_get_pkgname(noti, &app_id); - - if (g_strcmp0(app_id, opp_role) == 0) { - notification_get_id(noti, NULL, &priv_id); - break; - } - list_traverse = notification_list_get_next(list_traverse); - } - - if (success == 0 && fail == 0) - notification_delete_by_priv_id(app_id, NOTIFICATION_TYPE_NOTI, priv_id); -#if 0 - else { - char str[BT_GLOBALIZATION_STR_LENGTH] = { 0 }; - if (success == 1) { - stms_str = BT_STR_TR_1FILE_COPIED_STATUS; - snprintf(str, sizeof(str), stms_str, fail); - } else { - stms_str = BT_STR_TR_COPIED_STATUS; - snprintf(str, sizeof(str), stms_str, - success, fail); - } + app_control_destroy(handle); + FN_END; + return TRUE; +} - notification_set_content(noti, str, NULL); - notification_update(noti); - } -#endif - if (list_head != NULL) { - notification_free_list(list_head); - list_head = NULL; +static Elm_Object_Item * __bt_add_file_title_item(bt_share_appdata_t *ad) +{ + retvm_if(!ad, NULL, "ad is NULL!"); + retvm_if(!ad->tr_genlist, NULL, "tr_genlist is NULL!"); + retvm_if(ad->file_title_item, NULL, "file_title_item is exist"); + + Elm_Object_Item *git = NULL; + git = elm_genlist_item_append(ad->tr_genlist, + ad->tr_file_title_itc, NULL, + NULL, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + + if (git == NULL) { + ERR("elm_genlist_item_append is failed!"); + } else { + elm_genlist_item_select_mode_set(git, + ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + ad->file_title_item = git; } - bt_share_close_db(db); + return git; } -static void __bt_tr_data_recv_item_sel(void *data, Evas_Object *obj, - void *event_info) +static void __bt_tr_data_item_sel(void *data, Evas_Object *obj, void *event_info) { bt_share_appdata_t *ad = app_state; + bt_gl_data_t *gl_data = (bt_gl_data_t *) data; bt_tr_data_t *info = NULL; char *path = NULL; char *ext = NULL; int default_memory = 0; - DBG("Select received item"); - ret_if(data == NULL); ret_if(event_info == NULL); - info = (bt_tr_data_t *)data; - __bt_remove_tr_data_node(ad, info->id); - - ad->selected_item = (Elm_Object_Item *)event_info; - elm_genlist_item_selected_set((Elm_Object_Item *)event_info, - EINA_FALSE); + FN_START; - if (info->tr_status == BT_TR_SUCCESS) { - ret_if(info->file_path == NULL); - INFO_SECURE("File : %s", info->file_path); - if (vconf_get_int(VCONFKEY_SETAPPL_DEFAULT_MEM_BLUETOOTH_INT, - &default_memory) != 0) { - ERR("vconf get failed"); - } - path = info->file_path; - INFO_SECURE("path : %s", path); - ext = strrchr(path, '.'); - if (ext) { - ext++; - if (0 == g_strcmp0(ext, "vcf")) { - ad->ft_popup = _bt_create_ft_popup( - BT_FT_RECV_SUCCESS_POPUP, info); - return; - } - } + elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE); - if (access(path, F_OK) == 0) { - __bt_open_received_file(path); - if (ad->bt_status == BT_ADAPTER_DISABLED) { - _bt_update_tr_notification(info); - _bt_delete_selected_item(ad); - } else { /*Adapter enabled case */ - _bt_share_ui_ipc_info_update(ad, info->id); - _bt_delete_selected_item(ad); + info = gl_data->tr_data; + retm_if(info->file_path == NULL, "File Path is NULL"); + + ext = strrchr(info->file_path, '.'); + if (ext++) { + if (0 == g_strcmp0(ext, "vcf")) { + if (gl_data->tr_inbound == true) { + if (info->tr_status == BT_TRANSFER_SUCCESS) + _bt_create_info_popup(ad, BT_STR_RECEIVED_VCF_FILE_ALREADY_IMPORTED_TO_CONTACTS); + } else { + _bt_create_info_popup(ad, BT_STR_VCF_FILES_ARE_TEMPORARY_AND_CANT_BE_OPENED); } - } else { - ad->ft_popup = _bt_create_ft_popup(BT_FT_FILE_NOT_EXIST, - info); - _bt_share_ui_ipc_info_update(ad, info->id); - _bt_delete_selected_item(ad); + return; } - - } else { - ad->ft_popup = _bt_create_ft_popup(BT_FT_RECV_FAIL_POPUP, info); } - return; -} + if (gl_data->tr_inbound == true) { + if (info->tr_status == BT_TRANSFER_SUCCESS) { + if (vconf_get_int(VCONFKEY_SETAPPL_DEFAULT_MEM_BLUETOOTH_INT, &default_memory) != 0) + ERR("vconf get failed"); -static void __bt_tr_data_sent_item_sel(void *data, Evas_Object *obj, - void *event_info) -{ - DBG("+"); - bt_share_appdata_t *ad = app_state; - bt_tr_data_t *info = NULL; + if (default_memory == BT_DEFAULT_MEM_PHONE) + path = g_strdup_printf("%s/%s", BT_DOWNLOAD_PHONE_FOLDER, info->file_path); + else if (default_memory == BT_DEFAULT_MEM_MMC) + path = g_strdup_printf("%s/%s", BT_DOWNLOAD_MMC_FOLDER, info->file_path); - ret_if(data == NULL); - ret_if(event_info == NULL); + INFO_SECURE("path : %s", path); - info = (bt_tr_data_t *)data; - ad->selected_item = (Elm_Object_Item *)event_info; - elm_genlist_item_selected_set((Elm_Object_Item *)event_info, - EINA_FALSE); + if (access(path, F_OK) == 0) + __bt_open_file(path); + else + _bt_create_info_popup(ad, BT_STR_FILE_NOT_EXIST); - if (info->tr_status == BT_TR_SUCCESS) - ad->ft_popup = _bt_create_ft_popup(BT_FT_SENT_POPUP, info); - else - ad->ft_popup = _bt_create_ft_popup(BT_FT_RETRY_POPUP, info); + g_free(path); + } + } else { + path = info->file_path; + INFO_SECURE("path : %s", path); - DBG("-"); - return; + if (access(path, F_OK) == 0) { + if (g_str_has_prefix(path, BT_CONTACT_SHARE_TMP_DIR) == TRUE) + /* TODO: change to proper string when UX is updated */ + _bt_create_info_popup(ad, BT_STR_FILE_NOT_EXIST); + else + __bt_open_file(path); + } else { + _bt_create_info_popup(ad, BT_STR_FILE_NOT_EXIST); + } + } + + FN_END; } -void _bt_append_genlist_tr_data_item(bt_share_appdata_t *ad, +void _bt_genlist_prepend_tr_data_item(bt_share_appdata_t *ad, Evas_Object *genlist, bt_tr_data_t *info, int tr_type) { - DBG("+"); - - retm_if (ad == NULL || info == NULL, "Invalid parameters!"); + FN_START; + retm_if(ad == NULL || info == NULL, "Invalid parameters!"); + retm_if(ad->tr_data_itc == NULL, "ad->tr_data_itc is NULL!"); bt_gl_data_t *gl_data = NULL; gl_data = g_new0(bt_gl_data_t, 1); gl_data->tr_data = info; + DBG("info->tr_status : %d", info->tr_status); + if (tr_type == BT_TR_OUTBOUND || tr_type == BT_TR_INBOUND) { + if (info->tr_status == BT_TRANSFER_SUCCESS) + ad->transfer_info->success++; + else if (info->tr_status == BT_TRANSFER_FAIL) + ad->transfer_info->failed++; + } if (tr_type == BT_TR_OUTBOUND) { - elm_genlist_item_append(genlist, ad->tr_data_itc, gl_data, - NULL, ELM_GENLIST_ITEM_NONE, - __bt_tr_data_sent_item_sel, info); + gl_data->tr_inbound = false; if (ad->outbound_latest_id < info->id) ad->outbound_latest_id = info->id; } else if (tr_type == BT_TR_INBOUND) { - elm_genlist_item_append(genlist, ad->tr_data_itc, gl_data, - NULL, ELM_GENLIST_ITEM_NONE, - __bt_tr_data_recv_item_sel, info); + gl_data->tr_inbound = true; if (ad->inbound_latest_id < info->id) ad->inbound_latest_id = info->id; - } else { - ERR("Transfer type is invalid"); } + elm_genlist_item_append(genlist, ad->tr_data_itc, gl_data, NULL, + ELM_GENLIST_ITEM_NONE, __bt_tr_data_item_sel, gl_data); + evas_object_show(genlist); - DBG("-"); + FN_END; } +void __bt_update_transfer_count(bt_share_appdata_t *ad, bt_tr_data_t *info) +{ + if (info->tr_status == BT_TRANSFER_SUCCESS) + ad->transfer_info->success++; + else + ad->transfer_info->failed++; + + if (ad->status_item) + elm_genlist_item_fields_update(ad->status_item, "*", + ELM_GENLIST_ITEM_FIELD_TEXT); +} -void _bt_prepend_genlist_tr_data_item(bt_share_appdata_t *ad, +void _bt_genlist_append_tr_data_item(bt_share_appdata_t *ad, bt_tr_data_t *info, int tr_type) { - DBG("+"); + FN_START; - if (ad == NULL || info == NULL) - return; + ret_if(ad == NULL || info == NULL); + ret_if(ad->tr_data_itc == NULL); + ret_if(ad->tr_genlist == NULL); + + Elm_Object_Item *git = NULL; if (elm_genlist_items_count(ad->tr_genlist) == 0) { - _bt_nocontent_set(ad, FALSE); + Evas_Object *genlist = NULL; + Elm_Object_Item *navi_it = NULL; + + genlist = __bt_add_tr_data_genlist(ad->tr_view, ad); + retm_if(genlist == NULL, "genlist is NULL!"); + + if (ad->tr_genlist) { + DBG("Clear the previous genlist"); + elm_genlist_clear(ad->tr_genlist); + ad->tr_genlist = NULL; + } + + ad->tr_genlist = genlist; + + if (ad->navi_it) { + elm_object_item_part_content_set(ad->navi_it, + "elm.swallow.content", genlist); + } else { + navi_it = elm_naviframe_item_push(ad->navi_fr, NULL, + NULL, NULL, genlist, NULL); + if (navi_it) + elm_object_item_domain_translatable_text_set(navi_it, + BT_COMMON_PKG, + (ad->tr_type == BT_TR_INBOUND) ? + "IDS_ST_HEADER_RECEIVE" : "IDS_ST_HEADER_SEND"); + elm_naviframe_item_pop_cb_set(navi_it, __bt_back_button_cb, ad); + ad->navi_it = navi_it; + } + return; } - bt_gl_data_t *gl_data; + if (!ad->file_title_item) { + retm_if(NULL == __bt_add_file_title_item(ad), + "__bt_add_file_title_item is failed"); + } + bt_gl_data_t *gl_data = NULL; gl_data = g_new0(bt_gl_data_t, 1); gl_data->tr_data = info; if (tr_type == BT_TR_OUTBOUND) { - elm_genlist_item_prepend(ad->tr_genlist, ad->tr_data_itc, - gl_data, NULL, - ELM_GENLIST_ITEM_NONE, - __bt_tr_data_sent_item_sel, info); + gl_data->tr_inbound = false; if (ad->outbound_latest_id < info->id) ad->outbound_latest_id = info->id; } else if (tr_type == BT_TR_INBOUND) { - elm_genlist_item_prepend(ad->tr_genlist, ad->tr_data_itc, - gl_data, NULL, - ELM_GENLIST_ITEM_NONE, - __bt_tr_data_recv_item_sel, info); + gl_data->tr_inbound = true; if (ad->inbound_latest_id < info->id) ad->inbound_latest_id = info->id; - } else { - ERR("Transfer type is invalid"); - g_free(gl_data); } + git = elm_genlist_item_append(ad->tr_genlist, ad->tr_data_itc, gl_data, + NULL, ELM_GENLIST_ITEM_NONE, __bt_tr_data_item_sel, gl_data); + + __bt_update_transfer_count(ad, info); + + if (info->tr_status == BT_TRANSFER_ONGOING) + ad->current_item = git; + evas_object_show(ad->tr_genlist); - DBG("-"); - return; + FN_END; } static void __bt_share_gl_highlighted(void *data, Evas_Object *obj, void *event_info) { + FN_START; Elm_Object_Item *item = (Elm_Object_Item *)event_info; bt_gl_data_t *gl_data; - DBG("+"); ret_if(item == NULL); @@ -777,15 +1223,15 @@ static void __bt_share_gl_highlighted(void *data, Evas_Object *obj, elm_genlist_item_fields_update(item, "*", ELM_GENLIST_ITEM_FIELD_CONTENT); - DBG("-"); + FN_END; } static void __bt_share_gl_unhighlighted(void *data, Evas_Object *obj, void *event_info) { + FN_START; Elm_Object_Item *item = (Elm_Object_Item *)event_info; bt_gl_data_t *gl_data; - DBG("+"); ret_if(item == NULL); @@ -796,14 +1242,14 @@ static void __bt_share_gl_unhighlighted(void *data, Evas_Object *obj, elm_genlist_item_fields_update(item, "*", ELM_GENLIST_ITEM_FIELD_CONTENT); - DBG("-"); + FN_END; } static Evas_Object *__bt_add_tr_data_genlist(Evas_Object *parent, bt_share_appdata_t *ad) { - DBG("+"); - retvm_if (ad == NULL, NULL, "Inavalid parameter!"); + FN_START; + retvm_if(ad == NULL, NULL, "Inavalid parameter!"); Evas_Object *genlist = elm_genlist_add(parent); @@ -813,8 +1259,42 @@ static Evas_Object *__bt_add_tr_data_genlist(Evas_Object *parent, evas_object_smart_callback_add(genlist, "unhighlighted", __bt_share_gl_unhighlighted, ad); - evas_object_smart_callback_add(genlist, "realized", - __bt_genlist_realized_cb, ad); + elm_genlist_homogeneous_set(genlist, EINA_TRUE); + ad->tr_device_itc = elm_genlist_item_class_new(); + if (ad->tr_device_itc) { + ad->tr_device_itc->item_style = "type1"; + ad->tr_device_itc->func.text_get = __bt_tr_device_label_get; + ad->tr_device_itc->func.content_get = NULL; + ad->tr_device_itc->func.state_get = NULL; + ad->tr_device_itc->func.del = NULL; + } + + ad->tr_status_itc = elm_genlist_item_class_new(); + if (ad->tr_status_itc) { + ad->tr_status_itc->item_style = "type1"; + ad->tr_status_itc->func.text_get = __bt_tr_status_label_get; + ad->tr_status_itc->func.content_get = NULL; + ad->tr_status_itc->func.state_get = NULL; + ad->tr_status_itc->func.del = NULL; + } + + ad->tr_progress_itc = elm_genlist_item_class_new(); + if (ad->tr_progress_itc) { + ad->tr_progress_itc->item_style = "full"; + ad->tr_progress_itc->func.text_get = NULL; + ad->tr_progress_itc->func.content_get = __bt_tr_progress_icon_get; + ad->tr_progress_itc->func.state_get = NULL; + ad->tr_progress_itc->func.del = NULL; + } + + ad->tr_file_title_itc = elm_genlist_item_class_new(); + if (ad->tr_file_title_itc) { + ad->tr_file_title_itc->item_style = "groupindex"; + ad->tr_file_title_itc->func.text_get = __bt_tr_file_title_label_get; + ad->tr_file_title_itc->func.content_get = NULL; + ad->tr_file_title_itc->func.state_get = NULL; + ad->tr_file_title_itc->func.del = NULL; + } ad->tr_data_itc = elm_genlist_item_class_new(); if (ad->tr_data_itc) { @@ -826,14 +1306,14 @@ static Evas_Object *__bt_add_tr_data_genlist(Evas_Object *parent, } elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); - DBG("-"); + FN_END; return genlist; } static Evas_Object * __bt_create_naviframe(bt_share_appdata_t *ad) { - DBG("+"); - retv_if (ad == NULL, NULL); + FN_START; + retv_if(ad == NULL, NULL); Evas_Object *navi_fr = NULL; /* Naviframe */ navi_fr = elm_naviframe_add(ad->tr_view); @@ -841,237 +1321,313 @@ static Evas_Object * __bt_create_naviframe(bt_share_appdata_t *ad) eext_naviframe_back_cb, NULL); elm_object_part_content_set(ad->tr_view, "elm.swallow.content", navi_fr); evas_object_show(navi_fr); - DBG("-"); + FN_END; return navi_fr; } -void _bt_nocontent_set(bt_share_appdata_t *ad, gboolean set) +void _bt_cb_state_changed(int result, + bt_adapter_state_e adapter_state, + void *user_data) { - DBG("+"); - ret_if(ad == NULL); - Evas_Object *layout = NULL; - Evas_Object *nocontents = NULL; - Evas_Object *genlist = NULL; - Elm_Object_Item *navi_it = NULL; + FN_START; + DBG("bluetooth %s", adapter_state == BT_ADAPTER_ENABLED ? + "enabled" : "disabled"); - DBG("Set nocontent status : %d", set); + ret_if(!user_data); + ret_if(result != BT_ERROR_NONE); - if (set == TRUE) { - /* Full view layout */ - layout = elm_layout_add(ad->navi_fr); - elm_layout_file_set(layout, EDJFILE, "nocontents_layout"); - evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + bt_share_appdata_t *ad = (bt_share_appdata_t *)user_data; - /* Create elm_layout and set its style as nocontents/text */ - nocontents = elm_layout_add(layout); - elm_layout_theme_set(nocontents, "layout", "nocontents", "default"); - evas_object_size_hint_weight_set(nocontents, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(nocontents, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_object_part_text_set(nocontents, "elm.text", BT_STR_NO_TRANSFER_HISTORY); - elm_layout_signal_emit(nocontents, "text,disabled", ""); - elm_layout_signal_emit(nocontents, "align.center", "elm"); + ad->bt_status = adapter_state; - if (ad->navi_it) { - elm_object_item_part_content_set(ad->navi_it, - "elm.swallow.content", nocontents); - } else { - navi_it = elm_naviframe_item_push(ad->navi_fr, - (ad->tr_type == BT_TR_INBOUND) ? - BT_STR_RECEIVED_FILES : - BT_STR_SENT_FILES, - NULL, NULL, nocontents, NULL); - elm_naviframe_item_pop_cb_set(navi_it, - __bt_back_button_cb, ad); - ad->navi_it = navi_it; + if (adapter_state == BT_ADAPTER_ENABLED && ad->send_after_turning_on) { + DBG("Adapter enabled, resend pending items"); + /* close turning on popup */ + if (ad->turning_on_popup) { + evas_object_del(ad->turning_on_popup); + ad->turning_on_popup = NULL; } - if (ad->toolbar_btn) { - evas_object_del(ad->toolbar_btn); - ad->toolbar_btn = NULL; + _bt_share_ui_retry_failed(ad); + if (ad->launch_mode == BT_LAUNCH_TRANSFER_LIST) { + int noti_id; + char *opp_role; + bt_tr_db_table_e table; + + __bt_get_noti_id_opp_role_and_table(ad, ¬i_id, &opp_role, &table); + + DBG_SECURE("Notification ID: %d", noti_id); + if (noti_id < 0) { + ERR("Invalid Notification ID"); + } else { + sqlite3 *db = bt_share_open_db(); + bt_share_remove_tr_data_by_notification(db, table, noti_id); + bt_share_close_db(db); + _bt_delete_selected_notification(ad->tr_type, noti_id, opp_role); + } } - eext_object_event_callback_del(ad->navi_fr, EEXT_CALLBACK_MORE, - __bt_more_menu_cb); - }else { - genlist = __bt_add_tr_data_genlist(ad->tr_view, ad); - retm_if (genlist == NULL, "genlist is NULL!"); + ad->send_after_turning_on = FALSE; + _bt_terminate_app(); + } + FN_END; +} - if (ad->tr_genlist) { - DBG("Clear the previous genlist"); - elm_genlist_clear(ad->tr_genlist); - ad->tr_genlist = NULL; - } +gboolean __bt_share_is_battery_low(void) +{ + FN_START; - ad->tr_genlist = genlist; + int value = 0; + int charging = 0; - if (ad->navi_it) { - elm_object_item_part_content_set(ad->navi_it, - "elm.swallow.content", genlist); - } else { - navi_it = elm_naviframe_item_push(ad->navi_fr, - (ad->tr_type == BT_TR_INBOUND) ? - BT_STR_RECEIVED_FILES : - BT_STR_SENT_FILES, - NULL, NULL, genlist, NULL); - elm_naviframe_item_pop_cb_set(navi_it, __bt_back_button_cb, ad); - ad->navi_it = navi_it; - } + if (vconf_get_int(VCONFKEY_SYSMAN_BATTERY_CHARGE_NOW, (void *)&charging)) + ERR("Get the battery charging status fail"); - eext_object_event_callback_add(ad->navi_fr, EEXT_CALLBACK_MORE, - __bt_more_menu_cb, ad); - } -} + if (charging == 1) + return FALSE; -void _bt_cb_state_changed(int result, - bt_adapter_state_e adapter_state, - void *user_data) -{ - DBG("bluetooth %s", adapter_state == BT_ADAPTER_ENABLED ? - "enabled" : "disabled"); + DBG("charging: %d", charging); - ret_if(!user_data); - ret_if(result != BT_ERROR_NONE); + if (vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, (void *)&value)) { + ERR("Get the battery low status fail"); + return FALSE; + } - bt_share_appdata_t *ad = (bt_share_appdata_t *)user_data; - Evas_Object *btn = NULL; + if (value <= VCONFKEY_SYSMAN_BAT_POWER_OFF) + return TRUE; - ad->bt_status = adapter_state; + FN_END; + return FALSE; +} - if (ad->ft_popup && ad->ft_type == BT_FT_RETRY_POPUP) { - btn = elm_object_part_content_get(ad->ft_popup, "button1"); - ret_if(!btn); - elm_object_text_set(btn, adapter_state == BT_ADAPTER_ENABLED ? BT_STR_RETRY : BT_STR_OK); +int _bt_share_enable_bt(bt_share_appdata_t *ad) +{ + FN_START; + int ret; + retv_if(ad == NULL, -1); +/* + if (__bt_share_is_battery_low() == TRUE) { + // Battery is critical low + _bt_main_create_information_popup(ad, BT_STR_LOW_BATTERY); + return -1; } +*/ - if(adapter_state == BT_ADAPTER_DISABLED && ad->progress_popup) { - DBG("Adapter disabled, and progress popup is present, destroying"); - _bt_destroy_progress_popup(ad); + ret = bt_adapter_enable(); + if (ret == BT_ERROR_ALREADY_DONE) { + _bt_cb_state_changed(BT_ERROR_NONE, BT_ADAPTER_ENABLED, ad); + } else if (ret == BT_ERROR_NOW_IN_PROGRESS) { + ERR("Enabling in progress [%d]", ret); + } else if (ret != BT_ERROR_NONE) { + ERR("Failed to enable bluetooth [%d]", ret); + } else { + ad->turning_on_popup = _bt_share_add_turning_on_popup(ad); + ad->send_after_turning_on = TRUE; } + FN_END; + return 0; } -static void __bt_move_clear_ctxpopup(Evas_Object *ctxpopup, - bt_share_appdata_t *ad) +void _bt_share_toolbar_button_cb(void *data, Evas_Object *obj, + void *event_info) { FN_START; - Evas_Coord w, h; - int pos = -1; - - ret_if(ad == NULL); - ret_if(ad->win == NULL); + ret_if(!data); + bt_share_appdata_t *ad = (bt_share_appdata_t *)data; + bt_share_abort_data_t *abort_data = g_new0(bt_share_abort_data_t, 1); - elm_win_screen_size_get(ad->win, NULL, NULL, &w, &h); - pos = elm_win_rotation_get(ad->win); + const char *text = elm_object_text_get(obj); - switch (pos) { - case 0: - case 180: - evas_object_move(ctxpopup, (w / 2), h); - break; - case 90: - evas_object_move(ctxpopup, (h / 2), w); - break; - case 270: - evas_object_move(ctxpopup, (h / 2), w); - break; + if (g_strcmp0(text, BT_STR_STOP) == 0) { + if (ad->transfer_info) { + abort_data->transfer_id = ad->transfer_info->transfer_id; + abort_data->transfer_type = ad->transfer_info->transfer_type; + _bt_abort_signal_send(ad, abort_data); + } + } else if (g_strcmp0(text, BT_STR_RESEND_FAILED_FILES) == 0) { + /* for BT off case */ + if (ad->bt_status == BT_ADAPTER_DISABLED) { + _bt_share_enable_bt(ad); + } else { + _bt_share_ui_retry_failed(ad); + if (ad->launch_mode == BT_LAUNCH_TRANSFER_LIST) { + int noti_id; + char *opp_role; + bt_tr_db_table_e table; + + __bt_get_noti_id_opp_role_and_table(ad, ¬i_id, &opp_role, &table); + + DBG_SECURE("Notification ID: %d", noti_id); + if (noti_id < 0) { + ERR("Invalid Notification ID"); + } else { + sqlite3 *db = bt_share_open_db(); + bt_share_remove_tr_data_by_notification(db, table, noti_id); + bt_share_close_db(db); + _bt_delete_selected_notification(ad->tr_type, noti_id, opp_role); + } + } + _bt_terminate_app(); } + } + + g_free(abort_data); FN_END; } -void __bt_clear_btn_del_cb(void *data, Evas_Object *obj, void *event_info) +Evas_Object * _bt_share_create_toolbar_button(bt_share_appdata_t *ad, char *text) { - FN_START; - bt_share_appdata_t *ad = NULL; + Evas_Object *layout = NULL; + Evas_Object *toolbar_button = NULL; - ret_if(data == NULL); - ad = (bt_share_appdata_t *)data; + layout = elm_layout_add(ad->navi_fr); + elm_layout_file_set(layout, EDJFILE, "toolbar_button_ly"); - if (ad->toolbar_btn != NULL) { - evas_object_del(ad->toolbar_btn); - ad->toolbar_btn = NULL; - } + toolbar_button = elm_button_add(layout); - FN_END; + /* Use "bottom" style button */ + elm_object_style_set(toolbar_button, "bottom"); + evas_object_size_hint_weight_set(toolbar_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(toolbar_button, EVAS_HINT_FILL, 0.5); + + elm_object_text_set(toolbar_button, text); + + evas_object_smart_callback_add(toolbar_button, "clicked", + _bt_share_toolbar_button_cb, ad); + + /* Set button into "toolbar" swallow part */ + elm_object_part_content_set(layout, "button", toolbar_button); + elm_object_item_part_content_set(ad->navi_it, "toolbar", layout); + ad->toolbar_ly = layout; + return toolbar_button; } -static void __bt_win_rotation_changed_cb(void *data, Evas_Object *obj, - void *event_info) +void _bt_share_delete_toolbar_button(bt_share_appdata_t *ad) { - bt_share_appdata_t *ad = (bt_share_appdata_t *)data; - __bt_move_clear_ctxpopup(ad->toolbar_btn, ad); + FN_START; + ret_if(!ad); + + if (ad->toolbar_button) { + evas_object_del(ad->toolbar_button); + ad->toolbar_button = NULL; + } + if (ad->toolbar_ly) { + evas_object_del(ad->toolbar_ly); + ad->toolbar_ly = NULL; + } + FN_END; } -static void __bt_clear_btn_delete_cb(void *data, Evas *e, - Evas_Object *obj, void *event_info) +static Eina_Bool __bt_list_item_add(bt_share_appdata_t *ad) { FN_START; - Evas_Object *navi = (Evas_Object *)data; - Evas_Object *ctx = obj; + int i; - ret_if (navi == NULL); + retv_if(!ad, EINA_FALSE); + GSList *tr_data_list = ad->tr_data_list; + retv_if(ad->launch_mode == BT_LAUNCH_TRANSFER_LIST && !tr_data_list, EINA_FALSE); + + /* Add first 5 genlist items */ + for (i = 0; NULL != tr_data_list && i < 5; i++) { + _bt_genlist_prepend_tr_data_item(ad, ad->tr_genlist, tr_data_list->data, + ad->tr_type); + tr_data_list = g_slist_next(tr_data_list); + } + + if (ad->launch_mode == BT_LAUNCH_TRANSFER_LIST && + ad->tr_type == BT_TR_OUTBOUND && ad->transfer_info->failed) { + ad->toolbar_button = _bt_share_create_toolbar_button(ad, + BT_STR_RESEND_FAILED_FILES); + } - evas_object_event_callback_del_full(ctx, EVAS_CALLBACK_DEL, - __bt_clear_btn_delete_cb, navi); FN_END; + + return EINA_TRUE; } -static void __bt_more_menu_cb(void *data, - Evas_Object *obj, void *event_info) +static Eina_Bool __bt_list_item_idler(void *data) { FN_START; - Evas_Object *more_ctxpopup = NULL; - bt_share_appdata_t *ad; + bt_share_appdata_t *ad = (bt_share_appdata_t *)data; - ad = (bt_share_appdata_t *)data; - ret_if(ad == NULL); + retv_if(!ad, EINA_FALSE); + GSList *tr_data_list = ad->tr_data_list; + retv_if(ad->launch_mode == BT_LAUNCH_TRANSFER_LIST && !tr_data_list, EINA_FALSE); + + DBG("Total Items in List : %d", g_slist_length(tr_data_list)); + /* Add rest of the genlist items */ + if (g_slist_length(ad->tr_data_list) >= 5) { + tr_data_list = g_slist_nth(ad->tr_data_list, 5); + + while (NULL != tr_data_list) { + _bt_genlist_prepend_tr_data_item(ad, ad->tr_genlist, tr_data_list->data, + ad->tr_type); + tr_data_list = g_slist_next(tr_data_list); + } + } + + if (ad->launch_mode == BT_LAUNCH_TRANSFER_LIST && + ad->tr_type == BT_TR_OUTBOUND && + ad->transfer_info->failed && + ad->toolbar_button == NULL) { + ad->toolbar_button = _bt_share_create_toolbar_button(ad, + BT_STR_RESEND_FAILED_FILES); + } + + /* Delete the notification */ + /* TODO: Delete Notification only if + * transfer(sent) is completed with no failed items or received screen related to this session */ + if (ad->launch_mode == BT_LAUNCH_TRANSFER_LIST && + ((ad->tr_type == BT_TR_OUTBOUND && + ad->transfer_info->failed == 0) || ad->tr_type == BT_TR_INBOUND)) { + int noti_id; + char *opp_role; + bt_tr_db_table_e table; + + __bt_get_noti_id_opp_role_and_table(ad, ¬i_id, &opp_role, &table); + + DBG_SECURE("Notification ID: %d", noti_id); + if (noti_id < 0) { + ERR("Invalid Notification ID"); + } else { + if (ad->bt_status == BT_ADAPTER_DISABLED) { + sqlite3 *db = bt_share_open_db(); + bt_share_remove_tr_data_by_notification(db, table, noti_id); + bt_share_close_db(db); + } + _bt_delete_selected_notification(ad->tr_type, noti_id, opp_role); + } + } - more_ctxpopup = elm_ctxpopup_add(ad->win); - ad->toolbar_btn = more_ctxpopup; - eext_object_event_callback_add(more_ctxpopup, - EEXT_CALLBACK_BACK, __bt_clear_btn_del_cb, ad); - eext_object_event_callback_add(more_ctxpopup, - EEXT_CALLBACK_MORE, __bt_clear_btn_del_cb, ad); - elm_object_style_set(more_ctxpopup, "more/default"); - elm_ctxpopup_auto_hide_disabled_set(more_ctxpopup, EINA_TRUE); - - elm_ctxpopup_item_append(more_ctxpopup, BT_STR_CLR_LIST, - NULL, __bt_clear_list_btn_cb, ad); - evas_object_smart_callback_add(ad->win, "rotation,changed", - __bt_win_rotation_changed_cb, ad); - evas_object_event_callback_add(more_ctxpopup, EVAS_CALLBACK_DEL, - __bt_clear_btn_delete_cb, ad); - - elm_ctxpopup_direction_priority_set(more_ctxpopup, ELM_CTXPOPUP_DIRECTION_UP, - ELM_CTXPOPUP_DIRECTION_DOWN, - ELM_CTXPOPUP_DIRECTION_UNKNOWN, - ELM_CTXPOPUP_DIRECTION_UNKNOWN); - - __bt_move_clear_ctxpopup(more_ctxpopup, ad); - evas_object_show(more_ctxpopup); + if (ad->status_item) + elm_genlist_item_fields_update(ad->status_item, "*", + ELM_GENLIST_ITEM_FIELD_TEXT); FN_END; + return EINA_FALSE; } + int _bt_create_transfer_view(bt_share_appdata_t *ad) { - DBG("Create transfer view"); - retv_if (ad == NULL, -1); + FN_START; + retv_if(ad == NULL, -1); Elm_Object_Item *navi_it = NULL; + Elm_Object_Item *git = NULL; Evas_Object *conform = NULL; Evas_Object *navi_fr = NULL; Evas_Object *bg = NULL; Evas_Object *layout = NULL; Evas_Object *genlist = NULL; - GSList *list_iter = NULL; __bt_clear_view(ad); bg = _bt_create_bg(ad->win, NULL); - retv_if (bg == NULL, -1); + retv_if(bg == NULL, -1); ad->bg = bg; conform = _bt_create_conformant(ad->win, NULL); - retvm_if (conform == NULL, -1, "conform is NULL!"); + retvm_if(conform == NULL, -1, "conform is NULL!"); ad->conform = conform; bg = elm_bg_add(conform); @@ -1086,33 +1642,82 @@ int _bt_create_transfer_view(bt_share_appdata_t *ad) elm_win_conformant_set(ad->win, EINA_TRUE); navi_fr = __bt_create_naviframe(ad); - retvm_if (navi_fr == NULL, -1, "navi_fr is NULL!"); + retvm_if(navi_fr == NULL, -1, "navi_fr is NULL!"); ad->navi_fr = navi_fr; /* Genlist */ genlist = __bt_add_tr_data_genlist(layout, ad); - retvm_if (genlist == NULL, -1, "genlist is NULL!"); + retvm_if(genlist == NULL, -1, "genlist is NULL!"); ad->tr_genlist = genlist; - list_iter = ad->tr_data_list; + git = elm_genlist_item_append(genlist, + ad->tr_device_itc, ad, + NULL, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + if (git == NULL) { + ERR("elm_genlist_item_append is failed!"); + } else { + elm_genlist_item_select_mode_set(git, + ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + ad->device_item = git; + } - /* Add genlist item */ - while (NULL != list_iter) { - _bt_append_genlist_tr_data_item(ad, genlist, list_iter->data, - ad->tr_type); - list_iter = g_slist_next(list_iter); - } - eext_object_event_callback_add(navi_fr, EEXT_CALLBACK_MORE, - __bt_more_menu_cb, ad); - navi_it = elm_naviframe_item_push(navi_fr, - (ad->tr_type == BT_TR_INBOUND) ? - BT_STR_RECEIVED_FILES : - BT_STR_SENT_FILES, + if (ad->launch_mode == BT_LAUNCH_TRANSFER_LIST) { + git = elm_genlist_item_append(genlist, + ad->tr_status_itc, ad, + NULL, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + if (git == NULL) { + ERR("elm_genlist_item_append is failed!"); + } else { + elm_genlist_item_select_mode_set(git, + ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + ad->status_item = git; + } + } else if (ad->launch_mode == BT_LAUNCH_ONGOING) { + if (ad->progress_item) { + elm_object_item_del(ad->progress_item); + ad->progress_item = NULL; + ad->progressbar = NULL; + } + + git = elm_genlist_item_append(genlist, + ad->tr_progress_itc, ad, + NULL, ELM_GENLIST_ITEM_NONE, + NULL, NULL); + if (git == NULL) { + ERR("elm_genlist_item_append is failed!"); + } else { + elm_genlist_item_select_mode_set(git, + ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + ad->progress_item = git; + } + } + + __bt_add_file_title_item(ad); + + navi_it = elm_naviframe_item_push(navi_fr, NULL, NULL, NULL, genlist, NULL); - elm_naviframe_item_pop_cb_set(navi_it, __bt_back_button_cb, ad); - ad->navi_it = navi_it; + if (navi_it == NULL) { + ERR("elm_naviframe_item_push is failed!"); + } else { + elm_object_item_domain_translatable_text_set(navi_it, BT_COMMON_PKG, + (ad->tr_type == BT_TR_INBOUND) ? "IDS_ST_HEADER_RECEIVE" : "IDS_ST_HEADER_SEND"); + elm_naviframe_item_pop_cb_set(navi_it, __bt_back_button_cb, ad); + ad->navi_it = navi_it; + } - DBG("-"); + if (ad->launch_mode == BT_LAUNCH_ONGOING) { + ad->toolbar_button = _bt_share_create_toolbar_button(ad, + BT_STR_STOP); + } + + __bt_list_item_add(ad); + + ad->idler = ecore_idler_add(__bt_list_item_idler, ad); + if (!ad->idler) + ERR("idler can not be added"); + + FN_END; return 0; } - diff --git a/src/bt-share-ui-view.h b/src/bt-share-ui-view.h index e221d8d..7cfb651 100644 --- a/src/bt-share-ui-view.h +++ b/src/bt-share-ui-view.h @@ -36,20 +36,32 @@ extern "C" { #define BT_GLOBALIZATION_STR_LENGTH 256 #define BT_FILE_NAME_LEN_MAX 255 +#define BT_ANI_UPLOAD "bt_share_upload" +#define BT_ANI_DOWNLOAD "bt_share_download" Evas_Object *_bt_create_win(const char *name); void _bt_terminate_app(void); -void _bt_append_genlist_tr_data_item(bt_share_appdata_t *ad, +void _bt_genlist_prepend_tr_data_item(bt_share_appdata_t *ad, Evas_Object *genlist, bt_tr_data_t *info, int tr_type); -void _bt_prepend_genlist_tr_data_item(bt_share_appdata_t *ad, +void _bt_genlist_append_tr_data_item(bt_share_appdata_t *ad, bt_tr_data_t *info, int tr_type); -void _bt_delete_selected_item(bt_share_appdata_t *ad); int _bt_create_transfer_view(bt_share_appdata_t *ad); -void _bt_nocontent_set(bt_share_appdata_t *ad, gboolean set); void _bt_cb_state_changed(int result, bt_adapter_state_e adapter_state, void *user_data); -void _bt_update_tr_notification(void *data); +void _bt_share_ui_handle_transfer_disconnected(bt_share_appdata_t *ad, + bt_share_tr_type_e type); +void _bt_share_ui_handle_transfer_complete(bt_share_appdata_t *ad, + char *address, bt_share_tr_type_e type); +void _bt_share_ui_handle_transfer_started(bt_share_appdata_t *ad, + char *address, char *file_name, unsigned long size, int transfer_id, + bt_share_tr_type_e type); +void _bt_delete_selected_notification(bt_share_tr_type_e tr_type, + int noti_id, const char *opp_role); +int _bt_share_enable_bt(bt_share_appdata_t *ad); +Evas_Object * _bt_share_create_toolbar_button(bt_share_appdata_t *ad, + char *text); +void _bt_share_delete_toolbar_button(bt_share_appdata_t *ad); #ifdef __cplusplus } diff --git a/src/bt-share-ui-widget.c b/src/bt-share-ui-widget.c index 9715af8..e22e5ca 100644 --- a/src/bt-share-ui-widget.c +++ b/src/bt-share-ui-widget.c @@ -21,93 +21,18 @@ * */ -//#include +#include -#include #include "applog.h" #include "bt-share-ui-widget.h" #include "bt-share-ui-main.h" -#include - -#define IMG_PATH_MAX 256 - -Evas_Object *_bt_create_naviframe(Evas_Object *parent) -{ - Evas_Object *nf; - - retvm_if(parent == NULL, NULL, "Invalid argument: parent is NULL\n"); - - nf = elm_naviframe_add(parent); - elm_object_part_content_set(parent, "elm.swallow.content", nf); - evas_object_show(nf); - - return nf; -} - -Evas_Object *_bt_create_button(Evas_Object *parent, char *style, char *part, - char *text, char *icon_path, - Evas_Smart_Cb func, void *data) -{ - Evas_Object *btn = NULL; - Evas_Object *icon = NULL; - - retvm_if(parent == NULL, NULL, "Invalid argument: parent is NULL\n"); - btn = elm_button_add(parent); - - if (style) - elm_object_style_set(btn, style); - - if (part) - elm_object_part_content_set(parent, part, btn); - - if (icon_path) { - icon = elm_image_add(btn); - elm_image_file_set(icon, icon_path, NULL); - elm_object_part_content_set(btn, "elm.icon", icon); - } - - if (text) - elm_object_text_set(btn, text); - - if (func) - evas_object_smart_callback_add(btn, "clicked", func, data); - - evas_object_show(btn); - - return btn; -} - -Evas_Object *_bt_create_progressbar(Evas_Object *parent, const char *style) -{ - Evas_Object *progress_bar = NULL; - - retvm_if(parent == NULL, NULL, "Invalid argument: parent is NULL\n"); - - progress_bar = elm_progressbar_add(parent); - - if (style) - elm_object_style_set(progress_bar, style); - else - elm_object_style_set(progress_bar, "list_process"); - - evas_object_show(progress_bar); - elm_progressbar_pulse(progress_bar, EINA_TRUE); - - return progress_bar; -} +#include Evas_Object *_bt_create_bg(Evas_Object *parent, char *style) { retvm_if(parent == NULL, NULL, "Invalid argument: parent is NULL\n"); - Evas_Object *bg = NULL; -#if 0 - Evas_Object *bg = app_get_preinitialized_background(); -#endif - if (bg == NULL) { - ERR("app_get_preinitialized_background fail!"); - bg = elm_bg_add(parent); - } + Evas_Object *bg = elm_bg_add(parent); evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -145,38 +70,12 @@ Evas_Object *_bt_create_layout(Evas_Object *parent, char *edj, char *content) return layout; } -Evas_Object *_bt_create_label(Evas_Object *parent, const char *text) -{ - Evas_Object *label; - - retvm_if(parent == NULL, NULL, "Invalid argument: parent is NULL\n"); - - label = elm_label_add(parent); - elm_label_line_wrap_set(label, ELM_WRAP_MIXED); - - if (text) - elm_object_text_set(label, text); - - evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); - - evas_object_show(label); - - return label; -} - Evas_Object *_bt_create_conformant(Evas_Object *parent, Evas_Object *content) { Evas_Object *conform = NULL; elm_win_conformant_set(parent, 1); -#if 0 - conform = (Evas_Object *)app_get_preinitialized_conformant(); -#endif - if (conform == NULL) { - ERR("app_get_preinitialized_conformant fail!"); - conform = elm_conformant_add(parent); - } + conform = elm_conformant_add(parent); evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -190,3 +89,14 @@ Evas_Object *_bt_create_conformant(Evas_Object *parent, Evas_Object *content) return conform; } +void _bt_share_genlist_item_text_update(Elm_Object_Item *git, + const char *part) { + ret_if(git == NULL || part == NULL); + elm_genlist_item_fields_update(git, part, ELM_GENLIST_ITEM_FIELD_TEXT); +} + +void _bt_share_genlist_item_content_update(Elm_Object_Item *git, + const char *part) { + ret_if(git == NULL || part == NULL); + elm_genlist_item_fields_update(git, part, ELM_GENLIST_ITEM_FIELD_CONTENT); +} diff --git a/src/bt-share-ui-widget.h b/src/bt-share-ui-widget.h index b51dca9..0fd512d 100644 --- a/src/bt-share-ui-widget.h +++ b/src/bt-share-ui-widget.h @@ -29,27 +29,26 @@ extern "C" { #endif #include -#include - -Evas_Object *_bt_create_naviframe(Evas_Object *parent); - -Evas_Object *_bt_create_button(Evas_Object *parent, char *style, char *part, - char *text, char *icon_path, - Evas_Smart_Cb func, void *data); - -Evas_Object *_bt_create_progressbar(Evas_Object *parent, - const char *style); +#include Evas_Object *_bt_create_bg(Evas_Object *parent, char *style); Evas_Object *_bt_create_layout(Evas_Object *parent, char *edj, char *content); -Evas_Object *_bt_create_label(Evas_Object *parent, const char *text); - Evas_Object *_bt_create_conformant(Evas_Object *parent, Evas_Object *content); +Eina_List *_bt_color_table_set(void); + +Eina_List *_bt_font_table_set(void); + +void _bt_share_genlist_item_text_update(Elm_Object_Item *git, + const char *part); + +void _bt_share_genlist_item_content_update(Elm_Object_Item *git, + const char *part); + #ifdef __cplusplus } #endif -- 2.7.4