From: DoHyun Pyun Date: Mon, 24 Aug 2015 04:41:48 +0000 (+0900) Subject: Code sync from tizen 2.4 branch X-Git-Tag: submit/tizen_mobile/20150824.044438^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1e519cd5ec0d54900aafd961b9dba20aacf8e2cf;p=platform%2Fcore%2Fconnectivity%2Fbt-syspopup.git Code sync from tizen 2.4 branch Change-Id: Iee86420961d000d523d4e7368bc35af57b110917 Signed-off-by: DoHyun Pyun --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 92e437a..8ef9214 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,19 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(bt-syspopup C) -SET(SRCS ${CMAKE_SOURCE_DIR}/src/bt-syspopup.c) +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_WEARABLE") +SET(SRCS ${CMAKE_SOURCE_DIR}/src/bt-syspopup-w.c) +ENDIF() +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_MOBILE") +SET(SRCS ${CMAKE_SOURCE_DIR}/src/bt-syspopup-m.c) +ENDIF() SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_WEARABLE") +SET(TABLEDIR "/usr/apps/org.tizen.bt-syspopup/shared/res/tables") +ENDIF() + IF("${CMAKE_BUILD_TYPE}" STREQUAL "") SET(CMAKE_BUILD_TYPE "Release") ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "") @@ -13,26 +22,53 @@ MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) INCLUDE(FindPkgConfig) +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_WEARABLE") pkg_check_modules(pkgs REQUIRED - appcore-efl + capi-appfw-application bundle - devman - devman_haptic + deviced dlog dbus-glib-1 ecore ecore-input ecore-imf + edje + elementary + evas + gobject-2.0 + syspopup + syspopup-caller + capi-network-bluetooth + feedback + aul + efl-assist edbus + vconf) +ELSEIF("$ENV{CFLAGS}" MATCHES "-DTIZEN_MOBILE") +pkg_check_modules(pkgs REQUIRED + capi-appfw-application + bundle + deviced + capi-system-device + capi-media-player + dlog + dbus-glib-1 + ecore + ecore-input + ecore-imf edje elementary evas + efl-assist gobject-2.0 - pmapi syspopup - bluetooth-api + capi-network-bluetooth feedback - aul) + notification + aul + edbus + vconf) +ENDIF() FOREACH(flag ${pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag} -Wall -g") @@ -67,12 +103,22 @@ SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS}) +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_WEARABLE") +ADD_CUSTOM_TARGET(custom_popup.edj +COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/data/images +${CMAKE_CURRENT_SOURCE_DIR}/data/custom_popup_w.edc +${CMAKE_CURRENT_SOURCE_DIR}/data/custom_popup.edj DEPENDS +${CMAKE_CURRENT_SOURCE_DIR}/data/custom_popup_w.edc +) +ENDIF() +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_MOBILE") ADD_CUSTOM_TARGET(custom_popup.edj COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/data -${CMAKE_CURRENT_SOURCE_DIR}/data/custom_popup.edc +${CMAKE_CURRENT_SOURCE_DIR}/data/custom_popup_m.edc ${CMAKE_CURRENT_SOURCE_DIR}/data/custom_popup.edj DEPENDS -${CMAKE_CURRENT_SOURCE_DIR}/data/custom_popup.edc +${CMAKE_CURRENT_SOURCE_DIR}/data/custom_popup_m.edc ) +ENDIF() ADD_DEPENDENCIES(${PROJECT_NAME} custom_popup.edj) @@ -84,3 +130,6 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) INSTALL(FILES ${CMAKE_BINARY_DIR}/data/org.tizen.bt-syspopup.xml DESTINATION /usr/share/packages/) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/org.tizen.bt-syspopup.png DESTINATION ${TZ_SYS_SHARE}/icons/default/small) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/custom_popup.edj DESTINATION ${TZ_SYS_RW_APP}/org.tizen.bt-syspopup/res/edje) +IF("$ENV{CFLAGS}" MATCHES "-DTIZEN_WEARABLE") +INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tables/ DESTINATION ${TABLEDIR} FILES_MATCHING PATTERN "*.xml") +ENDIF() diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..571fe79 --- /dev/null +++ b/LICENSE @@ -0,0 +1,206 @@ +Flora License + +Version 1.1, April, 2013 + +http://floralicense.org/license/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and +all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of +this definition, "control" means (i) the power, direct or indirect, +to cause the direction or management of such entity, +whether by contract or otherwise, or (ii) ownership of fifty percent (50%) +or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided +in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, +Derivative Works shall not include works that remain separable from, +or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or +its representatives, including but not limited to communication on +electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Tizen Compliance Specification +and passes the Tizen Compliance Tests as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work +solely as incorporated into a Tizen Certified Platform, where such +license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work solely +as incorporated into a Tizen Certified Platform to which such +Contribution(s) was submitted. If You institute patent litigation +against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent infringement, +then any patent licenses granted to You under this License for that +Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that + You distribute, all copyright, patent, trademark, and attribution + notices from the Source form of the Work, excluding those notices + that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of + the Derivative Works, in at least one of the following places: + within a NOTICE text file distributed as part of the Derivative Works; + within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, + if and wherever such third-party notices normally appear. + The contents of the NOTICE file are for informational purposes only + and do not modify the License. You may add Your own attribution notices + within Derivative Works that You distribute, alongside or as an addendum + to the NOTICE text from the Work, provided that such additional attribution + notices cannot be construed as modifying the License. You may add Your own + copyright statement to Your modifications and may provide additional or + different license terms and conditions for use, reproduction, or + distribution of Your modifications, or for any such Derivative Works + as a whole, provided Your use, reproduction, and distribution of + the Work otherwise complies with the conditions stated in this License + and your own copyright statement or terms and conditions do not conflict + the conditions stated in the License including section 3. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.1 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/ + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/data/custom_popup.edc b/data/custom_popup.edc deleted file mode 100644 index 81fda5b..0000000 --- a/data/custom_popup.edc +++ /dev/null @@ -1,269 +0,0 @@ -#define SIDE_MARGIN 32 0 - -collections { - group { - name: "custom_popup"; - parts{ - part { - name: "left_padding"; - type: RECT; - scale: 1; - description { - state: "default" 0.0; - fixed: 1 0; - visible: 0; - align: 0.0 0.5; - min: SIDE_MARGIN; - rel1 { - relative: 0.0 0.0; - } - rel2 { - relative: 0.0 1.0; - } - } - } - part{ - name:"content"; - type: SWALLOW; - scale : 1; - description { - state: "default" 0.0; - min: 3 0; - align: 0.5 0.5; - fixed: 1 0; - rel1 { - relative: 1.0 0.0; - to:"left_padding"; - } - rel2 { - relative: 0.0 1.0; - to:"right_padding"; - } - } - } - part { - name: "right_padding"; - type: RECT; - scale: 1; - description { - state: "default" 0.0; - fixed: 1 0; - visible: 0; - align: 1.0 0.5; - min: SIDE_MARGIN; - rel1 { - relative: 1.0 0.0; - } - rel2 { - relative: 1.0 1.0; - } - } - } - } - } - - - - group { name: "popup_checkview"; - parts { - part { name: "pad_t"; - scale : 1; - mouse_events: 0; - repeat_events: 1; - description { state: "default" 0.0; - align: 0.5 0.0; - min: 0 0; - 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"; - scale: 1; - description { state: "default" 0.0; - min : 0 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"; - scale: 1; - description { state: "default" 0.0; - min : 0 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; - ignore_flags: ON_HOLD; - scale : 1; - description { state: "default" 0.0; - min: 648 0; - align: 0.5 0.5; - fixed: 1 0; - rel1 { - relative: 0.5 1.0; - to: "pad_t"; - } - rel2 { - relative: 0.5 0.0; - to: "pad_b"; - } - } - } - part { name: "pad_b"; - scale : 1; - mouse_events: 0; - description { state: "default" 0.0; - align: 0.5 1.0; - min: 0 84; - fixed: 0 1; - rel1 { - relative: 1.0 1.0;to_x: "pad_l"; - } - rel2 { - relative: 0.0 1.0;to_x: "pad_r"; - } - } - } - part { name: "elm.swallow.end"; - type: SWALLOW; - ignore_flags: ON_HOLD; - scale : 1; - mouse_events: 1; - repeat_events: 1; - description { state: "default" 0.0; - align: 0.0 1.0; - min: 648 64; - max: 648 64; - fixed: 1 1; - rel1 { - relative: 0.0 0.0; - to: "pad_b"; - } - rel2 { - relative: 1.0 1.0; - to: "pad_b"; - } - } - } - part { name: "pad_after_check"; - type : RECT; - scale : 1; - mouse_events: 0; - description { state: "default" 0.0; - align: 0.0 0.0; - min: 16 64; - fixed: 1 1; - visible: 0; - rel1 { - relative: 1.0 0.0;to: "elm.swallow.end"; - } - rel2 { - relative: 1.0 1.0;to: "elm.swallow.end"; - } - } - } - part { name: "elm.text"; - type: TEXT; - scale : 1; - description { state: "default" 0.0; - text { - font: "SLP:style=Medium"; - size: 42; - min: 0 0; - align: 0.0 0.5; - text_class: "slp"; - } - color: 0 0 0 255; - align: 0.0 0.5; - rel1 { - relative: 1.0 0.0; - to_x: "pad_after_check"; - to_y: "elm.swallow.end"; - } - rel2 { - relative: 1.0 1.0; - to_y: "elm.swallow.end"; - } - } - } - } - } - - group { name: "popup_checkview_image"; - inherit: "popup_checkview"; - parts{ - part{ name:"elm.swallow.content"; - type: SWALLOW; - ignore_flags: ON_HOLD; - scale : 1; - description { state: "default" 0.0; - min: 648 0; - align: 0.5 0.5; - fixed: 1 0; - rel1 { - relative: 0.5 1.0; - to: "pad_t"; - } - rel2 { - relative: 0.5 0.0; - to: "elm.swallow.icon.bg"; - } - } - } - part { name: "elm.swallow.icon.bg"; - scale: 1; - description { state: "default" 0.0; - align: 0.5 1.0; - fixed: 1 1; - visible: 0; - min: 360 164; - rel1 { - relative: 0.5 0.0; - to: "pad_b"; - } - rel2 { - relative: 0.5 0.0; - to: "pad_b"; - } - } - } - part { name: "elm.swallow.entry"; - type: SWALLOW; - scale: 1; - ignore_flags: ON_HOLD; - description { state: "default" 0.0; - align: 0.5 0.5; - fixed: 0 1; - min: 648 120; - rel1 { - relative: 0.0 0.5; - to: "elm.swallow.icon.bg"; - } - rel2 { - relative: 1.0 0.5; - to: "elm.swallow.icon.bg"; - } - } - } - } - } -} diff --git a/data/custom_popup_m.edc b/data/custom_popup_m.edc new file mode 100644 index 0000000..e9464ae --- /dev/null +++ b/data/custom_popup_m.edc @@ -0,0 +1,439 @@ +#define POPUP_HEIGHT_LANDSCAPE 55 +#define POPUP_CONTENT_DEFAULT_PADDING_LEFT_MIN_INC 15 +#define POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC 96 +#define POPUP_WITH_3_GL_ITEMS 300 +#define POPUP_WITH_2_GL_ITEMS 235 + +collections { + base_scale : 1.8; + group { + name: "passwd_popup"; + parts { + part { + name:"pad_t"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 0; + align: 0.5 0.0; + fixed: 0 1; + rel2.relative: 1.0 0.0; + } + } + part { + name:"elm.swallow.layout"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + min: 0 POPUP_WITH_3_GL_ITEMS; + align: 0.5 1.0; + 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_b"; + } + } + } + + part { + name:"pad_b"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 1.0; + fixed: 0 1; + rel1.relative: 0.0 1.0; + } + } + + part { + name: "pad_l"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 0.0 0.0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.0 1.0; + } + } + } + + part { + name: "pad_r"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 1.0 0.0; + rel1 { + relative: 1.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + } + } + + group { name: "entry_style"; + parts { + part { + name: "base"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 450 POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC; + max: 450 POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC; + fixed: 1 0; + } + } + part { name: "pad_l"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + min: POPUP_CONTENT_DEFAULT_PADDING_LEFT_MIN_INC 0; + fixed: 1 0; + rel1 { + relative: 0.0 0.0; + to: "base"; + } + rel2 { + relative: 0.0 1.0; + to: "base"; + } + align: 0.0 0.0; + } + } + part { name: "pad_r"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + min: POPUP_CONTENT_DEFAULT_PADDING_LEFT_MIN_INC 0; + fixed: 1 0; + rel1 { + relative: 1.0 0.0; + to: "base"; + } + rel2 { + relative: 1.0 1.0; + to: "base"; + } + align: 1.0 0.0; + } + } + part { name: "entry_part"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + min: 0 POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC; + align: 0.0 0.0; + rel1{ + relative: 1.0 0.0 ; + to_x: "pad_l"; + } + rel2{ + relative: 0.0 1.0; + to_x: "pad_r"; + } + } + } + } + } + + group { + name: "passwd_popup_landscape_ly"; + inherit: "passwd_popup"; + parts { + + part { + name:"elm.swallow.layout"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + min: 0 POPUP_HEIGHT_LANDSCAPE; + align: 0.5 1.0; + 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_b"; + } + } + } + } + } + group { + name: "auth_popup"; + parts { + part { + name: "pad_t"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 0.0; + min: 0 0; + 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: 26 0; + max: 26 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: 26 0; + max: 26 0; + fixed: 1 0; + rel1 { + relative: 1.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + align: 1.0 0.0; + } + } + part { + name: "popup_title"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.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_b"; + } + } + } + part { name: "bottom_pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 32; + fixed: 0 1; + rel1 { + relative: 1.0 1.0; + to_x: "pad_l"; + } + rel2 { + relative: 0.0 1.0; + to_x: "pad_r"; + } + } + } + part { + name: "pad_b"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 0 84; + fixed: 1 1; + rel1 { + relative: 0.0 0.0; + to: "bottom_pad"; + } + rel2 { + relative: 1.0 0.0; + to: "bottom_pad"; + } + } + } + part { + name: "end_field"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 1.0; + min: 0 100; + fixed: 0 1; + rel1 { + relative: 0.0 1.0; + to: "pad_b"; + } + rel2 { + relative: 1.0 1.0; + to: "pad_b"; + } + } + } + part { + name: "check"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + align: 0.0 0.5; + min: 36 36; + fixed: 1 1; + rel1 { + relative: 1.0 1.0; + to_x: "pad_l"; + to_y: "pad_b"; + } + rel2 { + relative: 0.0 0.0; + to_x: "pad_r"; + to_y: "pad_b"; + } + } + } + } + } + group { + name: "access_req_popup"; + parts { + part { + name:"pad_t"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 0; + align: 0.5 0.0; + fixed: 0 1; + rel2.relative: 1.0 0.0; + } + } + part { + name:"elm.swallow.layout"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + min: 0 POPUP_WITH_2_GL_ITEMS; + align: 0.5 1.0; + 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_b"; + } + } + } + + part { + name:"pad_b"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 1.0; + fixed: 0 1; + rel1.relative: 0.0 1.0; + } + } + + part { + name: "pad_l"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 0.0 0.0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.0 1.0; + } + } + } + + part { + name: "pad_r"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + min: 0 0; + fixed: 1 0; + align: 1.0 0.0; + rel1 { + relative: 1.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + } + } +} diff --git a/data/custom_popup_w.edc b/data/custom_popup_w.edc new file mode 100644 index 0000000..62679e4 --- /dev/null +++ b/data/custom_popup_w.edc @@ -0,0 +1,48 @@ +#define FONT_BLD "Tizen:style=Bold" +#define FONT_MED "Tizen:style=Medium" +#define FONT_ROM "Tizen:style=Roman" +#define FONT_LIG "Tizen:style=Roman" + +#define RESOURCE_IMAGE( FILE_NAME ) \ + group { \ + name: FILE_NAME; \ + images.image: FILE_NAME COMP; \ + parts { \ + part { name: "image"; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + image.normal: FILE_NAME; \ + aspect: 0 0; \ + aspect_preference: BOTH; \ + } \ + } \ + } \ + } + +#define IMAGE_ROTATE_DESCRIPTION(STATE_NAME, ANGLE) \ + description { \ + state: STATE_NAME 0.0; \ + inherit: "show" 0.0; \ + map { \ + on: 1; \ + perspective_on: 1; \ + smooth: 1; \ + rotation { \ + z: ANGLE; \ + } \ + } \ + } \ + +#define HOR_SIZE 360 +#define VER_SIZE 480 +#define BUTTON_HEIGHT 85 + +collections { +#include "groups/passkey_confirm.edc" +#include "groups/auth_popup.edc" +#include "groups/passwd_popup.edc" +#include "groups/passkey_confirm_popup.edc" +} + + diff --git a/data/groups/auth_popup.edc b/data/groups/auth_popup.edc new file mode 100644 index 0000000..5bb7dba --- /dev/null +++ b/data/groups/auth_popup.edc @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +group { + name: "auth_popup"; + parts { + part { + name: "pad_t"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 0.0; + min: 0 0; + 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: 0 0; + max: 0 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: 0 0; + max: 0 0; + fixed: 1 0; + rel1 { + relative: 1.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + align: 1.0 0.0; + } + } + part { + name: "popup_title"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.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_b"; + } + } + } + part { + name: "pad_b"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.5 1.0; + min: 400 84; + fixed: 1 1; + rel1 { + relative: 0.5 1.0; + } + rel2 { + relative: 0.5 1.0; + } + } + } + part { + name: "check"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + align: 0.0 1.0; + min: 63 63; + max: 63 63; + fixed: 1 1; + rel1.to: "pad_b"; + rel2 { + relative: 0.0 1.0; + to: "pad_b"; + } + } + } + part { + name: "pad_after_check"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 16 63; + fixed: 1 1; + rel1 { + relative: 1.0 0.0;to: "check"; + } + rel2 { + relative: 1.0 1.0;to: "check"; + } + } + } + part { + name: "check_label"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to_x: "pad_after_check"; + to_y: "check"; + } + rel2 { + relative: 1.0 1.0; + to_x: "pad_b"; + to_y: "check"; + } + } + } + } +} diff --git a/data/groups/passkey_confirm.edc b/data/groups/passkey_confirm.edc new file mode 100644 index 0000000..0ffd20b --- /dev/null +++ b/data/groups/passkey_confirm.edc @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +RESOURCE_IMAGE("b_setup_wizard_watch.png"); +RESOURCE_IMAGE("b_setup_wizard_device.png"); +RESOURCE_IMAGE("b_setup_wizard_pairing_01.png"); + +#define BG_COLOR "AO011" + +#define WATCH_W 54 +#define WATCH_H 70 +#define PHONE_W 62 +#define PHONE_H 112 +#define PROCESS_W 54 +#define PROCESS_H 54 +#define MID_PADDING_W 17 +#define LINE_H 41 +#define BUTTON_H 85 + +#define PROCESS_PAD_LEFT (HOR_SIZE/2 - PROCESS_W/2) +#define PROCESS_PAD_TOP (88) +#define WTCH_PAD_TOP (VER_SIZE - LINE_H * 4 - BUTTON_H - WATCH_H)/2 +#define TEXT_PAD (16) + + + +group { name: "passkey_confirm"; + parts { + part { name: "bg"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: HOR_SIZE VER_SIZE; + color_class: BG_COLOR; + } + } + + part { + name: "scroller"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + to:"bg"; + } + rel2 { + relative: 1.0 (VER_SIZE-BUTTON_HEIGHT)/VER_SIZE; + to:"bg"; + } + align: 0.0 0.0; + } + } + + part { name: "btn1"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + rel1 { + relative: 0.0 1.0; + } + rel2 { + to_x: "padding"; + relative: 0.0 1.0; + } + min: 0 BUTTON_HEIGHT; + align: 0.5 1; + } + } + part { name: "padding"; + type: SPACER; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + rel1 { + relative: 0.5 1.0; + } + rel2 { + relative: 0.5 1.0; + } + align: 0.5 1.0; + min: 1 0; + max: 1 0; + fixed: 1 0; + } + } + part { name: "btn2"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + rel1 { + to_x: "padding"; + relative: 1.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + min: 0 BUTTON_HEIGHT; + align: 0.5 1; + } + } + } +} + +group { name: "passkey_confirm_scroller"; + parts{ + part { + name: "background"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0; + color_class: BG_COLOR; + + } + } + part { name: "pad_l"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + min: TEXT_PAD 0; + max: TEXT_PAD 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: TEXT_PAD 0; + max: TEXT_PAD 0; + fixed: 1 0; + rel1 { + relative: 1.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + align: 1.0 0.0; + } + } + + part { name: "pad_b"; + type: SPACER; + scale: 1; + description { state: "default" 0.0; + align: 0.5 1.0; + min: 0 TEXT_PAD; + fixed: 1 1; + rel1 { + relative: 0.0 1.0; + to_x: "pad_l"; + } + rel2 { + relative: 1.0 1.0; + to_x: "pad_r"; + } + } + } + + part { + name: "elm.swallow.img.watch"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 1.0 0.0; + visible: 1; + fixed: 1 1; + min: WATCH_W WATCH_H; + max: WATCH_W WATCH_H; + image.normal: "b_setup_wizard_watch.png"; + color_class: "AO014"; + rel1 { + relative: 0 0; + to:"background"; + offset:0 WTCH_PAD_TOP; + } + rel2 { + relative: 0 0; + to_x:"elm.swallow.img.icon"; + offset: (-MID_PADDING_W) 0; + } + } + } + part { + name: "elm.swallow.img.phone"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: PHONE_W PHONE_H; + max: PHONE_W PHONE_H; + image.normal: "b_setup_wizard_device.png"; + color_class: "AO014"; + rel1 { + relative: 1.0 0.0; + to:"elm.swallow.img.icon"; + offset: MID_PADDING_W (-26); + } + rel2 { + relative: 1.0 1.0; + to:"elm.swallow.img.icon"; + offset: (MID_PADDING_W + PHONE_W) (26); + } + } + } + + part { + name: "elm.swallow.img.icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: PROCESS_W PROCESS_H; + max: PROCESS_W PROCESS_H; + image.normal: "b_setup_wizard_pairing_01.png"; + color_class: "AO013L2"; + + rel1 { + relative: 0.0 0.0; + offset: PROCESS_PAD_LEFT PROCESS_PAD_TOP; + to:"background"; + } + rel2 { + relative: 0.0 0.0; + offset: (PROCESS_PAD_LEFT+PROCESS_W) (PROCESS_PAD_TOP+PROCESS_H); + to:"background"; + } + map { + on: 1; + smooth: 0; + rotation { + z:0; + } + } + } + description { + state: "state1" 0.1; + inherit: "default" 0.0; + map { + on: 1; + smooth: 0; + rotation { + z:180; + } + } + } + description { + state: "state2" 0.2; + inherit: "default" 0.0; + map { + on: 1; + smooth: 0; + rotation { + z:360; + } + } + } + } + part { + name: "elm.text.block"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + color_class: BG_COLOR; + align: 0.0 0.0; + rel1 { + relative: 1.0 1.0; + to_x:"pad_l"; + to_y:"elm.swallow.img.phone"; + offset: 0 46; + } + rel2 { + relative: 0.0 0.0; + to_x:"pad_r"; + to_y:"pad_b"; + } + } + } + } + programs { + program { + signal: "load"; + source: ""; + in: 0.0 0.0; + after: "animation"; + } + program { + name: "animation"; + action: STATE_SET "default" 0.0; + target: "elm.swallow.img.icon"; + transition: LINEAR 0.0; + after: "animation1"; + } + program { + name: "animation1"; + action: STATE_SET "state1" 0.1; + target: "elm.swallow.img.icon"; + transition: LINEAR 0.7; + after: "animation2"; + } + program { + name: "animation2"; + action: STATE_SET "state2" 0.2; + target: "elm.swallow.img.icon"; + transition: LINEAR 0.7; + after: "animation"; + } + } +} + + diff --git a/data/groups/passkey_confirm_popup.edc b/data/groups/passkey_confirm_popup.edc new file mode 100644 index 0000000..2750314 --- /dev/null +++ b/data/groups/passkey_confirm_popup.edc @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +images { + image: "b_setup_wizard_bluetooth_pairing.png" COMP; +} + +#define BG_COLOR 0 0 0 255 + +group { name: "passkey_confirm_popup"; + parts { + part { name: "bg"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + min: HOR_SIZE VER_SIZE; + color: BG_COLOR; + } + } + + part { + name: "scroller"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + to:"bg"; + } + rel2 { + relative: 1.0 (VER_SIZE-BUTTON_HEIGHT)/VER_SIZE; + to:"bg"; + } + align: 0.0 0.0; + } + } + + part { name: "btn1"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + rel1 { + relative: 0.0 1.0; + } + rel2 { + to_x: "padding"; + relative: 0.0 1.0; + } + min: 0 BUTTON_HEIGHT; + align: 0.5 1; + } + } + part { name: "padding"; + type: SPACER; + scale: 1; + mouse_events: 0; + description { state: "default" 0.0; + rel1 { + relative: 0.5 1.0; + } + rel2 { + relative: 0.5 1.0; + } + align: 0.5 1.0; + min: 1 0; + max: 1 0; + fixed: 1 0; + } + } + part { name: "btn2"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + rel1 { + to_x: "padding"; + relative: 1.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + min: 0 BUTTON_HEIGHT; + align: 0.5 1; + } + } + } +} + +group { name: "passkey_confirm_popup_scroller"; + parts { + part { name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: BG_COLOR; + } + } + part { + name: "elm.image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0 0; + to: "bg"; + offset: 39 0; + } + rel2 { + relative: 0 0; + to: "bg"; + offset: (39+242) 124; + } + visible: 1; + image { + normal: "b_setup_wizard_bluetooth_pairing.png"; + } + align: 0.5 0.0; + } + description { + state: "show" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "elm.text.block"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + to: "bg"; + offset: 0 124; + } + rel2 { + relative: 1.0 1.0; + offset: -16 0; + } + } + } + } +} diff --git a/data/groups/passwd_popup.edc b/data/groups/passwd_popup.edc new file mode 100644 index 0000000..ecf1675 --- /dev/null +++ b/data/groups/passwd_popup.edc @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +#define WIN_WIDTH 360 +#define WIN_HEIGHT 480 + +RESOURCE_IMAGE("b_privacy_lock_button_00.png"); +RESOURCE_IMAGE("b_privacy_lock_button_01.png"); +RESOURCE_IMAGE("b_privacy_lock_button_02.png"); +RESOURCE_IMAGE("b_privacy_lock_button_03.png"); +RESOURCE_IMAGE("b_privacy_lock_button_04.png"); +RESOURCE_IMAGE("b_privacy_lock_button_05.png"); +RESOURCE_IMAGE("b_privacy_lock_button_06.png"); +RESOURCE_IMAGE("b_privacy_lock_button_07.png"); +RESOURCE_IMAGE("b_privacy_lock_button_08.png"); +RESOURCE_IMAGE("b_privacy_lock_button_09.png"); +RESOURCE_IMAGE("b_privacy_lock_clear_btn.png"); +RESOURCE_IMAGE("b_privacy_lock_button_clear.png"); + +#define KEYPAD_BUTTON_DESC_CC(part_name, sx, sy, dx, dy, ox, oy)\ + part {\ + name : part_name",bg";\ + type : RECT;\ + mouse_events : 1;\ + description {\ + state : "default" 0.0;\ + min : dx dy;\ + fixed : 1 1;\ + rel1 { relative : sx sy; offset: ox oy; }\ + rel2 { relative : sx sy; }\ + color_class : "AO012L2";\ + align : 0.0 0.0;\ + }\ + description {\ + state : "pressed" 0.0;\ + inherit : "default" 0.0;\ + color_class : "AO012L2P";\ + }\ + }\ + part {\ + name : part_name;\ + type : IMAGE;\ + mouse_events : 1;\ + description {\ + state : "default" 0.0;\ + rel1.to : part_name",bg"; \ + rel2.to : part_name",bg"; \ + min : dx 63;\ + max : dx 63;\ + fixed : 1 1;\ + image { normal : "b_privacy_lock_"part_name".png"; }\ + color_class : "AO012";\ + }\ + description {\ + state : "disable" 0.0;\ + visible : 0;\ + }\ + }\ + part {\ + name : part_name",sw";\ + type : SWALLOW;\ + description {\ + state : "default" 0.0;\ + fixed : 1 1;\ + rel1.to : part_name",bg"; \ + rel2.to : part_name",bg"; \ + }\ + description {\ + state : "hidden" 0.0;\ + visible : 0;\ + }\ + } + +#define KEYPAD_TXT_DESC_CC(part_name, sx, sy, dx, dy,ox,oy)\ + part {\ + name : part_name",bg";\ + type : RECT;\ + mouse_events : 1;\ + description {\ + state : "default" 0.0;\ + min : dx dy;\ + fixed : 1 1;\ + rel1 { relative : sx sy; offset: ox oy; }\ + rel2 { relative : sx sy; }\ + color_class : "AO012L2";\ + align : 0.0 0.0;\ + }\ + description {\ + state : "pressed" 0.0;\ + inherit : "default" 0.0;\ + color_class : "AO012L2P";\ + }\ + }\ + part {\ + name : part_name;\ + type : TEXT;\ + mouse_events : 1;\ + description {\ + state : "default" 0.0;\ + rel1.to : part_name",bg";\ + rel2.to : part_name",bg";\ + color : 255 255 255 255;\ + text {\ + font : "Tizen:style=Regular";\ + text_class : tizen;\ + size : 32;\ + }\ + }\ + description {\ + state : "disable" 0.0;\ + inherit : "default" 0.0;\ + color : 128 128 128 255;\ + }\ + }\ + part {\ + name : part_name",sw";\ + type : SWALLOW;\ + description {\ + state : "default" 0.0;\ + fixed : 1 1;\ + rel1.to : part_name",bg"; \ + rel2.to : part_name",bg"; \ + }\ + description {\ + state : "hidden" 0.0;\ + visible : 0;\ + }\ + } + +#define KEYPAD_BUTTON_PGM(part_name)\ + program {\ + name : "keypad,"part_name",release";\ + signal : "normal";\ + source : part_name;\ + action : STATE_SET "default" 0.0;\ + target : part_name",bg";\ + }\ + program {\ + name : "keypad,"part_name",press";\ + signal : "pressed";\ + source : part_name;\ + action : STATE_SET "pressed" 0.0;\ + target : part_name",bg";\ + }\ + program {\ + name : "keypad,"part_name",disable";\ + signal : "disable";\ + source : part_name;\ + action : STATE_SET "disable" 0.0;\ + target : part_name;\ + }\ + program {\ + name : "keypad,"part_name",enable";\ + signal : "enable";\ + source : part_name;\ + action : STATE_SET "default" 0.0;\ + target : part_name;\ + } + +#define KEYPAD_TXT_PGM(part_name)\ + program {\ + name : "keypad,"part_name",release";\ + signal : "normal";\ + source : part_name;\ + action : STATE_SET "default" 0.0;\ + target : part_name",bg";\ + }\ + program {\ + name : "keypad,"part_name",press";\ + signal : "pressed";\ + source : part_name;\ + action : STATE_SET "pressed" 0.0;\ + target : part_name",bg";\ + }\ + program {\ + name : "keypad,"part_name",disable";\ + signal : "disable";\ + source : part_name;\ + action : STATE_SET "disable" 0.0;\ + target : part_name;\ + }\ + program {\ + name : "keypad,"part_name",enable";\ + signal : "enable";\ + source : part_name;\ + action : STATE_SET "default" 0.0;\ + target : part_name;\ + } + +#define FOCUS_TARGET(part_name)\ + target : part_name",sw"; + +group { + name: "passwd_popup"; + parts { + part{ + name: "base"; + type: RECT; + scale: 1; + description{ + state: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color_class : "B011"; + } + } + part { name: "label"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 6/WIN_WIDTH 0.0; to: "base"; offset: 0 0; } + rel2 { relative: (WIN_WIDTH-6)/WIN_WIDTH 0.0; to: "base"; offset: 0 11+66; } + } + } + part{ + name: "pass.txt.bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "base"; offset: 0 74+8; } + rel2 { relative: 1.0 0.0; to: "base"; offset: 0 74+8+42; } + color_class : "B011"; + } + } + part { + name: "elm.text.password"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { to: "pass.txt.bg"; } + rel2 { to: "pass.txt.bg"; } + color_class: "AT013"; + text { + text_class: "AT013"; + align: 0.5 0.5; + } + } + } + part{ + name: "sw.keypad"; + type: SWALLOW; + scale: 1; + description{ + state: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; to: "base"; offset: 0 74+8+42; } + rel2 { relative: 1.0 0.0; to: "base"; offset: 0 74+8+42+299; } + } + } + } +} + +group { + name: "keypad"; + parts { + part { + name : "rect.bg"; + type : RECT; + mouse_events : 1; + description { + fixed: 1 1; + state : "default" 0.0; + color_class : "AO012L1"; + } + } + + KEYPAD_BUTTON_DESC_CC("button_01", 0.0, 0.0, 117+1, 70, 0,1) + KEYPAD_BUTTON_DESC_CC("button_02", (117+4)/WIN_WIDTH, 0.0, 117+1, 70, 1,1) + KEYPAD_BUTTON_DESC_CC("button_03", (118+4)*2/WIN_WIDTH, 0.0, 117, 70, 0,1) + + KEYPAD_BUTTON_DESC_CC("button_04", 0.0, (71+4)/299, 117+1, 70, 0,1) + KEYPAD_BUTTON_DESC_CC("button_05", (117+4)/WIN_WIDTH, (71+4)/299, 117+1, 70, 1,1) + KEYPAD_BUTTON_DESC_CC("button_06", (118+4)*2/WIN_WIDTH, (71+4)/299, 117, 70, 0,1) + + KEYPAD_BUTTON_DESC_CC("button_07", 0.0, (71+4)*2/299, 117+1, 70, 0,1) + KEYPAD_BUTTON_DESC_CC("button_08", (117+4)/WIN_WIDTH, (71+4)*2/299, 117+1, 70, 1,1) + KEYPAD_BUTTON_DESC_CC("button_09", (118+4)*2/WIN_WIDTH, (71+4)*2/299, 117, 70, 0,1) + + KEYPAD_TXT_DESC_CC("confirm", (118+4)*2/WIN_WIDTH, (71+4)*3/299, 117, 74, 0,2) + KEYPAD_BUTTON_DESC_CC("button_00", (117+4)/WIN_WIDTH, (71+4)*3/299, 117+1, 74, 1,2) + KEYPAD_BUTTON_DESC_CC("button_clear", 0.0, (71+4)*3/299, 117+1, 74, 0,2) + + } + + programs { + KEYPAD_BUTTON_PGM("button_00") + KEYPAD_BUTTON_PGM("button_01") + KEYPAD_BUTTON_PGM("button_02") + KEYPAD_BUTTON_PGM("button_03") + KEYPAD_BUTTON_PGM("button_04") + KEYPAD_BUTTON_PGM("button_05") + KEYPAD_BUTTON_PGM("button_06") + KEYPAD_BUTTON_PGM("button_07") + KEYPAD_BUTTON_PGM("button_08") + KEYPAD_BUTTON_PGM("button_09") + KEYPAD_BUTTON_PGM("button_clear") + KEYPAD_TXT_PGM("confirm") + + program { + name : "set,tts,enable"; + signal : "set,tts,enable"; + source : "bg"; + action : STATE_SET "default" 0.0; + FOCUS_TARGET("button_00") + FOCUS_TARGET("button_01") + FOCUS_TARGET("button_02") + FOCUS_TARGET("button_03") + FOCUS_TARGET("button_04") + FOCUS_TARGET("button_05") + FOCUS_TARGET("button_06") + FOCUS_TARGET("button_07") + FOCUS_TARGET("button_08") + FOCUS_TARGET("button_09") + FOCUS_TARGET("button_clear") + FOCUS_TARGET("confirm") + } + program { + name : "set,tts,disable"; + signal : "set,tts,disable"; + source : "bg"; + action : STATE_SET "hidden" 0.0; + FOCUS_TARGET("button_00") + FOCUS_TARGET("button_01") + FOCUS_TARGET("button_02") + FOCUS_TARGET("button_03") + FOCUS_TARGET("button_04") + FOCUS_TARGET("button_05") + FOCUS_TARGET("button_06") + FOCUS_TARGET("button_07") + FOCUS_TARGET("button_08") + FOCUS_TARGET("button_09") + FOCUS_TARGET("button_clear") + FOCUS_TARGET("confirm") + } + } +} diff --git a/data/images/b_privacy_lock_button_00.png b/data/images/b_privacy_lock_button_00.png new file mode 100644 index 0000000..ab89d14 Binary files /dev/null and b/data/images/b_privacy_lock_button_00.png differ diff --git a/data/images/b_privacy_lock_button_01.png b/data/images/b_privacy_lock_button_01.png new file mode 100644 index 0000000..fb0d238 Binary files /dev/null and b/data/images/b_privacy_lock_button_01.png differ diff --git a/data/images/b_privacy_lock_button_02.png b/data/images/b_privacy_lock_button_02.png new file mode 100644 index 0000000..7b4c4ab Binary files /dev/null and b/data/images/b_privacy_lock_button_02.png differ diff --git a/data/images/b_privacy_lock_button_03.png b/data/images/b_privacy_lock_button_03.png new file mode 100644 index 0000000..ea1e371 Binary files /dev/null and b/data/images/b_privacy_lock_button_03.png differ diff --git a/data/images/b_privacy_lock_button_04.png b/data/images/b_privacy_lock_button_04.png new file mode 100644 index 0000000..17650bc Binary files /dev/null and b/data/images/b_privacy_lock_button_04.png differ diff --git a/data/images/b_privacy_lock_button_05.png b/data/images/b_privacy_lock_button_05.png new file mode 100644 index 0000000..6a80efa Binary files /dev/null and b/data/images/b_privacy_lock_button_05.png differ diff --git a/data/images/b_privacy_lock_button_06.png b/data/images/b_privacy_lock_button_06.png new file mode 100644 index 0000000..77234af Binary files /dev/null and b/data/images/b_privacy_lock_button_06.png differ diff --git a/data/images/b_privacy_lock_button_07.png b/data/images/b_privacy_lock_button_07.png new file mode 100644 index 0000000..177b0c6 Binary files /dev/null and b/data/images/b_privacy_lock_button_07.png differ diff --git a/data/images/b_privacy_lock_button_08.png b/data/images/b_privacy_lock_button_08.png new file mode 100644 index 0000000..222e333 Binary files /dev/null and b/data/images/b_privacy_lock_button_08.png differ diff --git a/data/images/b_privacy_lock_button_09.png b/data/images/b_privacy_lock_button_09.png new file mode 100644 index 0000000..3641030 Binary files /dev/null and b/data/images/b_privacy_lock_button_09.png differ diff --git a/data/images/b_privacy_lock_button_clear.png b/data/images/b_privacy_lock_button_clear.png new file mode 100644 index 0000000..0087b9b Binary files /dev/null and b/data/images/b_privacy_lock_button_clear.png differ diff --git a/data/images/b_privacy_lock_clear_btn.png b/data/images/b_privacy_lock_clear_btn.png new file mode 100644 index 0000000..1e1b64f Binary files /dev/null and b/data/images/b_privacy_lock_clear_btn.png differ diff --git a/data/images/b_setup_wizard_bluetooth_pairing.png b/data/images/b_setup_wizard_bluetooth_pairing.png new file mode 100644 index 0000000..e997528 Binary files /dev/null and b/data/images/b_setup_wizard_bluetooth_pairing.png differ diff --git a/data/images/b_setup_wizard_device.png b/data/images/b_setup_wizard_device.png new file mode 100644 index 0000000..ffa7178 Binary files /dev/null and b/data/images/b_setup_wizard_device.png differ diff --git a/data/images/b_setup_wizard_pairing_01.png b/data/images/b_setup_wizard_pairing_01.png new file mode 100644 index 0000000..9ae0267 Binary files /dev/null and b/data/images/b_setup_wizard_pairing_01.png differ diff --git a/data/images/b_setup_wizard_watch.png b/data/images/b_setup_wizard_watch.png new file mode 100644 index 0000000..94f2459 Binary files /dev/null and b/data/images/b_setup_wizard_watch.png differ diff --git a/data/org.tizen.bt-syspopup.xml b/data/org.tizen.bt-syspopup.xml index bff80c9..ede09f3 100644 --- a/data/org.tizen.bt-syspopup.xml +++ b/data/org.tizen.bt-syspopup.xml @@ -3,7 +3,7 @@ DoHyun Pyun Bluetooth System Popup - + org.tizen.bt-syspopup.png diff --git a/packaging/org.tizen.bt-syspopup.spec b/packaging/org.tizen.bt-syspopup.spec index 0f911c1..fc64b41 100644 --- a/packaging/org.tizen.bt-syspopup.spec +++ b/packaging/org.tizen.bt-syspopup.spec @@ -1,34 +1,44 @@ +%define _usrdir /usr +%define _appdir %{_usrdir}/apps + %bcond_with wayland Name: org.tizen.bt-syspopup Summary: bluetooth system-popup application (bluetooth system popup) -Version: 0.2.56 +Version: 0.3.1 Release: 0 Group: main License: Apache License, Version 2.0 Source0: %{name}-%{version}.tar.gz BuildRequires: pkgconfig(evas) +%if "%{?profile}" == "mobile" +BuildRequires: pkgconfig(efl-assist) +BuildRequires: pkgconfig(notification) +%endif +%if "%{?profile}" == "wearable" +BuildRequires: efl-assist-devel +BuildRequires: pkgconfig(syspopup-caller) +%endif BuildRequires: pkgconfig(ecore-input) -BuildRequires: pkgconfig(edbus) BuildRequires: pkgconfig(ethumb) BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(efreet) -BuildRequires: pkgconfig(sysman) BuildRequires: pkgconfig(sensor) -BuildRequires: pkgconfig(appcore-efl) -BuildRequires: pkgconfig(devman) BuildRequires: pkgconfig(syspopup) BuildRequires: pkgconfig(dlog) -BuildRequires: pkgconfig(pmapi) BuildRequires: pkgconfig(dbus-glib-1) BuildRequires: pkgconfig(glib-2.0) -BuildRequires: pkgconfig(devman_haptic) BuildRequires: pkgconfig(aul) -BuildRequires: pkgconfig(bluetooth-api) +BuildRequires: pkgconfig(edbus) BuildRequires: pkgconfig(feedback) -BuildRequires: sysman-internal-devel BuildRequires: edje-tools BuildRequires: pkgconfig(libtzplatform-config) +BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(capi-system-device) +BuildRequires: pkgconfig(capi-media-player) +BuildRequires: pkgconfig(deviced) +BuildRequires: pkgconfig(capi-network-bluetooth) +BuildRequires: pkgconfig(vconf) BuildRequires: cmake BuildRequires: gettext-devel @@ -41,6 +51,15 @@ bluetooth system-popup application (bluetooth system popup). %build +%if "%{?profile}" == "wearable" +export CFLAGS="$CFLAGS -DTIZEN_ENGINEER_MODE -DTIZEN_WEARABLE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_ENGINEER_MODE" +export FFLAGS="$FFLAGS -DTIZEN_ENGINEER_MODE" +%else +export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE -DTIZEN_MOBILE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" +export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" +%endif export CFLAGS+=" -fpie -fvisibility=hidden" export LDFLAGS+=" -Wl,--rpath=/usr/lib -Wl,--as-needed -Wl,--unresolved-symbols=ignore-in-shared-libs -pie" @@ -72,3 +91,7 @@ rm -rf %{buildroot} %{TZ_SYS_RW_APP}/org.tizen.bt-syspopup/bin/bt-syspopup %{TZ_SYS_RW_APP}/org.tizen.bt-syspopup/res/edje/*.edj %{TZ_SYS_SHARE}/icons/default/small/org.tizen.bt-syspopup.png +%if "%{?profile}" == "wearable" +/usr/apps/org.tizen.bt-syspopup/shared/res/tables/org.tizen.bt-syspopup_ChangeableColorTable.xml +/usr/apps/org.tizen.bt-syspopup/shared/res/tables/org.tizen.bt-syspopup_FontInfoTable.xml +%endif diff --git a/src/bt-syspopup-m.c b/src/bt-syspopup-m.c new file mode 100644 index 0000000..b7b290e --- /dev/null +++ b/src/bt-syspopup-m.c @@ -0,0 +1,2428 @@ +/* +* bt-syspopup +* +* Copyright 2013 Samsung Electronics Co., Ltd +* +* Contact: Hocheol Seo +* GirishAshok Joshi +* DoHyun Pyun +* +* Licensed under the Flora License, Version 1.1 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.tizenopensource.org/license +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bt-syspopup-m.h" +#include +#include +#include +#include +#include + +static void __bluetooth_delete_input_view(struct bt_popup_appdata *ad); +static void __bluetooth_win_del(void *data); + +static void __bluetooth_input_keyback_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_input_mouseup_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_keyback_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_mouseup_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_keyback_auth_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_mouseup_auth_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_terminate(void *data); + +static void __bluetooth_remove_all_event(struct bt_popup_appdata *ad); + +static void __bluetooth_set_win_level(Evas_Object *parent); + +static void __popup_terminate(void); + +static int __bluetooth_term(bundle *b, void *data) +{ + struct bt_popup_appdata *ad; + + BT_DBG("System-popup: terminate"); + + if (data == NULL) + return 0; + + ad = (struct bt_popup_appdata *)data; + /* Destory UI and timer */ + if (ad->timer) { + BT_DBG("removing the timer"); + ecore_timer_del(ad->timer); + ad->timer = NULL; + } + __bluetooth_remove_all_event(ad); + __bluetooth_terminate(data); + return 0; +} + +static int __bluetooth_timeout(bundle *b, void *data) +{ + BT_DBG("System-popup: timeout"); + return 0; +} + +syspopup_handler handler = { + .def_term_fn = __bluetooth_term, + .def_timeout_fn = __bluetooth_timeout +}; + +/* Cleanup objects to avoid mem-leak */ +static void __bluetooth_cleanup(struct bt_popup_appdata *ad) +{ + ret_if(ad == NULL); + + if (ad->popup) { + evas_object_del(ad->popup); + ad->popup = NULL; + } + if (ad->layout) { + evas_object_del(ad->layout); + ad->layout = NULL; + } + if (ad->conform) { + evas_object_del(ad->conform); + ad->conform = NULL; + } + if (ad->agent_proxy) { + g_object_unref(ad->agent_proxy); + ad->agent_proxy = NULL; + } +} + +static void __bt_main_win_rot_changed_cb(void *data, Evas_Object *obj, + void *event) +{ + FN_START; + + ret_if(!data); + + struct bt_popup_appdata *ad = data; + int changed_ang = elm_win_rotation_get(obj); + BT_INFO("New angle: %d, old angle: %d", changed_ang, + ad->rotation); + if (changed_ang == ad->rotation) { + return; + } else { + ad->rotation = changed_ang; + } + + BT_INFO("Rotation: %d", ad->rotation); + + if (ad->popup) { + if (ad->event_type == BT_EVENT_PIN_REQUEST || + ad->event_type == BT_EVENT_PASSKEY_CONFIRM_REQUEST){ + if (ad->rotation == APP_DEVICE_ORIENTATION_0 || + ad->rotation == APP_DEVICE_ORIENTATION_180) + elm_layout_file_set(elm_object_content_get(ad->popup), + CUSTOM_POPUP_PATH, "passwd_popup"); + else + elm_layout_file_set(elm_object_content_get(ad->popup), + CUSTOM_POPUP_PATH, "passwd_popup_landscape_ly"); + } + } + FN_END; +} + +static void __bluetooth_cleanup_win(struct bt_popup_appdata *ad) +{ + ret_if(ad == NULL); + + if (ad->win_main) { + evas_object_smart_callback_del(ad->win_main, "wm,rotation,changed", + __bt_main_win_rot_changed_cb); + evas_object_del(ad->win_main); + ad->win_main = NULL; + } +} + +static void __bluetooth_player_free_job_cb(void *data) +{ + FN_START; + player_h sound_player = data; + player_state_e state = PLAYER_STATE_NONE; + + retm_if(sound_player == NULL, "invalid parameter"); + + if (player_get_state(sound_player, &state) == PLAYER_ERROR_NONE) { + + BT_INFO("the state of sound player %d", state); + + if (state == PLAYER_STATE_PLAYING) { + player_stop(sound_player); + player_unprepare(sound_player); + } + if (state == PLAYER_STATE_READY) { + player_unprepare(sound_player); + } + } + player_destroy(sound_player); + FN_END; +} + +static void __bluetooth_player_free(player_h sound_player) +{ + FN_START; + retm_if(sound_player == NULL, "invalid parameter"); + + ecore_job_add(__bluetooth_player_free_job_cb, sound_player); + sound_player = NULL; + FN_END; +} + +static void +__bluetooth_player_del_timeout_timer(struct bt_popup_appdata *ad) +{ + FN_START; + if (ad->playing_timer) { + ecore_timer_del(ad->playing_timer); + ad->playing_timer = NULL; + } + FN_END; +} + +static void +__bluetooth_player_completed_cb(void *user_data) +{ + retm_if(user_data == NULL, "invalid parameter"); + struct bt_popup_appdata *ad = user_data; + + BT_DBG("Media player completed"); + + __bluetooth_player_del_timeout_timer(ad); + __bluetooth_player_free(ad->player); +} + +static void +__bluetooth_player_interrupted_cb(player_interrupted_code_e code, void *user_data) +{ + retm_if(user_data == NULL, "invalid parameter"); + struct bt_popup_appdata *ad = user_data; + + BT_ERR("interrupt code [%d]", (int)code); + + __bluetooth_player_del_timeout_timer(ad); + __bluetooth_player_free(ad->player); +} + +static void +__bluetooth_player_error_cb(int error_code, void *user_data) +{ + retm_if(user_data == NULL, "invalid parameter"); + struct bt_popup_appdata *ad = user_data; + + BT_ERR("Error code [%d]", (int)error_code); + + __bluetooth_player_del_timeout_timer(ad); + __bluetooth_player_free(ad->player); +} + +static Eina_Bool __bluetooth_player_timeout_cb(void *data) +{ + retvm_if(data == NULL, ECORE_CALLBACK_CANCEL, "invalid parameter"); + struct bt_popup_appdata *ad = data; + + __bluetooth_player_free(ad->player); + ad->playing_timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static void __bluetooth_player_start_job_cb(void *data) +{ + FN_START; + int ret = PLAYER_ERROR_NONE; + ret_if(!data); + struct bt_popup_appdata *ad = data; + ret_if(!ad); + + ret = player_start(ad->player); + if (ret != PLAYER_ERROR_NONE) { + BT_ERR("player_start [%d]", ret); + __bluetooth_player_free(ad->player); + return; + } + ad->playing_timer = ecore_timer_add(15, + __bluetooth_player_timeout_cb, ad); + FN_END; +} + +static int __bluetooth_notify_event(struct bt_popup_appdata *ad) +{ + FN_START; + retvm_if(!ad, PLAYER_ERROR_INVALID_PARAMETER, "invalid parameter"); + int result; + char *path = NULL; + sound_session_type_e type = 1; + player_state_e state = PLAYER_STATE_NONE; + + int ret = PLAYER_ERROR_NONE; + int sndRet = SOUND_MANAGER_ERROR_NONE; + + BT_DBG("Notify event"); + + __bluetooth_player_del_timeout_timer(ad); + + if (ad->player != NULL) + __bluetooth_player_free(ad->player); + + sound_manager_get_session_type(&type); + if (type != SOUND_SESSION_TYPE_NOTIFICATION) { + sndRet = sound_manager_set_session_type(SOUND_SESSION_TYPE_NOTIFICATION); + if(sndRet != SOUND_MANAGER_ERROR_NONE) { + BT_ERR("sound_manager_set_session_type fail"); + return PLAYER_ERROR_INVALID_PARAMETER; + } + } + + ret = player_create(&ad->player); + if (ret != PLAYER_ERROR_NONE) { + BT_ERR("creating the player handle failed[%d]", ret); + ad->player= NULL; + return ret; + } + + ret = player_set_sound_type(ad->player, SOUND_TYPE_NOTIFICATION); + if (ret != PLAYER_ERROR_NONE) { + BT_ERR("player_set_sound_type() ERR: %x!!!!", ret); + __bluetooth_player_free(ad->player); + return ret; + } + + player_get_state(ad->player, &state); + if (state > PLAYER_STATE_READY) { + __bluetooth_player_free(ad->player); + return ret; + } + + /* Set the notification sound from vconf*/ + path = vconf_get_str(VCONF_NOTI_SOUND); + if (path) + { + ret = player_set_uri(ad->player, path); + if (ret != 0) + BT_ERR("player_set_uri Failed : %d", ret); + + } else { + BT_ERR("vconf_get_str failed"); + __bluetooth_player_free(ad->player); + return ret; + } + + ret = player_prepare(ad->player); + if (ret != PLAYER_ERROR_NONE) { + BT_ERR("realizing the player handle failed[%d]", ret); + __bluetooth_player_free(ad->player); + return ret; + } + + player_get_state(ad->player, &state); + if (state != PLAYER_STATE_READY) { + BT_ERR("state of player is invalid %d", state); + __bluetooth_player_free(ad->player); + return ret; + } + + /* register callback */ + ret = player_set_completed_cb(ad->player, __bluetooth_player_completed_cb, ad); + if (ret != PLAYER_ERROR_NONE) { + BT_ERR("player_set_completed_cb() ERR: %x!!!!", ret); + __bluetooth_player_free(ad->player); + return ret; + } + + ret = player_set_interrupted_cb(ad->player, __bluetooth_player_interrupted_cb, ad); + if (ret != PLAYER_ERROR_NONE) { + __bluetooth_player_free(ad->player); + return ret; + } + + ret = player_set_error_cb(ad->player, __bluetooth_player_error_cb, ad); + if (ret != PLAYER_ERROR_NONE) { + __bluetooth_player_free(ad->player); + return ret; + } + + ecore_job_add(__bluetooth_player_start_job_cb, ad); + + FN_END; +} + +static void __bluetooth_parse_event(struct bt_popup_appdata *ad, const char *event_type) +{ + if (!strcasecmp(event_type, "pin-request")) + ad->event_type = BT_EVENT_PIN_REQUEST; + else if (!strcasecmp(event_type, "passkey-confirm-request")) + ad->event_type = BT_EVENT_PASSKEY_CONFIRM_REQUEST; + else if (!strcasecmp(event_type, "passkey-request")) + ad->event_type = BT_EVENT_PASSKEY_REQUEST; + else if (!strcasecmp(event_type, "authorize-request")) + ad->event_type = BT_EVENT_AUTHORIZE_REQUEST; + else if (!strcasecmp(event_type, "app-confirm-request")) + ad->event_type = BT_EVENT_APP_CONFIRM_REQUEST; + else if (!strcasecmp(event_type, "push-authorize-request")) + ad->event_type = BT_EVENT_PUSH_AUTHORIZE_REQUEST; + else if (!strcasecmp(event_type, "confirm-overwrite-request")) + ad->event_type = BT_EVENT_CONFIRM_OVERWRITE_REQUEST; + else if (!strcasecmp(event_type, "keyboard-passkey-request")) + ad->event_type = BT_EVENT_KEYBOARD_PASSKEY_REQUEST; + else if (!strcasecmp(event_type, "bt-information")) + ad->event_type = BT_EVENT_INFORMATION; + else if (!strcasecmp(event_type, "exchange-request")) + ad->event_type = BT_EVENT_EXCHANGE_REQUEST; + else if (!strcasecmp(event_type, "phonebook-request")) + ad->event_type = BT_EVENT_PHONEBOOK_REQUEST; + else if (!strcasecmp(event_type, "message-request")) + ad->event_type = BT_EVENT_MESSAGE_REQUEST; + else if (!strcasecmp(event_type, "pairing-retry-request")) + ad->event_type = BT_EVENT_RETRY_PAIR_REQUEST; + else if (!strcasecmp(event_type, "music-auto-connect-request")) + ad->event_type = BT_EVENT_MUSIC_AUTO_CONNECT_REQUEST; + else if (!strcasecmp(event_type, "remote-legacy-pair-failed")) + ad->event_type = BT_EVENT_LEGACY_PAIR_FAILED_FROM_REMOTE; + else + ad->event_type = 0x0000; + return; +} + +static void __bluetooth_request_to_cancel(void) +{ + bt_device_cancel_bonding(); +} + +static void __bluetooth_remove_all_event(struct bt_popup_appdata *ad) +{ + BT_INFO("Remove event 0X%X", ad->event_type); + switch (ad->event_type) { + case BT_EVENT_PIN_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPinCode", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_STRING, "", G_TYPE_INVALID, + G_TYPE_INVALID); + + break; + + + case BT_EVENT_KEYBOARD_PASSKEY_REQUEST: + + __bluetooth_request_to_cancel(); + + break; + + case BT_EVENT_PASSKEY_CONFIRM_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyConfirmation", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + + break; + + case BT_EVENT_PASSKEY_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPasskey", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_STRING, "", G_TYPE_INVALID, + G_TYPE_INVALID); + + break; + + case BT_EVENT_PASSKEY_DISPLAY_REQUEST: + /* Nothing to do */ + break; + + case BT_EVENT_AUTHORIZE_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyAuthorize", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + + break; + + case BT_EVENT_APP_CONFIRM_REQUEST: + { + DBusMessage *msg; + int response; + + msg = dbus_message_new_signal( + BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + /* For timeout rejection is sent to be handled in + application */ + response = BT_AGENT_REJECT; + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, + DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, + msg, NULL, -1, NULL); + + dbus_message_unref(msg); + } + break; + + case BT_EVENT_PUSH_AUTHORIZE_REQUEST: + case BT_EVENT_PHONEBOOK_REQUEST: + case BT_EVENT_MESSAGE_REQUEST: + case BT_EVENT_EXCHANGE_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyAuthorize", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + + break; + + case BT_EVENT_CONFIRM_OVERWRITE_REQUEST: { + DBusMessage *msg; + int response = BT_AGENT_REJECT; + + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + if (msg == NULL) { + BT_ERR("msg == NULL, Allocation failed"); + break; + } + + dbus_message_append_args(msg, DBUS_TYPE_INT32, + &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + break; + } + + case BT_EVENT_RETRY_PAIR_REQUEST: { + DBusMessage *msg = NULL; + int response = BT_AGENT_REJECT; + + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, + DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + + break; + } + + default: + break; + } + + __bluetooth_win_del(ad); +} + +static int __bluetooth_request_timeout_cb(void *data) +{ + struct bt_popup_appdata *ad; + + if (data == NULL) + return 0; + + ad = (struct bt_popup_appdata *)data; + + BT_DBG("Request time out, Canceling reqeust"); + + /* Destory UI and timer */ + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } + + __bluetooth_remove_all_event(ad); + return 0; +} + +static void __bluetooth_input_request_cb(void *data, + Evas_Object *obj, void *event_info) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + const char *event = elm_object_text_get(obj); + int response; + char *input_text = NULL; + char *convert_input_text = NULL; + + if (ad == NULL) + return; + + /* BT_EVENT_PIN_REQUEST / BT_EVENT_PASSKEY_REQUEST */ + + input_text = (char *)elm_entry_entry_get(ad->entry); + + if (input_text) { + convert_input_text = + elm_entry_markup_to_utf8(input_text); + } + + if (!g_strcmp0(event, BT_STR_PAIR)) + response = BT_AGENT_ACCEPT; + else + response = BT_AGENT_CANCEL; + + if (convert_input_text == NULL) + return; + + BT_DBG_SECURE("PIN/Passkey[%s] event[%d] response[%d - %s]", + convert_input_text, ad->event_type, response, + (response == BT_AGENT_ACCEPT) ? "Accept" : "Cancel"); + + if (ad->event_type == BT_EVENT_PIN_REQUEST) { + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPinCode", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPasskey", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } + __bluetooth_delete_input_view(ad); + + free(convert_input_text); + + __bluetooth_win_del(ad); +} + +static void __bluetooth_input_cancel_cb(void *data, + Evas_Object *obj, void *event_info) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + + bt_device_cancel_bonding(); + + __bluetooth_win_del(ad); +} + +static void __bluetooth_passkey_confirm_cb(void *data, + Evas_Object *obj, void *event_info) +{ + if (obj == NULL || data == NULL) + return; + + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + const char *event = elm_object_text_get(obj); + + if (!g_strcmp0(event, BT_STR_CONFIRM)) { + dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyConfirmation", + G_TYPE_UINT, BT_AGENT_ACCEPT, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyConfirmation", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + } + + evas_object_del(obj); + + __bluetooth_win_del(ad); +} + +static int __bluetooth_init_app_signal(struct bt_popup_appdata *ad) +{ + if (NULL == ad) + return FALSE; + + e_dbus_init(); + ad->EDBusHandle = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!ad->EDBusHandle) { + BT_ERR("e_dbus_bus_get failed"); + return FALSE; + } else { + BT_DBG("e_dbus_bus_get success"); + e_dbus_request_name(ad->EDBusHandle, + BT_SYS_POPUP_IPC_NAME, 0, NULL, NULL); + } + return TRUE; +} + +static void __bluetooth_app_confirm_cb(void *data, + Evas_Object *obj, void *event_info) +{ + BT_DBG("__bluetooth_app_confirm_cb "); + if (obj == NULL || data == NULL) + return; + + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + const char *event = elm_object_text_get(obj); + + DBusMessage *msg = NULL; + int response; + + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + if (!g_strcmp0(event, BT_STR_OK)) + response = BT_AGENT_ACCEPT; + else + response = BT_AGENT_REJECT; + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + + evas_object_del(obj); + + __bluetooth_win_del(ad); +} + +static void __bluetooth_authorization_request_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + guint reply_val; + + if (obj == NULL || ad == NULL) + return; + + const char *event = elm_object_text_get(obj); + + if (!g_strcmp0(event, BT_STR_OK) || !g_strcmp0(event, BT_STR_ACCEPT) + || !g_strcmp0(event, BT_STR_ALLOW)) { + reply_val = (ad->make_trusted == TRUE) ? + BT_AGENT_ACCEPT_ALWAYS : BT_AGENT_ACCEPT; + } else { + reply_val = BT_AGENT_CANCEL; + } + + dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyAuthorize", + G_TYPE_UINT, reply_val, + G_TYPE_INVALID, G_TYPE_INVALID); + + ad->make_trusted = FALSE; + + __bluetooth_win_del(ad); +} + +static void __bluetooth_information_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + + if (obj == NULL || ad == NULL) + return; + + __bluetooth_win_del(ad); +} + +static void __bluetooth_push_authorization_request_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + if (obj == NULL || ad == NULL) + return; + + const char *event = elm_object_text_get(obj); + + if (!g_strcmp0(event, BT_STR_OK)) + dbus_g_proxy_call_no_reply(ad->obex_proxy, "ReplyAuthorize", + G_TYPE_UINT, BT_AGENT_ACCEPT, + G_TYPE_INVALID, G_TYPE_INVALID); + else + dbus_g_proxy_call_no_reply(ad->obex_proxy, "ReplyAuthorize", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + + __bluetooth_win_del(ad); +} + +static void __bluetooth_ime_hide(void) +{ + FN_START; + Ecore_IMF_Context *imf_context = NULL; + imf_context = ecore_imf_context_add(ecore_imf_context_default_id_get()); + if (imf_context) + ecore_imf_context_input_panel_hide(imf_context); + FN_END; +} + +static void __bluetooth_entry_keydown_cb(void *data, Evas *e, Evas_Object *obj, + void *event_info) +{ + FN_START; + Evas_Event_Key_Down *ev; + Evas_Object *entry = obj; + + if (data == NULL || event_info == NULL || entry == NULL) + return; + + ev = (Evas_Event_Key_Down *)event_info; + BT_INFO("ENTER ev->key:%s", ev->key); + + if (g_strcmp0(ev->key, "KP_Enter") == 0 || + g_strcmp0(ev->key, "Return") == 0) { + + Ecore_IMF_Context *imf_context = NULL; + + imf_context = + (Ecore_IMF_Context*)elm_entry_imf_context_get(entry); + if (imf_context) + ecore_imf_context_input_panel_hide(imf_context); + + elm_object_focus_set(entry, EINA_FALSE); + } + FN_END; +} + +static void __bluetooth_entry_change_cb(void *data, Evas_Object *obj, + void *event_info) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + char *input_text = NULL; + char *convert_input_text = NULL; + char *output_text = NULL; + int text_length = 0; + + input_text = (char *)elm_entry_entry_get(obj); + + if (input_text) { + convert_input_text = elm_entry_markup_to_utf8(input_text); + if (convert_input_text) { + text_length = strlen(convert_input_text); + + if (text_length == 0) { + elm_object_disabled_set(ad->edit_field_save_btn, + EINA_TRUE); + elm_entry_input_panel_return_key_disabled_set(obj, + EINA_TRUE); + } else { + elm_object_disabled_set(ad->edit_field_save_btn, + EINA_FALSE); + elm_entry_input_panel_return_key_disabled_set(obj, + EINA_FALSE); + } + + free(convert_input_text); + } + } +} + +static void __bluetooth_auth_check_clicked_cb(void *data, Evas_Object *obj, + void *event_info) +{ + struct bt_popup_appdata *ad = data; + Eina_Bool state = elm_check_state_get(obj); + + BT_INFO("Check %d", state); + ad->make_trusted = state; +} + +static void __bluetooth_auth_check_label_clicked_cb(void *data, Evas_Object *obj, + void *event_info) +{ + FN_START; + ret_if (!obj || !data); + + Elm_Object_Item *item = NULL; + item = (Elm_Object_Item *)event_info; + ret_if (!item); + + struct bt_popup_appdata *ad = data; + ret_if (!ad); + + Evas_Object *content = elm_object_item_part_content_get(item, "elm.icon.2"); + Evas_Object *ck = elm_object_part_content_get(content, "elm.swallow.content"); + + elm_genlist_item_selected_set(item, EINA_FALSE); + + Eina_Bool state = elm_check_state_get(ck); + + elm_check_state_set(ck, !state); + + BT_INFO("Check %d", !state); + ad->make_trusted = !state; + + FN_END; +} +static void __bluetooth_mouseup_auth_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + struct bt_popup_appdata *ad = data; + DBusMessage *msg = NULL; + int response = BT_AGENT_REJECT; + + BT_DBG("Mouse event callback function is called + "); + + if (ev->button == 3) { + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_auth_cb); + evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_auth_cb); + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + __bluetooth_win_del(ad); + } + BT_DBG("Mouse event callback -"); +} + +static void __bluetooth_keyback_auth_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + struct bt_popup_appdata *ad = data; + DBusMessage *msg = NULL; + int response = BT_AGENT_REJECT; + + BT_DBG("Keyboard event callback function is called + "); + +#if 0 + if (!strcmp(ev->keyname, KEY_BACK)) { + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_auth_cb); + evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_auth_cb); + + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + __bluetooth_win_del(ad); + } +#endif + BT_DBG("Keyboard Mouse event callback -"); +} + +static void __bluetooth_draw_auth_popup(struct bt_popup_appdata *ad, + const char *title, char *btn1_text, + char *btn2_text, void (*func) (void *data, + Evas_Object *obj, void *event_info)) +{ + char temp_str[BT_TITLE_STR_MAX_LEN + BT_TEXT_EXTRA_LEN] = { 0 }; + Evas_Object *btn1 = NULL; + Evas_Object *btn2 = NULL; + Evas_Object *layout = NULL; + Evas_Object *label = NULL; + Evas_Object *check = NULL; + BT_DBG("+"); + + ad->make_trusted = TRUE; + + ad->popup = elm_popup_add(ad->layout); + elm_popup_align_set(ad->popup, ELM_NOTIFY_ALIGN_FILL, 1.0); + elm_object_style_set(ad->popup, "transparent"); + + /*set window level to HIGH*/ + __bluetooth_set_win_level(ad->popup); + + layout = elm_layout_add(ad->popup); + elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "auth_popup"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + if (title != NULL) { + + elm_object_part_text_set(ad->popup, "title,text", + BT_STR_ALLOW_APP_PERMISSION); + + snprintf(temp_str, BT_TITLE_STR_MAX_LEN + BT_TEXT_EXTRA_LEN, + "%s", title); + + label = elm_label_add(ad->popup); + elm_object_style_set(label, "popup/default"); + elm_label_line_wrap_set(label, ELM_WRAP_MIXED); + elm_object_text_set(label, temp_str); + 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); + elm_object_part_content_set(layout, "popup_title", label); + evas_object_show(label); + } + + /* check */ + check = elm_check_add(ad->popup); + elm_object_style_set(check, "popup"); + elm_check_state_set(check, EINA_FALSE); + elm_object_text_set(check, BT_STR_DONT_ASK_AGAIN); + evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(check); + evas_object_smart_callback_add(check, "changed", + __bluetooth_auth_check_clicked_cb, ad); + elm_object_part_content_set(layout, "check", check); + + evas_object_show(layout); + elm_object_content_set(ad->popup, layout); + + btn1 = elm_button_add(ad->popup); + elm_object_style_set(btn1, "popup"); + elm_object_text_set(btn1, btn1_text); + elm_object_part_content_set(ad->popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + + btn2 = elm_button_add(ad->popup); + elm_object_style_set(btn2, "popup"); + elm_object_text_set(btn2, btn2_text); + elm_object_part_content_set(ad->popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", func, ad); + + evas_object_event_callback_add(ad->popup, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_auth_cb, ad); + evas_object_event_callback_add(ad->popup, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_auth_cb, ad); + + evas_object_show(ad->popup); + evas_object_show(ad->win_main); + + BT_DBG("-"); +} + +static void __bluetooth_mouseup_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + struct bt_popup_appdata *ad = data; + + BT_DBG("Mouse event callback function is called + "); + + if (ev->button == 3) { + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_cb); + evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_cb); + __bluetooth_remove_all_event(ad); + } + BT_DBG("Mouse event callback -"); +} + +static void __bluetooth_keyback_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + struct bt_popup_appdata *ad = data; + + BT_DBG("Keyboard event callback function is called %s+ ", ev->keyname); +#if 0 + if (!strcmp(ev->keyname, KEY_BACK)) { + + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_cb); + evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_cb); + __bluetooth_remove_all_event(ad); + } +#endif + BT_DBG("Keyboard Mouse event callback -"); +} + +static void __bluetooth_draw_popup(struct bt_popup_appdata *ad, + const char *title, char *text, char *btn1_text, + char *btn2_text, void (*func) (void *data, + Evas_Object *obj, void *event_info)) +{ + Evas_Object *btn1; + Evas_Object *btn2; + + BT_DBG("__bluetooth_draw_popup"); + + ad->popup = elm_popup_add(ad->layout); + elm_popup_align_set(ad->popup, ELM_NOTIFY_ALIGN_FILL, 1.0); + + /*set window level to HIGH*/ + __bluetooth_set_win_level(ad->popup); + +#ifdef TIZEN_REDWOOD + elm_object_style_set(ad->popup, "transparent"); +#endif + if (title != NULL) { + elm_object_part_text_set(ad->popup, "title,text", title); + } + + if (text != NULL) { + char *markup_text = NULL; + markup_text = elm_entry_utf8_to_markup(text); + elm_object_text_set(ad->popup, markup_text); + free(markup_text); + } + + if ((btn1_text != NULL) && (btn2_text != NULL)) { + btn1 = elm_button_add(ad->popup); + elm_object_style_set(btn1, "popup"); + elm_object_text_set(btn1, btn1_text); + elm_object_part_content_set(ad->popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + + btn2 = elm_button_add(ad->popup); + elm_object_style_set(btn2, "popup"); + elm_object_text_set(btn2, btn2_text); + elm_object_part_content_set(ad->popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", func, ad); + } else if (btn1_text != NULL) { + btn1 = elm_button_add(ad->popup); + elm_object_style_set(btn1, "popup"); + elm_object_text_set(btn1, btn1_text); + elm_object_part_content_set(ad->popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + } + + evas_object_event_callback_add(ad->popup, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_cb, ad); + evas_object_event_callback_add(ad->popup, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_cb, ad); + + evas_object_show(ad->popup); + evas_object_show(ad->win_main); + elm_object_focus_set(ad->popup, EINA_TRUE); + + BT_DBG("__bluetooth_draw_popup END"); +} + +static void __bluetooth_input_mouseup_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + FN_START; + Evas_Event_Mouse_Up *ev = event_info; + struct bt_popup_appdata *ad = data; + int response = BT_AGENT_CANCEL; + char *input_text = NULL; + char *convert_input_text = NULL; + + BT_DBG("ev->button : %d", ev->button); + + if (ev->button == 3) { + ret_if (ad == NULL); + evas_object_event_callback_del(ad->entry, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb); + evas_object_event_callback_del(ad->entry, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb); + evas_object_event_callback_del(ad->popup, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb); + evas_object_event_callback_del(ad->popup, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb); + + /* BT_EVENT_PIN_REQUEST / BT_EVENT_PASSKEY_REQUEST */ + input_text = (char *)elm_entry_entry_get(ad->entry); + if (input_text) { + convert_input_text = + elm_entry_markup_to_utf8(input_text); + } + if (convert_input_text == NULL) + return; + + if (ad->event_type == BT_EVENT_PIN_REQUEST) { + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPinCode", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPasskey", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } + __bluetooth_delete_input_view(ad); + free(convert_input_text); + if (ad->entry) { + evas_object_del(ad->entry); + ad->entry = NULL; + } + __bluetooth_win_del(ad); + } + FN_END; +} + +static void __bluetooth_input_keyback_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + FN_START; + Evas_Event_Key_Down *ev = event_info; + struct bt_popup_appdata *ad = data; + int response = BT_AGENT_CANCEL; + char *input_text = NULL; + char *convert_input_text = NULL; + +#if 0 + if (!strcmp(ev->keyname, KEY_BACK)) { + if (ad == NULL) + return; + evas_object_event_callback_del(ad->entry, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb); + evas_object_event_callback_del(ad->entry, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb); + evas_object_event_callback_del(ad->popup, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb); + evas_object_event_callback_del(ad->popup, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb); + /* BT_EVENT_PIN_REQUEST / BT_EVENT_PASSKEY_REQUEST */ + input_text = (char *)elm_entry_entry_get(ad->entry); + if (input_text) { + convert_input_text = + elm_entry_markup_to_utf8(input_text); + } + if (convert_input_text == NULL) + return; + + if (ad->event_type == BT_EVENT_PIN_REQUEST) { + BT_DBG("It is PIN Request event "); + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPinCode", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + BT_DBG("It is PASSKEYRequest event "); + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPasskey", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } + __bluetooth_delete_input_view(ad); + free(convert_input_text); + __bluetooth_win_del(ad); + } +#endif + FN_END; +} + +static void __bluetooth_pin_check_clicked_cb(void *data, Evas_Object *obj, + void *event_info) +{ + FN_START; + ret_if(!obj || !data); + + Eina_Bool state = elm_check_state_get(obj); + + BT_INFO("Check %d", state); + if (state) { + elm_entry_password_set((Evas_Object *)data, EINA_FALSE); + } else { + elm_entry_password_set((Evas_Object *)data, EINA_TRUE); + } + + FN_END; +} + +static void __bluetooth_pswd_check_box_sel(void *data, Evas_Object *obj, + void *event_info) +{ + FN_START; + ret_if (!obj || !data); + + Elm_Object_Item *item = NULL; + item = (Elm_Object_Item *)event_info; + ret_if (!item); + + struct bt_popup_appdata *ad = data; + ret_if (!ad); + + Evas_Object *content = elm_object_item_part_content_get(item, "elm.icon.2"); + Evas_Object *ck = elm_object_part_content_get(content, "elm.swallow.content"); + + elm_genlist_item_selected_set(item, EINA_FALSE); + + Eina_Bool state = elm_check_state_get(ck); + + elm_check_state_set(ck, !state); + + if (ad->entry) { + __bluetooth_pin_check_clicked_cb(ad->entry, ck, NULL); + } + + FN_END; +} + +static void __bluetooth_entry_edit_mode_show_cb(void *data, Evas *e, Evas_Object *obj, + void *event_info) +{ + FN_START; + evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, + __bluetooth_entry_edit_mode_show_cb); + + elm_object_focus_set(obj, EINA_TRUE); + FN_END; +} + +static void __bluetooth_entry_activated_cb(void *data, Evas_Object *obj, void *event_info) +{ + FN_START; + if (!obj) + return; + + elm_object_focus_set(obj, EINA_FALSE); + FN_END; +} + + + +static Evas_Object *__bluetooth_passwd_entry_icon_get( + void *data, Evas_Object *obj, const char *part) +{ + FN_START; + retv_if (obj == NULL || data == NULL, NULL); + + Evas_Object *entry = NULL; + Evas_Object *layout = NULL; + Evas_Object *button = NULL; + struct bt_popup_appdata *ad = data; + static Elm_Entry_Filter_Limit_Size limit_filter_data; + + if (!strcmp(part, "elm.icon.entry")) { + layout = elm_layout_add(obj); + elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "entry_style"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + + static Elm_Entry_Filter_Accept_Set accept_set = { + .accepted = "0123456789", + .rejected = NULL + }; + + entry = ea_editfield_add(layout, EA_EDITFIELD_SCROLL_SINGLELINE_PASSWORD); +#if 0 + ea_entry_selection_back_event_allow_set(entry, EINA_TRUE); +#endif + evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_prediction_allow_set(entry, EINA_FALSE); + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_object_signal_emit(entry, "elm,action,hide,search_icon", ""); + elm_object_part_text_set(entry, "elm.guide", BT_STR_PIN); + + elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set, + &accept_set); + + elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT); + + elm_entry_password_set(entry, EINA_TRUE); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NUMBERONLY); + + elm_entry_input_panel_return_key_type_set(entry, ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DONE); + elm_entry_input_panel_return_key_disabled_set(entry, EINA_TRUE); + + if (ad->event_type == BT_EVENT_PASSKEY_REQUEST) + limit_filter_data.max_char_count = BT_PK_MLEN; + else + limit_filter_data.max_char_count = BT_PIN_MLEN; + + elm_entry_markup_filter_append(entry, + elm_entry_filter_limit_size, &limit_filter_data); + + evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_entry_keydown_cb, ad); + + evas_object_smart_callback_add(entry, "activated", + __bluetooth_entry_activated_cb, ad); + evas_object_smart_callback_add(entry, "changed", + __bluetooth_entry_change_cb, ad); + + evas_object_event_callback_add(entry, EVAS_CALLBACK_SHOW, + __bluetooth_entry_edit_mode_show_cb, ad); + + elm_object_part_content_set(layout, "entry_part", entry); + //evas_object_show(entry); + //elm_object_focus_set(entry, EINA_TRUE); + + ad->entry = entry; + + } + + FN_END; + return layout; +} + +static char *__bluetooth_popup_desc_label_get(void *data, Evas_Object *obj, + const char *part) +{ + retv_if (!data, NULL); + + if (!strcmp(part, "elm.text.multiline")) + return (char *)data; + return NULL; +} + +static char *__bluetooth_access_check_label_get(void *data, Evas_Object *obj, + const char *part) +{ + FN_START; + retv_if (!data, NULL); + retv_if (!strcmp(part, "elm.text.main.left"), + g_strdup(BT_STR_DO_NOT_SHOW_AGAIN)); + FN_END; + return NULL; +} + +static char *__bluetooth_passwd_show_passwd_label_get(void *data, Evas_Object *obj, + const char *part) +{ + FN_START; + retv_if (!data, NULL); + retv_if (!strcmp(part, "elm.text.main.left"), g_strdup(BT_STR_SHOW_PIN)); + FN_END; + return NULL; +} +static Evas_Object *__bluetooth_access_check_icon_get( + void *data, Evas_Object *obj, const char *part) + +{ + FN_START; + retv_if (strcmp(part, "elm.icon.2"), NULL); + struct bt_popup_appdata *ad = data; + retv_if(!ad, NULL); + Evas_Object *layout = NULL; + layout = elm_layout_add(obj); + + elm_layout_theme_set(layout, "layout", "list/C/type.2", "default"); + Evas_Object *check = elm_check_add(layout); + evas_object_propagate_events_set(check, EINA_FALSE); + elm_object_style_set(check, "popup"); + if (ad->make_trusted == 0) + elm_check_state_set(check, EINA_FALSE); + else + elm_check_state_set(check, EINA_TRUE); + evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(check, "changed", + __bluetooth_auth_check_clicked_cb, ad); + + elm_object_tree_focus_allow_set(check, EINA_FALSE); + elm_layout_content_set(layout, "elm.swallow.content", check); + FN_END; + return layout; +} +static Evas_Object *__bluetooth_passwd_show_passwd_icon_get( + void *data, Evas_Object *obj, const char *part) + +{ + FN_START; + retv_if (strcmp(part, "elm.icon.2"), NULL); + struct bt_popup_appdata *ad = data; + retv_if(!ad, NULL); + Evas_Object *layout = NULL; + layout = elm_layout_add(obj); + + elm_layout_theme_set(layout, "layout", "list/C/type.2", "default"); + Evas_Object *check = elm_check_add(layout); + evas_object_propagate_events_set(check, EINA_FALSE); + elm_object_style_set(check, "popup"); + elm_check_state_set(check, EINA_FALSE); + evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_smart_callback_add(check, "changed", + __bluetooth_pin_check_clicked_cb, ad->entry); + + elm_object_tree_focus_allow_set(check, EINA_FALSE); + elm_layout_content_set(layout, "elm.swallow.content", check); + FN_END; + return layout; +} + +static void __bluetooth_draw_input_view(struct bt_popup_appdata *ad, + const char *title, const char *text, + void (*func) + (void *data, Evas_Object *obj, void *event_info)) +{ + FN_START; + Evas_Object *conformant = NULL; + Evas_Object *content = NULL; + Evas_Object *layout = NULL; + Evas_Object *passpopup = NULL; + Evas_Object *label = NULL; + Evas_Object *entry = NULL; + Evas_Object *check = NULL; + Evas_Object *l_button = NULL; + Evas_Object *r_button = NULL; + Ecore_IMF_Context *imf_context; + static Elm_Entry_Filter_Limit_Size limit_filter_data; + Evas_Object *genlist = NULL; + Elm_Object_Item *git = NULL; + + ret_if(ad == NULL || ad->win_main == NULL || ad->layout == NULL); + + evas_object_show(ad->win_main); + + passpopup = elm_popup_add(ad->layout); + elm_object_content_set(ad->layout, passpopup); + elm_object_style_set(passpopup, "no_effect"); + ad->popup = passpopup; + + /*set window level to HIGH*/ + __bluetooth_set_win_level(ad->popup); + + elm_object_part_text_set(passpopup, "title,text", title); + + elm_object_style_set(passpopup, "transparent"); + + layout = elm_layout_add(passpopup); + + ad->rotation = elm_win_rotation_get(ad->win_main); + BT_INFO("Start angle: %d", ad->rotation); + + if (ad->rotation == BT_ROTATE_0 || + ad->rotation == BT_ROTATE_180) + elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "passwd_popup"); + else + elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "passwd_popup_landscape_ly"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + genlist = elm_genlist_add(layout); + evas_object_size_hint_weight_set(genlist, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); + + /* Description */ + ad->passwd_desc_itc = elm_genlist_item_class_new(); + if (ad->passwd_desc_itc) { + ad->passwd_desc_itc->item_style = "multiline_main"; + ad->passwd_desc_itc->func.text_get = __bluetooth_popup_desc_label_get; + ad->passwd_desc_itc->func.content_get = NULL; + ad->passwd_desc_itc->func.state_get = NULL; + ad->passwd_desc_itc->func.del = NULL; + + git = elm_genlist_item_append(genlist, ad->passwd_desc_itc, g_strdup(text), NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(git, + ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + } + + /* Entry genlist item */ + ad->passwd_entry_itc = elm_genlist_item_class_new(); + if (ad->passwd_entry_itc) { + ad->passwd_entry_itc->item_style = "entry.icon"; + ad->passwd_entry_itc->func.text_get = NULL; + ad->passwd_entry_itc->func.content_get = __bluetooth_passwd_entry_icon_get; + ad->passwd_entry_itc->func.state_get = NULL; + ad->passwd_entry_itc->func.del = NULL; + + elm_genlist_item_append(genlist, ad->passwd_entry_itc, ad, + NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + + /* Show password */ + ad->passwd_show_passwd_itc = elm_genlist_item_class_new(); + if (ad->passwd_show_passwd_itc) { + ad->passwd_show_passwd_itc->item_style = "1line"; + ad->passwd_show_passwd_itc->func.text_get = __bluetooth_passwd_show_passwd_label_get; + ad->passwd_show_passwd_itc->func.content_get = __bluetooth_passwd_show_passwd_icon_get; + ad->passwd_show_passwd_itc->func.state_get = NULL; + ad->passwd_show_passwd_itc->func.del = NULL; + + git = elm_genlist_item_append(genlist, ad->passwd_show_passwd_itc, ad, + NULL, ELM_GENLIST_ITEM_NONE, + __bluetooth_pswd_check_box_sel, ad); + } + + l_button = elm_button_add(passpopup); + elm_object_style_set(l_button, "popup"); + elm_object_text_set(l_button, BT_STR_CANCEL); + elm_object_part_content_set(passpopup, "button1", l_button); + evas_object_smart_callback_add(l_button, "clicked", func, ad); + elm_object_tree_focus_allow_set(l_button, EINA_FALSE); + + + r_button = elm_button_add(passpopup); + elm_object_style_set(r_button, "popup"); + elm_object_text_set(r_button, BT_STR_PAIR); + elm_object_part_content_set(passpopup, "button2", r_button); + evas_object_smart_callback_add(r_button, "clicked", func, ad); + elm_object_disabled_set(r_button, EINA_TRUE); + elm_object_tree_focus_allow_set(r_button, EINA_FALSE); + ad->edit_field_save_btn = r_button; + + + evas_object_event_callback_add(ad->popup, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb, ad); + evas_object_event_callback_add(ad->popup, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb, ad); + + evas_object_event_callback_add(r_button, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb, ad); + evas_object_event_callback_add(r_button, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb, ad); + + evas_object_event_callback_add(l_button, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb, ad); + evas_object_event_callback_add(l_button, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb, ad); + +#if 0 + elm_genlist_realization_mode_set(genlist, EINA_TRUE); +#endif + evas_object_show(genlist); + elm_object_part_content_set(layout, "elm.swallow.layout", genlist); + + elm_object_content_set(passpopup, layout); + evas_object_show(passpopup); + evas_object_show(layout); + + FN_END; +} + +static void __bluetooth_draw_access_request_popup(struct bt_popup_appdata *ad, + const char *title, char *text, char *btn1_text, + char *btn2_text, void (*func) (void *data, + Evas_Object *obj, void *event_info)) +{ + char temp_str[BT_TITLE_STR_MAX_LEN + BT_TEXT_EXTRA_LEN] = { 0 }; + Evas_Object *layout = NULL; + Evas_Object *btn1 = NULL; + Evas_Object *btn2 = NULL; + Evas_Object *genlist = NULL; + Elm_Object_Item *git = NULL; + + BT_DBG("+"); + ad->make_trusted = FALSE; + + ad->popup = elm_popup_add(ad->layout); + elm_popup_align_set(ad->popup, ELM_NOTIFY_ALIGN_FILL, 1.0); + + /*set window level to HIGH*/ + __bluetooth_set_win_level(ad->popup); + + if (title != NULL) { + elm_object_part_text_set(ad->popup, "title,text", title); + } + + /* layout */ + layout = elm_layout_add(ad->popup); + elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "access_req_popup"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + genlist = elm_genlist_add(layout); + elm_genlist_homogeneous_set(genlist, EINA_TRUE); + evas_object_size_hint_weight_set(genlist, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); + + /* Description text*/ + ad->desc_itc = elm_genlist_item_class_new(); + if (ad->desc_itc) { + ad->desc_itc->item_style = "multiline_main"; + ad->desc_itc->func.text_get = __bluetooth_popup_desc_label_get; + ad->desc_itc->func.content_get = NULL; + ad->desc_itc->func.state_get = NULL; + ad->desc_itc->func.del = NULL; + + git = elm_genlist_item_append(genlist, ad->desc_itc, g_strdup(text), NULL, + ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(git, + ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + } + + /* Do not show again */ + ad->check_itc = elm_genlist_item_class_new(); + if (ad->check_itc) { + ad->check_itc->item_style = "1line"; + ad->check_itc->func.text_get = __bluetooth_access_check_label_get; + ad->check_itc->func.content_get = __bluetooth_access_check_icon_get; + ad->check_itc->func.state_get = NULL; + ad->check_itc->func.del = NULL; + + git = elm_genlist_item_append(genlist, ad->check_itc, ad, + NULL, ELM_GENLIST_ITEM_NONE, + __bluetooth_auth_check_label_clicked_cb, ad); + } + + if (btn1_text != NULL && btn2_text != NULL) { + /* Cancel button */ + btn1 = elm_button_add(ad->popup); + elm_object_style_set(btn1, "popup"); + elm_object_text_set(btn1, btn1_text); + elm_object_part_content_set(ad->popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + + /* Allow button */ + btn2 = elm_button_add(ad->popup); + elm_object_style_set(btn2, "popup"); + elm_object_text_set(btn2, btn2_text); + elm_object_part_content_set(ad->popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", func, ad); + } + +#if 0 + elm_genlist_realization_mode_set(genlist, EINA_TRUE); +#endif + evas_object_show(genlist); + elm_object_part_content_set(layout, "elm.swallow.layout", genlist); + + elm_object_content_set(ad->popup, layout); + evas_object_show(ad->popup); + evas_object_show(ad->win_main); + BT_DBG("-"); +} + +static void __bluetooth_draw_information_popup(struct bt_popup_appdata *ad, + const char *title, char *text, char *btn1_text, + void (*func) (void *data, Evas_Object *obj, void *event_info)) +{ + BT_DBG("+"); + Evas_Object *btn1 = NULL; + + ad->popup = elm_popup_add(ad->layout); + elm_popup_align_set(ad->popup, ELM_NOTIFY_ALIGN_FILL, 1.0); + ea_object_event_callback_add(ad->popup, EA_CALLBACK_BACK, func, ad); + + /*set window level to HIGH*/ + __bluetooth_set_win_level(ad->popup); + + if (title) + elm_object_part_text_set(ad->popup, "title,text", title); + + if (text) + elm_object_text_set(ad->popup, text); + + if (btn1_text != NULL) { + /* OK button */ + btn1 = elm_button_add(ad->popup); + elm_object_style_set(btn1, "popup"); + elm_object_text_set(btn1, btn1_text); + elm_object_part_content_set(ad->popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + } + + evas_object_show(ad->popup); + evas_object_show(ad->win_main); + BT_DBG("-"); +} + +static void __bluetooth_delete_input_view(struct bt_popup_appdata *ad) +{ + FN_START; + __bluetooth_ime_hide(); + FN_END; +} + +static DBusGProxy* __bluetooth_create_agent_proxy(DBusGConnection *conn, + const char *path) +{ +#ifdef __ENABLE_BLUEZ5__ + return dbus_g_proxy_new_for_name(conn, "org.projectx.bt", path, + "org.bluez.Agent1"); +#else + return dbus_g_proxy_new_for_name(conn, "org.projectx.bt", path, + "org.bluez.Agent"); +#endif +} + +static void +__bluetooth_popup_block_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + FN_START; + if(obj) + evas_object_del(obj); +} + +static void +__bluetooth_popup_timeout_cb(void *data, Evas_Object *obj, void *event_info) +{ + FN_START; + if(obj) + evas_object_del(obj); +} + +static void __bluetooth_draw_toast_popup(struct bt_popup_appdata *ad, char *toast_text) +{ + FN_START; + ad->popup = elm_popup_add(ad->win_main); + elm_object_style_set(ad->popup, "toast"); + evas_object_size_hint_weight_set(ad->popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + ea_object_event_callback_add(ad->popup, EA_CALLBACK_BACK, ea_popup_back_cb, NULL); + elm_object_part_text_set(ad->popup,"elm.text.content", toast_text); + evas_object_smart_callback_add(ad->popup, "block,clicked", __bluetooth_popup_block_clicked_cb, NULL); + + __bluetooth_set_win_level(ad->popup); + + evas_object_show(ad->popup); + FN_END; +} + +/* AUL bundle handler */ +static int __bluetooth_launch_handler(struct bt_popup_appdata *ad, + void *reset_data, const char *event_type) +{ + FN_START; + bundle *kb = (bundle *) reset_data; + char view_title[BT_TITLE_STR_MAX_LEN] = { 0 }; + char text[BT_GLOBALIZATION_STR_LENGTH] = { 0 }; + int timeout = 0; + const char *device_name = NULL; + const char *passkey = NULL; + const char *file = NULL; + const char *agent_path; + char *conv_str = NULL; + + if (!reset_data || !event_type) + return -1; + + BT_INFO("Event Type = %s[0X%X]", event_type, ad->event_type); + + if (!strcasecmp(event_type, "pin-request")) { + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + retv_if(!ad->agent_proxy, -1); + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + "%s", BT_STR_BLUETOOTH_PAIRING_REQUEST); + + snprintf(text, BT_GLOBALIZATION_STR_LENGTH, + BT_STR_ENTER_THE_PIN_TO_PAIR, conv_str); + + if (conv_str) + free(conv_str); + + /* Request user inputted PIN for basic pairing */ + __bluetooth_draw_input_view(ad, view_title, text, + __bluetooth_input_request_cb); + } else if (!strcasecmp(event_type, "passkey-confirm-request")) { + device_name = bundle_get_val(kb, "device-name"); + passkey = bundle_get_val(kb, "passkey"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name && passkey) { + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_CONFIRM_PASSKEY_PS_TO_PAIR_WITH_PS, + passkey, device_name); + + BT_INFO("title: %s", view_title); + + __bluetooth_draw_popup(ad, BT_STR_BLUETOOTH_PAIRING_REQUEST, + view_title, BT_STR_CANCEL, BT_STR_CONFIRM, + __bluetooth_passkey_confirm_cb); + } else { + timeout = BT_ERROR_TIMEOUT; + } + } else if (!strcasecmp(event_type, "passkey-request")) { + const char *device_name = NULL; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + "%s", BT_STR_BLUETOOTH_PAIRING_REQUEST); + + snprintf(text, BT_GLOBALIZATION_STR_LENGTH, + BT_STR_ENTER_THE_PIN_TO_PAIR, conv_str); + + if (conv_str) + free(conv_str); + + /* Request user inputted Passkey for basic pairing */ + __bluetooth_draw_input_view(ad, view_title, text, + __bluetooth_input_request_cb); + + } else if (!strcasecmp(event_type, "passkey-display-request")) { + device_name = bundle_get_val(kb, "device-name"); + passkey = bundle_get_val(kb, "passkey"); + + if (device_name && passkey) { + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ENTER_PS_ON_PS_TO_PAIR, passkey, device_name); + + BT_INFO("title: %s", view_title); + + __bluetooth_draw_popup(ad, BT_STR_SHOW_PASSWORD, view_title, + BT_STR_CANCEL, NULL, + __bluetooth_input_cancel_cb); + } else { + timeout = BT_ERROR_TIMEOUT; + } + } else if (!strcasecmp(event_type, "authorize-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ALLOW_PS_TO_CONNECT_Q, conv_str); + + if (conv_str) + free(conv_str); + + __bluetooth_draw_auth_popup(ad, view_title, BT_STR_CANCEL, BT_STR_ACCEPT, + __bluetooth_authorization_request_cb); + } else if (!strcasecmp(event_type, "app-confirm-request")) { + BT_DBG("app-confirm-request"); + timeout = BT_AUTHORIZATION_TIMEOUT; + + const char *title = NULL; + const char *type = NULL; + + title = bundle_get_val(kb, "title"); + type = bundle_get_val(kb, "type"); + + if (!title) + return -1; + + if (strcasecmp(type, "twobtn") == 0) { + __bluetooth_draw_popup(ad, NULL, title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_app_confirm_cb); + } else if (strcasecmp(type, "onebtn") == 0) { + timeout = BT_NOTIFICATION_TIMEOUT; + __bluetooth_draw_popup(ad, NULL, title, BT_STR_OK, NULL, + __bluetooth_app_confirm_cb); + } else if (strcasecmp(type, "none") == 0) { + timeout = BT_NOTIFICATION_TIMEOUT; + __bluetooth_draw_popup(ad, NULL, title, NULL, NULL, + __bluetooth_app_confirm_cb); + } + } else if (!strcasecmp(event_type, "push-authorize-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + file = bundle_get_val(kb, "file"); + + if (device_name) { + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_RECEIVE_PS_FROM_PS_Q, file, device_name); + } + + __bluetooth_draw_popup(ad, BT_STR_RECEIVE_FILE, view_title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_push_authorization_request_cb); + } else if (!strcasecmp(event_type, "confirm-overwrite-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + file = bundle_get_val(kb, "file"); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_OVERWRITE_FILE_Q, file); + + __bluetooth_draw_popup(ad, BT_STR_RECEIVE_FILE, view_title, + BT_STR_CANCEL, BT_STR_OK, + __bluetooth_app_confirm_cb); + } else if (!strcasecmp(event_type, "keyboard-passkey-request")) { + device_name = bundle_get_val(kb, "device-name"); + passkey = bundle_get_val(kb, "passkey"); + + if (device_name && passkey) { + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ENTER_PS_ON_PS_TO_PAIR, passkey, device_name); + + BT_INFO("title: %s", view_title); + + __bluetooth_draw_popup(ad, BT_STR_BLUETOOTH_PAIRING_REQUEST, + view_title, + BT_STR_CANCEL, NULL, + __bluetooth_input_cancel_cb); + } else { + timeout = BT_ERROR_TIMEOUT; + } + } else if (!strcasecmp(event_type, "bt-information")) { + BT_DBG("bt-information"); + timeout = BT_NOTIFICATION_TIMEOUT; + + const char *title = NULL; + const char *type = NULL; + + title = bundle_get_val(kb, "title"); + type = bundle_get_val(kb, "type"); + + if (title != NULL) { + if (strlen(title) > 255) + return -1; + } else + return -1; + + if (strcasecmp(type, "onebtn") == 0) { + __bluetooth_draw_popup(ad, NULL, title, BT_STR_OK, NULL, + __bluetooth_app_confirm_cb); + } else if (strcasecmp(type, "none") == 0) { + __bluetooth_draw_popup(ad, NULL, title, NULL, NULL, + __bluetooth_app_confirm_cb); + } + } else if (!strcasecmp(event_type, "exchange-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) { + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_WANTS_TO_SEND_YOU_A_FILE, device_name); + } + + __bluetooth_draw_popup(ad, BT_STR_RECEIVE_FILE, + view_title, BT_STR_CANCEL, BT_STR_ACCEPT, + __bluetooth_authorization_request_cb); + } else if (!strcasecmp(event_type, "phonebook-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + +#ifdef TIZEN_REDWOOD + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ALLOW_PS_PHONEBOOK_ACCESS_Q, conv_str); +#else + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_PS_CONTACT_REQUEST, conv_str); +#endif + + if (conv_str) + free(conv_str); + +#ifdef TIZEN_REDWOOD + __bluetooth_draw_auth_popup(ad, view_title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_authorization_request_cb); +#else + __bluetooth_draw_access_request_popup(ad, BT_STR_ALLOW_APP_PERMISSION, + view_title, BT_STR_CANCEL, BT_STR_ALLOW, + __bluetooth_authorization_request_cb); +#endif + } else if (!strcasecmp(event_type, "message-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + +#ifdef TIZEN_REDWOOD + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ALLOW_PS_TO_ACCESS_MESSAGES_Q, conv_str); +#else + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_PS_MESSAGE_REQUEST, conv_str); +#endif + + if (conv_str) + free(conv_str); + +#ifdef TIZEN_REDWOOD + __bluetooth_draw_auth_popup(ad, view_title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_authorization_request_cb); +#else + __bluetooth_draw_access_request_popup(ad, BT_STR_ALLOW_APP_PERMISSION, + view_title, BT_STR_CANCEL, BT_STR_ALLOW, + __bluetooth_authorization_request_cb); +#endif + } else if (!strcasecmp(event_type, "pairing-retry-request")) { + int ret; + device_name = bundle_get_val(kb, "device-name"); + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_UNABLE_TO_PAIR, conv_str); + + if (conv_str) + free(conv_str); + + ret = notification_status_message_post(view_title); + if (ret != NOTIFICATION_ERROR_NONE) + BT_ERR("notification_status_message_post() is failed : %d\n", ret); + } else if (!strcasecmp(event_type, "remote-legacy-pair-failed")) { + BT_DBG("remote-legacy-pair-failed"); + device_name = bundle_get_val(kb, "device-name"); + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + snprintf(text, BT_GLOBALIZATION_STR_LENGTH, + BT_STR_UNABLE_TO_PAIR, conv_str); + if (conv_str) + free(conv_str); + + __bluetooth_draw_information_popup(ad, "Bluetooth Error", + text, BT_STR_OK, + __bluetooth_information_cb); + } else if (!strcasecmp(event_type, "music-auto-connect-request")) { + __bluetooth_draw_toast_popup(ad, "Connecting..."); + } else { + return -1; + } + + if (ad->event_type != BT_EVENT_FILE_RECEIVED && timeout != 0) { + ad->timer = ecore_timer_add(timeout, (Ecore_Task_Cb) + __bluetooth_request_timeout_cb, ad); + } + BT_DBG("-"); + return 0; +} + +static void __popup_terminate(void) +{ + BT_DBG("+"); + elm_exit(); + BT_DBG("-"); +} + +static void __bluetooth_win_del(void *data) +{ + BT_DBG("+"); + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + + __bluetooth_cleanup(ad); + __bluetooth_cleanup_win(ad); + __popup_terminate(); + BT_DBG("+"); +} + +static void __bluetooth_set_win_level(Evas_Object *parent) +{ + ret_if(!parent); + Ecore_X_Window xwin; + int lock_state; + + xwin = elm_win_xwindow_get(parent); + if (xwin == 0) { + BT_ERR("elm_win_xwindow_get is failed"); + } else { + BT_DBG("Setting window type"); +#if 0 + ecore_x_netwm_window_type_set(xwin, + ECORE_X_WINDOW_TYPE_NOTIFICATION); +#endif + if (vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &lock_state) != 0) { + BT_ERR("Fail to get the lock_state value"); + } + +/* + Issue: Pairing request pop appears in the Lock screen when DUT is locked + and observed inconsistency. (TMWC-746) + In platform image, don't have the additional logic to handle this. + So just the set notification level as LOW. +*/ +#if 0 + if (lock_state == VCONFKEY_IDLE_UNLOCK) { + utilx_set_system_notification_level(ecore_x_display_get(), + xwin, UTILX_NOTIFICATION_LEVEL_HIGH); + } else + utilx_set_system_notification_level(ecore_x_display_get(), + xwin, UTILX_NOTIFICATION_LEVEL_LOW); +#endif + } +} + +static Evas_Object *__bluetooth_create_win(const char *name) +{ + Evas_Object *eo; + int w; + int h; + + eo = elm_win_add(NULL, name, ELM_WIN_BASIC); + retv_if(!eo, NULL); + + elm_win_alpha_set(eo, EINA_TRUE); + /* Handle rotation */ + if (elm_win_wm_rotation_supported_get(eo)) { + int rots[4] = {0, 90, 180, 270}; + elm_win_wm_rotation_available_rotations_set(eo, + (const int*)(&rots), 4); + } + 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 + return eo; +} + +static void __bluetooth_session_init(struct bt_popup_appdata *ad) +{ + DBusGConnection *conn = NULL; + GError *err = NULL; + + g_type_init(); + + conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &err); + + if (!conn) { + BT_ERR("ERROR: Can't get on system bus [%s]", + err->message); + g_error_free(err); + return; + } + + ad->conn = conn; + + ad->obex_proxy = dbus_g_proxy_new_for_name(conn, + "org.bluez.frwk_agent", + "/org/obex/ops_agent", + "org.openobex.Agent"); + if (!ad->obex_proxy) + BT_ERR("Could not create obex dbus proxy"); + + if (!__bluetooth_init_app_signal(ad)) + BT_ERR("__bt_syspopup_init_app_signal failed"); +} + +static void __bluetooth_vconf_change_cb(keynode_t *key, void *data) +{ + retm_if(NULL == key, "key is NULL"); + retm_if(NULL == data, "data is NULL"); + struct bt_popup_appdata *ad = data; + + char *vconf_name = vconf_keynode_get_name(key); + + if (!g_strcmp0(vconf_name, VCONFKEY_IDLE_LOCK_STATE) && + ad->popup) + __bluetooth_set_win_level(ad->popup); +} + +static bool __bluetooth_create(void *data) +{ + struct bt_popup_appdata *ad = data; + Evas_Object *win = NULL; + Evas_Object *conformant = NULL; + Evas_Object *layout = NULL; + int ret; + + BT_DBG("__bluetooth_create() start."); + + /* create window */ + win = __bluetooth_create_win(PACKAGE); + retv_if (win == NULL, false); + +#if 0 + /* Enable Changeable UI feature */ + ea_theme_changeable_ui_enabled_set(EINA_TRUE); +#endif + + evas_object_smart_callback_add(win, "wm,rotation,changed", + __bt_main_win_rot_changed_cb, data); + ad->win_main = win; + + conformant = elm_conformant_add(ad->win_main); + retv_if(!conformant, false); + + elm_win_conformant_set(ad->win_main, EINA_TRUE); + elm_win_resize_object_add(ad->win_main, conformant); + evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(conformant, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(conformant); + ad->conform = conformant; + + layout = elm_layout_add(conformant); + elm_object_content_set(conformant, layout); + ad->layout = layout; + evas_object_show(layout); + + /* init internationalization */ + bindtextdomain(BT_COMMON_PKG, BT_LOCALEDIR); + textdomain(BT_COMMON_PKG); + + ecore_imf_init(); + + __bluetooth_session_init(ad); + ret = vconf_notify_key_changed(VCONFKEY_IDLE_LOCK_STATE, + __bluetooth_vconf_change_cb, ad); + if (ret != 0) + BT_ERR("vconf_notify_key_changed fail!"); + if (bt_initialize() != BT_ERROR_NONE) { + BT_ERR("bt_initialize is failed"); + } + + return true; +} + +static void __bluetooth_terminate(void *data) +{ + struct bt_popup_appdata *ad = data; + + if (bt_deinitialize() != BT_ERROR_NONE) { + BT_ERR("bt_deinitialize is failed"); + } + __bluetooth_ime_hide(); + + if (ad->conn) { + dbus_g_connection_unref(ad->conn); + ad->conn = NULL; + } + + if (ad->popup) + evas_object_del(ad->popup); + + if (ad->win_main) + evas_object_del(ad->win_main); + + ad->popup = NULL; + ad->win_main = NULL; +} + +static void __bluetooth_pause(void *data) +{ + return; +} + +static void __bluetooth_resume(void *data) +{ + return; +} + +static void __bluetooth_reset(app_control_h app_control, void *data) +{ + struct bt_popup_appdata *ad = data; + bundle *b = NULL; + const char *event_type = NULL; + int ret = 0; + + BT_DBG("__bluetooth_reset()"); + + if (ad == NULL) { + BT_ERR("App data is NULL"); + return; + } + ret = app_control_export_as_bundle(app_control, &b); + if (ret != 0) { + BT_ERR("Failed to Convert the service handle to bundle data"); + free(b); + return; + } + /* Start Main UI */ + event_type = bundle_get_val(b, "event-type"); + BT_DBG("event-type: %s", event_type); + + if (event_type != NULL) { + if (!strcasecmp(event_type, "terminate")) { + __bluetooth_win_del(ad); + goto release; + } + + if (syspopup_has_popup(b)) + __bluetooth_cleanup(ad); /* Destroy the existing popup*/ + + __bluetooth_parse_event(ad, event_type); + + if (syspopup_reset(b) == -1 && + syspopup_create(b, &handler, ad->win_main, ad) == -1) { + BT_ERR("Both syspopup_create and syspopup_reset failed"); + __bluetooth_remove_all_event(ad); + } else { + ret = __bluetooth_launch_handler(ad, + b, event_type); + + if (ret != 0) + __bluetooth_remove_all_event(ad); + + __bluetooth_notify_event(ad); + + /* Change LCD brightness */ + ret = device_display_change_state(DISPLAY_STATE_NORMAL); + if (ret != 0) + BT_ERR("Fail to change LCD"); + } + } else { + BT_ERR("event type is NULL "); + } +release : + bundle_free(b); +} + +EXPORT int main(int argc, char *argv[]) +{ + BT_DBG("Start bt-syspopup main()"); + + ui_app_lifecycle_callback_s callback = {0,}; + + struct bt_popup_appdata ad = {0,}; + + callback.create = __bluetooth_create; + callback.terminate = __bluetooth_terminate; + callback.pause = __bluetooth_pause; + callback.resume = __bluetooth_resume; + callback.app_control = __bluetooth_reset; + + BT_DBG("ui_app_main() is called."); + int ret = ui_app_main(argc, argv, &callback, &ad); + if (ret != APP_ERROR_NONE) { + BT_ERR("ui_app_main() is failed. err = %d", ret); + } + + BT_DBG("End bt-syspopup main()"); + return ret; +} diff --git a/src/bt-syspopup-m.h b/src/bt-syspopup-m.h new file mode 100644 index 0000000..c808ada --- /dev/null +++ b/src/bt-syspopup-m.h @@ -0,0 +1,296 @@ +/* +* bt-syspopup +* +* Copyright 2013 Samsung Electronics Co., Ltd +* +* Contact: Hocheol Seo +* GirishAshok Joshi +* DoHyun Pyun +* +* Licensed under the Flora License, Version 1.1 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.tizenopensource.org/license +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +#ifndef __DEF_BT_SYSPOPUP_H_ +#define __DEF_BT_SYSPOPUP_H_ + +#include +#include +#include +#include +#include + +#ifndef PACKAGE_NAME +#define PACKAGE_NAME "org.tizen.bt-syspopup" +#endif + +#ifndef PREFIX +#define PREFIX "/usr/apps"PACKAGE_NAME +#endif + +#define EXPORT __attribute__((visibility("default"))) + +#define TEMP_DIR "/tmp" + +#define PACKAGE "bt-syspopup" +#define APPNAME "bt-syspopup" +#define ICON_DIR PREFIX"/res/default/small/icon" + +#define CUSTOM_POPUP_PATH PREFIX"/res/edje/custom_popup.edj" + +#define BT_COMMON_PKG "ug-bluetooth-efl" +#define BT_LOCALEDIR "/usr/apps/ug-bluetooth-efl/shared/res/locale" + +#define _EDJ(obj) elm_layout_edje_get(obj) + +#define BT_AUTHENTICATION_TIMEOUT 35 +#define BT_AUTHORIZATION_TIMEOUT 25 +#define BT_NOTIFICATION_TIMEOUT 2 +#define BT_ERROR_TIMEOUT 1 + +#define BT_PIN_MLEN 16 /* Pin key max length */ +#define BT_PK_MLEN 6 /* Passkey max length */ +#define BT_CONTROLBAR_MAX_LENGTH 3 + +#define BT_GLOBALIZATION_STR_LENGTH 256 +#define BT_DEVICE_NAME_LENGTH_MAX 256 +#define BT_FILE_NAME_LENGTH_MAX 256 +#define BT_TEXT_EXTRA_LEN 20 + +#define BT_TITLE_STR_MAX_LEN \ + (BT_GLOBALIZATION_STR_LENGTH+BT_DEVICE_NAME_LENGTH_MAX+BT_FILE_NAME_LENGTH_MAX) + +#define BT_MESSAGE_STRING_SIZE 256*2+1 + +#undef LOG_TAG +#define LOG_TAG "BLUETOOTH_SYSPOPUP" + + +#define BT_DBG(format, args...) SLOGD(format, ##args) +#define BT_ERR(format, args...) SLOGE(format, ##args) +#define BT_INFO(format, args...) SLOGI(format, ##args) + +#define FN_START BT_DBG("[ENTER FUNC]"); +#define FN_END BT_DBG("[EXIT FUNC]"); + +#define BT_DBG_SECURE(fmt, args...) SECURE_SLOGD(fmt, ##args) +#define BT_ERR_SECURE(fmt, args...) SECURE_SLOGE(fmt, ##args) + +#define ret_if(expr) \ + do { \ + if (expr) { \ + BT_ERR("(%s) return", #expr); \ + return; \ + } \ + } while (0); + +#define retv_if(expr, val) \ + do { \ + if (expr) { \ + BT_ERR("(%s) return", #expr); \ + return (val); \ + } \ + } while (0); + +#define retm_if(expr, fmt, arg...) \ + do { \ + if (expr) { \ + BT_ERR(fmt, ##arg); \ + BT_ERR("(%s) return", #expr); \ + return; \ + } \ + } while (0); + +#define retvm_if(expr, val, fmt, arg...) \ + do { \ + if (expr) { \ + BT_ERR(fmt, ##arg); \ + BT_ERR("(%s) return", #expr); \ + return (val); \ + } \ + } while (0); + +#define BT_SYS_POPUP_IPC_NAME "org.projectx" +#define BT_SYS_POPUP_IPC_RESPONSE_OBJECT "/org/projectx/bt_syspopup_res" +#define BT_SYS_POPUP_INTERFACE "User.Bluetooth.syspopup" +#define BT_SYS_POPUP_METHOD_RESPONSE "Response" + +/* String defines to support multi-languages */ +#define BT_STR_ENTER_PIN \ + dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_ENTERPIN") +#define BT_STR_ALLOW_PS_TO_CONNECT_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_ALLOW_PS_TO_CONNECT_Q") + +#define BT_STR_RECEIVE_FILE \ + dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_RECEIVE_FILES_ABB") + +#define BT_STR_RECEIVE_PS_FROM_PS_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_RECEIVE_PS_FROM_PS_Q") + +#define BT_STR_WANTS_TO_SEND_YOU_A_FILE \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_PS_WANTS_TO_SEND_YOU_A_FILE") + +#define BT_STR_PASSKEY_MATCH_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_MATCH_PASSKEYS_ON_PS_Q") + +#define BT_STR_OVERWRITE_FILE_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_PS_ALREADY_EXISTS_OVERWRITE_Q") + +#define BT_STR_ENTER_PS_ON_PS_TO_PAIR \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_ENTER_P1SS_ON_P2SS_TO_PAIR_THEN_PRESS_ENTER") + +#define BT_STR_RECEIVE_FILE_FROM_PS_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_RECEIVE_FILE_FROM_PS_Q") + +/* Need to convert the design ID */ +#define BT_STR_BLUETOOTH_PAIRING_REQUEST \ + dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_BLUETOOTH_PAIRING_REQUEST") + +#define BT_STR_ENTER_THE_PIN_TO_PAIR \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_ENTER_THE_PIN_TO_PAIR_WITH_PS_HTRY_0000_OR_1234") + +#define BT_STR_SHOW_PASSWORD \ + dgettext(BT_COMMON_PKG, "IDS_BT_BODY_SHOW_PASSWORD") + +#define BT_STR_SHOW_PIN \ + dgettext(BT_COMMON_PKG, "IDS_ST_MBODY_SHOW_PIN") + +#define BT_STR_CONFIRM_PASSKEY_PS_TO_PAIR_WITH_PS \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_CONFIRM_THE_PIN_HP1SS_TO_PAIR_WITH_P2SS") + +#define BT_STR_ALLOW_PS_PHONEBOOK_ACCESS_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_PS_IS_REQUESTING_PERMISSION_TO_CONNECT_TO_YOUR_CONTACTS") + +#define BT_STR_ALLOW_PS_TO_ACCESS_MESSAGES_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_PS_IS_REQUESTING_PERMISSION_TO_CONNECT_TO_YOUR_MESSAGES") + +#define BT_STR_DONT_ASK_AGAIN \ + dgettext(BT_COMMON_PKG, "IDS_BT_BODY_DONT_ASK_AGAIN") + +#define BT_STR_PIN_ERROR_TRY_AGAIN_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_INCORRECT_PIN_TRY_AGAIN_Q") + +#define BT_STR_TIMEOUT_TRY_AGAIN_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_BLUETOOTH_TIMEOUT_TRY_AGAIN_Q") + +#define BT_STR_PIN \ + dgettext(BT_COMMON_PKG, "IDS_ST_BODY_PIN") + +#define BT_STR_UNABLE_TO_PAIR \ + dgettext(BT_COMMON_PKG, "IDS_NFC_TPOP_FAILED_TO_PAIR_WITH_PS") + +#define BT_STR_ACCESS_REQUEST\ + dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_ACCESS_REQUEST") + +#define BT_STR_PS_CONTACT_REQUEST\ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_PS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_CONTACTS") + +#define BT_STR_PS_MESSAGE_REQUEST\ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_PS_IS_REQUESTING_PERMISSION_TO_ACCESS_YOUR_MESSAGES") + +#define BT_STR_DO_NOT_SHOW_AGAIN\ + dgettext(BT_COMMON_PKG, "IDS_EMAIL_BODY_DO_NOT_SHOW_AGAIN_VZW") + +#define BT_STR_ALLOW_APP_PERMISSION\ + dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_ALLOW_APPLICATION_PERMISSION") + +#define BT_STR_OK dgettext(BT_COMMON_PKG, "IDS_BT_BUTTON_OK") +#define BT_STR_PAIR dgettext(BT_COMMON_PKG, "IDS_BT_BUTTON_PAIR") +#define BT_STR_CONFIRM dgettext(BT_COMMON_PKG, "IDS_COM_SK_CONFIRM") +#define BT_STR_RECEIVE dgettext(BT_COMMON_PKG, "IDS_COM_BODY_RECEIVE") +#define BT_STR_YES dgettext(BT_COMMON_PKG, "IDS_BR_SK_YES") +#define BT_STR_NO dgettext(BT_COMMON_PKG, "IDS_BR_SK_NO") +#define BT_STR_DONE dgettext(BT_COMMON_PKG, "IDS_BR_SK_DONE") +#define BT_STR_CANCEL dgettext(BT_COMMON_PKG, "IDS_BR_SK_CANCEL") +#define BT_STR_ALLOW dgettext(BT_COMMON_PKG, "IDS_BR_OPT_ALLOW") +#define BT_STR_ACCEPT dgettext(BT_COMMON_PKG, "IDS_BT_BUTTON_ACCEPT") + +#define VCONF_NOTI_SOUND "db/setting/sound/noti/msg_ringtone_path" + +typedef enum { + BT_CHANGED_MODE_ENABLE, + BT_CHANGED_MODE_DISABLE, +} bt_changed_mode_type_t; + +typedef enum { + BT_EVENT_PIN_REQUEST = 0x0001, + BT_EVENT_PASSKEY_CONFIRM_REQUEST = 0x0002, + BT_EVENT_PASSKEY_REQUEST = 0x0004, + BT_EVENT_PASSKEY_DISPLAY_REQUEST = 0x0008, + BT_EVENT_AUTHORIZE_REQUEST = 0x0010, + BT_EVENT_APP_CONFIRM_REQUEST = 0x0020, + BT_EVENT_PUSH_AUTHORIZE_REQUEST = 0x0040, + BT_EVENT_CONFIRM_OVERWRITE_REQUEST = 0x0080, + BT_EVENT_FILE_RECEIVED = 0x0100, + BT_EVENT_KEYBOARD_PASSKEY_REQUEST = 0x0200, + BT_EVENT_INFORMATION = 0x0400, + BT_EVENT_TERMINATE = 0x0800, + BT_EVENT_EXCHANGE_REQUEST = 0x1000, + BT_EVENT_PHONEBOOK_REQUEST = 0x2000, + BT_EVENT_MESSAGE_REQUEST = 0x4000, + BT_EVENT_RETRY_PAIR_REQUEST = 0x8000, + BT_EVENT_MUSIC_AUTO_CONNECT_REQUEST = 0x1100, + BT_EVENT_LEGACY_PAIR_FAILED_FROM_REMOTE, +} bt_popup_event_type_t; + +typedef enum { + BT_AGENT_ACCEPT, + BT_AGENT_REJECT, + BT_AGENT_CANCEL, + BT_CORE_AGENT_TIMEOUT, + BT_AGENT_ACCEPT_ALWAYS, +} bt_agent_accept_type_t; + +typedef enum { + BT_ROTATE_0 = 0, + BT_ROTATE_90 = 90, + BT_ROTATE_180 = 180, + BT_ROTATE_270 = 270, +} bt_rotate_mode_t; + +struct bt_popup_appdata { + Evas *evas; + Evas_Object *win_main; + Evas_Object *conform; + Evas_Object *layout; + Evas_Object *popup; + + /* Passkey layout objects */ + Evas_Object *entry; + Evas_Object *edit_field_save_btn; + Evas_Object *ticker_noti; + Elm_Genlist_Item_Class *passwd_desc_itc; + Elm_Genlist_Item_Class *passwd_entry_itc; + Elm_Genlist_Item_Class *passwd_show_passwd_itc; + + /*Access Request layout objects */ + Elm_Genlist_Item_Class *desc_itc; + Elm_Genlist_Item_Class *check_itc; + + Ecore_Timer *timer; + + DBusGProxy *agent_proxy; + DBusGProxy *obex_proxy; + E_DBus_Connection *EDBusHandle; + DBusGConnection *conn; + + int changed_mode; + bt_rotate_mode_t rotation; + gboolean make_trusted; + bt_popup_event_type_t event_type; + + player_h player; + Ecore_Timer *playing_timer; +}; + +#endif /* __DEF_BT_SYSPOPUP_H_ */ diff --git a/src/bt-syspopup-w.c b/src/bt-syspopup-w.c new file mode 100644 index 0000000..2de8a43 --- /dev/null +++ b/src/bt-syspopup-w.c @@ -0,0 +1,2336 @@ +/* +* bt-syspopup +* +* Copyright 2013 Samsung Electronics Co., Ltd +* +* Contact: Hocheol Seo +* GirishAshok Joshi +* DoHyun Pyun +* +* Licensed under the Flora License, Version 1.1 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.tizenopensource.org/license +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bt-syspopup-w.h" +#include +#include + +#define COLOR_TABLE "/usr/apps/org.tizen.bt-syspopup/shared/res/tables/org.tizen.bt-syspopup_ChangeableColorTable.xml" +#define FONT_TABLE "/usr/apps/org.tizen.bt-syspopup/shared/res/tables/org.tizen.bt-syspopup_FontInfoTable.xml" + +static char pin_value[BT_PIN_MLEN + 1] = {0,}; +static int pin_index = 0; +static Ecore_Timer* pass_timer = 0; + +static struct _info { + const char *part_name; + const char *popup_name; + int pressed; + const char *tts_name; + Evas_Object *tts_button; +} keypad_info[12] = { + {"button_00", "popup_00", 0, "0", NULL}, + {"button_01", "popup_01", 0, "1", NULL}, + {"button_02", "popup_02", 0, "2", NULL}, + {"button_03", "popup_03", 0, "3", NULL}, + {"button_04", "popup_04", 0, "4", NULL}, + {"button_05", "popup_05", 0, "5", NULL}, + {"button_06", "popup_06", 0, "6", NULL}, + {"button_07", "popup_07", 0, "7", NULL}, + {"button_08", "popup_08", 0, "8", NULL}, + {"button_09", "popup_09", 0, "9", NULL}, + {"confirm", "popup_confirm", 0, "Enter", NULL}, + {"button_clear", "popup_clear", 0, "Back", NULL}, +}; + +static void __bluetooth_delete_input_view(struct bt_popup_appdata *ad); +static void __bluetooth_win_del(void *data); + +static void __bluetooth_set_win_level(Evas_Object *parent); + +static void __bluetooth_input_keyback_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_input_mouseup_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_keyback_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_mouseup_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_keyback_auth_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); + +static void __bluetooth_mouseup_auth_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info); +static void __bluetooth_terminate(void *data); + +static int __bt_error_toast_timeout_cb(void *data); + +static void __bt_draw_error_toast_popup(struct bt_popup_appdata *ad, char *toast_text); + +static void __bt_draw_toast_popup(struct bt_popup_appdata *ad, char *toast_text); + +static void __bluetooth_remove_all_event(struct bt_popup_appdata *ad); + +static int __bluetooth_term(bundle *b, void *data) +{ + BT_DBG("System-popup: terminate"); + __bluetooth_remove_all_event((struct bt_popup_appdata *)data); + __bluetooth_terminate(data); + return 0; +} + +static int __bluetooth_timeout(bundle *b, void *data) +{ + BT_DBG("System-popup: timeout"); + return 0; +} + +syspopup_handler handler = { + .def_term_fn = __bluetooth_term, + .def_timeout_fn = __bluetooth_timeout +}; + +/* Cleanup objects to avoid mem-leak */ +static void __bluetooth_cleanup(struct bt_popup_appdata *ad) +{ + BT_DBG("+"); + + if (ad == NULL) + return; + + if (ad->viberation_id > 0) { + g_source_remove(ad->viberation_id); + ad->viberation_id = 0; + } + + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } + + if (ad->popup) { + elm_access_object_unregister(ad->popup); + evas_object_del(ad->popup); + ad->popup = NULL; + } + + if (ad->ly_pass) { + evas_object_del(ad->ly_pass); + ad->ly_pass = NULL; + } + + if (ad->ly_keypad) { + evas_object_del(ad->ly_keypad); + ad->ly_keypad = NULL; + } + + if (ad->win_main) { + evas_object_del(ad->win_main); + ad->win_main = NULL; + } + + if (ad->agent_proxy) { + g_object_unref(ad->agent_proxy); + ad->agent_proxy = NULL; + } + + BT_DBG("-"); +} + +static void __bluetooth_set_win_level(Evas_Object *parent) +{ + Ecore_X_Window xwin; + xwin = elm_win_xwindow_get(parent); + if (xwin == 0) { + BT_ERR("elm_win_xwindow_get is failed"); + } else { + BT_DBG("Setting window type"); + ecore_x_netwm_window_type_set(xwin, + ECORE_X_WINDOW_TYPE_NOTIFICATION); + utilx_set_system_notification_level(ecore_x_display_get(), + xwin, UTILX_NOTIFICATION_LEVEL_HIGH); + } +} + +static void __lock_display() +{ + int ret = display_lock_state(LCD_NORMAL, GOTO_STATE_NOW | HOLD_KEY_BLOCK, 0); + if (ret < 0) + BT_ERR("LCD Lock failed"); +} + +static void __unlock_display() +{ + int ret = display_unlock_state(LCD_NORMAL, PM_RESET_TIMER); + if (ret < 0) + BT_ERR("LCD Unlock failed"); +} + +static void __bluetooth_notify_event(feedback_pattern_e feedback) +{ + int result; + + BT_DBG("Notify event"); + + result = feedback_initialize(); + if (result != FEEDBACK_ERROR_NONE) { + BT_ERR("feedback_initialize error : %d", result); + return; + } + + result = feedback_play(feedback); + BT_INFO("feedback [%d], ret value [%d]", feedback, result); + + result = feedback_deinitialize(); + if (result != FEEDBACK_ERROR_NONE) { + BT_INFO("feedback_initialize error : %d", result); + return; + } +} + +static gboolean __bluetooth_pairing_pattern_cb(gpointer data) +{ + __bluetooth_notify_event(FEEDBACK_PATTERN_BT_WAITING); + + return TRUE; +} + +static void __bluetooth_parse_event(struct bt_popup_appdata *ad, const char *event_type) +{ + BT_DBG("+"); + + if (!strcasecmp(event_type, "pin-request")) + ad->event_type = BT_EVENT_PIN_REQUEST; + else if (!strcasecmp(event_type, "passkey-confirm-request")) + ad->event_type = BT_EVENT_PASSKEY_CONFIRM_REQUEST; + else if (!strcasecmp(event_type, "passkey-request")) + ad->event_type = BT_EVENT_PASSKEY_REQUEST; + else if (!strcasecmp(event_type, "authorize-request")) + ad->event_type = BT_EVENT_AUTHORIZE_REQUEST; + else if (!strcasecmp(event_type, "app-confirm-request")) + ad->event_type = BT_EVENT_APP_CONFIRM_REQUEST; + else if (!strcasecmp(event_type, "push-authorize-request")) + ad->event_type = BT_EVENT_PUSH_AUTHORIZE_REQUEST; + else if (!strcasecmp(event_type, "confirm-overwrite-request")) + ad->event_type = BT_EVENT_CONFIRM_OVERWRITE_REQUEST; + else if (!strcasecmp(event_type, "keyboard-passkey-request")) + ad->event_type = BT_EVENT_KEYBOARD_PASSKEY_REQUEST; + else if (!strcasecmp(event_type, "bt-information")) + ad->event_type = BT_EVENT_INFORMATION; + else if (!strcasecmp(event_type, "exchange-request")) + ad->event_type = BT_EVENT_EXCHANGE_REQUEST; + else if (!strcasecmp(event_type, "phonebook-request")) + ad->event_type = BT_EVENT_PHONEBOOK_REQUEST; + else if (!strcasecmp(event_type, "message-request")) + ad->event_type = BT_EVENT_MESSAGE_REQUEST; + else if (!strcasecmp(event_type, "unable-to-pairing")) + ad->event_type = BT_EVENT_UNABLE_TO_PAIRING; + else if (!strcasecmp(event_type, "handsfree-disconnect-request")) + ad->event_type = BT_EVENT_HANDSFREE_DISCONNECT_REQUEST; + else if (!strcasecmp(event_type, "handsfree-connect-request")) + ad->event_type = BT_EVENT_HANDSFREE_CONNECT_REQUEST; + else if (!strcasecmp(event_type, "music-auto-connect-request")) + ad->event_type = BT_EVENT_HANDSFREE_AUTO_CONNECT_REQUEST; + else if (!strcasecmp(event_type, "system-reset-request")) + ad->event_type = BT_EVENT_SYSTEM_RESET_REQUEST; + else + ad->event_type = 0x0000; + + BT_DBG("-"); + return; + +} + +static void __bluetooth_request_to_cancel(void) +{ + bt_device_cancel_bonding(); +} + +static void __bluetooth_remove_all_event(struct bt_popup_appdata *ad) +{ + BT_INFO("Remove event 0X%X", ad->event_type); + switch (ad->event_type) { + case BT_EVENT_PIN_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPinCode", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_STRING, "", G_TYPE_INVALID, + G_TYPE_INVALID); + + break; + + + case BT_EVENT_KEYBOARD_PASSKEY_REQUEST: + + __bluetooth_request_to_cancel(); + + break; + + case BT_EVENT_PASSKEY_CONFIRM_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyConfirmation", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + __unlock_display(); + + break; + + case BT_EVENT_PASSKEY_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPasskey", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_STRING, "", G_TYPE_INVALID, + G_TYPE_INVALID); + + break; + + case BT_EVENT_PASSKEY_DISPLAY_REQUEST: + /* Nothing to do */ + break; + + case BT_EVENT_AUTHORIZE_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyAuthorize", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + + break; + + case BT_EVENT_APP_CONFIRM_REQUEST: + { + DBusMessage *msg; + int response; + + msg = dbus_message_new_signal( + BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + /* For timeout rejection is sent to be handled in + application */ + response = BT_AGENT_REJECT; + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, + DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, + msg, NULL, -1, NULL); + + dbus_message_unref(msg); + } + break; + + case BT_EVENT_PUSH_AUTHORIZE_REQUEST: + case BT_EVENT_EXCHANGE_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyAuthorize", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + + break; + + case BT_EVENT_CONFIRM_OVERWRITE_REQUEST: { + DBusMessage *msg; + int response = BT_AGENT_REJECT; + + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + if (msg == NULL) { + BT_ERR("msg == NULL, Allocation failed"); + break; + } + + dbus_message_append_args(msg, DBUS_TYPE_INT32, + &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + break; + } + + case BT_EVENT_SYSTEM_RESET_REQUEST: + + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyConfirmation", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + __unlock_display(); + + break; + + default: + break; + } + + __bluetooth_win_del(ad); +} + +static void _bt_clear_btn_up_cb(void *data, Evas_Object *o, const char *emission, const char *source) +{ + BT_DBG("+"); + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + ret_if(ad == NULL); + + int i = 0; + char buf[20] = {0,}; + + if(pin_index > 0) { + pin_value[pin_index-1] = 0; + + pin_index--; + + for(i = 0; i < pin_index; i++) { + strcat(buf, "*"); + } + elm_object_part_text_set(ad->ly_pass, "elm.text.password", buf); + } +} + +static int __bluetooth_request_timeout_cb(void *data) +{ + struct bt_popup_appdata *ad; + + if (data == NULL) + return 0; + + ad = (struct bt_popup_appdata *)data; + + BT_DBG("Request time out, Canceling reqeust"); + + /* Destory UI and timer */ + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } + + __bluetooth_remove_all_event(ad); + return 0; +} + +static void __bluetooth_input_cancel_cb(void *data, + Evas_Object *obj, void *event_info) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + + bt_device_cancel_bonding(); + + __bluetooth_win_del(ad); +} + +static void __bluetooth_send_signal_pairing_confirm_result(void *data, int response) +{ + if (data == NULL) + return; + + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + DBusMessage *msg = NULL; + + BT_DBG("+"); + + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + + BT_DBG("-"); +} + +static void __bluetooth_send_signal_reset_confirm_result(void *data, int response) +{ + if (data == NULL) + return; + + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + DBusMessage *msg = NULL; + + BT_DBG("+"); + + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESET_RESPONSE); + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + + BT_DBG("-"); +} + +static void __bluetooth_passkey_confirm_cb(void *data, + Evas_Object *obj, void *event_info) +{ + if (obj == NULL || data == NULL) + return; + + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + const char *event = elm_object_text_get(obj); + + if (!g_strcmp0(event, BT_STR_OK)) { + __bluetooth_send_signal_pairing_confirm_result(ad, 1); + dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyConfirmation", + G_TYPE_UINT, BT_AGENT_ACCEPT, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + __bluetooth_send_signal_pairing_confirm_result(ad, 0); + dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyConfirmation", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + } + __unlock_display(); + + evas_object_del(obj); + __bluetooth_win_del(ad); +} + +static void __bluetooth_reset_cb(void *data, Evas_Object *obj, void *event_info) +{ + DBusMessage *message = NULL; + DBusConnection *conn = NULL; + int reset = 0; + + if (obj == NULL || data == NULL) + return; + + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + const char *event = elm_object_text_get(obj); + + __bluetooth_send_signal_pairing_confirm_result(ad, 0); + dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyConfirmation", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + + if (!g_strcmp0(event, BT_STR_RESET)) { + BT_INFO("Confirm Soft reset"); + reset = 1; + } + __bluetooth_send_signal_reset_confirm_result(ad, reset); + + __unlock_display(); + + evas_object_del(obj); + __bluetooth_win_del(ad); +} + +static int __bluetooth_init_app_signal(struct bt_popup_appdata *ad) +{ + if (NULL == ad) + return FALSE; + + e_dbus_init(); + ad->EDBusHandle = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (!ad->EDBusHandle) { + BT_ERR("e_dbus_bus_get failed"); + return FALSE; + } + + BT_DBG("e_dbus_bus_get success "); + return TRUE; +} + +static void __bluetooth_app_confirm_cb(void *data, + Evas_Object *obj, void *event_info) +{ + BT_DBG("__bluetooth_app_confirm_cb "); + if (obj == NULL || data == NULL) + return; + + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + const char *event = elm_object_text_get(obj); + + DBusMessage *msg = NULL; + int response; + + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + if (!g_strcmp0(event, BT_STR_OK)) + response = BT_AGENT_ACCEPT; + else + response = BT_AGENT_REJECT; + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + + evas_object_del(obj); + + __bluetooth_win_del(ad); +} + +static void __bluetooth_authorization_request_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + guint reply_val; + + if (obj == NULL || ad == NULL) + return; + + const char *event = elm_object_text_get(obj); + + if (!g_strcmp0(event, BT_STR_OK)) { + reply_val = (ad->make_trusted == TRUE) ? + BT_AGENT_ACCEPT_ALWAYS : BT_AGENT_ACCEPT; + } else { + reply_val = BT_AGENT_CANCEL; + } + + dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyAuthorize", + G_TYPE_UINT, reply_val, + G_TYPE_INVALID, G_TYPE_INVALID); + + ad->make_trusted = FALSE; + + __bluetooth_win_del(ad); +} + +static void __bluetooth_push_authorization_request_cb(void *data, + Evas_Object *obj, + void *event_info) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + if (obj == NULL || ad == NULL) + return; + + const char *event = elm_object_text_get(obj); + + if (!g_strcmp0(event, BT_STR_OK)) + dbus_g_proxy_call_no_reply(ad->obex_proxy, "ReplyAuthorize", + G_TYPE_UINT, BT_AGENT_ACCEPT, + G_TYPE_INVALID, G_TYPE_INVALID); + else + dbus_g_proxy_call_no_reply(ad->obex_proxy, "ReplyAuthorize", + G_TYPE_UINT, BT_AGENT_CANCEL, + G_TYPE_INVALID, G_TYPE_INVALID); + + __bluetooth_win_del(ad); +} + +static void __bluetooth_ime_hide(void) +{ + Ecore_IMF_Context *imf_context = NULL; + imf_context = ecore_imf_context_add(ecore_imf_context_default_id_get()); + if (imf_context) + ecore_imf_context_input_panel_hide(imf_context); +} + +static Eina_Bool timer_cb(void *data) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + retv_if(ad == NULL, ECORE_CALLBACK_CANCEL); + + char buf[BT_PIN_MLEN + 1] = {0,}; + int i = 0; + + if(pass_timer != NULL) { + ecore_timer_del(pass_timer); + pass_timer = NULL; + } + + if(pin_index != 0) { + for(i = 0; i < pin_index; i++) { + strcat(buf,"*"); + } + elm_object_part_text_set(ad->ly_pass, "elm.text.password", buf); + } + + return ECORE_CALLBACK_CANCEL; +} + +static void __bluetooth_auth_check_clicked_cb(void *data, Evas_Object *obj, + void *event_info) +{ + struct bt_popup_appdata *ad = data; + Eina_Bool state = elm_check_state_get(obj); + + BT_INFO("Check %d", state); + ad->make_trusted = state; +} + +static void __bluetooth_mouseup_auth_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + struct bt_popup_appdata *ad = data; + DBusMessage *msg = NULL; + int response = BT_AGENT_REJECT; + + BT_DBG("Mouse event callback function is called + "); + + if (ev->button == 3) { + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_auth_cb); + evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_auth_cb); + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + __bluetooth_win_del(ad); + } + BT_DBG("Mouse event callback -"); +} + +static void __bluetooth_keyback_auth_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + struct bt_popup_appdata *ad = data; + DBusMessage *msg = NULL; + int response = BT_AGENT_REJECT; + + BT_DBG("Keyboard event callback function is called + "); + + if (!strcmp(ev->keyname, KEY_BACK)) { + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_auth_cb); + evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_auth_cb); + + msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, + BT_SYS_POPUP_INTERFACE, + BT_SYS_POPUP_METHOD_RESPONSE); + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); + + e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); + dbus_message_unref(msg); + __bluetooth_win_del(ad); + } + BT_DBG("Keyboard Mouse event callback -"); +} + +static void __bluetooth_draw_auth_popup(struct bt_popup_appdata *ad, + const char *title, char *btn1_text, + char *btn2_text, void (*func) (void *data, + Evas_Object *obj, void *event_info)) +{ + char temp_str[BT_TITLE_STR_MAX_LEN + BT_TEXT_EXTRA_LEN] = { 0 }; + Evas_Object *btn1; + Evas_Object *btn2; + Evas_Object *layout; + Evas_Object *label; + Evas_Object *label2; + Evas_Object *check; + Evas_Object *ao = NULL; + BT_DBG("+"); + + ad->make_trusted = TRUE; + + ad->popup = elm_popup_add(ad->win_main); + evas_object_size_hint_weight_set(ad->popup, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + elm_object_style_set(ad->popup, "transparent"); + + layout = elm_layout_add(ad->popup); + elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "auth_popup"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + if (title != NULL) { + snprintf(temp_str, BT_TITLE_STR_MAX_LEN + BT_TEXT_EXTRA_LEN, + "%s", title); + + label = elm_label_add(ad->popup); + elm_object_style_set(label, "popup/default"); + elm_label_line_wrap_set(label, ELM_WRAP_MIXED); + elm_object_text_set(label, temp_str); + 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); + elm_object_part_content_set(layout, "popup_title", label); + evas_object_show(label); + } + + check = elm_check_add(ad->popup); + elm_check_state_set(check, EINA_TRUE); + evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_smart_callback_add(check, "changed", + __bluetooth_auth_check_clicked_cb, ad); + elm_object_part_content_set(layout, "check", check); + evas_object_show(check); + + label2 = elm_label_add(ad->popup); + elm_object_style_set(label2, "popup/default"); + elm_label_line_wrap_set(label2, ELM_WRAP_MIXED); + elm_object_text_set(label2, BT_STR_DONT_ASK_AGAIN); + evas_object_size_hint_weight_set(label2, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(label2, EVAS_HINT_FILL, + EVAS_HINT_FILL); + elm_object_part_content_set(layout, "check_label", label2); + evas_object_show(label2); + + evas_object_show(layout); + elm_object_content_set(ad->popup, layout); + + btn1 = elm_button_add(ad->popup); + elm_object_style_set(btn1, "popup"); + elm_object_text_set(btn1, btn1_text); + elm_object_part_content_set(ad->popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + + btn2 = elm_button_add(ad->popup); + elm_object_style_set(btn2, "popup"); + elm_object_text_set(btn2, btn2_text); + elm_object_part_content_set(ad->popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", func, ad); + + evas_object_event_callback_add(ad->popup, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_auth_cb, ad); + evas_object_event_callback_add(ad->popup, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_auth_cb, ad); + + evas_object_show(ad->popup); + evas_object_show(ad->win_main); + + ao = elm_access_object_register(ad->popup, ad->win_main); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_INFO, temp_str); + } else { + BT_ERR("elm_access_object_register error!"); + } + + BT_DBG("-"); +} + +static void __bluetooth_draw_reset_popup(struct bt_popup_appdata *ad, + const char *msg, char *btn1_text, + char *btn2_text, void (*func) (void *data, + Evas_Object *obj, void *event_info)) +{ + char *txt; + Evas_Object *btn1; + Evas_Object *btn2; + Evas_Object *label; + Evas_Object *ao = NULL; + + BT_DBG("+"); + + ad->popup = elm_popup_add(ad->win_main); + if (ad->popup == NULL) { + BT_ERR("elm_popup_add is failed"); + return; + } + evas_object_size_hint_weight_set(ad->popup, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_text_set(ad->popup, "title,text", BT_STR_TITLE_CONNECT); + ea_object_event_callback_add(ad->popup, EA_CALLBACK_BACK, + ea_popup_back_cb, NULL); + + if (msg != NULL) { + txt = elm_entry_utf8_to_markup(msg); + elm_object_text_set(ad->popup, txt); + free(txt); + } + + btn1 = elm_button_add(ad->popup); + elm_object_style_set(btn1, "popup"); + evas_object_size_hint_weight_set(btn1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(btn1, btn1_text); + elm_object_part_content_set(ad->popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + + btn2 = elm_button_add(ad->popup); + elm_object_style_set(btn2, "popup"); + evas_object_size_hint_weight_set(btn2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(btn2, btn2_text); + elm_object_part_content_set(ad->popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", func, ad); + + evas_object_show(ad->popup); + evas_object_show(ad->win_main); + elm_object_focus_set(ad->popup, EINA_TRUE); + + ao = elm_access_object_register(ad->popup, ad->win_main); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_INFO, msg); + } else { + BT_ERR("elm_access_object_register error!"); + } + + BT_DBG("-"); +} + +static void __bluetooth_mouseup_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + struct bt_popup_appdata *ad = data; + + BT_DBG("Mouse event callback function is called + "); + + if (ev->button == 3) { + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_cb); + evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_cb); + __bluetooth_remove_all_event(ad); + } + BT_DBG("Mouse event callback -"); +} + +static void __bluetooth_keyback_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + struct bt_popup_appdata *ad = data; + + BT_INFO("Keyboard event callback function is called %s+ ", ev->keyname); + + if (!strcmp(ev->keyname, KEY_BACK)) { + + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_mouseup_cb); + evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_keyback_cb); + __bluetooth_remove_all_event(ad); + } + BT_DBG("Keyboard Mouse event callback -"); +} + +char* __bluetooth_convert_rgba_to_hex(int r, int g, int b, int a) +{ + int hexcolor = 0; + char* string = NULL; + + string = g_try_malloc0(sizeof(char )* 255); + + hexcolor = (r << 24) + (g << 16) + (b << 8) + a; + sprintf(string, "%08x", hexcolor ); + + return string; +} + + +static void __bluetooth_draw_popup(struct bt_popup_appdata *ad, + const char *title, char *btn1_text, + char *btn2_text, void (*func) (void *data, + Evas_Object *obj, void *event_info)) +{ + BT_DBG("__bluetooth_draw_popup"); + Evas_Object *btn1; + Evas_Object *btn2; + Evas_Object *bg; + Evas_Object *label = NULL; + Evas_Object *scroller; + Evas_Object *default_ly; + Evas_Object *layout; + Evas_Object *scroller_layout; + Evas_Object *ao = NULL; + char *txt; + char *buf; + int r = 0, g = 0, b = 0, a = 0; + char *font; + int size; + + + bg = elm_bg_add(ad->win_main); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(ad->win_main, bg); + evas_object_show(bg); + + default_ly = elm_layout_add(bg); + elm_layout_theme_set(default_ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(default_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(bg, "elm.swallow.content", default_ly); + evas_object_show(default_ly); + + layout = elm_layout_add(default_ly); + elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "passkey_confirm_popup"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(default_ly, "elm.swallow.content", layout); + evas_object_show(layout); + + scroller = elm_scroller_add(layout); + elm_object_style_set(scroller, "effect"); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_show(scroller); + + scroller_layout = elm_layout_add(scroller); + elm_layout_file_set(scroller_layout, CUSTOM_POPUP_PATH, "passkey_confirm_popup_scroller"); + evas_object_size_hint_weight_set(scroller_layout, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + if (title) { + BT_INFO("Title %s", title); + label = elm_label_add(scroller_layout); + elm_label_line_wrap_set(label, ELM_WRAP_MIXED); + ea_theme_color_get("AT012",&r, &g, &b, &a, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL); + ea_theme_font_get("AT012", &font, &size); + BT_INFO("font : %s, size : %d", font, size); + + elm_object_part_content_set(scroller_layout, "elm.text.block", label); + evas_object_show(label); + + txt = elm_entry_utf8_to_markup(title); + + buf = g_strdup_printf("%s", + font, size, + __bluetooth_convert_rgba_to_hex(r, g, b, a), + txt); + free(txt); + + elm_object_text_set(label, buf); + g_free(font); + g_free(buf); + } + + elm_object_content_set(scroller, scroller_layout); + elm_object_part_content_set(layout, "scroller", scroller); + + elm_object_content_set(ad->win_main, bg); + + btn1 = elm_button_add(layout); + elm_object_text_set(btn1,BT_STR_CANCEL); + evas_object_size_hint_weight_set(btn1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(layout, "btn1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + + btn2 = elm_button_add(layout); + elm_object_text_set(btn2,BT_STR_OK); + evas_object_size_hint_weight_set(btn2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(layout, "btn2", btn2); + evas_object_smart_callback_add(btn2, "clicked", func, ad); + + evas_object_show(ad->win_main); + + ao = elm_access_object_register(label, layout); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_INFO, title); + } else { + BT_ERR("elm_access_object_register error!"); + } + + BT_DBG("__bluetooth_draw_popup END"); +} + +static void __bluetooth_draw_loading_popup(struct bt_popup_appdata *ad, + const char *title, char *btn1_text, + char *btn2_text, void (*func) (void *data, + Evas_Object *obj, void *event_info)) +{ + BT_DBG("+"); + Evas_Object *btn1; + Evas_Object *btn2; + Evas_Object *bg; + Evas_Object *label = NULL; + Evas_Object *scroller; + Evas_Object *default_ly; + Evas_Object *layout; + Evas_Object *scroller_layout; + Evas_Object *ao; + char *txt; + char *buf; + int r = 0, g = 0, b = 0, a = 0; + char *font; + int size; + + __bluetooth_set_win_level(ad->win_main); + + bg = elm_bg_add(ad->win_main); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(ad->win_main, bg); + evas_object_show(bg); + + default_ly = elm_layout_add(bg); + elm_layout_theme_set(default_ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(default_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(bg, "elm.swallow.content", default_ly); + evas_object_show(default_ly); + + layout = elm_layout_add(default_ly); + elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "passkey_confirm"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(default_ly, "elm.swallow.content", layout); + evas_object_show(layout); + + scroller = elm_scroller_add(layout); + elm_object_style_set(scroller, "effect"); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_show(scroller); + + scroller_layout = elm_layout_add(scroller); + elm_layout_file_set(scroller_layout, CUSTOM_POPUP_PATH, "passkey_confirm_scroller"); + evas_object_size_hint_weight_set(scroller_layout, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + if (title) { + BT_INFO("Title %s", title); + label = elm_label_add(scroller_layout); + elm_object_style_set(label, "popup/default"); + elm_label_line_wrap_set(label, ELM_WRAP_MIXED); + elm_object_part_content_set(scroller_layout, "elm.text.block", label); + evas_object_show(label); + + txt = elm_entry_utf8_to_markup(title); + ea_theme_color_get("AT012",&r, &g, &b, &a, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL); + ea_theme_font_get("AT012", &font, &size); + buf = g_strdup_printf("%s", + font, size, + __bluetooth_convert_rgba_to_hex(r, g, b, a), + txt); + free(txt); + + elm_object_text_set(label, buf); + g_free(buf); + g_free(font); + } + + elm_object_content_set(scroller, scroller_layout); + elm_object_part_content_set(layout, "scroller", scroller); + + elm_object_content_set(ad->win_main, bg); + + btn1 = elm_button_add(layout); + elm_object_text_set(btn1,BT_STR_CANCEL); + evas_object_size_hint_weight_set(btn1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(layout, "btn1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + + btn2 = elm_button_add(layout); + elm_object_text_set(btn2,BT_STR_OK); + evas_object_size_hint_weight_set(btn2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(layout, "btn2", btn2); + evas_object_smart_callback_add(btn2, "clicked", func, ad); + + evas_object_show(ad->win_main); + + ao = elm_access_object_register(label, layout); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_INFO, title); + } else { + BT_ERR("elm_access_object_register error!"); + } + + BT_DBG("__bluetooth_draw_loading_popup END"); +} + +static void __bluetooth_draw_text_popup(struct bt_popup_appdata *ad, + const char *text, + char *btn1_text, char *btn2_text, + void (*func) (void *data, + Evas_Object *obj, void *event_info)) +{ + BT_DBG("__bluetooth_draw_text_popup"); + Evas_Object *btn1; + Evas_Object *btn2; + Evas_Object *label; + Evas_Object *scroller_layout; + Evas_Object *ao = NULL; + char *txt; + char *buf; + int r = 0, g = 0, b = 0, a = 0; + char *font; + int size; + + ret_if(!ad); + + ad->popup = elm_popup_add(ad->win_main); + evas_object_size_hint_weight_set(ad->popup, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + ea_object_event_callback_add(ad->popup, EA_CALLBACK_BACK, + ea_popup_back_cb, NULL); + + __bluetooth_set_win_level(ad->popup); + txt = elm_entry_utf8_to_markup(text); + elm_object_text_set(ad->popup, txt); + free(txt); + + btn1 = elm_button_add(ad->popup); + elm_object_style_set(btn1, "popup"); + evas_object_size_hint_weight_set(btn1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(btn1, btn1_text); + elm_object_part_content_set(ad->popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", func, ad); + + btn2 = elm_button_add(ad->popup); + elm_object_style_set(btn2, "popup"); + evas_object_size_hint_weight_set(btn2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(btn2, btn2_text); + elm_object_part_content_set(ad->popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", func, ad); + + evas_object_show(ad->popup); + evas_object_show(ad->win_main); + elm_object_focus_set(ad->popup, EINA_TRUE); + BT_DBG("__bluetooth_draw_text_popup END"); +} + +static void __bluetooth_input_mouseup_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Up *ev = event_info; + struct bt_popup_appdata *ad = data; + int response = BT_AGENT_CANCEL; + char *input_text = NULL; + char *convert_input_text = NULL; + BT_DBG("Mouse event callback function is called + "); + + if (ev->button == 3) { + if (ad == NULL) + return; + evas_object_event_callback_del(ad->entry, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb); + evas_object_event_callback_del(ad->entry, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb); + evas_object_event_callback_del(ad->popup, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb); + evas_object_event_callback_del(ad->popup, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb); + + /* BT_EVENT_PIN_REQUEST / BT_EVENT_PASSKEY_REQUEST */ + input_text = (char *)elm_entry_entry_get(ad->entry); + if (input_text) { + convert_input_text = + elm_entry_markup_to_utf8(input_text); + } + if (convert_input_text == NULL) + return; + + if (ad->event_type == BT_EVENT_PIN_REQUEST) { + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPinCode", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPasskey", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } + __bluetooth_delete_input_view(ad); + free(convert_input_text); + if (ad->entry) { + evas_object_del(ad->entry); + ad->entry = NULL; + } + __bluetooth_win_del(ad); + } + BT_DBG("Mouse event callback -"); +} + +static void __bluetooth_input_keyback_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Down *ev = event_info; + struct bt_popup_appdata *ad = data; + int response = BT_AGENT_CANCEL; + char *input_text = NULL; + char *convert_input_text = NULL; + + + BT_DBG("Keyboard event callback function is called + "); + + if (!strcmp(ev->keyname, KEY_BACK)) { + if (ad == NULL) + return; + evas_object_event_callback_del(ad->entry, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb); + evas_object_event_callback_del(ad->entry, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb); + evas_object_event_callback_del(ad->popup, EVAS_CALLBACK_MOUSE_UP, + __bluetooth_input_mouseup_cb); + evas_object_event_callback_del(ad->popup, EVAS_CALLBACK_KEY_DOWN, + __bluetooth_input_keyback_cb); + /* BT_EVENT_PIN_REQUEST / BT_EVENT_PASSKEY_REQUEST */ + input_text = (char *)elm_entry_entry_get(ad->entry); + if (input_text) { + convert_input_text = + elm_entry_markup_to_utf8(input_text); + } + if (convert_input_text == NULL) + return; + + if (ad->event_type == BT_EVENT_PIN_REQUEST) { + BT_DBG("It is PIN Request event "); + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPinCode", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + BT_DBG("It is PASSKEYRequest event "); + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPasskey", G_TYPE_UINT, response, + G_TYPE_STRING, convert_input_text, + G_TYPE_INVALID, G_TYPE_INVALID); + } + __bluetooth_delete_input_view(ad); + free(convert_input_text); + __bluetooth_win_del(ad); + } + BT_DBG("Keyboard Mouse event callback -"); +} + +void __bt_handle_keypad_value(void *data,int index) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + ret_if(ad == NULL); + int max_value = 0; + if(ad->event_type == BT_EVENT_PIN_REQUEST) { + max_value = BT_PIN_MLEN; + } else { + max_value = BT_PK_MLEN; + } + + if (pin_index >= max_value) { + if(index >= 0 && index <= 9) { + char buf[512] = { 0, }; + snprintf(buf,sizeof(buf),BT_STR_PIN_LENGTH_ERROR,max_value); + __bt_draw_error_toast_popup(ad, buf); + + if(ad->timer != NULL) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } + ad->timer = ecore_timer_add(BT_TOAST_NOTIFICATION_TIMEOUT, + (Ecore_Task_Cb)__bt_error_toast_timeout_cb, ad); + return; + } + } + + if(index >= 0 && index <= 9) { + char buf[20] = { 0, }; + char buf1[20] = { 0, }; + int i = 0; + + snprintf(buf, sizeof(buf), "%d", index); + strcpy(&pin_value[pin_index++], buf); + + if(pin_index == 0) { + } else { + for(i = 0; i < pin_index-1; i++) { + strcat(buf1,"*"); + } + } + strcat(buf1,buf); + + elm_object_part_text_set(ad->ly_pass, "elm.text.password", buf1); + pass_timer = ecore_timer_add(1.5f, (Ecore_Task_Cb)timer_cb, data); + + } else if(index == 10) {//OK + char *input_text = NULL; + + if (ad == NULL) + return; + + if (pin_value) + BT_DBG_SECURE("PIN/Passkey[%s] event[%d] response[%s]", + pin_value, ad->event_type, "Accept"); + + if(ad->event_type == BT_EVENT_PIN_REQUEST) { + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPinCode", G_TYPE_UINT, BT_AGENT_ACCEPT, + G_TYPE_STRING, pin_value, + G_TYPE_INVALID, G_TYPE_INVALID); + } else { + dbus_g_proxy_call_no_reply(ad->agent_proxy, + "ReplyPasskey", G_TYPE_UINT, BT_AGENT_ACCEPT, + G_TYPE_STRING, pin_value, + G_TYPE_INVALID, G_TYPE_INVALID); + } + memset(pin_value, 0x00, sizeof(pin_value)); + pin_index = 0; + + __bluetooth_win_del(ad); + + } else if(index == 11) { + /* Clear button */ + _bt_clear_btn_up_cb(ad, NULL, NULL, NULL); + } +} + +static void __bt_keypad_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + struct bt_popup_appdata *ad = data; + ret_if(ad == NULL); + + int idx = (int)evas_object_data_get(obj, "__INDEX__"); + + __bt_handle_keypad_value(ad, idx); +} +static void __bluetooth_draw_input_view(struct bt_popup_appdata *ad, + const char *title, const char *text) +{ + BT_DBG("__bluetooth_draw_input_view"); + Evas_Object *bg = NULL; + Evas_Object *layout = NULL; + Evas_Object *label = NULL; + Evas_Object *default_ly = NULL; + Evas_Object *scroller; + Elm_Object_Item *navi_item; + static char *buf; + int i = 0, r = 0, g = 0, b = 0, a = 0; + char *font; + int size; + + if (ad == NULL || ad->win_main == NULL) { + BT_ERR("Invalid parameter"); + return; + } + + bg = elm_bg_add(ad->win_main); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(ad->win_main, bg); + evas_object_show(bg); + + default_ly = elm_layout_add(bg); + elm_layout_theme_set(default_ly, "layout", "application", "default"); + evas_object_size_hint_weight_set(default_ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(bg, "elm.swallow.content", default_ly); + evas_object_show(default_ly); + + Evas_Object *naviframe; + + naviframe = elm_naviframe_add(default_ly); + elm_object_part_content_set(default_ly, "elm.swallow.content", naviframe); + + layout = elm_layout_add(default_ly); + elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "passwd_popup"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + ad->ly_pass = layout; + + scroller = elm_scroller_add(layout); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_show(scroller); + + label = elm_label_add(layout); + elm_object_style_set(label, "popup/default"); + elm_label_line_wrap_set(label, ELM_WRAP_CHAR); + ea_theme_color_get("AT012",&r, &g, &b, &a, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL); + if (EINA_TRUE == ea_theme_font_get("AT012", &font, &size)) + BT_INFO("font : %s, size : %d", font, size); + else + BT_INFO("ea_theme_font_get fail!"); + buf = g_strdup_printf("%s", + font, 28, + __bluetooth_convert_rgba_to_hex(r, g, b, a), + text); + + BT_DBG("buf : %s, rgba:%d,%d,%d,%d", buf,r,g,b,a); + + elm_object_text_set(label, buf); + g_free(buf); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(label); + elm_object_content_set(scroller, label); + + elm_object_part_content_set(ad->ly_pass, "label", scroller); + + BT_DBG("Create keypad"); + Evas_Object *layout_key = elm_layout_add(ad->ly_pass); + elm_layout_file_set(layout_key, CUSTOM_POPUP_PATH, "keypad"); + + ad->ly_keypad = layout_key; + elm_object_part_content_set(ad->ly_pass, "sw.keypad", layout_key); + elm_object_part_text_set(layout_key, "confirm", "OK"); + + for (i = 0; i< 12; i++) { + Evas_Object *button = elm_button_add(layout_key); + char buf[32] = {0,}; + if(button == NULL) { + BT_DBG("elm_button_add() failed"); + continue; + } + elm_object_style_set(button, "focus"); + snprintf(buf, sizeof(buf)-1, "%s,sw", keypad_info[i].part_name); + elm_object_part_content_set(layout_key, buf, button); + elm_access_info_set(button, ELM_ACCESS_INFO, keypad_info[i].tts_name); + evas_object_data_set(button, "__INDEX__", (void *)i); + evas_object_smart_callback_add(button, "clicked", + __bt_keypad_clicked_cb, ad); + keypad_info[i].tts_button = button; + } + + navi_item = elm_naviframe_item_push(naviframe, BT_STR_PAIRING_REQUEST, + NULL, NULL, layout, NULL); + elm_naviframe_item_title_enabled_set(navi_item, EINA_TRUE, EINA_TRUE); + elm_naviframe_item_title_visible_set(navi_item, EINA_TRUE); + elm_object_content_set(ad->win_main, bg); + evas_object_show(naviframe); + evas_object_show(default_ly); + evas_object_show(layout); + evas_object_show(layout_key); + evas_object_show(ad->win_main); + +} + +static void __bluetooth_delete_input_view(struct bt_popup_appdata *ad) +{ + __bluetooth_ime_hide(); +} + +static DBusGProxy* __bluetooth_create_agent_proxy(DBusGConnection *conn, + const char *path) +{ + DBusGProxy *proxy; + + proxy = dbus_g_proxy_new_for_name(conn, "org.projectx.bt", + path, "org.bluez.Agent1"); + if (!proxy) + BT_ERR("dbus_g_proxy_new_for_name is failed"); + + return proxy; + +} + +#if 0 +static int __bt_get_vconf_setup_wizard() +{ + int wizard_state = VCONFKEY_SETUP_WIZARD_UNLOCK; + + if (vconf_get_int(VCONFKEY_SETUP_WIZARD_STATE, &wizard_state)) + BT_ERR("Fail to get Wizard State"); + + return wizard_state; +} +#endif + +/* AUL bundle handler */ +static int __bluetooth_launch_handler(struct bt_popup_appdata *ad, + void *reset_data, const char *event_type) +{ + bundle *kb = (bundle *) reset_data; + char view_title[BT_TITLE_STR_MAX_LEN] = { 0 }; + char text[BT_GLOBALIZATION_STR_LENGTH] = { 0 }; + int timeout = 0; + const char *device_name = NULL; + const char *passkey = NULL; + const char *file = NULL; + const char *agent_path; + char *conv_str = NULL; + + BT_DBG("+"); + + if (!reset_data || !event_type) { + BT_ERR("reset_data : %d, event_type : %d", + reset_data, event_type); + return -1; + } + + BT_INFO("Event Type = %s[0X%X]", event_type, ad->event_type); + + if (!strcasecmp(event_type, "pin-request")) { + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + "%s", BT_STR_PAIRING_REQUEST); + + snprintf(text, BT_GLOBALIZATION_STR_LENGTH, + BT_STR_ENTER_PIN_TO_PAIR, conv_str); + + if (conv_str) + free(conv_str); + + /* Request user inputted PIN for basic pairing */ + __bluetooth_draw_input_view(ad, view_title, text); + } else if (!strcasecmp(event_type, "passkey-confirm-request")) { + device_name = bundle_get_val(kb, "device-name"); + passkey = bundle_get_val(kb, "passkey"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name && passkey) { + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_CONFIRM_PASSKEY_PS_TO_PAIR_WITH_PS, + device_name, passkey); + + BT_INFO("title: %s", view_title); + + __bluetooth_draw_text_popup(ad, view_title, + BT_STR_CANCEL, BT_STR_OK, + __bluetooth_passkey_confirm_cb); + } else { + timeout = BT_ERROR_TIMEOUT; + } + } else if (!strcasecmp(event_type, "passkey-request")) { + const char *device_name = NULL; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + "%s", BT_STR_PAIRING_REQUEST); + + snprintf(text, BT_GLOBALIZATION_STR_LENGTH, + BT_STR_ENTER_PIN_TO_PAIR, conv_str); + + if (conv_str) + free(conv_str); + + /* Request user inputted Passkey for basic pairing */ + __bluetooth_draw_input_view(ad, view_title, text); + + } else if (!strcasecmp(event_type, "passkey-display-request")) { + device_name = bundle_get_val(kb, "device-name"); + passkey = bundle_get_val(kb, "passkey"); + + if (device_name && passkey) { + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ENTER_PS_ON_PS_TO_PAIR, passkey, conv_str); + + BT_INFO("title: %s", view_title); + + if (conv_str) + free(conv_str); + + __bluetooth_draw_popup(ad, view_title, + BT_STR_CANCEL, NULL, + __bluetooth_input_cancel_cb); + } else { + BT_ERR("wrong parameter : %s, %s", device_name, passkey); + timeout = BT_ERROR_TIMEOUT; + } + } else if (!strcasecmp(event_type, "authorize-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ALLOW_PS_TO_CONNECT_Q, conv_str); + + if (conv_str) + free(conv_str); + + __bluetooth_draw_auth_popup(ad, view_title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_authorization_request_cb); + } else if (!strcasecmp(event_type, "app-confirm-request")) { + BT_DBG("app-confirm-request"); + timeout = BT_AUTHORIZATION_TIMEOUT; + + const char *title = NULL; + const char *type = NULL; + + title = bundle_get_val(kb, "title"); + type = bundle_get_val(kb, "type"); + + if (!title) { + BT_ERR("title is NULL"); + return -1; + } + + if (strcasecmp(type, "twobtn") == 0) { + __bluetooth_draw_popup(ad, title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_app_confirm_cb); + } else if (strcasecmp(type, "onebtn") == 0) { + timeout = BT_NOTIFICATION_TIMEOUT; + __bluetooth_draw_popup(ad, title, BT_STR_OK, NULL, + __bluetooth_app_confirm_cb); + } else if (strcasecmp(type, "none") == 0) { + timeout = BT_NOTIFICATION_TIMEOUT; + __bluetooth_draw_popup(ad, title, NULL, NULL, + __bluetooth_app_confirm_cb); + } + } else if (!strcasecmp(event_type, "push-authorize-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + file = bundle_get_val(kb, "file"); + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_RECEIVE_PS_FROM_PS_Q, file, conv_str); + + if (conv_str) + free(conv_str); + + __bluetooth_draw_popup(ad, view_title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_push_authorization_request_cb); + } else if (!strcasecmp(event_type, "confirm-overwrite-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + file = bundle_get_val(kb, "file"); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_OVERWRITE_FILE_Q, file); + + __bluetooth_draw_popup(ad, view_title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_app_confirm_cb); + } else if (!strcasecmp(event_type, "keyboard-passkey-request")) { + device_name = bundle_get_val(kb, "device-name"); + passkey = bundle_get_val(kb, "passkey"); + + if (device_name && passkey) { + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ENTER_PS_ON_PS_TO_PAIR, passkey, conv_str); + + BT_INFO("title: %s", view_title); + + if (conv_str) + free(conv_str); + + __bluetooth_draw_popup(ad, view_title, + BT_STR_CANCEL, NULL, + __bluetooth_input_cancel_cb); + } else { + BT_ERR("wrong parameter : %s, %s", device_name, passkey); + timeout = BT_ERROR_TIMEOUT; + } + } else if (!strcasecmp(event_type, "bt-information")) { + BT_DBG("bt-information"); + timeout = BT_NOTIFICATION_TIMEOUT; + + const char *title = NULL; + const char *type = NULL; + + title = bundle_get_val(kb, "title"); + type = bundle_get_val(kb, "type"); + + if (title != NULL) { + if (strlen(title) > 255) { + BT_ERR("titls is too long"); + return -1; + } + } else { + BT_ERR("titls is NULL"); + return -1; + } + + if (strcasecmp(type, "onebtn") == 0) { + __bluetooth_draw_popup(ad, title, BT_STR_OK, NULL, + __bluetooth_app_confirm_cb); + } else if (strcasecmp(type, "none") == 0) { + __bluetooth_draw_popup(ad, title, NULL, NULL, + __bluetooth_app_confirm_cb); + } + } else if (!strcasecmp(event_type, "exchange-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_RECEIVE_FILE_FROM_PS_Q, conv_str); + + if (conv_str) + free(conv_str); + + __bluetooth_draw_popup(ad, view_title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_authorization_request_cb); + } else if (!strcasecmp(event_type, "phonebook-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ALLOW_PS_PHONEBOOK_ACCESS_Q, conv_str); + + if (conv_str) + free(conv_str); + + __bluetooth_draw_auth_popup(ad, view_title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_authorization_request_cb); + } else if (!strcasecmp(event_type, "message-request")) { + timeout = BT_AUTHORIZATION_TIMEOUT; + + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) + conv_str = elm_entry_utf8_to_markup(device_name); + + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_ALLOW_PS_TO_ACCESS_MESSAGES_Q, conv_str); + + if (conv_str) + free(conv_str); + + __bluetooth_draw_auth_popup(ad, view_title, BT_STR_CANCEL, BT_STR_OK, + __bluetooth_authorization_request_cb); + } else if (!strcasecmp(event_type, "unable-to-pairing")) { + DBusMessage *msg = NULL; + int response = BT_AGENT_REJECT; + + timeout = BT_TOAST_NOTIFICATION_TIMEOUT; + __bt_draw_toast_popup(ad, BT_STR_UNABLE_TO_CONNECT); + } else if (!strcasecmp(event_type, "handsfree-disconnect-request")) { +#if 0 + if (__bt_get_vconf_setup_wizard() == VCONFKEY_SETUP_WIZARD_LOCK) { + BT_DBG("VCONFKEY_SETUP_WIZARD_LOCK: No toast shown"); + return -1; + } +#endif + timeout = BT_TOAST_NOTIFICATION_TIMEOUT; + __bt_draw_toast_popup(ad, BT_STR_BLUETOOTH_HAS_BEEN_DISCONNECTED); + + } else if (!strcasecmp(event_type, "handsfree-connect-request")) { +#if 0 + if (__bt_get_vconf_setup_wizard() == VCONFKEY_SETUP_WIZARD_LOCK) { + BT_DBG("VCONFKEY_SETUP_WIZARD_LOCK: No toast shown"); + return -1; + } +#endif + + timeout = BT_TOAST_NOTIFICATION_TIMEOUT; + __bt_draw_toast_popup(ad, BT_STR_BLUETOOTH_CONNECTED); + + } else if (!strcasecmp(event_type, "music-auto-connect-request")) { + timeout = BT_TOAST_NOTIFICATION_TIMEOUT; + __bt_draw_toast_popup(ad, BT_STR_AUTO_CONNECT); + + } else if (!strcasecmp(event_type, "system-reset-request")) { + device_name = bundle_get_val(kb, "device-name"); + agent_path = bundle_get_val(kb, "agent-path"); + + ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); + if (!ad->agent_proxy) + return -1; + + if (device_name) { + snprintf(view_title, BT_TITLE_STR_MAX_LEN, + BT_STR_FACTORY_RESET, device_name, device_name); + __bluetooth_draw_reset_popup(ad, view_title, + BT_STR_CANCEL, BT_STR_RESET, + __bluetooth_reset_cb); + } else { + BT_ERR("device name NULL"); + timeout = BT_ERROR_TIMEOUT; + } + } else { + BT_ERR("Unknown event_type : %s", event_type); + return -1; + } + + if (ad->event_type != BT_EVENT_FILE_RECEIVED && timeout != 0) { + ad->timer = ecore_timer_add(timeout, (Ecore_Task_Cb) + __bluetooth_request_timeout_cb, ad); + } + BT_DBG("-"); + return 0; +} + +static Eina_Bool __bt_toast_mouseup_cb(void *data, int type, void *event) +{ + Ecore_Event_Key *ev = event; + struct bt_popup_appdata *ad; + + ad = (struct bt_popup_appdata *)data; + if(ev == NULL || ev->keyname == NULL || ad == NULL){ + return ECORE_CALLBACK_DONE; + } + + __bluetooth_win_del(ad); + + return ECORE_CALLBACK_DONE; +} + +static void __bt_draw_toast_popup(struct bt_popup_appdata *ad, char *toast_text) +{ + Evas_Object *ao = NULL; + + ad->popup = elm_popup_add(ad->win_main); + elm_object_style_set(ad->popup, "toast"); + elm_popup_orient_set(ad->popup, ELM_POPUP_ORIENT_BOTTOM); + evas_object_size_hint_weight_set(ad->popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + ea_object_event_callback_add(ad->popup, EA_CALLBACK_BACK, ea_popup_back_cb, NULL); + + elm_object_part_text_set(ad->popup,"elm.text", toast_text); + + __bluetooth_set_win_level(ad->popup); + + ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, __bt_toast_mouseup_cb, ad); + + evas_object_show(ad->popup); + evas_object_show(ad->win_main); + elm_object_focus_set(ad->popup, EINA_TRUE); + + ao = elm_object_part_access_object_get(ad->popup, "access.outline"); + if (ao != NULL) + elm_access_info_set(ao, ELM_ACCESS_INFO, toast_text); +} + +static void __bt_draw_error_toast_popup(struct bt_popup_appdata *ad, char *toast_text) +{ + Evas_Object *ao = NULL; + + ad->popup = elm_popup_add(ad->win_main); + elm_object_style_set(ad->popup, "toast"); + elm_popup_orient_set(ad->popup, ELM_POPUP_ORIENT_BOTTOM); + evas_object_size_hint_weight_set(ad->popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + ea_object_event_callback_add(ad->popup, EA_CALLBACK_BACK, ea_popup_back_cb, NULL); + elm_object_part_text_set(ad->popup,"elm.text", toast_text); + + __bluetooth_set_win_level(ad->popup); + + evas_object_show(ad->popup); + evas_object_show(ad->win_main); + elm_object_focus_set(ad->popup, EINA_TRUE); + + ao = elm_object_part_access_object_get(ad->popup, "access.outline"); + if (ao != NULL) + elm_access_info_set(ao, ELM_ACCESS_INFO, toast_text); +} + +static Eina_Bool __exit_idler_cb(void *data) +{ + elm_exit(); + return ECORE_CALLBACK_CANCEL; +} + +static void __popup_terminate(void) +{ + if (ecore_idler_add(__exit_idler_cb, NULL)) + return; + + __exit_idler_cb(NULL); +} + +static void __bluetooth_win_del(void *data) +{ + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + + __bluetooth_cleanup(ad); + __popup_terminate(); +} + +static int __bt_error_toast_timeout_cb(void *data) +{ + struct bt_popup_appdata *ad; + + if (data == NULL) + return 0; + + ad = (struct bt_popup_appdata *)data; + + BT_DBG("Toast Popup timeout"); + + /* Destory toast popup and timer */ + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } + + if (ad->popup) { + elm_access_object_unregister(ad->popup); + evas_object_del(ad->popup); + ad->popup = NULL; + } + return 0; +} +static Evas_Object *__bluetooth_create_win(const char *name, void *data) +{ + Evas_Object *eo; + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + int w; + int h; + + eo = elm_win_add(NULL, name, ELM_WIN_DIALOG_BASIC); + if (eo) { + elm_win_alpha_set(eo, EINA_TRUE); + elm_win_title_set(eo, name); + elm_win_borderless_set(eo, EINA_TRUE); + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_resize(eo, w, h); + } + + return eo; +} + +static void __bluetooth_session_init(struct bt_popup_appdata *ad) +{ + DBusGConnection *conn = NULL; + GError *err = NULL; + + g_type_init(); + + conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &err); + + if (!conn) { + BT_ERR("ERROR: Can't get on system bus [%s]", + err->message); + g_error_free(err); + return; + } + + ad->conn = conn; + + ad->obex_proxy = dbus_g_proxy_new_for_name(conn, + "org.bluez.frwk_agent", + "/org/obex/ops_agent", + "org.openobex.Agent"); + if (!ad->obex_proxy) + BT_ERR("Could not create obex dbus proxy"); + + if (!__bluetooth_init_app_signal(ad)) + BT_ERR("__bt_syspopup_init_app_signal failed"); +} + +void __bluetooth_set_color_table(void *data) +{ + FN_START; + struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; + + /* Set color table */ + ea_theme_changeable_ui_enabled_set(EINA_TRUE); + ad->color_table = ea_theme_color_table_new(COLOR_TABLE); + if (ad->color_table == NULL) + BT_ERR("ea_theme_color_table_new failed!"); + else if (EINA_TRUE != ea_theme_colors_set(ad->color_table, EA_THEME_STYLE_DEFAULT)) + BT_ERR("ea_theme_colors_set failed!"); + + ad->font_table = ea_theme_font_table_new(FONT_TABLE); + if (ad->font_table == NULL) + BT_ERR("ea_theme_color_table_new failed!"); + else if (EINA_TRUE != ea_theme_fonts_set(ad->font_table)) + BT_ERR("ea_theme_fonts_set failed!"); + + FN_END; +} + +static bool __bluetooth_create(void *data) +{ + struct bt_popup_appdata *ad = data; + Evas_Object *win = NULL; + + BT_DBG("__bluetooth_create() start."); + + /* create window */ + win = __bluetooth_create_win(PACKAGE, ad); + if (win == NULL) { + BT_ERR("__bluetooth_create_win is failed"); + return false; + } + ad->win_main = win; + ad->viberation_id = 0; + /* Handle rotation */ + if (elm_win_wm_rotation_supported_get(ad->win_main)) { + int rots[4] = {0, 90, 180, 270}; + elm_win_wm_rotation_available_rotations_set(ad->win_main, rots, 4); + } + + /* init internationalization */ + bindtextdomain(BT_COMMON_PKG, BT_LOCALEDIR); + textdomain(BT_COMMON_PKG); + + ecore_imf_init(); + __bluetooth_set_color_table(ad); + + __bluetooth_session_init(ad); + if (bt_initialize() != BT_ERROR_NONE) { + BT_ERR("bt_initialize is failed"); + } + + return true; +} + + +static int __vzw_launch_modem_syspopup(void) +{ + int ret; + bundle* b; + + b = bundle_create(); + if (!b) { + BT_ERR("Failed to create bundle"); + return -1; + } + + bundle_add(b, "event-type", "grayzone_alert"); + ret = syspopup_launch("wc-syspopup", b); + if (ret < 0) + BT_ERR("Failed to launch syspopup"); + + bundle_free(b); + + return ret; +} + +static void __bluetooth_terminate(void *data) +{ + BT_DBG("__bluetooth_terminate()"); + + struct bt_popup_appdata *ad = data; + + if (bt_deinitialize() != BT_ERROR_NONE) { + BT_ERR("bt_deinitialize is failed"); + } + __bluetooth_ime_hide(); + + if (ad->conn) { + dbus_g_connection_unref(ad->conn); + ad->conn = NULL; + } + + if (ad->color_table != NULL) { + ea_theme_color_table_free(ad->color_table); + ad->color_table = NULL; + } + + if (ad->font_table != NULL) { + ea_theme_font_table_free(ad->font_table); + ad->font_table = NULL; + } + + if (ad->popup) + evas_object_del(ad->popup); + + if (ad->win_main) + evas_object_del(ad->win_main); + + ad->popup = NULL; + ad->win_main = NULL; + + if (ad->event_type == BT_EVENT_HANDSFREE_DISCONNECT_REQUEST) { + BT_ERR("Not supported in platform"); + } +} + +static void __bluetooth_pause(void *data) +{ + BT_DBG("__bluetooth_pause()"); + return; +} + +static void __bluetooth_resume(void *data) +{ + BT_DBG("__bluetooth_resume()"); + return; +} + +static void __bluetooth_reset(app_control_h app_control, void *user_data) +{ + struct bt_popup_appdata *ad = user_data; + bundle *b = NULL; + const char *event_type = NULL; + int block = 0; + int ret = 0; + + BT_DBG("__bluetooth_reset()"); + + if (ad == NULL) { + BT_ERR("App data is NULL"); + return; + } + + ret = app_control_to_bundle(app_control, &b); + + /* Start Main UI */ + event_type = bundle_get_val(b, "event-type"); + if (event_type == NULL) { + BT_ERR("event type is NULL"); + return; + } + BT_INFO("event_type : %s", event_type); + + __bluetooth_parse_event(ad, event_type); + + if (!strcasecmp(event_type, "terminate")) { + BT_ERR("get terminate event"); + __bluetooth_win_del(ad); + return; + } + + if (syspopup_has_popup(b)) { + /* Destroy the existing popup*/ + BT_ERR("Aleady popup existed"); + __bluetooth_cleanup(ad); + + /* create window */ + ad->win_main = __bluetooth_create_win(PACKAGE, ad); + if (ad->win_main == NULL) { + BT_ERR("fail to create win!"); + return; + } + + ret = syspopup_reset(b); + if (ret == -1) { + BT_ERR("syspopup_reset err"); + return; + } + + goto DONE; + } + + ret = syspopup_create(b, &handler, ad->win_main, ad); + if (ret == -1) { + BT_ERR("syspopup_create err"); + __bluetooth_remove_all_event(ad); + return; + } + + +DONE: + ret = __bluetooth_launch_handler(ad, b, event_type); + + if (vconf_get_bool(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, &block)) { + BT_ERR("Get Block Status fail!!"); + } + + if (ret != 0) { + BT_ERR("__bluetooth_launch_handler is failed. event[%d], ret[%d]", + ad->event_type, ret); + __bluetooth_remove_all_event(ad); + } + + if (!block) { + /* Change LCD brightness */ + if (display_change_state(LCD_NORMAL) != 0) + BT_ERR("Fail to change LCD"); + + if (ad->event_type == BT_EVENT_HANDSFREE_DISCONNECT_REQUEST) { + __bluetooth_notify_event(FEEDBACK_PATTERN_DISCONNECTED); + } else if (ad->event_type == BT_EVENT_HANDSFREE_CONNECT_REQUEST) { + __bluetooth_notify_event(FEEDBACK_PATTERN_CONNECTED); + } else if (ad->event_type == BT_EVENT_PASSKEY_CONFIRM_REQUEST || + ad->event_type == BT_EVENT_SYSTEM_RESET_REQUEST) { + __bluetooth_notify_event(FEEDBACK_PATTERN_BT_PAIRING); + ad->viberation_id = g_timeout_add(BT_VIBERATION_INTERVAL, + __bluetooth_pairing_pattern_cb, NULL); + __lock_display(); + } + } + + return; +} + +static void __bluetooth_lang_changed_cb(app_event_info_h event_info, void *data) +{ + BT_DBG("+"); + ret_if(data == NULL); + BT_DBG("-"); +} + +EXPORT int main(int argc, char *argv[]) +{ + struct bt_popup_appdata ad; + memset(&ad, 0x0, sizeof(struct bt_popup_appdata)); + + ui_app_lifecycle_callback_s event_callback = {0,}; + app_event_handler_h handlers[5] = {NULL, }; + + event_callback.create = __bluetooth_create; + event_callback.terminate = __bluetooth_terminate; + event_callback.pause = __bluetooth_pause; + event_callback.resume = __bluetooth_resume; + event_callback.app_control = __bluetooth_reset; + + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], + APP_EVENT_LOW_MEMORY, NULL, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], + APP_EVENT_LOW_BATTERY, NULL, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], + APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], + APP_EVENT_LANGUAGE_CHANGED, __bluetooth_lang_changed_cb, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], + APP_EVENT_REGION_FORMAT_CHANGED, NULL, NULL); + + return ui_app_main(argc, argv, &event_callback, &ad); +} diff --git a/src/bt-syspopup-w.h b/src/bt-syspopup-w.h new file mode 100644 index 0000000..c5efa77 --- /dev/null +++ b/src/bt-syspopup-w.h @@ -0,0 +1,265 @@ +/* +* bt-syspopup +* +* Copyright 2013 Samsung Electronics Co., Ltd +* +* Contact: Hocheol Seo +* GirishAshok Joshi +* DoHyun Pyun +* +* Licensed under the Flora License, Version 1.1 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.tizenopensource.org/license +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +#ifndef __DEF_BT_SYSPOPUP_H_ +#define __DEF_BT_SYSPOPUP_H_ + +#include +#include +#include +#include + +#ifndef PACKAGE_NAME +#define PACKAGE_NAME "org.tizen.bt-syspopup" +#endif + +#ifndef PREFIX +#define PREFIX "/usr/apps"PACKAGE_NAME +#endif + +#define EXPORT __attribute__((visibility("default"))) + +#define TEMP_DIR "/tmp" + +#define PACKAGE "bt-syspopup" +#define APPNAME "bt-syspopup" +#define ICON_DIR PREFIX"/res/default/small/icon" + +#define CUSTOM_POPUP_PATH PREFIX"/res/edje/custom_popup.edj" +#define POPUP_IMAGE_PATH PREFIX"/res/images" + +#define BT_COMMON_PKG "bluetooth" +#define BT_LOCALEDIR "/usr/apps/org.tizen.bluetooth/shared/res/locale" + +#define _EDJ(obj) elm_layout_edje_get(obj) + +#define BT_AUTHENTICATION_TIMEOUT 35 +#define BT_AUTHORIZATION_TIMEOUT 25 +#define BT_NOTIFICATION_TIMEOUT 2 +#define BT_ERROR_TIMEOUT 1 +#define BT_TOAST_NOTIFICATION_TIMEOUT 3 +#define BT_PAIR_RETRY_TIMEOUT 5 + +#define BT_PIN_MLEN 16 /* Pin key max length */ +#define BT_PK_MLEN 6 /* Passkey max length */ +#define BT_CONTROLBAR_MAX_LENGTH 3 + +#define BT_GLOBALIZATION_STR_LENGTH 256 +#define BT_DEVICE_NAME_LENGTH_MAX 256 +#define BT_FILE_NAME_LENGTH_MAX 256 +#define BT_TEXT_EXTRA_LEN 20 + +#define BT_SET_FONT_SIZE "%s" +#define BT_TITLE_FONT_30 30 + +#define BT_TITLE_STR_MAX_LEN \ + (BT_GLOBALIZATION_STR_LENGTH+BT_DEVICE_NAME_LENGTH_MAX+BT_FILE_NAME_LENGTH_MAX) + +#define BT_MESSAGE_STRING_SIZE 256*2+1 + +#define BT_VIBERATION_INTERVAL 2000 + +#undef LOG_TAG +#define LOG_TAG "BLUETOOTH_SYSPOPUP" + +#define BT_DBG(format, args...) SLOGD(format, ##args) +#define BT_ERR(format, args...) SLOGE(format, ##args) +#define BT_INFO(format, args...) SLOGI(format, ##args) + +#define FUNCTION_TRACE +#ifdef FUNCTION_TRACE +#define FN_START BT_DBG("[ENTER FUNC]"); +#define FN_END BT_DBG("[EXIT FUNC]"); +#else +#define FN_START +#define FN_END +#endif + +#define BT_DBG_SECURE(fmt, args...) SECURE_SLOGD(fmt, ##args) +#define BT_ERR_SECURE(fmt, args...) SECURE_SLOGE(fmt, ##args) + +#define ret_if(expr) do { \ + if (expr) { \ + return; \ + } \ + } while (0) +#define retv_if(expr, val) do { \ + if (expr) { \ + return (val); \ + } \ + } while (0) +#define retm_if(expr, fmt, arg...) do { \ + if (expr) { \ + BT_ERR(fmt, ##arg); \ + return; \ + } \ + } while (0) +#define retvm_if(expr, val, fmt, arg...) do { \ + if (expr) { \ + BT_ERR(fmt, ##arg); \ + return (val); \ + } \ + } while (0) + +#define BT_SYS_POPUP_IPC_RESPONSE_OBJECT "/org/projectx/bt_syspopup_res" +#define BT_SYS_POPUP_INTERFACE "User.Bluetooth.syspopup" +#define BT_SYS_POPUP_METHOD_RESPONSE "Response" +#define BT_SYS_POPUP_METHOD_RESET_RESPONSE "ResetResponse" + +/* String defines to support multi-languages */ +#define BT_STR_ENTER_PIN \ + dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_ENTERPIN") +#define BT_STR_ALLOW_PS_TO_CONNECT_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_ALLOW_PS_TO_CONNECT_Q") + +#define BT_STR_RECEIVE_PS_FROM_PS_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_RECEIVE_PS_FROM_PS_Q") + +#define BT_STR_PASSKEY_MATCH_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_MATCH_PASSKEYS_ON_PS_Q") + +#define BT_STR_OVERWRITE_FILE_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_PS_ALREADY_EXISTS_OVERWRITE_Q") + +#define BT_STR_ENTER_PS_ON_PS_TO_PAIR \ + dgettext(BT_COMMON_PKG, "IDS_BT_BODY_ENTER_P1SS_ON_P2SS_TO_PAIR_THEN_TAP_RETURN_OR_ENTER") + +#define BT_STR_RECEIVE_FILE_FROM_PS_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_RECEIVE_FILE_FROM_PS_Q") + +/* Need to convert the design ID */ +#define BT_STR_PAIRING_REQUEST \ + dgettext(BT_COMMON_PKG, "IDS_BT_BODY_PAIRING_REQUEST") + +#define BT_STR_ENTER_PIN_TO_PAIR \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_ENTER_PIN_TO_PAIR_WITH_PS_HTRY_0000_OR_1234") + +#define BT_STR_SHOW_PASSWORD \ + dgettext(BT_COMMON_PKG, "IDS_BT_BODY_SHOW_PASSWORD") + +#define BT_STR_CONFIRM_PASSKEY_PS_TO_PAIR_WITH_PS \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_CONFIRM_PASSKEY_IS_P2SS_TO_PAIR_WITH_P1SS") + +#define BT_STR_ALLOW_PS_PHONEBOOK_ACCESS_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_BODY_ALLOW_PS_PHONEBOOK_ACCESS") + +#define BT_STR_ALLOW_PS_TO_ACCESS_MESSAGES_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_ALLOW_PS_TO_ACCESS_MESSAGES_Q") + +#define BT_STR_DONT_ASK_AGAIN \ + dgettext(BT_COMMON_PKG, "IDS_BT_BODY_DONT_ASK_AGAIN") + +#define BT_STR_UNABLE_TO_CONNECT \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_UNABLE_TO_CONNECT") + +#define BT_STR_TIMEOUT_TRY_AGAIN_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_PAIRRETRY") + +#define BT_STR_BLUETOOTH_ERROR_TRY_AGAIN_Q \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_BLUETOOTH_ERROR_TRY_AGAIN_Q") +#define BT_STR_TAP_TO_ENTER \ + dgettext(BT_COMMON_PKG, "IDS_SIM_BODY_TAP_TO_ENTER_ABB") + +#define BT_STR_OK dgettext(BT_COMMON_PKG, "IDS_BT_BUTTON_OK_ABB") +#define BT_STR_CANCEL dgettext(BT_COMMON_PKG, "IDS_BT_BUTTON_CANCEL") + +#define BT_STR_BLUETOOTH_CONNECTED \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_BLUETOOTH_CONNECTED") +#define BT_STR_BLUETOOTH_HAS_BEEN_DISCONNECTED \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_BLUETOOTH_HAS_BEEN_DISCONNECTED") +#define BT_STR_AUTO_CONNECT \ + dgettext(BT_COMMON_PKG, "IDS_BT_POP_CONNECTING_TO_BLUETOOTH_STEREO_HEADSET_ING") + +#define BT_STR_TITLE_CONNECT dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_CONNECT") + +#define BT_STR_FACTORY_RESET \ + dgettext(BT_COMMON_PKG, "IDS_WMGR_BODY_PS_IS_ATTEMPTING_TO_CONNECT_TO_YOUR_GEAR_TO_CONNECT_TO_PS_THE_GEAR_WILL_BE_RESET_TO_ITS_FACTORY_SETTINGS") + +#define BT_STR_RESET dgettext(BT_COMMON_PKG, "IDS_ST_BUTTON_RESET_ABB2") + +#define BT_STR_PIN_LENGTH_ERROR "Pin must contain no more than %d digits" +typedef enum { + BT_CHANGED_MODE_ENABLE, + BT_CHANGED_MODE_DISABLE, +} bt_changed_mode_type_t; + +typedef enum { + BT_EVENT_PIN_REQUEST = 0x0001, + BT_EVENT_PASSKEY_CONFIRM_REQUEST = 0x0002, + BT_EVENT_PASSKEY_REQUEST = 0x0004, + BT_EVENT_PASSKEY_DISPLAY_REQUEST = 0x0008, + BT_EVENT_AUTHORIZE_REQUEST = 0x0010, + BT_EVENT_APP_CONFIRM_REQUEST = 0x0020, + BT_EVENT_PUSH_AUTHORIZE_REQUEST = 0x0040, + BT_EVENT_CONFIRM_OVERWRITE_REQUEST = 0x0080, + BT_EVENT_FILE_RECEIVED = 0x0100, + BT_EVENT_KEYBOARD_PASSKEY_REQUEST = 0x0200, + BT_EVENT_INFORMATION = 0x0400, + BT_EVENT_TERMINATE = 0x0800, + BT_EVENT_EXCHANGE_REQUEST = 0x1000, + BT_EVENT_PHONEBOOK_REQUEST = 0x2000, + BT_EVENT_MESSAGE_REQUEST = 0x4000, + BT_EVENT_UNABLE_TO_PAIRING = 0x8000, + BT_EVENT_HANDSFREE_CONNECT_REQUEST = 0x1100, + BT_EVENT_HANDSFREE_DISCONNECT_REQUEST = 0x1200, + BT_EVENT_HANDSFREE_AUTO_CONNECT_REQUEST = 0x1600, + BT_EVENT_SYSTEM_RESET_REQUEST = 0x10000, +} bt_popup_event_type_t; + +typedef enum { + BT_AGENT_ACCEPT, + BT_AGENT_REJECT, + BT_AGENT_CANCEL, + BT_CORE_AGENT_TIMEOUT, + BT_AGENT_ACCEPT_ALWAYS, +} bt_agent_accept_type_t; + +struct bt_popup_appdata { + Evas *evas; + Evas_Object *win_main; + Evas_Object *popup; + Evas_Object *ly_pass; + Evas_Object *ly_keypad; + + /* Passkey layout objects */ + Evas_Object *entry; + Evas_Object *edit_field_save_btn; + Evas_Object *ticker_noti; + + Ea_Theme_Color_Table *color_table; + Ea_Theme_Font_Table *font_table; + + Ecore_Timer *timer; + + DBusGProxy *agent_proxy; + DBusGProxy *obex_proxy; + E_DBus_Connection *EDBusHandle; + DBusGConnection *conn; + + int changed_mode; + gboolean make_trusted; + guint viberation_id; + bt_popup_event_type_t event_type; +}; + +#endif /* __DEF_BT_SYSPOPUP_H_ */ diff --git a/src/bt-syspopup.c b/src/bt-syspopup.c deleted file mode 100644 index a8614c5..0000000 --- a/src/bt-syspopup.c +++ /dev/null @@ -1,1275 +0,0 @@ -/* - * - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "bt-syspopup.h" - -static void __bluetooth_delete_input_view(struct bt_popup_appdata *ad); -static void __bluetooth_win_del(void *data); - -static int __bluetooth_term(bundle *b, void *data) -{ - BT_DBG("System-popup: terminate"); - return 0; -} - -static int __bluetooth_timeout(bundle *b, void *data) -{ - BT_DBG("System-popup: timeout"); - return 0; -} - -syspopup_handler handler = { - .def_term_fn = __bluetooth_term, - .def_timeout_fn = __bluetooth_timeout -}; - -/* Cleanup objects to avoid mem-leak */ -static void __bluetooth_cleanup(struct bt_popup_appdata *ad) -{ - if (ad == NULL) - return; - - if (ad->popup) { - evas_object_del(ad->popup); - ad->popup = NULL; - } - - if (ad->win_main) { - evas_object_del(ad->win_main); - ad->win_main = NULL; - } - - if (ad->agent_proxy) { - g_object_unref(ad->agent_proxy); - ad->agent_proxy = NULL; - } -} - -static void __bluetooth_notify_event(void) -{ - int result; - - BT_DBG("Notify event"); - - result = feedback_initialize(); - if (result != FEEDBACK_ERROR_NONE) { - BT_ERR("feedback_initialize error : %d", result); - return; - } - - result = feedback_play(FEEDBACK_PATTERN_GENERAL); - BT_DBG("ret value : %d", result); - - result = feedback_deinitialize(); - if (result != FEEDBACK_ERROR_NONE) { - BT_DBG("feedback_initialize error : %d", result); - return; - } -} - -static void __bluetooth_parse_event(struct bt_popup_appdata *ad, const char *event_type) -{ - if (!strcasecmp(event_type, "pin-request")) - ad->event_type = BT_EVENT_PIN_REQUEST; - else if (!strcasecmp(event_type, "passkey-confirm-request")) - ad->event_type = BT_EVENT_PASSKEY_CONFIRM_REQUEST; - else if (!strcasecmp(event_type, "passkey-request")) - ad->event_type = BT_EVENT_PASSKEY_REQUEST; - else if (!strcasecmp(event_type, "authorize-request")) - ad->event_type = BT_EVENT_AUTHORIZE_REQUEST; - else if (!strcasecmp(event_type, "app-confirm-request")) - ad->event_type = BT_EVENT_APP_CONFIRM_REQUEST; - else if (!strcasecmp(event_type, "push-authorize-request")) - ad->event_type = BT_EVENT_PUSH_AUTHORIZE_REQUEST; - else if (!strcasecmp(event_type, "confirm-overwrite-request")) - ad->event_type = BT_EVENT_CONFIRM_OVERWRITE_REQUEST; - else if (!strcasecmp(event_type, "keyboard-passkey-request")) - ad->event_type = BT_EVENT_KEYBOARD_PASSKEY_REQUEST; - else if (!strcasecmp(event_type, "bt-information")) - ad->event_type = BT_EVENT_INFORMATION; - else if (!strcasecmp(event_type, "exchange-request")) - ad->event_type = BT_EVENT_EXCHANGE_REQUEST; - else if (!strcasecmp(event_type, "phonebook-request")) - ad->event_type = BT_EVENT_PHONEBOOK_REQUEST; - else if (!strcasecmp(event_type, "message-request")) - ad->event_type = BT_EVENT_MESSAGE_REQUEST; - else - ad->event_type = 0x0000; - return; -} - -static void __bluetooth_request_to_cancel(void) -{ - bluetooth_cancel_bonding(); -} - -static void __bluetooth_remove_all_event(struct bt_popup_appdata *ad) -{ - switch (ad->event_type) { - case BT_EVENT_PIN_REQUEST: - - dbus_g_proxy_call_no_reply(ad->agent_proxy, - "ReplyPinCode", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_STRING, "", G_TYPE_INVALID, - G_TYPE_INVALID); - - break; - - - case BT_EVENT_KEYBOARD_PASSKEY_REQUEST: - - __bluetooth_request_to_cancel(); - - break; - - case BT_EVENT_PASSKEY_CONFIRM_REQUEST: - - dbus_g_proxy_call_no_reply(ad->agent_proxy, - "ReplyConfirmation", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_INVALID, G_TYPE_INVALID); - - break; - - case BT_EVENT_PASSKEY_REQUEST: - - dbus_g_proxy_call_no_reply(ad->agent_proxy, - "ReplyPasskey", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_STRING, "", G_TYPE_INVALID, - G_TYPE_INVALID); - - break; - - case BT_EVENT_PASSKEY_DISPLAY_REQUEST: - /* Nothing to do */ - break; - - case BT_EVENT_AUTHORIZE_REQUEST: - - dbus_g_proxy_call_no_reply(ad->agent_proxy, - "ReplyAuthorize", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_INVALID, G_TYPE_INVALID); - - break; - - case BT_EVENT_APP_CONFIRM_REQUEST: - { - DBusMessage *msg = NULL; - int response = 2; - - msg = dbus_message_new_signal( - BT_SYS_POPUP_IPC_RESPONSE_OBJECT, - BT_SYS_POPUP_INTERFACE, - BT_SYS_POPUP_METHOD_RESPONSE); - - /* For timeout rejection is sent to be handled in - application */ - response = 1; - - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &response, - DBUS_TYPE_INVALID); - - e_dbus_message_send(ad->EDBusHandle, - msg, NULL, -1, NULL); - - dbus_message_unref(msg); - } - break; - - case BT_EVENT_PUSH_AUTHORIZE_REQUEST: - case BT_EVENT_EXCHANGE_REQUEST: - - dbus_g_proxy_call_no_reply(ad->obex_proxy, - "ReplyAuthorize", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_INVALID, G_TYPE_INVALID); - - break; - - case BT_EVENT_CONFIRM_OVERWRITE_REQUEST: - - dbus_g_proxy_call_no_reply(ad->obex_proxy, - "ReplyOverwrite", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_INVALID, G_TYPE_INVALID); - - break; - - default: - break; - } - - __bluetooth_win_del(ad); -} - -static int __bluetooth_keydown_cb(void *data, int type, void *event_info) -{ - struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; - Ecore_Event_Key *ev = event_info; - - if (!g_strcmp0(ev->keyname, KEY_END) || !g_strcmp0(ev->keyname, KEY_SELECT)) { - BT_DBG("Key [%s]", ev->keyname); - /* remove_all_event(); */ - - if (!g_strcmp0(ev->keyname, KEY_END)) { - __bluetooth_remove_all_event(ad); - } - } - - return 0; -} - -static int __bluetooth_request_timeout_cb(void *data) -{ - struct bt_popup_appdata *ad; - - if (data == NULL) - return 0; - - ad = (struct bt_popup_appdata *)data; - - BT_DBG("Request time out, Canceling reqeust"); - - /* Destory UI and timer */ - if (ad->timer) { - ecore_timer_del(ad->timer); - ad->timer = NULL; - } - - __bluetooth_remove_all_event(ad); - return 0; -} - -static void __bluetooth_input_request_cb(void *data, - Evas_Object *obj, void *event_info) -{ - struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; - const char *event = elm_object_text_get(obj); - int response; - char *input_text = NULL; - char *convert_input_text = NULL; - - if (ad == NULL) - return; - - /* BT_EVENT_PIN_REQUEST / BT_EVENT_PASSKEY_REQUEST */ - - input_text = (char *)elm_entry_entry_get(ad->entry); - - if (input_text) { - convert_input_text = - elm_entry_markup_to_utf8(input_text); - } - - if (!g_strcmp0(event, BT_STR_OK)) - response = 1; - else - response = 0; - - if (convert_input_text == NULL) - return; - - BT_DBG("PIN/Passkey[%s] event[%d] response[%d]", - convert_input_text, ad->event_type, response); - - if (response == 1) { - BT_DBG("Done case"); - if (ad->event_type == BT_EVENT_PIN_REQUEST) { - dbus_g_proxy_call_no_reply(ad->agent_proxy, - "ReplyPinCode", - G_TYPE_UINT, BT_AGENT_ACCEPT, - G_TYPE_STRING, - convert_input_text, - G_TYPE_INVALID, - G_TYPE_INVALID); - } else { - dbus_g_proxy_call_no_reply(ad->agent_proxy, - "ReplyPasskey", - G_TYPE_UINT, BT_AGENT_ACCEPT, - G_TYPE_STRING, - convert_input_text, - G_TYPE_INVALID, - G_TYPE_INVALID); - } - } else { - BT_DBG("Cancel case"); - if (ad->event_type == BT_EVENT_PIN_REQUEST) { - dbus_g_proxy_call_no_reply(ad->agent_proxy, - "ReplyPinCode", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_STRING, "", - G_TYPE_INVALID, - G_TYPE_INVALID); - } else { - dbus_g_proxy_call_no_reply(ad->agent_proxy, - "ReplyPasskey", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_STRING, "", - G_TYPE_INVALID, - G_TYPE_INVALID); - } - } - - __bluetooth_delete_input_view(ad); - - free(convert_input_text); - - __bluetooth_win_del(ad); -} - -static void __bluetooth_input_cancel_cb(void *data, - Evas_Object *obj, void *event_info) -{ - struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; - - bluetooth_cancel_bonding(); - - __bluetooth_win_del(ad); -} - -static void __bluetooth_passkey_confirm_cb(void *data, - Evas_Object *obj, void *event_info) -{ - if (obj == NULL || data == NULL) - return; - - struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; - const char *event = elm_object_text_get(obj); - - if (!g_strcmp0(event, BT_STR_OK)) { - dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyConfirmation", - G_TYPE_UINT, BT_AGENT_ACCEPT, - G_TYPE_INVALID, G_TYPE_INVALID); - } else { - dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyConfirmation", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_INVALID, G_TYPE_INVALID); - } - - evas_object_del(obj); - - __bluetooth_win_del(ad); -} - -static int __bluetooth_init_app_signal(struct bt_popup_appdata *ad) -{ - if (NULL == ad) - return FALSE; - - e_dbus_init(); - ad->EDBusHandle = e_dbus_bus_get(DBUS_BUS_SYSTEM); - if (!ad->EDBusHandle) { - BT_ERR("e_dbus_bus_get failed \n "); - return FALSE; - } else { - BT_DBG("e_dbus_bus_get success \n "); - e_dbus_request_name(ad->EDBusHandle, - BT_SYS_POPUP_IPC_NAME, 0, NULL, NULL); - } - return TRUE; -} - -static void __bluetooth_app_confirm_cb(void *data, - Evas_Object *obj, void *event_info) -{ - BT_DBG("__bluetooth_app_confirm_cb "); - if (obj == NULL || data == NULL) - return; - - struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; - const char *event = elm_object_text_get(obj); - - DBusMessage *msg = NULL; - int response; - - msg = dbus_message_new_signal(BT_SYS_POPUP_IPC_RESPONSE_OBJECT, - BT_SYS_POPUP_INTERFACE, - BT_SYS_POPUP_METHOD_RESPONSE); - - if (!g_strcmp0(event, BT_STR_YES) || !g_strcmp0(event, BT_STR_OK)) - response = 0; - else - response = 1; - - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); - - e_dbus_message_send(ad->EDBusHandle, msg, NULL, -1, NULL); - dbus_message_unref(msg); - - evas_object_del(obj); - - __bluetooth_win_del(ad); -} - -static void __bluetooth_authorization_request_cb(void *data, - Evas_Object *obj, - void *event_info) -{ - struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; - if (obj == NULL || ad == NULL) - return; - - const char *event = elm_object_text_get(obj); - - if (!g_strcmp0(event, BT_STR_YES)) { - dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyAuthorize", - G_TYPE_UINT, BT_AGENT_ACCEPT, - G_TYPE_INVALID, G_TYPE_INVALID); - } else { - dbus_g_proxy_call_no_reply(ad->agent_proxy, "ReplyAuthorize", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_INVALID, G_TYPE_INVALID); - } - - __bluetooth_win_del(ad); -} - -static void __bluetooth_push_authorization_request_cb(void *data, - Evas_Object *obj, - void *event_info) -{ - struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; - if (obj == NULL || ad == NULL) - return; - - const char *event = elm_object_text_get(obj); - - if (!g_strcmp0(event, BT_STR_YES)) - dbus_g_proxy_call_no_reply(ad->obex_proxy, "ReplyAuthorize", - G_TYPE_UINT, BT_AGENT_ACCEPT, - G_TYPE_INVALID, G_TYPE_INVALID); - else - dbus_g_proxy_call_no_reply(ad->obex_proxy, "ReplyAuthorize", - G_TYPE_UINT, BT_AGENT_CANCEL, - G_TYPE_INVALID, G_TYPE_INVALID); - - __bluetooth_win_del(ad); -} - -static void __bluetooth_ime_hide(void) -{ - Ecore_IMF_Context *imf_context = NULL; - imf_context = ecore_imf_context_add(ecore_imf_context_default_id_get()); - if (imf_context) - ecore_imf_context_input_panel_hide(imf_context); -} - -static void __bluetooth_entry_change_cb(void *data, Evas_Object *obj, - void *event_info) -{ - struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; - char *input_text = NULL; - char *convert_input_text = NULL; - char *output_text = NULL; - int text_length = 0; - - input_text = (char *)elm_entry_entry_get(obj); - - if (input_text) { - convert_input_text = elm_entry_markup_to_utf8(input_text); - if (convert_input_text) { - text_length = strlen(convert_input_text); - - if (text_length == 0) { - elm_object_disabled_set(ad->edit_field_save_btn, - EINA_TRUE); - elm_object_signal_emit(ad->editfield, - "elm,state,eraser,hide", - "elm"); - } else { - elm_object_disabled_set(ad->edit_field_save_btn, - EINA_FALSE); - elm_object_signal_emit(ad->editfield, - "elm,state,eraser,show", - "elm"); - } - - if (ad->event_type == BT_EVENT_PASSKEY_REQUEST) { - if (text_length > BT_PK_MLEN) { - text_length = BT_PK_MLEN; - convert_input_text[BT_PK_MLEN] = '\0'; - output_text = - elm_entry_utf8_to_markup - (convert_input_text); - - elm_entry_entry_set(obj, output_text); - elm_entry_cursor_end_set(obj); - free(output_text); - } - } else { - if (text_length > BT_PIN_MLEN) { - text_length = BT_PIN_MLEN; - convert_input_text[BT_PIN_MLEN] = '\0'; - output_text = - elm_entry_utf8_to_markup - (convert_input_text); - - elm_entry_entry_set(obj, output_text); - elm_entry_cursor_end_set(obj); - free(output_text); - } - } - free(convert_input_text); - } - } -} - -static void __bluetooth_entry_focused_cb(void *data, Evas_Object *obj, - void *event_info) -{ - if (!elm_entry_is_empty(obj)) - elm_object_signal_emit(data, "elm,state,eraser,show", "elm"); - - elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm"); -} - -static void __bluetooth_entry_unfocused_cb(void *data, Evas_Object *obj, - void *event_info) -{ - if (elm_entry_is_empty(obj)) - elm_object_signal_emit(data, "elm,state,guidetext,show", "elm"); - - elm_object_signal_emit(data, "elm,state,eraser,hide", "elm"); -} - -static void __bluetooth_eraser_clicked_cb(void* data, Evas_Object* obj, - const char* emission, const char* source) -{ - elm_entry_entry_set(data, ""); -} - -static void __bluetooth_check_chagned_cb(void *data, Evas_Object *obj, - void *event_info) -{ - Eina_Bool state = EINA_FALSE; - - if (obj == NULL) - return; - - state = elm_check_state_get(obj); - elm_entry_password_set(data, !state); -} - -static void __bluetooth_draw_popup(struct bt_popup_appdata *ad, - const char *title, char *btn1_text, - char *btn2_text, void (*func) (void *data, - Evas_Object *obj, void *event_info)) -{ - char temp_str[BT_TITLE_STR_MAX_LEN+BT_TEXT_EXTRA_LEN] = { 0 }; - Evas_Object *btn1; - Evas_Object *btn2; - - BT_DBG("__bluetooth_draw_popup"); - - ad->popup = elm_popup_add(ad->win_main); - evas_object_size_hint_weight_set(ad->popup, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - - elm_object_style_set(ad->popup, "transparent"); - - if (title != NULL) { - snprintf(temp_str, BT_TITLE_STR_MAX_LEN+BT_TEXT_EXTRA_LEN, - "%s", title); - elm_object_text_set(ad->popup, temp_str); - } - - if ((btn1_text != NULL) && (btn2_text != NULL)) { - btn1 = elm_button_add(ad->popup); - elm_object_style_set(btn1, "popup_button/default"); - elm_object_text_set(btn1, btn1_text); - elm_object_part_content_set(ad->popup, "button1", btn1); - evas_object_smart_callback_add(btn1, "clicked", func, ad); - - btn2 = elm_button_add(ad->popup); - elm_object_style_set(btn2, "popup_button/default"); - elm_object_text_set(btn2, btn2_text); - elm_object_part_content_set(ad->popup, "button2", btn2); - evas_object_smart_callback_add(btn2, "clicked", func, ad); - } else if (btn1_text != NULL) { - btn1 = elm_button_add(ad->popup); - elm_object_style_set(btn1, "popup_button/default"); - elm_object_text_set(btn1, btn1_text); - elm_object_part_content_set(ad->popup, "button1", btn1); - evas_object_smart_callback_add(btn1, "clicked", func, ad); - } - - evas_object_show(ad->popup); - evas_object_show(ad->win_main); - - BT_DBG("__bluetooth_draw_popup END"); -} - -static void __bluetooth_draw_input_view(struct bt_popup_appdata *ad, - const char *title, const char *text, - void (*func) - (void *data, Evas_Object *obj, void *event_info)) -{ - Evas_Object *conformant = NULL; - Evas_Object *content = NULL; - Evas_Object *layout = NULL; - Evas_Object *passpopup = NULL; - Evas_Object *label = NULL; - Evas_Object *editfield = NULL; - Evas_Object *entry = NULL; - Evas_Object *check = NULL; - Evas_Object *l_button = NULL; - Evas_Object *r_button = NULL; - - if (ad == NULL || ad->win_main == NULL) { - BT_ERR("Invalid parameter"); - return; - } - - evas_object_show(ad->win_main); - - conformant = elm_conformant_add(ad->win_main); - if (conformant == NULL) { - BT_ERR("conformant is NULL"); - return; - } - ad->popup = conformant; - - elm_win_conformant_set(ad->win_main, EINA_TRUE); - elm_win_resize_object_add(ad->win_main, conformant); - evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(conformant, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(conformant); - - content = elm_layout_add(conformant); - elm_object_content_set(conformant, content); - - passpopup = elm_popup_add(content); - elm_object_part_text_set(passpopup, "title,text", title); - - elm_object_style_set(passpopup, "transparent"); - - layout = elm_layout_add(passpopup); - elm_layout_file_set(layout, CUSTOM_POPUP_PATH, "popup_checkview_image"); - evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - - label = elm_label_add(passpopup); - elm_object_style_set(label, "popup/default"); - elm_label_line_wrap_set(label, ELM_WRAP_CHAR); - elm_object_text_set(label, text); - evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(label); - - editfield = elm_layout_add(passpopup); - elm_layout_theme_set(editfield, "layout", "editfield", "default"); - evas_object_size_hint_weight_set(editfield, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(editfield, EVAS_HINT_FILL, EVAS_HINT_FILL); - ad->editfield = editfield; - - entry = elm_entry_add(passpopup); - elm_entry_single_line_set(entry, EINA_TRUE); - elm_entry_scrollable_set(entry, EINA_TRUE); - elm_entry_prediction_allow_set(entry, EINA_FALSE); - elm_entry_password_set(entry, TRUE); - elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NUMBERONLY); - elm_object_part_content_set(editfield, "elm.swallow.content", entry); - ad->entry = entry; - - evas_object_smart_callback_add(entry, "changed", - __bluetooth_entry_change_cb, - ad); - - evas_object_smart_callback_add(entry, "focused", - __bluetooth_entry_focused_cb, - editfield); - - evas_object_smart_callback_add(entry, "unfocused", - __bluetooth_entry_unfocused_cb, - editfield); - - elm_object_signal_callback_add(editfield, "elm,eraser,clicked", "elm", - (Edje_Signal_Cb)__bluetooth_eraser_clicked_cb, - entry); - - evas_object_show(entry); - evas_object_show(editfield); - - check = elm_check_add(passpopup); - elm_object_text_set(check, BT_STR_SHOW_PASSWORD); - elm_object_focus_allow_set(check, EINA_FALSE); - evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(check, EVAS_HINT_FILL, - EVAS_HINT_FILL); - evas_object_smart_callback_add(check, "changed", - __bluetooth_check_chagned_cb, entry); - evas_object_show(check); - - l_button = elm_button_add(ad->win_main); - elm_object_style_set(l_button, "popup_button/default"); - elm_object_text_set(l_button, BT_STR_OK); - elm_object_part_content_set(passpopup, "button1", l_button); - evas_object_smart_callback_add(l_button, "clicked", func, ad); - elm_object_disabled_set(l_button, EINA_TRUE); - - ad->edit_field_save_btn = l_button; - - r_button = elm_button_add(ad->win_main); - elm_object_style_set(r_button, "popup_button/default"); - elm_object_text_set(r_button, BT_STR_CANCEL); - elm_object_part_content_set(passpopup, "button2", r_button); - evas_object_smart_callback_add(r_button, "clicked", func, ad); - - elm_object_part_content_set(layout, "elm.swallow.content", label); - elm_object_part_content_set(layout, "elm.swallow.entry", editfield); - elm_object_part_content_set(layout, "elm.swallow.end", check); - - evas_object_show(layout); - evas_object_show(content); - evas_object_show(passpopup); - elm_object_content_set(passpopup, layout); - elm_object_focus_set(entry, EINA_TRUE); -} - -static void __bluetooth_delete_input_view(struct bt_popup_appdata *ad) -{ - __bluetooth_ime_hide(); -} - -static DBusGProxy* __bluetooth_create_agent_proxy(DBusGConnection *conn, - const char *path) -{ - return dbus_g_proxy_new_for_name(conn, "org.projectx.bt", path, - "org.bluez.Agent1"); -} - -/* AUL bundle handler */ -static int __bluetooth_launch_handler(struct bt_popup_appdata *ad, - void *reset_data, const char *event_type) -{ - bundle *kb = (bundle *) reset_data; - char view_title[BT_TITLE_STR_MAX_LEN] = { 0 }; - char text[BT_GLOBALIZATION_STR_LENGTH] = { 0 }; - int timeout = 0; - const char *device_name = NULL; - const char *passkey = NULL; - const char *file = NULL; - const char *agent_path; - char *conv_str = NULL; - - BT_DBG("__bluetooth_launch_handler"); - - if (!reset_data || !event_type) - return -1; - - if (!strcasecmp(event_type, "pin-request")) { - device_name = bundle_get_val(kb, "device-name"); - agent_path = bundle_get_val(kb, "agent-path"); - - ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); - if (!ad->agent_proxy) - return -1; - - if (device_name) - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - "%s", BT_STR_BLUETOOTH_PAIRING_REQUEST); - - snprintf(text, BT_GLOBALIZATION_STR_LENGTH, - BT_STR_ENTER_PIN_TO_PAIR, conv_str); - - if (conv_str) - free(conv_str); - - /* Request user inputted PIN for basic pairing */ - __bluetooth_draw_input_view(ad, view_title, text, - __bluetooth_input_request_cb); - } else if (!strcasecmp(event_type, "passkey-confirm-request")) { - device_name = bundle_get_val(kb, "device-name"); - passkey = bundle_get_val(kb, "passkey"); - agent_path = bundle_get_val(kb, "agent-path"); - - ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); - if (!ad->agent_proxy) - return -1; - - if (device_name && passkey) { - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - BT_STR_CONFIRM_PASSKEY_PS_TO_PAIR_WITH_PS, - conv_str, passkey); - - BT_DBG("title: %s", view_title); - - if (conv_str) - free(conv_str); - - __bluetooth_draw_popup(ad, view_title, - BT_STR_OK, BT_STR_CANCEL, - __bluetooth_passkey_confirm_cb); - } else { - timeout = BT_ERROR_TIMEOUT; - } - } else if (!strcasecmp(event_type, "passkey-request")) { - const char *device_name = NULL; - - device_name = bundle_get_val(kb, "device-name"); - agent_path = bundle_get_val(kb, "agent-path"); - - ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); - if (!ad->agent_proxy) - return -1; - - if (device_name) - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - "%s", BT_STR_BLUETOOTH_PAIRING_REQUEST); - - snprintf(text, BT_GLOBALIZATION_STR_LENGTH, - BT_STR_ENTER_PIN_TO_PAIR, conv_str); - - if (conv_str) - free(conv_str); - - /* Request user inputted Passkey for basic pairing */ - __bluetooth_draw_input_view(ad, view_title, text, - __bluetooth_input_request_cb); - - } else if (!strcasecmp(event_type, "passkey-display-request")) { - device_name = bundle_get_val(kb, "device-name"); - passkey = bundle_get_val(kb, "passkey"); - - if (device_name && passkey) { - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - BT_STR_ENTER_PS_ON_PS_TO_PAIR, passkey, conv_str); - - BT_DBG("title: %s", view_title); - - if (conv_str) - free(conv_str); - - __bluetooth_draw_popup(ad, view_title, - BT_STR_CANCEL, NULL, - __bluetooth_input_cancel_cb); - } else { - timeout = BT_ERROR_TIMEOUT; - } - } else if (!strcasecmp(event_type, "authorize-request")) { - timeout = BT_AUTHORIZATION_TIMEOUT; - - device_name = bundle_get_val(kb, "device-name"); - agent_path = bundle_get_val(kb, "agent-path"); - - ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); - if (!ad->agent_proxy) - return -1; - - if (device_name) - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - BT_STR_ALLOW_PS_TO_CONNECT_Q, conv_str); - - if (conv_str) - free(conv_str); - - __bluetooth_draw_popup(ad, view_title, BT_STR_YES, BT_STR_NO, - __bluetooth_authorization_request_cb); - } else if (!strcasecmp(event_type, "app-confirm-request")) { - BT_DBG("app-confirm-request"); - timeout = BT_AUTHORIZATION_TIMEOUT; - - const char *title = NULL; - const char *type = NULL; - - title = bundle_get_val(kb, "title"); - type = bundle_get_val(kb, "type"); - - if (!title) - return -1; - - if (strcasecmp(type, "twobtn") == 0) { - __bluetooth_draw_popup(ad, title, BT_STR_YES, BT_STR_NO, - __bluetooth_app_confirm_cb); - } else if (strcasecmp(type, "onebtn") == 0) { - timeout = BT_NOTIFICATION_TIMEOUT; - __bluetooth_draw_popup(ad, title, BT_STR_YES, NULL, - __bluetooth_app_confirm_cb); - } else if (strcasecmp(type, "none") == 0) { - timeout = BT_NOTIFICATION_TIMEOUT; - __bluetooth_draw_popup(ad, title, NULL, NULL, - __bluetooth_app_confirm_cb); - } - } else if (!strcasecmp(event_type, "push-authorize-request")) { - timeout = BT_AUTHORIZATION_TIMEOUT; - - device_name = bundle_get_val(kb, "device-name"); - file = bundle_get_val(kb, "file"); - - if (device_name) - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - BT_STR_RECEIVE_PS_FROM_PS_Q, file, conv_str); - - if (conv_str) - free(conv_str); - - __bluetooth_draw_popup(ad, view_title, BT_STR_YES, BT_STR_NO, - __bluetooth_push_authorization_request_cb); - } else if (!strcasecmp(event_type, "confirm-overwrite-request")) { - timeout = BT_AUTHORIZATION_TIMEOUT; - - file = bundle_get_val(kb, "file"); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - BT_STR_OVERWRITE_FILE_Q, file); - - __bluetooth_draw_popup(ad, view_title, BT_STR_YES, BT_STR_NO, - __bluetooth_app_confirm_cb); - } else if (!strcasecmp(event_type, "keyboard-passkey-request")) { - device_name = bundle_get_val(kb, "device-name"); - passkey = bundle_get_val(kb, "passkey"); - - if (device_name && passkey) { - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - BT_STR_ENTER_PS_ON_PS_TO_PAIR, passkey, conv_str); - - BT_DBG("title: %s", view_title); - - if (conv_str) - free(conv_str); - - __bluetooth_draw_popup(ad, view_title, - BT_STR_CANCEL, NULL, - __bluetooth_input_cancel_cb); - } else { - timeout = BT_ERROR_TIMEOUT; - } - } else if (!strcasecmp(event_type, "bt-information")) { - BT_DBG("bt-information"); - timeout = BT_NOTIFICATION_TIMEOUT; - - const char *title = NULL; - const char *type = NULL; - - title = bundle_get_val(kb, "title"); - type = bundle_get_val(kb, "type"); - - if (title != NULL) { - if (strlen(title) > 255) - return -1; - } else - return -1; - - if (strcasecmp(type, "onebtn") == 0) { - __bluetooth_draw_popup(ad, title, BT_STR_OK, NULL, - __bluetooth_app_confirm_cb); - } else if (strcasecmp(type, "none") == 0) { - __bluetooth_draw_popup(ad, title, NULL, NULL, - __bluetooth_app_confirm_cb); - } - } else if (!strcasecmp(event_type, "exchange-request")) { - timeout = BT_AUTHORIZATION_TIMEOUT; - - device_name = bundle_get_val(kb, "device-name"); - agent_path = bundle_get_val(kb, "agent-path"); - - ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); - if (!ad->agent_proxy) - return -1; - - if (device_name) - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - BT_STR_EXCHANGE_OBJECT_WITH_PS_Q, conv_str); - - if (conv_str) - free(conv_str); - - __bluetooth_draw_popup(ad, view_title, BT_STR_YES, BT_STR_NO, - __bluetooth_authorization_request_cb); - } else if (!strcasecmp(event_type, "phonebook-request")) { - timeout = BT_AUTHORIZATION_TIMEOUT; - - device_name = bundle_get_val(kb, "device-name"); - agent_path = bundle_get_val(kb, "agent-path"); - - ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); - if (!ad->agent_proxy) - return -1; - - if (device_name) - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - BT_STR_ALLOW_PS_PHONEBOOK_ACCESS_Q, conv_str); - - if (conv_str) - free(conv_str); - - __bluetooth_draw_popup(ad, view_title, BT_STR_YES, BT_STR_NO, - __bluetooth_authorization_request_cb); - } else if (!strcasecmp(event_type, "message-request")) { - timeout = BT_AUTHORIZATION_TIMEOUT; - - device_name = bundle_get_val(kb, "device-name"); - agent_path = bundle_get_val(kb, "agent-path"); - - ad->agent_proxy = __bluetooth_create_agent_proxy(ad->conn, agent_path); - if (!ad->agent_proxy) - return -1; - - if (device_name) - conv_str = elm_entry_utf8_to_markup(device_name); - - snprintf(view_title, BT_TITLE_STR_MAX_LEN, - BT_STR_ALLOW_PS_TO_ACCESS_MESSAGES_Q, conv_str); - - if (conv_str) - free(conv_str); - - __bluetooth_draw_popup(ad, view_title, BT_STR_YES, BT_STR_NO, - __bluetooth_authorization_request_cb); - } else { - return -1; - } - - if (ad->event_type != BT_EVENT_FILE_RECEIVED && timeout != 0) { - ad->timer = ecore_timer_add(timeout, (Ecore_Task_Cb) - __bluetooth_request_timeout_cb, - ad); - } - - return 0; -} - -static void __bluetooth_win_del(void *data) -{ - struct bt_popup_appdata *ad = (struct bt_popup_appdata *)data; - - __bluetooth_cleanup(ad); - - elm_exit(); -} - -static Evas_Object *__bluetooth_create_win(const char *name) -{ - Evas_Object *eo; - - eo = elm_win_add(NULL, name, ELM_WIN_DIALOG_BASIC); - if (eo) { - elm_win_title_set(eo, name); - elm_win_borderless_set(eo, EINA_TRUE); - } - - return eo; -} - -static void __bluetooth_session_init(struct bt_popup_appdata *ad) -{ - DBusGConnection *conn = NULL; - GError *err = NULL; - - g_type_init(); - - conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &err); - - if (!conn) { - BT_ERR("ERROR: Can't get on system bus [%s]", - err->message); - g_error_free(err); - return; - } - - ad->conn = conn; - - ad->obex_proxy = dbus_g_proxy_new_for_name(conn, - "org.bluez.frwk_agent", - "/org/obex/ops_agent", - "org.openobex.Agent"); - if (!ad->obex_proxy) - BT_ERR("Could not create obex dbus proxy"); - - if (!__bluetooth_init_app_signal(ad)) - BT_ERR("__bt_syspopup_init_app_signal failed"); -} - -static int __bluetooth_create(void *data) -{ - struct bt_popup_appdata *ad = data; - Evas_Object *win = NULL; - - BT_DBG("__bluetooth_create() start.\n"); - - /* create window */ - win = __bluetooth_create_win(PACKAGE); - if (win == NULL) - return -1; - ad->win_main = win; - - /* init internationalization */ - if (appcore_set_i18n(BT_COMMON_PKG, BT_COMMON_RES) < 0) - return -1; - - ecore_imf_init(); - ad->event_handle = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, - (Ecore_Event_Handler_Cb) - __bluetooth_keydown_cb, - ad); - - __bluetooth_session_init(ad); - - return 0; -} - -static int __bluetooth_terminate(void *data) -{ - struct bt_popup_appdata *ad = data; - - __bluetooth_ime_hide(); - - if (ad->conn) { - dbus_g_connection_unref(ad->conn); - ad->conn = NULL; - } - - if (ad->event_handle) - ecore_event_handler_del(ad->event_handle); - - if (ad->popup) - evas_object_del(ad->popup); - - if (ad->win_main) - evas_object_del(ad->win_main); - - ad->popup = NULL; - ad->win_main = NULL; - - return 0; -} - -static int __bluetooth_pause(void *data) -{ - - return 0; -} - -static int __bluetooth_resume(void *data) -{ - - return 0; -} - -static int __bluetooth_reset(bundle *b, void *data) -{ - struct bt_popup_appdata *ad = data; - const char *event_type = NULL; - int ret = 0; - - BT_DBG("__bluetooth_reset()\n"); - - if (ad == NULL) { - BT_ERR("App data is NULL\n"); - return -1; - } - - /* Start Main UI */ - event_type = bundle_get_val(b, "event-type"); - - if (event_type != NULL) { - if (!strcasecmp(event_type, "terminate")) { - __bluetooth_win_del(ad); - return 0; - } - - if (syspopup_has_popup(b)) { - /* Destroy the existing popup*/ - __bluetooth_cleanup(ad); - /* create window */ - ad->win_main = __bluetooth_create_win(PACKAGE); - if (ad->win_main == NULL) - return -1; - } - - __bluetooth_parse_event(ad, event_type); - - elm_win_alpha_set(ad->win_main, EINA_TRUE); - - ret = syspopup_create(b, &handler, ad->win_main, ad); - if (ret == -1) { - BT_ERR("syspopup_create err"); - __bluetooth_remove_all_event(ad); - } else { - ret = __bluetooth_launch_handler(ad, - b, event_type); - - if (ret != 0) - __bluetooth_remove_all_event(ad); - - __bluetooth_notify_event(); - - /* Change LCD brightness */ - ret = pm_change_state(LCD_NORMAL); - if (ret != 0) - BT_ERR("Fail to change LCD"); - } - } else { - BT_ERR("event type is NULL \n"); - } - - return 0; -} - -EXPORT int main(int argc, char *argv[]) -{ - struct bt_popup_appdata ad; - struct appcore_ops ops = { - .create = __bluetooth_create, - .terminate = __bluetooth_terminate, - .pause = __bluetooth_pause, - .resume = __bluetooth_resume, - .reset = __bluetooth_reset, - }; - - memset(&ad, 0x0, sizeof(struct bt_popup_appdata)); - ops.data = &ad; - - return appcore_efl_main(PACKAGE, &argc, &argv, &ops); -} - diff --git a/src/bt-syspopup.h b/src/bt-syspopup.h deleted file mode 100644 index 7d8aa27..0000000 --- a/src/bt-syspopup.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - * - * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef __DEF_BT_SYSPOPUP_H_ -#define __DEF_BT_SYSPOPUP_H_ - -#include -#include -#include -#include - -#ifndef PACKAGE_NAME -#define PACKAGE_NAME "org.tizen.bt-syspopup" -#endif - -#ifndef PREFIX -#define PREFIX tzplatform_mkpath(TZ_SYS_RW_APP, PACKAGE_NAME); -#endif - -#define EXPORT __attribute__((visibility("default"))) - -#define TEMP_DIR "/tmp" - -#define PACKAGE "bt-syspopup" -#define APPNAME "bt-syspopup" -#define ICON_DIR PREFIX"/res/default/small/icon" - -#define CUSTOM_POPUP_PATH PREFIX"/res/edje/custom_popup.edj" - -#define BT_COMMON_PKG "ug-setting-bluetooth-efl" -#define BT_COMMON_RES "/usr/ug/res/locale" - -#define _EDJ(obj) elm_layout_edje_get(obj) - -#define BT_AUTHENTICATION_TIMEOUT 35 -#define BT_AUTHORIZATION_TIMEOUT 15 -#define BT_NOTIFICATION_TIMEOUT 2 -#define BT_ERROR_TIMEOUT 1 - -#define BT_PIN_MLEN 16 /* Pin key max length */ -#define BT_PK_MLEN 6 /* Passkey max length */ -#define BT_CONTROLBAR_MAX_LENGTH 3 - -#define BT_GLOBALIZATION_STR_LENGTH 256 -#define BT_DEVICE_NAME_LENGTH_MAX 256 -#define BT_FILE_NAME_LENGTH_MAX 256 -#define BT_TEXT_EXTRA_LEN 20 - -#define BT_TITLE_STR_MAX_LEN \ - (BT_GLOBALIZATION_STR_LENGTH+BT_DEVICE_NAME_LENGTH_MAX+BT_FILE_NAME_LENGTH_MAX) - -#define BT_MESSAGE_STRING_SIZE 256*2+1 - -#undef LOG_TAG -#define LOG_TAG "BT_SYSPOPUP" - -#define BT_DBG(format, args...) SLOGD(format, ##args) -#define BT_ERR(format, args...) SLOGE(format, ##args) - -#define BT_SYS_POPUP_IPC_NAME "org.projectx" -#define BT_SYS_POPUP_IPC_RESPONSE_OBJECT "/org/projectx/bt_syspopup_res" -#define BT_SYS_POPUP_INTERFACE "User.Bluetooth.syspopup" -#define BT_SYS_POPUP_METHOD_RESPONSE "Response" - -/* String defines to support multi-languages */ -#define BT_STR_ENTER_PIN \ - dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_ENTERPIN") -#define BT_STR_ALLOW_PS_TO_CONNECT_Q \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_ALLOW_PS_TO_CONNECT_Q") - -#define BT_STR_RECEIVE_PS_FROM_PS_Q \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_RECEIVE_PS_FROM_PS_Q") - -#define BT_STR_PASSKEY_MATCH_Q \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_MATCH_PASSKEYS_ON_PS_Q") - -#define BT_STR_OVERWRITE_FILE_Q \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_PS_ALREADY_EXISTS_OVERWRITE_Q") - -#define BT_STR_ENTER_PS_ON_PS_TO_PAIR \ - dgettext(BT_COMMON_PKG, "IDS_BT_BODY_ENTER_P1SS_ON_P2SS_TO_PAIR_THEN_TAP_RETURN_OR_ENTER") - -#define BT_STR_EXCHANGE_OBJECT_WITH_PS_Q \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_EXCHANGEOBJECT") - -/* Need to convert the design ID */ -#define BT_STR_BLUETOOTH_PAIRING_REQUEST \ - dgettext(BT_COMMON_PKG, "IDS_BT_HEADER_BLUETOOTH_PAIRING_REQUEST") - -#define BT_STR_ENTER_PIN_TO_PAIR \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_ENTER_PIN_TO_PAIR_WITH_PS_HTRY_0000_OR_1234") - -#define BT_STR_SHOW_PASSWORD \ - dgettext(BT_COMMON_PKG, "IDS_BT_BODY_SHOW_PASSWORD") - -#define BT_STR_CONFIRM_PASSKEY_PS_TO_PAIR_WITH_PS \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_CONFIRM_PASSKEY_IS_P2SS_TO_PAIR_WITH_P1SS") - -#define BT_STR_ALLOW_PS_PHONEBOOK_ACCESS_Q \ - dgettext(BT_COMMON_PKG, "IDS_BT_BODY_ALLOW_PS_PHONEBOOK_ACCESS") - -#define BT_STR_ALLOW_PS_TO_ACCESS_MESSAGES_Q \ - dgettext(BT_COMMON_PKG, "IDS_BT_POP_ALLOW_PS_TO_ACCESS_MESSAGES_Q") - -#define BT_STR_OK dgettext("sys_string", "IDS_COM_SK_OK") -#define BT_STR_YES dgettext("sys_string", "IDS_COM_SK_YES") -#define BT_STR_NO dgettext("sys_string", "IDS_COM_SK_NO") -#define BT_STR_DONE dgettext("sys_string", "IDS_COM_SK_DONE") -#define BT_STR_CANCEL dgettext("sys_string", "IDS_COM_SK_CANCEL") - -typedef enum { - BT_CHANGED_MODE_ENABLE, - BT_CHANGED_MODE_DISABLE, -} bt_changed_mode_type_t; - -typedef enum { - BT_EVENT_PIN_REQUEST = 0x0001, - BT_EVENT_PASSKEY_CONFIRM_REQUEST = 0x0002, - BT_EVENT_PASSKEY_REQUEST = 0x0004, - BT_EVENT_PASSKEY_DISPLAY_REQUEST = 0x0008, - BT_EVENT_AUTHORIZE_REQUEST = 0x0010, - BT_EVENT_APP_CONFIRM_REQUEST = 0x0020, - BT_EVENT_PUSH_AUTHORIZE_REQUEST = 0x0040, - BT_EVENT_CONFIRM_OVERWRITE_REQUEST = 0x0080, - BT_EVENT_FILE_RECEIVED = 0x0100, - BT_EVENT_KEYBOARD_PASSKEY_REQUEST = 0x0200, - BT_EVENT_INFORMATION = 0x0400, - BT_EVENT_TERMINATE = 0x0800, - BT_EVENT_EXCHANGE_REQUEST = 0x1000, - BT_EVENT_PHONEBOOK_REQUEST = 0x2000, - BT_EVENT_MESSAGE_REQUEST = 0x4000, -} bt_popup_event_type_t; - -typedef enum { - BT_AGENT_ACCEPT, - BT_AGENT_REJECT, - BT_AGENT_CANCEL, - BT_CORE_AGENT_TIMEOUT, -} bt_agent_accept_type_t; - -struct bt_popup_appdata { - Evas *evas; - Evas_Object *win_main; - Evas_Object *popup; - - /* Passkey layout objects */ - Evas_Object *entry; - Evas_Object *editfield; - Evas_Object *edit_field_save_btn; - Evas_Object *ticker_noti; - - Ecore_Timer *timer; - Ecore_Event_Handler *event_handle; - - DBusGProxy *agent_proxy; - DBusGProxy *obex_proxy; - E_DBus_Connection *EDBusHandle; - DBusGConnection *conn; - - int changed_mode; - bt_popup_event_type_t event_type; -}; - -#endif /* __DEF_BT_SYSPOPUP_H_ */ diff --git a/tables/org.tizen.bt-syspopup_ChangeableColorTable.xml b/tables/org.tizen.bt-syspopup_ChangeableColorTable.xml new file mode 100644 index 0000000..6229dcf --- /dev/null +++ b/tables/org.tizen.bt-syspopup_ChangeableColorTable.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tables/org.tizen.bt-syspopup_FontInfoTable.xml b/tables/org.tizen.bt-syspopup_FontInfoTable.xml new file mode 100644 index 0000000..330fe98 --- /dev/null +++ b/tables/org.tizen.bt-syspopup_FontInfoTable.xml @@ -0,0 +1,7 @@ + + + + + + +