From 969f37c04504a239fbf276b77de7fca382dac8ed Mon Sep 17 00:00:00 2001 From: Jinkun Jang Date: Wed, 13 Mar 2013 01:38:14 +0900 Subject: [PATCH] Tizen 2.1 base --- CMakeLists.txt | 120 ++ LICENSE | 75 ++ 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 + packaging/org.tizen.sat-ui.spec | 64 + 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 ++ 100 files changed, 6595 insertions(+) create mode 100755 CMakeLists.txt create mode 100644 LICENSE 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 100644 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..8655120 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,120 @@ +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(FILES ${CMAKE_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME ${PKG_NAME}) + +# install application HOME directory +INSTALL(DIRECTORY DESTINATION ${DATADIR}) + +# install ini file +INSTALL(FILES ${CMAKE_SOURCE_DIR}/data/${PROJECT_NAME}.ini DESTINATION /usr/share/process-info) + +# i18n +ADD_SUBDIRECTORY(po) + + #Idle_screen + ADD_SUBDIRECTORY(sat-event-downloader) + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cc8727b --- /dev/null +++ b/LICENSE @@ -0,0 +1,75 @@ +Flora License + +Version 1.0, May, 2012 + +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 Compatibility Definition Document and passes the Compatibility Test Suite 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. + +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.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://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..29a3c52 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..9315946 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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 zcmZ`rAxYWktL-=Qo6f4mJpCGr398vNu^uqkWjk21OWjl0TC%_5G3#X zp6A{_?>sX*^URz*=gfP)^L^iW--*%EP$a;m!36+-Kv_vn2Rx(yJFwy4Z=ZzK7F z#r=-;i=ikX?0t0X==FNQd#Abfi{D@FKF>>RRh{NGOk#Cok_y2^x&y@64Ymwkw~P?rGDuwf$>VOUP5|ONgNF@tt7muf&_&%7?aE}DLD1ol zZtrAaRctgFAmyJRQvygSK+w4v%(_4U3_y+9SZ@GYoB)a?`1cHe&b`bGfB>d%8OR|8 z$pC`%d9)nhAO=)T8pO&2MmzwSooc@b@SPLjQ8u(w0&1Ip?g?VNdH@?A;L(nbU;|(Q z0BV?#(H98M1jrOl48@P1)DUm6gGgo8i?<*}rcIX$op4Y?k&PAF48A$w{CwaSv> z>h;T{<_i%ZT00#FfP!Rl@NG|TeJ2QOCMKRHG!j~J?smcNA6r{*+-*))x=R7Tx_8jj z9S3&<4O$G2cDXBJI)FJ?;1#^Qh_kCFlKKo3>?|6dy8nlbd|^_{!oudSU*A>wWlXI` z4Fm7&do8;SZ=L@IiQinDuXX-JhVYq(D8eq+ddJVyis>d(aKf#Ze5k!qz8!?hhqz6$_XEw4HK_2LM>eA-VKM8zhIY0YI)GguPap z_N<4BqZ>}wgSp&;cY}HwE`#jvl_8eFwMEl;qS&fJWmqG>)Y7w~xW7r!3v_EcM5ekE za`oyr6Fze%y0XH~>tSsV!GTE+W0P7jEJj1DV~rRSuqiVmE*W~1U=QMuh>>VA?Z>Lg zf=awPv3dx7CHj+Ro=}k}GlkYp;nvqm2cpG93E3f@?rkb8{(fg3uE9Q;I$;i+RGYE7$5r^1gEX}U zRTynC=QfjdKClNN^4&O3VLmbltB2A`MruYH-<8S`bVvb`MI0dr{^=@|FYfWH{ni?ytUI{J&^_F`Ss<=2}a6e7My8$*MEzs6xF-yeY5=f1bf7 zt^YntXQixAk3=xhM5em1QRky}R2iwj%Pf&EVHC=$#nnacW@sEJ9WGvc-1crIS$X$R zBmJx4^w^H#cKSBPnGZfeBzf3Sv^^_zHWe0?J+%+j#|*U+>X|s|Aw3=;-o1>iOrlIT zeIxcp_SfXeqqy%>-Z8(UW#`r_uPCYbQGus_sz0WeSZ<*kSfilNue(u>^DV7Xzam#_ zPnTBLzFe#i0=ipcV-@EbPhoW8Y_#M;R4xXkg^z}aFgO+O8a{Xurf_LGga zL_n>D_qmxKcW z+)@hlXQJmdToq2mw1sVQK3%S*2N`*t7U(=Rx6&Ve9a~p)f!w!xw=P$u=Zg47@CJM& zd`1@IfHwr}YF9yvvkQ*+8E`#rx z;mi!os_MJy2U$AmEhTIvVrpV)Ltn7!Ha{a<@|Ahe6~Deey^{6!?J7In^Tf_`R{m~R;z+EWi>GePVzVnU=tOrh78{;wIj5+p^Jp8u_1*q4qkXpttDP7JLM-R!Ama2WoR zRLyX)l`)Y#@q#cyD`@!98s5?pHX`dlpejQO@;%Lo`iFEm}kP?U6Jwdl^MM(+Q~$Qv$AEFMY55WA3S^ zQ_T5vZ+Xi{?>ey+XL~JrnKV4NFN* z@{p-uP)}{N-?jg3_iC)_c|`r)fNNY6_rrHsBTfxTRhY({xQ#L;+j=If^Xypl_RkIN zy1vAWilkNMJ^8Xf-Y~k9B$RWQf4~2r_rZEfV{xRaAt$}j?~W=*k$Q0tza`uaa?B@@ z2JkBJ=GaDdms!oqeZ%ycpbln#b*B)Ep3%^r&k(0QJbm2Fh`_z&`F(RuBW~l>&sJBF zxwI1GF|jpdOO)y4!QWYzeK%>N+(x@Hm*0LWuk3HJowS>_+xh*2GtZPTts?z*I-x7U z!r~`_RfA9a=YQpwxYNI|F13X<%C@}k5^rvQUOF=IMNCrfgWj3mmEO~X>6On`^Ovqu z2ebk0e+B-`E}6Dp+)9jeF6l$`)o1NypI<9qH(W^8#8m8Drd_+3S8KR<>0{u5RgFhMF<@|o_T;Qx;JR}fZd=(#1 zwT?CO=oP&^J-4Gw)=8E^wrNES0OGjS}EAaXBHSVBbPr=;iY&P}Q8r0pbg9_3xp-B=AJ1$WTp?B4vuRK`?c z`bm0fm&@zo+uiOx>W@or`B^`AD@Mi+^&@ce_cMqO-0N^DL0PLawKr{mYDBV&l z2NVE+flOIWTF-a!PoST-*=*+4;g2T0cOTfxRVrPS(`tWV9>H_b7?7WYzmTc68mYf> zZ0)wg1ty52x_7=RxGFOAB{00QuKi+7>hNbKcLrvcfZ-*&vNIA63*%L0hD|4Il8=~F z=*2k(?sc3hcBE8{rkLqhln#9JnRq!eU1|98@S?5Dt!1?>-F-qkndsx!QDQwnD;XDH z*MUgMvjb&Hm;iY>Q1F->(E9*I$Nu+_C?tBo>}Jl?jWZ*`<$G-i6hSfEU>WlgXCwe` z(ti^$`n#9y);aQ9Iv=;SCgZGAIGeutYPZs*g_{BS9)&9fAjFTlF;rXI+6?EveKXs2 z7hc4aHe!#pCS~YXWIG2Cb5E#jw1FI6ir+a=1btM3>Zesjto9FL`s+G7J0)Ge*RIn6 zGmiMc24#;-Y_nFEFay$b{by(3^&FSUr)_R?uKA%HjjeZtQSa+2Dsc7n_1%T(z�x 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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_call_busy.wav b/data/sound/stk_tone_call_busy.wav new file mode 100755 index 0000000000000000000000000000000000000000..fa72d265d0cd87d5ecda0894e3eb7346831dc09b GIT binary patch literal 440950 zcmeF)>3dbxy$A3!&+~lFo=$)WJcdxAre&5~3KtM$3PY8IS_EuFCKZarDM&$O5>p9M zZvtA7K@fyoC^yIyYAjeFK7bMSbmn=U&&l2Y!+m*w;mvu$oAudiul=lNeb?_dZ~D}! zuU?e!7ENCGyA`WnbLx0J9-sR+TF;gRtLbB_hFEwR7j*onN0{vNa87w`$h7es`xJD+e`oL=GpF_Jif3-Nkv z1-b@lbUbZOSr1x%WjnM_Hrj5*f<~)1ab2$BLQ%bBs7$Q*S$SB!OsmnKFpM#s zHQTJKY@PNij_;8!bO-hf-j6RP{+lQggtOYIcHSpi2?NoJKfv@@E&3FKI6}5Bt{ zP4kTZ&>M9xX!fgaD#9{_v`Rc$SkIq3&{SSqd_Uijy_Sw8hb30WzKaYAw+9CWF8kJd z$9r(M!!?p!#+;zd^k>vWibs*;FJz8WM$Sgqh)d=f>uvQh{)NFup*JGV z*n{}z$+hX3*^zmBQCiMd0=#}fujrhlUG|z{no6y?sa>a68b2|~EiYTYwR!CVM2H5_ zE^H-U#Mco&5EAEL=OCxh*+VoFNqi}O9D9tWk%Z$Xd#A0znl!hVQidh^liH;EN!1d? z7TJEuNl~}p7O%e&D3uC^{K)KrbZfFZE{QcpZiFTUZ~52whI+GZ(nYZ)W;C;n&QPt? z2r5nXlN2eS{)6hIF#0^*%#3G;xoX|BJ@0$(`F%@ldH;&MMBT-q6(O?&)7PhE0u@3)YIQ#xWTgk75{$eT3VI9YjB&#3cZMYMg8Pd9`+8yf4O21qwtCoxrO&2WUt*E?S z+Ft0$b!R*&Te2bE87+lZg*<^xey8t|=d8QKb(HO8WXy~71L_qDqe9$lbCX(X5p{{0 zL_ekvFzeXmuC?wq&s}e|e^)>i`Yb#l8jhVzY)Z|})aJ|uekopN2m1IoglEL<(#`U@ zN?c89_Ue9Z=rK+;e`Ar_rrFmx-a12UCnGhEitU26(GoVjY`mwh z(Y>KLt6~*$`B3RZ@f=|j|J8vl<(8dcVo6ulJ=D9#cgsI1cq7ypk;J;=t;q%H zky%5&R0x#%E4O&vf|H{Ck}a|&iYHY`^-1j#eag^cN}3z2owlFs2}c@vj2_39;z_)j z=plsMyEE7+asEK8BZ~M+ybBAWLR5fw?cds7w#qG^n3TqK`kPv{W}50XMZ4^rq*v50 z2=MY1Y1v*JnV*?moBllcAnuI45qT6^7-amdzOi1JC*q2*a&{uKhc0vP|5H?sTMI~% z$E^#WQD*uCy^I;jI$XGWyl1`lvTsnJJvb!%U1W7^SR$6ZmhQ;DpI=*SD$gCL=Z_Xv zi51eY?51MB>IIEa_YeI%<9*X~%a_)W4RJh$)S`Oq0oIChYZ-B$P;+Y=;Vg3N++w01 ze+J)yb)nxQR~()8RW_UTta*&-gh8WUrai3wSt(WwmDNiYidG6<=WVU*D}7nGl%v>p@UNAQu{_r^r_8?8&4e_*F#2tHaOjJ` zSijqQ#Pg1OgX?Yf?~IS0Mqi^|pbV6k8&80=Q!A)D)DpT(cQXgry{<#r zb3?B1_UO2HInkRslxfX17Z#VMSH|*c1gJy*){CIMqT$s1|w{6J_qQKf2s*llOUFmw$Nh>(K8a;pi9fRmm}F zV>Xi`3%5$$l~cSG1Fk<2YO07O!J~@kK&x{j>Id< z3#5F@Ky|sUI5WR8`%(HrG8rEe+Z{=VUI}LXpZcEl+C3FlnKiT1nRZ%C@1~xn3gjd5 zF%w@R7*;m^$%O@<@7Xc2$0UvA#Tdpqg(H zio_Ag9oY#*i>h8z&>qr{GhQ)`w(PY&w8p#tNOxF!V^_#Wb>a?;-F-6uW*&x~~_?XvOIbFJ1c$mv( zu=K3t2l2k>h{&fQWAKoFnor>Eb6<8{XITbgUZcI#Myi^MbF+;hWz;O{YpRy+rQc%~ zu~S{oxz~A)drQ7Q1|A2S!^-Hz*v7=Q_+$3Hmt(QBLKGkte zlTKvVZ*-WqTPW*b`z*&YWHDNY<*?83VZ{r?*-3Z_j|6L>=`CW&!Ky%KTsCR&yB}VTDaf6)EqiVpJ8^g@45E6FL?6a=lmA~ zV?+N6uZdR0nZ&8ow#>@h?83NGO$Fm=1p~sM_^$Mfe7kbK+Niyzd&!V8t~d8vYHiK- zJ&uFOZgd4U2)}|);l>ar5N!Uh}`kew%0n^a>X>xct~H+)@xc+Clq&N5s64_5mxg@ z57d|E7gy!CW{;$QN~#m{V@D#YaBEN|%4ip%bK*88b1>whJf4(*PNi6!F~k{_j4W@qN>iq&PyfRvvXctv+4 z=VW^nFRF%VDD4OO!Ny}I+|pw0vE}Rr#DHeetJqpx$i4qR5;ATrsB-e0SBaO1Aiety4`Z<-9NhSvQcIj(?WA=88w_ra%&q+in(>}C{;~=M{i`Nv%hgo zayNPQdwsrHft$ev;Y6e(wlwiXs+fM5?am)7wwFH~*uq~ed|o_7S}h+?+*a+;Ox1<- z?;1ts4VGJ0oqd914l)BBj)k!{yoy_&Ny5O*Hq@Eo*6o=@FJ6PM#}1;$kxoa8z1|kJ z{Kc#^wHSWU)o5Q;A6DL$N2M|eDyk8T4)$@dkAr<2?Bie`2m3hK$H6`h z&g0-b4$kA?JPyv|;5-h_e9%ad1Bl?#IFXIJh4N_v7Gx9NdqC`*Bd` z1nQhXofD{Y0(DNH&I!~xfjTEp=LG7UK%En)a{_fvpw0=@tAu)$P_Gi|RYJW=s8QzF$N~l)}eFvcL0Q4Pzz5~#A0QwF<-vQ`50DT9b?*Q~2fW8CJ zcL4gwLH{`D9|!&8pnn|nkAwbk&_53P$3g!%=pP6DW^pAr+;Lryg`hY_paOeXL zeZZj)IP?LBKH$&?9QuGmA8_ac4t>C{IKD@^P{>t6t`c&UkgJ4TCFCk0R|&aF$W=nF z5^|N0tAt!7Fa4{0wQ`I)uQ{fB*6_&qg1N_n*p}GeaqL9iMSqXk@C*0^;tL`| z*qu)}Elw|SfEY;}!G(A|wgO#)G&-KPr>qApzcQaPqJ~Yn8ycayPT44Lk+zAC3cL6{ z1AS#zF_+ipMrD?!K2G$-hD2M#>ENFOdVjaK)zjo|a4lzdF@1C$eU6$(sVEouGZ`VP zsC5)cHPc4sK69Qu?YicUc}Dwo`b&YgL#D{Z=-T+GBtPAsxs>~|u&=bW@;Yy&V4XY4`z^W@s}%VF-@h`+|;hq zD~+F+{(@4VclfBc{ zU`?7^Oew<>{Yh<7{iJG%VvB6QuvQ2#-7QW$-nZf3@_!(6rQ*`D{k_k6z%oDPl; zKa6aP)hCoGGJPp~D8I9~rTpqZ6Mv3yqIjrOE@u^IRc~l&bocZx8^fkX%LQx2R^ynA zj7Kqy#XiFA#15jL&~md4cjkz*#603IUWdPheT7~`zH#ifH`qkhznKS_+6-ykRP7G+ zWu;%PlvPW{h^7k`@m5q`FKsV$2b5vjctn8^SZojiGr;|>BTnOLd^WZLeG6IRm}ZySzOhU-_ZWX|*sCKoxO%Q~v%Fn;Mtnoq$7cuP zWq!$AsLjpJY)YL>gkuw;pM_PSU4d%nU37{!t13Kl|{Vif-$0MiBjg5 zUsmo=Pt~S%ZH7UnznMkW2HS4?H;#+QSLj<<9ex*|$32rAfpg>0I{Ue2WhXwuSq#I* zqmz*uN5yu*+Gq)zUN+v-*XZ8RoK>+3xqPT}qIiz5iT~=rmh#Txq5P#RnO3Ii6Wd}B zBjdxTgTD>j^S$q#?WuJSbB$-4ne#M8cXD$~KvCR$OOqqGxtF1~(W99XL$RbQ>mKS| ze#sWu62+6Mr23?Gi9Tg$F(u6n z)=t|`_JkviJVuXWOYtP$O!N>!?%f&elsJDN))7T~CEkSvQ6VZoy!LNxFI(l7PfSYV zI{i(pS~E@cnxb8HPSPvt7X*0uinMGmj?B-@u1$ZQd=PiW-iSO3EetaLR^M2!%oA}% zSUEe9*+ZAP_x~v>$E^h<$>Y|A&nPo}f?mdqWF0QtJ>Ik4d)YTA&>kET{w}gQHY^cK zUQ2gm-_NftHkIcN)bmFRtHcUvSawsfU-g2c)`zo8wde%I~bi$y~FVh}Y|Ev@%hRW(C z3q>mhuk*H6_LaUYT*~!l_~}u}wegElQ{?SXDX`N&+86U&bDwsdXYVscrkN(W^|^|Q zaI?)tsivHXq=T*DA<@3r$BCt>Q5k(MmvLs&5nGSt1@j~0vxZ~3yk?Agweqj>^U~X5MwsC9c$x}c8daE) z`%`9L>SjV3Ul{#1JUH}4V65NmJ>q%Cy}|W1`*+4iPou9M+Nl-P9cl?( zrn{K~>|WO)_YWSGZ@K^9fw>`9czbkQyqxGw9m=%knhT3d(<@_nH3C#5lSHMr<%gB8 zs%x~r=voX)(_hR{OTDed-sw1w97NY+HFz&RllYoQ5hynvgOen76IDbT9>#`aGtfE6 z1c%Ok%euiLGQVpK>8I-UXl|k%e2O?#d}%r(lohP02FZ1cgrZK)p}5bvxtmAa~FXYylp`Um~s&JZF`2h*ReLk=RHGiM9AuEQ=aY1Cq1%*jlW(<(O%( z@dG`j9j19vwMTJIc1PkB zTtT!D_Xs8T_Bfpt;(v%Hg2iXxZP<160dm)I#{Q;lg!P~1Ii~A|q593*ZgpB&rI;dX zlxz@f6@1L=teh@gEj-L+Ggx|7@`HF^bVTISkTH13Kg}ob_PH;+uCpwIF|W~HY9m!m z#ktwWkTPl(^)*#X_tNh%i`c2I=iKW&$Gs)r9|Mnr&0%HqVr*k#a>|-XXZ!Ovi(Tcf z1`hB)6mAkPlh(@}N}uYurb#C<>^C~h+bxuJuzi+e8L}9y!*bZ?_%PxVf+bAcY(t!J z;wxebaRncQufTSr2a!FFW_zuz-?HAEGQMQErZZ~itG6r9$nQ#n;sK#nfbnW7<4Us& zD|6d2r&3I!D!wNAukhH=#lUm^y!V1$uZCoSCXUTO}V zq|Y!r+4o#~-4{H0?{of(fw7@~h1W!@;!NUHYFlPyZgyc@siuPQw1NR)P<&Tx`bj5dcK z2mcr-`Hp+nd7g7mbuD7wV|wXY`fKi)$S8&zPn@jgo|Tt+jm8+3xz1j8^|=M!X}&{# zWAM|^h)7@bgZQi@md<7#=B^e_mpUsS^R@~$h#DnRWL1i^vRl1bJ5+z&Fvs*y^9bvk zwlns-jt9tfv<;hqvv?CX$0~%An{P_zJ#OwPh|TydOoTbnDn#yhXxnQYZMk9^XFQ}Y zXzMjCsuPMkvWP?^wg{{FqX+8C^NXwUTeC;fKPAA5G3(1et zE3-56b;atkWkAZ$3%sH`l5?^>iWgPGG?exO{b1uU6K-j-_SkZE17bk4=v8bjF67?- z9|;+^7F0QT&a1>rL=azqcVKr=55hRE+jrR}TOXTOntm}nqu-}}pw_7-D3;0IlV{sW*h2EaqIR> zq8G2h*JB6K<4C8Y#a?fVTK-~InpzCM=xVgDst+q~%cD}61Qpc?#`30D7MGd}t+_*) z-c&g;F1|hL3eOGwJFwiZ^8MgB z+w2C{JMJSMw|A`ni@@N}x8a3RY5ZnlU+Pbp8M#pfyrik{c(9LyeH`rLU>^tjIM~O* zJ`VPAu#ba%9PHy@9|!w5*vG+n9Gu6&c^sU_!Fe2<$H93VoX5d=9Gu6&c^sU_!Fe2< z$3de9%ad1Bl?#IFX zIJh4N_v7Gx9NdqC`*CnT4(gmhofD{Y0(DNH&I!~xfjTEp=LG7UK%En)a{_fvpw0=@ zIe~hWP_Gi|RYJW=s8QzF$N~l)}^(vw70Q4Pzz5~#A0QwF< z-vQ`50DT9b?*Q~2fW8CJcL4ehK>s-C9|!&8pnn|nkAwbk&_53P$3g!%=pP6DW z^pAu7anJ`G`hY_paOeXLeZZj)IP?LBKH$&?9QuGmA8_ac4t>C(5BT>;7rFz3TqWcx zAy)~xO2}10t`c&UkgJ4TCFCk0R|&aF$W=nF5^|N0tAt!7g_`GnKr^b!Y%k;D;Ph}UB)&^1V-<7s=!deHJK^C=^0 z*rdCm5vuEyjq(<0oA{`(i{CTQS9TS1d3|nFW@+lAYjgLz5 z)BTxCxi1U*N?R+h^HvHLis~gpWn#t8%ERhqT8;jMVT|dl*=Aj3>$G2Se2;XYJFsW) zeta?U-$aohoYhXX^FGl^7>HK<0j9@l(Wel^5wd-0oo=~rnrHln-l%&)vtM;n5tb>W zRpQaYdj8yjrt;e2`}vOSwR9{wEU`NFU1UhOJvbzY)DEgl?V%?!ayG(7Tr$sCZ>x{-FAP2ky%BN79>hOSu1(L(j?CMO(sI5M z;Pnf7Mdu{#vey*TRBFvl?K-{E_=!nwdD;4{&1)ARLNthWVJq<>zK-~TkT?fB2RVh# z9-^5@;!E-4*kd$}Bpg54J8cctq`AeEGAz-b)F#zWs+K6W$o5N4in;~2c>R??sZ=oJ zM`jnKTa(>!Nvtt)BQz;^%fH4q)SGpaE{ZKNqnT}VhH9loP-(KCq(}kvA5*V)6vJ5TBiv5xAo>X{H`{P$jyOxqBktmL_*>Xl=tblk z$8LLrO=SI>d622ikk(Dr?oeM=`sGSlwPcKFx?mA+MdkI<_CiOlJL5^&k`3|BXeqoZ zECJ1})|0#uFkjZfp;z7ik&O%N%7pTxZ>nJWk&xzbCLNR0?-S8{)R4C)J(l z$ZapYURqIE#G5V{BdV4tWq$c(_QdJgG{mPimLwQ-&5((%fL}wEbjHIMT>t^fI;FKCRqf9U5K z@0+GuzO;sHh~p`w7S&@9uvVN~%ZU4gnp@ilXOUay78CvWGx!dy3;iCs;^?%mve~R> z&0|a_3>y71?P2xLO0i<7tX{HEv{LXoZ);^=>C3{UTz`h29+g}hzZf+|-VT)lJN=`5 zG0!#kY1eu7K4WB>X_8x?tEdP!+gzlITer_qb#x!Si&@S#xSHIpo^G$+|K~tD*cu)Z z?TdY!SehD@(dTk`SFx|$Gtk99Dr^(CNE_vKN}>9OW|IyzoHG8(e9)4zK5cJwtU*?w z^_UPpf{*0BH(tWR%{IF;!hMG(5EpP8{(J0QbSLtTV~HKH^;ljoKQcaRIHt>M#;8{- z|0+K(y)9;h2|kafsooPlbscj5;8FRO`~Mx78*+uWN5{p>iQd$qOlz*W zu(&k6GL}~(Kt(c1RC-%}Sox~DM*EAd#h^6(#T>QN+gj|Mj^oHdbUjvs_u?~&uZa|a za^o>LNn$rqMYQ2zY&bRpor6qp=wnFbp_&{NuBnio}j6z61jBwkToAmv*Is>^l7nfaC3kJ1;C z$@rMq?npZHN-*pH)c35{?y0!SteKt8w9{gGH}y1CARm#B$uc>XYNOQjVY-1C#424H z_miF`?{S|x&>B>Qk3{Cj)QO*xN77rftMc=U_2tn6)qIOkB#ub#$WAC)RP~yI_K<#@ z@rr4*Wv}(2P41{doTv!9g>A+aL<@0`P;zgN(^(<@hiD>LdmIcrC)B0!(29lrDr8Si1$TDL_Q4}gNOXn zd;)Ku`?Bjg%Q6`A8ttVvQq@$Pn{5m!qh?WGQ?+z2{T{Q3o$7kdz0PyoTk`!e@Hp5U zRz@$zHYO>eJGSKYz2>RsL$=0RKbbCh;<9z1*Snsg7%!bRxrkqr<%2LRkmfXE~N3 zi_tnPhkcF@BR(Nm!o&+?SONMJYqjtV} zyYh_ut~4kf5NZV&uck7tG`p}ew=Huj#U!fYYoh-Oj}2W6Jm=4QFL?I4-*fF`&oD`P z4&6)rfwEA3ZajX{!u{^0=Fmy{46~Dc&$ZWm!ISqs=f4;j8~RsxO|&Y`Bu=HaWme{9 z7si!pDi}{I7!U@{pUzq{lT#ZL7h}q3bNF%akAaf!xObiBIrmi8BKAF|m#(G1=AMa+Vz}|d$!hLd zd8yZEjA5DU>}6M@bPZw~n8UQ1ZllIhW$xX1L>9=Wsoj*AZl|X+X12^$Tz1d1 z-cNm5|0}_CXm?~xEE&I${3yLLJ2PKbtS(yyr2M?VE4m{&C)=ZVQ8i3MX+O{pHXbwK zmKJM|EoV0%1~iLa#n$3N?*0Ffka254m6PYZO1wk_@dbDXb_ew!jN`g}mu<53v3aHG z7sE69ecA_Vooa$&ne0u;9#N;@6tBB-t3(zuIb(KAdR6j^csTmI$k(Ca!7l&vK9kq& z{?T=pjWWZS7MfejsNqzSTia+-%&l`rscQN=dLuKP{f%pqyUDZP>+{VD+zc)VCn6oO zrHLm}#q`5$cm7zhz5L<87XE7C^WrJeYWaZTwrY=NsxG8|*C;Y?u-vlh>=PVwkQwN3 zER40`Rowba5(aLzq0SVyZqFoo@fv(Rb`U*|bUIq>^|q+xFJ`5w#qf)+M*FJzu=2J% zDwRo4QH@|MZ+c~MskzXaJCx~7l@sIQ+oP`V+|a)R%l#_f51vEry{-dnH&dpU(091+ zjhzZ`v&~ByxbM(4Y8vgM|IWP4Zg9QhKH_nE$NIkr3=Vx8UKo|eZzlGo{*;-K8&$wd znhK8x`#9Lg!9EW5aj=hreH`rLU>^tjIM~O*J`VPAu#ba%9Gu6&c^sU_!Fe2<$H93V zoX5d=9Gu6&c^sU_!Fe2<$H93VQzF$N~l)}^(vuWCDf~g zdX-SG68a86-vQ`50DT9b?*Q~2fW8CJcL4ehK;HrAI{W^pAu7anL^w`o}^4IOrb-eZZj)IP?LBKH$&?9QuGmA8_ac4t>C(4>J}>>N ze6@0nIuaex>}9KnTn zJ+=Z}gETsxwx_HIEx$6KGNOh}x*Hmyx=z_BZ;`f%j|#i^Jp+AZS235@=SF3gran&e z#fC&%!|C9k1A2eAx7E|+Zg4GUcQJi*9es|PN2w?m`7;?ItEhDpNj1|(=00XDn`xVFcNEf;Tdj{{v7Zd+Y6bZsv?NmGO6Rm`SXvH63daM?G3PBtp+n3hq zmiwl8#((IIx)(J2RW}u3nL=769xbfr&mCwguPwfx@5o+D$CASmt7G3qhJ@RLg94X* z>%HSWxZB|x$u46~&}RBGY9hs>Nb(mlM?OXEpvu%9dLkodBW%Pa^NjVj`WXMh;G@tR z5ohc{{PX16^vvwYyuBzb=PLnTzo1uiPSP%WO)*WS*4)&t(<_ainB47F5-;NGh#v@vbFg!eQ|Rm=nu#R76hDqVM$<^b@sqvN)?iJVTTCg#68%YSQvIZA ziDHXvzvQH-TX2ilUkQ{-1w(#hc0sx|*&Ua}8Y4GClY+PWYkWh!SvTpT*b+0E*+yrm zR%!&5Ci_W>6j1*`by668o^EEwv%_4q?%AIAz4v^-4V(^+4?m1-i`6HTDKdR2dnmuN zxTXB+KoftCaH4pqR4!)~XH{=#YIOJXFB`+AM#}|j#a82(jEqMyjKw~}?ZghEpU`r% z4R_{~hyycbn&~x7xoepbC8!o)8VkP9`>`W@l=1<^sPIFS7%E{2RhE;&$m~ z`CKKgCN+C?zc%z3r<%X9NNv;XYaDMO8_?O98b6KK5&uO52rD-pt24m;t|Lz4YJ4`f z0euTu&TLAZOoU?- zqMwCTp6_rK2>4Gt$YKcd`!|k@$XDoFSRH;BpT|9u9D#G=(K`FNXJsco!dVQ%#-o#w8b`%;!P;mEn_f2F z)7R+U(41AV3b}l!bfS2Uu!;Zbz?SmP;-UPdESXlO>J!^y4^Oh8fGd`pufxVe|1w$Y=R5<{`1E9)NWUE{mupA@_iYK%x?-SO7s zg7nC&Azvy4O8u2vyl%ls(SFGm*%HN*s-*g)c8NY^XfY+t4c1QEPxgc(jXXw=V@vTQ z-c0lmLhjue?36fvAl4B@d?nt61yLa?K)m*EZ7*BpmQPGd<2wCKty(ip^_rqxc23eO z>K6of`HHk`FOJO5%&tv;o_r8@#@>iL3M~vW{#M^uugnv1MOZmIk=a9+x%dAmD#xt_ zB+28}h0iE6eS%)bjAR`y+&$j2-h0_MD9|1p681+VkAR`!*?EL_U< zXZYz+$+hu|QB&mYP${s}KiU`bTyvjxooDYeMy8o2x%IhK-#Gl)E#OGU8cL41MFVcA@>g+m2bKK z-+{RyS9p7LT)dpNg$K9l&GND(ME9)pu4b`w=Z8y?1nV>8e>$OMPZe#^SSA~L^g4C$xp z_GoUa1{BruDbnY~tA$(m9}cvaj}^P~53|Me6RD+%j#whHAbc}8E8z3(_cnPZxqsuD z&TeGBqpRto)PGW9iss&)BsrXFp(0cZJ&cJmciA6ZZnw$%ysyhYJot6!cad=Pi}=uOEo*#w17^+3H(`;7hbBI&s{E^s52#K}$RV<4dPy>>)_t;vjxaF8>u<-*ur5&buQME^LPIgD) z73Bp|zGa}gTvwc#UzzEv9!1pyF_o)M|K~?xjWPVJY_$hfLy*0ZkKfhRC9z9Ua zw+Kbzh~$p!grY@NuPJB`>Bkwbm_}RnS|8fvjw-~7im+SQW?VtE5cdcr_x3oQ72#UqET`fG! zWiwcMR`P>*Uvxy|(~vQE$Un^|@bH;Y~6uLchAKNM~fFO$~G9ZH|- zxTZ-bGVC`x%-b!Lb+CPwV;Qm-t;2HI=lC$<6M`j7+-yUfapEgt3ULJ=gs;GMqX&^a zj%ItUt>3cVoHD*-xTZ5|=c~6X&&cmegW>_9R)FzpD&tDC3oCQmGN)2ZqAI>7`mgZV z(8a)W{=D~sXRrG`*G~2flceX+z0@Bl3+3m=<0mcL?_O#Soutn&JK6VKd)*g2dGB-n zi-EDBe}&gXtKv-JRBBshWo~w1T&bpl@w9>gVNiTmdPcroIbUtmUemo~NEz3g`z^J$ zX8Rt;L1Z_&0vm*1!KZLzh!Y4m9+Q*h#x{)j9M55O*kW`UGRra8PFc5G9OnH-k)cU< zT;o$Yl=bpu(oNzIg$MXw4Rn=n7W?z*tTi(^wJ~uqri?a+9|!*!DEW?i*Lj|EPjxL~ z-(z~|TKa45naC)H8&909=AM<8dX2^ymbuPecJ;Xh-f6x=eq->{(1=K1^n>`UB$m!* z9_FqVPM10>AM>^fHi#M}Q)E?&w6a^hSvypJ-7v@WPxA=to3=CdyN(CQb+iqefwOoM zH^(Z3lbdf!=RI!jDTvMZElh+t(JDmlcxc;e9c{T{8fQGDFKFvEEvgfWJF{b<(my5DiTSZ35mmS~s16+WHF=-(XxvKIAhv-yOsnZOYAjXe-knEe zfqa_UO^NAtdOBlf%WTDE_dM(U)R*%GSk`L zxF)%qJo~*q->ksR;DT@>(h*ylcp_CyKg@RLj}_a?9}aBcuNFQpo+7Q54=8S{_GqT+ zLi%@&BJ&2zEvwEx!7&G!fey#QSQ}o&tOrjUB!PjF4(c?&`qs3lt zi(39-R+?H2zvybTuc{9#Z_A@nnFJNp2*&cJR~DC=3$3|Bnch@6F)qG6>I%;d{X4MS zuk!uiIpp5!I>2@_WqJvHhx^{xsQ@?IyrhBq4qc^tj zIM~O*c^sU_!Fe2<$H93VoX5d=9Gu6&c^sU_!Fe2<$H93VoX0_~5^|N0tAt!7S)H#8Al~At|>QzF$N~l)} z^(vuWCDf~gdX-SG66#e#y-KK83H2(W?*Q~2fW8CJcL4ehK;HrAI{W^pAu7anL^w`o}^4IOrb-{o|m29Q2Qa{&CO;9QuGmA8_ac z4t>C(4>^q*T!`0WE6_DaqvL6N%6ic9EAuHMYS^T^p%JR;`{lI z?6q_(IV`a{_FZI1xIH*1aM`!sJKlr49j=k=GUfzrraz-5Qap+ze<5?^Q`8QsOzoj3 zGIBP;MqDz_SZ}M3@h=QM3cV3=#va5!Pp(bR%#O_4i_&tw65#aEQVA!^pN+eL|Tc)0eV`@;i%L%C8PI@#hF9iib+&a#nFx^@gTKcTfMaF>GqIT(DMb zHIB*1cof4}>?7Px>>&CHEjQb6XO1{a%p>mNb@*G@SLj9L8^>;YgH2@pn|Y9_&5+hj z)$UMVR{G^iS+!)0Xu4n#Z$;(x()L0}t~=vN*^&+M&S)vTD&z@l@;iNxJZIeOP~B>FLZfLX^bcdd1|dG30v{ksCH&}ZQZ(Qxc!VpD2% zrZ#6T@JsPBJJ83!Av_~)mu{BNRpM$=vsd?PLyvK)`5TMWHqE}q@fNZHosFsS(|8^6 zUqpbga^tZ&1KjUA;xw+tXJZ@Cw~#fCX?CgY8_QI4kMY-ry*g5ZtLG{=%iE=A#5aU} ze0CsS=9kQc+T85SrqszqI5r{rSy&a?6{z;#^|pD|x|h4wu?LvP^d$NcHwG=`=Ef5u zF>Y)Rs26D&)5{!XJ6vbok33G_Cch`JDpU%0MjPU`q$ky#>Bwy_yk1&SS;U(z7$d5d zC}n>6W#ta_RBc+gIZtDBCpX6g6vfTAG&zEsdl_mQJ(?*o6id3Y z?xEf_zFYoD!5g8*h$Pk>Z%r;pkIWkKr9z<8U%AEW7Mv9Amu!(OQ9P+is!wW{=u?Ik zQ_|dE?X>-5PdL)ZWAr$-6i?#KL=Pe4-krftiSq|y9Z|$r;$2t}6`}&fYyZ~vvQ=*R z#H2K?)8EvpHPckDDcWV{B)y`3L4cR9NXz!($p3Bc-k+l??=XOGvb)*M-tYHw&IXLa z7!YBEA(Sdpy7 z%bv^Lui0DnlHEnu|}2)|E{WR*7Yjh_p|3K=G_fula}eN&T;e2Gb|zu*GhB z*gnyrC2kV!B)^tXzfwwmZKIqc{5rRkx=lVtzE7NUd~d&KJ8E5Rv6%mEoNhR!Q)ye& z$CUq(i)9Z;>nfIrTFYM*Y%lFAe3JiX_V#dDdUA3@{6fqSeKTAL?hZ`x4|y+pzHood z{mSauHH?d2pR4F7|F*eZ3Vz-Gik`|0G9R)lxToCBo_24KPaAkWm=3i^?u!i$eUx}E zHF;Q@&F0)AgT*VO=gK}4c8c31%PXhKh01@cUeh>qXY`YdhfOK-Bi7}%_4ZYcIzmXE zARpqtZ+w)Af7`6iDE~b)lR8gY$UhKoJ9gXOvOQz9TdtU%HQv?F*PYblRMVAf<$tOC zT5?Uy3KL}lfvQ9nCgPtxCOJZL}#)gjvYXctN3GZ8;P3||jPgy@Rhq+8Y zOY3MK|2#pLm0m>;(9bYMriVSm?R9r~e();%D*`_Sp9s4nJ7P29#YBIqYq&kTCcm`M zP^uNwlsiPyikReDWsUldrcEa|yl0G=>MU*6qqc7QVaG=UE}FC zI!d=O*)XdP-*mN6R}zTPs?m zGi4gZP31oIW7<2qR>M8xEc1t!UMp+!+6Np*h{a@xTuEJ`1kNhweNL(KI<=V+QX9xi zM8=_W=T#;)6&Khamr|QnMo)TM=J)Tr(|u4I#piXrJbR_ zXqaN!YrbWvv{l)i4iRyc*h0#vHtJ_e&VPEG&Jy)6s+r=*xnw8N>$qvZVLNNxYMEgE z&bY|Xt9wAZMct!J%d2Gd(&ZJKMBB?h5*#gkQMi=9mCXzj>Bi*F_+V^8bbnYM>I%&9 zm-_}i-?)1@jwRSv7$3cvuBPMs+s3-2bR&J5p2+kw+t{bM+3tm&m%ZJ-g8zl!z0jJ7 zJa%Ddb7EG?JeqN_K(?(-TzfyNuqgOX6 zcgW9H-jIaEqe68#A*dCu&UdqtcepjX zAU~r}Qz8WF@=;+(d_!`!a)-Q0saIdttkk9S8;!S36D@139k#>vJ&skx81f=n&p$() zvh&YlaB}>!jiWv$v&2+lsiVc-Xd7##%{xps;{m-$*R1JQ`4u*KU1f{pHSsRtp|a0M z&lUSdZs*b&^YE0extHctUhAwlm(CB+{ATTiHwbFA7IX9|^XXZxSu9 zsFzmB(()eV7WD(#Ufm+Ycg6|kt(LRa8@8MFUPmV}m*mK1{v9h(PX2w9JAdZiJsGuy zyh?}&r=!YVX}e|FYo21dXqchz(&p85sy4+b*?=@!ArhN})n!vg>xxYyt8?2kC(^$p zm5HXI6H!H^J){hF`l_)!C1L|9&4j9$#(XcyMg^%gBET~EX0rqj&$6+6beH`|2*vDZXhkYFOaoERUABTM$_Ho$9;XDrKaX62|c^uB; za2|*AIGo4fJPzk^IFG}59M0o#9*0~da+SzcB3FrAC32O>RU%i3TqSaq$W83ABX#KxF3i6akw9c`*FA*hx>83ABQ<7m~(cj8M-Mo9z|jMa9&q%4qX!&4;OGHI4>)?j(F2Yi@bB&C9Pbmz zRU%i3TqSaq$W{hSBYFDa+SzcB3FrAC32O>RU%i3TqSaq$W{hSBYFDa+SzcB3FrAC32O>RsJuzN&)^r00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG|g z{~|EIp=og)|35V>n7y!}Y4&0x|8vv&b+0>{*1x)Lg>&}$jjb!4(yCr_F*b;6`+6CR!-DE}{>ah)yz 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 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 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 z2oNAZfWZF=JTzF%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_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..f8aa3cf --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..cb9e444 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..db90c65 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..dfb90fd --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..9233829 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..0799b17 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..a7b2c22 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..d34e046 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..0bb26ab --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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/packaging/org.tizen.sat-ui.spec b/packaging/org.tizen.sat-ui.spec new file mode 100644 index 0000000..5030463 --- /dev/null +++ b/packaging/org.tizen.sat-ui.spec @@ -0,0 +1,64 @@ +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 + +%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/process-info/sat-ui.ini +/usr/share/icons/default/small/%{name}.png +/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..5ba4a19 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..40e1984 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..eaad47d --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..b47e4d5 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..84b1fdf --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..8124254 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..ce56775 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..0f6b216 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..a1a6c57 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..d2aa9b0 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..58f7e28 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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..a51b444 --- /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.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://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