From b55f0272b3b8929454ad137312fcf35e7dceb3a2 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:55:57 +0900 Subject: [PATCH 1/1] Initialize Tizen 2.3 --- CMakeLists.txt | 118 ++ LICENSE.Flora | 206 +++ data/Inc.sat-ui.normal.edc | 31 + data/Inc.sat-ui.text.edc | 53 + data/image/67_SAT_button_icon_question.png | Bin 0 -> 989 bytes data/image/org.tizen.sat-ui.png | Bin 0 -> 11241 bytes data/org.tizen.sat-ui.service | 3 + data/sat-ui.edc | 34 + data/sat-ui.ini | 2 + data/sound/stk_tone_beep.wav | Bin 0 -> 1026132 bytes data/sound/stk_tone_call_busy.wav | Bin 0 -> 440950 bytes data/sound/stk_tone_call_dropped.wav | Bin 0 -> 582166 bytes data/sound/stk_tone_call_waiting.wav | Bin 0 -> 441174 bytes data/sound/stk_tone_congestion.wav | Bin 0 -> 458486 bytes data/sound/stk_tone_dial.wav | Bin 0 -> 441126 bytes data/sound/stk_tone_error.wav | Bin 0 -> 526628 bytes data/sound/stk_tone_negative_ack.wav | Bin 0 -> 882122 bytes data/sound/stk_tone_positve_ack.wav | Bin 0 -> 1026132 bytes data/sound/stk_tone_radio_ack.wav | Bin 0 -> 476276 bytes data/sound/stk_tone_ringing.wav | Bin 0 -> 441086 bytes include/common_string.h | 32 + include/display-text-view.h | 33 + include/get-inkey-view.h | 23 + include/get-input-view.h | 24 + include/sat-ui-debug.h | 104 ++ include/sat-ui-icon.h | 36 + include/sat-ui.h | 141 ++ include/select-item-view.h | 25 + include/setup-menu-view.h | 26 + include/tel-request.h | 29 + include/winset.h | 28 + org.tizen.sat-ui.manifest | 12 + org.tizen.sat-ui.rule | 24 + packaging/org.tizen.sat-ui.spec | 65 + po/CMakeLists.txt | 28 + po/ar.po | 21 + po/az.po | 21 + po/bg.po | 21 + po/ca.po | 21 + po/cs.po | 21 + po/da.po | 21 + po/de_DE.po | 21 + po/el_GR.po | 21 + po/en.po | 21 + po/en_PH.po | 21 + po/en_US.po | 21 + po/es_ES.po | 21 + po/es_MX.po | 21 + po/et.po | 21 + po/eu.po | 21 + po/fi.po | 21 + po/fr_CA.po | 21 + po/fr_FR.po | 21 + po/ga.po | 21 + po/gl.po | 21 + po/hi.po | 21 + po/hr.po | 21 + po/hu.po | 21 + po/hy.po | 21 + po/is.po | 21 + po/it_IT.po | 21 + po/ja_JP.po | 21 + po/ka.po | 21 + po/kk.po | 21 + po/ko_KR.po | 21 + po/lt.po | 21 + po/lv.po | 21 + po/mk.po | 21 + po/nb.po | 21 + po/nl_NL.po | 21 + po/pl.po | 21 + po/pt_BR.po | 21 + po/pt_PT.po | 21 + po/ro.po | 21 + po/ru_RU.po | 21 + po/sk.po | 21 + po/sl.po | 21 + po/sr.po | 21 + po/sv.po | 21 + po/tr_TR.po | 21 + po/uk.po | 21 + po/uz.po | 21 + po/zh_CN.po | 21 + po/zh_HK.po | 21 + po/zh_SG.po | 21 + po/zh_TW.po | 21 + sat-event-downloader/CMakeLists.txt | 28 + sat-event-downloader/event-list.c | 122 ++ sat-event-downloader/event-list.h | 34 + sat-event-downloader/main.c | 639 +++++++++ .../org.tizen.sat-event-downloader.service | 3 + sat-event-downloader/utils.h | 72 + src/display-text-view.c | 213 +++ src/get-inkey-view.c | 462 +++++++ src/get-input-view.c | 438 ++++++ src/sat-ui-icon.c | 477 +++++++ src/sat-ui.c | 1422 ++++++++++++++++++++ src/select-item-view.c | 243 ++++ src/setup-menu-view.c | 200 +++ src/tel-request.c | 118 ++ src/winset.c | 130 ++ 101 files changed, 6749 insertions(+) create mode 100755 CMakeLists.txt create mode 100755 LICENSE.Flora create mode 100644 data/Inc.sat-ui.normal.edc create mode 100644 data/Inc.sat-ui.text.edc create mode 100755 data/image/67_SAT_button_icon_question.png create mode 100755 data/image/org.tizen.sat-ui.png create mode 100755 data/org.tizen.sat-ui.service create mode 100644 data/sat-ui.edc create mode 100755 data/sat-ui.ini create mode 100755 data/sound/stk_tone_beep.wav create mode 100755 data/sound/stk_tone_call_busy.wav create mode 100755 data/sound/stk_tone_call_dropped.wav create mode 100755 data/sound/stk_tone_call_waiting.wav create mode 100755 data/sound/stk_tone_congestion.wav create mode 100755 data/sound/stk_tone_dial.wav create mode 100755 data/sound/stk_tone_error.wav create mode 100755 data/sound/stk_tone_negative_ack.wav create mode 100755 data/sound/stk_tone_positve_ack.wav create mode 100755 data/sound/stk_tone_radio_ack.wav create mode 100755 data/sound/stk_tone_ringing.wav create mode 100644 include/common_string.h create mode 100644 include/display-text-view.h create mode 100644 include/get-inkey-view.h create mode 100644 include/get-input-view.h create mode 100644 include/sat-ui-debug.h create mode 100644 include/sat-ui-icon.h create mode 100755 include/sat-ui.h create mode 100644 include/select-item-view.h create mode 100644 include/setup-menu-view.h create mode 100644 include/tel-request.h create mode 100644 include/winset.h create mode 100644 org.tizen.sat-ui.manifest create mode 100755 org.tizen.sat-ui.rule create mode 100755 packaging/org.tizen.sat-ui.spec create mode 100755 po/CMakeLists.txt create mode 100755 po/ar.po create mode 100755 po/az.po create mode 100755 po/bg.po create mode 100755 po/ca.po create mode 100755 po/cs.po create mode 100755 po/da.po create mode 100644 po/de_DE.po create mode 100644 po/el_GR.po create mode 100644 po/en.po create mode 100755 po/en_PH.po create mode 100755 po/en_US.po create mode 100644 po/es_ES.po create mode 100755 po/es_MX.po create mode 100755 po/et.po create mode 100755 po/eu.po create mode 100755 po/fi.po create mode 100755 po/fr_CA.po create mode 100755 po/fr_FR.po create mode 100755 po/ga.po create mode 100755 po/gl.po create mode 100755 po/hi.po create mode 100755 po/hr.po create mode 100755 po/hu.po create mode 100755 po/hy.po create mode 100755 po/is.po create mode 100755 po/it_IT.po create mode 100755 po/ja_JP.po create mode 100755 po/ka.po create mode 100755 po/kk.po create mode 100755 po/ko_KR.po create mode 100755 po/lt.po create mode 100755 po/lv.po create mode 100755 po/mk.po create mode 100755 po/nb.po create mode 100644 po/nl_NL.po create mode 100755 po/pl.po create mode 100755 po/pt_BR.po create mode 100755 po/pt_PT.po create mode 100755 po/ro.po create mode 100755 po/ru_RU.po create mode 100755 po/sk.po create mode 100755 po/sl.po create mode 100755 po/sr.po create mode 100755 po/sv.po create mode 100755 po/tr_TR.po create mode 100755 po/uk.po create mode 100755 po/uz.po create mode 100755 po/zh_CN.po create mode 100755 po/zh_HK.po create mode 100755 po/zh_SG.po create mode 100755 po/zh_TW.po create mode 100755 sat-event-downloader/CMakeLists.txt create mode 100755 sat-event-downloader/event-list.c create mode 100644 sat-event-downloader/event-list.h create mode 100755 sat-event-downloader/main.c create mode 100755 sat-event-downloader/org.tizen.sat-event-downloader.service create mode 100755 sat-event-downloader/utils.h create mode 100755 src/display-text-view.c create mode 100755 src/get-inkey-view.c create mode 100755 src/get-input-view.c create mode 100755 src/sat-ui-icon.c create mode 100755 src/sat-ui.c create mode 100755 src/select-item-view.c create mode 100755 src/setup-menu-view.c create mode 100755 src/tel-request.c create mode 100755 src/winset.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..677f8af --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,118 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(sat-ui C) + +SET(SRCS + src/sat-ui.c + src/sat-ui-icon.c + src/setup-menu-view.c + src/select-item-view.c + src/display-text-view.c + src/get-input-view.c + src/get-inkey-view.c + src/tel-request.c + src/winset.c +) + +IF("${CMAKE_BUILD_TYPE}" STREQUAL "") + SET(CMAKE_BUILD_TYPE "Release") +ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "") +MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) + +SET(PKG_NAME org.tizen.sat-ui) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(BINDIR "${PREFIX}/bin") +SET(RESDIR "${PREFIX}/res") +SET(DATADIR "${PREFIX}/data") +SET(LOCALEDIR "${RESDIR}/locale") +SET(ICONDIR "${RESDIR}/icons/default/small") +SET(EDJDIR "${RESDIR}/edje") +SET(IMGDIR "${RESDIR}/images") +SET(MEDIADIR "${RESDIR}/media") + +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED + appcore-efl + tapi + elementary + mm-sound + aul + vconf + glib-2.0 + gio-2.0 + gobject-2.0 + libprivilege-control + ecore-imf + ecore-x + evas + ecore + edje + ecore-input + eina + sysman + notification + rua +) + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) +#SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -finstrument-functions") + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") +SET(CMAKE_C_FLAGS_DEBUG "") +SET(CMAKE_C_FLAGS_RELEASE "") + +FIND_PROGRAM(UNAME NAMES uname) +EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH") +IF("${ARCH}" STREQUAL "arm") + ADD_DEFINITIONS("-DTARGET") + MESSAGE("add -DTARGET") +ENDIF("${ARCH}" STREQUAL "arm") + +ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +ADD_DEFINITIONS("-DSLP_DEBUG") +ADD_DEFINITIONS("-DLARGE_ICON") +#ADD_DEFINITIONS("-DSLP_SYSLOG_OUT") + +#SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed") + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS}) + +ADD_CUSTOM_TARGET(sat-ui.edj + COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/data/image + ${CMAKE_SOURCE_DIR}/data/sat-ui.edc ${CMAKE_BINARY_DIR}/sat-ui.edj + DEPENDS ${CMAKE_SOURCE_DIR}/data/sat-ui.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} sat-ui.edj) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR}) +INSTALL(FILES ${CMAKE_BINARY_DIR}/sat-ui.edj DESTINATION ${PREFIX}/res/edje) + +# install desktop file & icon +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +#CONFIGURE_FILE(${PROJECT_NAME}.desktop.in ${PROJECT_NAME}.desktop) +#INSTALL(FILES ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.desktop DESTINATION share/install-info/application/) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/data/sound/ DESTINATION ${MEDIADIR} FILES_MATCHING PATTERN "*.wav") +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/data/image/ DESTINATION ${IMGDIR} FILES_MATCHING PATTERN "*.png") +#INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/data/theme/ DESTINATION ${IMGDIR} FILES_MATCHING PATTERN "*.png") +INSTALL(FILES ${CMAKE_SOURCE_DIR}/data/image/${PKG_NAME}.png DESTINATION /usr/share/icons/default/small) +# In security reason, supress the dbus auto activation +INSTALL(FILES ${CMAKE_BINARY_DIR}/data/${PKG_NAME}.service DESTINATION /usr/share/dbus-1/services) + +# install application HOME directory +INSTALL(DIRECTORY DESTINATION ${DATADIR}) + +# install SMACK rule file +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PKG_NAME}.rule DESTINATION /etc/smack/accesses.d) + +# i18n +ADD_SUBDIRECTORY(po) + + #Idle_screen + ADD_SUBDIRECTORY(sat-event-downloader) + + diff --git a/LICENSE.Flora b/LICENSE.Flora new file mode 100755 index 0000000..571fe79 --- /dev/null +++ b/LICENSE.Flora @@ -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/Inc.sat-ui.normal.edc b/data/Inc.sat-ui.normal.edc new file mode 100644 index 0000000..bd30e9f --- /dev/null +++ b/data/Inc.sat-ui.normal.edc @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +group { + name: "normal_layout"; + + parts { + part { + name: "body"; + type: SWALLOW; + description { + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + } + } + } +} + diff --git a/data/Inc.sat-ui.text.edc b/data/Inc.sat-ui.text.edc new file mode 100644 index 0000000..28201c4 --- /dev/null +++ b/data/Inc.sat-ui.text.edc @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +group { + name: "group.text"; + + 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: 0 0 0 0; + } + } + + part { name: "text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + fixed: 1 1; + align: 0.5 0.5; + min: 300 30; + text { + font: "SLP:style=Roman"; + align: 0.5 0.5; + min: 0 0; + size : 32; + } + } + } + } +} + diff --git a/data/image/67_SAT_button_icon_question.png b/data/image/67_SAT_button_icon_question.png new file mode 100755 index 0000000000000000000000000000000000000000..783b1e38550bf9a9a0b897e834e3598e67e5f504 GIT binary patch literal 989 zcmV<310wv1P)cN?q-QfM%kU`$vTOkI(HM!SG&G|`1?6JtWUFp{`ouZbEF z5@mreuqYZ(32{LnHWdX*TTIKeV_L>}ed)}7JCBJAdJ?NN_TCth`TYU+lizuso0EH$ z@c$&j{RY?I8eD^G@H*}p1%Oy=po30YX~aU^1vEAVQlv;z!chVMvUV6mv7Ror@#t@T z#;Z{LFjyZ^IOpX~j-9ME#nz{X>H zvfZpEkNbz!5sJaU>xo?(@L63V2l)U;Y-H^--pY=HUo8WAY5Hs_t$YMPxlPr+1JV9v zU}E^{w`4`u-Z(n?klFXv>GAKGr-TLoa&2cCFBzTNX&{fkc37t@ZNTGaxycMw1OO!- zn_e^ke;pQ)Kw!r+8z>3$5w}%ztXA&1lQGtMAiPA#vTl;@lk(J8qr`205;sg#8B|Z~B{|qana&z{i^D|TA z@PmgHoNn{}*0eI2AIn@}nrTuv5IhXtQq?S^)47Y;tL_|05-d{0gK%K&X|r+qSayut z{7#-FTm-^_1?~7|V+u?#W8BUm!9L|w!Gtv|QAIfk{NedCN%cI^LCH(MV!KYX}U%WvZb@=2-l1D;^MbShL9YnDyQ6fbFPlf-PibV&z zj=uiN$V=}GA9>-umtUoUh^WvTWAVVr?e7lX1@<@oQoaD;!%_I6M;m~Cj%zI9Lg?@D zy!a*@rTR`;E+W`+MJ|!U4IdVS zs(dX!(MlaIX%eLH!iPaqW{wmw6dIcf&VM=T`|l5Z4X(j8xCZ|T(Eph|bA&9}00000 LNkvXXu0mjfGAhT$ literal 0 HcmV?d00001 diff --git a/data/image/org.tizen.sat-ui.png b/data/image/org.tizen.sat-ui.png new file mode 100755 index 0000000000000000000000000000000000000000..40a96238deb21841faa6fe43b69cf12b8c0cfdab GIT binary patch literal 11241 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�x zlY*2c4)@*~@V+4EJ2LwCInv5|yOmI1zmOGIr<|;{wYAn`V-Q_YaR}xlec*O)KU1O} zj0mTq*5c6PNwV&|0N+gH37J8+8l{P;Y3@>!TUTdY-7y|l`kt<9Q(JLkBgMl+EY~L5 zaAJonxcUr=3hr$lWkrRG?-5Wp;+NdVp8E6ziQVg)io_{ml}UR(T#r8?VqHg7G{rhN zI7l2f5UE@KtqTSXG4%KM4-(|zDX{(C!^QKV&C-Ij76Bv)E)~;@y{a<$>^M8WySsaE z;w$dp;DDar!vv72${%#tSY!EWetE_qu-!#--CNAcDk`8rxC{d@ncRFS-G zjk;vo=H_p*vS_eFfv#1euGK^(t=JF1Cg-_?ajehJ6iAK-|Zff_*-XP zW&t3&PDY>HSJ%`WG=h~Ua#*xef%r^0kWD#w&%KkNrxJfi1nwXPa4akmY*>QA!=qod=MTtI*rQdvfr4lJ25uc80)rC_@Sx3~Ea z)}z;8$L`0pSU(-AT3$`xkMj|xA*n}{?xP` z>^6Kyb7KQHzlFLor=-jR_CNo7%iRGYYU$?axVSVm1^GB1mz+$p-I@@m4T9q3#V=Dx zJdyVd4+P>1Xs!SJ0DlJN9zx)&NEQhc*sA>4d8Op!wD)7S(oi<-IX*tV*{4w~zt zYa=8XF2jQu)cNl0_V)JW(!520i;t6&lOTf}GD73jbLRt9>*e{!VDl3!bDx!$Fm$cc zd=2?n8t0yIi{~cimoHzasHxck=3EP-5!l1=J#{uigmjWYH_3;ux5NTK_WOxDXcUODz zJ_lEOA6bC#()^$+#!7=~(dCsD0&Ox9+=!B!lM%fKhmWoqHS#1v>b9wPhNjRnJN-q! znYLR$&{oGSt+@-2-cd{B6SdZC^v96;-rrt)Tx|C{Jv@;{VF7kFB1Yd^ytYpCD-Gxm zc6Xu0-YT0IQXCKaxGnE7%cPDYCWA@R&0GCne|F{C{FbTfd%aB(565tDbc{r*JiovL zr|;L<*$4*#|DlOoG5+7(bFY200oJEnUF(swFkqslrluN%nivL2R+HT{nO4>PP{UUCm~in* zan3doT6V|4Tod-*{!049u%>-r$2)<=r^Kny9eZ!iEM(JsjN5nLxv8=7Rh4-I1qKEN zRh$Bfui;NVh}4>AOReYTs3{@6=ot)%ddHs`0FW)>sQx=Cl#P10v%TH?xv&t@gQ_i< z1pVCBxpc~=-%jmIAI_oTN`v)pJG#+B8>sf1;?N!xF#!PqXe7<&Ukhc4Fp~D6(hF`^ zF`BPK0b0pZf--v!%FLf806FXnemfi@ZpSZ{U_W5^{TDzH<$UzYRt~c z#)gwt~w`Zl2E6$lte23Hkx;EhA;N|)GdE!T-x+2z1`@pa5giCVT{fmN5 zb>2HVbYidY*#`37ses;Vb1eORVWHJfs-{E>#STqOix-p|Nh{>~0r)jHH|NG_+K6AM z<)EOP_phA_ImS0vZBC@F%PZ_n7)Qw&GPc9MXHOLwqJ#{6K9*+X?EJ?Rc-mK?l;?y0 zUl74RzYkPY9I}in!q(SUHMo&+;7Z5ao43SKVY>-QPPrD#WsQX@r+oeK<8C(HGN`3= zxun1u0HlI1`yN>woc{A)T3nP6XbDVQ3VSkVj-#*5OM@>pGfEVy#Tx$i@2kt#odG@v z%YMcpflc)pXid<0!_do9Q^(a46B?lJN!iKXcwOq$sS0`|u-{RPiiv2g*vPBMdY0JG z9)zfv7)gv=C*~TVns|%A1wJ6y}iAEo{VuR-b+bZ zA3H2~!PecWKr=q_@5ly*H@~jNgM;LLwAORKI6dvzQBi@4f5$NQ8!rLESM6jhl;*=d zG?L1atb`opdzd*$6;@H<@Zv?wdUpthB^wsrI5r@(;!TQ)@DtBlO5-pN^%b|E_~3== zfue~+-#sy~+L0a`$pB7-gB>sDUC0Y4`v=OcYG zOmgKoq_RMIt5-*3kvXG4ZPsI`1e}q zT>zX@uXw9zx5Ck^?m&eqGN!xiQC7*jm+`M9R@E<7gYWAzx9e=-0HVsM?&n-u8im~Z zDO{k$0n8@$=4%uMC}epAa93D0XT1by%H4QKX zvmHOfrON?KC;;XK-C1Mv-H(nKAK>)y#Mc)WJ$pFm1LiIC#aSUb<+7JQE;@ZW=Jz1BmGfht!K$)1F!8Ti|tvni8?f z37BJ&W9!Ltn|9e6NA|5>ekxY2{(c^!LlL%36m%5!`Q^)(ar?2iEwfQOz|qg1kJi4I z&ycB%0KOJ`C_fzjlow_|PHqFw7?Hw;6rY7|&X#0$=HWu+r0MQ8!m$x@p?%tMkyom9 zuKVfk3(tjmH$5rox)e8T%2J$0pBj|w;eP)7Ij+fVHON>~b5g7kifH(=^zGYOI@oUG z^nC=?+H#9z;Sa^5mdTp_6ee_y6Av|niFA!bE_9cjQX>aQ=**Q13`3vqJ#Sutd-n}f zv&*2*N~~smuU*#m8F9?K)H!RKLqo7VSlQrGGLMx>j=aw3B_k|v{aIwzrJb9vo|Kgz zo7YN4zUbz8Q*S`J*GdQm@U*lvP3YybSPlv{Odxb-r+swYy_*m|j0~+$k6Aexx)ZA~yvve2$jyC@UvfKQDK1JMG&~=o6SJfg}0tg<&CKNp?A+ zEwG|(1=+C3#>OCkgeo$rGefM~@blW}leG0WtMNZ`SMOjYY(I5{0^hSrrO$j4$<+|f zogheiRIua%g&C(wnjBga4}H+DCq7e|Sl5Mw766UnEM^ zaJGBr8!j%E$X4UqWTz~6RNs{6R<2JYS>=p1HJZb;@y`jE)h_*!ocwx^nIqL({UtcF z*n!by2$6$BR0)^&)C1;_%{7#CJ-lC)qE~Q|IS)f1XY1(qW-ayf@P3 zPK3hp@d5FGzo$D8R2G114@_98hN_auV~2jVYa^0kbIE%1Z6^Ydl0xXH3E~Z%$4C+hyku@3>;fLX+~e2(!dKy@i^sCCTB+IIIJ;$(XFg zoUizS!nbn^nMGgnm}Vdd(UP@sY7)23mFUPTW~xX+yWe)Cm?{inw)ptPJT$S^+N2>s z%HNaIxC;J;oCit|6#0rbh7Zl62MnargazI)iiIe#NnzsHW2wOuH{|~Tn-dte2a0Uf z4YU9v+}EC8QgYV5JT_q}DaK|9XIXHTrv;K0%vo9hRrKb-DakG{8-4@#<+35(yMO|M z&wpOxzymhd z-^W+h6gbov7C5m}jh!>WLS$Yk3yUGZny5>9P}=|!O=FOe-sYUt2#9L!zpX2ZL+z{3 z*Oy6YCl3Lz(CzLWB0AqKB1f=^hjl0TKb?8d*~EOE6XrpWc!X}U9Z{7zd?xJ=47lhA ziqe4Q6kyA{=srGVnC?>vVg1^`*Cg14ntPuo?ib}E_!DLUd}tIBYf_-59V@g2$D0^yv*&>5Ed=dY&X;?J+i`6m^4)LJHw3b3lE9F=0_2;7z^;?WPA* z^MZr(S}XwJOiBr0OZ>SIAPgw5eQsmKgrXCh)Joizp?1u)_6GHlA6VR93T#!ha^Z+Ss6`Tk60>Dz7WaK;ri@%qW%LSqQ^@&7H@y(xLXu`w zfBiFVk%ogXeqr6~WzU)ET#eQMSQ?+u8;sK47SS9$&MUgdBM~K=}*Chk@cM`^m&(2E{Mh zM84{#MvS_P*g8a`X~PgD5)*XG*7%{~_h?8s_1bc{0)=$4q0C$I?QgZy!4w8CsBmTB zG+8sR)|sb!3$@hzONXpii?86|g7&_Ub@XyQ#%mKsh^a$G;IvKqcFkS1n(@~J(I2)= zrGA^Fn9xRMlE=k>DmUG8*Jl>W4*$rxqR=S0fz$if@cWZW|7NgDedC(ZA&j9)tPp)R zZ_e({+)0q2(JBANyF|Tqwlj18@%?)YiTugGdPm;CksqCdQ~BUa!}<5+7NHdmq-Tyy zo@Iz0wm4xAgWiDPIV&1C{<|%>+5#CW*P!f!TC@2B*Jgi`n&x(j2fPLB94zK)YzWaD z;h++Dm&hpIIBYQ;R|EL~T#SDUXygM^Ppt2pP0M_~v-*aZ_Rzn zjjTRD7GT7vtdX6bN7G<&vg5Kg;qc&NjM#eG9{%Xq;=y~qUQ+TxQBeIler&To2Ev68 zxIW0p!pT#ESmP?aP?DrdE!KN-+NZ}N>{T3Wr6KGuf{CDpqo^rKc?bwNGJ)B*XAEv4 zRtSg^RIM7m?zv7b{WJsU<0+`v6=Su+7}2R0DJf!A{PV2wb2k>Z2qY@$K;bVtK>M z3j2OV6cLiIa&vJfv>!~WW0Foti;NIpoxU6Ow0WJ9`-F83)K}ctQ?(r92CR>+Z@Y2? zf&WOrU@BT#+Qv9cUx;acPC5y)rEvL!N6?)pB%21dQ79e6z{cD{QS1_|TXV$yAO`s63q19rl6K_U+m@4>9^^L}jp4^!LBpXgKj7MyO>&Zs#lXwi|& zd`Ba8ts_-xk31_whZZ6sB@iAHJ@)1tsptV~Dth|BVzMjl5t!|Gca3@5og4B&2)$iF zQXmuu3n?Sb#DZu679hhKQm@nnqVR_`l!~w+uZsxLn_sR@zlVjPrBZCQ7BGiT{#`WQ zajWvN4(ITot*AgW`hIi-1naW{DvKOfLy~vA*H`mhHT~9gEI*GgbN@?HIpFF-s4P1~ z3b6;*&oF66tBP3t2WjtcDPY3tlyF9xlyY9JME!+qtI!+qZeMNIu$pXP%2!3a)9@G} zDMQavyh6JEGMV6v$Hj8ETsTikiHH-2z!CHzAR?+{?{*?M;1$8p^^wQ7TGLBROLE;gooO4E8GxrXF>;-AT;z)f>H9 zOyCQuECp${U>^7RiFuM7Tz^AEbq!iv5Q^5l6%@X*aGcwNfXrg=`cap}aX;x0Zy2eZ ziUc?6{_ggsamjV2Z~ds#h{M1FAgiU)GvDmC{)m3}X6x%V4jM^Hp=e(b`o;TjSwi@e z3GC*9@OVs=qLGDC2DwfabA)bMouf8xCG8~CA6qM;YF6qAx!Gn&Ra3!XyqTV|kqDCJ z&0{*kL)likl3z;`4h;@KRa4W&XDP(dk}aQcV;~f-jbg{^`Yjo;F1i_xBts;tG<|?0 z1rQ`*MKrF#YieNx9U&t{++vS4 zaOy}M+t~aucH4IHJlwpNt;36J%fp==5n!&VS@5P`rhK;C9FBXIoYZD}y+cJeV9 z_SIq^W4`=)7I<>FUx4P2A)96xa7KpquJb@cx)ZyuR}MSP5*8$9c-+nMg05Z!UGFzJ zF)}i0wyhj|oc;D~yw>ihR~xW_d&@>Dbf8ruL&C}7DIRtRXwP)_kA>6vlP`qfindw@;Z`T@lUT5124M;X zjscZjdtN?q@pyOPo3H=1!ZqsaS!Ptjefv#U^VluuGFf8byT5%Z#>Io05B$e4&cb$ieDwIRvVt9C&(|)l^V!ok?4w9CHi#w8zRD^- zPFB(k4h}w!VnmxV%~O6P6Qzi>D(LEZl&th&t8VDwwMz?KSAAs2KbOh8XLRVPnVHjm za8jg(g@ws0%u%eI#Ow8FEmo{hboEO5lNK4!&VX)dr75EYG` zDb;)=?0@FK4ZK?t#xBaGU+oBJ@*AS}xm;RW3f40>55y}bqm0GR$~GZ>lOU~6E}TOs zOs^3gifw(GfPCusD67UwKp@uYo|uL_`^bnXZklIY~!ro{vJ^fH`ip_w^VJQ9p zHdt8GNVt;jEt|Hf3_(Q%Y#$zWy#nz&Tv$KLy`YcN-aS}pQ@u)Z3%*{0q1`W5eD39K zY&L#ROiY+&WoMVt38=6MsLR@N#48D`P}v*gbb_n%SjX2d&$oB~L{6F}jySR@Dk|~{ z2!w}(ggE_2$-vMfr*Cz)^Y90@Kd}Ph|9+)15%uT#{7?q4Ew2~nO$7zl7;(PiX)MH41t~O9X3#N{d zdpbKmZ@Dr(ZM|2b_ezN`v;XLbC$wkHG)B&P_4Z=*UbD9G)34KQDO(Q-f-FHEI79eK z@ck_}^m62)>;Bdh47jVl9Y4-N9pK1U{M6(a6aqo#zwUl{0oHIIc(HO3Dt{3_*%v|J zAwgIqs1;A#djRr5_7L&^aJ#3&hr4;Tt?o$OWHGDH1_^t4m6Lcdfo!axnxU(iEjjsAN*Uitbx4YtWdD z|}yY;?_@TV;hml8*4+8q96F;)XUd14k+Qoh{v& z3y2MBa}@R!C9kGvfgf`I)zX)PLY-6EmX=+EJKiTplz`N(8|D+ORo4WCm&TNHL59QY_&~_W6N- zB>}p=e*TTj`D2^VQ@7Oftd6Mfm;C*dVZEmjX5oPqN+dE*WVQa^&kFwcn*#~h$vqZu YypSq|F%D-{14wBzP~(YemRfFnfc**p7(v9GuPv~UUTq1d+oK~tdovE@AzE8BIr(`x1=EFH#UGdcsr>xPEvvt) zIj?TAensQUO_R-$$oHZZvF~Cx$K%1OAQ{xPuHV|!+7;XvY!W;WAC7Gh+cmmlB+?Q# z-O{+E;i05z&HrF_yXjpg_a8rX^p@e*2D1l# z+V@h=*4_W?JiTM%_WaCrsx-A@^18%O_{(tpaIo#0woF@9cx3oacwk~G@p|&H)avv< zGc)Z!>0HybRnObKXY{W(*gy2v$m+2>Cw@J3{mcz>zh1aCdsXgj`8O0^QhY+`F6HHw zA68vf(_Hs(eO=?qrstZ!ZRv`98+|5rN_-)HaqwwS*1BG6ymcaYI{0z$Mm!onJa$3! zqR25V8#RB|cwxg#-D$ONS65W+U2#s?s**>Go-SCEw_`dvEHl?|QN0?Djn~+oX3*os#@>qAGDmxNSJq_FY?BTW+{__++?Q;y;Ps zB+p9yJbh*6x%SzPW4pfYKDD>B|FwZ%4IMtR!`QkLO;fcqwQ~&%&Dqi1NPa_Maq(!$ zXJwC7oK_XBd9`-m`ZpWC*K~UGy)A!eBu z`1P?rN1u;8)N)SqMosTGEU$m3cKw=jtDdP?TeeVAU%XD?2KgK0u9v-JA(#thzBje` z#2#ZOj@&l%{y<&-*}ci`Q@ipyUuwTTvod{N>dxfni7gXPh5LkgVYpbyWZMtI--P9f z#}g+ccT8=T-Zk^{_NP0_yRPak>wTi{$bslk-|+jRYsUXL`G@HTW*?e=G;4Lv>byq^ z?kT#qR^(N^Tzy>aaNRE&zG(bj^WiP$M9z*bk2S^r5#KX-Di{yqi?2v|>*v9x zL2ht*{P|cI9f%}bUTVIuDcbl%{gS%tYW`c*RJl+2nWfhj-%)s9{_k_|&Aw~lj=9@s zemC{t#B*aGk4z42K6pX@$GtoCywbJ2GpFPI%v0$nQ*S5d63Y|sg-3_gVP^4U4YaKr zUL5v^S0{duEJ%%}=F{u8pV;wo=f>U7^z7R=(f`-MtA~#sT{^zaeDb|E7I+_EdL2(z#zpWqVILm6}Lyn7lBN3C{_Guy?VJj<)*n z#PE~wm_$kP^W@8^*V1j7rjFA)zvw!&r>FOh{{07=h6hJJAA57+rK!Kpyg2vwg;%p* z%Y8Nfg~C4;-%@&7`F53KRgcu{QukK<4;pW6`lxxVB`Z1@eKU4Jyezmn_&TUutRvbw z9IOt07(5>@jqedVE_z&KX-j$YtBr>={I_n8+WV_Bm9dJw%T6k}u;{9SYx91Ub7j`$ z^Ow$EHhsM`r+{0;136G=^N}hrF*pV?v6v+H_pV;8>J3O-k-=z+!SsejnhfieOA(0G+Ho~ zHn*^+yB~T+jb7`3tJL@OPrrPAhlQeh|G2EA9ZZj^=S7Nz5nUEW?-+OrjhZ{aQw5$ z52rtz{m=YoSzqRSnfFP-J4Mfy{I=|ricPAL)z{Y6*RN_AZQQN-oR*s+*F{f`Z5aO` zeqiv|U?yl?tfaX0!{F>-Jbq;S;n)Y!uOjcY+~0ge(`>`__4BpI)jVC*UlA|gz4Y+n zlMBztKQs6A>{Az3%$+oI>eRUt*Nr_o^3hPi-~s)A>TT?~w`=RpO#9QBJJNTio=f&6 z_DsAQ9uk&?sl}5u+_q78O*kF?Cb4%ik}6F%Wp-=7s^h!PW!+!&tn3R0)($>3e8cF< z@#80dHhuW)k@H7q9iMYT-Z2G-6fG@Tzih7j-O4MgH>`c7Zs&%_8Yh}IZ&?;OFuHAQ zKK7^h4}yn+{-9;?WYx5;4Q>qTgR9~n#}=YB(V|GI`LU*DjceQ%)w{-i~7#)8R)vEbF+?-%%|xOQmJHP z^0dS^;m^b7uxqi7?zTvHM)+NLMk12zOn#dBDm|Uqw&T~G6J3||RQJ8yf8pSdh9jd{ z;{y{NQ|Xz^T-QQxc7JY9eyZ@Z;+INqFF&p_R{gJ<6Y4tZ4{7{!Q+IPkq%oQo`z&^C zyear~&=%A#*3sPB8~h>ID)?i3I<{qO-{{_v4O<49?r+?>VNG4U_JZnHDo4sAW!shP zQ?$I`(7Z!(4$eAYe%b8)(}zy37{7e<;o;8*>jzHh`*+Wt-Jf+{(y>E(btXSupIVx{ zH8Bxh8Gb(;TC5}0RvsP}z8>zA7)rdDyf<}k`h`qy`%aw?ceVDc={=&qdhn~Er$>G> zcKO74Q!8gy&Yib#VfMwj7v-N_cw+H>rQa`~s(7jDw3@=YRrPs|$2C3L{87u=$S2X& zv18*?@$-U@gObHNZ_qjwtO@oH-ixmrKR$L<^jDEHT6SpeZM>nOtp1m^UsW%uI;!IO zvOkvmz382S_w(M*c{l5=`8Q_YoPKZei}9Y(@{yf}E*^NdZ-d_Zy4UM^r{jwDgEPCO z_erfxKA&hz+!O8?&MaOZZEe}%((tixgT#A@>ysy?j!B=Jd8ECssY@!9uXk;(K9!>pQ_IL05dg_^Q~8(bpq?X}PL-$EI%^R@8r8yF<h7uOsoJFSnDVPj?<;QDAA>-n(j z#LnuDuQD&CUr2qNEJ*$=@lkkuSQmCIo~*vMb;9$*&hXO2rpei4S86!j(EihoCp(+F zAL!YxFV+9x;F-gFk8V01o2;L%nXQ{|%!=eh^O_5)i?T{GrT-|uv2xGqftu^;iW|;v ze7~unWy8p3(WY1?c1L{O;Eo^@G%VK9*xC{NE?7UfE8Z20#kPrV7AbG}wCS?O>W16u zCTk9;zP<9j^1;&5l4#L-1smqApYy$}*7^8s>-2_`+m9bSdg1UBgMIzG^{wt%(!Hkh z$c|Y1WV%03vx*pm|vPdza6hq*@<9?O0__mBC1C|p&1QR(vXC6$S)RW%#et*KwP z@rtI`n>$;^BAMt*v9sa@!DYdhLB(PnvDVSx$zW;la=bRaf9&+=8IglpBF!H*p4`w? zcUbMS)zg(*RUB1zNy#lmcNhFV@4lS7v+kU~efEy&dnX?se{D25Tr+ggz=M4`y%%@q zb*=6=v3>i@hUslm$0Q$1lq7Bow+<&3KVyY$`QcB(XTog~UnTBMUXr>XeQW0R_Oi~E zT|M2G_Qv}^AGl}e7b6FZ?KrXd)J8KK&274{MfTRYTjy_D*jijt+FADZip#3DsQFLr zQT3lTY}Is0^XitrN1l!TI`-pudwfOkR*<)NeJp9sYJDv@I`}TWbNuqyL(#`0ceI?; z9BKM{!|wIZ*Vfb=TXkQ>du3fE^F<|vRryu9<=G_*g>!{7Wm8QPn~p6Txn$_C1KIt@ z_Wq~)u&%L=C)zK`oRmH-b#wBA#72q7!#%^Cux+uD>9*~|--UIFXA-9;_ekxS-Y;`e z`#(BjUAK3~dtdE4YhcTvoRM(!{qa{OUzmPj_HXkqXZ<7RwYBcRaSF~In`DOH|SZn<4_)mgogUKLRyl0iReiB>|%*IcQKNhU z@?`U=O=XSu)K}G=Tl3GV+{&%X4=epe@nwbAs-Zgyg=+DOYom@J-`|Q&By|VVn`AOd11-le&Qc_jc zS^iw*8P)Z*Ptg7?NA`?v5*v>_9N#>+Kj;aX7f)7QYa+Nchy*vrzls&d zV$u4@Q1kOmM>h`CpI-M_%?8y!uY92VtyIuQ zzH0F8{+7OLda}B2@BCp$c6(d;t5jbyNUlt@g}(@+Vb5Y6U2RR_DdB&^6^Yv9+T^>b z57NDv4LUCEZ0|a?XTEoJ{|SSe4(E?{k9|GypQ#ULKAQV<;q&Y-b3f1jpzzh=M@la* z|4C(W^$Rrz)_qaGXXE`%-!%A$%b%l0ohuIT3lXXc%eb6VEP^C!)&m_B3j((&6z zUmWfn{QkfteQSFT?M`>z*s*teJX4)+P3@PwGcgxl8*UPgEZ%vOZ6)FI@a6DFiO$4R z$=g!5rXSDzuYKdr-*#2>JlMNu|Lnj&hwd4gSn`ayEZiv_4R@+;>ZPnQo_m{m=@=4ME3Kl=e=B&;7cK++xuczB4 zd&aZJmW&)Ybj!dueLMC()xB-kmmRmZADh`P{nOON$yXAw!~@|j;oRbT;o7$Owq3&q z!*vp`CoWGOkvceia^}wV|8?xr^+Na3-gMtx14j;RI#M<^G2T6ynNH7k%y(z?<@Dus z7JOIqZpq_izpU83YOMP1+70R-YRGHazxm3R-$i~CJu9|F{L}a$!ApyO-mSA(Nnz{z z!5P6|{HO7IVsAu0h`ii#Tk}3mJq;Js_tfrJb6?fh6~*Nnm;R{ufWkxa56xYkebB

Yl*Tmn#gTmr4x%i5V zwrv((A7&@+NgSA5FV&b{FSCF9s*c{yW4b$fuIbx)U}W&k;Ri;q8^37s?CF)W=ggm< zby3d6dFL0LUUWps&Sf>5?-)E53?$YOq-zfZ7{=ako zmHp1bn{#i>yfyXVMBCWR$dcj12OsDk>piw-ZP&S-tsR-nJLxx4UneV)CnP=(SA>mW z=i(L8+ZGR3hRN`}#Jb7hb>G~xZr{iKzaBhnc+1ho@q)?ushOF% zIh_-o6P**C6P**C6P**C6P**C6P**C6P**C6P**C6P**C6Ei1fPRyK`IWco$=ETg2 znG-W7W=_nUm^m?XV&=rmiJ22KC$@EL>)6(@tz%oqwvKHb+d8&&Z0p$8v8`iU$F`1b z9oss#b>y7LIgxWB=S0qloD(@Ga!%x&$T^X7BIiWTiJTKTCvr~YoJfe35Gx^8Lac;X z39%AlCB#aIl@Kc-Rzj?VSP8KbVkN}>|4WEn{P#M(2oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72>d???6=SIpYFE!`}^#_*8%%1-|MIKi;tI|^^1#J zm!Eb1FHUOR>#TE5S<$-PW?L-&#Gd=_owNAtyIK1zJ$R4O#YbChvBkEVZn52_TW+0| F^M7*|lE44} literal 0 HcmV?d00001 diff --git a/data/sound/stk_tone_call_busy.wav b/data/sound/stk_tone_call_busy.wav new file mode 100755 index 0000000000000000000000000000000000000000..fa72d265d0cd87d5ecda0894e3eb7346831dc09b GIT binary patch literal 440950 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 literal 0 HcmV?d00001 diff --git a/data/sound/stk_tone_call_dropped.wav b/data/sound/stk_tone_call_dropped.wav new file mode 100755 index 0000000000000000000000000000000000000000..f16aa410b0c0edc1cdf8d7240bb1e58802f36649 GIT binary patch literal 582166 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 ThU=~yJ^Z>~48MMqO8x%pRT3<9FUpmB>j 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 GQ~ZBqCjxl@ literal 0 HcmV?d00001 diff --git a/data/sound/stk_tone_error.wav b/data/sound/stk_tone_error.wav new file mode 100755 index 0000000000000000000000000000000000000000..ac48a3eeb74d6ffa384ad8d4e19d69161b77d13f GIT binary patch literal 526628 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 literal 0 HcmV?d00001 diff --git a/data/sound/stk_tone_negative_ack.wav b/data/sound/stk_tone_negative_ack.wav new file mode 100755 index 0000000000000000000000000000000000000000..b3498984a45c6b537ab5af234fb21ac2906befc2 GIT binary patch literal 882122 zcmeI*`E%80y$A3F2!Vzrkc1@(kU+?Ol5>tlWYN(AxzH&sLTQT~h1TLy=Yo`?lvb?R zB3cp4jMW*mf=g_ReBeZvdGw?a+9l*-lRb4u2Y59cq+Eg1gG zAs?jeN_p$vh8r6%?d_g?s(c1x1>)vn7XzpsQ zIKBVuo0qrT{AbdqeGd%SICS`k2S(k?|9oLr$({1WmARpu@K?jFp?8BHR}__Z6b~4` zHSa*q%fs5z`=#|s>Au@=z2)M_?%$kTeqztjpER5})L8RUJRWU|ycH>pJ{wz9-M4m5 zefY@ln_q29oL+wJ%U7PbwKRE6>dJvrGj@)sAGLPuKMLoRJ{)r;=u(!AG0xgLe{#$Tl)X1_v$-KuKn=BfzGdV%x>Ay^ycAFho;t~ z#@9wajO>Ukj>co>tM}9f4u_g{AK%?RrZawi*VX;EkM-*6*Dz>(=9Q7RNB?5nrlO3p zGl8t&YoVFpnc>$$S-~@bjIvEdzZiFW^p%n8GaCkV^*h#U|Lt8@x+C&oWNkDxKDB1lp*IijXqw&fm5u|QKfJKy+Uh&M>b<4^y1^5&HfH~P z%;18w;$>wMDjp1O3(XBr34c3uwDNa>9i_!ZY2%(9{rJfCjFLeU`xW&Xd^_c8{`r+> z^4bH(-#fCWeo^h#>fgqyqT3>$M*b50V*F<{s}Burn0U0g<$A}`uHeOj>l5zI?lb?s z&!!*A3gl$xZ75h(94ULL;s?QhhZcm(!_z~5sC+mur}Q6%Ysc1)+Bsrs#>#igC%s(vM61G=$6R2$c^Z(cpx#e?q0);WBpqv zpW55K@zRDHZ{6FK@hhGzrr@p6!f@a4#b9CO+vTs8>>L06 z{C9F!4DT3{H6W{RQc~xQ&P&;6Upw_^>ranOX?(Hn@kC>MQ0!*U(~}Y{h~0{>No=oM z*%&>xxwYxkchAnaTy^uwq-A}V4467}|L|+MALJ(&?kq`^S5>BlhV(q8=R^B~Z58v% zb4nf@-<_A4TQh9(kf+lYrp&r`|BXqPmUN#!`QeG=WB+Q%tm~cF6mN^RNB$TY6`dRV zLUltTyZ&qku+`$FO9(!#(imBCO!_{nfx z=#Aj!ikoHIi=zck<-M2_7`8tBZ}+xRp8Ik)Y~j#~$ln^NNgU(e__GJo_ZW6u_@Dg9pH zqsqrZ_lM_)cZHq_E~waCHm&%Pg2b5P+3T{J2jA*{p?AZbPp;Kp$mx2!9o`fQ2Gc91l_iQ|PfJ?I^3I|Qnb*eNncTaoe{gV1 z=Jf38V`AeHMbpaCD}upIq1oXF!mC0zD)$CjOP?;9J#NS7KaHG}`J+J_`>pBqo!bkq zt~`J6%#!x!k6$=)rG7*0!Rq&8^P}%Z_C_8eWgX8>jCrJBTJh$x1r^T(cZKGM?+-r~`l#}Ifi~qnrk=n@a=-1+Zui1X+p@vmQOHRx@ zxwmWG#nsnezx(Gtf4gsedSKX#IZx$93$_>EEZbc1MzAjQWVj$4482lW7#LmpLgBQr z>qmWS#L1y!1{S4eB;USy{c`TPmrqY>ThM&DF}uDY@rCNSu~E@KM%p87(M|E*iOjlx zH6$PV@WknpOS&gry8p(kdka&ZPMbWWW>{u!ciw~Jb4uoww^i&5p6_{jhJ;f?Rh5bI zoh8YIALL)l-9LQl&?N(w^?fp_>gJ5g-#y!OYIAG!*viK3b!!s0;svpko~QI?WKgUz z{&?cWx+#r6J@#npYp1f$c3$edVU4rKS>vp6);MdNHO@ZHKF&VQKF&VQKF&VQS*5c| zXO+$>omD!kbXMtoocD3w$9W&;eVq4k-p83aF>_+(#LS7A6Ei1fPRv!Bt29?>uF_nk zxk_`DvIDXMvIDXMvIDXM@^SKU@^SKU@^SKU@^LcYGT<`cGT<`cGT<`cdQSA5=sD4I zqUS` zdk5S*;NAiE4!C#V|MR^AJ=g2_AwYlt0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 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

Yl*Tmn#gTmr4x%i5V zwrv((A7&@+NgSA5FV&b{FSCF9s*c{yW4b$fuIbx)U}W&k;Ri;q8^37s?CF)W=ggm< zby3d6dFL0LUUWps&Sf>5?-)E53?$YOq-zfZ7{=ako zmHp1bn{#i>yfyXVMBCWR$dcj12OsDk>piw-ZP&S-tsR-nJLxx4UneV)CnP=(SA>mW z=i(L8+ZGR3hRN`}#Jb7hb>G~xZr{iKzaBhnc+1ho@q)?ushOF% zIh_-o6P**C6P**C6P**C6P**C6P**C6P**C6P**C6P**C6Ei1fPRyK`IWco$=ETg2 znG-W7W=_nUm^m?XV&=rmiJ22KC$@EL>)6(@tz%oqwvKHb+d8&&Z0p$8v8`iU$F`1b z9oss#b>y7LIgxWB=S0qloD(@Ga!%x&$T^X7BIiWTiJTKTCvr~YoJfe35Gx^8Lac;X z39%AlCB#aIl@Kc-Rzj?VSP8KbVkN}>|4WEn{P#M(2oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72>d???6=SIpYFE!`}^#_*8%%1-|MIKi;tI|^^1#J zm!Eb1FHUOR>#TE5S<$-PW?L-&#Gd=_owNAtyIK1zJ$R4O#YbChvBkEVZn52_TW+0| F^M7*|lE44} literal 0 HcmV?d00001 diff --git a/data/sound/stk_tone_radio_ack.wav b/data/sound/stk_tone_radio_ack.wav new file mode 100755 index 0000000000000000000000000000000000000000..384e7b65d846aed95c19c387f63de931cfa35258 GIT binary patch literal 476276 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 literal 0 HcmV?d00001 diff --git a/data/sound/stk_tone_ringing.wav b/data/sound/stk_tone_ringing.wav new file mode 100755 index 0000000000000000000000000000000000000000..a8dc72b2894a997b93c5ceb6996980175cffa474 GIT binary patch literal 441086 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 + +enum { + RESP_OK_CANCEL = 0, + RESP_CANCEL = 1, + RESP_IMMEDIATELY = 2, + RESP_NONE = 3, +}; + +int draw_popup_text(Evas_Object* win, char *text, int user_resp_required, int duration, Evas_Smart_Cb ok_cb, Evas_Smart_Cb cancel_cb, Evas_Smart_Cb timeout_cb,void *data); +int draw_popup_text_with_icon(Evas_Object* win, char *text,Evas_Object *icon, int user_resp_required, int duration, Evas_Smart_Cb ok_cb, Evas_Smart_Cb cancel_cb, Evas_Smart_Cb timeout_cb, void *data); + +#endif + diff --git a/include/get-inkey-view.h b/include/get-inkey-view.h new file mode 100644 index 0000000..b551baf --- /dev/null +++ b/include/get-inkey-view.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __GET_INKEY_VIEW_H_ +#define __GET_INKEY_VIEW_H_ + +int draw_content_get_inkey(Evas_Object* content, void *tapi_data, void *data); + +#endif + diff --git a/include/get-input-view.h b/include/get-input-view.h new file mode 100644 index 0000000..99e805a --- /dev/null +++ b/include/get-input-view.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __GET_INPUT_VIEW_H_ +#define __GET_INPUT_VIEW_H_ +#include + +int draw_content_get_input(Evas_Object* content, void *tapi_data, void *data); + +#endif + diff --git a/include/sat-ui-debug.h b/include/sat-ui-debug.h new file mode 100644 index 0000000..4b77d32 --- /dev/null +++ b/include/sat-ui-debug.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SATUI_DEBUG_H__ +#define __SATUI_DEBUG_H__ + +/* + * SYSLOG_INFO(), SYSLOG_ERR(), SYSLOG_DBG() are syslog() wrappers. + * PRT_INFO(), PRT_ERR(), PRT_DBG() are fprintf() wrappers. + * + * If SLP_DEBUG is not defined, SYSLOG_DBG() and PRT_DBG() is ignored. + * + * IF SLP_SYSLOG_OUT or SLP_DAEMON is defined, + * INFO(), ERR(), DBG() are SYSLOG_XXX() + * Otherwise, + * They are PRT_XXX() + * + * + * warn_if(exrp, fmt, ...) + * If expr is true, The fmt string is printed using ERR(). + * + * ret_if(), retv_if(), retm_if(), retvm_if() + * If expr is true, current function return. + * Postfix 'v' means that it has a return value and 'm' means that it has output message. + * + */ + +#define SAT_UI_LOG_TAG "SAT_UI" +#include +#include + +#if 0 +#define DBG(fmt, arg...) \ + do { \ + LOGD(""fmt"\n", ##arg); \ + } while(0) +#endif + + +#define DBG(fmt, arg...) \ + do { \ + LOG(LOG_INFO, SAT_UI_LOG_TAG, "[SAT_UI][%s:%d] "fmt"\n", __func__, __LINE__, ##arg); \ + } while(0) +/* +#define DBG(fmt, arg...) \ + do { \ + FILE *fp; \ + fp = fopen("/opt/media/sat_log.txt","a"); \ + fprintf(fp,"[SAT-UI][%s:%d]"fmt"\n",__func__,__LINE__, ##arg); \ + fclose(fp); \ + } while(0) +*/ + +#define ERR(fmt, arg...) \ + do { \ + LOGE(""fmt"\n", ##arg); \ + } while(0) + +# define warn_if(expr, fmt, arg...) do { \ + if(expr) { \ + DBG("(%s) -> "fmt, #expr, ##arg); \ + } \ + } while (0) +# define ret_if(expr) do { \ + if(expr) { \ + DBG("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ + } while (0) +# define retv_if(expr, val) do { \ + if(expr) { \ + DBG("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ + } while (0) +# define retm_if(expr, fmt, arg...) do { \ + if(expr) { \ + ERR(fmt, ##arg); \ + DBG("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ + } while (0) +# define retvm_if(expr, val, fmt, arg...) do { \ + if(expr) { \ + ERR(fmt, ##arg); \ + DBG("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ + } while (0) + +#endif /* __SATUI_DEBUG_H__ */ diff --git a/include/sat-ui-icon.h b/include/sat-ui-icon.h new file mode 100644 index 0000000..e5dea73 --- /dev/null +++ b/include/sat-ui-icon.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SAT_UI_ICON_H__ +#define __SAT_UI_ICON_H__ + +#include +#include + +#define EIGTH_BIT 0x80 +#define SEVENTH_BIT 0x40 +#define SIXTH_BIT 0x20 +#define FIFTH_BIT 0x10 +#define FOURTH_BIT 0x08 +#define THIRD_BIT 0x04 +#define SECOND_BIT 0x02 +#define FIRST_BIT 0x01 +#define MAX_STRING_SIZE 256 + +Evas_Object *convert_iconinfo_to_evas_object(void *data,TelSatIconInfo_t* icon_id); + +#endif + diff --git a/include/sat-ui.h b/include/sat-ui.h new file mode 100755 index 0000000..4d15790 --- /dev/null +++ b/include/sat-ui.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SAT_UI_H_ +#define __SAT_UI_H_ +#include +#include +#include +#include +#include +#include +#include + +#ifndef PREFIX +#define PREFIX "/usr/apps/org.tizen.sat-ui" +#endif + + +#ifdef _ +#undef _ +#endif + +#ifdef N_ +#undef N_ +#endif + +#define PKGNAME "sat-ui" +#define SAT_UI_PKG "org.tizen.sat-ui" + +#define _(string) gettext(string) +#define dgettext_noop(s) (s) +#define N_(s) dgettext_noop(s) +#define _EDJ(o) elm_layout_edje_get(o) +#define PACKAGE PKGNAME +#define LOCALEDIR PREFIX"/res/locale" + +#define ICON_PATH PREFIX"/res/images" +#define EDJ_PATH PREFIX"/res/edje" +#define EDJ_NAME EDJ_PATH"/sat-ui.edj" + +#define NORMAL_LAYOUT "normal_layout" + +#define TONE_FILE_PATH PREFIX"/res/media" +#define STK_BEEP_TONE TONE_FILE_PATH"/stk_tone_beep.wav" +#define STK_BUSY_TONE TONE_FILE_PATH"/stk_tone_call_busy.wav" +#define STK_DROPPED_TONE TONE_FILE_PATH"/stk_tone_call_dropped.wav" +#define STK_WAITING_TONE TONE_FILE_PATH"/stk_tone_call_waiting.wav" +#define STK_CONGESTION_TONE TONE_FILE_PATH"/stk_tone_congestion.wav" +#define STK_DIAL_TONE TONE_FILE_PATH"/stk_tone_dial.wav" +#define STK_ERROR_TONE TONE_FILE_PATH"/stk_tone_error.wav" +#define STK_NEG_ACK_TONE TONE_FILE_PATH"/stk_tone_negative_ack.wav" +#define STK_POS_ACK_TONE TONE_FILE_PATH"/stk_tone_positve_ack.wav" +#define STK_RADIO_ACK_TONE TONE_FILE_PATH"/stk_tone_radio_ack.wav" +#define STK_RINGING_TONE TONE_FILE_PATH"/stk_tone_ringing.wav" + +#define HELP_ICON_FILE ICON_PATH"/67_SAT_button_icon_question.png" + +#define SAT_UI_MAIN_W 720 +#define SAT_UI_MAIN_H 1280 + +#define GET_INPUT_DURATION 30.0 +#define GET_INKEY_DURATION 30.0 +#define SELECT_MENU_DURATION 30.0 + +#define LAUNCHED_BY_MENU 0 +#define LAUNCHED_BY_TELEPHONY 1 + +#define MAX_TEXT_LENGTH 255 +#define MAX_LOCAL_BUF_SIZE 10 + +typedef struct { + Evas *evas; + + Evas_Object *win_main; + Elm_Object_Item *navi_it; + Evas_Object *nf; + Evas_Object *layout_main; + Evas_Object *content; + Evas_Object *r_button; + Evas_Object *back_btn; + Evas_Object *help_btn; + Evas_Object *waiting_bar; + Evas_Object *popup; + Evas_Object *entry; + Eina_Bool repeat_sound; + char tone_file[100]; + Ecore_Timer *timer; + Ecore_IMF_Context *imf_context; + int exec_type; + + /*Handle*/ + int sound_handle; + TapiHandle *tapi_handle; + + /* Event Data */ + void *tapi_data; + int cmd_type; + int cmd_id; + int is_immediately_resp; + + /* GET INPUT */ + unsigned int min; + + /* Genlist item class*/ + Elm_Genlist_Item_Class *itc_text_icon; + Elm_Genlist_Item_Class *itc_no_edit_text; + Elm_Genlist_Item_Class *itc_editfield_icon; + Elm_Genlist_Item_Class *itc_ok_icon; + Elm_Genlist_Item_Class *itc_help_icon; + Elm_Genlist_Item_Class *itc_2icon; +} SatUiAppData_t; + +typedef struct _menu_item +{ + int index; + char *text; + Evas_Object *icon; + Eina_Bool icon_is_present; + Eina_Bool help_is_present; + SatUiAppData_t *ad; + struct _menu_item *next; +} menu_item; + +Evas_Object* load_edj(Evas_Object *parent, const char *file, const char *group); +char *strip_control_char(const char *src_str); +void create_popup_progressbar(SatUiAppData_t *ad); + +#endif /* __SAT_UI_H_ */ diff --git a/include/select-item-view.h b/include/select-item-view.h new file mode 100644 index 0000000..04409eb --- /dev/null +++ b/include/select-item-view.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SELECT_ITEM_VIEW_H_ +#define __SELECT_ITEM_VIEW_H_ + +#include +int draw_content_select_item(Evas_Object *content, void *tapi_data, void *data); + + +#endif + diff --git a/include/setup-menu-view.h b/include/setup-menu-view.h new file mode 100644 index 0000000..924e008 --- /dev/null +++ b/include/setup-menu-view.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __SETUP_MENU_VIEW_H_ +#define __SETUP_MENU_VIEW_H_ + +#include + +int draw_content_setup_menu(Evas_Object* content, void *tapi_data, void *data); + + +#endif + diff --git a/include/tel-request.h b/include/tel-request.h new file mode 100644 index 0000000..7a67f5c --- /dev/null +++ b/include/tel-request.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef _SAT_UI_TEL_REQUEST_H_ +#define _SAT_UI_TEL_REQUEST_H_ +#include "sat-ui.h" + +int setup_tapi_init(void *data); +int send_ui_user_confirm(int cmd_id, int cmd_type, int key_type, int data_len, void *data, void *app_data); +int send_app_execution_result(TelSatAppsRetInfo_t *app_ret_info, void *data); +int send_ui_display_status(int cmd_id, TelSatUiDisplayStatusType_t ui_display_status_info, void *data); +int satui_send_menu_selection_env(TapiHandle *handle, TelSatMenuSelectionReqInfo_t *menu_selection_req_info); +int send_menu_selection_info(TapiHandle *handle, char item_id, int bIsRequestingHelpText); + +#endif + diff --git a/include/winset.h b/include/winset.h new file mode 100644 index 0000000..fdad992 --- /dev/null +++ b/include/winset.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef _SAT_UI_WINSET_H_ +#define _SAT_UI_WINSET_H_ +#include + +Evas_Object *create_waiting_notify(Evas_Object *parent); +void _satui_geinlist_item_class_new(void *data); +void _satui_geinlist_item_class_free(void *data); +int _satui_create_notification(const char *string); +int _satui_delete_notification(void); + +#endif + diff --git a/org.tizen.sat-ui.manifest b/org.tizen.sat-ui.manifest new file mode 100644 index 0000000..0e88822 --- /dev/null +++ b/org.tizen.sat-ui.manifest @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/org.tizen.sat-ui.rule b/org.tizen.sat-ui.rule new file mode 100755 index 0000000..cf15d12 --- /dev/null +++ b/org.tizen.sat-ui.rule @@ -0,0 +1,24 @@ +org.tizen.sat-ui system::homedir rwxat +org.tizen.sat-ui system::vconf rwxat +org.tizen.sat-ui system::media rwxat +org.tizen.sat-ui system::share rwxat +org.tizen.sat-ui pulseaudio rwxat +org.tizen.sat-ui sys-assert::core rwxat +stest-service org.tizen.sat-ui r-x-- +org.tizen.sat-ui stest-service -w--- +org.tizen.sat-ui device::app_logging -w--- +org.tizen.app-tray org.tizen.sat-ui r-x-- +e17 org.tizen.sat-ui -w--- +org.tizen.quickpanel org.tizen.sat-ui r-x-- +org.tizen.indicator org.tizen.sat-ui rwx-- +org.tizen.lockscreen org.tizen.sat-ui r-x-- +org.tizen.sat-ui org.tizen.indicator rw--- +org.tizen.sat-ui xorg rw--- +org.tizen.sat-ui isf rwx-- +org.tizen.sat-ui ail::db rw--- +org.tizen.sat-ui sound_server rw--- +org.tizen.sat-ui dbus rwx-- +org.tizen.sat-ui system::use_internet r---- +org.tizen.sat-ui power_manager -w--- +org.tizen.sat-ui deviced -w--- +org.tizen.sat-ui notification::db rw--- diff --git a/packaging/org.tizen.sat-ui.spec b/packaging/org.tizen.sat-ui.spec new file mode 100755 index 0000000..b796c74 --- /dev/null +++ b/packaging/org.tizen.sat-ui.spec @@ -0,0 +1,65 @@ +Name: org.tizen.sat-ui +Summary: SAT-UI (Sim Application Tookit UI) +Version: 0.5.85 +Release: 1 +Group: application +License: Flora license +Source0: %{name}-%{version}.tar.gz +Requires(post): /usr/bin/vconftool +BuildRequires: pkgconfig(appcore-efl) +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(tapi) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(utilX) +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(libprivilege-control) +BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(mm-keysound) +BuildRequires: pkgconfig(ecore-input) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(edje) +BuildRequires: pkgconfig(sysman) +BuildRequires: pkgconfig(notification) +BuildRequires: pkgconfig(rua) +BuildRequires: cmake +BuildRequires: edje-tools +BuildRequires: gettext-devel + +%description +SAT-UI (Sim Application Tookit UI). + +%prep +%setup -q + +%build + +%define PREFIX "/usr/apps/%{name}" +cmake . -DCMAKE_INSTALL_PREFIX=%{PREFIX} + +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install +mkdir -p %{buildroot}/usr/share/license +cp -f LICENSE.Flora %{buildroot}/usr/share/license/%{name} + +%post +vconftool set -t string memory/sat/idle_text "" -i -f -g 6514 + +%files +%manifest %{name}.manifest +%defattr(-,root,root,-) +/usr/apps/%{name}/bin/sat-event-downloader +/usr/apps/%{name}/bin/sat-ui +/usr/apps/%{name}/res/edje/*.edj +/usr/apps/%{name}/res/images/67_SAT_button_icon_question.png +/usr/apps/%{name}/res/images/org.tizen.sat-ui.png +/usr/apps/%{name}/res/locale/*/LC_MESSAGES/sat-ui.mo +/usr/apps/%{name}/res/media/*.wav +/usr/share/dbus-1/services/org.tizen.sat-event-downloader.service +/usr/share/dbus-1/services/%{name}.service +/usr/share/icons/default/small/%{name}.png +/etc/smack/accesses.d/%{name}.rule +/usr/share/license/%{name} diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100755 index 0000000..b2f2de8 --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,28 @@ +# for i18n + +SET(POFILES ar.po az.po bg.po ca.po cs.po da.po de_DE.po el_GR.po en.po en_PH.po +en_US.po es_ES.po es_MX.po et.po eu.po fi.po fr_CA.po fr_FR.po ga.po gl.po +hi.po hr.po hu.po hy.po is.po it_IT.po ja_JP.po ka.po kk.po ko_KR.po +lt.po lv.po mk.po nb.po nl_NL.po pl.po pt_BR.po pt_PT.po ro.po ru_RU.po sk.po +sl.po sr.po sv.po tr_TR.po uk.po uz.po zh_CN.po zh_HK.po zh_SG.po zh_TW.po ) + +SET(MSGFMT "/usr/bin/msgfmt") + +FOREACH(pofile ${POFILES}) + SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile}) + MESSAGE("PO: ${pofile}") + GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE) + GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE) + SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) + ADD_CUSTOM_COMMAND( + OUTPUT ${moFile} + COMMAND ${MSGFMT} -o ${moFile} ${absPofile} + DEPENDS ${absPofile} + ) + INSTALL(FILES ${moFile} + DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo) + SET(moFiles ${moFiles} ${moFile}) +ENDFOREACH(pofile) + +MESSAGE(".mo files: ${moFiles}") +ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles}) diff --git a/po/ar.po b/po/ar.po new file mode 100755 index 0000000..2dc2b09 --- /dev/null +++ b/po/ar.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "انقر للإدخال" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "نغمة العرض" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "مكالمة غير متوفرة" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "تأكيد الاتصال" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "يرجى الانتظار ..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "بدء المتصفح؟" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "إنعاش البطاقة" + diff --git a/po/az.po b/po/az.po new file mode 100755 index 0000000..6062949 --- /dev/null +++ b/po/az.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Daxil etmək üçün vur" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Çalınma tonu" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Zəng mümkün deyil" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Zəngi təsdiq et" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Gözləyin" + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Brauzer işə salınsın?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM təzələnir..." + diff --git a/po/bg.po b/po/bg.po new file mode 100755 index 0000000..4991a3a --- /dev/null +++ b/po/bg.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Чукнете за въвеждане" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Възпроизвеждане на тон" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Повикване не е достъпно" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Потвърдете повикването" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Изчакайте..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Стартиране на браузъра?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Опресняване на SIM..." + diff --git a/po/ca.po b/po/ca.po new file mode 100755 index 0000000..6d44a83 --- /dev/null +++ b/po/ca.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Toqui per introduir" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Reproduint to" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Trucada no disponible" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirmar trucada" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Esperi..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Iniciar navegador?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Actualitzant SIM..." + diff --git a/po/cs.po b/po/cs.po new file mode 100755 index 0000000..83fc969 --- /dev/null +++ b/po/cs.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Klepněte a zadejte" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Přehrávání tónu" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Hovor není dostupný" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Potvrdit hovor" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Čekejte prosím..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Spustit prohlížeč?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Aktualizace karty SIM..." + diff --git a/po/da.po b/po/da.po new file mode 100755 index 0000000..1d57c99 --- /dev/null +++ b/po/da.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Tryk for at indtaste" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Afspiller tone..." + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Opkald er ikke tilgængelig" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Bekræft opkald" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Vent..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Vil du starte browseren?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Opdaterer SIM-kort" + diff --git a/po/de_DE.po b/po/de_DE.po new file mode 100644 index 0000000..c4ca1be --- /dev/null +++ b/po/de_DE.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Zur Eingabe tippen" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Ton wird abgespielt" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Anruf nicht verfügbar" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Anruf bestätigen" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Bitte warten..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Browser öffnen?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM-Karte wird aktualisiert..." + diff --git a/po/el_GR.po b/po/el_GR.po new file mode 100644 index 0000000..56058e4 --- /dev/null +++ b/po/el_GR.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Πατήστε για καταχώρηση" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Αναπαραγωγή ήχου" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Μη διαθέσιμη κλήση" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Επιβεβαίωση κλήσης" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Περιμένετε..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Εκκίνηση προγράμματος περιήγησης;" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Ανανέωση SIM..." + diff --git a/po/en.po b/po/en.po new file mode 100644 index 0000000..b265541 --- /dev/null +++ b/po/en.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Tap to enter" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Playing tone" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Call not available" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirm call" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Please wait..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Launch Browser?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM refreshing..." + diff --git a/po/en_PH.po b/po/en_PH.po new file mode 100755 index 0000000..167e99c --- /dev/null +++ b/po/en_PH.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Tap to enter" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Playing tone" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Call unavailable" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirm call" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Please wait..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Launch browser?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM refreshing..." + diff --git a/po/en_US.po b/po/en_US.po new file mode 100755 index 0000000..68c9c59 --- /dev/null +++ b/po/en_US.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Tap to enter" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Playing tone" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Call unavailable" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirm call" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Please wait" + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Launch Browser?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM refreshing..." + diff --git a/po/es_ES.po b/po/es_ES.po new file mode 100644 index 0000000..58da037 --- /dev/null +++ b/po/es_ES.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Toque para escribir" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Reproduciendo tono" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Llamada no disponible" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirmar llamada" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Por favor, espere..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "¿Iniciar navegador?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Actualizando SIM..." + diff --git a/po/es_MX.po b/po/es_MX.po new file mode 100755 index 0000000..45624a2 --- /dev/null +++ b/po/es_MX.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Pulse para introducir" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Reproduciendo tono..." + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Llamada no disponible" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirmar llamada" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Por favor, espere..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "¿Iniciar navegador?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Actualizando SIM..." + diff --git a/po/et.po b/po/et.po new file mode 100755 index 0000000..7a5a1c6 --- /dev/null +++ b/po/et.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Toksake sisestamiseks" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Helina esitamine" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Kõne pole saadaval" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Kinnita kõne" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Palun oodake..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Käivitada brauser?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM-kaardi värskendamine..." + diff --git a/po/eu.po b/po/eu.po new file mode 100755 index 0000000..09025db --- /dev/null +++ b/po/eu.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Ukitu sartzeko" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Doinua erreproduzitzen..." + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Deia ez dago eskuragarri" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Baieztatu deia" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Zain..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Nabigatzailea abiarazi?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM eguneratzen..." + diff --git a/po/fi.po b/po/fi.po new file mode 100755 index 0000000..613efdc --- /dev/null +++ b/po/fi.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Anna napauttamalla" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Toistetaan ääntä..." + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Puhelu ei saatavilla" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Vahvista puhelu" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Ole hyvä ja odota..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Käynnistetäänkö selain?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM-korttia päivitetään..." + diff --git a/po/fr_CA.po b/po/fr_CA.po new file mode 100755 index 0000000..9e6a0e2 --- /dev/null +++ b/po/fr_CA.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Touchez pour saisir" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Tonalité de lecture" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Appel non disponible" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirmer l'appel" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Veuillez patienter..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Lancer le navigateur ?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Actualisation carte SIM..." + diff --git a/po/fr_FR.po b/po/fr_FR.po new file mode 100755 index 0000000..aecc632 --- /dev/null +++ b/po/fr_FR.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Appuyer pour saisir" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Tonalité de lecture" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Appel impossible" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirmer l'appel" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Veuillez patienter..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Lancer le navigateur ?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Actualisation carte SIM..." + diff --git a/po/ga.po b/po/ga.po new file mode 100755 index 0000000..5956429 --- /dev/null +++ b/po/ga.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Tapáil le hiontráil" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Ton seinnte" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Níl glao ar fáil" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Deimhnigh an glao" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Fan go fóill..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Lainseáil Brabhsálaí?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM á athnuachan..." + diff --git a/po/gl.po b/po/gl.po new file mode 100755 index 0000000..69f8967 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Tocar para escribir" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Reproducindo ton" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Chamada non dispoñible" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirmar chamada" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Por favor, espere..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Iniciar navegador?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Actualizando SIM..." + diff --git a/po/hi.po b/po/hi.po new file mode 100755 index 0000000..4e7ec40 --- /dev/null +++ b/po/hi.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "दर्ज करने टैप करें" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "प्लेइंग टोन" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "कॉल अनुपलब्‍ध" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "कॉल की पुष्टि करें" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "कृपया प्रतीक्षा करें" + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "ब्राउजर शुरु करें?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "सिम रिफ्रेश हो रही है…" + diff --git a/po/hr.po b/po/hr.po new file mode 100755 index 0000000..d1ef0a3 --- /dev/null +++ b/po/hr.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Dodirnite za unos" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Ton reprodukcije" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Poziv nedostupan" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Potvrdi poziv" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Pričekajte..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Pokrenuti pretraživač?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM aktualiziranje..." + diff --git a/po/hu.po b/po/hu.po new file mode 100755 index 0000000..ad98826 --- /dev/null +++ b/po/hu.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Érintse meg a bevitelhez" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Hang lejátszása" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "A hívás nem lehetséges" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Hívás megerősítése" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Kérem, várjon..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Elindítja a böngészőt?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM frissítése..." + diff --git a/po/hy.po b/po/hy.po new file mode 100755 index 0000000..091b805 --- /dev/null +++ b/po/hy.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Թակել մուտքագրելու համար" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Վերարտադրման ձայն" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Կանչն անհասանելի է" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Հաստատել կանչը" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Սպասեք..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Գործարկե՞լ Դիտարկիչը:" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM-ի թարմացում..." + diff --git a/po/is.po b/po/is.po new file mode 100755 index 0000000..9f1a2f2 --- /dev/null +++ b/po/is.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Pikkaðu til að færa inn" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Tónn spilaður" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Það er ekki hægt að hringja" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Staðfesta símtal" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Augnablik..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Á að ræsa vafra?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM-kortið uppfærist..." + diff --git a/po/it_IT.po b/po/it_IT.po new file mode 100755 index 0000000..3d61b15 --- /dev/null +++ b/po/it_IT.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Toccare per inserire" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Riproduzione tono" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Chiamata non disponibile" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Conferma chiamata" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Attendere..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Avviare il browser?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Aggiornamento SIM..." + diff --git a/po/ja_JP.po b/po/ja_JP.po new file mode 100755 index 0000000..4100516 --- /dev/null +++ b/po/ja_JP.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "タップして入力してください。" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "再生音" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "通話​使用​不可" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "通話を確定します" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "しばらく​お待ち​ください..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "ブラウザ​を​起動​しますか?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM​を​更新中..." + diff --git a/po/ka.po b/po/ka.po new file mode 100755 index 0000000..da27ab1 --- /dev/null +++ b/po/ka.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "დააკაკუნე და ჩაწერე" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "სიგნალის ხმა" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "ზარი შეუძლებელია" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "ზარის დამოწმება" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "გთხოვთ, დაელოდოთ..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "ჩავრთო ბრაუზერი?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM-ის განახლება" + diff --git a/po/kk.po b/po/kk.po new file mode 100755 index 0000000..133a889 --- /dev/null +++ b/po/kk.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Енгізу үшін түртіңіз" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Әуенді тыңдау" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Шақыруға байланыс жоқ" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Қоңырауды растау" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Күте тұрыңыз..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Шолушыны жібересіз бе?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM-карта жаңартылуда..." + diff --git a/po/ko_KR.po b/po/ko_KR.po new file mode 100755 index 0000000..32e4100 --- /dev/null +++ b/po/ko_KR.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "입력하려면 누르세요" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "알림음 재생 중..." + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "통화할 수 없습니다" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "전화 걸기" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "잠시만 기다리세요" + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "인터넷을 실행할까요?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM을 다시 읽는 중..." + diff --git a/po/lt.po b/po/lt.po new file mode 100755 index 0000000..793cb03 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Bakstelėkite ir įveskite" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Grojamas tonas" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Skambinti negalima" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Patvirtinti skambutį" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Palaukite..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Paleisti naršyklę?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM atnaujinama" + diff --git a/po/lv.po b/po/lv.po new file mode 100755 index 0000000..6c01905 --- /dev/null +++ b/po/lv.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Pieskar., lai ievadītu" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Atskaņo signālu" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Zvans nav pieejams" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Apstiprināt zvanu" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Lūdzu, uzgaidiet..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Vai startēt pārlūku?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Atsvaidzina SIM karti..." + diff --git a/po/mk.po b/po/mk.po new file mode 100755 index 0000000..184172e --- /dev/null +++ b/po/mk.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Допрете за внесување" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Емитување тон" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Повикот е недостапен" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Потврди повик" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Ве молам почекајте..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Отвори пребарувач?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Освежување на SIM..." + diff --git a/po/nb.po b/po/nb.po new file mode 100755 index 0000000..3a007ff --- /dev/null +++ b/po/nb.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Trykk for å skrive" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Spiller tone..." + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Samtale utilgjengelig" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Bekreft samtale" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Vent litt..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Starte nettleser?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Oppdaterer SIM..." + diff --git a/po/nl_NL.po b/po/nl_NL.po new file mode 100644 index 0000000..e8bcec2 --- /dev/null +++ b/po/nl_NL.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Tik voor invoer" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Speelt beltoon af" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Oproep niet mogelijk" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Oproep bevestigen" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Even geduld..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Browser starten?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM vernieuwen..." + diff --git a/po/pl.po b/po/pl.po new file mode 100755 index 0000000..f112826 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Dotknij, aby wprowadzić" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Odtwarzanie dźwięku" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Połączenie niedostępne" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Potwierdź połączenie" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Proszę czekać..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Uruchomić przeglądarkę?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Odświeżanie karty SIM..." + diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100755 index 0000000..00c2e1d --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Toque para inserir" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Reproduzindo tom" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Chamada indisponível" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirmar a chamada" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Por favor aguarde..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Executar navegador?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Atualizando SIM..." + diff --git a/po/pt_PT.po b/po/pt_PT.po new file mode 100755 index 0000000..b13a974 --- /dev/null +++ b/po/pt_PT.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Toque para introduzir" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "A reproduzir tom" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Chamada indisponível" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirmar a chamada" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Aguarde por favor..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Iniciar o browser?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "A actualizar SIM..." + diff --git a/po/ro.po b/po/ro.po new file mode 100755 index 0000000..ce1d778 --- /dev/null +++ b/po/ro.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Atingeţi pt. a introduce" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Ton redare" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Apel nedisponibil" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Confirmaţi apelul" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Aşteptaţi..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Lansaţi browserul?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Reactualizare SIM" + diff --git a/po/ru_RU.po b/po/ru_RU.po new file mode 100755 index 0000000..2d511ec --- /dev/null +++ b/po/ru_RU.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Нажмите для ввода" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Воспроизведение мелодии" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Вызов недоступен" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Подтверждение вызова" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Подождите..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Запустить браузер?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Обновление SIM-карты..." + diff --git a/po/sk.po b/po/sk.po new file mode 100755 index 0000000..970df2a --- /dev/null +++ b/po/sk.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Ťuknutím zadajte" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Prehrávanie tónu" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Hovor nie je dostupný" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Potvrdiť hovor" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Čakajte prosím..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Spustiť prehliadač?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Aktualizácia SIM karty..." + diff --git a/po/sl.po b/po/sl.po new file mode 100755 index 0000000..17b756b --- /dev/null +++ b/po/sl.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Pritisnite za vnos" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Predvajam ton" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Klic ni na voljo" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Potrdi klic" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Prosimo počakajte..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Zaženem brskalnik?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Obnavljanje SIM" + diff --git a/po/sr.po b/po/sr.po new file mode 100755 index 0000000..b5ff3a3 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Kucni za unos" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Ton reprodukcije" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Poziv nedostupan" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Potvrdi poziv" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Sačekaj..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Pokreni pretraživač?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Osvežavanje SIM-a..." + diff --git a/po/sv.po b/po/sv.po new file mode 100755 index 0000000..516c54d --- /dev/null +++ b/po/sv.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Tryck för att ange" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Spelar upp ton" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Samtal inte tillgängligt" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Bekräfta samtal" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Var god vänta..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Starta webbläsaren?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Uppdaterar SIM..." + diff --git a/po/tr_TR.po b/po/tr_TR.po new file mode 100755 index 0000000..5c7a208 --- /dev/null +++ b/po/tr_TR.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Tamam tuşuna dokun" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Ton çalınıyor" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Arama erişilemez" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Aramayı onayla" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Lütfen bekleyin..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Tarayıcı başlatılsın mı?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM yenileniyor" + diff --git a/po/uk.po b/po/uk.po new file mode 100755 index 0000000..1ebb724 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Натисніть, щоб ввести" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Відтворення звука" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Виклик неможливий" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Підтвердити виклик" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Зачекайте..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Запустити браузер?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "Оновлення SIM..." + diff --git a/po/uz.po b/po/uz.po new file mode 100755 index 0000000..9efaab0 --- /dev/null +++ b/po/uz.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "Kiritish uchun cherting" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "Ohang o‘ynamoqda" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "Qo‘ng‘iroqdan foydalanib bo‘lmaydi" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "Qo‘ng‘iroqni tasdiqlang" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "Iltimos, kuting..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "Brauzer ishga tushirilsinmi?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM-karta yangilanmoqda..." + diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100755 index 0000000..3605594 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "点击输入" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "播放声调" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "通话不可用" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "确认呼叫" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "请稍等……" + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "启动浏览器?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM卡恢复中…" + diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100755 index 0000000..abfa10f --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "輕觸以輸入" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "播放提示音" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "通話不可用" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "確定通話" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "請稍候..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "要啟動瀏覽器嗎?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "正在重新整理 SIM 卡..." + diff --git a/po/zh_SG.po b/po/zh_SG.po new file mode 100755 index 0000000..8690ef1 --- /dev/null +++ b/po/zh_SG.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "点击输入" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "播放声调" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "无法拨电" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "确认呼叫" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "请稍候…" + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "启动浏览器?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "SIM卡恢复中…" + diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100755 index 0000000..afdb1a6 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,21 @@ +msgid "IDS_SIM_BODY_TAP_TO_ENTER_ABB" +msgstr "輕觸以輸入" + +msgid "IDS_SIM_POP_PLAYTONE" +msgstr "播放提示音" + +msgid "IDS_SIM_POP_CALL_UNAVAILABLE" +msgstr "無法通話" + +msgid "IDS_SIM_POP_CONFIRM_CALL" +msgstr "確認通話" + +msgid "IDS_SIM_POP_INTERMEDIATE" +msgstr "請稍候..." + +msgid "IDS_SIM_POP_LAUNCH_BROWSERQ" +msgstr "要啟動瀏覽器嗎?" + +msgid "IDS_SIM_POP_REFRESHING" +msgstr "正在重新整理 SIM 卡..." + diff --git a/sat-event-downloader/CMakeLists.txt b/sat-event-downloader/CMakeLists.txt new file mode 100755 index 0000000..ee72b31 --- /dev/null +++ b/sat-event-downloader/CMakeLists.txt @@ -0,0 +1,28 @@ + +PROJECT(sat-event-downloader C) +SET(SRCS + main.c + event-list.c + ) + +pkg_check_modules(pkgs REQUIRED + tapi + vconf + dlog + glib-2.0 + gio-2.0 +) + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS}) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/sat-event-downloader/org.tizen.sat-event-downloader.service DESTINATION /usr/share/dbus-1/services) + +INSTALL(TARGETS sat-event-downloader DESTINATION bin) + diff --git a/sat-event-downloader/event-list.c b/sat-event-downloader/event-list.c new file mode 100755 index 0000000..6f4054f --- /dev/null +++ b/sat-event-downloader/event-list.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include "utils.h" +#include "event-list.h" + +static GSList * event_list = NULL; + +static void event_list_data_free(EventData *list_data) +{ + ret_if(NULL == list_data->event_key); + g_free(list_data->event_key); + g_free(list_data); +} + +void event_list_clear() +{ + EventData *list_data; + int ret = 0; + GSList *list; + ret_if(NULL == event_list); + + dbg("current event list number = %d", g_slist_length(event_list)); + + list = event_list; + while(list) { + list_data = (EventData*)list->data; + if(list_data) { + dbg("remove event key data= %s", list_data->event_key); + ret = vconf_ignore_key_changed(list_data->event_key, list_data->event_cb); + retm_if(ret<0, "vconf_ignore_key_changed(%s) failed", list_data->event_key); + event_list = g_slist_remove(event_list, list_data); + event_list_data_free(list_data); + } + list = list->next; + } +} + +int event_list_count() +{ + int n; + + n = g_slist_length(event_list); + return n; +} + +int event_list_add(EventData *event_data) +{ + retv_if(NULL == event_data, -1); + retv_if(NULL == event_data->event_key, -1); + retv_if(NULL == event_data->event_cb, -1); + EventData * list_data; + GSList *list; + + dbg("Enter"); + + list = event_list; + while(list) { + list_data = (EventData*)list->data; + if(list_data) + { + if(g_strcmp0(list_data->event_key, event_data->event_key) == 0) { + dbg("Already exists in the event list: event(%s)", list_data->event_key); + return -1; + } + } + list = list->next; + } + + if(vconf_notify_key_changed(event_data->event_key, event_data->event_cb, event_data->event_key)<0){ + dbg("[%s] vconf noti regi error\n", event_data->event_key); + //return -1; + } + + event_list = g_slist_append(event_list, event_data); + + dbg("total event list number = %d", g_slist_length(event_list)); + return 0; +} + +void event_list_remove(char *event_key) +{ + EventData * list_data; + ret_if(NULL == event_list); + GSList *list; + + int ret = 0; + + list = event_list; + while(list) { + list_data = (EventData*)list->data; + if(list_data) { + if(g_strcmp0(list_data->event_key, event_key) == 0) { + dbg("removed event key data= %s , %s", list_data->event_key, event_key); + ret = vconf_ignore_key_changed(list_data->event_key, list_data->event_cb); + retm_if(ret<0, "vconf_ignore_key_changed(%s) failed", list_data->event_key); + event_list = g_slist_remove(event_list, list_data); + event_list_data_free(list_data); + break; + } + } + list = list->next; + } + dbg("total event list number = %d", g_slist_length(event_list)); +} + diff --git a/sat-event-downloader/event-list.h b/sat-event-downloader/event-list.h new file mode 100644 index 0000000..42c79f9 --- /dev/null +++ b/sat-event-downloader/event-list.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + * + */ + +#ifndef __EVENT_LIST_H_ +#define __EVENT_LIST_H_ + +#include + +typedef struct { + char *event_key; + vconf_callback_fn event_cb; +} EventData; + +int event_list_add(EventData *event_data); +void event_list_remove(char *event_key); +void event_list_clear(); +int event_list_count(); + +#endif /* __EVENT_LIST_H_ */ + diff --git a/sat-event-downloader/main.c b/sat-event-downloader/main.c new file mode 100755 index 0000000..ef00236 --- /dev/null +++ b/sat-event-downloader/main.c @@ -0,0 +1,639 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "event-list.h" + +#define INPUT_NODE_DEV_FILE_PATH "/dev/event" +#define DBUS_SERVICE_SAT_EVT_DW "org.tizen.sat-event-downloader" +#define PATH_LENGTH_MAX 20 +#define SAT_LANGAGUE_MAX 15 +#define USER_EVENT_MAX 10 + +struct event_info{ + guint source; + int fd; +}; + +typedef struct { + gpointer dbus_connection; + GMainLoop *mainloop; + gchar *path; + guint signal_id; + struct event_info info[USER_EVENT_MAX]; +} SatEvtDownloader_t; + +struct language { + const char *code; + int ival; /* for Convert from code to integer */ +}; + + +static struct language langs[SAT_LANGAGUE_MAX] = { + {"en_GB.UTF-8", SETTING_LANG_ENGLISH,}, + {"en_US.UTF-8", SETTING_LANG_ENGLISH,}, + {"de_DE.UTF-8", SETTING_LANG_GERMAN,}, + {"es_ES.UTF-8", SETTING_LANG_SPAINISH,}, + {"pt_PT.UTF-8", SETTING_LANG_PORTUGUESE,}, + {"it_IT.UTF-8", SETTING_LANG_ITALIAN,}, + {"fr_FR.UTF-8", SETTING_LANG_FRENCH,}, + {"tr_TR.UTF-8", SETTING_LANG_TURKISH,}, + {"ko_KR.UTF-8", SETTING_LANG_KOREA,}, + {"zh_CN.UTF-8", SETTING_LANG_CHINA,}, + {"zh_HK.UTF-8", SETTING_LANG_CANTONESE,}, + {"zh_TW.UTF-8", SETTING_LANG_TAIWAN,}, + {"ja_JP.UTF-8", SETTING_LANG_JAPAN,}, + {"ru_RU.UTF-8", SETTING_LANG_RUSSIAN,}, + {"el_GR.UTF-8", SETTING_LANG_GREEK,} +}; + +static SatEvtDownloader_t *sat_info; + +static int _get_language_int(const char *lang_code) +{ + int i; + int ret = -1; + char *str1, *str2; + + dbg("convert lang_code (%s) to integer.\n", lang_code); + + str1 = g_strjoinv(NULL, g_strsplit_set(lang_code, "_.-", -1)); + + for(i = 0; ieventDownloadType) + { + case TAPI_EVENT_SAT_DW_TYPE_USER_ACTIVITY:{ + gboolean user_activity = TRUE; + dbg("user activity (%d) ", user_activity); + result = g_variant_new("(b)", user_activity); + } break; + case TAPI_EVENT_SAT_DW_TYPE_IDLE_SCREEN_AVAILABLE:{ + gboolean idle_screen = pEventData->u.bIdleScreenAvailable; + dbg("idle screen available (%d)", idle_screen); + + result = g_variant_new("(b)", idle_screen); + } break; + case TAPI_EVENT_SAT_DW_TYPE_LANGUAGE_SELECTION:{ + gint selected_language; + dbg("selected language (%d)", pEventData->u.languageSelectionEventReqInfo.language); + + selected_language = pEventData->u.languageSelectionEventReqInfo.language; + result = g_variant_new("(i)", selected_language); + } break; + case TAPI_EVENT_SAT_DW_TYPE_BROWSER_TERMINATION: + case TAPI_EVENT_SAT_DW_TYPE_DATA_AVAILABLE: + case TAPI_EVENT_SAT_DW_TYPE_CHANNEL_STATUS: + default : + dbg("not support download event (%d)", pEventData->eventDownloadType); + break; + } + + return result; +} + + +static int _sat_request_download_event(const TelSatEventDownloadReqInfo_t *pEventData) +{ + GVariant *rst = NULL; + GVariant *download_data = NULL; + GVariant *inparam = NULL; + GError *error = NULL; + gint event_download_type, src_dev, dest_dev; + gint res = 0, env_resp = 0; + + dbg("Func Entrance "); + + if (!sat_info || !sat_info->dbus_connection || !pEventData){ + dbg("invalid parameter"); + return TAPI_API_INVALID_INPUT; + } + + event_download_type = pEventData->eventDownloadType; + src_dev = TAPI_SAT_DEVICE_ID_ME; + dest_dev = TAPI_SAT_DEVICE_ID_SIM; + download_data = _sat_gen_event_download_data(pEventData); + dbg("event type(%d)", event_download_type); + inparam = g_variant_new("(iiiv)", event_download_type, src_dev, dest_dev, download_data); + + rst = g_dbus_connection_call_sync(sat_info->dbus_connection, DBUS_TELEPHONY_SERVICE, + sat_info->path, DBUS_TELEPHONY_SAT_INTERFACE, "DownloadEvent", inparam, NULL, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); + + g_variant_unref(inparam); + + if (!rst) { + dbg( "error to send ui display status(%s)", error->message); + g_error_free(error); + return -1; + } + + g_variant_get(rst, "(ii)", &res, &env_resp); + dbg("result (%d)", res); + +dbg("envelope response (%d)", env_resp); + + return res; +} + +static guint sat_register_gio_watch(int fd, void *callback, char *event_key) +{ + GIOChannel *channel = NULL; + guint source; + + if (!callback) { + dbg("callback is null !!"); + return FALSE; + } + + channel = g_io_channel_unix_new(fd); + source = g_io_add_watch(channel, G_IO_IN, (GIOFunc) callback, event_key); + + return source; +} + +static void sat_allocate_watch_source(int index, const char * path, void *callback, char *event_key) +{ + int fd; + guint source; + + ret_if(NULL == sat_info); + + fd = open(path , O_RDONLY); + + if (fd < 0 ) { + dbg("fail to open file (%s)", path); + return; + } + source = sat_register_gio_watch(fd, callback, event_key); + sat_info->info[index].source = source; + sat_info->info[index].fd = fd; + dbg("allocate index[%d], path[%s], source[%d], fd[%d]", index, path, source, fd); +} + +static void sat_release_watch_source(void) +{ + int index; + + ret_if(NULL == sat_info); + + for(index=0; indexinfo[index].source, sat_info->info[index].fd); + g_source_remove(sat_info->info[index].source); + sat_info->info[index].source = 0; + if(sat_info->info[index].fd != -1) { + close(sat_info->info[index].fd); + sat_info->info[index].fd = -1; + } + } +} + +static gboolean on_recv_key_event(GIOChannel *channel, GIOCondition condition, gpointer data) +{ + TelSatEventDownloadReqInfo_t event_dw_request; + char *event_key = (char *)data; + struct input_event *input; + int ret; + int n, fd; + char buf[1024]; + + fd = g_io_channel_unix_get_fd(channel); + + n = read(fd, buf, sizeof(struct input_event)); + if(n<0){ + dbg("fail to read"); + return TRUE; + } + + input = (struct input_event *)buf; + dbg("key type (0x%x), code (%hd), fd(%d)", input->type, input->code, fd); + + if(input->type != EV_KEY && input->type != EV_ABS) { + dbg("unwanted event !!!"); + return FALSE; + } + + event_dw_request.eventDownloadType = TAPI_EVENT_SAT_DW_TYPE_USER_ACTIVITY; + ret = _sat_request_download_event(&event_dw_request); + retvm_if(ret<0, TRUE, "_sat_request_downlod_event failed"); + + /* If we got here, that means evelope command + * for user activity has been sent to CP, + * so remove all watch sources for event nodes and + * remove user activity event from the event list. + */ + sat_release_watch_source(); + event_list_remove(event_key); + + if(event_list_count() == 0) + g_main_loop_quit(sat_info->mainloop); + + g_io_channel_unref(channel); + channel = NULL; + + return FALSE; +} + +static void user_activity(char * event_key) +{ + int index; + + dbg("Enter: event_key (%s)", event_key); + + for(index=0;indexmainloop); +} + +static void sat_process_setup_event_list(GVariant* setup_event_list_info) +{ + GVariant *evt_list = NULL; + gint event_count = 0; + int is_idle_on_top = 0; + int ret = 0; + + if(!setup_event_list_info){ + dbg("setup_event_list_info is NULL."); + return; + } + + g_variant_get(setup_event_list_info, "(i@v)", &event_count, &evt_list); + + dbg("event count (%d)", event_count); + + if(event_count == 0) { + dbg("event count is zero indicating remove entire list of events in ME."); + event_list_clear(); + goto EXIT; + } + + if (evt_list) { + guchar data; + GVariantIter *iter = NULL; + GVariant *inner_gv = NULL; + + inner_gv = g_variant_get_variant(evt_list); + dbg("event list exist type_format(%s)", g_variant_get_type_string(inner_gv)); + + g_variant_get(inner_gv, "ai", &iter); + while (g_variant_iter_loop(iter, "i", &data)) { + dbg("event(%d)", data); + + if (data == TAPI_EVENT_SAT_DW_TYPE_USER_ACTIVITY) { + EventData *event_data = calloc(1, sizeof(EventData)); + char * event_key = strdup("key/dummy/user_activity"); + + event_data->event_cb = sat_event_download_cb; + event_data->event_key = event_key; + + ret = event_list_add(event_data); + if(ret<0) + { + dbg("fail to add list."); + free(event_data->event_key); + free(event_data); + } + user_activity(event_key); + } + else if (data == TAPI_EVENT_SAT_DW_TYPE_IDLE_SCREEN_AVAILABLE) { + EventData *event_data = calloc(1, sizeof(EventData)); + char * event_key = strdup(VCONFKEY_IDLE_SCREEN_TOP); + + event_data->event_cb = sat_event_download_cb; + event_data->event_key = event_key; + + ret = event_list_add(event_data); + if(ret<0) + { + dbg("fail to add list."); + free(event_data->event_key); + free(event_data); + } + + /* Check here current status of idle screen */ + if(vconf_get_int(event_key, &is_idle_on_top) < 0) + dbg("vconf_get_int(%s) failed", event_key); + + dbg("idle screen top status (%d)", is_idle_on_top); + + if(is_idle_on_top == 1) { + dbg("send evelope command immediately."); + idle_screen_available(event_key); + } + free(event_key); + } + else if (data == TAPI_EVENT_SAT_DW_TYPE_LANGUAGE_SELECTION) { + EventData *event_data = calloc(1, sizeof(EventData)); + event_data->event_cb = sat_event_download_cb; + event_data->event_key = strdup(VCONFKEY_LANGSET); + + ret = event_list_add(event_data); + if(ret<0) + { + dbg("fail to add list."); + free(event_data->event_key); + free(event_data); + } + } + } + //while end + g_variant_iter_free(iter); + g_variant_unref(inner_gv); + } + + event_count = event_list_count(); + dbg("event_list_count: %d", event_count); + +EXIT: + if(event_count == 0) + g_main_loop_quit(sat_info->mainloop); + + return; +} + +static void on_sat_signal_handler(GDBusConnection *connection, const gchar *sender_name, + const gchar *object_path, const gchar *interface_name, const gchar *signal_name, + GVariant *parameters, gpointer user_data) +{ + + if (!g_strcmp0(interface_name, DBUS_TELEPHONY_SAT_INTERFACE)) { + dbg("on_sat_signal_handler: signal_name = %s", signal_name); + //This can be implemented using hash table as well, but as the number is too small opted for if else + if (!g_strcmp0(signal_name, "SetupEventList")) { + sat_process_setup_event_list(parameters); + } + return; + } + + dbg("on_sat_signal_handler: Invalid Command"); + return; +} + +static void sat_register_event(const char* noti_id) +{ + gchar** dbus_noti = NULL; + + dbus_noti = g_strsplit((const char*) noti_id, ":", 2); + if (!dbus_noti) { + dbg("invalid noti_id"); + return; + } + + dbg("dbus signal interface(%s) signal(%s) path(%s)", dbus_noti[0], dbus_noti[1], sat_info->path); + + sat_info->signal_id = g_dbus_connection_signal_subscribe(sat_info->dbus_connection, + DBUS_TELEPHONY_SERVICE, /* Sender */ + dbus_noti[0], /* Interface */ + dbus_noti[1], /* Member */ + sat_info->path, /* Object path */ + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, on_sat_signal_handler, NULL, NULL ); + + dbg("subscribe from signal ID (%d)", sat_info->signal_id); + + g_strfreev(dbus_noti); + + return; +} + +static int sat_dbus_register() +{ + gint id = 0; + + dbg("Enter"); + + id = g_bus_own_name (G_BUS_TYPE_SYSTEM, + DBUS_SERVICE_SAT_EVT_DW, + G_BUS_NAME_OWNER_FLAGS_REPLACE, + NULL, + NULL, NULL, + NULL, + NULL); + + dbg("register dbus name id(%d)", id); + + return 0; +} + +static gboolean sat_event_downloader_init(void) +{ + GError *error = NULL; + char **modem_list = NULL; + + retv_if(NULL == sat_info, FALSE); + + modem_list = tel_get_cp_name_list(); + if(modem_list == NULL){ + dbg("getting modem list failed, Exiting App"); + return FALSE; + } + + dbg("cp name(%s)", modem_list[0]); + + sat_info->path = g_strdup_printf("%s/%s", DBUS_TELEPHONY_DEFAULT_PATH, modem_list[0]); + sat_info->dbus_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (!sat_info->dbus_connection) { + dbg("sat_event_downloader_init: Error in creating dbus_connection %s", error->message); + g_error_free(error); + return FALSE; + } + + //register SETUP "EVENT LIST" event + sat_register_event(TAPI_NOTI_SAT_SETUP_EVENT_LIST); + + return TRUE; +} + +static void sat_event_downloader_exit(void) +{ + ret_if(NULL == sat_info); + /* Unsubscribe All the signals from dbus..*/ + dbg("unsubsribe from signal ID (%d) ", sat_info->signal_id); + g_dbus_connection_signal_unsubscribe(sat_info->dbus_connection, sat_info->signal_id); + g_object_unref((gpointer) sat_info->dbus_connection); + + g_main_loop_quit(sat_info->mainloop); + sat_release_watch_source(); + g_free(sat_info->path); + g_free(sat_info); + + return; +} + +int main(int argc, char *argv[]) +{ + dbg(" Enter "); + + g_type_init(); + + sat_dbus_register(); + + + sat_info = g_new0(SatEvtDownloader_t, 1); + + if (sat_info == NULL ) { + dbg("Main: Memory Allocation for sat_info failed"); + return EXIT_FAILURE; + } + + dbg("calling g_main_loop"); + sat_info->mainloop = g_main_loop_new(NULL, FALSE); + if (!sat_info->mainloop) { + dbg("fail to create g_mail_loop for sat_info"); + g_free(sat_info); + return EXIT_FAILURE; + } + + if (!sat_event_downloader_init()) { + dbg("Init failed !!"); + sat_event_downloader_exit(); + return EXIT_FAILURE; + } + + g_main_loop_run(sat_info->mainloop); + + event_list_clear(); + sat_event_downloader_exit(); + + dbg("Exit"); + exit(1); + return EXIT_SUCCESS; +} + diff --git a/sat-event-downloader/org.tizen.sat-event-downloader.service b/sat-event-downloader/org.tizen.sat-event-downloader.service new file mode 100755 index 0000000..70d0b79 --- /dev/null +++ b/sat-event-downloader/org.tizen.sat-event-downloader.service @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.tizen.sat-event-downloader +Exec=/usr/apps/org.tizen.sat-ui/bin/sat-event-downloader diff --git a/sat-event-downloader/utils.h b/sat-event-downloader/utils.h new file mode 100755 index 0000000..017a87e --- /dev/null +++ b/sat-event-downloader/utils.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#ifndef __EVENT_DOWNLOAD_UTILS_H_ +#define __EVENT_DOWNLOAD_UTILS_H_ + +#include + +#define SAT_UI_LOG_TAG "SAT_EVT_DW" + +#define dbg(fmt,args...) { RLOG(LOG_DEBUG, SAT_UI_LOG_TAG, "<%s:%d> " fmt "\n", __func__, __LINE__, ##args); } + +#define DBG(fmt, arg...) \ + do { \ + LOG(LOG_INFO, SAT_UI_LOG_TAG, "[SAT_EVT_DW][%s:%d] "fmt"\n", __func__, __LINE__, ##arg); \ + } while(0) + +#define ERR(fmt, arg...) \ + do { \ + LOGE(""fmt"\n", ##arg); \ + } while(0) + +#define warn_if(expr, fmt, arg...) do { \ + if(expr) { \ + dbg("(%s) -> "fmt, #expr, ##arg); \ + } \ + } while (0) + +#define ret_if(expr) do { \ + if(expr) { \ + dbg("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ + } while (0) + +#define retv_if(expr, val) do { \ + if(expr) { \ + dbg("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ + } while (0) + +#define retm_if(expr, fmt, arg...) do { \ + if(expr) { \ + ERR(fmt, ##arg); \ + dbg("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ + } while (0) + +#define retvm_if(expr, val, fmt, arg...) do { \ + if(expr) { \ + ERR(fmt, ##arg); \ + dbg("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ + } while (0) + +#endif /* __EVENT_DOWNLOAD_UTILS_H_*/ \ No newline at end of file diff --git a/src/display-text-view.c b/src/display-text-view.c new file mode 100755 index 0000000..b4e3728 --- /dev/null +++ b/src/display-text-view.c @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include "stdlib.h" +#include +#include +#include +#include +#include +#include +#include "sat-ui-debug.h" +#include "display-text-view.h" +#include "sat-ui.h" +#include "tel-request.h" +#include "common_string.h" + +int draw_popup_text(Evas_Object* win, char *text, int user_resp_required, int duration, Evas_Smart_Cb ok_cb, Evas_Smart_Cb cancel_cb, Evas_Smart_Cb timeout_cb, void *data) +{ + retv_if(NULL == win, -1); + retv_if(NULL == data, -1); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + Evas_Object *popup; + char *markup_text; + + if (ad->popup) { + evas_object_del(ad->popup); + ad->popup = NULL; + } + + popup = elm_popup_add(win); + ad->popup = popup; + retv_if(NULL == popup, -1); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + if (NULL != text) { + markup_text = elm_entry_utf8_to_markup(text); + retv_if(NULL == markup_text, -1); + + DBG("description=%s",markup_text); + + elm_object_text_set(popup, markup_text); + free(markup_text); + } + + DBG("duration=%d user_resp_required=%d", duration, user_resp_required); + + if (duration > 0) { + double duration_sec = duration / 1000; + elm_popup_timeout_set(popup, (double)duration_sec); + } + + switch (user_resp_required) { + Evas_Object *btn1; + Evas_Object *btn2; + + case RESP_OK_CANCEL: + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, SAT_STR_OK); + elm_object_part_content_set(popup, "button1", btn1); + if (ok_cb) + evas_object_smart_callback_add(btn1, "clicked", ok_cb, ad); + btn2 = elm_button_add(popup); + elm_object_text_set(btn2, SAT_STR_CANCEL); + elm_object_part_content_set(popup, "button2", btn2); + if (cancel_cb) + evas_object_smart_callback_add(btn2, "clicked", cancel_cb, ad); + break; + case RESP_CANCEL: + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, SAT_STR_CANCEL); + elm_object_part_content_set(popup, "button1", btn1); + if (cancel_cb) + evas_object_smart_callback_add(btn1, "clicked", cancel_cb, ad); + break; + case RESP_IMMEDIATELY: + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, SAT_STR_OK); + elm_object_part_content_set(popup, "button1", btn1); + if (ok_cb) + evas_object_smart_callback_add(btn1, "clicked", ok_cb, ad); + break; + case RESP_NONE: + default: + break; + } + + if (timeout_cb) + evas_object_smart_callback_add(popup, "timeout", timeout_cb, ad); + + evas_object_show(popup); + + return 0; +} + + +int draw_popup_text_with_icon(Evas_Object* win, char *text,Evas_Object *icon, int user_resp_required, int duration, Evas_Smart_Cb ok_cb, Evas_Smart_Cb cancel_cb, Evas_Smart_Cb timeout_cb, void *data) +{ + retv_if(NULL == win, -1); + retv_if(NULL == data, -1); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + Evas_Object *popup; + Evas_Object *box; + char *markup_text; + + if (ad->popup) + evas_object_del(ad->popup); + + popup = elm_popup_add(win); + ad->popup = popup; + retv_if(NULL == popup, -1); + evas_object_show(popup); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + +/* If you would like to test the icon with a example image, uncomment below codes */ +/* + char buffer[100]; + icon = elm_icon_add(popup); + memset(buffer, 0, 100); + sprintf(buffer, "%s/01_navi_icon_new.png", "/opt/ug/res/images/ug-setting-call-efl"); //Test Icon + DBG("elm_icon_file_set return =%d",elm_icon_file_set(icon, buffer, NULL)); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(icon, 30, 30); +*/ + box = elm_box_add(popup); + evas_object_show(box); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + //evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_content_set(popup, box); + + if (icon) { + evas_object_show(icon); + elm_box_pack_end(box, icon); + } + if (NULL != text) { + markup_text = elm_entry_utf8_to_markup(text); + retv_if(NULL == markup_text, -1); + + DBG("description=%s", markup_text); + + Evas_Object *en = elm_entry_add(popup); + elm_entry_entry_set(en, markup_text); + elm_entry_single_line_set(en, EINA_TRUE); + elm_entry_editable_set(en, EINA_FALSE); + elm_entry_cursor_end_set(en); + elm_box_pack_end(box, en); + evas_object_show(en); + free(markup_text); + } + + DBG("duration=%d user_resp_required=%d",duration, user_resp_required); + + if (duration > 0) { + double duration_sec = duration / 1000; + elm_popup_timeout_set(popup, (double)duration_sec); + } + + switch (user_resp_required) { + Evas_Object *btn1; + Evas_Object *btn2; + + case RESP_OK_CANCEL: + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, SAT_STR_OK); + elm_object_part_content_set(popup, "button1", btn1); + if (ok_cb) + evas_object_smart_callback_add(btn1, "clicked", ok_cb, ad); + btn2 = elm_button_add(popup); + elm_object_text_set(btn2, SAT_STR_CANCEL); + elm_object_part_content_set(popup, "button2", btn2); + if (cancel_cb) + evas_object_smart_callback_add(btn1, "clicked", cancel_cb, ad); + break; + case RESP_CANCEL: + btn1 = elm_button_add(popup); + elm_object_text_set(btn1, SAT_STR_CANCEL); + elm_object_part_content_set(popup, "button1", btn1); + if (cancel_cb) + evas_object_smart_callback_add(btn1, "clicked", cancel_cb, ad); + break; + case RESP_NONE: + default: + break; + } + + if (timeout_cb) + evas_object_smart_callback_add(popup, "timeout", timeout_cb, ad); + + evas_object_show(popup); + + return 0; +} + + +// End of a file + + diff --git a/src/get-inkey-view.c b/src/get-inkey-view.c new file mode 100755 index 0000000..7bcbaa2 --- /dev/null +++ b/src/get-inkey-view.c @@ -0,0 +1,462 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include "stdlib.h" +#include +#include +#include +#include +#include +#include +#include "sat-ui-debug.h" +#include "get-inkey-view.h" +#include "sat-ui.h" +#include "setup-menu-view.h" +#include "sat-ui-icon.h" +#include "tel-request.h" +#include "winset.h" +#include "common_string.h" +#include + + +static Elm_Entry_Filter_Accept_Set digits_filter_data; +static Elm_Entry_Filter_Limit_Size limit_filter_data; +static TelSatGetInkeyInd_t get_inkey_info; + +Evas_Object * _create_conformant( Evas_Object *parent , SatUiAppData_t *ad); + +/* This callback is for showing(hiding) X marked button. */ +static void _changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (elm_object_focus_get(data)) { + if (elm_entry_is_empty(obj)) + elm_object_signal_emit(data, "elm,state,eraser,hide", "elm"); + else + elm_object_signal_emit(data, "elm,state,eraser,show", "elm"); + } +} + +/* Focused callback will show X marked button and hide guidetext. */ +static void _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"); +} + +/* Unfocused callback will show guidetext and hide X marked button. */ +static void _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"); +} + +/* When X marked button clicked, make string as empty. */ +static void _eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + elm_entry_entry_set(data, ""); +} + +static void on_clicked_ok_btn(void *data, Evas_Object *obj, void *event_info) +{ + char *entry_string = NULL; + SatUiAppData_t *ad = (SatUiAppData_t *)data; + Evas_Object *waiting_bar; + + if (ad->timer) + ecore_timer_del(ad->timer); + ad->timer= NULL; + + ret_if(NULL == ad->entry); + + entry_string = (char *)elm_entry_entry_get(ad->entry); + + ret_if(NULL == entry_string); + ret_if(0 == strlen(entry_string)); + + DBG(" %s", entry_string); + + if (ad->entry) { + elm_object_focus_set(ad->entry, EINA_FALSE); + elm_object_focus_allow_set(ad->entry, EINA_FALSE); + } + + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY,TAPI_SAT_USER_CONFIRM_YES, sizeof(unsigned char),(unsigned char*)entry_string, ad); + waiting_bar = create_waiting_notify(ad->content); + ad->waiting_bar = waiting_bar; + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } +} + +static void on_clicked_yes_btn(void *data, Evas_Object *obj, void *event_info) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + Evas_Object *waiting_bar; + + if (ad->timer) + ecore_timer_del(ad->timer); + + ad->timer = NULL; + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_YES, 0, NULL, ad); + waiting_bar = create_waiting_notify(ad->content); + ad->waiting_bar = waiting_bar; + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } +} + +static void on_clicked_no_btn(void *data, Evas_Object *obj, void *event_info) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + Evas_Object *waiting_bar; + + if (ad->timer) + ecore_timer_del(ad->timer); + ad->timer = NULL; + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_NO_OR_CANCEL, 0, NULL, ad); + + waiting_bar = create_waiting_notify(ad->content); + ad->waiting_bar = waiting_bar; + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } +} + +static void on_clicked_back_btn( void *data, Evas_Object* obj, void* event_info ) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + if (ad->timer) + ecore_timer_del(ad->timer); + ad->timer = NULL; + + if (ad->entry) { + elm_object_focus_set(ad->entry, EINA_FALSE); + elm_object_focus_allow_set(ad->entry, EINA_FALSE); + } + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_NO_OR_CANCEL, 0, NULL, ad); +} + +static Eina_Bool on_timer_expired(void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + if (NULL == ad->timer) { + DBG("Cancel timout w/o user_confirm"); + } else { + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_TIMEOUT, 0, NULL, ad); + ad->timer = NULL; + } + return ECORE_CALLBACK_CANCEL; +} + +static void on_clicked_help_button(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *waiting_bar; + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + if (ad->timer) + ecore_timer_del(ad->timer); + ad->timer = NULL; + + if (ad->entry) { + elm_object_focus_set(ad->entry, EINA_FALSE); + elm_object_focus_allow_set(ad->entry, EINA_FALSE); + } + + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_HELP_INFO, 0, NULL, ad); + + waiting_bar = create_waiting_notify(ad->content); + ad->waiting_bar = waiting_bar; + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } +} + +void _inkey_panel_event_callback(void *data, Ecore_IMF_Context *imf_context, int value) +{ + int x, y, w, h; + if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) { + // ISE state has changed to ISE_STATE_SHOW status + // Get ISE position of current active ISE + ecore_imf_context_input_panel_geometry_get(imf_context, &x, &y, &w, &h); + printf("keypad is shown\n"); + printf("The coordination of inkey panel. x : %d, y : %d, w : %d, h : %d\n", x, y, w, h); + } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) { + // ISE state has changed to ISE_STATE_HIDE status + printf("keypad is hided\n"); + } +} + +static Evas_Object *_gl_ok_button_content_get(void *data, Evas_Object *obj, const char *part) +{ + retv_if(NULL == data, NULL); + + if (!strcmp(part, "elm.slide.swallow.1")) { + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + ad->r_button = elm_button_add(obj); + elm_object_text_set(ad->r_button, SAT_STR_OK); + evas_object_show(ad->r_button); + evas_object_smart_callback_add(ad->r_button, "clicked", on_clicked_ok_btn, ad); + + return ad->r_button; + } + return NULL; +} + +static Evas_Object *_gl_help_button_content_get(void *data, Evas_Object *obj, const char *part) +{ + retv_if(NULL == data, NULL); + + if (!strcmp(part, "elm.slide.swallow.1")) { + Evas_Object *help_btn = NULL; + Evas_Object *help_icon = NULL; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + help_btn = elm_button_add(obj); + + retv_if(NULL == help_btn, NULL); + + ad->help_btn = help_btn; + + help_icon = elm_icon_add(help_btn); + elm_image_file_set(help_icon, HELP_ICON_FILE, NULL); + evas_object_size_hint_weight_set(help_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(help_icon, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_content_set(help_btn, "icon", help_icon); + evas_object_show(help_btn); + evas_object_smart_callback_add(help_btn, "clicked", on_clicked_help_button, ad); + + return help_btn; + } + return NULL; +} + +static Evas_Object *_gl_yes_no_button_content_get(void *data, Evas_Object *obj, const char *part) +{ + Evas_Object *yes_no_btn = NULL; + + retv_if(NULL == data, NULL); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + if (!strcmp(part, "elm.slide.swallow.1")) { + yes_no_btn = elm_button_add(obj); + evas_object_show(yes_no_btn); + elm_object_text_set(yes_no_btn, SAT_STR_YES); + evas_object_smart_callback_add(yes_no_btn, "clicked", on_clicked_yes_btn, ad); + } else if (!strcmp(part, "elm.slide.swallow.2")) { + yes_no_btn = elm_button_add(obj); + evas_object_show(yes_no_btn); + elm_object_text_set(yes_no_btn, SAT_STR_NO); + evas_object_smart_callback_add(yes_no_btn, "clicked", on_clicked_no_btn, ad); + } + + return yes_no_btn; +} + +static Evas_Object *_gl_text_content_get(void *data, Evas_Object *obj, const char *part) +{ + retv_if(NULL == data, NULL); + + if (!strcmp(part, "elm.icon")) { + Evas_Object *layout = NULL; + Evas_Object *en = NULL; + char *info = NULL; + + TelSatGetInkeyInd_t *get_inkey_data = (TelSatGetInkeyInd_t *)data; + + layout = elm_layout_add(obj); + elm_layout_theme_set(layout, "layout", "editfield", "default"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + en = elm_entry_add(obj); + elm_object_part_content_set(layout, "elm.swallow.content", en); + elm_object_signal_emit(layout, "elm,state,eraser,hide", "elm"); + + if (get_inkey_data->text.stringLen >0) { + DBG("string=%s",(char *)get_inkey_data->text.string); + info = elm_entry_utf8_to_markup((char *)get_inkey_data->text.string); + elm_entry_entry_set(en, info); + free(info); + elm_entry_single_line_set(en, EINA_FALSE); + elm_entry_editable_set(en, EINA_FALSE); + } + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + return layout; + } + return NULL; +} + +static Evas_Object *_gl_editfield_content_get(void *data, Evas_Object *obj, const char *part) +{ + retv_if(NULL == data, NULL); + + if (!strcmp(part, "elm.icon")) { + Evas_Object *layout = NULL; + Evas_Object *en = NULL; + Ecore_IMF_Input_Panel_Layout imf_layout; + + TelSatGetInkeyInd_t *get_inkey_data = (TelSatGetInkeyInd_t *)data; + + SatUiAppData_t *ad; + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + + + layout = elm_layout_add(obj); + elm_layout_theme_set(layout, "layout", "editfield", "default"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + en = elm_entry_add(obj); + evas_object_smart_callback_add(en, "changed", _changed_cb, layout); + evas_object_smart_callback_add(en, "focused", _focused_cb, layout); + evas_object_smart_callback_add(en, "unfocused", _unfocused_cb, layout); + + elm_object_part_content_set(layout, "elm.swallow.content", en); + elm_object_part_text_set(layout, "elm.guidetext", _(SAT_STR_TAP_TO_ENTER)); + elm_object_signal_callback_add(layout, "elm,eraser,clicked", "elm", _eraser_clicked_cb, en); + + retv_if(NULL == en, NULL); + ad->entry = en; + elm_entry_cursor_end_set(en); + + Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(en); + ad->imf_context = imf_context; + ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _inkey_panel_event_callback, NULL); + + if (get_inkey_data->bIsNumeric == EINA_TRUE) { + imf_layout = ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBER; + digits_filter_data.accepted = "0123456789*#+"; + digits_filter_data.rejected = NULL; + elm_entry_markup_filter_append(en, elm_entry_filter_accept_set, &digits_filter_data); + } else { + imf_layout = ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL; + } + + limit_filter_data.max_char_count = 0; + limit_filter_data.max_byte_count = 1; + elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data); + elm_entry_input_panel_enabled_set(en, EINA_TRUE); + elm_entry_input_panel_layout_set(ad->entry, imf_layout); + + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_signal_emit(layout, "clicked", "elm"); + + return layout; + } + + return NULL; +} + +static void __sat_ui_gl_sel_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (event_info) + elm_genlist_item_selected_set(event_info, EINA_FALSE); +} + +int draw_content_get_inkey(Evas_Object* content, void *tapi_data, void *data) +{ + retv_if(NULL == content, -1); + retv_if(NULL == tapi_data, -1); + retv_if(NULL == data, -1); + + Evas_Object *genlist = NULL; + Evas_Object *image = NULL; + Evas_Object *l_button = NULL; + Elm_Object_Item *item = NULL; + + memcpy(&(get_inkey_info), tapi_data, sizeof(TelSatGetInkeyInd_t)); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + ad->entry = NULL; + + l_button = elm_button_add(ad->nf); + elm_object_style_set(l_button, "naviframe/end_btn/default"); + evas_object_smart_callback_add(l_button, "clicked", on_clicked_back_btn, ad); + elm_object_item_part_content_set(ad->navi_it, "prev_btn", l_button); + ad->back_btn = l_button; + + /* Icon */ + if (get_inkey_info.iconId.bIsPresent == EINA_TRUE) { + image = convert_iconinfo_to_evas_object((void *)ad, &get_inkey_info.iconId.iconInfo); + + if (get_inkey_info.iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + elm_object_item_text_set(ad->navi_it, " "); + } + evas_object_size_hint_align_set(image, 0,0); + evas_object_show(image); + } + + ad->itc_no_edit_text->item_style = "dialogue/1icon"; + ad->itc_no_edit_text->func.content_get = _gl_text_content_get; + + ad->itc_editfield_icon->item_style = "1icon"; + ad->itc_editfield_icon->func.content_get = _gl_editfield_content_get; + + ad->itc_ok_icon->item_style = "mode/slide"; + ad->itc_ok_icon->func.content_get = _gl_ok_button_content_get; + + ad->itc_help_icon->item_style = "mode/slide"; + ad->itc_help_icon->func.content_get = _gl_help_button_content_get; + + ad->itc_2icon->item_style = "mode/slide2"; + ad->itc_2icon->func.content_get = _gl_yes_no_button_content_get; + + genlist = elm_genlist_add(content); + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); + evas_object_data_set(genlist, "app_data", (void *)ad); + + item = elm_genlist_item_append(genlist, ad->itc_no_edit_text, &(get_inkey_info), NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + + if (get_inkey_info.keyType == TAPI_SAT_INKEY_TYPE_YES_NO_REQUESTED) { + + elm_genlist_item_append(genlist, ad->itc_2icon, (void *)ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } else { + elm_genlist_item_append(genlist, ad->itc_editfield_icon, &(get_inkey_info), NULL, ELM_GENLIST_ITEM_NONE, __sat_ui_gl_sel_cb, NULL); + + elm_genlist_item_append(genlist, ad->itc_ok_icon, (void *)ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + + if (get_inkey_info.bIsHelpInfoAvailable == EINA_TRUE) { + elm_genlist_item_append(genlist, ad->itc_help_icon, (void *)ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + + elm_object_part_content_set(content, "body", genlist); + + DBG("duration=%d", get_inkey_info.duration); + + if (get_inkey_info.duration > 0) + ad->timer = ecore_timer_add((double)get_inkey_info.duration/1000.0f, on_timer_expired, ad); + else + ad->timer = ecore_timer_add(GET_INKEY_DURATION, on_timer_expired, ad); + + DBG("Leave"); + + return 0; +} + diff --git a/src/get-input-view.c b/src/get-input-view.c new file mode 100755 index 0000000..5095b3f --- /dev/null +++ b/src/get-input-view.c @@ -0,0 +1,438 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include "stdlib.h" +#include +#include +#include +#include +#include +#include +#include "sat-ui-debug.h" +#include "get-input-view.h" +#include "sat-ui.h" +#include "setup-menu-view.h" +#include "sat-ui-icon.h" +#include "tel-request.h" +#include "winset.h" +#include "common_string.h" +#include + +static Elm_Entry_Filter_Accept_Set digits_filter_data; +static Elm_Entry_Filter_Limit_Size limit_filter_data; +static TelSatGetInputInd_t get_input_info; + +/* This callback is for showing(hiding) X marked button. */ +static void _changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (elm_object_focus_get(data)) { + if (elm_entry_is_empty(obj)) + elm_object_signal_emit(data, "elm,state,eraser,hide", "elm"); + else + elm_object_signal_emit(data, "elm,state,eraser,show", "elm"); + } +} + +/* Focused callback will show X marked button and hide guidetext. */ +static void _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"); +} + +/* Unfocused callback will show guidetext and hide X marked button. */ +static void _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"); +} + +/* When X marked button clicked, make string as empty. */ +static void _eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + elm_entry_entry_set(data, ""); +} + +static void on_clicked_ok_btn(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *waiting_bar; + char *entry_string = NULL; + unsigned int string_len = 0; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + if (ad->timer) + ecore_timer_del(ad->timer); + ad->timer = NULL; + + ret_if(NULL == ad->entry); + + entry_string = (char *)elm_entry_entry_get(ad->entry); + + ret_if(NULL == entry_string); + + string_len = strlen(entry_string); + + if (string_len == 0) { + if (ad->min > 0) { + DBG("Minimum entry length is %d",ad->min); + return; // Need to wait the user input + } else { + DBG("Entry Length is zero"); + } + } else { + DBG("Entry string is %s", entry_string); + } + + if (ad->entry) { + elm_object_focus_set(ad->entry, EINA_FALSE); + elm_object_focus_allow_set(ad->entry, EINA_FALSE); + } + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INPUT, TAPI_SAT_USER_CONFIRM_YES, string_len,(unsigned char*)entry_string, ad); + + waiting_bar = create_waiting_notify(ad->content); + ad->waiting_bar = waiting_bar; + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } +} + +static void on_clicked_back_btn( void *data, Evas_Object* obj, void* event_info ) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + if (ad->timer) + ecore_timer_del(ad->timer); + ad->timer = NULL; + if (ad->entry) { + elm_object_focus_set(ad->entry, EINA_FALSE); + elm_object_focus_allow_set(ad->entry, EINA_FALSE); + } + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INPUT, TAPI_SAT_USER_CONFIRM_NO_OR_CANCEL, 0, NULL, ad); + DBG("Leave"); +} + +static Eina_Bool on_expired_input_timer(void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + if (NULL == ad->timer) { + DBG("Cancel timout w/o user_confirm"); + } else { + if (ad->entry) { + elm_object_focus_set(ad->entry, EINA_FALSE); + elm_object_focus_allow_set(ad->entry, EINA_FALSE); + } + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INPUT, TAPI_SAT_USER_CONFIRM_TIMEOUT, 0, NULL, ad); + ad->timer = NULL; + } + DBG("Leave"); + return ECORE_CALLBACK_CANCEL; +} + +static void on_clicked_help_button(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *waiting_bar; + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + if (ad->timer) + ecore_timer_del(ad->timer); + ad->timer = NULL; + + if (ad->entry) { + elm_object_focus_set(ad->entry, EINA_FALSE); + elm_object_focus_allow_set(ad->entry, EINA_FALSE); + } + + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INPUT, TAPI_SAT_USER_CONFIRM_HELP_INFO, 0, NULL, ad); + + waiting_bar = create_waiting_notify(ad->content); + ad->waiting_bar = waiting_bar; + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } +} + +void _input_panel_event_callback(void *data, Ecore_IMF_Context *imf_context, int value) +{ + int x, y, w, h; + if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) { + // ISE state has changed to ISE_STATE_SHOW status + // Get ISE position of current active ISE + ecore_imf_context_input_panel_geometry_get(imf_context, &x, &y, &w, &h); + printf("keypad is shown\n"); + printf("The coordination of input panel. x : %d, y : %d, w : %d, h : %d\n", x, y, w, h); + } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) { + // ISE state has changed to ISE_STATE_HIDE status + printf("keypad is hided\n"); + } +} + +Evas_Object * _create_conformant( Evas_Object *parent , SatUiAppData_t *ad) +{ + Evas_Object *conform ; + + elm_win_conformant_set(ad->win_main, EINA_TRUE); + conform = elm_conformant_add(parent); + + retv_if(NULL == conform, NULL); + + elm_object_style_set(conform, "internal_layout"); + evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(conform); + + return conform; +} + +static Evas_Object *_gl_ok_button_content_get(void *data, Evas_Object *obj, const char *part) +{ + retv_if(NULL == data, NULL); + + if (!strcmp(part, "elm.slide.swallow.1")) { + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + ad->r_button = elm_button_add(obj); + elm_object_text_set(ad->r_button, SAT_STR_OK); + evas_object_show(ad->r_button); + evas_object_smart_callback_add(ad->r_button, "clicked", on_clicked_ok_btn, ad); + + return ad->r_button; + } + return NULL; +} + +static Evas_Object *_gl_help_button_content_get(void *data, Evas_Object *obj, const char *part) +{ + retv_if(NULL == data, NULL); + + if (!strcmp(part, "elm.slide.swallow.1")) { + Evas_Object *help_btn; + Evas_Object *help_icon; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + help_btn = elm_button_add(obj); + + retv_if(NULL == help_btn, NULL); + + ad->help_btn = help_btn; + help_icon = elm_icon_add(help_btn); + elm_image_file_set(help_icon, HELP_ICON_FILE, NULL); + evas_object_size_hint_weight_set(help_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(help_icon, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_content_set(help_btn, "icon", help_icon); + evas_object_show(help_btn); + evas_object_smart_callback_add(help_btn, "clicked", on_clicked_help_button, ad); + + return help_btn; + } + return NULL; +} + +static Evas_Object *_gl_text_content_get(void *data, Evas_Object *obj, const char *part) +{ + retv_if(NULL == data, NULL); + + if (!strcmp(part, "elm.icon")) { + Evas_Object *layout = NULL; + Evas_Object *en = NULL; + char *info = NULL; + char buf[TAPI_SAT_DEF_TEXT_STRING_LEN_MAX]; + + TelSatGetInputInd_t *get_input_data = (TelSatGetInputInd_t *)data; + + SatUiAppData_t *ad; + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + + layout = elm_layout_add(obj); + elm_layout_theme_set(layout, "layout", "editfield", "default"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + en = elm_entry_add(obj); + elm_object_part_content_set(layout, "elm.swallow.content", en); + elm_object_signal_emit(layout, "elm,state,eraser,hide", "elm"); + + if (get_input_data->text.stringLen > 0) { + DBG("string=%s",(char *)get_input_data->text.string); + info = elm_entry_utf8_to_markup((char *)get_input_data->text.string); + retv_if(NULL == info, NULL); + snprintf(buf, sizeof(buf), "%s", info); + DBG("buf=%s",buf); + if (get_input_data->respLen.max >0) { + snprintf(buf, sizeof(buf), "%s %d-%d", info, get_input_data->respLen.min, get_input_data->respLen.max); + } + ad->min = get_input_data->respLen.min; + elm_entry_entry_set(en, buf); + elm_entry_single_line_set(en, EINA_FALSE); + elm_entry_editable_set(en, EINA_FALSE); + free(info); + } + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + return layout; + } + return NULL; +} + + +static Evas_Object *_gl_editfield_content_get(void *data, Evas_Object *obj, const char *part) +{ + retv_if(NULL == data, NULL); + + if (!strcmp(part, "elm.icon")) { + Evas_Object *layout = NULL; + Evas_Object *en = NULL; + Ecore_IMF_Input_Panel_Layout imf_layout; + + TelSatGetInputInd_t *get_input_data = (TelSatGetInputInd_t *)data; + + SatUiAppData_t *ad; + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + + layout = elm_layout_add(obj); + elm_layout_theme_set(layout, "layout", "editfield", "default"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + en = elm_entry_add(obj); + retv_if(NULL == en, NULL); + + ad->entry = en; + + evas_object_smart_callback_add(ad->entry, "changed", _changed_cb, layout); + evas_object_smart_callback_add(ad->entry, "focused", _focused_cb, layout); + evas_object_smart_callback_add(ad->entry, "unfocused", _unfocused_cb, layout); + + elm_object_part_content_set(layout, "elm.swallow.content", ad->entry); + elm_object_part_text_set(layout, "elm.guidetext", _(SAT_STR_TAP_TO_ENTER)); + elm_object_signal_callback_add(layout, "elm,eraser,clicked", "elm", _eraser_clicked_cb, ad->entry); + + elm_entry_cursor_end_set(ad->entry); + + Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(ad->entry); + ad->imf_context = imf_context; + ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback, NULL); + + if (get_input_data->bIsNumeric == EINA_TRUE) { + imf_layout = ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBER; + digits_filter_data.accepted = "0123456789*#+"; + digits_filter_data.rejected = NULL; + elm_entry_markup_filter_append(ad->entry, elm_entry_filter_accept_set, &digits_filter_data); + } else { + imf_layout = ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL; + } + + DBG("get_input_data->respLen.max(%d)",get_input_data->respLen.max); + if (get_input_data->respLen.max > 0) { + limit_filter_data.max_char_count = 0; + limit_filter_data.max_byte_count = get_input_data->respLen.max; + elm_entry_markup_filter_append(ad->entry, elm_entry_filter_limit_size, &limit_filter_data); + } + + elm_entry_input_panel_enabled_set(ad->entry, EINA_TRUE); + elm_entry_input_panel_layout_set(ad->entry, imf_layout); + + if (get_input_data->defaultText.stringLen > 0) + elm_entry_entry_set(ad->entry, (char *)get_input_data->defaultText.string); + + if (get_input_data->bIsEchoInput == FALSE) + elm_entry_password_set(ad->entry, EINA_TRUE); + + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_signal_emit(layout, "clicked", "elm"); + + return layout; + } + return NULL; +} + +static void __sat_ui_gl_sel_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (event_info) + elm_genlist_item_selected_set(event_info, EINA_FALSE); +} + +int draw_content_get_input(Evas_Object* content, void *tapi_data, void *data) +{ + retv_if(NULL == content, -1); + retv_if(NULL == tapi_data, -1); + retv_if(NULL == data, -1); + + Evas_Object *genlist = NULL; + Evas_Object *image = NULL; + Evas_Object *l_button = NULL; + Elm_Object_Item *item = NULL; + + memcpy(&(get_input_info), tapi_data, sizeof(TelSatGetInputInd_t)); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + ad->entry = NULL; + ad->r_button = NULL; + + l_button = elm_button_add(ad->nf); + elm_object_style_set(l_button, "naviframe/end_btn/default"); + evas_object_smart_callback_add(l_button, "clicked", on_clicked_back_btn, ad); + elm_object_item_part_content_set(ad->navi_it, "prev_btn", l_button); + ad->back_btn = l_button; + + /* Icon */ + if (get_input_info.iconId.bIsPresent == EINA_TRUE) { + image = convert_iconinfo_to_evas_object((void *)ad, &get_input_info.iconId.iconInfo); + if (get_input_info.iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + elm_object_item_text_set(ad->navi_it, " "); + } + evas_object_size_hint_align_set(image, 0,0); + evas_object_show(image); + } + + genlist = elm_genlist_add(content); + elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS); + evas_object_data_set(genlist, "app_data",(void *)ad); + + ad->itc_no_edit_text->item_style = "dialogue/1icon"; + ad->itc_no_edit_text->func.content_get = _gl_text_content_get; + + ad->itc_editfield_icon->item_style = "1icon"; + ad->itc_editfield_icon->func.content_get = _gl_editfield_content_get; + + ad->itc_ok_icon->item_style = "mode/slide"; + ad->itc_ok_icon->func.content_get = _gl_ok_button_content_get; + + ad->itc_help_icon->item_style = "mode/slide"; + ad->itc_help_icon->func.content_get = _gl_help_button_content_get; + + item = elm_genlist_item_append(genlist, ad->itc_no_edit_text, &(get_input_info), NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY); + + elm_genlist_item_append(genlist, ad->itc_editfield_icon, &(get_input_info), NULL, ELM_GENLIST_ITEM_NONE, __sat_ui_gl_sel_cb, NULL); + + elm_genlist_item_append(genlist, ad->itc_ok_icon, (void *)ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + + if (get_input_info.bIsHelpInfoAvailable == EINA_TRUE) { + elm_genlist_item_append(genlist, ad->itc_help_icon, (void *)ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + } + + elm_object_part_content_set(content, "body", genlist); + + ad->timer = ecore_timer_add(GET_INPUT_DURATION, on_expired_input_timer, ad); + + return 0; +} + diff --git a/src/sat-ui-icon.c b/src/sat-ui-icon.c new file mode 100755 index 0000000..b676fbc --- /dev/null +++ b/src/sat-ui-icon.c @@ -0,0 +1,477 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include "sat-ui-debug.h" + +bool decode_grey_icon ( unsigned char* src_data, unsigned short src_data_len, unsigned char* dest_data, unsigned short dest_data_len ); + +#ifdef LARGE_ICON +bool decode_color_icon ( unsigned char* src_data, unsigned short src_data_len, unsigned char* dest_data, unsigned short dest_data_len, unsigned char* clut_data, unsigned short clut_data_len ); +#else +bool decode_color_icon ( unsigned char bpp, unsigned char* src_data, unsigned short src_data_len, unsigned char* dest_data, unsigned short dest_data_len ); +#endif +void __satui_fill_data(TelSatIconInfo_t* icon_info); + +static void image_icon_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + if(NULL != data) + free(data); +} + +Evas_Object *convert_iconinfo_to_evas_object(void *data,TelSatIconInfo_t* icon_info) +{ + FILE *ficon, *fclut; + char file_path[50]={0,}; + SatUiAppData_t *ad = (SatUiAppData_t *)data; + unsigned char* dest_data = NULL; + int ret = 0; + + DBG(" dest icon size : w %d h %d\n",icon_info->width, icon_info->height); + DBG(" Image Color Scheme : %d",icon_info->ics); + + dest_data = malloc(icon_info->height * icon_info->width *4*sizeof(char)); + retv_if(NULL == dest_data, NULL); + unsigned short dest_data_len = icon_info->height * icon_info->width*4; + memset(dest_data, 255, icon_info->height * icon_info->width *4*sizeof(char)); + + if ((icon_info->iconDataLen - 2) > ((icon_info->width * icon_info->height) / 8)) { + icon_info->iconDataLen = (icon_info->width * icon_info->height) / 8 + 2; + } + + if (icon_info->ics == TAPI_SAT_SIM_IMAGE_CODING_SCHEME_BASIC) { +#ifdef LARGE_ICON + DBG(" GRAY ICON\n"); + unsigned char *icon_data; + if (strlen(icon_info->iconFile) == 0) { + DBG("Icon path length is zero"); + free(dest_data); + return NULL; + } + icon_data = malloc(icon_info->iconDataLen*sizeof(unsigned char)); + if (NULL == icon_data) { + free(dest_data); + return NULL; + } + snprintf(file_path, sizeof(file_path), "%s", icon_info->iconFile); + DBG(" Icon File Path : %s\n", icon_info->iconFile); + ficon = fopen(file_path, "rb"); + if (NULL == ficon) { + free(dest_data); + free(icon_data); + return NULL; + } + ret = fread(icon_data, 1, icon_info->iconDataLen, ficon); + if (ret < 0) { + DBG("fread is failed %d", ret); + } else { + decode_grey_icon(icon_data, icon_info->iconDataLen, dest_data, dest_data_len); + } + fclose(ficon); + free(icon_data); +#else + decode_grey_icon(icon_info->iconData, icon_info->iconDataLen, dest_data, dest_data_len); +#endif + + } else if (icon_info->ics == TAPI_SAT_SIM_IMAGE_CODING_SCHEME_COLOUR) { +#ifdef LARGE_ICON + unsigned char *icon_data; + icon_data = malloc(icon_info->iconDataLen*sizeof(unsigned char)); + if (NULL == icon_data) { + free(dest_data); + return NULL; + } + snprintf(file_path, sizeof(file_path), "%s", icon_info->iconFile); + DBG(" Icon File Path : %s\n", file_path ); + ficon = fopen(file_path, "rb"); + if (NULL == ficon) { + free(dest_data); + free(icon_data); + return NULL; + } + + ret = fread(icon_data, 1, icon_info->iconDataLen, ficon); + fclose(ficon); + if (ret < 0) { + DBG("fread is failed %d", ret); + } else { + unsigned char *clut_data; + clut_data = malloc(icon_info->clutDataLen*sizeof(unsigned char)); + if(NULL == clut_data){ + free(dest_data); + free(icon_data); + return NULL; + } + snprintf(file_path, sizeof(file_path), "%s", icon_info->clutFile); + DBG("CLUT File Path : %s\n", file_path); + fclut = fopen(file_path, "rb"); + if (NULL == fclut) { + free(dest_data); + free(icon_data); + free(clut_data); + return NULL; + } + + ret = fread(clut_data, 1, icon_info->clutDataLen, fclut); + if (ret < 0) { + DBG("fread is failed %d", ret); + } else { + decode_color_icon(icon_data, icon_info->iconDataLen, dest_data, dest_data_len, clut_data, icon_info->clutDataLen); + } + fclose(fclut); + free(clut_data); + } + free(icon_data); +#else + decode_color_icon(icon_info->iconData[2], icon_info->iconData, icon_info->iconDataLen, dest_data, sizeof(dest_data)); +#endif + } + + Evas *evas; + Evas_Object *eo; + evas = evas_object_evas_get(ad->win_main); + eo = evas_object_image_add(evas); + + evas_object_image_size_set(eo, icon_info->width, icon_info->height); + evas_object_image_data_set(eo, dest_data); + evas_object_image_fill_set(eo, 0,0, icon_info->width, icon_info->height); + evas_object_image_colorspace_set(eo, EVAS_COLORSPACE_ARGB8888); + evas_object_image_filled_set(eo, true); + evas_object_size_hint_min_set(eo, icon_info->width, icon_info->height); + evas_object_show(eo); + evas_object_event_callback_add(eo, EVAS_CALLBACK_DEL, image_icon_delete_cb, dest_data); + + return eo; +} + +#ifdef LARGE_ICON +typedef struct _color{ + unsigned short red; + unsigned short green; + unsigned short blue; +} color_t; + +bool parse_clut_data(color_t *CLUT, unsigned char* clut_data, unsigned short clut_data_len) +{ + int num_of_entry = clut_data_len/3; + int i=0; + int j=0; + for(i=0; i < num_of_entry; ++i){ + CLUT[i].red = clut_data[j++]; + CLUT[i].green = clut_data[j++]; + CLUT[i].blue = clut_data[j++]; + } + return true; +} + +int pow2(unsigned short n) +{ + switch(n){ + case 0: return 1; break; + case 1: return 2; break; + case 2: return 4; break; + case 3: return 8; break; + case 4: return 16; break; + case 5: return 32; break; + case 6: return 64; break; + case 7: return 128; break; + case 8: return 256; break; + default: + ERR(" Value n is out of range\n"); + return -1; + } +} + +unsigned short get_clut_ref(unsigned char point, unsigned short bpp) +{ + int i=0; + + unsigned char mask=0x80; + unsigned short ref=0; + + for(i=0; i < bpp; ++i){ + if(point & mask){ + ref +=pow2(bpp-i); + } + mask/=2; + } + return ref; +} + + +bool decode_color_icon ( unsigned char* src_data, unsigned short src_data_len, unsigned char* dest_data, unsigned short dest_data_len, unsigned char* clut_data, unsigned short clut_data_len ) +{ + guchar *pos; + int i= 0; + pos = (guchar *)dest_data; + DBG(" Start decoding"); + DBG(" data length %d", src_data_len); + + color_t *CLUT; + CLUT = calloc(clut_data_len/3,sizeof(color_t)); + + if(CLUT == NULL){ + ERR(" Failed in memory allocation for CLUT\n"); + return false; + } + + parse_clut_data(CLUT, clut_data,clut_data_len); + + unsigned short bpp = src_data[3]; + if( bpp < 1 || bpp > 8 ){ + DBG("BPP shall have a value between 1 and 8\n"); + }else{ + DBG(" Bits per raster image point = %d", bpp); + + src_data +=7; // Image body byte starts from 7th byte + int clut_index; + + for( i=0; i < src_data_len - 6 ; i++)//data_length-2 + { + clut_index = get_clut_ref(*src_data, bpp); + + *pos++ = CLUT[clut_index].red; //RED + *pos++ = CLUT[clut_index].green;//GREEN + *pos++ = CLUT[clut_index].blue; //BLUE + *pos++ = 0xFF; //ALPHA + + src_data++; + } + DBG(" Image decoding done"); + } + + if(CLUT) + free(CLUT); + + return TRUE; +} + + +#else + +bool decode_color_icon( unsigned char bpp, unsigned char* src_data, unsigned short src_data_len, unsigned char* dest_data, unsigned short dest_data_len ) +{ + unsigned short temp_idx = 0; + unsigned char* temp_data = NULL; + + int i, j; + + temp_idx += 6; + temp_data = &src_data[temp_idx]; + src_data_len -= temp_idx; + src_data_len -= (3 * src_data[3]); + + for( i = 0; i < src_data_len; i++ ) + { + for( j = 0; j < 4; j++ ) + { + switch( (temp_data[i] & (3 << (2*(3-j)))) >> (2*(3-j)) ) + { + case 0 : /* black */ + *dest_data++ = 0x00; + *dest_data++ = 0x00; + *dest_data++ = 0x00; + + break; + case 1 : /* red */ + *dest_data++ = 0xFF; + *dest_data++ = 0x00; + *dest_data++ = 0x00; + break; + case 2 : /* green */ + *dest_data++ = 0x00; + *dest_data++ = 0xFF; + *dest_data++ = 0x00; + break; + case 3 : /* blue */ + *dest_data++ = 0x00; + *dest_data++ = 0x00; + *dest_data++ = 0xFF; + break; + default : /* white */ + *dest_data++ = 0xFF; + *dest_data++ = 0xFF; + *dest_data++ = 0xFF; + break; + } + } + } + + return TRUE; +} + +#endif + + +bool decode_grey_icon ( unsigned char* src_data, unsigned short src_data_len, unsigned char* dest_data, unsigned short dest_data_len ) +{ + DBG("__satui_grey_icon_data_fill"); + + guchar *pos; + int i= 0; + int j=0; + pos = (guchar *)dest_data; + DBG(" before copy of data done"); + DBG(" data length %d", src_data_len); + + src_data++; + src_data++; + + for(i=0;i +#include +#include "sat-ui-debug.h" +#include "sat-ui.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "setup-menu-view.h" +#include "select-item-view.h" +#include "display-text-view.h" +#include "get-input-view.h" +#include "get-inkey-view.h" +#include "tel-request.h" +#include "mm_sound_private.h" +#include "winset.h" +#include "sat-ui-icon.h" +#include "common_string.h" + +/** + * This function handles all telephony events + * + * @internal + * @return Returns TRUE on if call agent is in wait state or FALSE + * @param[in] event tapi event data + * @param[in] userdata user callback data + */ + +static int on_tapi_event_sat_ui_info_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_select_item_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_display_text_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_get_input_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_get_inkey_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_end_proactive_session_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_ui_send_dtmf_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_ui_send_ss_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_ui_send_ussd_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_refresh_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_launch_browser_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_play_tone_ind(void *tapi_data, void *data); +static int on_tapi_event_sat_idle_mode_text_ind(void *tapi_data, void *data); + +static Eina_Bool on_idle_play_tone(void *data); +static void on_stop_play_tone(void *data); +Eina_Bool on_expired_play_tone_timer(void *data); + +static void win_del(void *data, Evas_Object *obj, void *event) +{ + elm_exit(); +} + +static Evas_Object* create_win(const char *name) +{ + Evas_Object *eo; + int w, h; + const char *str = "mobile"; + + eo = elm_win_add(NULL, name, ELM_WIN_BASIC); + if (eo) { + elm_win_profiles_set(eo, &str, 1); /* Desktop mode */ + elm_win_title_set(eo, name); + evas_object_smart_callback_add(eo, "delete,request", + win_del, NULL); + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_resize(eo, w, h); + } + + return eo; +} + +static Evas_Object* create_bg(Evas_Object *win) +{ + Evas_Object *bg; + bg = elm_bg_add(win); + retvm_if(NULL == bg, NULL, "elm_bg_add() return NULL"); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + return bg; +} + +static Evas_Object* create_conformant(Evas_Object *win) +{ + Evas_Object *conform; + conform = elm_conformant_add(win); + retvm_if(NULL == conform, NULL, "create_conformant() return NULL"); + elm_win_resize_object_add(win, conform); + + return conform; +} + +char *strip_control_char(const char *src_str) +{ + retv_if(NULL == src_str, NULL); + + int src_len; + src_len = strlen(src_str); + retv_if(0 == src_len, NULL); + + char *buffer = (char *)malloc(src_len+1); + retv_if(NULL == buffer, NULL); + + int j=0; + int i=0; + + for(i=0; i= 0x00 && src_str[i] <= 0x1F) || (src_str[i] == 0x7F)) { + continue; /* remove control charactors */ + } else { + buffer[j++] = src_str[i]; + } + } + buffer[j]=0x00; + + return buffer; +} + + +Evas_Object* load_edj(Evas_Object *parent, const char *file, const char *group) +{ + Evas_Object *eo; + int r; + + eo = elm_layout_add(parent); + if (eo) { + r = elm_layout_file_set(eo, file, group); + if (!r) { + evas_object_del(eo); + return NULL; + } + + evas_object_size_hint_align_set( eo, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_size_hint_weight_set(eo, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + } + + return eo; +} + +static int n_item=0; +void _free_item(gpointer data, gpointer user_data) +{ + menu_item *item = (menu_item *)data; + + if (item) { + free(item); + n_item++; + } +} + +static void reset_naviframe(SatUiAppData_t *ad) +{ + Evas_Object *eo; + if (ad->content && ad->navi_it) { + elm_object_item_text_set(ad->navi_it, " "); + eo = elm_object_part_content_unset(ad->content, "body"); + evas_object_del(eo); + if (ad->popup) { + evas_object_del(ad->popup); + ad->popup = NULL; + } + } + if (ad->back_btn) + evas_object_del(ad->back_btn); + if (ad->help_btn) + evas_object_del(ad->help_btn); + if (ad->waiting_bar) + evas_object_del(ad->waiting_bar); + ad->back_btn = NULL; + ad->help_btn = NULL; + ad->waiting_bar=NULL; +} + +static Evas_Object* create_naviframe_content_area(void *data) +{ + retv_if(NULL == data, NULL ); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + Evas_Object *win = NULL; + Evas_Object *lo = NULL; + Evas_Object *bg = NULL; + Evas_Object *conform = NULL; + Evas_Object *naviframe = NULL; + Evas_Object *content = NULL; + Elm_Object_Item *navi_it = NULL; + static Eina_Bool content_init = EINA_FALSE; + + if (ad->popup) + evas_object_del(ad->popup); + + if (content_init == EINA_TRUE) { + reset_naviframe(ad); + return ad->content; + } + + if (ad->win_main == NULL) { + win = create_win(PACKAGE); + ad->win_main = win; + retv_if(NULL == ad->win_main, NULL); + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + evas_object_show(win); + } + bg = create_bg(ad->win_main); + evas_object_show(bg); + + conform = create_conformant(ad->win_main); + evas_object_show(conform); + + lo = elm_layout_add(conform); + if (lo) { + ad->layout_main = lo; + } else { + ad->layout_main = NULL; + ERR("Failed elm_layout_add"); + return NULL; + } + elm_layout_theme_set( lo, "layout", "application", "default" ); + evas_object_size_hint_weight_set( lo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(conform, lo);; + edje_object_signal_emit(_EDJ(lo), "elm,state,show,indicator", "elm"); + evas_object_show( lo ); + + naviframe = elm_naviframe_add(lo); + if (naviframe) { + ad->nf= naviframe; + } else { + ad->nf= NULL; + ERR("elm_naviframe_add fails"); + return NULL; + } + elm_object_part_content_set(lo, "elm.swallow.content", naviframe); + evas_object_show(naviframe); + + content = load_edj(naviframe, EDJ_NAME, NORMAL_LAYOUT); + + if (content) { + ad->content = content; + } else { + ad->content = NULL; + ERR("Failed load_edj"); + return NULL; + } + + evas_object_show(content); + navi_it = elm_naviframe_item_push(naviframe, " ", NULL, NULL, content, NULL); + if (navi_it) { + ad->navi_it = navi_it; + } else { + ad->navi_it = NULL; + ERR("Failed elm_naviframe_item_push"); + return NULL; + } + content_init = EINA_TRUE; + + return content; + } + +static void user_confirm_resp_ok_cb( void *data, Evas_Object *obj, void *event_info ) +{ + ret_if(data == NULL); + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + send_ui_user_confirm(ad->cmd_id, ad->cmd_type, TAPI_SAT_USER_CONFIRM_YES, 0, NULL, ad); + evas_object_del(ad->popup); + ad->popup = NULL; +} + +static void user_confirm_resp_cancel_cb( void *data, Evas_Object *obj, void *event_info ) +{ + ret_if(data == NULL); + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + send_ui_user_confirm(ad->cmd_id, ad->cmd_type, TAPI_SAT_USER_CONFIRM_NO_OR_CANCEL, 0, NULL, ad); + evas_object_del(ad->popup); + ad->popup = NULL; +} + +static void user_confirm_resp_timeout_cb( void *data, Evas_Object *obj, void *event_info ) +{ + ret_if(data == NULL); + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + send_ui_user_confirm(ad->cmd_id, ad->cmd_type, TAPI_SAT_USER_CONFIRM_TIMEOUT, 0, NULL, ad); + evas_object_del(ad->popup); + ad->popup = NULL; +} + +static void user_confirm_resp_timeout_yes_cb( void *data, Evas_Object *obj, void *event_info ) +{ + ret_if(data == NULL); + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + send_ui_user_confirm(ad->cmd_id, ad->cmd_type, TAPI_SAT_USER_CONFIRM_YES, 0, NULL, ad); + evas_object_del(ad->popup); + ad->popup = NULL; +} + +static void user_confirm_refresh_timeout_cb( void *data, Evas_Object *obj, void *event_info ) +{ + ret_if(data == NULL); + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + send_ui_user_confirm(ad->cmd_id, ad->cmd_type, TAPI_SAT_USER_CONFIRM_TIMEOUT, 0, NULL, ad); + evas_object_del(ad->popup); + ad->popup = NULL; + + /* Refresh : Delete notification */ + _satui_delete_notification(); +} + +static void user_confirm_reboot_timeout_cb( void *data, Evas_Object *obj, void *event_info ) +{ + ret_if(data == NULL); + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + send_ui_user_confirm(ad->cmd_id, ad->cmd_type, TAPI_SAT_USER_CONFIRM_TIMEOUT, 0, NULL, ad); + evas_object_del(ad->popup); + ad->popup = NULL; + + /* Reboot action */ + sysman_call_predef_action("reboot",0); +} + +static void user_confirm_immediately_cb( void *data, Evas_Object *obj, void *event_info ) +{ + ret_if(data == NULL); + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + evas_object_del(ad->popup); + ad->popup = NULL; + ad->is_immediately_resp = EINA_FALSE; +} + +static void play_tone_resp_cancel_cb( void *data, Evas_Object *obj, void *event_info ) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TelSatAppsRetInfo_t app_ret_info; + + if (ad->sound_handle >= 0) { + DBG("Stop playback"); + mm_sound_stop_sound(ad->sound_handle); + ad->repeat_sound = EINA_FALSE; + } + app_ret_info.commandType = ad->cmd_type; + app_ret_info.commandId = ad->cmd_id; + app_ret_info.appsRet.playTone.resp = TAPI_SAT_R_PROACTIVE_SESSION_TERMINATED_BY_USER; + send_app_execution_result(&app_ret_info, ad); + + evas_object_del(ad->popup); + ad->popup = NULL; +} + +static void play_tone_resp_timeout_cb( void *data, Evas_Object *obj, void *event_info ) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + evas_object_del(ad->popup); + ad->popup = NULL; +} + +int on_tapi_event_sat_display_text_ind(void *tapi_data, void *data) +{ + retv_if(!tapi_data || !data, -1); + + Evas_Object *win; + int ret; + int is_idle_on_top; + double duration = 0.0; + Eina_Bool is_user_resp_required = EINA_FALSE; + Eina_Bool is_immediately_resp = EINA_FALSE; + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TelSatAppsRetInfo_t app_ret_info; + + TelSatDisplayTextInd_t *display_text_info; + display_text_info = (TelSatDisplayTextInd_t *)tapi_data; + ad->cmd_id = display_text_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_DISPLAY_TEXT; + + if ((ad->win_main == NULL) + || (elm_win_xwindow_get(ad->win_main) != ecore_x_window_focus_get())) { + /* ETSI TS 102 223 6.4.1 The terminal shall reject normal priority text commands if the screen is currently being used for more than its normal + stand-by display. If the command is rejected, the terminal informs the UICC using TERMINAL RESPONSE (terminal + currently unable to process command - screen busy).*/ + DBG("text priority=%d (0: Normal, 1:High)", display_text_info->bIsPriorityHigh); + if (display_text_info->bIsPriorityHigh == false) { + ret = vconf_get_int(VCONFKEY_IDLE_SCREEN_TOP, &is_idle_on_top); + retv_if(ret < 0, -1); + if (is_idle_on_top == VCONFKEY_IDLE_SCREEN_TOP_FALSE) { + DBG("The ME screen is busy. So the normal text is not displayed"); + app_ret_info.commandId = display_text_info->commandId; + app_ret_info.commandType = TAPI_SAT_CMD_TYPE_DISPLAY_TEXT; + app_ret_info.appsRet.displayText.resp = TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND; + app_ret_info.appsRet.displayText.meProblem = TAPI_SAT_ME_PROBLEM_SCREEN_BUSY; + send_app_execution_result(&app_ret_info, ad); + return 0; + } + } + + if (ad->win_main == NULL) { + win = create_win(PACKAGE); + ad->win_main = win; + retv_if(NULL == ad->win_main, -1); + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + evas_object_show(win); + } + } else { + DBG("SAT_UI is running so do not check priority"); + } + + is_user_resp_required = display_text_info->bIsUserRespRequired; + is_immediately_resp = display_text_info->b_immediately_resp; + DBG("Display text resp required : %d, immediately : %d", is_user_resp_required, is_immediately_resp); + + if (ad->exec_type == LAUNCHED_BY_TELEPHONY) + sleep(1); + + if (display_text_info->duration > 0) + duration = display_text_info->duration; + + if (is_immediately_resp) { + ad->is_immediately_resp = is_immediately_resp; + ret = draw_popup_text(ad->win_main, (char *)display_text_info->text.string , RESP_IMMEDIATELY, duration, user_confirm_immediately_cb, NULL, user_confirm_immediately_cb, ad); + send_ui_user_confirm(ad->cmd_id, ad->cmd_type, TAPI_SAT_USER_CONFIRM_YES, 0, NULL, ad); + } else { + if (is_user_resp_required == EINA_FALSE) { + ret = draw_popup_text(ad->win_main, (char *)display_text_info->text.string , RESP_NONE, duration, NULL, NULL, user_confirm_resp_timeout_yes_cb, ad); + } else { + ret = draw_popup_text(ad->win_main, (char *)display_text_info->text.string , RESP_OK_CANCEL, duration, user_confirm_resp_ok_cb, user_confirm_resp_cancel_cb, user_confirm_resp_timeout_cb, ad); + } + } + + retv_if(ret <0, -1); + return 0; +} + + +static int on_tapi_event_sat_ui_info_ind(void *tapi_data, void *data) +{ + DBG("func enter"); + + retv_if(!tapi_data || !data, -1); + + Evas_Object *win; + Evas_Object *icon = NULL; + Evas_Smart_Cb ok_cb = NULL; + Evas_Smart_Cb cancel_cb = NULL; + char buffer[TAPI_SAT_DEF_TEXT_STRING_LEN_MAX]; + int ret; + int resp_type = RESP_NONE; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + TelSatSendUiInfo_t *ui_info = (TelSatSendUiInfo_t *)tapi_data; + retv_if(NULL == ui_info, -1); + + DBG("text (%s) text_len(%d)", ui_info->text.string, ui_info->text.stringLen); + + ad->cmd_id = ui_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_NONE; + + if (ad->win_main == NULL) { + win = create_win(PACKAGE); + ad->win_main = win; + retv_if(NULL == ad->win_main, -1); + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + evas_object_show(win); + } + + if (ui_info->text.stringLen > 0) { + snprintf(buffer, sizeof(buffer), "%s",(char *)ui_info->text.string); + } else { + snprintf(buffer, sizeof(buffer), "%s", SAT_STR_SENDING); + } + + if (ui_info->user_confirm == 1) { + DBG("User confirm required"); + ok_cb = user_confirm_resp_ok_cb; + cancel_cb = user_confirm_resp_cancel_cb; + resp_type = RESP_OK_CANCEL; + } + + if (ui_info->iconId.bIsPresent == EINA_TRUE) { + if (ui_info->iconId.iconInfo.ics == TAPI_SAT_SIM_IMAGE_CODING_SCHEME_BASIC) { + icon = convert_iconinfo_to_evas_object(ad, &ui_info->iconId.iconInfo); + retv_if(NULL == icon, -1); + } + + if (ui_info->iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + ret = draw_popup_text_with_icon(ad->win_main, NULL, icon, resp_type, 0, ok_cb, cancel_cb, user_confirm_resp_timeout_cb, ad); + } else { + ret = draw_popup_text_with_icon(ad->win_main, buffer, icon, resp_type, 0, ok_cb, cancel_cb, user_confirm_resp_timeout_cb, ad); + } + } else { + ret = draw_popup_text(ad->win_main, buffer, resp_type, 0, ok_cb, cancel_cb, user_confirm_resp_timeout_cb, ad); + } + + /* User confirm : send tel_send_sat_ui_user_confirm */ + /* No user confirm : send tel_send_sat_ui_display_status */ + if (ui_info->user_confirm != 1) { + if (ret == 0) { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_SUCCESS, ad); + } else { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_FAIL, ad); + } + } + + return 0; +} + +static int on_tapi_event_sat_select_item_ind(void *tapi_data, void *data) +{ + retv_if(!tapi_data || !data, -1); + + DBG("func enter"); + Evas_Object *content; + int ret; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TelSatSelectItemInd_t *select_item_info; + + if (ad->tapi_data) { + free(ad->tapi_data); + ad->tapi_data = NULL; + } + + select_item_info = (TelSatSelectItemInd_t *)malloc(sizeof(TelSatSelectItemInd_t)); + retv_if(NULL == select_item_info, -1); + + memcpy(select_item_info, tapi_data, sizeof(TelSatSelectItemInd_t)); + ad->tapi_data = (void *)select_item_info; + + ad->cmd_id = select_item_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_SELECT_ITEM; + DBG("cmd_id = %d", ad->cmd_id); + content = create_naviframe_content_area(ad); + retv_if(NULL == content, -1); + ret = draw_content_select_item(content, select_item_info, ad); + retv_if(ret <0, -1); + return 0; +} + +static int on_tapi_event_sat_get_input_ind(void *tapi_data, void *data) +{ + retv_if(!tapi_data || !data, -1); + + DBG("func enter"); + Evas_Object *content; + int ret; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TelSatGetInputInd_t *get_input_info; + get_input_info = (TelSatGetInputInd_t *)tapi_data; + + ad->cmd_id = get_input_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_GET_INPUT; + + content = create_naviframe_content_area(ad); + retv_if(NULL == content, -1); + ret = draw_content_get_input(content, get_input_info, ad); + retv_if(ret <0, -1); + return 0; +} + + +static int on_tapi_event_sat_get_inkey_ind(void *tapi_data, void *data) +{ + retv_if(!tapi_data || !data, -1); + + DBG("func enter"); + Evas_Object *content; + int ret; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + TelSatGetInkeyInd_t *get_inkey_info; + get_inkey_info = (TelSatGetInkeyInd_t *)tapi_data; + + ad->cmd_id = get_inkey_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_GET_INKEY; + + content = create_naviframe_content_area(ad); + retv_if(NULL == content, -1); + ret = draw_content_get_inkey(content, get_inkey_info, ad); + retv_if(ret <0, -1); + return 0; +} + +static int on_tapi_event_sat_end_proactive_session_ind(void *tapi_data, void *data) +{ + retv_if(!data, -1); + + DBG("func enter"); + SatUiAppData_t *ad = (SatUiAppData_t *)data; + ad->cmd_id = -1; + + if (ad->is_immediately_resp == EINA_TRUE + && ad->cmd_type == TAPI_SAT_CMD_TYPE_DISPLAY_TEXT) { + DBG("Suspended popup : Do not action"); + } else if (ad->exec_type == LAUNCHED_BY_TELEPHONY) { + DBG("Exit Program"); + ad->cmd_type = TAPI_SAT_CMD_TYPE_END_PROACTIVE_SESSION; + elm_exit(); + } else { + Evas_Object *content; + int ret; + + ad->cmd_type = TAPI_SAT_CMD_TYPE_END_PROACTIVE_SESSION; + if (ad->tapi_data) { + free(ad->tapi_data); + ad->tapi_data = NULL; + } + + TelSatSetupMenuInfo_t *setup_menu_info; + setup_menu_info = (TelSatSetupMenuInfo_t *)malloc(sizeof(TelSatSetupMenuInfo_t)); + retv_if(NULL == setup_menu_info, -1); + ad->tapi_data = (void *)setup_menu_info; + + ret = tel_get_sat_main_menu_info(ad->tapi_handle, setup_menu_info); + DBG("title=%s, isUpdated : %d", setup_menu_info->satMainTitle, setup_menu_info->bIsUpdatedSatMainMenu); + DBG("num of menu=%d", setup_menu_info->satMainMenuNum); + if (ret < 0) { + DBG("tel_get_sat_main_menu_info error(%d). SAT_UI will be terminated", ret); + elm_exit(); +#if 0 /* Remain code for test */ + else if (setup_menu_info->bIsUpdatedSatMainMenu) { + DBG("Setup menu is updated. SAT_UI will be terminated"); + elm_exit(); +#endif + } else { + content = create_naviframe_content_area(ad); + draw_content_setup_menu(content, setup_menu_info, ad); + } + } + return 0; +} + +static int on_tapi_event_sat_ui_send_dtmf_ind(void *tapi_data, void *data) +{ + retv_if(!data, -1); + + DBG("func enter"); + Evas_Object *icon = NULL; + char buffer[TAPI_SAT_DEF_TEXT_STRING_LEN_MAX]; + Evas_Object *win; + int ret; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + TelSatAppsRetInfo_t app_ret_info; + TelSatSendUiInfo_t *ui_send_dtmf_info = NULL; + + ui_send_dtmf_info = (TelSatSendUiInfo_t *)tapi_data; + retv_if(NULL == ui_send_dtmf_info, -1); + + ad->cmd_id = ui_send_dtmf_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_SEND_DTMF; + + DBG("cmd_id = %d", ad->cmd_id); + + int call_state; + if (vconf_get_int(VCONFKEY_CALL_STATE, &call_state) < 0) { + ERR("vconf_get_int VCONFKEY_CALL_STATE failed"); + return -1; + } + + if ((call_state != VCONFKEY_CALL_VOICE_ACTIVE) + && (call_state != VCONFKEY_CALL_VOICE_CONNECTING)) { + DBG("DTMF can be sent within a call only"); + app_ret_info.commandId = ui_send_dtmf_info->commandId; + app_ret_info.commandType = TAPI_SAT_CMD_TYPE_SEND_DTMF; + app_ret_info.appsRet.sendDtmf.resp = TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND; + tel_send_sat_app_exec_result(ad->tapi_handle, &app_ret_info); + return 0; + } + + if (ad->win_main == NULL) { + win = create_win(PACKAGE); + ad->win_main = win; + retv_if(NULL == ad->win_main, -1); + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + evas_object_show(win); + } + + if (ui_send_dtmf_info->text.stringLen > 0) { + snprintf(buffer, sizeof(buffer), "%s",(char *)ui_send_dtmf_info->text.string); + DBG("string = %s", buffer); + } else { + snprintf(buffer, sizeof(buffer), "%s", SAT_STR_SENDING); + } + + if (ui_send_dtmf_info->iconId.bIsPresent == EINA_TRUE) { + if (ui_send_dtmf_info->iconId.iconInfo.ics == TAPI_SAT_SIM_IMAGE_CODING_SCHEME_BASIC) { + icon = convert_iconinfo_to_evas_object(ad, &ui_send_dtmf_info->iconId.iconInfo); + retv_if(NULL == icon, -1); + } + + if (ui_send_dtmf_info->iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + ret = draw_popup_text_with_icon(ad->win_main, NULL, icon, RESP_NONE, 0, NULL, NULL, user_confirm_resp_timeout_cb, ad); + } else { + ret = draw_popup_text_with_icon(ad->win_main, buffer, icon, RESP_NONE, 0, NULL, NULL, user_confirm_resp_timeout_cb, ad); + } + } else { + ret = draw_popup_text(ad->win_main, buffer, RESP_NONE, 0, NULL, NULL, user_confirm_resp_timeout_cb, ad); + } + + if (ret == 0) { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_SUCCESS, ad); + } else { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_FAIL, ad); + } + + return 0; +} + +static int on_tapi_event_sat_ui_send_ss_ind(void *tapi_data, void *data) +{ + retv_if(!data, -1); + + DBG("func enter"); + Evas_Object *win; + Evas_Object *icon = NULL; + char buffer[TAPI_SAT_DEF_TEXT_STRING_LEN_MAX]; + int ret; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + TelSatSendUiInfo_t *ui_send_ss_info = (TelSatSendUiInfo_t *)tapi_data; + retv_if(NULL == ui_send_ss_info, -1); + + ad->cmd_id = ui_send_ss_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_SEND_SS; + + if (ad->win_main == NULL) { + win = create_win(PACKAGE); + ad->win_main = win; + retv_if(NULL == ad->win_main, -1); + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + evas_object_show(win); + } + + if (ui_send_ss_info->text.stringLen > 0) { + snprintf(buffer, sizeof(buffer), "%s",(char *)ui_send_ss_info->text.string); + DBG("string = %s", buffer); + } else { + snprintf(buffer, sizeof(buffer), "%s", SAT_STR_SENDING); + } + + if (ui_send_ss_info->iconId.bIsPresent == EINA_TRUE) { + if (ui_send_ss_info->iconId.iconInfo.ics == TAPI_SAT_SIM_IMAGE_CODING_SCHEME_BASIC) { + icon = convert_iconinfo_to_evas_object(ad, &ui_send_ss_info->iconId.iconInfo); + retv_if(NULL == icon, -1); + } + + if (ui_send_ss_info->iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + ret = draw_popup_text_with_icon(ad->win_main, NULL, icon, RESP_NONE, 0, NULL, NULL, user_confirm_resp_timeout_cb, ad); + } else { + ret = draw_popup_text_with_icon(ad->win_main, buffer, icon, RESP_NONE, 0, NULL, NULL, user_confirm_resp_timeout_cb, ad); + } + } else { + ret = draw_popup_text(ad->win_main, buffer, RESP_NONE, 0, NULL, NULL, user_confirm_resp_timeout_cb, ad); + } + + if (ret == 0) { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_SUCCESS, ad); + } else { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_FAIL, ad); + } + + return 0; +} + +static int on_tapi_event_sat_ui_send_ussd_ind(void *tapi_data, void *data) +{ + retv_if(!data, -1); + + DBG("func enter"); + Evas_Object *win; + Evas_Object *icon = NULL; + char buffer[TAPI_SAT_DEF_TEXT_STRING_LEN_MAX]; + int ret; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + TelSatSendUiInfo_t *ui_send_ussd_info = (TelSatSendUiInfo_t *)tapi_data; + retv_if(NULL == ui_send_ussd_info, -1); + + ad->cmd_id = ui_send_ussd_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_SEND_USSD; + + if (ad->win_main == NULL) { + win = create_win(PACKAGE); + ad->win_main = win; + retv_if(NULL == ad->win_main, -1); + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + evas_object_show(win); + } + + if (ui_send_ussd_info->text.stringLen >0) { + snprintf(buffer, sizeof(buffer), "%s", (char *)ui_send_ussd_info->text.string); + DBG("string = %s", buffer); + } else { + snprintf(buffer, sizeof(buffer), "%s", SAT_STR_SENDING); + } + + if (ui_send_ussd_info->iconId.bIsPresent == EINA_TRUE) { + if (ui_send_ussd_info->iconId.iconInfo.ics == TAPI_SAT_SIM_IMAGE_CODING_SCHEME_BASIC) { + icon = convert_iconinfo_to_evas_object(ad, &ui_send_ussd_info->iconId.iconInfo); + retv_if(NULL == icon, -1); + } + + if (ui_send_ussd_info->iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + ret = draw_popup_text_with_icon(ad->win_main, NULL, icon, RESP_NONE, 0, NULL, NULL, user_confirm_resp_timeout_cb, ad); + } else { + ret = draw_popup_text_with_icon(ad->win_main, buffer, icon, RESP_NONE, 0, NULL, NULL, user_confirm_resp_timeout_cb, ad); + } + } else { + ret = draw_popup_text(ad->win_main, buffer, RESP_NONE, 0, NULL, NULL, user_confirm_resp_timeout_cb, ad); + } + + + if (ret == 0) { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_SUCCESS, ad); + } else { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_FAIL, ad); + } + + return 0; +} + +static int on_tapi_event_sat_refresh_ind(void *tapi_data, void *data) +{ + retv_if(!data, -1); + + DBG("func enter"); + Evas_Object *win; + char buffer[TAPI_SAT_DEF_TEXT_STRING_LEN_MAX]; + int ret; + int duration = 0; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + TelSatRefreshIndUiInfo_t *refresh_info = (TelSatRefreshIndUiInfo_t *)tapi_data; + retv_if(NULL == refresh_info, -1); + + ad->cmd_id = refresh_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_REFRESH; + duration = refresh_info->duration; + + if (ad->win_main == NULL) { + win = create_win(PACKAGE); + ad->win_main = win; + retv_if(NULL == ad->win_main, -1); + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + evas_object_show(win); + } + + snprintf(buffer, sizeof(buffer), "%s", SAT_STR_SIM_REFRESHING); + + DBG("reset type : %d, reset duration : %d", refresh_info->refreshType, duration); + if (refresh_info->refreshType >= TAPI_SAT_REFRESH_SIM_RESET) { + ret = draw_popup_text(ad->win_main, buffer, RESP_NONE, duration, NULL, NULL, user_confirm_reboot_timeout_cb, ad); + } else { + ret = draw_popup_text(ad->win_main, buffer, RESP_NONE, duration, NULL, NULL, user_confirm_refresh_timeout_cb, ad); + } + + if (ret == 0) { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_SUCCESS, ad); + } else { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_FAIL, ad); + } + + return 0; +} + +static int on_tapi_event_sat_launch_browser_ind(void *tapi_data, void *data) +{ + retv_if(!data, -1); + + DBG("func enter"); + Evas_Object *win; + Evas_Object *icon = NULL; + char buffer[TAPI_SAT_DEF_TEXT_STRING_LEN_MAX]; + int ret; + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + TelSatSendUiInfo_t *launch_browser_info = (TelSatSendUiInfo_t *)tapi_data; + retv_if(NULL == launch_browser_info, -1); + + ad->cmd_id = launch_browser_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_LAUNCH_BROWSER; + + if (ad->win_main == NULL) { + win = create_win(PACKAGE); + ad->win_main = win; + retv_if(NULL == ad->win_main, -1); + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + evas_object_show(win); + } + + if (launch_browser_info->text.stringLen > 0) { + snprintf(buffer, sizeof(buffer), "%s",(char *)launch_browser_info->text.string); + } else { + snprintf(buffer, sizeof(buffer), "%s", SAT_STR_LAUNCH_BROWSER_Q); + } + + if (launch_browser_info->iconId.bIsPresent == EINA_TRUE) { + if (launch_browser_info->iconId.iconInfo.ics == TAPI_SAT_SIM_IMAGE_CODING_SCHEME_BASIC) { + icon = convert_iconinfo_to_evas_object(ad, &launch_browser_info->iconId.iconInfo); + retv_if(NULL == icon, -1); + } + + if (launch_browser_info->iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + ret = draw_popup_text_with_icon(ad->win_main, NULL, icon, RESP_OK_CANCEL, 0, user_confirm_resp_ok_cb, user_confirm_resp_cancel_cb, user_confirm_resp_timeout_cb, ad); + } else { + ret = draw_popup_text_with_icon(ad->win_main, buffer, icon, RESP_OK_CANCEL, 0, user_confirm_resp_ok_cb, user_confirm_resp_cancel_cb, user_confirm_resp_timeout_cb, ad); + } + } else { + ret = draw_popup_text(ad->win_main,buffer, RESP_OK_CANCEL,0, user_confirm_resp_ok_cb, user_confirm_resp_cancel_cb, user_confirm_resp_timeout_cb, ad); + } + + + if (ret == 0) { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_SUCCESS, ad); + } else { + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_FAIL, ad); + } + + return 0; +} + +static int on_tapi_event_sat_play_tone_ind(void *tapi_data, void *data) +{ + retv_if(!data, -1); + + DBG("func enter"); + Evas_Object *win; + Evas_Object *icon = NULL; + char buffer[TAPI_SAT_DEF_TEXT_STRING_LEN_MAX]; + int ret = 0; + int duration = 0; + char *tone_file = NULL; + int handle = 0;; + + retv_if(NULL == tapi_data, -1); + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TelSatPlayToneInd_t *play_tone_info; + play_tone_info = (TelSatPlayToneInd_t *)tapi_data; + + ad->cmd_id = play_tone_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_PLAY_TONE; + DBG("cmd_id = %d", ad->cmd_id); + + if (ad->win_main == NULL) { + win = create_win(PACKAGE); + ad->win_main = win; + retv_if(NULL == ad->win_main, -1); + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + evas_object_show(win); + } + + duration = play_tone_info->duration; + if (play_tone_info->text.stringLen > 0) { + snprintf(buffer, sizeof(buffer), "%s", (char *)play_tone_info->text.string); + } else { + snprintf(buffer, sizeof(buffer), "%s", SAT_STR_PLAYING_TONE); + } + DBG("text=%s, duration = %d, tone_type = %d", buffer, duration, play_tone_info->tone.type); + + if (play_tone_info->iconId.bIsPresent == EINA_TRUE) { + if (play_tone_info->iconId.iconInfo.ics == TAPI_SAT_SIM_IMAGE_CODING_SCHEME_BASIC) { + icon = convert_iconinfo_to_evas_object(ad, &play_tone_info->iconId.iconInfo); + retv_if(NULL == icon, -1); + } + + if (play_tone_info->iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + ret = draw_popup_text_with_icon(ad->win_main, NULL, icon, RESP_CANCEL, duration, NULL, play_tone_resp_cancel_cb, play_tone_resp_timeout_cb, ad); + } else { + ret = draw_popup_text_with_icon(ad->win_main, buffer, icon, RESP_CANCEL, duration, NULL, play_tone_resp_cancel_cb, play_tone_resp_timeout_cb, ad); + } + } else { + ret = draw_popup_text(ad->win_main, buffer, RESP_CANCEL, duration, NULL, play_tone_resp_cancel_cb, play_tone_resp_timeout_cb, ad); + } + + if (ret != 0) { + DBG("draw_popup_text is error"); + send_ui_display_status(ad->cmd_id, TAPI_SAT_DISPLAY_FAIL, ad); + return 0; + } + + switch(play_tone_info->tone.type) { + /* standard supervisory tones */ + case TAPI_SAT_DIAL_TONE: + tone_file = STK_DIAL_TONE; + break; + case TAPI_SAT_CALLED_SUBSCRIBER_BUSY: + tone_file = STK_BUSY_TONE; + break; + case TAPI_SAT_CONGESTION: + tone_file = STK_CONGESTION_TONE; + break; + case TAPI_SAT_RADIO_PATH_ACK: + tone_file = STK_RADIO_ACK_TONE; + break; + case TAPI_SAT_RADIO_PATH_NOT_AVAILABLE_CALL_DROPPED: + tone_file = STK_DROPPED_TONE; + break; + case TAPI_SAT_ERR_SPECIAL_INFO: + tone_file = STK_ERROR_TONE; + break; + case TAPI_SAT_CALL_WAITING_TONE: + tone_file = STK_WAITING_TONE; + break; + case TAPI_SAT_RINGING_TONE: + tone_file = STK_RINGING_TONE; + break; + + /* ME proprietary tones */ + case TAPI_SAT_GENERAL_BEEP: + tone_file = STK_BEEP_TONE; + break; + case TAPI_SAT_POSITIVE_ACK_TONE: + tone_file = STK_POS_ACK_TONE; + break; + case TAPI_SAT_NEGATIVE_ACK_OR_ERROR_TONE: + tone_file = STK_NEG_ACK_TONE; + break; + default: + tone_file = STK_DIAL_TONE; + break; + } + + snprintf(ad->tone_file, sizeof(ad->tone_file), "%s", tone_file); + ad->repeat_sound = EINA_TRUE; + + ad->sound_handle = -1; + ret = mm_sound_play_sound(tone_file, VOLUME_TYPE_CALL, on_stop_play_tone, ad, &handle); + DBG("tone=%s, mm_sound_play_sound =%d, handle=%d", ad->tone_file, ret, handle); + + if (ret == MM_ERROR_NONE) { + ad->sound_handle = handle; + if(duration > 0) { + double duration_sec = duration / 1000; + ecore_timer_add(duration_sec, on_expired_play_tone_timer, ad); + } + } else { + DBG("mm_sound_play_sound is error"); + TelSatAppsRetInfo_t app_ret_info; + + if(ad->sound_handle >= 0){ + mm_sound_stop_sound(ad->sound_handle); + ad->repeat_sound = EINA_FALSE; + ad->sound_handle = -1; + } + + app_ret_info.commandType = ad->cmd_type; + app_ret_info.commandId = ad->cmd_id; + app_ret_info.appsRet.playTone.resp = TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND; + send_app_execution_result(&app_ret_info, ad); + } + + return 0; +} + +int on_tapi_event_sat_idle_mode_text_ind(void *tapi_data, void *data) +{ + retv_if(!tapi_data || !data, -1); + + int ret = -1; + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TelSatAppsRetInfo_t app_ret_info; + + TelSatSetupIdleModeTextInd_t *idle_mode_info; + idle_mode_info = (TelSatSetupIdleModeTextInd_t *)tapi_data; + ad->cmd_id = idle_mode_info->commandId; + ad->cmd_type = TAPI_SAT_CMD_TYPE_SETUP_IDLE_MODE_TEXT; + + DBG("text length : %d, string : %s", idle_mode_info->text.stringLen, idle_mode_info->text.string); + if (idle_mode_info->text.stringLen < 1) { + DBG("Text is not proper, delete notification"); + ret = _satui_delete_notification(); + } else { + _satui_delete_notification(); /* Remove exist noti*/ + ret = _satui_create_notification((const char *)idle_mode_info->text.string); + } + + app_ret_info.commandType = ad->cmd_type; + app_ret_info.commandId = ad->cmd_id; + if (ret < 0) { + DBG("Idle mode text is error"); + app_ret_info.appsRet.setupIdleModeText.resp = TAPI_SAT_R_ME_UNABLE_TO_PROCESS_COMMAND; + } else { + app_ret_info.appsRet.setupIdleModeText.resp = TAPI_SAT_R_SUCCESS; + } + send_app_execution_result(&app_ret_info, ad); + + return 0; +} + +static void on_stop_play_tone(void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + if (ad->repeat_sound == EINA_TRUE) + ecore_idler_add(on_idle_play_tone, data); +} + +static Eina_Bool on_idle_play_tone(void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + int ret; + int handle; + ret = mm_sound_play_sound(ad->tone_file, VOLUME_TYPE_CALL, on_stop_play_tone, ad, &handle); + ad->sound_handle = handle; + + return ECORE_CALLBACK_CANCEL; +} + +Eina_Bool on_expired_play_tone_timer(void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TelSatAppsRetInfo_t app_ret_info; + + if (ad->sound_handle >= 0) { + DBG("Stop playback"); + mm_sound_stop_sound(ad->sound_handle); + ad->repeat_sound = EINA_FALSE; + ad->sound_handle = -1; + } + app_ret_info.commandType = ad->cmd_type; + app_ret_info.commandId = ad->cmd_id; + app_ret_info.appsRet.playTone.resp = TAPI_SAT_R_SUCCESS; + send_app_execution_result(&app_ret_info, ad); + + return ECORE_CALLBACK_CANCEL; +} + +/* Encode the time information to TP-Service-Centre-Time-Stamp*/ +unsigned char encode_to_tp_scts(unsigned char octet) +{ + unsigned char semioctet = 0x00; + + if (octet >= 0x64) { + return semioctet; + } + + unsigned char rem, quo; + rem = octet % 10; + quo = octet / 10; + + semioctet = rem << 4; + semioctet |= quo; + + return semioctet; +} + +int x_util_get_default_size(double* w, double* h) +{ + Display *d; + int screen_num; + + d = XOpenDisplay(NULL); + if (d == NULL) + return -1; + + screen_num = DefaultScreen(d); + + *w = DisplayWidth(d, screen_num); + *h = DisplayHeight(d, screen_num); + + DBG ("Root Width = %lf, Height = %lf\n", *w, *h); + + XCloseDisplay(d); + + return 0; +} + +static int app_create(void *data) +{ + char buf[MAX_LOCAL_BUF_SIZE]; + double root_w, root_h; + double scale_factor; + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + // get the window size + if (x_util_get_default_size(&root_w, &root_h) == 0) + scale_factor = root_w / SAT_UI_MAIN_W; + else + scale_factor = 1.0; + + snprintf(buf, sizeof(buf), "%lf", scale_factor); + + setenv("ELM_SCALE", buf, 1); + setenv("SCALE_FACTOR", buf, 1); + + elm_config_scale_set(scale_factor); + DBG("scale_factor = %0.5f", scale_factor); + + int ret = setup_tapi_init(ad); + if (ret < 0) { + DBG("setup_tapi_init error"); + return -1; + } + ad->win_main = NULL; + ad->popup = NULL; + ad->imf_context = NULL; + ad->tapi_data = NULL; + /* Default type is LAUNCHED_BY_TELEPHONY */ + ad->exec_type = LAUNCHED_BY_TELEPHONY; + + return 0; +} + +static int app_terminate(void *data) +{ + SatUiAppData_t *ad = data; + TelSatAppsRetInfo_t app_ret_info; + int ret = 0; + + _satui_geinlist_item_class_free(ad); + if (ad->win_main) + evas_object_del(ad->win_main); + + DBG("cmd_type = %x", ad->cmd_type); + switch(ad->cmd_type) + { + case TAPI_SAT_CMD_TYPE_SELECT_ITEM: + case TAPI_SAT_CMD_TYPE_GET_INKEY: + case TAPI_SAT_CMD_TYPE_GET_INPUT: + case TAPI_SAT_CMD_TYPE_DISPLAY_TEXT: + case TAPI_SAT_CMD_TYPE_SETUP_CALL: + ret = send_ui_user_confirm(ad->cmd_id, ad->cmd_type, TAPI_SAT_USER_CONFIRM_END, 0, NULL, ad); + break; + case TAPI_SAT_CMD_TYPE_PLAY_TONE: + app_ret_info.commandType =ad->cmd_type; + app_ret_info.commandId = ad->cmd_id; + app_ret_info.appsRet.playTone.resp = TAPI_SAT_R_PROACTIVE_SESSION_TERMINATED_BY_USER; + ret = send_app_execution_result(&app_ret_info, ad); + break; + case TAPI_SAT_CMD_TYPE_LAUNCH_BROWSER: + app_ret_info.commandType =ad->cmd_type; + app_ret_info.commandId = ad->cmd_id; + app_ret_info.appsRet.launchBrowser.resp = TAPI_SAT_R_PROACTIVE_SESSION_TERMINATED_BY_USER; + ret = send_app_execution_result(&app_ret_info, ad); + break; + case TAPI_SAT_CMD_TYPE_END_PROACTIVE_SESSION: + case TAPI_SAT_CMD_TYPE_NONE: + default: + break; + } + + if (ad->tapi_data) { + free(ad->tapi_data); + ad->tapi_data = NULL; + } + + tel_deinit(ad->tapi_handle); + + /* Remove recent history when SAT-UI is terminated*/ + rua_init(); + rua_delete_history_with_pkgname(SAT_UI_PKG); + rua_fini(); + return ret; +} + +static int app_pause(void *data) +{ + return 0; +} + +static int app_resume(void *data) +{ + return 0; +} + +static int app_reset(bundle *b, void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + _satui_geinlist_item_class_new(ad); + + if (b) { + int exec_type; + char *str_exec = NULL; + + str_exec = (char *)bundle_get_val(b, "KEY_EXEC_TYPE"); + exec_type = atoi(str_exec); + + DBG("key exec(%d)", exec_type); + + if (exec_type == 0) { + ad->exec_type = exec_type; /* LAUNCHED_BY_MENU */ + DBG("processing user input event"); + + Evas_Object *content; + int ret; + + if (ad->tapi_data) { + free(ad->tapi_data); + ad->tapi_data = NULL; + } + + TelSatSetupMenuInfo_t *setup_menu_info; + setup_menu_info = (TelSatSetupMenuInfo_t *)malloc(sizeof(TelSatSetupMenuInfo_t)); + retv_if(NULL == setup_menu_info, -1); + ret = tel_get_sat_main_menu_info(ad->tapi_handle, setup_menu_info); + ad->tapi_data = (void *)setup_menu_info; + + DBG("title=%s",setup_menu_info->satMainTitle); + DBG("num of menu=%d",setup_menu_info->satMainMenuNum); + retv_if(ret < 0, -1); + content = create_naviframe_content_area(ad); + ad->cmd_type = TAPI_SAT_CMD_TYPE_NONE; + ad->cmd_id = -1; + draw_content_setup_menu(content, setup_menu_info, ad); + + } else { + int cmd_type; + char *str_cmd = NULL; + void *p_data = NULL, *cmd_data = NULL; + gsize cmd_data_len = 0; + + DBG("processing telephony event"); + + str_cmd = (char *)bundle_get_val(b, "cmd_type"); + DBG("cmd_type str(%s)", str_cmd); + cmd_type = atoi(str_cmd); + + p_data = (void *)bundle_get_val(b, "data"); + if (p_data) { + cmd_data = g_base64_decode(p_data, &cmd_data_len); + } + + DBG("cmd type(%d) data(%s)", cmd_type, cmd_data); + if (cmd_type == TAPI_SAT_CMD_TYPE_NONE) { + on_tapi_event_sat_ui_info_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_SELECT_ITEM) { + on_tapi_event_sat_select_item_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_DISPLAY_TEXT) { + on_tapi_event_sat_display_text_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_GET_INKEY) { + on_tapi_event_sat_get_inkey_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_GET_INPUT) { + on_tapi_event_sat_get_input_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_END_PROACTIVE_SESSION) { + on_tapi_event_sat_end_proactive_session_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_SEND_DTMF) { + on_tapi_event_sat_ui_send_dtmf_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_SEND_SS) { + on_tapi_event_sat_ui_send_ss_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_SEND_USSD) { + on_tapi_event_sat_ui_send_ussd_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_REFRESH) { + on_tapi_event_sat_refresh_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_LAUNCH_BROWSER) { + on_tapi_event_sat_launch_browser_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_PLAY_TONE) { + on_tapi_event_sat_play_tone_ind(cmd_data, ad); + } else if (cmd_type == TAPI_SAT_CMD_TYPE_SETUP_IDLE_MODE_TEXT) { + on_tapi_event_sat_idle_mode_text_ind(cmd_data, ad); + } + + if (cmd_data) + g_free(cmd_data); + } + } + + return 0; +} + +int main(int argc, char *argv[]) +{ + SatUiAppData_t ad; + memset(&ad, 0x0, sizeof(SatUiAppData_t)); + struct appcore_ops ops = { + .create = app_create, + .terminate = app_terminate, + .pause = app_pause, + .resume = app_resume, + .reset = app_reset, + }; + + memset(&ad, 0x0, sizeof(SatUiAppData_t)); + + ops.data = &ad; + + appcore_set_i18n(PACKAGE, LOCALEDIR); + + return appcore_efl_main(PACKAGE, &argc, &argv, &ops); +} diff --git a/src/select-item-view.c b/src/select-item-view.c new file mode 100755 index 0000000..e0035c2 --- /dev/null +++ b/src/select-item-view.c @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include "stdlib.h" +#include +#include +#include +#include +#include "sat-ui-debug.h" +#include "select-item-view.h" +#include "sat-ui.h" +#include "sat-ui-icon.h" +#include "winset.h" +#include "tel-request.h" +#include +#include "common_string.h" + + +static void __sat_ui_select_item_destory_object(void *data,Evas *evas, Evas_Object *obj, void *event_info) +{ + evas_object_data_del(obj, "app_data"); + evas_object_data_del(obj, "tapi_data"); +} + +static void _gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + int index; + Evas_Object *waiting_bar; + + + unsigned char selected_item_id; + + Elm_Object_Item *item = (Elm_Object_Item *)event_info; + SatUiAppData_t *ad; + TelSatSelectItemInd_t *select_item_info; + + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + select_item_info = (TelSatSelectItemInd_t *)evas_object_data_get(obj, "tapi_data"); + + if (item) { + index = (int)elm_object_item_data_get(item); + selected_item_id = select_item_info->menuItem[index].itemId; + + send_ui_user_confirm(select_item_info->commandId, + TAPI_SAT_CMD_TYPE_SELECT_ITEM, + TAPI_SAT_USER_CONFIRM_YES, + sizeof(unsigned char), + &selected_item_id, ad); + } + waiting_bar = create_waiting_notify(ad->content); + ad->waiting_bar = waiting_bar; + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } +} + + +static char *_gl_text_get(void *data, Evas_Object *obj, const char *part) +{ + int index = (int) data; + SatUiAppData_t *ad; + TelSatSelectItemInd_t *select_item_info; + char *stripped_str; + + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + retv_if(NULL == ad, NULL); + select_item_info = (TelSatSelectItemInd_t *)evas_object_data_get(obj, "tapi_data"); + if (select_item_info->iconIdList.bIsPresent == true && + select_item_info->iconIdList.iconListQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) + return NULL; + else { + stripped_str = strip_control_char((char *)select_item_info->menuItem[index].text); + return stripped_str; + } +} + +static void on_clicked_help_button(void *data, Evas_Object *obj, void *event_info) +{ + int index = (int) data; + TelSatSelectItemInd_t *select_item_info; + SatUiAppData_t *ad; + + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + ret_if(NULL == ad); + select_item_info = (TelSatSelectItemInd_t *)evas_object_data_get(obj, "tapi_data"); + ret_if(NULL == select_item_info); + send_ui_user_confirm(select_item_info->commandId, + TAPI_SAT_CMD_TYPE_SELECT_ITEM, + TAPI_SAT_USER_CONFIRM_HELP_INFO, + sizeof(unsigned char), + &(select_item_info->menuItem[index].itemId), ad); +} + +static Evas_Object *_gl_content_get(void *data, Evas_Object *obj, const char *part) +{ + Evas_Object *btn; + SatUiAppData_t *ad; + TelSatSelectItemInd_t *select_item_info; + + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + select_item_info = (TelSatSelectItemInd_t *)evas_object_data_get(obj, "tapi_data"); + retv_if(NULL == ad, NULL); + + if ((!strcmp(part, "elm.icon")) + || (!strcmp(part, "elm.icon.2"))) { + if (select_item_info->bIsHelpInfoAvailable == true) { + btn = elm_button_add(ad->content); + elm_object_style_set(btn, "info"); + evas_object_smart_callback_add(btn, "clicked", on_clicked_help_button, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_DEL, __sat_ui_select_item_destory_object, NULL); + evas_object_data_set(btn, "app_data",(void *)ad); + evas_object_data_set(btn, "tapi_data",(void *)select_item_info); + evas_object_propagate_events_set(btn, EINA_FALSE); + return btn; + } + } else if (!strcmp(part, "elm.icon.1")) { + if (select_item_info->iconIdList.bIsPresent == true) { + return NULL; + } + } + return NULL; +} + +static void on_clicked_back_btn( void *data, Evas_Object* obj, void* event_info ) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_SELECT_ITEM, TAPI_SAT_USER_CONFIRM_NO_OR_CANCEL, 0, NULL, ad); + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } +} + + +static Eina_Bool on_timer_expired(void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + if (ad->timer == NULL) { + DBG("Cancel timout w/o user_confirm"); + }else{ + send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_SELECT_ITEM, TAPI_SAT_USER_CONFIRM_TIMEOUT, 0, NULL, ad); + ad->timer = NULL; + } + + return ECORE_CALLBACK_CANCEL; +} + +int draw_content_select_item(Evas_Object *content, void *tapi_data, void *data) +{ + retv_if(NULL == content, -1); + retv_if(NULL == tapi_data, -1); + retv_if(NULL == data, -1); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TelSatSelectItemInd_t *select_item_info = (TelSatSelectItemInd_t *)tapi_data; + Evas_Object *l_button; + Evas_Object *box; + Evas_Object *image; + Evas_Object *genlist; + + int index; + l_button = elm_button_add(ad->nf); + elm_object_style_set(l_button, "naviframe/end_btn/default"); + evas_object_smart_callback_add(l_button, "clicked", on_clicked_back_btn, ad); + elm_object_item_part_content_set(ad->navi_it, "prev_btn", l_button); + ad->back_btn = l_button; + + if (select_item_info->text.stringLen > 0) { + elm_object_item_text_set(ad->navi_it, (char *)select_item_info->text.string); + } + + box = elm_box_add(ad->nf); + elm_box_horizontal_set(box, EINA_FALSE); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + if (select_item_info->iconId.bIsPresent == true) { + DBG(" Select item text: %s", (char *)select_item_info->text.string); + + image = convert_iconinfo_to_evas_object((void *)ad, &select_item_info->iconId.iconInfo); + + if (select_item_info->iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + elm_object_item_text_set(ad->navi_it, " "); + + } + evas_object_size_hint_align_set(image, 0,0); + evas_object_show(image); + elm_box_pack_end(box, image); + } + + /* Select Item List */ + ad->itc_text_icon->func.text_get = _gl_text_get; + ad->itc_text_icon->func.content_get = _gl_content_get; + + if (select_item_info->iconIdList.bIsPresent == true) { + ad->itc_text_icon->item_style= "1text.2icon"; + } else { + ad->itc_text_icon->item_style = "1text.1icon"; + } + + genlist = elm_genlist_add(content); + 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); + evas_object_show(genlist); + evas_object_data_set(genlist, "app_data",(void *)ad); + evas_object_data_set(genlist, "tapi_data",(void *)select_item_info); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_DEL, __sat_ui_select_item_destory_object, NULL); + + for (index = 0; index < select_item_info->menuItemCount; index++) { + elm_genlist_item_append( + genlist, + ad->itc_text_icon, + (void *) index, + NULL, + ELM_GENLIST_ITEM_NONE, + _gl_sel, + NULL + ); + } + + elm_box_pack_end(box, genlist); + elm_object_part_content_set(content, "body", box); + ad->timer = ecore_timer_add(SELECT_MENU_DURATION, on_timer_expired, ad); + + return 0; +} + + diff --git a/src/setup-menu-view.c b/src/setup-menu-view.c new file mode 100755 index 0000000..f4afb78 --- /dev/null +++ b/src/setup-menu-view.c @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include "stdlib.h" +#include +#include +#include +#include +#include +#include "setup-menu-view.h" +#include "sat-ui-icon.h" +#include "sat-ui.h" +#include "winset.h" +#include "tel-request.h" +#include "common_string.h" +#include + +static void on_clicked_back_btn( void *data, Evas_Object* obj, void* event_info ) +{ + elm_exit(); +} + +static char *_gl_text_get(void *data, Evas_Object *obj, const char *part) +{ + int index = (int) data; + TelSatSetupMenuInfo_t *setup_menu_info; + char *stripped_str; + + setup_menu_info = (TelSatSetupMenuInfo_t *)evas_object_data_get(obj, "tapi_data"); + if (setup_menu_info->iconIdList.bIsPresent == true && + setup_menu_info->iconIdList.iconListQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) + return NULL; + else { + stripped_str = strip_control_char(setup_menu_info->satMainMenuItem[index].itemString); + return stripped_str; + } +} + +static void on_clicked_help_button(void *data, Evas_Object *obj, void *event_info) +{ + int index = (int) data; + SatUiAppData_t *ad; + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + TelSatSetupMenuInfo_t *setup_menu_info; + + setup_menu_info = (TelSatSetupMenuInfo_t *)evas_object_data_get(obj, "tapi_data"); + send_menu_selection_info(ad->tapi_handle, setup_menu_info->satMainMenuItem[index].itemId, true); +} + +static void __sat_ui_setup_menu_destory_object(void *data,Evas *evas, Evas_Object *obj, void *event_info) +{ + evas_object_data_del(obj, "app_data"); + evas_object_data_del(obj, "tapi_data"); +} + +static Evas_Object *_gl_content_get(void *data, Evas_Object *obj, const char *part) +{ + Evas_Object *btn = NULL; + SatUiAppData_t *ad = NULL; + TelSatSetupMenuInfo_t *setup_menu_info = NULL; + + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + setup_menu_info = (TelSatSetupMenuInfo_t *)evas_object_data_get(obj, "tapi_data"); + retv_if(NULL == ad, NULL); + + if ((!strcmp(part, "elm.icon")) + || (!strcmp(part, "elm.icon.2"))) { + if (setup_menu_info->bIsSatMainMenuHelpInfo == true) { + btn = elm_button_add(ad->content); + elm_object_style_set(btn, "info"); + evas_object_smart_callback_add(btn, "clicked", on_clicked_help_button, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_DEL, __sat_ui_setup_menu_destory_object, NULL); + evas_object_data_set(btn, "app_data",(void *)ad); + evas_object_data_set(btn, "tapi_data",(void *)setup_menu_info); + evas_object_propagate_events_set(btn, EINA_FALSE); + return btn; + } + } else if (!strcmp(part, "elm.icon.1")) { + if (setup_menu_info->iconIdList.bIsPresent == true) { + return NULL; + } + } + return NULL; +} + +static void _gl_sel(void *data, Evas_Object *obj, void *event_info) +{ + int index; + Evas_Object *waiting_bar; + Elm_Object_Item *item = (Elm_Object_Item *)event_info; + TelSatSetupMenuInfo_t *setup_menu_info; + SatUiAppData_t *ad; + setup_menu_info = (TelSatSetupMenuInfo_t *)evas_object_data_get(obj, "tapi_data"); + ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data"); + if (item) { + index = (int)elm_object_item_data_get(item); + send_menu_selection_info(ad->tapi_handle, setup_menu_info->satMainMenuItem[index].itemId, false); + } + waiting_bar = create_waiting_notify(ad->content); + ad->waiting_bar = waiting_bar; + if (ad->timer) { + ecore_timer_del(ad->timer); + ad->timer = NULL; + } +} + +int draw_content_setup_menu(Evas_Object* content, void *tapi_data, void *data) +{ + retv_if(NULL == content, -1); + retv_if(NULL == tapi_data, -1); + retv_if(NULL == data, -1); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TelSatSetupMenuInfo_t *setup_menu_info = (TelSatSetupMenuInfo_t *)tapi_data; + + int index; + Evas_Object *box; + Evas_Object *genlist; + Evas_Object *image; + Evas_Object *l_button; + + l_button = elm_button_add(ad->nf); + elm_object_style_set(l_button, "naviframe/end_btn/default"); + evas_object_smart_callback_add(l_button, "clicked", on_clicked_back_btn, NULL); + elm_object_item_part_content_set(ad->navi_it, "prev_btn", l_button); + ad->back_btn = l_button; + + /* Title */ + if (strlen(setup_menu_info->satMainTitle) > 0) + elm_object_item_text_set(ad->navi_it, (char *)setup_menu_info->satMainTitle); + + box = elm_box_add(ad->nf); + + elm_box_horizontal_set(box, EINA_FALSE); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + /* Icon */ + if (setup_menu_info->iconId.bIsPresent == true) { + image = convert_iconinfo_to_evas_object((void *)ad, &setup_menu_info->iconId.iconInfo); + + if (setup_menu_info->iconIdList.iconListQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) { + elm_object_item_text_set(ad->navi_it, " "); + } + evas_object_size_hint_align_set(image, 0,0); + evas_object_show(image); + elm_box_pack_end(box, image); + } + + /* Main Menu List */ + ad->itc_text_icon->func.text_get = _gl_text_get; + ad->itc_text_icon->func.content_get = _gl_content_get; + + if (setup_menu_info->iconIdList.bIsPresent == true) { + ad->itc_text_icon->item_style = "1text.2icon"; + } else { + ad->itc_text_icon->item_style = "1text.1icon"; + } + + genlist = elm_genlist_add(ad->nf); + retv_if(NULL == genlist, -1); + 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); + evas_object_show(genlist); + evas_object_data_set(genlist, "tapi_data",(void *)setup_menu_info); + evas_object_data_set(genlist, "app_data",(void *)ad); + evas_object_event_callback_add(genlist, EVAS_CALLBACK_DEL, __sat_ui_setup_menu_destory_object,NULL); + + for (index = 0; index < setup_menu_info->satMainMenuNum; index++) { + elm_genlist_item_append( + genlist, + ad->itc_text_icon, + (void *) index, + NULL, + ELM_GENLIST_ITEM_NONE, + _gl_sel, + NULL + ); + } + + elm_box_pack_end(box, genlist); + elm_object_part_content_set(content, "body", box); + + return 0; +} + diff --git a/src/tel-request.c b/src/tel-request.c new file mode 100755 index 0000000..a24ba41 --- /dev/null +++ b/src/tel-request.c @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include "tel-request.h" +#include "sat-ui-debug.h" +#include "sat-ui.h" +#include + +int setup_tapi_init(void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + if (ad->tapi_handle) { + DBG("tapi_handle is already exist"); + } else { + ad->tapi_handle = tel_init(NULL); + + if(ad->tapi_handle == NULL) { + DBG("tapi_init() error!! tapi_handle is NULL"); + return -1; + } + } + + return 0; +} + +int send_app_execution_result(TelSatAppsRetInfo_t *app_ret_info, void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TapiResult_t ret; + + ret = tel_send_sat_app_exec_result(ad->tapi_handle, app_ret_info); + if(ret == TAPI_API_SUCCESS) + return 0; + else + return -1; +} + +int send_ui_display_status(int cmd_id, TelSatUiDisplayStatusType_t ui_display_status_info, void *data) +{ + SatUiAppData_t *ad = (SatUiAppData_t *)data; + TapiResult_t tapi_ret; + + tapi_ret = tel_send_sat_ui_display_status(ad->tapi_handle, cmd_id, ui_display_status_info); + retvm_if(tapi_ret != TAPI_API_SUCCESS, -1, "TAPI_ERROR\n"); + + return 0; +} + +static void on_resp_select_menu(TapiHandle *handle, int result, void *data, void *user_data) +{ + DBG(""); + DBG("select menu item result(%d)", result); +} + +int satui_send_menu_selection_env(TapiHandle *handle, TelSatMenuSelectionReqInfo_t *menu_selection_req_info) +{ + TapiResult_t tapi_ret; + + //tapi_ret = tel_select_sat_menu(menu_selection_req_info, &request_id); + tapi_ret = tel_select_sat_menu(handle, menu_selection_req_info, on_resp_select_menu, NULL); + retvm_if(tapi_ret != TAPI_API_SUCCESS, false, "TAPI_ERROR\n"); + return 1; +} + +int send_menu_selection_info(TapiHandle *handle, char item_id, int bIsRequestingHelpText) +{ + TapiResult_t tapi_ret; + + TelSatMenuSelectionReqInfo_t menu_selection_info; + + menu_selection_info.itemIdentifier = item_id; + menu_selection_info.bIsHelpRequested = bIsRequestingHelpText; + tapi_ret = tel_select_sat_menu(handle, &menu_selection_info, on_resp_select_menu, NULL); + + return tapi_ret; +} + + +int send_ui_user_confirm(int cmd_id, int cmd_type, int key_type, int data_len, void *data, void *app_data) +{ + + TapiResult_t tapi_ret; + SatUiAppData_t *ad = (SatUiAppData_t *)app_data; + + TelSatUiUserConfirmInfo_t user_confirm_info; + memset(&user_confirm_info, 0, sizeof(TelSatUiUserConfirmInfo_t)); + user_confirm_info.commandId = cmd_id; + user_confirm_info.commandType = cmd_type; + user_confirm_info.keyType = key_type; + user_confirm_info.pAdditionalData = (unsigned char *)data; + user_confirm_info.dataLen = data_len; + DBG("cmd_id(%d), cmd_type(%d), key_type(%d), data_len(%d)", cmd_id, cmd_type, key_type, data_len); + + tapi_ret = tel_send_sat_ui_user_confirm(ad->tapi_handle, &user_confirm_info); + + DBG("tel_send_sat_ui_user_confirm return =%d", tapi_ret); + + if(tapi_ret == TAPI_API_SUCCESS) + return 0; + else + return -1; +} + + diff --git a/src/winset.c b/src/winset.c new file mode 100755 index 0000000..c7d5087 --- /dev/null +++ b/src/winset.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include "sat-ui-debug.h" +#include "sat-ui.h" +#include "winset.h" +#include +#include +#include "common_string.h" +#include + +Evas_Object *create_waiting_notify(Evas_Object *parent) +{ + Evas_Object *selectioninfo; + Evas_Object *selectioninfo_layout; + Evas_Object *layout; + selectioninfo = elm_notify_add(parent); + elm_notify_align_set(selectioninfo, ELM_NOTIFY_ALIGN_FILL, 1.0); + // selectioninfo layout add + selectioninfo_layout = elm_layout_add(parent); + elm_layout_theme_set(selectioninfo_layout, "standard", "selectioninfo", "default"); + elm_object_content_set(selectioninfo, selectioninfo_layout); + layout=elm_layout_edje_get(selectioninfo_layout); + edje_object_part_text_set(layout, "elm.text", SAT_STR_PLEASE_WAIT); + evas_object_show(selectioninfo); + evas_object_data_set(parent, "selectioninfo",selectioninfo); + + return selectioninfo; +} + +void _satui_geinlist_item_class_new(void *data) +{ + ret_if(data == NULL); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + ad->itc_text_icon = elm_genlist_item_class_new(); + ad->itc_no_edit_text = elm_genlist_item_class_new(); + ad->itc_editfield_icon = elm_genlist_item_class_new(); + ad->itc_ok_icon = elm_genlist_item_class_new(); + ad->itc_help_icon = elm_genlist_item_class_new(); + ad->itc_2icon = elm_genlist_item_class_new(); +} + +void _satui_geinlist_item_class_free(void *data) +{ + ret_if(data == NULL); + + SatUiAppData_t *ad = (SatUiAppData_t *)data; + + if (ad->itc_text_icon) + elm_genlist_item_class_free(ad->itc_text_icon); + if (ad->itc_no_edit_text) + elm_genlist_item_class_free(ad->itc_no_edit_text); + if (ad->itc_editfield_icon) + elm_genlist_item_class_free(ad->itc_editfield_icon); + if (ad->itc_ok_icon) + elm_genlist_item_class_free(ad->itc_ok_icon); + if (ad->itc_help_icon) + elm_genlist_item_class_free(ad->itc_help_icon); + if (ad->itc_2icon) + elm_genlist_item_class_free(ad->itc_2icon); +} + +int _satui_create_notification(const char *string) +{ + int ret = -1; + notification_h noti = NULL; + notification_error_e noti_err = NOTIFICATION_ERROR_NONE; + + noti = notification_new(NOTIFICATION_TYPE_ONGOING, NOTIFICATION_GROUP_ID_NONE, NOTIFICATION_PRIV_ID_NONE); + if (noti == NULL) { + DBG("notification_new error"); + } else { + noti_err = notification_set_title(noti, string, NULL); + if (noti_err != NOTIFICATION_ERROR_NONE) { + DBG("Fail to notification_set_title : %d", noti_err); + } else { + noti_err = notification_insert(noti, NULL); + if (noti_err != NOTIFICATION_ERROR_NONE) { + DBG("Fail to notification_insert : %d", noti_err); + } else { + ret = 0; + } + + noti_err = notification_set_property(noti, NOTIFICATION_PROP_DISABLE_APP_LAUNCH); + if(noti_err != NOTIFICATION_ERROR_NONE) { + DBG("Fail to notification_set_property : %d", noti_err); + ret = -1; + } + } + + noti_err = notification_free(noti); + if (noti_err != NOTIFICATION_ERROR_NONE) { + DBG("Fail to notification_free : %d", noti_err); + ret = -1; + } + } + + return ret; +} + +int _satui_delete_notification(void) +{ + int ret = -1; + notification_error_e noti_err = NOTIFICATION_ERROR_NONE; + + noti_err = notification_delete_all_by_type(NULL, NOTIFICATION_TYPE_ONGOING); + if (noti_err != NOTIFICATION_ERROR_NONE) { + DBG("Fail to nofication_delete_all_by_type : %d", noti_err); + } else { + ret = 0; + } + + return ret; +} + -- 2.7.4