From f78142b2cb59e1d5fc6e2ad909cfcde402c50068 Mon Sep 17 00:00:00 2001 From: "jk7744.park" Date: Sat, 24 Oct 2015 15:32:04 +0900 Subject: [PATCH] tizen 2.4 release --- CMakeLists.txt | 86 +++ LICENSE | 202 ++++++ attach-panel.manifest | 8 + attach-panel.pc.in | 9 + doc/attach_panel_doc.h | 49 ++ include/attach_bundle.h | 26 + include/attach_panel.h | 1416 +++++++++++++++++++++++++++++++++++++++ include/attach_panel_internal.h | 288 ++++++++ include/conf.h | 28 + include/content_list.h | 30 + include/gesture.h | 35 + include/grid.h | 32 + include/list.h | 22 + include/log.h | 89 +++ include/page.h | 27 + include/scroller.h | 42 ++ include/toolbar.h | 41 ++ include/ug.h | 25 + include/ui_manager.h | 30 + packaging/attach-panel.spec | 79 +++ po/CMakeLists.txt | 92 +++ po/ar.po | 30 + po/az.po | 30 + po/bg.po | 30 + po/bn.po | 30 + po/ca.po | 30 + po/cs.po | 30 + po/da.po | 30 + po/de.po | 30 + po/de_DE.po | 90 +++ po/el_GR.po | 30 + po/en.po | 30 + po/en_PH.po | 30 + po/en_US.po | 30 + po/es_ES.po | 30 + po/es_MX.po | 90 +++ po/es_US.po | 30 + po/et.po | 30 + po/eu.po | 30 + po/fa.po | 30 + po/fi.po | 30 + po/fr.po | 30 + po/fr_CA.po | 30 + po/fr_FR.po | 90 +++ po/ga.po | 30 + po/gl.po | 30 + po/gu.po | 30 + po/he.po | 30 + po/hi.po | 30 + po/hr.po | 30 + po/hu.po | 30 + po/hy.po | 30 + po/is.po | 30 + po/it_IT.po | 30 + po/ja_JP.po | 30 + po/ka.po | 30 + po/kk.po | 30 + po/kn.po | 30 + po/ko_KR.po | 30 + po/lt.po | 30 + po/lv.po | 30 + po/mk.po | 30 + po/ml.po | 30 + po/mn_MN.po | 132 ++++ po/nb.po | 30 + po/nl.po | 30 + po/nl_NL.po | 90 +++ po/pl.po | 30 + po/pt_BR.po | 30 + po/pt_PT.po | 30 + po/ro.po | 30 + po/ru_RU.po | 30 + po/si.po | 30 + po/sk.po | 30 + po/sl.po | 30 + po/sr.po | 30 + po/sv.po | 30 + po/ta.po | 30 + po/te.po | 30 + po/th.po | 30 + po/tr_TR.po | 30 + po/uk.po | 30 + po/ur.po | 30 + po/uz.po | 30 + po/zh_CN.po | 30 + po/zh_HK.po | 30 + po/zh_SG.po | 72 ++ po/zh_TW.po | 30 + res/CMakeLists.txt | 2 + res/edje/CMakeLists.txt | 15 + res/edje/conf.h | 1 + res/edje/layout.edc | 141 ++++ res/edje/page.edc | 53 ++ res/images/A01-1_icon_Menu.png | Bin 0 -> 7119 bytes res/images/CMakeLists.txt | 6 + res/images/calendar.png | Bin 0 -> 7164 bytes res/images/contact.png | Bin 0 -> 8656 bytes res/images/music.png | Bin 0 -> 8466 bytes res/images/my_files.png | Bin 0 -> 6239 bytes res/images/video.png | Bin 0 -> 6858 bytes sample/CMakeLists.txt | 29 + sample/sample.c | 508 ++++++++++++++ sample/sample.edc | 109 +++ sample/sample.h | 64 ++ src/attach_bundle.c | 183 +++++ src/attach_panel.c | 766 +++++++++++++++++++++ src/content_list.c | 185 +++++ src/gesture.c | 347 ++++++++++ src/grid.c | 583 ++++++++++++++++ src/list.c | 99 +++ src/page.c | 94 +++ src/scroller.c | 411 ++++++++++++ src/toolbar.c | 234 +++++++ src/ug.c | 237 +++++++ src/ui_manager.c | 531 +++++++++++++++ 115 files changed, 9648 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 attach-panel.manifest create mode 100644 attach-panel.pc.in create mode 100644 doc/attach_panel_doc.h create mode 100644 include/attach_bundle.h create mode 100644 include/attach_panel.h create mode 100644 include/attach_panel_internal.h create mode 100644 include/conf.h create mode 100644 include/content_list.h create mode 100644 include/gesture.h create mode 100644 include/grid.h create mode 100644 include/list.h create mode 100644 include/log.h create mode 100644 include/page.h create mode 100644 include/scroller.h create mode 100644 include/toolbar.h create mode 100644 include/ug.h create mode 100644 include/ui_manager.h create mode 100755 packaging/attach-panel.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/bn.po create mode 100755 po/ca.po create mode 100755 po/cs.po create mode 100755 po/da.po create mode 100755 po/de.po create mode 100755 po/de_DE.po create mode 100755 po/el_GR.po create mode 100755 po/en.po create mode 100755 po/en_PH.po create mode 100755 po/en_US.po create mode 100755 po/es_ES.po create mode 100755 po/es_MX.po create mode 100755 po/es_US.po create mode 100755 po/et.po create mode 100755 po/eu.po create mode 100755 po/fa.po create mode 100755 po/fi.po create mode 100755 po/fr.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/gu.po create mode 100755 po/he.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/kn.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/ml.po create mode 100755 po/mn_MN.po create mode 100755 po/nb.po create mode 100755 po/nl.po create mode 100755 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/si.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/ta.po create mode 100755 po/te.po create mode 100755 po/th.po create mode 100755 po/tr_TR.po create mode 100755 po/uk.po create mode 100755 po/ur.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 100644 res/CMakeLists.txt create mode 100755 res/edje/CMakeLists.txt create mode 120000 res/edje/conf.h create mode 100644 res/edje/layout.edc create mode 100644 res/edje/page.edc create mode 100755 res/images/A01-1_icon_Menu.png create mode 100644 res/images/CMakeLists.txt create mode 100755 res/images/calendar.png create mode 100755 res/images/contact.png create mode 100755 res/images/music.png create mode 100755 res/images/my_files.png create mode 100755 res/images/video.png create mode 100644 sample/CMakeLists.txt create mode 100644 sample/sample.c create mode 100644 sample/sample.edc create mode 100644 sample/sample.h create mode 100644 src/attach_bundle.c create mode 100644 src/attach_panel.c create mode 100644 src/content_list.c create mode 100644 src/gesture.c create mode 100644 src/grid.c create mode 100644 src/list.c create mode 100644 src/page.c create mode 100644 src/scroller.c create mode 100644 src/toolbar.c create mode 100644 src/ug.c create mode 100644 src/ui_manager.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..970f382 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,86 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) + +PROJECT(attach-panel C) + +SET(VERSION 0.1.0) + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(INCLUDEDIR "${PREFIX}/include/${PROJECT_NAME}") + +SET(LIBDIR "${LIB_INSTALL_DIR}") +SET(SHAREDIR "${PREFIX}/share") + +SET(ICONDIR "${SHAREDIR}/icons") +SET(PANELDIR "${SHAREDIR}/${PROJECT_NAME}") + +SET(EDJEDIR "${PANELDIR}/edje") +SET(IMAGEDIR "${PANELDIR}/images") +SET(LOCALEDIR "${PANELDIR}/locale") +SET(SAMPLEDIR "${PANELDIR}/sample") + +SET(INSTALL_HEADERS_DEVEL + attach_panel.h +) + +SET(SRCS + src/attach_panel.c + src/attach_bundle.c + src/content_list.c + src/gesture.c + src/grid.c + src/page.c + src/scroller.c + src/toolbar.c + src/ug.c + src/ui_manager.c + src/list.c +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) +INCLUDE(FindPkgConfig) +pkg_check_modules(pkgs REQUIRED + aul + capi-base-common + capi-system-info + bundle + dlog + efl-extension + elementary + evas + feedback + isf + security-privilege-checker + ui-gadget-1 + rua +) + +FOREACH(flag ${pkgs_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -g -Wall -O2") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") +ADD_DEFINITIONS("-DEDJEDIR=\"${EDJEDIR}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") +ADD_DEFINITIONS("-DPACKAGE=\"${PROJECT_NAME}\"") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION 0.1.0) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS}) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR}) + +CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) +SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${PROJECT_NAME}.pc") +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIBDIR}/pkgconfig) + +FOREACH(hfile ${INSTALL_HEADERS_DEVEL}) + INSTALL(FILES ${CMAKE_SOURCE_DIR}/include/${hfile} DESTINATION include/${PROJECT_NAME}) +ENDFOREACH(hfile) + +# subdir +ADD_SUBDIRECTORY(res) +ADD_SUBDIRECTORY(po) +ADD_SUBDIRECTORY(sample) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + 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. + + 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, + 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 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 in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 Apache License to your work. + + To apply the Apache 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 Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/attach-panel.manifest b/attach-panel.manifest new file mode 100644 index 0000000..7d10c61 --- /dev/null +++ b/attach-panel.manifest @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/attach-panel.pc.in b/attach-panel.pc.in new file mode 100644 index 0000000..1281b95 --- /dev/null +++ b/attach-panel.pc.in @@ -0,0 +1,9 @@ +libdir=@LIBDIR@ +includedir=@INCLUDEDIR@ + +Name: attach-panel +Description: attach-panel supporting library +Version: @VERSION@ +Requires: ui-gadget-1 capi-base-common +Libs: -L${libdir} -lattach-panel +Cflags: -I${includedir} diff --git a/doc/attach_panel_doc.h b/doc/attach_panel_doc.h new file mode 100644 index 0000000..b0aaff4 --- /dev/null +++ b/doc/attach_panel_doc.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_ATTACH_PANEL_DOC_H__ +#define __TIZEN_ATTACH_PANEL_DOC_H__ + +/** + * @ingroup CAPI_APPLICATION_FRAMEWORK + * @defgroup CAPI_PANEL_ATTACH_MODULE Attach panel + * @brief Attach panel provides functions to attach images, voices, contacts, events and files. Users can attach images, take pictures, record voice and select files to attach into the caller app + * + * @section CAPI_PANEL_ATTACH_MODULE_HEADER Required Header + * \#include + * + * @section CAPI_PANEL_ATTACH_MODULE_OVERVIEW Overview + * - It provides functions for adding an attach panel (attach_panel_create()) and deleting it (attach_panel_destroy()) in an app.\n + * - Content categories can be added (attach_panel_add_content_category()) or removed (attach_panel_remove_content_category()).\n + * - Dynamic configurations can be handled with (attach_panel_set_extra_data()). This is used with a content category. + * - Results can be returned into the result callback that is set (attach_panel_set_result_cb()) or unset (attach_panel_unset_result_cb()).\n + * - Events are delivered into the event callback that is set with (attach_panel_set_event_cb()) or unset with (attach_panel_unset_event_cb()).\n + * - The panel can be shown with (attach_panel_show()) and hidden with (attach_panel_hide()).\n + * - You can get the state of the panel with (attach_panel_get_visibility()).\n + * + * @section CAPI_PANEL_ATTACH_MODULE_FEATURE Related Features + * This API is related with the following features:\n + * - %http://tizen.org/feature/camera\n + * - %http://tizen.org/feature/microphone\n + * + * It is recommended to design feature related codes in your application for reliability.\n + * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.\n + * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.\n + * More details on featuring your application can be found from Feature Element. + */ + + +#endif diff --git a/include/attach_bundle.h b/include/attach_bundle.h new file mode 100644 index 0000000..6351730 --- /dev/null +++ b/include/attach_bundle.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ATTACH_PANEL_BUNDLE_H__ +#define __ATTACH_PANEL_BUNDLE_H__ + + + +int _bundle_add_to_app_control(bundle *b, app_control_h app_control); +int _bundle_add_to_bundle(bundle *origin, bundle *replace); + + +#endif diff --git a/include/attach_panel.h b/include/attach_panel.h new file mode 100644 index 0000000..83e5026 --- /dev/null +++ b/include/attach_panel.h @@ -0,0 +1,1416 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_ATTACH_PANEL_H__ +#define __TIZEN_ATTACH_PANEL_H__ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file attach_panel.h + * @brief Declares the API of the libattach-panel library. + */ + +/** + * @addtogroup CAPI_PANEL_ATTACH_MODULE + * @{ + */ + +/** + * @brief Enumeration for content categories + * @since_tizen 2.4 + * @see attach_panel_add_content_category() + * @see attach_panel_remove_content_category() + */ +typedef enum attach_panel_content_category { + ATTACH_PANEL_CONTENT_CATEGORY_IMAGE = 1, /**< Attaching images from the gallery */ + ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, /**< Taking pictures to attach */ + ATTACH_PANEL_CONTENT_CATEGORY_VOICE, /**< Taking a voice clip to attach */ + ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, /**< Attaching video from the gallery */ + ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, /**< Attaching audio from my files */ + ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR, /**< Attaching calendar data from the calendar */ + ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, /**< Attaching contact data from the contacts */ + ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, /**< Attaching files data from my files */ + ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, /**< Taking a video clip to attach */ +} attach_panel_content_category_e; + +/** + * @brief Enumeration for events + * @since_tizen 2.4 + * @see attach_panel_set_event_cb() + * @see attach_panel_unset_event_cb() + */ +typedef enum attach_panel_event { + ATTACH_PANEL_EVENT_SHOW_START = 1, /**< Attach panel starts the effect to show */ + ATTACH_PANEL_EVENT_SHOW_FINISH, /**< Attach panel finishes the effect to show */ + ATTACH_PANEL_EVENT_HIDE_START, /**< Attach panel starts the effect to hide the panel */ + ATTACH_PANEL_EVENT_HIDE_FINISH, /**< Attach panel finishes the effect to hide the panel */ +} attach_panel_event_e; + +/** + * @brief Attach panel handle. + * @since_tizen 2.4 + */ +typedef struct _attach_panel *attach_panel_h; + +/** + * @brief Called when an user selects and confirms something to attach on the caller app. + * + * @since_tizen 2.4 + * @param[in] attach_panel Attach panel handler + * @param[in] content_category results are from the content category + * @param[in] result app_control handler.\n + * The caller app has to use app_control_get_extra_data_array() to get received data.\n + * http://tizen.org/appcontrol/data/selected\n + * @param[in] result_code result of app_control + * @param[in] user_data user data + * @pre The callback must be registered using attach_panel_set_result_cb()\n + * attach_panel_add_content_category() and attach_panel_show() must be called to invoke this callback. + * + * @see @ref CAPI_APP_CONTROL_MODULE API app_control_get_extra_data_array() + * @see attach_panel_set_result_cb() + * @see attach_panel_unset_result_cb() + */ +typedef void (*attach_panel_result_cb)(attach_panel_h attach_panel, attach_panel_content_category_e content_category, app_control_h result, app_control_result_e result_code, void *user_data); + +/** + * @brief Called when reserved events are published from the panel-side. + * + * @since_tizen 2.4 + * @param[in] attach_panel Attach panel handler + * @param[in] event Attach panel event + * @param[in] event_info additional event information.\n + * This can be NULL if there are no necessary information. + * @param[in] user_data user data + * @pre The callback must be registered using attach_panel_set_event_cb() + * + * @see attach_panel_set_event_cb() + * @see attach_panel_unset_event_cb() + */ +typedef void (*attach_panel_event_cb)(attach_panel_h attach_panel, attach_panel_event_e event, void *event_info, void *user_data); + +/** + * @brief Enumeration for values of attach-panel response types. + * @since_tizen 2.4 + */ +typedef enum attach_panel_error { + ATTACH_PANEL_ERROR_NONE = TIZEN_ERROR_NONE, /**< Successfully handled */ + ATTACH_PANEL_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Request is not valid, invalid parameter or invalid argument value */ + ATTACH_PANEL_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Memory is not enough to handle a new request */ + ATTACH_PANEL_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED, /**< Has no permission to attach contents */ + ATTACH_PANEL_ERROR_ALREADY_EXISTS = TIZEN_ERROR_PANEL | 0x01, /**< There is already a panel in the conformant */ + ATTACH_PANEL_ERROR_NOT_INITIALIZED = TIZEN_ERROR_PANEL | 0x02, /**< The panel is not initialized yet */ + ATTACH_PANEL_ERROR_UNSUPPORTED_CONTENT_CATEGORY = TIZEN_ERROR_PANEL | 0x03, /**< Not supported content category */ + ATTACH_PANEL_ERROR_ALREADY_DESTROYED = TIZEN_ERROR_PANEL | 0x05, /**< The panel is already removed */ +} attach_panel_error_e; + +/** + * @brief Creates an attach panel. + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function.\n + * A conformant object can have only one @a attach_panel_h.\n + * If a caller app try to add more than one attach-panel, it fails to add it. + * + * @param[in] conformant The caller's conformant + * @param[out] attach_panel Attach panel handler + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_OUT_OF_MEMORY Out of memory + * @retval #ATTACH_PANEL_ERROR_ALREADY_EXISTS Already exists + * + * @see attach_panel_destroy() + * @see attach_panel_add_content_category() + * @see attach_panel_remove_content_category() + * @see attach_panel_set_extra_data() + * @see attach_panel_set_result_cb() + * @see attach_panel_unset_result_cb() + * @see attach_panel_set_event_cb() + * @see attach_panel_unset_event_cb() + * @see attach_panel_show() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static void _result_cb(attach_panel_h attach_panel, attach_panel_content_category_e content_category, app_control_h result, app_control_result_e result_code, void *data) + * { + * char **select = NULL; + * int i = 0; + * int length = 0; + * int ret = APP_CONTROL_ERROR_NONE; + * + * if (!result) { + * // Error handling + * } + * + * if (APP_CONTROL_RESULT_SUCCEEDED != result_code) { + * // Error handling + * } + * + * ret = app_control_get_extra_data_array(result, "http://tizen.org/appcontrol/data/selected", &select, &length); + * if (APP_CONTROL_ERROR_NONE != ret || !select) { + * // Error handling + * } + * + * for (; i < length; i++) { + * printf("path is %s, %d\n", select[i], length); + * free(select[i]); + * } + * + * free(select); + * } + * + * static int app_control(void *data) + * { + * struct appdata *ad = data; + * bundle *extra_data = NULL; + * int ret = ATTACH_PANEL_ERROR_NONE; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->conformant) { + * // Error handling + * } + * + * ret = attach_panel_create(ad->conformant, &ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * extra_data = bundle_create(); + * if (!extra_data) { + * // Error handling + * } + * + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_count", "3"); + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_size", "10240000"); + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_set_result_cb(ad->attach_panel, _result_cb, NULL); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_show(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * bundle_free(extra_data); + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_create(Evas_Object *conformant, attach_panel_h *attach_panel); + +/** + * @brief Destroys the attach panel. + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function.\n + * + * @param[in] attach_panel Attach panel handler + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @see attach_panel_create() + * @see attach_panel_add_content_category() + * @see attach_panel_remove_content_category() + * @see attach_panel_set_extra_data() + * @see attach_panel_set_result_cb() + * @see attach_panel_unset_result_cb() + * @see attach_panel_set_event_cb() + * @see attach_panel_unset_event_cb() + * @see attach_panel_show() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static int app_terminate(void *data) + * { + * struct appdata *ad = data; + * int ret = 0; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->attach_panel) { + * // Error handling + * } + * + * ret = attach_panel_hide(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_unset_result_cb(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_destroy(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * ad->attach_panel = NULL; + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_destroy(attach_panel_h attach_panel); + +/** + * @brief Adds a content category in the attach panel. + * @since_tizen 2.4 + * @privlevel public + * @privilege %http://tizen.org/privilege/mediastorage + * @privilege %http://tizen.org/privilege/camera + * @privilege %http://tizen.org/privilege/recorder + * @privilege %http://tizen.org/privilege/appmanager.launch + * @remarks The caller app has to check the return value of this function.\n + * Content categories will be shown as the sequence of using @a attach_panel_add_content_category.\n + * Some contents need time to load it all.\n + * So, it is needed to use this before the mainloop of attach_panel_show().\n + * Privileges,\n + * %http://tizen.org/privilege/mediastorage, for using ATTACH_PANEL_CONTENT_CATEGORY_IMAGE or ATTACH_PANEL_CONTENT_CATEGORY_CAMERA\n + * %http://tizen.org/privilege/camera, for using ATTACH_PANEL_CONTENT_CATEGORY_CAMERA\n + * %http://tizen.org/privilege/recorder, for using ATTACH_PANEL_CONTENT_CATEGORY_VOICE\n + * %http://tizen.org/privilege/appmanager.launch, for adding content categories on the More tab\n + * Deliver more information to the callee with a bundle if you need.\n + * %http://tizen.org/appcontrol/data/total_count\n + * %http://tizen.org/appcontrol/data/total_size + * + * @param[in] attach_panel Attach panel handler + * @param[in] content_category The content_category to be added in the @a attach_panel. + * @param[in] extra_data The attach panel send some information using @a bundle. + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_PERMISSION_DENIED permission denied + * @retval #ATTACH_PANEL_ERROR_NOT_INITIALIZED not initialized + * @retval #ATTACH_PANEL_ERROR_UNSUPPORTED_CONTENT_CATEGORY not supported content category + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @pre Call attach_panel_create() before calling this function. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_remove_content_category() + * @see attach_panel_set_result_cb() + * @see attach_panel_unset_result_cb() + * @see attach_panel_show() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * @see ATTACH_PANEL_CONTENT_CATEGORY_IMAGE + * @see ATTACH_PANEL_CONTENT_CATEGORY_CAMERA + * @see ATTACH_PANEL_CONTENT_CATEGORY_VOICE + * @see ATTACH_PANEL_CONTENT_CATEGORY_VIDEO + * @see ATTACH_PANEL_CONTENT_CATEGORY_AUDIO + * @see ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR + * @see ATTACH_PANEL_CONTENT_CATEGORY_CONTACT + * @see ATTACH_PANEL_CONTENT_CATEGORY_MYFILES + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static void _result_cb(attach_panel_h attach_panel, attach_panel_content_category_e content_category, app_control_h result, app_control_result_e result_code, void *data) + * { + * char **select = NULL; + * int i = 0; + * int length = 0; + * int ret = APP_CONTROL_ERROR_NONE; + * + * if (!result) { + * // Error handling + * } + * + * if (APP_CONTROL_RESULT_SUCCEEDED != result_code) { + * // Error handling + * } + * + * ret = app_control_get_extra_data_array(result, "http://tizen.org/appcontrol/data/selected", &select, &length); + * if (APP_CONTROL_ERROR_NONE != ret || !select) { + * // Error handling + * } + * + * for (; i < length; i++) { + * printf("path is %s, %d\n", select[i], length); + * free(select[i]); + * } + * + * free(select); + * } + * + * static int app_control(void *data) + * { + * struct appdata *ad = data; + * bundle *extra_data = NULL; + * int ret = ATTACH_PANEL_ERROR_NONE; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->conformant) { + * // Error handling + * } + * + * ret = attach_panel_create(ad->conformant, &ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * extra_data = bundle_create(); + * if (!extra_data) { + * // Error handling + * } + * + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_count", "3"); + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_size", "10240000"); + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_set_result_cb(ad->attach_panel, _result_cb, NULL); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_show(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * bundle_free(extra_data); + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_add_content_category(attach_panel_h attach_panel, attach_panel_content_category_e content_category, bundle *extra_data); + +/** + * @brief Removes the content category from the attach panel. + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function.\n + * + * @param[in] attach_panel Attach panel handler + * @param[in] content_category The content_category adding in the @a attach_panel. + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_NOT_INITIALIZED not initialized + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @pre Call attach_panel_create() before calling this function. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_add_content_category() + * @see attach_panel_set_extra_data() + * @see attach_panel_set_result_cb() + * @see attach_panel_unset_result_cb() + * @see attach_panel_show() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * @see ATTACH_PANEL_CONTENT_CATEGORY_IMAGE + * @see ATTACH_PANEL_CONTENT_CATEGORY_CAMERA + * @see ATTACH_PANEL_CONTENT_CATEGORY_VOICE + * @see ATTACH_PANEL_CONTENT_CATEGORY_VIDEO + * @see ATTACH_PANEL_CONTENT_CATEGORY_AUDIO + * @see ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR + * @see ATTACH_PANEL_CONTENT_CATEGORY_CONTACT + * @see ATTACH_PANEL_CONTENT_CATEGORY_MYFILES + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static int app_terminate(void *data) + * { + * struct appdata *ad = data; + * int ret = 0; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->attach_panel) { + * // Error handling + * } + * + * ret = attach_panel_hide(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_unset_result_cb(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_destroy(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * ad->attach_panel = NULL; + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_remove_content_category(attach_panel_h attach_panel, attach_panel_content_category_e content_category); + +/** + * @brief Sets extra data to send to the content category using a bundle. + * @since_tizen 2.4 + * @privlevel public + * @remarks The caller app has to check the return value of this function.\n + * extra data will be changed using @a attach_panel_set_extra_data.\n + * %http://tizen.org/appcontrol/data/total_count\n + * %http://tizen.org/appcontrol/data/total_size + * + * @param[in] attach_panel Attach panel handler + * @param[in] content_category The content_category to be set the some information in the @a attach_panel. + * @param[in] extra_data The attach panel set some information using @a bundle. + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * @retval #ATTACH_PANEL_ERROR_OUT_OF_MEMORY Fail to set the extra data + * + * @pre Call attach_panel_create() before calling this function. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_add_content_category() + * @see attach_panel_remove_content_category() + * @see attach_panel_set_result_cb() + * @see attach_panel_unset_result_cb() + * @see attach_panel_show() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * @see ATTACH_PANEL_CONTENT_CATEGORY_IMAGE + * @see ATTACH_PANEL_CONTENT_CATEGORY_CAMERA + * @see ATTACH_PANEL_CONTENT_CATEGORY_VOICE + * @see ATTACH_PANEL_CONTENT_CATEGORY_VIDEO + * @see ATTACH_PANEL_CONTENT_CATEGORY_AUDIO + * @see ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR + * @see ATTACH_PANEL_CONTENT_CATEGORY_CONTACT + * @see ATTACH_PANEL_CONTENT_CATEGORY_MYFILES + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static void _result_cb(attach_panel_h attach_panel, attach_panel_content_category_e content_category, app_control_h result, app_control_result_e result_code, void *data) + * { + * char **select = NULL; + * int i = 0; + * int length = 0; + * int ret = APP_CONTROL_ERROR_NONE; + * + * if (!result) { + * // Error handling + * } + * + * if (APP_CONTROL_RESULT_SUCCEEDED != result_code) { + * // Error handling + * } + * + * ret = app_control_get_extra_data_array(result, "http://tizen.org/appcontrol/data/selected", &select, &length); + * if (APP_CONTROL_ERROR_NONE != ret || !select) { + * // Error handling + * } + * + * for (; i < length; i++) { + * printf("path is %s, %d\n", select[i], length); + * free(select[i]); + * } + * + * free(select); + * } + * + * static void _reset_bundle_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) + * { + * struct appdata *ad = data; + * bundle *extra_data = NULL; + * int ret = APP_CONTROL_ERROR_NONE; + * + * if (!ad) { + * // Error handling + * } + * + * extra_data = bundle_create(); + * if (!extra_data) { + * // Error handling + * } + * + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_count", "5"); + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_size", "20480000"); + * + * ret = attach_panel_set_extra_data(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_set_extra_data(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_set_extra_data(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * bundle_free(extra_data); + * } + * + * static int app_control(void *data) + * { + * struct appdata *ad = data; + * bundle *extra_data = NULL; + * int ret = ATTACH_PANEL_ERROR_NONE; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->conformant) { + * // Error handling + * } + * + * ret = attach_panel_create(ad->conformant, &ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * extra_data = bundle_create(); + * if (!extra_data) { + * // Error handling + * } + * + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_count", "3"); + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_size", "10240000"); + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_set_result_cb(ad->attach_panel, _result_cb, NULL); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_show(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * bundle_free(extra_data); + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_set_extra_data(attach_panel_h attach_panel, attach_panel_content_category_e content_category, bundle *extra_data); + +/** + * @brief Sets the result callback that will be called when an user selects and confirms something to attach in the attach panel. + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function.\n + * We can set only one callback function with this API.\n + * If you set multiple callbacks with this API,\n + * the last one is registered only. + * + * @param[in] attach_panel Attach panel handler + * @param[in] result_cb Attach panel result callback + * @param[in] user_data User data + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @pre Call attach_panel_create() before calling this function. + * @post The result_cb set with attach_panel_set_result_cb() will be called after an user select something to attach. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_add_content_category() + * @see attach_panel_remove_content_category() + * @see attach_panel_set_extra_data() + * @see attach_panel_unset_result_cb() + * @see attach_panel_show() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * @see attach_panel_result_cb + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static void _result_cb(attach_panel_h attach_panel, attach_panel_content_category_e content_category, app_control_h result, app_control_result_e result_code, void *data) + * { + * char **select = NULL; + * int i = 0; + * int length = 0; + * int ret = APP_CONTROL_ERROR_NONE; + * + * if (!result) { + * // Error handling + * } + * + * if (APP_CONTROL_RESULT_SUCCEEDED != result_code) { + * // Error handling + * } + * + * ret = app_control_get_extra_data_array(result, "http://tizen.org/appcontrol/data/selected", &select, &length); + * if (APP_CONTROL_ERROR_NONE != ret || !select) { + * // Error handling + * } + * + * for (; i < length; i++) { + * printf("path is %s, %d\n", select[i], length); + * free(select[i]); + * } + * + * free(select); + * } + * + * static int app_control(void *data) + * { + * struct appdata *ad = data; + * bundle *extra_data = NULL; + * int ret = ATTACH_PANEL_ERROR_NONE; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->conformant) { + * // Error handling + * } + * + * ret = attach_panel_create(ad->conformant, &ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * extra_data = bundle_create(); + * if (!extra_data) { + * // Error handling + * } + * + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_count", "3"); + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_size", "10240000"); + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_set_result_cb(ad->attach_panel, _result_cb, NULL); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_show(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * bundle_free(extra_data); + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_set_result_cb(attach_panel_h attach_panel, attach_panel_result_cb result_cb, void *user_data); + +/** + * @brief Unsets the result callback that will be called when an user selects and confirms something to attach in the attach panel. + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function.\n + * + * @param[in] attach_panel Attach panel handler + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @pre Call attach_panel_create() before calling this function. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_add_content_category() + * @see attach_panel_remove_content_category() + * @see attach_panel_set_extra_data() + * @see attach_panel_set_result_cb() + * @see attach_panel_show() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static int app_terminate(void *data) + * { + * struct appdata *ad = data; + * int ret = 0; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->attach_panel) { + * // Error handling + * } + * + * ret = attach_panel_hide(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_unset_result_cb(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_destroy(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * ad->attach_panel = NULL; + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_unset_result_cb(attach_panel_h attach_panel); + +/** + * @brief Sets the event callback that will be called when reserved events are published from the panel-side. + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function.\n + * We can set only one callback function with this API.\n + * If you set multiple callbacks with this API,\n + * the last one is registered only. + * + * @param[in] attach_panel Attach panel handler + * @param[in] panel_event_cb Attach panel event callback + * @param[in] user_data User data + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @pre Call attach_panel_create() before calling this function. + * @post The event_cb set with attach_panel_set_event_cb() will be called after publishing reserved events. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_show() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * @see attach_panel_unset_event_cb() + * @see attach_panel_event_cb + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static void _event_cb(attach_panel_h attach_panel, attach_panel_event_e event, void *event_info, void *data) + * { + * switch (event) { + * case ATTACH_PANEL_EVENT_SHOW_START: + * // event handling + * break; + * case ATTACH_PANEL_EVENT_SHOW_FINISH: + * // event handling + * break; + * case ATTACH_PANEL_EVENT_HIDE_START: + * // event handling + * break; + * case ATTACH_PANEL_EVENT_HIDE_FINISH: + * // event handling + * break; + * default: + * // error handling + * break; + * } + * } + * + * static int app_control(void *data) + * { + * struct appdata *ad = data; + * int ret = ATTACH_PANEL_ERROR_NONE; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->conformant) { + * // Error handling + * } + * + * ret = attach_panel_create(ad->conformant, &ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_set_event_cb(ad->attach_panel, _event_cb, ad); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * // other routines + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_set_event_cb(attach_panel_h attach_panel, attach_panel_event_cb panel_event_cb, void *user_data); + +/** + * @brief Unsets the event callback + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function. + * + * @param[in] attach_panel Attach panel handler + * @param[in] result_cb Attach panel result callback + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @pre Call attach_panel_create() before calling this function. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_show() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * @see attach_panel_set_event_cb() + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static int app_terminate(void *data) + * { + * struct appdata *ad = data; + * int ret = 0; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->attach_panel) { + * // Error handling + * } + * + * ret = attach_panel_unset_event_cb(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_destroy(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * ad->attach_panel = NULL; + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_unset_event_cb(attach_panel_h attach_panel); + +/** + * @brief Shows the attach panel, asynchronously. + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function.\n + * + * @param[in] attach_panel Attach panel handler + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @pre Call attach_panel_create() before calling this function. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_add_content_category() + * @see attach_panel_remove_content_category() + * @see attach_panel_set_extra_data() + * @see attach_panel_set_result_cb() + * @see attach_panel_unset_result_cb() + * @see attach_panel_hide() + * @see attach_panel_get_visibility() + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static void _result_cb(attach_panel_h attach_panel, attach_panel_content_category_e content_category, app_control_h result, app_control_result_e result_code, void *data) + * { + * char **select = NULL; + * int i = 0; + * int length = 0; + * int ret = APP_CONTROL_ERROR_NONE; + * + * if (!result) { + * // Error handling + * } + * + * if (APP_CONTROL_RESULT_SUCCEEDED != result_code) { + * // Error handling + * } + * + * ret = app_control_get_extra_data_array(result, "http://tizen.org/appcontrol/data/selected", &select, &length); + * if (APP_CONTROL_ERROR_NONE != ret || !select) { + * // Error handling + * } + * + * for (; i < length; i++) { + * printf("path is %s, %d\n", select[i], length); + * free(select[i]); + * } + * + * free(select); + * } + * + * static int app_control(void *data) + * { + * struct appdata *ad = data; + * bundle *extra_data = NULL; + * int ret = ATTACH_PANEL_ERROR_NONE; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->conformant) { + * // Error handling + * } + * + * ret = attach_panel_create(ad->conformant, &ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * extra_data = bundle_create(); + * if (!extra_data) { + * // Error handling + * } + * + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_count", "3"); + * bundle_add_str(extra_data, "http://tizen.org/appcontrol/data/total_size", "10240000"); + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_add_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, extra_data); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_set_result_cb(ad->attach_panel, _result_cb, NULL); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_show(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * bundle_free(extra_data); + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_show(attach_panel_h attach_panel); + +/** + * @brief Hides the attach panel, asynchronously. + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function.\n + * + * @param[in] attach_panel Attach panel handler + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @pre Call attach_panel_create() before calling this function. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_add_content_category() + * @see attach_panel_remove_content_category() + * @see attach_panel_set_extra_data() + * @see attach_panel_set_result_cb() + * @see attach_panel_unset_result_cb() + * @see attach_panel_show() + * @see attach_panel_get_visibility() + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static int app_terminate(void *data) + * { + * struct appdata *ad = data; + * int ret = 0; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->attach_panel) { + * // Error handling + * } + * + * ret = attach_panel_hide(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_unset_result_cb(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_destroy(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * ad->attach_panel = NULL; + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_hide(attach_panel_h attach_panel); + +/** + * @brief Gets a value that indicates whether the attach_panel is visible. + * @since_tizen 2.4 + * @remarks The caller app has to check the return value of this function.\n + * + * @param[in] attach_panel Attach panel handler + * @param[out] visible value of attach_panel state + * @return #ATTACH_PANEL_ERROR_NONE on success, + * otherwise a negative error value + * @retval #ATTACH_PANEL_ERROR_NONE Successful + * @retval #ATTACH_PANEL_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #ATTACH_PANEL_ERROR_ALREADY_DESTROYED already removed + * + * @pre Call attach_panel_create() before calling this function. + * @see attach_panel_create() + * @see attach_panel_destroy() + * @see attach_panel_add_content_category() + * @see attach_panel_remove_content_category() + * @see attach_panel_set_extra_data() + * @see attach_panel_set_result_cb() + * @see attach_panel_unset_result_cb() + * @see attach_panel_show() + * @see attach_panel_hide() + * + * @par Example + * @code + * #include + * + * struct appdata { + * Evas_Object *attach_panel; + * Evas_Object *conformant; + * }; + * + * static int app_terminate(void *data) + * { + * struct appdata *ad = data; + * bool vislble = false; + * int ret = 0; + * + * if (!ad) { + * // Error handling + * } + * + * if (!ad->attach_panel) { + * // Error handling + * } + * + * ret = attach_panel_get_visibility(ad->attach_panel, &visible); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * if (visible) { + * ret = attach_panel_hide(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_remove_content_category(ad->attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_unset_result_cb(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * + * ret = attach_panel_destroy(ad->attach_panel); + * if (ATTACH_PANEL_ERROR_NONE != ret) { + * // Error handling + * } + * ad->attach_panel = NULL; + * + * return 0; + * } + * + * @endcode + */ +int attach_panel_get_visibility(attach_panel_h attach_panel, bool *visible); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif +#endif // __TIZEN_ATTACH_PANEL_H__ + diff --git a/include/attach_panel_internal.h b/include/attach_panel_internal.h new file mode 100644 index 0000000..34eb1bd --- /dev/null +++ b/include/attach_panel_internal.h @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_ATTACH_PANEL_INTERNAL_H__ +#define __TIZEN_ATTACH_PANEL_INTERNAL_H__ + +#include +#include + +#define DATA_KEY_ATTACH_PANEL "__dkap__" +#define DATA_KEY_ATTACH_PANEL_INFO "__dkapi__" +#define DATA_KEY_EDGE_TOP "__dket__" +#define DATA_KEY_PAGE "__dkpg__" +#define DATA_KEY_UG "__dkug__" + +#define SELECTION_MODE_SINGLE "single" +#define SELECTION_MODE_MULTIPLE "multiple" + +#define MODE_ENABLE "enable" +#define MODE_DISABLE "disable" +#define MODE_TRUE "true" +#define MODE_FALSE "false" + +#define TABBAR_NAME_MORE "More" +#define BUF_SIZE 128 + +/* + * attach-panel(Caller) <-> UGs & Apps operations + * + * - ATTACH_PANEL_CONTENT_CATEGORY_IMAGE + * appid : "attach-panel-gallery" + * operation : APP_CONTROL_OPERATION_PICK + * mime : "image/(asterisk)" + * extra_data : See below + * 1) APP_CONTROL_DATA_SELECTION_MODE : "single" + * 2) "http://tizen.org/appcontrol/data/total_count" : any numbers + * 3) "http://tizen.org/appcontrol/data/total_size" : any bytes + * return data : See below + * 1) "http://tizen.org/appcontrol/data/selected" + * + * - ATTACH_PANEL_CONTENT_CATEGORY_CAMERA + * appid : "attach-panel-camera" + * operation : APP_CONTROL_OPERATION_CREATE_CONTENT + * mime : NULL + * extra_data : See below + * 1) APP_CONTROL_DATA_SELECTION_MODE : "single" + * 2) "http://tizen.org/appcontrol/data/total_size" : any bytes + * return data : See below + * 1) "http://tizen.org/appcontrol/data/selected" + * + * - ATTACH_PANEL_CONTENT_CATEGORY_VOICE + * appid : "attach-panel-voicerecorder" + * operation : APP_CONTROL_OPERATION_CREATE_CONTENT + * mime : NULL + * extra_data : See below + * 1) APP_CONTROL_DATA_SELECTION_MODE : "single" + * 2) "http://tizen.org/appcontrol/data/total_size" : any bytes + * return data : See below + * 1) "http://tizen.org/appcontrol/data/selected" + * + * - ATTACH_PANEL_CONTENT_CATEGORY_VIDEO + * appid : NULL + * operation : APP_CONTROL_OPERATION_PICK + * mime : "video/(asterisk)" + * extra_data : See below + * 1) APP_CONTROL_DATA_SELECTION_MODE : "multiple" + * 2) "http://tizen.org/appcontrol/data/total_count" : any numbers + * 3) "http://tizen.org/appcontrol/data/total_size" : any bytes + * return data : See below + * 1) "http://tizen.org/appcontrol/data/selected" + * + * - ATTACH_PANEL_CONTENT_CATEGORY_AUDIO + * appid : NULL + * operation : APP_CONTROL_OPERATION_PICK + * mime : "audio/(asterisk)" + * extra_data : See below + * 1) APP_CONTROL_DATA_SELECTION_MODE : "multiple" + * 2) "http://tizen.org/appcontrol/data/total_count" : any numbers + * 3) "http://tizen.org/appcontrol/data/total_size" : any bytes + * return data : See below + * 1) "http://tizen.org/appcontrol/data/selected" + * + * - ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR + * appid : NULL + * operation : APP_CONTROL_OPERATION_PICK + * mime : "application/vnd.tizen.calendar" + * extra_data : See below + * 1) APP_CONTROL_DATA_SELECTION_MODE : "multiple" + * 2) "http://tizen.org/appcontrol/data/mode" : 1 + * 3) "http://tizen.org/appcontrol/data/type" : "vcs" + * 4) "http://tizen.org/appcontrol/data/total_count" : any numbers + * return data : See below + * 1) "http://tizen.org/appcontrol/data/selected" + * + * - ATTACH_PANEL_CONTENT_CATEGORY_CONTACT + * appid : NULL + * operation : APP_CONTROL_OPERATION_PICK + * mime : "application/vnd.tizen.contact" + * extra_data : See below + * 1) APP_CONTROL_DATA_SELECTION_MODE : "multiple" + * 2) "http://tizen.org/appcontrol/data/type" : "vcf" + * return data : See below + * 1) "http://tizen.org/appcontrol/data/selected" + * + * - ATTACH_PANEL_CONTENT_CATEGORY_MYFILES + * appid : NULL + * operation : APP_CONTROL_OPERATION_PICK + * mime : NULL + * extra_data : See below + * 1) APP_CONTROL_DATA_SELECTION_MODE : "multiple" + * 2) "http://tizen.org/appcontrol/data/total_count" : any numbers + * 3) "http://tizen.org/appcontrol/data/total_size" : any bytes + * return data : See below + * 1) "http://tizen.org/appcontrol/data/selected" + * + * - ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER + * appid : NULL + * operation : APP_CONTROL_OPERATION_CREATE_CONTENT + * mime : "video/3gp" + * extra_data : See below + * 1) APP_CONTROL_DATA_SELECTION_MODE : "single" + * 2) "http://tizen.org/appcontrol/data/total_count" : any numbers + * 3) "http://tizen.org/appcontrol/data/total_size" : any bytes + * return data : See below + * 1) "http://tizen.org/appcontrol/data/selected" + + */ + + +/* + * attach-panel(Caller) <-> ui-gadgets(Callee) protocol + * + * - Caller send + * key : "__CALLER_PANEL__" + * value : "attach-panel" + * when : ug_create() + * + * key : APP_CONTROL_DATA_SELECTION_MODE + * value : SELECTION_MODE_MULTIPLE + * when : full mode + * how : ug_send_message() + * + * key : APP_CONTROL_DATA_SELECTION_MODE + * value : SELECTION_MODE_SINGLE + * when : half mode + * how : ug_send_message() + * + * key : "__ATTACH_PANEL_INITIALIZE__" + * value : "enable" + * when : attach_panel_show() + * how : ug_send_message() + * + * key : "__ATTACH_PANEL_SHOW_CONTENT_CATEGORY__" + * value : "true" or "false" + * when : set as true when the content category is shown, and false when it is hidden. + * how : ug_send_message() + * + * - Callee send + * key : "__ATTACH_PANEL_FLICK_DOWN__" + * value : "enable" or "disable" + * when : ug is full, then ug has events. + * how : ug_send_result() + * + * key : "__ATTACH_PANEL_FULL_MODE__" + * value : "enable" + * when : ug needs to be shown on the full mode + * how : ug_send_result() + * + * key : "__ATTACH_PANEL_SHOW_TOOLBAR__" + * value : "true" or "false" + * when : set as true when the panel's tabbar needs to be shown, and false when it needs to be hidden. + * how : ug_send_result() + * + * key : "__ATTACH_PANEL_SHOW_PANEL__" + * value : "true" or "false" + * when : set as true when the panel it needs to be shown, and false when it needs to be hidden. + * how : ug_send_result() + */ + + + +enum { + ATTACH_PANEL_CONTENT_CATEGORY_APP = 0, + ATTACH_PANEL_CONTENT_CATEGORY_UG, +}; + + + +typedef enum { + ATTACH_PANEL_STATE_HIDE, + ATTACH_PANEL_STATE_HALF, + ATTACH_PANEL_STATE_FULL, +} attach_panel_state_e; + + + +struct _attach_panel { + Evas_Object *win; + Evas_Object *attach_panel_rect; + Evas_Object *conformant; + Evas_Object *ui_manager; + Evas_Object *toolbar; + Evas_Object *scroller; + Evas_Object *gesture; + Evas_Object *grid; + Evas_Object *grid_page; + Elm_Object_Item *grid_tabbar_item; + + Eina_List *content_list; + + Ecore_Idler *append_idler; + + attach_panel_state_e attach_panel_port_state; + attach_panel_state_e attach_panel_land_state; + attach_panel_result_cb result_cb; + void *result_data; + attach_panel_event_cb event_cb; + void *event_data; + + Evas_Coord transit_width; + Evas_Coord transit_height; + + Eina_Bool is_delete; + Eina_Bool rotate; + Eina_Bool flick; + int cur_page_no; + int cur_event_state; + int magic_no; +}; +typedef struct _attach_panel attach_panel_s; + + + +struct _innate_content { + /* default information */ + const char *appid; + const char *name; + const char *icon; + const char *tabbar_name; + int content_category; + int is_ug; + + /* launching features */ + const char *operation; + const char *type; + const char *item_type; + const char *selection_mode; + const char *mime; + int mode; + int max; +}; +typedef struct _innate_content innate_content_s; + + + +struct _content { + attach_panel_s *attach_panel; + innate_content_s *innate_content_info; + Elm_Object_Item *tabbar_item; + Elm_Object_Item *grid_item; + Evas_Object *content; + Evas_Object *page; + bundle *extra_data; + int index; + int order; +}; +typedef struct _content content_s; + + + +extern void _attach_panel_del(attach_panel_s *attach_panel); + + + +#endif // __TIZEN_ATTACH_PANEL_INTERNAL_H__ diff --git a/include/conf.h b/include/conf.h new file mode 100644 index 0000000..c0cb907 --- /dev/null +++ b/include/conf.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ATTACH_PANEL_CONF_H__ +#define __ATTACH_PANEL_CONF_H__ + +#define TOOLBAR_HEIGHT (54) +#define BASE_TRANSIT_HEIGHT_REL 0.34 +#define GRID_ROW_COUNT 4 +#define GRID_ITEM_HEIGHT_REL 1.15 +#define GRID_ICON_SIZE_REL 0.5 +#define ORDER_MAX 99 + + +#endif diff --git a/include/content_list.h b/include/content_list.h new file mode 100644 index 0000000..7abd204 --- /dev/null +++ b/include/content_list.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_ATTACH_PANEL_CONTENT_LIST_H__ +#define __TIZEN_ATTACH_PANEL_CONTENT_LIST_H__ + +#include + + + +void _content_list_send_message(Eina_List *list, const char *key, const char *value, int is_ug); +void _content_list_send_message_to_content(Eina_List *list, const char *key, const char *value, int cur_page_no); +void _content_list_set_pause(Eina_List *list, int is_ug); +void _content_list_set_resume(Eina_List *list, int is_ug); + + +#endif diff --git a/include/gesture.h b/include/gesture.h new file mode 100644 index 0000000..5fd1247 --- /dev/null +++ b/include/gesture.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_ATTACH_PANEL_GESTURE_H__ +#define __TIZEN_ATTACH_PANEL_GESTURE_H__ + +#include + + + +extern void _gesture_show(attach_panel_h attach_panel); +extern void _gesture_hide(attach_panel_h attach_panel); + +extern void _gesture_set_full_mode(attach_panel_h attach_panel); +extern attach_panel_state_e _gesture_get_state(void); +extern void _gesture_set_state(attach_panel_state_e state); + +extern Evas_Object *_gesture_create(attach_panel_h attach_panel); +extern void _gesture_destroy(attach_panel_h attach_panel); + + +#endif diff --git a/include/grid.h b/include/grid.h new file mode 100644 index 0000000..7c122f3 --- /dev/null +++ b/include/grid.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ATTACH_PANEL_GRID_H__ +#define __ATTACH_PANEL_GRID_H__ + +#include + +extern Evas_Object *_grid_create(Evas_Object *page, attach_panel_h attach_panel); +extern void _grid_destroy(Evas_Object *grid); +extern void _grid_refresh(Evas_Object *grid); + +extern Elm_Object_Item *_grid_append_item(Evas_Object *grid, content_s *content_info); +extern void _grid_remove_item(Evas_Object *grid, content_s *content_info); + +extern int _grid_count_item(Evas_Object *grid); +extern Eina_Bool _grid_can_flick(attach_panel_h attach_panel); + +#endif /* __ATTACH_PANEL_GRID_H__ */ diff --git a/include/list.h b/include/list.h new file mode 100644 index 0000000..69eddc5 --- /dev/null +++ b/include/list.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ATTACH_PANEL_LIST_H__ +#define __ATTACH_PANEL_LIST_H__ + +extern Eina_List *_list_sort_by_rua(Eina_List *content_list); + +#endif diff --git a/include/log.h b/include/log.h new file mode 100644 index 0000000..8d7bfeb --- /dev/null +++ b/include/log.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ATTACH_PANEL_LOG_H__ +#define __ATTACH_PANEL_LOG_H__ + +#include + +#undef LOG_TAG +#define LOG_TAG "ATTACH_PANEL" + +#if defined(D_) +#undef D_ +#endif +#define D_(str) dgettext(PACKAGE, str) + +#if !defined(_D) +#define _D(fmt, arg...) LOGD(fmt"\n", ##arg) +#endif + +#if !defined(_W) +#define _W(fmt, arg...) LOGW(fmt"\n", ##arg) +#endif + +#if !defined(_E) +#define _E(fmt, arg...) LOGE(fmt"\n", ##arg) +#endif + +#if !defined(_SD) +#define _SD(fmt, arg...) SECURE_LOGD(fmt"\n", ##arg) +#endif + +#if !defined(_SW) +#define _SW(fmt, arg...) SECURE_LOGW(fmt"\n", ##arg) +#endif + +#if !defined(_SE) +#define _SE(fmt, arg...) SECURE_LOGE(fmt"\n", ##arg) +#endif + +#define retv_if(expr, val) do { \ + if(expr) { \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ +} while (0) + +#define ret_if(expr) do { \ + if(expr) { \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ +} while (0) + +#define goto_if(expr, val) do { \ + if(expr) { \ + _E("(%s) -> goto", #expr); \ + goto val; \ + } \ +} while (0) + +#define break_if(expr) { \ + if(expr) { \ + _E("(%s) -> break", #expr); \ + break; \ + } \ +} + +#define continue_if(expr) { \ + if(expr) { \ + _E("(%s) -> continue", #expr); \ + continue; \ + } \ +} + +#endif /* __ATTACH_PANEL_LOG_H__ */ diff --git a/include/page.h b/include/page.h new file mode 100644 index 0000000..3e9f9ad --- /dev/null +++ b/include/page.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ATTACH_PANEL_PAGE_H__ +#define __ATTACH_PANEL_PAGE_H__ + +#include + +extern Evas_Object *_page_create(attach_panel_h attach_panel, int width, int height); +extern void _page_destroy(Evas_Object *page); + +extern void _page_resize(Evas_Object *page, int width, int height); + +#endif /* __ATTACH_PANEL_PAGE_H__ */ diff --git a/include/scroller.h b/include/scroller.h new file mode 100644 index 0000000..a9938d4 --- /dev/null +++ b/include/scroller.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ATTACH_PANEL_SCROLLER_H__ +#define __ATTACH_PANEL_SCROLLER_H__ + +#include + +typedef enum { + SCROLLER_EVENT_TYPE_INVALID = 0, + SCROLLER_EVENT_TYPE_SCROLL, + SCROLLER_EVENT_TYPE_MAX, +} scroller_event_type_e; + +extern Evas_Object *_scroller_create(Evas_Object *ui_manager, attach_panel_h attach_panel); +extern void _scroller_destroy(Evas_Object *scroller); + +extern void _scroller_append_page(Evas_Object *scroller, Evas_Object *page); +extern void _scroller_remove_page(Evas_Object *scroller, Evas_Object *page); + +extern void _scroller_bring_in_page(Evas_Object *scroller, Evas_Object *page, int *cur_page_no); + +extern int _scroller_is_scrolling(Evas_Object *scroller); +extern void _scroller_resize(Evas_Object *scroller, int width, int height); + +extern int _scroller_register_event_cb(Evas_Object *scroller, int event_type, void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *data), void *data); +extern int _scroller_unregister_event_cb(Evas_Object *scroller, int event_type, void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *data)); + +#endif /* __ATTACH_PANEL_SCROLLER_H__ */ diff --git a/include/toolbar.h b/include/toolbar.h new file mode 100644 index 0000000..5fa8924 --- /dev/null +++ b/include/toolbar.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ATTACH_PANEL_TOOLBAR_H__ +#define __ATTACH_PANEL_TOOLBAR_H__ + +#include + +typedef enum { + TOOLBAR_EVENT_TYPE_INVALID = 0, + TOOLBAR_EVENT_TYPE_CHANGE_TAB, + TOOLBAR_EVENT_TYPE_MAX, +} toolbar_event_type_e; + +extern Evas_Object *_toolbar_create(Evas_Object *ui_manager, attach_panel_h attach_panel); +extern void _toolbar_destroy(Evas_Object *toolbar); + +extern Elm_Object_Item *_toolbar_append_item(Evas_Object *toolbar, const char *tab_name, Evas_Object *page); +extern void _toolbar_remove_item(Evas_Object *toolbar, Elm_Object_Item *tabbar_item); + +extern void _toolbar_bring_in(Evas_Object *toolbar, Elm_Object_Item *tabbar_item); +extern unsigned int _toolbar_count_item(Evas_Object *toolbar); + + +extern int _toolbar_register_event_cb(Evas_Object *toolbar, int event_type, void (*event_cb)(Evas_Object *toolbar, int event_type, void *event_info, void *data), void *data); +extern int _toolbar_unregister_event_cb(Evas_Object *toolbar, int event_type, void (*event_cb)(Evas_Object *toolbar, int event_type, void *event_info, void *data)); + +#endif /* __ATTACH_PANEL_TOOLBAR_H__ */ diff --git a/include/ug.h b/include/ug.h new file mode 100644 index 0000000..a39b84f --- /dev/null +++ b/include/ug.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_ATTACH_PANEL_UG_H__ +#define __TIZEN_ATTACH_PANEL_UG_H__ + +#include + +extern Evas_Object *_ug_create(const char *appid, const char *operation, const char *selection_mode, const char *mime, bundle *bundle, content_s *content_info); +extern void _ug_destroy(Evas_Object *ug_layout); + +#endif /* __TIZEN_ATTACH_PANEL_UG_H__ */ diff --git a/include/ui_manager.h b/include/ui_manager.h new file mode 100644 index 0000000..fc71378 --- /dev/null +++ b/include/ui_manager.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_ATTACH_PANEL_UI_MANAGER_H__ +#define __TIZEN_ATTACH_PANEL_UI_MANAGER_H__ + +#include + +extern int _ui_manager_append_content_category(Evas_Object *ui_manager, innate_content_s *innate_content_info, bundle *extra_data); +extern void _ui_manager_remove_content_category(Evas_Object *ui_manager, content_s *content_info); + +extern Evas_Object *_ui_manager_create(attach_panel_h attach_panel); +extern void _ui_manager_destroy(Evas_Object *ui_manager); +extern Evas_Object *_ui_manager_create_content(Evas_Object *page, content_s *content_info, attach_panel_h attach_panel); +extern void _ui_manager_destroy_content(content_s *content_info, attach_panel_h attach_panel); + +#endif /* __TIZEN_ATTACH_PANEL_UI_MANAGER_H__ */ diff --git a/packaging/attach-panel.spec b/packaging/attach-panel.spec new file mode 100755 index 0000000..f970f50 --- /dev/null +++ b/packaging/attach-panel.spec @@ -0,0 +1,79 @@ +Name: attach-panel +Summary: Attach Panel +Version: 0.1.0 +Release: 0 +Group: Application +License: Apache-2.0 +Source0: %{name}-%{version}.tar.gz + +%if "%{?tizen_profile_name}" == "wearable" +ExcludeArch: %{arm} %ix86 x86_64 +%endif + +BuildRequires: cmake +BuildRequires: edje-tools +BuildRequires: gettext-tools + +BuildRequires: pkgconfig(appcore-efl) +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(bundle) +BuildRequires: pkgconfig(capi-base-common) +BuildRequires: pkgconfig(capi-system-info) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(edje) +BuildRequires: pkgconfig(efl-extension) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(feedback) +BuildRequires: pkgconfig(isf) +BuildRequires: pkgconfig(security-privilege-checker) +BuildRequires: pkgconfig(ui-gadget-1) +BuildRequires: pkgconfig(rua) + +%description +Description: Attach Panel + +%prep +%setup -q + +%package devel +Summary: Attach panel library (devel) +Group: Application +Requires: %{name} = %{version}-%{release} + +%description devel +Development files needed to build software that needs Attach panel. + +%build +export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE" +export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE" + +%if 0%{?tizen_build_binary_release_type_eng} +export CFLAGS="$CFLAGS -DTIZEN_ENGINEER_MODE" +export CXXFLAGS="$CXXFLAGS -DTIZEN_ENGINEER_MODE" +export FFLAGS="$FFLAGS -DTIZEN_ENGINEER_MODE" +%endif + +%cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +%make_install + +%post + +%files +%manifest %{name}.manifest +%{_prefix}/lib/*.so* +%{_datadir}/attach-panel/edje/*.edj +%{_datadir}/attach-panel/sample/* +%{_datadir}/icons/*.png +%{_prefix}/ug/res/locale/*/LC_MESSAGES/* + +%files devel +%defattr(-,root,root,-) +%{_includedir}/attach-panel/attach_panel.h +%{_libdir}/pkgconfig/%{name}.pc diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100755 index 0000000..c15ddcc --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,92 @@ +# for i18n + +SET(POFILES + ar.po + az.po + bg.po + bn.po + ca.po + cs.po + da.po + de.po + de_DE.po + el_GR.po + en.po + en_PH.po + en_US.po + es_ES.po + es_MX.po + es_US.po + et.po + eu.po + fa.po + fi.po + fr.po + fr_CA.po + fr_FR.po + ga.po + gl.po + gu.po + he.po + hi.po + hr.po + hu.po + hy.po + is.po + it_IT.po + ja_JP.po + ka.po + kk.po + kn.po + ko_KR.po + lt.po + lv.po + mk.po + ml.po + mn_MN.po + nb.po + nl.po + nl_NL.po + pl.po + pt_BR.po + pt_PT.po + ro.po + ru_RU.po + si.po + sk.po + sl.po + sr.po + sv.po + ta.po + te.po + th.po + tr_TR.po + uk.po + ur.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 /usr/ug/res/locale/${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..081bcfe --- /dev/null +++ b/po/ar.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "التقويم" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "الصور" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "الكاميرا" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "الصوت" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "المزيد" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "مقاطع فيديو" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "ملفات الصوت" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "جهات الاتصال" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "ملفاتي" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "تسجيل\nفيديو" + diff --git a/po/az.po b/po/az.po new file mode 100755 index 0000000..55f574e --- /dev/null +++ b/po/az.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Təqvim" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Şəkil" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Səs" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Dh çx" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videolar" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio fayllar" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Əlaqələr" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Fayllarım" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Video\nyaz" + diff --git a/po/bg.po b/po/bg.po new file mode 100755 index 0000000..52b7ae7 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Календар" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Изобр." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Камера" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Глас" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Още" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Видеоклипове" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Аудиофайлове" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Контакти" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Моите файлове" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Запис\nвидео" + diff --git a/po/bn.po b/po/bn.po new file mode 100755 index 0000000..3cd66b9 --- /dev/null +++ b/po/bn.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "ক্যালেন্ডার" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "চিত্র" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "ক্যামেরা" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "ভয়েস" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "আরও" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "ভিডিওগুলি" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "অডিও ফাইলগুলি" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "পরিচিতিগুলি" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "আমার ফাইলগুলি" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "ভিডিও\nরেকর্ড করুন" + diff --git a/po/ca.po b/po/ca.po new file mode 100755 index 0000000..9005227 --- /dev/null +++ b/po/ca.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendari" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Imatge" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Càmera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Veu" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Més" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Fitxers d'àudio" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contactes" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Meus fitx" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Gravar\nvídeo" + diff --git a/po/cs.po b/po/cs.po new file mode 100755 index 0000000..fc2943b --- /dev/null +++ b/po/cs.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalendář" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Obráz." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Fotoap" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Hlas" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Další" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videa" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Zvukové soubory" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontakty" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Moje soubory" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Nahrát\nvideo" + diff --git a/po/da.po b/po/da.po new file mode 100755 index 0000000..7e0de72 --- /dev/null +++ b/po/da.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalender" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Bldr." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Stemme" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Mere" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videoer" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Lydfiler" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontakter" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mine filer" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Optag\nvideo" + diff --git a/po/de.po b/po/de.po new file mode 100755 index 0000000..996368b --- /dev/null +++ b/po/de.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalender" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Bilder" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Ton" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Mehr" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audiodateien" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontakte" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Eigene Dateien" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Video\naufnehmen" + diff --git a/po/de_DE.po b/po/de_DE.po new file mode 100755 index 0000000..d403a4a --- /dev/null +++ b/po/de_DE.po @@ -0,0 +1,90 @@ +msgid "IDS_ST_MBODY_HOME_SCREEN_WALLPAPER" +msgstr "Hintergrund (Startbildschirm)" + +msgid "IDS_ST_BODY_GALLERY" +msgstr "Galerie" + +msgid "IDS_COM_HEADER_NOTIFICATION" +msgstr "Benachrichtigung" + +msgid "IDS_ST_HEADER_HOME_SCREEN_ABB" +msgstr "Startbildschirm" + +msgid "IDS_ST_BODY_WALLPAPER" +msgstr "Hintergrundbild" + +msgid "IDS_ST_BODY_HOME_SCREEN_SETTINGS" +msgstr "Startseiten-Einstellungen" + +msgid "IDS_ST_BODY_HOME_SCREEN_TYPE" +msgstr "Startanzeige-Typ" + +msgid "IDS_COM_BUTTON_CANCEL" +msgstr "Abbruch" + +msgid "IDS_ST_HEADER_HOME_SCREEN" +msgstr "Startbildschirm" + +msgid "IDS_ST_BODY_DEFAULT_HOME_SCREEN" +msgstr "Klassicher Modus" + +msgid "IDS_ST_BUTTON2_SET_AS_HOME" +msgstr "Home-Taste" + +msgid "IDS_ST_BODY_SELECT_APPLICATION" +msgstr "Anwendung auswählen" + +msgid "IDS_ST_BODY_EASY_MODE" +msgstr "Einfacher Modus" + +msgid "IDS_ST_BODY_THE_OVERALL_LAYOUT_OF_THE_HOME_SCREEN_WILL_BE_SIMPLIFIED" +msgstr "Das generelle Layout des Startbildschirms wird vereinfacht." + +msgid "IDS_ST_BODY_HOME_SCREEN_STYLE" +msgstr "Stil des Startbildschirms" + +msgid "IDS_LCKSCN_BODY_WALLPAPERS" +msgstr "Hintergrund" + +msgid "IDS_SCR_POP_SCREEN_READER_IS_NOT_SUPPORTED_BY_PS_PRESS_THE_BACK_KEY_TO_RETURN_TO_THE_PREVIOUS_SCREEN" +msgstr "Das Bildschirmleseprogramm wird von %s nicht unterstützt. Drücken Sie die Zurück-Taste, um zum vorherigen Bildschirm zurückzukehren." + +msgid "IDS_HELP_BODY_SELECT_AN_OPTION" +msgstr "Option auswählen." + +msgid "IDS_COM_BODY_MENU_ABB" +msgstr "Menü" + +msgid "IDS_HS_OPT_SPIRAL" +msgstr "Spirale" + +msgid "IDS_HS_OPT_INNER_CUBE" +msgstr "Innerer Kubus" + +msgid "IDS_HS_OPT_OUTER_CUBE" +msgstr "Äußerer Kubus" + +msgid "IDS_HS_OPT_CAROUSEL" +msgstr "Karussell" + +msgid "IDS_HS_HEADER_PAGE_NAVIGATION_EFFECT" +msgstr "Effekt für Seitennavigation" + +msgid "IDS_ST_HEADER_SELECT_WALLPAPER_FROM_ABB" +msgstr "Hintergrund auswählen aus" + +msgid "IDS_HS_POP_EASY_MODE_CAN_BE_DISABLED_IN_SETTINGS" +msgstr "Der einfache Modus kann in den Einstellungen deaktiviert werden." + +msgid "IDS_ST_BODY_3D_ROTATION_M_EFFECT" +msgstr "3D-Drehung" + +msgid "IDS_ST_BODY_LOADING_ING" +msgstr "Lädt..." + +msgid "IDS_ST_POP_THE_FONT_SIZE_CAN_BE_INCREASED_TO_MAKE_TEXT_EASIER_TO_READ_CHANGE_THE_FONT_SIZE_NOW_Q" +msgstr "Die Schrift kann vergrößert werden, damit Text leichter lesbar ist. Schriftgröße jetzt ändern?" + +msgid "IDS_ST_SK_CHANGE" +msgstr "Ändern" + diff --git a/po/el_GR.po b/po/el_GR.po new file mode 100755 index 0000000..e00207a --- /dev/null +++ b/po/el_GR.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Ημερολόγιο" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Εικόν." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Κάμερα" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Φωνή" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Περισ." + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Βίντεο" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Αρχεία ήχου" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Επαφές" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Τα Αρχεία Μου" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Εγγραφή\nβίντεο" + diff --git a/po/en.po b/po/en.po new file mode 100755 index 0000000..5dab7a8 --- /dev/null +++ b/po/en.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendar" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Images" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Camera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voice" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "More" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio files" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contacts" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "My Files" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Record\nvideo" + diff --git a/po/en_PH.po b/po/en_PH.po new file mode 100755 index 0000000..5dab7a8 --- /dev/null +++ b/po/en_PH.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendar" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Images" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Camera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voice" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "More" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio files" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contacts" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "My Files" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Record\nvideo" + diff --git a/po/en_US.po b/po/en_US.po new file mode 100755 index 0000000..5dab7a8 --- /dev/null +++ b/po/en_US.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendar" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Images" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Camera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voice" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "More" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio files" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contacts" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "My Files" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Record\nvideo" + diff --git a/po/es_ES.po b/po/es_ES.po new file mode 100755 index 0000000..a0fdd56 --- /dev/null +++ b/po/es_ES.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendario" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Imagen" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Cámara" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voz" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Más" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Archivos de audio" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contactos" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mis archivos" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Grabar\nvídeo" + diff --git a/po/es_MX.po b/po/es_MX.po new file mode 100755 index 0000000..d7c53be --- /dev/null +++ b/po/es_MX.po @@ -0,0 +1,90 @@ +msgid "IDS_ST_MBODY_HOME_SCREEN_WALLPAPER" +msgstr "Fondo de pantalla de inicio" + +msgid "IDS_ST_BODY_GALLERY" +msgstr "Galería" + +msgid "IDS_COM_HEADER_NOTIFICATION" +msgstr "Notificación" + +msgid "IDS_ST_HEADER_HOME_SCREEN_ABB" +msgstr "Pantalla de inicio" + +msgid "IDS_ST_BODY_WALLPAPER" +msgstr "Fondo de pantalla" + +msgid "IDS_ST_BODY_HOME_SCREEN_SETTINGS" +msgstr "Configuración de pantalla de inicio" + +msgid "IDS_ST_BODY_HOME_SCREEN_TYPE" +msgstr "Tipo de pantalla de inicio" + +msgid "IDS_COM_BUTTON_CANCEL" +msgstr "Cancelar" + +msgid "IDS_ST_HEADER_HOME_SCREEN" +msgstr "Pantalla de inicio" + +msgid "IDS_ST_BODY_DEFAULT_HOME_SCREEN" +msgstr "Pantalla de inicio predeterminada" + +msgid "IDS_ST_BUTTON2_SET_AS_HOME" +msgstr "Def. inicio" + +msgid "IDS_ST_BODY_SELECT_APPLICATION" +msgstr "Seleccionar aplicación" + +msgid "IDS_ST_BODY_EASY_MODE" +msgstr "Modo fácil" + +msgid "IDS_ST_BODY_THE_OVERALL_LAYOUT_OF_THE_HOME_SCREEN_WILL_BE_SIMPLIFIED" +msgstr "Se simplificará el diseño general de la pantalla de inicio." + +msgid "IDS_ST_BODY_HOME_SCREEN_STYLE" +msgstr "Estilo de pantalla de inicio" + +msgid "IDS_LCKSCN_BODY_WALLPAPERS" +msgstr "Fondos de pantalla" + +msgid "IDS_SCR_POP_SCREEN_READER_IS_NOT_SUPPORTED_BY_PS_PRESS_THE_BACK_KEY_TO_RETURN_TO_THE_PREVIOUS_SCREEN" +msgstr "El Lector de pantalla no es compatible con %s. Presione la tecla Atrás para regresar a la pantalla anterior." + +msgid "IDS_HELP_BODY_SELECT_AN_OPTION" +msgstr "Seleccione una opción" + +msgid "IDS_COM_BODY_MENU_ABB" +msgstr "Menú" + +msgid "IDS_HS_OPT_SPIRAL" +msgstr "Espiral" + +msgid "IDS_HS_OPT_INNER_CUBE" +msgstr "Cubo interior" + +msgid "IDS_HS_OPT_OUTER_CUBE" +msgstr "Cubo exterior" + +msgid "IDS_HS_OPT_CAROUSEL" +msgstr "Carrusel" + +msgid "IDS_HS_HEADER_PAGE_NAVIGATION_EFFECT" +msgstr "Efecto de navegación de página" + +msgid "IDS_ST_HEADER_SELECT_WALLPAPER_FROM_ABB" +msgstr "Selec. fondo de pantalla de" + +msgid "IDS_HS_POP_EASY_MODE_CAN_BE_DISABLED_IN_SETTINGS" +msgstr "El modo fácil se puede desactivar en Configuración" + +msgid "IDS_ST_BODY_3D_ROTATION_M_EFFECT" +msgstr "Rotación 3D" + +msgid "IDS_ST_BODY_LOADING_ING" +msgstr "Cargando..." + +msgid "IDS_ST_POP_THE_FONT_SIZE_CAN_BE_INCREASED_TO_MAKE_TEXT_EASIER_TO_READ_CHANGE_THE_FONT_SIZE_NOW_Q" +msgstr "El tamaño de la fuente se puede aumentar para poder leer el texto con más facilidad. ¿Cambiar el tamaño de la fuente ahora?" + +msgid "IDS_ST_SK_CHANGE" +msgstr "Cambiar" + diff --git a/po/es_US.po b/po/es_US.po new file mode 100755 index 0000000..07fd95f --- /dev/null +++ b/po/es_US.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendario" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Imagen" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Cámara" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voz" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Más" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Archivos de audio" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contactos" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mis archivos" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Grabar\nvideo" + diff --git a/po/et.po b/po/et.po new file mode 100755 index 0000000..db3907a --- /dev/null +++ b/po/et.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalender" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Pildid" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kaam." + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Hääl" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Veel" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videod" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Helifailid" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontaktid" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Minu failid" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Salvesta\nvideo" + diff --git a/po/eu.po b/po/eu.po new file mode 100755 index 0000000..dd6bc36 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Egutegia" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Irudiak" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Ahotsa" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Gehia." + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Bideoak" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio fitxategiak" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontaktuak" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Nire fitxat." + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Grabatu\nbideoa" + diff --git a/po/fa.po b/po/fa.po new file mode 100755 index 0000000..cc320a1 --- /dev/null +++ b/po/fa.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "تقویم" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "تصاویر" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "دوربين" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "صدا" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "بیشتر" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "ویدیوها" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "فایل‌های صوتی" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "مخاطبين" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "فایل‌های من" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "ضبط\nویدیو" + diff --git a/po/fi.po b/po/fi.po new file mode 100755 index 0000000..dee19b2 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalenteri" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Kuvat" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Puhe" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Lisää" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videot" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Ääni-\ntiedostot" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Yhteystiedot" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Omat tied." + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Tallenna\nvideota" + diff --git a/po/fr.po b/po/fr.po new file mode 100755 index 0000000..b756122 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendrier" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Images" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Photo" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voix" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Plus" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Vidéos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Fichiers audio" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contacts" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mes fichiers" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Enreg.\nvidéo" + diff --git a/po/fr_CA.po b/po/fr_CA.po new file mode 100755 index 0000000..7375cf8 --- /dev/null +++ b/po/fr_CA.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendrier" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Images" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Photo" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voix" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Plus" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Vidéos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Fichiers audios" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contacts" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mes fichiers" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Enreg.\nvidéo" + diff --git a/po/fr_FR.po b/po/fr_FR.po new file mode 100755 index 0000000..81d70be --- /dev/null +++ b/po/fr_FR.po @@ -0,0 +1,90 @@ +msgid "IDS_ST_MBODY_HOME_SCREEN_WALLPAPER" +msgstr "Fond d'écran d'accueil" + +msgid "IDS_ST_BODY_GALLERY" +msgstr "Galerie" + +msgid "IDS_COM_HEADER_NOTIFICATION" +msgstr "Notification" + +msgid "IDS_ST_HEADER_HOME_SCREEN_ABB" +msgstr "Écran d'accueil" + +msgid "IDS_ST_BODY_WALLPAPER" +msgstr "Fond d'écran" + +msgid "IDS_ST_BODY_HOME_SCREEN_SETTINGS" +msgstr "Paramètres de l'écran d'accueil" + +msgid "IDS_ST_BODY_HOME_SCREEN_TYPE" +msgstr "Type d'écran d'accueil" + +msgid "IDS_COM_BUTTON_CANCEL" +msgstr "Annuler" + +msgid "IDS_ST_HEADER_HOME_SCREEN" +msgstr "Écran d'accueil" + +msgid "IDS_ST_BODY_DEFAULT_HOME_SCREEN" +msgstr "Écran d'accueil par déf." + +msgid "IDS_ST_BUTTON2_SET_AS_HOME" +msgstr "Accueil" + +msgid "IDS_ST_BODY_SELECT_APPLICATION" +msgstr "Sélectionnez une application" + +msgid "IDS_ST_BODY_EASY_MODE" +msgstr "Mode simplifié" + +msgid "IDS_ST_BODY_THE_OVERALL_LAYOUT_OF_THE_HOME_SCREEN_WILL_BE_SIMPLIFIED" +msgstr "La disposition générale de l'écran d'accueil sera simplifiée." + +msgid "IDS_ST_BODY_HOME_SCREEN_STYLE" +msgstr "Style d'écran d'accueil" + +msgid "IDS_LCKSCN_BODY_WALLPAPERS" +msgstr "Fonds d'écran" + +msgid "IDS_SCR_POP_SCREEN_READER_IS_NOT_SUPPORTED_BY_PS_PRESS_THE_BACK_KEY_TO_RETURN_TO_THE_PREVIOUS_SCREEN" +msgstr "Le lecteur d'écran n'est pas pris en charge par %s. Appuyez sur la touche Retour pour revenir à l'écran d'accueil." + +msgid "IDS_HELP_BODY_SELECT_AN_OPTION" +msgstr "Sélectionnez une option." + +msgid "IDS_COM_BODY_MENU_ABB" +msgstr "Menu" + +msgid "IDS_HS_OPT_SPIRAL" +msgstr "Spirale" + +msgid "IDS_HS_OPT_INNER_CUBE" +msgstr "Cube intérieur" + +msgid "IDS_HS_OPT_OUTER_CUBE" +msgstr "Cube extérieur" + +msgid "IDS_HS_OPT_CAROUSEL" +msgstr "Manège" + +msgid "IDS_HS_HEADER_PAGE_NAVIGATION_EFFECT" +msgstr "Effet de navigation sur la page" + +msgid "IDS_ST_HEADER_SELECT_WALLPAPER_FROM_ABB" +msgstr "Sélec. fond écran depuis" + +msgid "IDS_HS_POP_EASY_MODE_CAN_BE_DISABLED_IN_SETTINGS" +msgstr "Le mode facile peut être désactivé dans Paramètres" + +msgid "IDS_ST_BODY_3D_ROTATION_M_EFFECT" +msgstr "Rotation 3D" + +msgid "IDS_ST_BODY_LOADING_ING" +msgstr "Chargement en cours." + +msgid "IDS_ST_POP_THE_FONT_SIZE_CAN_BE_INCREASED_TO_MAKE_TEXT_EASIER_TO_READ_CHANGE_THE_FONT_SIZE_NOW_Q" +msgstr "Vous pouvez augmenter la taille de la police pour faciliter la lecture du texte. Changer la taille de la police maintenant ?" + +msgid "IDS_ST_SK_CHANGE" +msgstr "Modifier" + diff --git a/po/ga.po b/po/ga.po new file mode 100755 index 0000000..a89db5a --- /dev/null +++ b/po/ga.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Féilire" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Íomhánna" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Ceam." + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Guth" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Tuill." + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Físeáin" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Comhaid fuaime" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Teagmhálaithe" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mo Chomhaid" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Taifead\nfíseán" + diff --git a/po/gl.po b/po/gl.po new file mode 100755 index 0000000..86b21e5 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendario" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Imaxes" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Cámara" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voz" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Máis" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Arquivos de son" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contactos" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Os meus arqu." + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Gravar\nvídeo" + diff --git a/po/gu.po b/po/gu.po new file mode 100755 index 0000000..11bae67 --- /dev/null +++ b/po/gu.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "કૅલેન્ડર" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "છબીઓ" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "કૅમેરા" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "અવાજ" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "વધુ" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "વિડિયોઝ" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "ઓડિયો ફાઇલ્સ" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "સંપર્કો" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "મારી ફાઇલ્સ" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "વિડિયો\nરેકોર્ડ કરો" + diff --git a/po/he.po b/po/he.po new file mode 100755 index 0000000..758ddcf --- /dev/null +++ b/po/he.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "לוח שנה" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "תמונות" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "מצלמה" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "קול" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "עוד" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "סרטונים" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "קובצי שמע" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "אנשי קשר" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "הקבצים שלי" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "צלם\nוידאו" + diff --git a/po/hi.po b/po/hi.po new file mode 100755 index 0000000..73f99cd --- /dev/null +++ b/po/hi.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "कैलेंडर" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "छवियाँ" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "कैमरा" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "वॉइस" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "अधिक" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "वीडियोज" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "ऑडियो फाइलें" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "संपर्क" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "मेरी फाइलें" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "वीडियो\nरिकॉर्ड करे" + diff --git a/po/hr.po b/po/hr.po new file mode 100755 index 0000000..90431db --- /dev/null +++ b/po/hr.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalendar" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Slike" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Glas" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Više" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videozapisi" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio datoteke" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Imenik" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Moje datoteke" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Snimi\nvideo." + diff --git a/po/hu.po b/po/hu.po new file mode 100755 index 0000000..c8d400a --- /dev/null +++ b/po/hu.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Naptár" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Képek" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Hang" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Egyéb" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videók" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Hangfájlok" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Névjegyzék" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Saját fájlok" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Videó-\nrögzítés" + diff --git a/po/hy.po b/po/hy.po new file mode 100755 index 0000000..9c43710 --- /dev/null +++ b/po/hy.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Օրացույց" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Պատկեր" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Խցիկ" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Ձայն" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Ավելին" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Տեսանյութեր" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Ձայնաֆայլեր" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Կոնտակտներ" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Իմ Ֆայլերը" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Տեսագրել" + diff --git a/po/is.po b/po/is.po new file mode 100755 index 0000000..d4871e1 --- /dev/null +++ b/po/is.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Dagatal" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Myndir" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Taka" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Rödd" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Meira" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Myndskeið" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Hljóðskrár" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Tengiliðir" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Skrár" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Taka\nmyndskeið" + diff --git a/po/it_IT.po b/po/it_IT.po new file mode 100755 index 0000000..96350b9 --- /dev/null +++ b/po/it_IT.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendario" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Immagini" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Camera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voce" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Altro" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Video" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "File audio" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Rubrica" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Archivio" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Registra\nvideo" + diff --git a/po/ja_JP.po b/po/ja_JP.po new file mode 100755 index 0000000..870054c --- /dev/null +++ b/po/ja_JP.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "カレンダー" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "画像" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "カメラ" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "音声" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "その他" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "動画" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "オーディオファイル" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "連絡先" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "マイファイル" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "録画" + diff --git a/po/ka.po b/po/ka.po new file mode 100755 index 0000000..b78df59 --- /dev/null +++ b/po/ka.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "კალენდარი" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "სურათი" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "კამერა" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "ხმა" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "სხვა" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "ვიდეოები" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "აუდიოფაილები" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "კონტაქტები" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "ჩემი ფაილები" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "ვიდეოს\nჩაწერა" + diff --git a/po/kk.po b/po/kk.po new file mode 100755 index 0000000..b287346 --- /dev/null +++ b/po/kk.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Күнтізбе" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Сурет" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Камера" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Дауыс" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Тағы" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Бейнелер" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Аудио файлдар" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Контактілер" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Файлдарым" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Бейне\nжазу" + diff --git a/po/kn.po b/po/kn.po new file mode 100755 index 0000000..f7a4cd3 --- /dev/null +++ b/po/kn.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "ಕ್ಯಾಲೆಂಡರ್" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "ಚಿತ್ರಗಳು" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "ಕ್ಯಾಮರಾ" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "ಧ್ವನಿ" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "ಹೆಚ್ಚು" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "ವೀಡಿಯೊಗಳು" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "ಆಡಿಯೋ ಫೈಲ್‌ಗಳು" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "ಸಂಪರ್ಕಗಳು" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "ನನ್ನ ಫೈಲ್‌ಗಳು" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "ವೀಡಿಯೊ\nರೆಕಾರ್ಡ್" + diff --git a/po/ko_KR.po b/po/ko_KR.po new file mode 100755 index 0000000..e0a407e --- /dev/null +++ b/po/ko_KR.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "캘린더" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "이미지" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "카메라" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "음성" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "더보기" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "동영상" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "오디오 파일" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "연락처" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "내 파일" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "동영상\n촬영" + diff --git a/po/lt.po b/po/lt.po new file mode 100755 index 0000000..ae70361 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalendorius" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Vaizd." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Fot." + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Balsas" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Daug." + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Vaizdo\nįrašai" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Garso failai" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Adresatai" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mano failai" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Įraš.\nvaiz.įr." + diff --git a/po/lv.po b/po/lv.po new file mode 100755 index 0000000..aee4b57 --- /dev/null +++ b/po/lv.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalendārs" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Attēli" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Balss" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Vēl" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videoklipi" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio faili" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontakti" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mani faili" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Ierakst.\nvideo" + diff --git a/po/mk.po b/po/mk.po new file mode 100755 index 0000000..182168a --- /dev/null +++ b/po/mk.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Календар" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Слики" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Камера" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Глас" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Повеќе" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Видеа" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Звучни датотеки" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Контакти" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Мои датотеки" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Снимање\nвидео" + diff --git a/po/ml.po b/po/ml.po new file mode 100755 index 0000000..76911ed --- /dev/null +++ b/po/ml.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "കലണ്ടർ" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "ചിത്ര." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "ക്യാമറ" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "ശബ്ദം" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "കൂടുതൽ" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "വീഡിയോകൾ" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "ഓഡിയോ ഫയലുകൾ" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "കോൺടാക്ടുകള്‍" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "എന്‍റെ ഫയലുകൾ" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "വീഡിയോ\nറെക്കോർഡ് ചെയ്യുക" + diff --git a/po/mn_MN.po b/po/mn_MN.po new file mode 100755 index 0000000..78afc9b --- /dev/null +++ b/po/mn_MN.po @@ -0,0 +1,132 @@ +msgid "IDS_COM_SK_CANCEL" +msgstr "Цуцлах" + +msgid "IDS_ST_MBODY_HOME_SCREEN_WALLPAPER" +msgstr "Эхлэл дэлгэцийн зураг" + +msgid "IDS_ST_BODY_GALLERY" +msgstr "Галерей" + +msgid "IDS_COM_HEADER_NOTIFICATION" +msgstr "Мэдэгдэл" + +msgid "IDS_ST_HEADER_HOME_SCREEN_ABB" +msgstr "Эхлэл дэлгэц" + +msgid "IDS_ST_HEADER_LOCK_SCREEN" +msgstr "Түгжих дэлгэц" + +msgid "IDS_ST_BODY_WALLPAPER" +msgstr "Ханын цаас" + +msgid "IDS_ST_BODY_HOME_AND_LOCK_SCREEN" +msgstr "Эхлэл ба түгжих дэлгэц" + +msgid "IDS_ST_BODY_HOME_SCREEN_SETTINGS" +msgstr "Эхлэл дэлгэцийн тохиргоо" + +msgid "IDS_ST_BODY_HOME_SCREEN_TYPE" +msgstr "Эхлэл дэлгэцийн төрөл" + +msgid "IDS_COM_BUTTON_CANCEL" +msgstr "Цуцлах" + +msgid "IDS_ST_HEADER_HOME_SCREEN" +msgstr "Эх дэлгэц" + +msgid "IDS_ST_BODY_DEFAULT_HOME_SCREEN" +msgstr "Өгөгдмөл эхлэл дэлгэц" + +msgid "IDS_ST_BUTTON2_SET_AS_HOME" +msgstr "Үндсэн болгож тогтоох" + +msgid "IDS_ST_BODY_SELECT_APPLICATION" +msgstr "Програм сонгох" + +msgid "IDS_ST_BODY_EASY_MODE" +msgstr "Хялбар горим" + +msgid "IDS_ST_BODY_THE_OVERALL_LAYOUT_OF_THE_HOME_SCREEN_WILL_BE_SIMPLIFIED" +msgstr "Эхлэл дэлгэцийн ерөнхий байрлалыг хялбаршуулна" + +msgid "IDS_ST_BODY_HOME_SCREEN_STYLE" +msgstr "Эхлэл дэлгэцийн хэв маяг" + +msgid "IDS_LCKSCN_BODY_WALLPAPERS" +msgstr "Ханын цааснууд" + +msgid "IDS_SCR_POP_SCREEN_READER_IS_NOT_SUPPORTED_BY_PS_PRESS_THE_BACK_KEY_TO_RETURN_TO_THE_PREVIOUS_SCREEN" +msgstr "Дэлгэц уншигчийг %s дэмждэггүй. Өмнөх дэлгэц рүү буцахын тулд буцах товчлуурыг дар" + +msgid "IDS_HELP_BODY_SELECT_AN_OPTION" +msgstr "Аль нэг сонголтыг идэвхжүүлнэ." + +msgid "IDS_COM_BODY_MENU_ABB" +msgstr "Цэс" + +msgid "IDS_HS_OPT_SPIRAL" +msgstr "Эргүүлэг" + +msgid "IDS_HS_OPT_INNER_CUBE" +msgstr "Дотоод шоо" + +msgid "IDS_HS_OPT_OUTER_CUBE" +msgstr "Гадна шоо" + +msgid "IDS_HS_OPT_CAROUSEL" +msgstr "Морин тойруулга" + +msgid "IDS_HS_HEADER_PAGE_NAVIGATION_EFFECT" +msgstr "Хуудас удирдах эффект" + +msgid "IDS_ST_HEADER_SELECT_WALLPAPER_FROM_ABB" +msgstr "Дэлгэцийн зураг сонгох" + +msgid "IDS_HS_POP_EASY_MODE_CAN_BE_DISABLED_IN_SETTINGS" +msgstr "Хялбар горимыг Тохиргоонд идэвхгүй болгож болно" + +msgid "IDS_HS_OPT_DISABLE_EASY_MODE" +msgstr "Хялбар горим идэвхгүй болгох" + +msgid "IDS_ST_BODY_3D_ROTATION_M_EFFECT" +msgstr "3D эргэлт" + +msgid "IDS_ST_BODY_LOADING_ING" +msgstr "Ачаалж байна..." + +msgid "IDS_ST_POP_THE_FONT_SIZE_CAN_BE_INCREASED_TO_MAKE_TEXT_EASIER_TO_READ_CHANGE_THE_FONT_SIZE_NOW_Q" +msgstr "Бичвэрийг уншихад амар болгохын тулд үсгийн хэмжээг өсгөж болно. Үсгийн хэмжээг одоо өөрчлөх үү?" + +msgid "IDS_ST_SK_CHANGE" +msgstr "Өөрчлөх" + +msgid "IDS_ST_ACHEADER2_HOME_SCREEN_STYLE" +msgstr "ЭХЛЭЛ ДЭЛГЭЦИЙН ХЭВ МАЯГ" + +msgid "IDS_HS_ACHEADER2_HOME_SCREEN" +msgstr "ЭХЛЭЛ ДЭЛГЭЦ" + +msgid "IDS_COM_HEADER_SELECT_WALLPAPER" +msgstr "Select wallpaper" + +msgid "IDS_ST_BODY_SLIDE" +msgstr "Слайд хийх" + +msgid "IDS_ST_BUTTON2_DEFAULT_WALLPAPERS_ABB" +msgstr "Өгөгдмөл ханын цаас" + +msgid "IDS_HS_BUTTON_DISABLE_ABB" +msgstr "Идэвхгүй болг" + +msgid "IDS_STRAVEL_OPT_TRAVEL_WALLPAPER_ABB" +msgstr "Аяллын ханын цаас" + +msgid "IDS_HS_POP_DISABLE_EASY_MODE_Q" +msgstr "Хялбар горим идэвхгүй болгох уу?" + +msgid "IDS_ST_HEADER_CHANGE_FONT_SIZE_ABB" +msgstr "Үсгийн хэмжээг өөрчлөх" + +msgid "IDS_HELP_BODY_CUBE" +msgstr "Шоо" + diff --git a/po/nb.po b/po/nb.po new file mode 100755 index 0000000..eda1f7f --- /dev/null +++ b/po/nb.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalender" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Bilder" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Tale" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Mer" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videoer" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Lydfiler" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontakter" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mine filer" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Ta opp\nvideo" + diff --git a/po/nl.po b/po/nl.po new file mode 100755 index 0000000..90b30c5 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Agenda" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Afbld." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Camera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Spraak" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Meer" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Video's" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio-\nbestanden" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contacten" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mijn bestanden" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Video\nopnemen" + diff --git a/po/nl_NL.po b/po/nl_NL.po new file mode 100755 index 0000000..6139c46 --- /dev/null +++ b/po/nl_NL.po @@ -0,0 +1,90 @@ +msgid "IDS_ST_MBODY_HOME_SCREEN_WALLPAPER" +msgstr "Achtergrond startscherm" + +msgid "IDS_ST_BODY_GALLERY" +msgstr "Galerij" + +msgid "IDS_COM_HEADER_NOTIFICATION" +msgstr "Melding" + +msgid "IDS_ST_HEADER_HOME_SCREEN_ABB" +msgstr "Startscherm" + +msgid "IDS_ST_BODY_WALLPAPER" +msgstr "Achtergrond" + +msgid "IDS_ST_BODY_HOME_SCREEN_SETTINGS" +msgstr "Instellingen startscherm" + +msgid "IDS_ST_BODY_HOME_SCREEN_TYPE" +msgstr "Type startscherm" + +msgid "IDS_COM_BUTTON_CANCEL" +msgstr "Annuleer" + +msgid "IDS_ST_HEADER_HOME_SCREEN" +msgstr "Startscherm" + +msgid "IDS_ST_BODY_DEFAULT_HOME_SCREEN" +msgstr "Standaard startscherm" + +msgid "IDS_ST_BUTTON2_SET_AS_HOME" +msgstr "Startpagina" + +msgid "IDS_ST_BODY_SELECT_APPLICATION" +msgstr "Applicatie selecteren" + +msgid "IDS_ST_BODY_EASY_MODE" +msgstr "Eenvoudige stand" + +msgid "IDS_ST_BODY_THE_OVERALL_LAYOUT_OF_THE_HOME_SCREEN_WILL_BE_SIMPLIFIED" +msgstr "De algemene indeling van het startscherm wordt vereenvoudigd." + +msgid "IDS_ST_BODY_HOME_SCREEN_STYLE" +msgstr "Stijl startscherm" + +msgid "IDS_LCKSCN_BODY_WALLPAPERS" +msgstr "Achtergronden" + +msgid "IDS_SCR_POP_SCREEN_READER_IS_NOT_SUPPORTED_BY_PS_PRESS_THE_BACK_KEY_TO_RETURN_TO_THE_PREVIOUS_SCREEN" +msgstr "Schermlezer wordt niet ondersteund door %s. Druk op de toets Terug om terug te gaan naar het vorige scherm." + +msgid "IDS_HELP_BODY_SELECT_AN_OPTION" +msgstr "Selecteer een optie." + +msgid "IDS_COM_BODY_MENU_ABB" +msgstr "Menu" + +msgid "IDS_HS_OPT_SPIRAL" +msgstr "Spiraal" + +msgid "IDS_HS_OPT_INNER_CUBE" +msgstr "Binnenste kubus" + +msgid "IDS_HS_OPT_OUTER_CUBE" +msgstr "Buitenste kubus" + +msgid "IDS_HS_OPT_CAROUSEL" +msgstr "Carrousel" + +msgid "IDS_HS_HEADER_PAGE_NAVIGATION_EFFECT" +msgstr "Effect paginanavigatie" + +msgid "IDS_ST_HEADER_SELECT_WALLPAPER_FROM_ABB" +msgstr "Achtergrond selecteren uit" + +msgid "IDS_HS_POP_EASY_MODE_CAN_BE_DISABLED_IN_SETTINGS" +msgstr "Eenvoudige stand kan worden uitgeschakeld in Instellingen" + +msgid "IDS_ST_BODY_3D_ROTATION_M_EFFECT" +msgstr "3D rotatie" + +msgid "IDS_ST_BODY_LOADING_ING" +msgstr "Laden..." + +msgid "IDS_ST_POP_THE_FONT_SIZE_CAN_BE_INCREASED_TO_MAKE_TEXT_EASIER_TO_READ_CHANGE_THE_FONT_SIZE_NOW_Q" +msgstr "Het lettertype kan worden vergroot om de tekst leesbaarder te maken. Tekstgrootte nu wijzigen?" + +msgid "IDS_ST_SK_CHANGE" +msgstr "Wijzigen" + diff --git a/po/pl.po b/po/pl.po new file mode 100755 index 0000000..b6c9a2e --- /dev/null +++ b/po/pl.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalendarz" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Obrazy" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Aparat" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Głos" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Więcej" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Filmy" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Pliki audio" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontakty" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Moje pliki" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Nagraj\nwideo" + diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100755 index 0000000..bee0a39 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendário" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Imag." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Câmera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voz" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Mais" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Arquivos de áudio" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contatos" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Meus Arquivos" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Gravar\nvídeo" + diff --git a/po/pt_PT.po b/po/pt_PT.po new file mode 100755 index 0000000..a9cadb9 --- /dev/null +++ b/po/pt_PT.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Agenda" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Imagens" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Câmara" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voz" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Mais" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Vídeos" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Ficheiros áudio" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contactos" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Meus Ficheiros" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Gravar\nvídeo" + diff --git a/po/ro.po b/po/ro.po new file mode 100755 index 0000000..b658796 --- /dev/null +++ b/po/ro.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Calendar" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Imag." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Cameră" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Voce" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "M. multe" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videoclipuri" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Fişiere audio" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Contacte" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Fiş. mele" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Înreg.\nvideo" + diff --git a/po/ru_RU.po b/po/ru_RU.po new file mode 100755 index 0000000..0caeb18 --- /dev/null +++ b/po/ru_RU.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Календарь" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Изобр." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Камера" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Голос" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Еще" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Видео" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Аудиофайлы" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Контакты" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Мои файлы" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Запись\nвидео" + diff --git a/po/si.po b/po/si.po new file mode 100755 index 0000000..eaed724 --- /dev/null +++ b/po/si.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "දින දසුන" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "අනුරූ" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "කැමරාව" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "හඬ" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "වැඩිදුර" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "වීඩියෝ" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "ශ්‍රව්‍ය ගොනු" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "සබඳතා" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "මගේ ගොනු" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "වීඩියෝ\nපටිගත ක." + diff --git a/po/sk.po b/po/sk.po new file mode 100755 index 0000000..6e6020c --- /dev/null +++ b/po/sk.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalendár" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Fotogr." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Fotoap." + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Hlas" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Ďalšie" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videá" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Zvukové súbory" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontakty" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Moje súbory" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Nahrať\nvideo" + diff --git a/po/sl.po b/po/sl.po new file mode 100755 index 0000000..15498cc --- /dev/null +++ b/po/sl.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Koledar" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Slike" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Fot." + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Glas" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Več" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videi" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Zvočne datoteke" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Stiki" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Moje datoteke" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Snemaj\nvideo" + diff --git a/po/sr.po b/po/sr.po new file mode 100755 index 0000000..300122e --- /dev/null +++ b/po/sr.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalendar" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Slike" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Govor" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Još" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Video zapisi" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio fajlovi" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontakti" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Moji fajlovi" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Snimi\nvideo" + diff --git a/po/sv.po b/po/sv.po new file mode 100755 index 0000000..d05cb8a --- /dev/null +++ b/po/sv.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalender" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Bilder" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Röst" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Mer" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videor" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Ljudfiler" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontakter" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Mina filer" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Spela in\nvideo" + diff --git a/po/ta.po b/po/ta.po new file mode 100755 index 0000000..2d09ac8 --- /dev/null +++ b/po/ta.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "நாட்காட்டி" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "படிமம்" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "கேமரா" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "குரல்" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "மேலும்" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "நிகழ்படங்கள்" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "கேட்பொலி கோப்புகள்" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "தொடர்புகள்" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "எ. கோப்புகள்" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "நிகழ்படத்தை\nபதிவுசெய்." + diff --git a/po/te.po b/po/te.po new file mode 100755 index 0000000..15b9091 --- /dev/null +++ b/po/te.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "క్యాలెండర్" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "చిత్రాలు" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "కెమెరా" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "వాయిస్" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "మరింత" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "వీడియోలు" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "ఆడియో ఫైల్‌లు" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "పరిచయాలు" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "నా ఫైల్‌లు" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "వీడియో\nరికార్డ్ చేయి" + diff --git a/po/th.po b/po/th.po new file mode 100755 index 0000000..e73a69c --- /dev/null +++ b/po/th.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "ปฏิทิน" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "รูปภาพ" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "กล้องถ่ายรูป" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "เสียง" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "เพิ่ม" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "วิดี​โอ" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "ไฟล์เสียง" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "รายชื่อ" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "ไฟล์ส่วนตัว" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "บันทึก\nวิดีโอ" + diff --git a/po/tr_TR.po b/po/tr_TR.po new file mode 100755 index 0000000..7b18ed2 --- /dev/null +++ b/po/tr_TR.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Takvim" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Resmlr" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Ses" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Dha çk" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videolar" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Ses dosyaları" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kişiler" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Dosyalarım" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Video\nkaydı" + diff --git a/po/uk.po b/po/uk.po new file mode 100755 index 0000000..2c2cd16 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Календар" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Зобр." + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Камера" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Голос" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Iнше" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Відео" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Аудіофайли" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Контакти" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Мої файли" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Запис\nвідео" + diff --git a/po/ur.po b/po/ur.po new file mode 100755 index 0000000..bde4466 --- /dev/null +++ b/po/ur.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "کیلنڈر" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "تصاویر" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "کیمرہ" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "آواز" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "مزید" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "ویڈیوز" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "آڈیو فائلیں" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "رابطے" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "میری فائلیں" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "ریکارڈ\nویڈیو" + diff --git a/po/uz.po b/po/uz.po new file mode 100755 index 0000000..1ad0f5c --- /dev/null +++ b/po/uz.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "Kalendar" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "Tasvir" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "Kamera" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "Ovoz" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "Yana" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "Videolar" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "Audio fayllar" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "Kontaktlar" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "Fayllarim" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "Video\nyozish" + diff --git a/po/zh_CN.po b/po/zh_CN.po new file mode 100755 index 0000000..898a70d --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "日历" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "图片" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "照相机" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "语音" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "更多" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "视频" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "音频文件" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "联系人" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "我的文件" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "录制\n视频" + diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100755 index 0000000..9c1816e --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "日曆" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "圖像" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "相機" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "語音" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "更多" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "影片" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "音訊檔案" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "聯絡人" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "我的檔案" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "錄製\n影片" + diff --git a/po/zh_SG.po b/po/zh_SG.po new file mode 100755 index 0000000..e8e6b36 --- /dev/null +++ b/po/zh_SG.po @@ -0,0 +1,72 @@ +msgid "IDS_ST_MBODY_HOME_SCREEN_WALLPAPER" +msgstr "主屏墙纸" + +msgid "IDS_ST_BODY_GALLERY" +msgstr "画廊" + +msgid "IDS_COM_HEADER_NOTIFICATION" +msgstr "通知" + +msgid "IDS_ST_HEADER_HOME_SCREEN_ABB" +msgstr "主屏" + +msgid "IDS_ST_BODY_WALLPAPER" +msgstr "墙纸" + +msgid "IDS_ST_BODY_HOME_SCREEN_SETTINGS" +msgstr "主屏设置" + +msgid "IDS_ST_BODY_HOME_SCREEN_TYPE" +msgstr "主屏类型" + +msgid "IDS_COM_BUTTON_CANCEL" +msgstr "取消" + +msgid "IDS_ST_HEADER_HOME_SCREEN" +msgstr "主屏" + +msgid "IDS_ST_BODY_DEFAULT_HOME_SCREEN" +msgstr "默认主屏" + +msgid "IDS_ST_BUTTON2_SET_AS_HOME" +msgstr "设置为首页" + +msgid "IDS_ST_BODY_SELECT_APPLICATION" +msgstr "选择应用程序" + +msgid "IDS_ST_BODY_EASY_MODE" +msgstr "简易模式" + +msgid "IDS_ST_BODY_THE_OVERALL_LAYOUT_OF_THE_HOME_SCREEN_WILL_BE_SIMPLIFIED" +msgstr "主屏的总布局将简化" + +msgid "IDS_ST_BODY_HOME_SCREEN_STYLE" +msgstr "主屏风格" + +msgid "IDS_SCR_POP_SCREEN_READER_IS_NOT_SUPPORTED_BY_PS_PRESS_THE_BACK_KEY_TO_RETURN_TO_THE_PREVIOUS_SCREEN" +msgstr "%s 不支援屏幕阅读器。请按下返回键以回到前一个屏幕" + +msgid "IDS_HELP_BODY_SELECT_AN_OPTION" +msgstr "选择一个选项。" + +msgid "IDS_COM_BODY_MENU_ABB" +msgstr "菜单" + +msgid "IDS_HS_OPT_SPIRAL" +msgstr "螺旋" + +msgid "IDS_HS_OPT_INNER_CUBE" +msgstr "内立方" + +msgid "IDS_HS_OPT_OUTER_CUBE" +msgstr "外立方" + +msgid "IDS_HS_OPT_CAROUSEL" +msgstr "旋转木马轮播" + +msgid "IDS_HS_HEADER_PAGE_NAVIGATION_EFFECT" +msgstr "页面导航效果" + +msgid "IDS_ST_HEADER_SELECT_WALLPAPER_FROM_ABB" +msgstr "选择墙纸来源" + diff --git a/po/zh_TW.po b/po/zh_TW.po new file mode 100755 index 0000000..0dddbb5 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,30 @@ +msgid "IDS_EMAIL_BUTTON2_CALENDAR" +msgstr "日曆" + +msgid "IDS_COM_TAB4_IMAGES_ABB2" +msgstr "圖像" + +msgid "IDS_COM_TAB4_CAMERA" +msgstr "相機" + +msgid "IDS_COM_TAB4_VOICE" +msgstr "語音" + +msgid "IDS_COM_TAB4_MORE_ABB" +msgstr "更多" + +msgid "IDS_COM_BUTTON2_VIDEOS" +msgstr "影片" + +msgid "IDS_COM_BUTTON2_AUDIO_FILES" +msgstr "音訊檔案" + +msgid "IDS_COM_BUTTON2_CONTACTS" +msgstr "聯絡人" + +msgid "IDS_COM_BUTTON_MY_FILES_ABB" +msgstr "我的檔案" + +msgid "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB" +msgstr "錄影" + diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt new file mode 100644 index 0000000..3c0315b --- /dev/null +++ b/res/CMakeLists.txt @@ -0,0 +1,2 @@ +ADD_SUBDIRECTORY(edje) +ADD_SUBDIRECTORY(images) diff --git a/res/edje/CMakeLists.txt b/res/edje/CMakeLists.txt new file mode 100755 index 0000000..692667f --- /dev/null +++ b/res/edje/CMakeLists.txt @@ -0,0 +1,15 @@ +FILE(GLOB edc_files ${CMAKE_CURRENT_SOURCE_DIR}/*.edc) +FOREACH(edc_file ${edc_files}) + GET_FILENAME_COMPONENT( FName ${edc_file} NAME_WE ) + MESSAGE("${FName}") + ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${FName}.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/../images + ${CMAKE_CURRENT_SOURCE_DIR}/${FName}.edc ${FName}.edj ${EDJE_CFLAGS} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FName}.edc + ) + ADD_CUSTOM_TARGET(${FName}.edj DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FName}.edj) + ADD_DEPENDENCIES(${PROJECT_NAME} ${FName}.edj) +ENDFOREACH(edc_file) + +# install edc files +INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${EDJEDIR} FILES_MATCHING PATTERN "*.edj") diff --git a/res/edje/conf.h b/res/edje/conf.h new file mode 120000 index 0000000..de97229 --- /dev/null +++ b/res/edje/conf.h @@ -0,0 +1 @@ +../../include/conf.h \ No newline at end of file diff --git a/res/edje/layout.edc b/res/edje/layout.edc new file mode 100644 index 0000000..805da51 --- /dev/null +++ b/res/edje/layout.edc @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "conf.h" + +collections { + base_scale: 1.7; + group { + name: "layout"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: 150 154 158 255; + visible: 1; + } + } + part { + name: "toolbar,clip"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "bg"; } + rel2 { relative: 1.0 0.0; to: "bg"; } + min: 0 TOOLBAR_HEIGHT; + fixed: 0 1; + align: 0.5 0.0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + min: 0 0; + } + } + part { + name: "toolbar"; + type: SWALLOW; + clip_to: "toolbar,clip"; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "toolbar,clip"; } + rel2 { relative: 1.0 1.0; to: "toolbar,clip"; } + fixed: 0 1; + align: 0.5 0.5; + visible: 1; + } + } + part { + name: "scroller"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 1.0; to: "toolbar,clip"; } + rel2 { relative: 1.0 1.0; to: "bg"; } + align: 0.5 1.0; + fixed: 1 1; + visible: 1; + } + } + } + programs { + program { + name: "toolbar,show"; + signal: "toolbar,show"; + source: "toolbar"; + action: STATE_SET "default" 0.0; + target: "toolbar,clip"; + transition: LINEAR 0.2; + } + program { + name: "toolbar,hide"; + signal: "toolbar,hide"; + source: "toolbar"; + action: STATE_SET "hide" 0.0; + target: "toolbar,clip"; + transition: LINEAR 0.2; + } + } + } // group + group { + name: "grid,icon"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: 255 255 255 0; + visible: 1; + } + } + part { + name: "icon"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.5 0.55; to: "bg"; } + rel2 { relative: 0.5 0.55; to: "bg"; } + fixed: 1 1; + align: 0.5 0.5; + visible: 1; + } + } + } + } +} // collections + + + +// End of file diff --git a/res/edje/page.edc b/res/edje/page.edc new file mode 100644 index 0000000..c96b315 --- /dev/null +++ b/res/edje/page.edc @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +collections { + base_scale: 1.7; + group { + name: "page"; + parts { + part { + name: "bg"; + type: SWALLOW; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + visible: 1; + } + } + part { + name: "content"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to, "bg"; } + rel2 { relative: 1.0 1.0; to, "bg"; } + fixed: 1 1; + visible: 1; + } + } + } + } // group +} // collections + + + +// End of file diff --git a/res/images/A01-1_icon_Menu.png b/res/images/A01-1_icon_Menu.png new file mode 100755 index 0000000000000000000000000000000000000000..962f4cbb332331ba921b70fd2169fc0b699fff10 GIT binary patch literal 7119 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 N7F=JgQq?}{{{in1!{U`v6QF0|VQ}UR&Q&AEG8| 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 F{{g`GDrNux literal 0 HcmV?d00001 diff --git a/res/images/music.png b/res/images/music.png new file mode 100755 index 0000000000000000000000000000000000000000..6db6507bfbfd253ea28ee672cfa9871d727d983e GIT binary patch literal 8466 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 Mikb?Qa#q3r2OszCx&QzG literal 0 HcmV?d00001 diff --git a/res/images/my_files.png b/res/images/my_files.png new file mode 100755 index 0000000000000000000000000000000000000000..5761fa381ac24f39cc8a0c0dd79d1e5d6105d917 GIT binary patch literal 6239 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 JtK@CM{s)H^oyPzG literal 0 HcmV?d00001 diff --git a/sample/CMakeLists.txt b/sample/CMakeLists.txt new file mode 100644 index 0000000..a681b1d --- /dev/null +++ b/sample/CMakeLists.txt @@ -0,0 +1,29 @@ +SET(SAMPLE "sample") + +INCLUDE(FindPkgConfig) +pkg_check_modules(sample_pkgs REQUIRED + dlog + elementary + appcore-efl +) + +FOREACH(sample_flag ${sample_pkgs_CFLAGS}) + SET(SAMPLE_EXTRA_CFLAGS "${SAMPLE_EXTRA_CFLAGS} ${sample_flag}") +ENDFOREACH(sample_flag) + +SET(SAMPLE_EXTRA_CFLAGS, "${SAMPLE_EXTRA_CFALGS} -DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") + +ADD_EXECUTABLE(${SAMPLE} sample.c) + +TARGET_LINK_LIBRARIES(${SAMPLE} ${PROJECT_NAME} ${sample_pkgs_LDFLAGS} ${SAMPLE_EXTRA_LDFLAGS}) + +# install edj +ADD_CUSTOM_TARGET(sample.edj + COMMAND edje_cc ${CMAKE_CURRENT_SOURCE_DIR}/sample.edc sample.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/sample.edc +) +ADD_DEPENDENCIES(${SAMPLE} sample.edj) + +INSTALL(TARGETS ${SAMPLE} DESTINATION ${SAMPLEDIR}) +INSTALL(FILES sample.edj DESTINATION ${SAMPLEDIR}) + diff --git a/sample/sample.c b/sample/sample.c new file mode 100644 index 0000000..3837274 --- /dev/null +++ b/sample/sample.c @@ -0,0 +1,508 @@ +/* + * Samsung API + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/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 "attach_panel.h" +#include "log.h" + + + +const char *const KEY_BACK = "XF86Back"; +const char *const LAYOUT = "/usr/share/attach-panel/sample/sample.edj"; + + + +static struct { + Evas_Object *win; + Evas_Object *layout; + Evas_Object *bg; + Evas_Object *conformant; + attach_panel_h attach_panel; + + int root_w; + int root_h; +} sample_info = { + .win = NULL, + .layout = NULL, + .bg = NULL, + .conformant = NULL, + .attach_panel = NULL, + + .root_w = 0, + .root_h = 0, +}; + + + +static void _rotate_cb(void *data, Evas_Object *obj, void *event) +{ + ret_if(!obj); + + int angle = 0; + + angle = elm_win_rotation_get(obj); + + _D("Angle is %d degree", angle); + + switch (angle) { + case 0: + case 180: + evas_object_size_hint_min_set(obj, sample_info.root_w, sample_info.root_h); + evas_object_resize(obj, sample_info.root_w, sample_info.root_h); + evas_object_move(obj, 0, 0); + break; + case 90: + case 270: + evas_object_size_hint_min_set(obj, sample_info.root_h, sample_info.root_w); + evas_object_resize(obj, sample_info.root_h, sample_info.root_w); + evas_object_move(obj, 0, 0); + break; + default: + _E("cannot reach here"); + } +} + + + +static void _result_cb(attach_panel_h attach_panel, attach_panel_content_category_e content_category, app_control_h result, app_control_result_e result_code, void *user_data) +{ + char **select = NULL; + int i = 0; + int length = 0; + int ret = APP_CONTROL_ERROR_NONE; + + ret_if(!result); + + ret = app_control_get_extra_data_array(result, "http://tizen.org/appcontrol/data/selected", &select, &length); + if (APP_CONTROL_ERROR_NONE == ret) { + for (i = 0; i < length; i++) { + _D("file_path is %s[%d]", select[i], i); + elm_object_part_text_set(sample_info.layout, "result", select[i]); + free(select[i]); + } + } + + free(select); +} + + + +static void _event_cb(attach_panel_h attach_panel, attach_panel_event_e event, void *event_info, void *data) +{ + ret_if(!attach_panel); + + switch (event) { + case ATTACH_PANEL_EVENT_SHOW_START: + _D("attach panel : show start"); + break; + case ATTACH_PANEL_EVENT_SHOW_FINISH: + _D("attach panel : show finish"); + break; + case ATTACH_PANEL_EVENT_HIDE_START: + _D("attach panel : hide start"); + break; + case ATTACH_PANEL_EVENT_HIDE_FINISH: + _D("attach panel : hide finish"); + break; + } +} + + + +static void _win_back_key_cb(void *data, Evas_Object *obj, void *event_info) +{ + bool visible = false; + + if (sample_info.attach_panel) { + if (attach_panel_get_visibility(sample_info.attach_panel, &visible) != ATTACH_PANEL_ERROR_NONE) { + _E("Fail to get visible of attach panel"); + return; + } + if (visible) { + _D("attach panel state : show->hide"); + attach_panel_hide(sample_info.attach_panel); + } else { + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER); + + attach_panel_unset_result_cb(sample_info.attach_panel); + attach_panel_unset_event_cb(sample_info.attach_panel); + + attach_panel_destroy(sample_info.attach_panel); + sample_info.attach_panel = NULL; + } + } else { + ui_app_exit(); + } +} + + + +static void _attach_panel_cancel_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + _D(""); + + if (sample_info.attach_panel) { + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES); + attach_panel_remove_content_category(sample_info.attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER); + + attach_panel_hide(sample_info.attach_panel); + attach_panel_unset_result_cb(sample_info.attach_panel); + attach_panel_unset_event_cb(sample_info.attach_panel); + + attach_panel_destroy(sample_info.attach_panel); + sample_info.attach_panel = NULL; + } +} + + + +static void _attach_panel_create_cb(void *data, Evas_Object *obj, void *event_info) +{ + attach_panel_h attach_panel = NULL; + int ret = ATTACH_PANEL_ERROR_NONE; + bool visible = false; + + if (sample_info.attach_panel) { + _D("attach panel already existed"); + if (attach_panel_get_visibility(sample_info.attach_panel, &visible) != ATTACH_PANEL_ERROR_NONE) { + _E("Fail to get visible of attach panel"); + return; + } + if (!visible) { + _D("attach panel state : hide->show"); + attach_panel_show(sample_info.attach_panel); + } + return; + } + + ret = attach_panel_create(sample_info.conformant, &attach_panel); + ret_if(ATTACH_PANEL_ERROR_NONE != ret); + + attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, NULL); + attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, NULL); + attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VOICE, NULL); + attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, NULL); + attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, NULL); + attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR, NULL); + attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, NULL); + attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, NULL); + attach_panel_add_content_category(attach_panel, ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, NULL); + attach_panel_set_result_cb(attach_panel, _result_cb, NULL); + attach_panel_set_event_cb(attach_panel, _event_cb, NULL); + + attach_panel_show(attach_panel); + + sample_info.attach_panel = attach_panel; +} + + + +static Evas_Object *_create_entry(Evas_Object *layout) +{ + Evas_Object *entry = NULL; + + retv_if(!layout, NULL); + + entry = elm_entry_add(layout); + retv_if(!entry, NULL); + + elm_entry_scrollable_set(entry, EINA_TRUE); + elm_object_part_text_set(entry, "elm.guide", "search"); + + elm_object_part_content_set(layout, "entry", entry); + + elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT); + elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL); + elm_entry_prediction_allow_set(entry, EINA_FALSE); + elm_entry_autocapital_type_set(entry, ELM_AUTOCAPITAL_TYPE_NONE); + elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); + elm_entry_input_panel_return_key_disabled_set(entry, EINA_FALSE); + + evas_object_show(entry); + + return entry; +} + + + +static void _destroy_entry(Evas_Object *layout) +{ + Evas_Object *entry = NULL; + _D(""); + + entry = elm_object_part_content_unset(layout, "entry"); + if (!entry) { + return; + } + evas_object_del(entry); +} + + + +static Evas_Object *_create_button(Evas_Object *layout) +{ + Evas_Object *button = NULL; + + retv_if(!layout, NULL); + + button = elm_button_add(layout); + retv_if(!button, NULL); + + elm_object_text_set(button, "attach"); + elm_object_part_content_set(layout, "button", button); + evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(button); + + evas_object_smart_callback_add(button, "clicked", _attach_panel_create_cb, NULL); + + return button; +} + + + +static void _destroy_button(Evas_Object *layout) +{ + Evas_Object *button = NULL; + + button = elm_object_part_content_unset(layout, "button"); + if (!button) { + return; + } + + evas_object_smart_callback_del(button, "clicked", _attach_panel_create_cb); + evas_object_del(button); +} + + + +static void _destroy_layout(void) +{ + ret_if(!sample_info.layout); + + _destroy_button(sample_info.layout); + _destroy_entry(sample_info.layout); + + elm_object_signal_callback_del(sample_info.layout, "bg,up", "bg", _attach_panel_cancel_cb); + + if (sample_info.conformant) { + elm_object_content_unset(sample_info.conformant); + } + evas_object_del(sample_info.layout); + sample_info.layout = NULL; +} + + + +static Evas_Object *_create_layout(Evas_Object *parent) +{ + Evas_Object *layout = NULL; + Eina_Bool ret = EINA_FALSE; + + retv_if(!parent, NULL); + + layout = elm_layout_add(parent); + goto_if(!layout, ERROR); + + ret = elm_layout_file_set(layout, LAYOUT, "layout"); + goto_if(EINA_FALSE == ret, ERROR); + + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(layout); + elm_object_signal_callback_add(layout, "bg,up", "bg", _attach_panel_cancel_cb, NULL); + + goto_if(!_create_entry(layout), ERROR); + goto_if(!_create_button(layout), ERROR); + + elm_object_content_set(parent, layout); + + return layout; + + +ERROR: + _destroy_layout(); + return NULL; +} + + + +static Evas_Object *_create_bg(Evas_Object *parent) +{ + Evas_Object *bg = NULL; + retv_if(!parent, NULL); + + bg = elm_bg_add(parent); + retv_if(!bg, NULL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, bg); + + evas_object_show(bg); + + return bg; +} + + + +static void _destroy_bg(void) +{ + ret_if(!sample_info.bg); + evas_object_del(sample_info.bg); + sample_info.bg = NULL; +} + + + +static void _destroy_conformant(void) +{ + ret_if(!sample_info.conformant); + evas_object_del(sample_info.conformant); + sample_info.conformant = NULL; +} + + + +static Evas_Object *_create_conformant(Evas_Object *parent) +{ + Evas_Object *conformant = NULL; + retv_if(!parent, NULL); + + conformant = elm_conformant_add(parent); + retv_if(!conformant, NULL); + + elm_win_indicator_mode_set(parent, ELM_WIN_INDICATOR_SHOW); + elm_win_indicator_opacity_set(parent, ELM_WIN_INDICATOR_OPAQUE); + evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(parent, conformant); + elm_win_conformant_set(parent, EINA_TRUE); + + evas_object_show(conformant); + + return conformant; +} + + + +static void _create_cb(void) +{ + Evas_Object *layout = NULL; + Evas_Object *conformant = NULL; + Evas_Object *bg = NULL; + + sample_info.win = elm_win_add(NULL, "Attach Panel Sample", ELM_WIN_BASIC); + ret_if(!sample_info.win); + + elm_app_base_scale_set(1.7); + + elm_win_title_set(sample_info.win, "Attach Panel"); + elm_win_alpha_set(sample_info.win, EINA_FALSE); + elm_win_borderless_set(sample_info.win, EINA_TRUE); + elm_win_autodel_set(sample_info.win, EINA_TRUE); + elm_win_raise(sample_info.win); + + evas_object_show(sample_info.win); + + elm_win_screen_size_get(sample_info.win, NULL, NULL, &sample_info.root_w, &sample_info.root_h); + _D("screen size is (%d, %d)", sample_info.root_w, sample_info.root_h); + + + if (elm_win_wm_rotation_supported_get(sample_info.win)) { + int rots[4] = { 0, 90, 180, 270 }; + elm_win_wm_rotation_available_rotations_set(sample_info.win, rots, 4); + } + + eext_object_event_callback_add(sample_info.win, EEXT_CALLBACK_BACK, _win_back_key_cb, NULL); + evas_object_smart_callback_add(sample_info.win, "wm,rotation,changed", _rotate_cb, NULL); + + bg = _create_bg(sample_info.win); + goto_if(!bg, ERROR); + + conformant = _create_conformant(sample_info.win); + goto_if(!conformant, ERROR); + + layout = _create_layout(conformant); + goto_if(!layout, ERROR); + + sample_info.layout = layout; + sample_info.conformant = conformant; + sample_info.bg = bg; + + return; + +ERROR: + _D("there is some error"); + if (conformant) { + _destroy_conformant(); + } + if (bg) { + _destroy_bg(); + } + + if (sample_info.win) { + evas_object_del(sample_info.win); + eext_object_event_callback_del(sample_info.win, EEXT_CALLBACK_BACK, _win_back_key_cb); + sample_info.win = NULL; + } +} + + + +static void _terminate_cb(void) +{ + _D(""); + + _destroy_layout(); + _destroy_conformant(); + _destroy_bg(); + + if (sample_info.win) { + eext_object_event_callback_del(sample_info.win, EEXT_CALLBACK_BACK, _win_back_key_cb); + evas_object_del(sample_info.win); + sample_info.win = NULL; + } +} + + + +int main(int argc, char **argv) +{ + elm_init(argc, argv); + _create_cb(); + elm_run(); + _terminate_cb(); + elm_shutdown(); + + return 0; +} diff --git a/sample/sample.edc b/sample/sample.edc new file mode 100644 index 0000000..86910f0 --- /dev/null +++ b/sample/sample.edc @@ -0,0 +1,109 @@ +/* + * Samsung API + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/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. + */ + + + +styles { + style { + name: "text_style"; + base: "font=Tizen:style=Bold font_size=24 color=#ffffff align=center style=shadow shadow_color=#000000bf wrap=mixed"; + tag: "br" "\n"; + tag: "hilight" "+ font_weight=Bold"; + tag: "b" "+ font_weight=Bold"; + tag: "tab" "\t"; + } +} + +collections { + group { + name: "layout"; + 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: 255 255 255 255; + visible: 1; + } + } + part { + name: "entry"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: 0.05 0.1; } + rel2 { relative: 0.6 0.2; } + align: 0.5 0.5; + fixed: 1 1; + visible: 1; + } + } + part { + name: "button_bg"; + type: RECT; + description { + state: "default" 0.0; + rel1.to: "button"; + rel2.to: "button"; + visible: 1; + color: 200 200 200 200; + } + } + part { + name: "button"; + type: SWALLOW; + description { + state: "default" 0.0; + rel1 { relative: 0.65 0.1; } + rel2 { relative: 0.95 0.2; } + align: 0.5 1.0; + fixed: 1 1; + visible: 1; + } + } + part { + name: "result"; + type: TEXTBLOCK; + description { + state: "default" 0.0; + rel1 { relative: 0.0 1.0; to: "entry"; } + rel2 { relative: 0.95 1.0; to: "bg"; } + align: 0.5 1.0; + color: 0 0 0 255; + text { + text: " "; + style: "text_style"; + align: 0.5 0.5; + } + visible: 1; + } + } + } //parts + programs { + program { + name: "bg,up"; + signal: "mouse,up,1"; + source: "bg"; + action: SIGNAL_EMIT "bg,up" "bg"; + } + } + } //group +} //collections diff --git a/sample/sample.h b/sample/sample.h new file mode 100644 index 0000000..5bc7735 --- /dev/null +++ b/sample/sample.h @@ -0,0 +1,64 @@ +/* + * Samsung API + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/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 __ATTACK_PANEL_SAMPLE_H__ +#define __ATTACK_PANEL_SAMPLE_H__ + +#include + + +#define BASE_WIDTH 1280 +#define BASE_HEIGHT 720 + + +//log +#if !defined(_D) +#define _D(fmt, arg...) LOGD(fmt"\n", ##arg) +#endif + +#if !defined(_W) +#define _W(fmt, arg...) LOGW(fmt"\n", ##arg) +#endif + +#if !defined(_E) +#define _E(fmt, arg...) LOGE(fmt"\n", ##arg) +#endif + +#define retv_if(expr, val) do { \ + if(expr) { \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return (val); \ + } \ +} while (0) + +#define ret_if(expr) do { \ + if(expr) { \ + _E("(%s) -> %s() return", #expr, __FUNCTION__); \ + return; \ + } \ +} while (0) + +#define goto_if(expr, val) do { \ + if(expr) { \ + _E("(%s) -> goto", #expr); \ + goto val; \ + } \ +} while (0) + + +#endif diff --git a/src/attach_bundle.c b/src/attach_bundle.c new file mode 100644 index 0000000..209a22d --- /dev/null +++ b/src/attach_bundle.c @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "log.h" + + + +static void __foreach_bundle_to_add_cb(const char *key, const int type, bundle_keyval_t *kv, void *data) +{ + app_control_h app_control = data; + char *basic_val = NULL; + void **arr = NULL; + + size_t size = 0; + size_t *array_element_size = NULL; + unsigned int array_length = 0; + int ret = BUNDLE_ERROR_NONE; + + ret_if(!key); + ret_if(!app_control); + + _D("key: %s", key); + + switch(type) { + case BUNDLE_TYPE_STR: + ret = bundle_keyval_get_basic_val(kv, (void *) &basic_val, &size); + ret_if(ret != BUNDLE_ERROR_NONE); + ret_if(!basic_val); + + ret = app_control_add_extra_data(app_control, key, basic_val); + ret_if(ret != APP_CONTROL_ERROR_NONE); + break; + + case BUNDLE_TYPE_STR_ARRAY: + ret = bundle_keyval_get_array_val(kv, &arr, &array_length, &array_element_size); + ret_if(ret != BUNDLE_ERROR_NONE); + ret_if(!arr); + + ret = app_control_add_extra_data_array(app_control, key, (const char **) arr, array_length); + ret_if(ret != APP_CONTROL_ERROR_NONE); + break; + + case BUNDLE_TYPE_BYTE: + ret = bundle_keyval_get_basic_val(kv, (void *) &basic_val, &size); + ret_if(ret != BUNDLE_ERROR_NONE); + ret_if(!basic_val); + + ret = app_control_add_extra_data(app_control, key, basic_val); + ret_if(ret != APP_CONTROL_ERROR_NONE); + break; + + case BUNDLE_TYPE_BYTE_ARRAY: + ret = bundle_keyval_get_array_val(kv, &arr, &array_length, &array_element_size); + ret_if(ret != BUNDLE_ERROR_NONE); + ret_if(!arr); + + ret = app_control_add_extra_data_array(app_control, key, (const char **) arr, array_length); + ret_if(ret != APP_CONTROL_ERROR_NONE); + break; + + default: + _E("There is wrong type"); + break; + } +} + + + +int _bundle_add_to_app_control(bundle *b, app_control_h app_control) +{ + retv_if(!b, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!app_control, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + bundle_foreach(b, (void *) __foreach_bundle_to_add_cb, app_control); + retv_if(get_last_result() != BUNDLE_ERROR_NONE, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + + return ATTACH_PANEL_ERROR_NONE; +} + + + +static void __foreach_bundle_to_change_cb(const char *key, const int type, bundle_keyval_t *kv, void *data) +{ + bundle *origin = data; + char *basic_val = NULL; + void **arr = NULL; + + size_t size; + size_t *array_element_size = NULL; + unsigned int array_length = 0; + int ret = BUNDLE_ERROR_NONE; + + ret_if(!key); + ret_if(!origin); + + switch(type) { + case BUNDLE_TYPE_STR: + ret = bundle_keyval_get_basic_val(kv, (void *) &basic_val, &size); + ret_if(ret != BUNDLE_ERROR_NONE); + ret_if(!basic_val); + + ret = bundle_del(origin, key); + ret_if(ret != BUNDLE_ERROR_NONE && ret != BUNDLE_ERROR_KEY_NOT_AVAILABLE); + + ret = bundle_add_str(origin, key, basic_val); + ret_if(ret != BUNDLE_ERROR_NONE); + break; + + case BUNDLE_TYPE_STR_ARRAY: + ret = bundle_keyval_get_array_val(kv, &arr, &array_length, &array_element_size); + ret_if(ret != BUNDLE_ERROR_NONE); + ret_if(!arr); + + ret = bundle_del(origin, key); + ret_if(ret != BUNDLE_ERROR_NONE && ret != BUNDLE_ERROR_KEY_NOT_AVAILABLE); + + ret = bundle_add_str_array(origin, key, (const char **) arr, array_length); + ret_if(ret != BUNDLE_ERROR_NONE); + break; + + case BUNDLE_TYPE_BYTE: + ret = bundle_keyval_get_basic_val(kv, (void *) &basic_val, &size); + ret_if(ret != BUNDLE_ERROR_NONE); + ret_if(!basic_val); + + ret = bundle_del(origin, key); + ret_if(ret != BUNDLE_ERROR_NONE && ret != BUNDLE_ERROR_KEY_NOT_AVAILABLE); + + ret = bundle_add_byte(origin, key, basic_val, size); + ret_if(ret != BUNDLE_ERROR_NONE); + break; + + case BUNDLE_TYPE_BYTE_ARRAY: + ret = bundle_keyval_get_array_val(kv, &arr, &array_length, &array_element_size); + ret_if(ret != BUNDLE_ERROR_NONE); + ret_if(!arr); + + ret = bundle_del(origin, key); + ret_if(ret != BUNDLE_ERROR_NONE && ret != BUNDLE_ERROR_KEY_NOT_AVAILABLE); + + ret = bundle_add_str_array(origin, key, (const char **) arr, array_length); + ret_if(ret != BUNDLE_ERROR_NONE); + break; + + default: + _E("There is wrong type"); + break; + } +} + + + +int _bundle_add_to_bundle(bundle *origin, bundle *replace) +{ + retv_if(!origin, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!replace, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + bundle_foreach(replace, (void *) __foreach_bundle_to_change_cb, origin); + retv_if(get_last_result() != BUNDLE_ERROR_NONE, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + + return ATTACH_PANEL_ERROR_NONE; +} diff --git a/src/attach_panel.c b/src/attach_panel.c new file mode 100644 index 0000000..314420b --- /dev/null +++ b/src/attach_panel.c @@ -0,0 +1,766 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "attach_bundle.h" +#include "conf.h" +#include "content_list.h" +#include "gesture.h" +#include "grid.h" +#include "ui_manager.h" +#include "list.h" +#include "log.h" +#include "scroller.h" +#include "toolbar.h" + +static const char *const ATTACH_PANEL_DOMAIN = "attach-panel"; +static const char *const PLATFORM_FEATURE_CAMERA = "tizen.org/feature/camera"; +static const char *const PLATFORM_FEATURE_MICROPHONE = "tizen.org/feature/microphone"; + + + +innate_content_s innate_content_info[ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER] = { + { + .appid = "attach-panel-gallery", + .name = "IDS_COM_TAB4_IMAGES_ABB2", + .operation = APP_CONTROL_OPERATION_PICK, + .selection_mode = "single", + .tabbar_name = "IDS_COM_TAB4_IMAGES_ABB2", + .mime = "image/*", + .content_category = ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, + .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_UG, + }, + { + .appid = "attach-panel-camera", + .name = "IDS_COM_TAB4_CAMERA", + .operation = APP_CONTROL_OPERATION_CREATE_CONTENT, + .selection_mode = "single", + .tabbar_name = "IDS_COM_TAB4_CAMERA", + .content_category = ATTACH_PANEL_CONTENT_CATEGORY_CAMERA, + .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_UG, + }, + { + .appid = "attach-panel-voicerecorder", + .name = "IDS_COM_TAB4_VOICE", + .operation = APP_CONTROL_OPERATION_CREATE_CONTENT, + .selection_mode = "single", + .tabbar_name = "IDS_COM_TAB4_VOICE", + .content_category = ATTACH_PANEL_CONTENT_CATEGORY_VOICE, + .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_UG, + }, + { + .appid = "videos", + .name = "IDS_COM_BUTTON2_VIDEOS", + .operation = APP_CONTROL_OPERATION_PICK, + .icon = "/usr/share/icons/video.png", + .selection_mode = "multiple", + .tabbar_name = "IDS_COM_TAB4_MORE_ABB", + .mime = "video/*", + .content_category = ATTACH_PANEL_CONTENT_CATEGORY_VIDEO, + .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP, + }, + { + .appid = "audio", + .name = "IDS_COM_BUTTON2_AUDIO_FILES", + .operation = APP_CONTROL_OPERATION_PICK, + .icon = "/usr/share/icons/music.png", + .selection_mode = "multiple", + .tabbar_name = "IDS_COM_TAB4_MORE_ABB", + .mime = "audio/*", + .content_category = ATTACH_PANEL_CONTENT_CATEGORY_AUDIO, + .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP, + }, + { + .appid = "calendar", + .name = "IDS_EMAIL_BUTTON2_CALENDAR", + .operation = APP_CONTROL_OPERATION_PICK, + .icon = "/usr/share/icons/calendar.png", + .tabbar_name = "IDS_COM_TAB4_MORE_ABB", + .mode = 1, + .type = "vcs", + .selection_mode = "multiple", + .mime = "application/vnd.tizen.calendar", + .max = 1, + .content_category = ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR, + .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP, + }, + { + .appid = "contacts", + .name = "IDS_COM_BUTTON2_CONTACTS", + .operation = APP_CONTROL_OPERATION_PICK, + .icon = "/usr/share/icons/contact.png", + .tabbar_name = "IDS_COM_TAB4_MORE_ABB", + .type = "vcf", + .item_type = "person", + .selection_mode = "multiple", + .mime = "application/vnd.tizen.contact", + .content_category = ATTACH_PANEL_CONTENT_CATEGORY_CONTACT, + .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP, + }, + { + .appid = "myfiles", + .name = "IDS_COM_BUTTON_MY_FILES_ABB", + .operation = APP_CONTROL_OPERATION_PICK, + .tabbar_name = "IDS_COM_TAB4_MORE_ABB", + .icon = "/usr/share/icons/my_files.png", + .selection_mode = "multiple", + .content_category = ATTACH_PANEL_CONTENT_CATEGORY_MYFILES, + .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP, + }, + { + .appid = "record_video", + .name = "IDS_IDLE_BUTTON2_RECORD_NVIDEO_ABB", + .operation = APP_CONTROL_OPERATION_CREATE_CONTENT, + .icon = "/usr/share/icons/default.png", + .tabbar_name = "IDS_COM_TAB4_MORE_ABB", + .selection_mode = "single", + .mime = "video/3gp", + .content_category = ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, + .is_ug = ATTACH_PANEL_CONTENT_CATEGORY_APP, + }, +}; + + + +static Evas_Object *__attach_panel_rect_add(Evas_Object *conformant, int height) +{ + Evas_Object *rect = NULL; + + retv_if(!conformant, NULL); + + _D("attach panel rect create, height : %d", height); + + rect = evas_object_rectangle_add(evas_object_evas_get(conformant)); + retv_if(!rect, NULL); + + evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(rect, EVAS_HINT_FILL, 1.0); + evas_object_size_hint_min_set(rect, 0, height); + evas_object_color_set(rect, 0, 0, 0, 0); + evas_object_show(rect); + + return rect; +} + + + +static void __attach_panel_rect_del(Evas_Object *rect) +{ + ret_if(!rect); + evas_object_del(rect); +} + + + +static void __rotate_cb(void *data, Evas_Object *obj, void *event) +{ + Evas_Object *win = obj; + attach_panel_h attach_panel = data; + + int w, h; + int angle = 0; + + ret_if(!attach_panel); + ret_if(!attach_panel->conformant); + + angle = elm_win_rotation_get(win); + elm_win_screen_size_get(win, NULL, NULL, &w, &h); + _D("Angle is %d degree, win size is %d, %d", angle, w, h); + + switch(angle) { + case 90: + case 270: + _D("resize the attach-panel to land(%d)", angle); + if (90 == angle) + ug_send_event(UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN); + else + ug_send_event(UG_EVENT_ROTATE_LANDSCAPE); + + w = h; + attach_panel->rotate = EINA_TRUE; + + if (ATTACH_PANEL_STATE_HIDE == attach_panel->attach_panel_port_state) { + attach_panel->attach_panel_land_state = ATTACH_PANEL_STATE_HIDE; + } else if (ATTACH_PANEL_STATE_HALF == attach_panel->attach_panel_port_state) { + attach_panel->attach_panel_land_state = ATTACH_PANEL_STATE_FULL; + _gesture_set_state(ATTACH_PANEL_STATE_FULL); + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_MULTIPLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,full", ""); + } else { + attach_panel->attach_panel_land_state = ATTACH_PANEL_STATE_FULL; + _gesture_set_state(ATTACH_PANEL_STATE_FULL); + } + break; + case 0: + case 180: + _D("resize the attach-panel to port(%d)", angle); + if (0 == angle) + ug_send_event(UG_EVENT_ROTATE_PORTRAIT); + else + ug_send_event(UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN); + + attach_panel->rotate = EINA_FALSE; + + if (ATTACH_PANEL_STATE_HIDE == attach_panel->attach_panel_land_state) { + attach_panel->attach_panel_port_state = ATTACH_PANEL_STATE_HIDE; + } else { + if (ATTACH_PANEL_STATE_HALF == attach_panel->attach_panel_port_state) { + _gesture_set_state(ATTACH_PANEL_STATE_HALF); + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_SINGLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,half", ""); + } else { + attach_panel->attach_panel_port_state = ATTACH_PANEL_STATE_FULL; + _gesture_set_state(ATTACH_PANEL_STATE_FULL); + } + } + break; + default: + _E("cannot reach here"); + break; + } + + _scroller_resize(attach_panel->scroller, w, 0); + elm_scroller_page_show(attach_panel->scroller, attach_panel->cur_page_no, 0); +} + + + +EXPORT_API int attach_panel_create(Evas_Object *conformant, attach_panel_h *attach_panel) +{ + Evas_Object *old_panel = NULL; + attach_panel_h panel = NULL; + const char *type = NULL; + int width = 0; + int height = 0; + int base_height = 0; + + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!conformant, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + old_panel = elm_object_part_content_get(conformant, "elm.swallow.attach_panel"); + retv_if(old_panel, ATTACH_PANEL_ERROR_ALREADY_EXISTS); + + type = elm_object_widget_type_get(conformant); + retv_if(!type, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (strcmp(type, "Elm_Conformant")) { + _E("This is not a conformant, %s", type); + return ATTACH_PANEL_ERROR_INVALID_PARAMETER; + } + + bindtextdomain(ATTACH_PANEL_DOMAIN, "/usr/ug/res/locale"); + + panel = calloc(1, sizeof(attach_panel_s)); + retv_if(!panel, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + panel->conformant = conformant; + + evas_object_geometry_get(conformant, NULL, NULL, &width, &base_height); + panel->transit_width = width; + + if (width > base_height) { + base_height = width * BASE_TRANSIT_HEIGHT_REL; + } else { + base_height = base_height * BASE_TRANSIT_HEIGHT_REL; + } + + isf_control_get_recent_ime_geometry(NULL, NULL, NULL, &height); + if (!height || height < base_height) { + _E("Fail to get the recent ime height"); + height = base_height; + } + panel->transit_height = height; + + panel->attach_panel_rect = __attach_panel_rect_add(conformant, height); + goto_if(!panel->attach_panel_rect, ERROR); + elm_object_part_content_set(conformant, "elm.swallow.attach_panel_base", panel->attach_panel_rect); + + panel->ui_manager = _ui_manager_create(panel); + goto_if(!panel->ui_manager, ERROR); + elm_object_part_content_set(conformant, "elm.swallow.attach_panel", panel->ui_manager); + panel->is_delete = EINA_FALSE; + panel->rotate = EINA_FALSE; + panel->flick = EINA_TRUE; + panel->cur_page_no = 0; + panel->magic_no = 0x1024; + + panel->gesture = _gesture_create(panel); + goto_if(!panel->gesture, ERROR); + + evas_object_smart_callback_add(panel->win, "wm,rotation,changed", __rotate_cb, panel); + elm_scroller_movement_block_set(panel->scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); + __rotate_cb(panel, panel->win, NULL); + *attach_panel = panel; + + return ATTACH_PANEL_ERROR_NONE; + +ERROR: + if (panel->ui_manager) { + elm_object_part_content_unset(conformant, "elm.swallow.attach_panel"); + _ui_manager_destroy(panel->ui_manager); + } + + if (panel->attach_panel_rect) { + elm_object_part_content_unset(conformant, "elm.swallow.attach_panel_base"); + __attach_panel_rect_del(panel->attach_panel_rect); + } + free(panel); + + return ATTACH_PANEL_ERROR_NOT_INITIALIZED; +} + + + +extern void _attach_panel_del(attach_panel_h attach_panel) +{ + content_s *content_info = NULL; + Eina_List *l = NULL; + + ret_if(!attach_panel); + _D("%s : attach panel is destroyed", __func__); + + if (0x1024 != attach_panel->magic_no) { + _D("attach panel is already destroyed"); + return; + } + + attach_panel->magic_no = 0; + + _gesture_destroy(attach_panel); + + evas_object_smart_callback_del(attach_panel->win, "wm,rotation,changed", __rotate_cb); + elm_object_part_content_unset(attach_panel->conformant, "elm.swallow.attach_panel_base"); + __attach_panel_rect_del(attach_panel->attach_panel_rect); + + EINA_LIST_FOREACH(attach_panel->content_list, l, content_info) { + if (content_info->extra_data) { + bundle_free(content_info->extra_data); + content_info->extra_data = NULL; + } + } + + elm_object_part_content_unset(attach_panel->conformant, "elm.swallow.attach_panel"); + _ui_manager_destroy(attach_panel->ui_manager); + + free(attach_panel); +} + + + +EXPORT_API int attach_panel_destroy(attach_panel_h attach_panel) +{ + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + _D("%s : attach panel will be destroyed", __func__); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + attach_panel->is_delete = EINA_TRUE; + if (ATTACH_PANEL_STATE_HIDE == _gesture_get_state()) { + _attach_panel_del(attach_panel); + } else { + attach_panel_hide(attach_panel); + } + + return ATTACH_PANEL_ERROR_NONE; +} + + + +static void __iter_cb(const char *key, const int type, bundle_keyval_t *kv, void *user_data) +{ + int *bundle_is_op = user_data; + + ret_if(!key); + ret_if(!bundle_is_op); + + if (!strncmp("__APP_SVC_", key, 10)) + *bundle_is_op = 1; +} + + + +static const char *const PRIVILEGE_CAMERA = "http://tizen.org/privilege/camera"; +static const char *const PRIVILEGE_RECORDER = "http://tizen.org/privilege/recorder"; +static const char *const PRIVILEGE_APPMANAGER_LAUNCH = "http://tizen.org/privilege/appmanager.launch"; +EXPORT_API int attach_panel_add_content_category(attach_panel_h attach_panel, attach_panel_content_category_e content_category, bundle *extra_data) +{ + content_s *content_info = NULL; + bundle *dup_bundle = NULL; + Eina_List *l = NULL; + int ret = SYSTEM_INFO_ERROR_NONE; + bool value = false; + + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_NOT_INITIALIZED); + retv_if(content_category < ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(content_category > ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + switch (content_category) { + case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA: + ret = system_info_get_platform_bool(PLATFORM_FEATURE_CAMERA, &value); + break_if(SYSTEM_INFO_ERROR_NONE != ret); + retv_if(false == value, ATTACH_PANEL_ERROR_UNSUPPORTED_CONTENT_CATEGORY); + + ret = privilege_checker_check_privilege(PRIVILEGE_CAMERA); + retv_if(PRIVILEGE_CHECKER_ERR_UNDECLARED_PRIVILEGE == ret, ATTACH_PANEL_ERROR_PERMISSION_DENIED); + break_if(PRIVILEGE_CHECKER_ERR_NONE != ret); + break; + case ATTACH_PANEL_CONTENT_CATEGORY_VOICE: + ret = system_info_get_platform_bool(PLATFORM_FEATURE_MICROPHONE, &value); + break_if(SYSTEM_INFO_ERROR_NONE != ret); + retv_if(false == value, ATTACH_PANEL_ERROR_UNSUPPORTED_CONTENT_CATEGORY); + + ret = privilege_checker_check_privilege(PRIVILEGE_RECORDER); + retv_if(PRIVILEGE_CHECKER_ERR_UNDECLARED_PRIVILEGE == ret, ATTACH_PANEL_ERROR_PERMISSION_DENIED); + break_if(PRIVILEGE_CHECKER_ERR_NONE != ret); + break; + case ATTACH_PANEL_CONTENT_CATEGORY_VIDEO: + case ATTACH_PANEL_CONTENT_CATEGORY_AUDIO: + case ATTACH_PANEL_CONTENT_CATEGORY_CALENDAR: + case ATTACH_PANEL_CONTENT_CATEGORY_CONTACT: + case ATTACH_PANEL_CONTENT_CATEGORY_MYFILES: + ret = privilege_checker_check_privilege(PRIVILEGE_APPMANAGER_LAUNCH); + retv_if(PRIVILEGE_CHECKER_ERR_UNDECLARED_PRIVILEGE == ret, ATTACH_PANEL_ERROR_PERMISSION_DENIED); + break_if(PRIVILEGE_CHECKER_ERR_NONE != ret); + break; + default: + break; + } + + EINA_LIST_FOREACH(attach_panel->content_list, l, content_info) { + if (content_info->innate_content_info->content_category == content_category) { + _E("The content category[%d] already exists in the panel", content_category); + return ATTACH_PANEL_ERROR_ALREADY_EXISTS; + } + } + + if (extra_data) { + int bundle_is_op = 0; + + bundle_foreach(extra_data, (void *) __iter_cb, &bundle_is_op); + + if (bundle_is_op) { + _E("bundle key is invalid value"); + return ATTACH_PANEL_ERROR_INVALID_PARAMETER; + } + + dup_bundle = bundle_dup(extra_data); + retv_if(!dup_bundle, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + } + + _ui_manager_append_content_category(attach_panel->ui_manager, &innate_content_info[content_category-1], dup_bundle); + + return ATTACH_PANEL_ERROR_NONE; +} + + + +EXPORT_API int attach_panel_remove_content_category(attach_panel_h attach_panel, attach_panel_content_category_e content_category) +{ + content_s *content_info = NULL; + Eina_List *l = NULL; + + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_NOT_INITIALIZED); + retv_if(content_category < ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(content_category > ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + EINA_LIST_FOREACH(attach_panel->content_list, l, content_info) { + if (content_info->innate_content_info->content_category != content_category) { + continue; + } + bundle_free(content_info->extra_data); + content_info->extra_data = NULL; + _ui_manager_remove_content_category(attach_panel->ui_manager, content_info); + break; + } + + return ATTACH_PANEL_ERROR_NONE; +} + + + +EXPORT_API int attach_panel_set_extra_data(attach_panel_h attach_panel, attach_panel_content_category_e content_category, bundle *extra_data) +{ + app_control_h app_control = NULL; + ui_gadget_h ui_gadget = NULL; + content_s *content_info = NULL; + Eina_List *l = NULL; + + int ret = ATTACH_PANEL_ERROR_NONE; + int bundle_is_op = 0; + + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_NOT_INITIALIZED); + retv_if(content_category < ATTACH_PANEL_CONTENT_CATEGORY_IMAGE, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(content_category > ATTACH_PANEL_CONTENT_CATEGORY_VIDEO_RECORDER, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!extra_data, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + bundle_foreach(extra_data, (void *) __iter_cb, &bundle_is_op); + + if (bundle_is_op) { + _E("bundle key is invalid value"); + return ATTACH_PANEL_ERROR_INVALID_PARAMETER; + } + + EINA_LIST_FOREACH(attach_panel->content_list, l, content_info) { + if (content_info->innate_content_info->content_category == content_category) { + _D("add the data in %d content category", content_category); + break; + } + } + + if (content_info->extra_data) { + ret = _bundle_add_to_bundle(content_info->extra_data, extra_data); + retv_if(ret != ATTACH_PANEL_ERROR_NONE, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + } else { + bundle *dup_bundle = NULL; + + dup_bundle = bundle_dup(extra_data); + retv_if(!dup_bundle, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + + content_info->extra_data = dup_bundle; + } + + if (innate_content_info[content_category-1].is_ug) { + if (!content_info->content) { + _D("Create ug because ug is not created yet"); + content_info->content = _ui_manager_create_content(content_info->page, content_info, attach_panel); + retv_if(!content_info->content, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + if (ATTACH_PANEL_STATE_FULL == _gesture_get_state()) { + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_MULTIPLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + } else { + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_SINGLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + } + } + + ret = app_control_create(&app_control); + retv_if(APP_CONTROL_ERROR_NONE != ret, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + + ui_gadget = evas_object_data_get(content_info->content, DATA_KEY_UG); + if (!ui_gadget) { + _E("Fail to get the ui gadget from content_info"); + app_control_destroy(app_control); + return ATTACH_PANEL_ERROR_OUT_OF_MEMORY; + + } + ug_send_message(ui_gadget, app_control); + ret = app_control_destroy(app_control); + retv_if(APP_CONTROL_ERROR_NONE != ret, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + } else { + // In case of app, bundle is not used imediately. + // when app is launching, bundle is used. + } + + return ATTACH_PANEL_ERROR_NONE; +} + + + +EXPORT_API int attach_panel_set_result_cb(attach_panel_h attach_panel, attach_panel_result_cb result_cb, void *user_data) +{ + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!result_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + attach_panel->result_cb = result_cb; + attach_panel->result_data = user_data; + + return ATTACH_PANEL_ERROR_NONE; +} + + + +EXPORT_API int attach_panel_unset_result_cb(attach_panel_h attach_panel) +{ + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + attach_panel->result_cb = NULL; + attach_panel->result_data = NULL; + + return ATTACH_PANEL_ERROR_NONE; +} + + + +EXPORT_API int attach_panel_set_event_cb(attach_panel_h attach_panel, attach_panel_event_cb event_cb, void *user_data) +{ + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!event_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + attach_panel->event_cb = event_cb; + attach_panel->event_data = user_data; + + return ATTACH_PANEL_ERROR_NONE; +} + + + +EXPORT_API int attach_panel_unset_event_cb(attach_panel_h attach_panel) +{ + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + attach_panel->event_cb = NULL; + attach_panel->event_data = NULL; + + return ATTACH_PANEL_ERROR_NONE; +} + + + +EXPORT_API int attach_panel_show(attach_panel_h attach_panel) +{ + Elm_Object_Item *first_it; + content_s *content_info = NULL; + int height = 0; + + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + if (ATTACH_PANEL_STATE_HIDE != _gesture_get_state()) { + _D("Attach panel is already shown"); + return ATTACH_PANEL_ERROR_NONE; + } + + isf_control_get_recent_ime_geometry(NULL, NULL, NULL, &height); + if (height && height > attach_panel->transit_height) { + _D("change the attach-panel's height(%d)", height); + evas_object_size_hint_min_set(attach_panel->attach_panel_rect, 0, height); + attach_panel->transit_height = height; + } + + content_info = eina_list_nth(attach_panel->content_list, attach_panel->cur_page_no); + retv_if(!content_info, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + + _toolbar_bring_in(attach_panel->toolbar, content_info->tabbar_item); + + if (content_info->content) { + elm_scroller_page_show(attach_panel->scroller, attach_panel->cur_page_no, 0); + } else { + content_info->content = _ui_manager_create_content(content_info->page, content_info, attach_panel); + retv_if(!content_info->content, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + } + + _content_list_set_resume(attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); + _content_list_send_message(attach_panel->content_list, "__ATTACH_PANEL_INITIALIZE__", MODE_ENABLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + evas_object_show(attach_panel->ui_manager); + + _gesture_show(attach_panel); + + attach_panel->content_list = _list_sort_by_rua(attach_panel->content_list); + _grid_refresh(attach_panel->grid); + + first_it = elm_gengrid_first_item_get(attach_panel->grid); + if (first_it) { + elm_gengrid_item_show(first_it, ELM_GENGRID_ITEM_SCROLLTO_TOP); + } + + return ATTACH_PANEL_ERROR_NONE; +} + + + +EXPORT_API int attach_panel_hide(attach_panel_h attach_panel) +{ + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!attach_panel->ui_manager, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + _content_list_set_pause(attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); + _gesture_hide(attach_panel); + + return ATTACH_PANEL_ERROR_NONE; +} + + + +EXPORT_API int attach_panel_get_visibility(attach_panel_h attach_panel, bool *visible) +{ + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!visible, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return ATTACH_PANEL_ERROR_ALREADY_DESTROYED; + } + + if (attach_panel->rotate) { + if (ATTACH_PANEL_STATE_HIDE == attach_panel->attach_panel_land_state) { + *visible = false; + } else { + *visible = true; + } + } else { + if (ATTACH_PANEL_STATE_HIDE == attach_panel->attach_panel_port_state) { + *visible = false; + } else { + *visible = true; + } + } + + return ATTACH_PANEL_ERROR_NONE; +} diff --git a/src/content_list.c b/src/content_list.c new file mode 100644 index 0000000..982a299 --- /dev/null +++ b/src/content_list.c @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "conf.h" +#include "content_list.h" +#include "log.h" + + + +void _content_list_send_message(Eina_List *list, const char *key, const char *value, int is_ug) +{ + content_s *content_info = NULL; + app_control_h app_control = NULL; + const Eina_List *l = NULL; + + int ret = APP_CONTROL_ERROR_NONE; + + ret_if(!list); + ret_if(!key); + ret_if(!value); + + ret = app_control_create(&app_control); + ret_if(APP_CONTROL_ERROR_NONE != ret); + + ret = app_control_add_extra_data(app_control, "__CALLER_PANEL__", "attach-panel"); + if (APP_CONTROL_ERROR_NONE != ret) { + _E("Fail to add extra data(__CALLER_PANEL__)"); + app_control_destroy(app_control); + return; + } + + ret = app_control_add_extra_data(app_control, key, value); + if (APP_CONTROL_ERROR_NONE != ret) { + _E("Fail to add extra data(%s)", key); + app_control_destroy(app_control); + return; + } + + EINA_LIST_FOREACH(list, l, content_info) { + continue_if(!content_info); + if (!content_info->content) { + _D("ug is not created yet"); + continue; + } + innate_content_s *innate_content_info = content_info->innate_content_info; + continue_if(!innate_content_info); + + if (is_ug == innate_content_info->is_ug) { + ui_gadget_h ui_gadget = NULL; + + ui_gadget = evas_object_data_get(content_info->content, DATA_KEY_UG); + if (!ui_gadget) { + _D("Fail to get the ui gadget"); + continue; + } + ug_send_message(ui_gadget, app_control); + } + } + + ret = app_control_destroy(app_control); + ret_if(APP_CONTROL_ERROR_NONE != ret); +} + + + +void _content_list_send_message_to_content(Eina_List *list, const char *key, const char *value, int cur_page_no) +{ + content_s *content_info = NULL; + app_control_h app_control = NULL; + ui_gadget_h ui_gadget = NULL; + + int ret = APP_CONTROL_ERROR_NONE; + + ret_if(!list); + ret_if(!key); + ret_if(!value); + + content_info = eina_list_nth(list, cur_page_no); + ret_if(!content_info); + + if (!content_info->innate_content_info->is_ug) { + _D("this page did not need to send message"); + return; + } + + ret = app_control_create(&app_control); + ret_if(APP_CONTROL_ERROR_NONE != ret); + + ret = app_control_add_extra_data(app_control, "__CALLER_PANEL__", "attach-panel"); + if (APP_CONTROL_ERROR_NONE != ret) { + _E("Fail to add extra data(__CALLER_PANEL__)"); + app_control_destroy(app_control); + return; + } + + ret = app_control_add_extra_data(app_control, key, value); + if (APP_CONTROL_ERROR_NONE != ret) { + _E("Fail to add extra data(%s)", key); + app_control_destroy(app_control); + return; + } + + ui_gadget = evas_object_data_get(content_info->content, DATA_KEY_UG); + if (!ui_gadget) { + _D("Fail to get the ui gadget"); + app_control_destroy(app_control); + return; + } + ug_send_message(ui_gadget, app_control); + + ret = app_control_destroy(app_control); + ret_if(APP_CONTROL_ERROR_NONE != ret); +} + + + +void _content_list_set_pause(Eina_List *list, int is_ug) +{ + content_s *content_info = NULL; + const Eina_List *l = NULL; + + ret_if(!list); + + EINA_LIST_FOREACH(list, l, content_info) { + continue_if(!content_info); + innate_content_s *innate_content_info = content_info->innate_content_info; + continue_if(!innate_content_info); + if (is_ug == innate_content_info->is_ug) { + ui_gadget_h ui_gadget = NULL; + + ui_gadget = evas_object_data_get(content_info->content, DATA_KEY_UG); + if (!ui_gadget) { + _D("Fail to get the ui gadget"); + continue; + } + ug_pause_ug(ui_gadget); + } + } +} + + + +void _content_list_set_resume(Eina_List *list, int is_ug) +{ + content_s *content_info = NULL; + const Eina_List *l = NULL; + + ret_if(!list); + + EINA_LIST_FOREACH(list, l, content_info) { + continue_if(!content_info); + innate_content_s *innate_content_info = content_info->innate_content_info; + continue_if(!innate_content_info); + if (is_ug == innate_content_info->is_ug) { + ui_gadget_h ui_gadget = NULL; + + ui_gadget = evas_object_data_get(content_info->content, DATA_KEY_UG); + if (!ui_gadget) { + _D("Fail to get the ui gadget"); + continue; + } + ug_resume_ug(ui_gadget); + } + } +} diff --git a/src/gesture.c b/src/gesture.c new file mode 100644 index 0000000..1555b8c --- /dev/null +++ b/src/gesture.c @@ -0,0 +1,347 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "conf.h" +#include "content_list.h" +#include "grid.h" +#include "log.h" +#include "page.h" +#include "scroller.h" + +#define TRANSIT_DURATION 0.2f + + +static struct { + Elm_Transit *transit; + attach_panel_state_e attach_panel_state; +} gesture_info_s = { + .transit = NULL, + .attach_panel_state = ATTACH_PANEL_STATE_HIDE, +}; + +typedef struct custom_effect { + Evas_Coord from_h; + Evas_Coord to_h; +} custom_effect_s; + + + +attach_panel_state_e _gesture_get_state(void) +{ + return gesture_info_s.attach_panel_state; +} + + + +void _gesture_set_state(attach_panel_state_e state) +{ + gesture_info_s.attach_panel_state = state; +} + + + +static Elm_Transit_Effect *__custom_effect_new(Evas_Coord from_h, Evas_Coord to_h) +{ + custom_effect_s *custom_effect = calloc(1, sizeof(custom_effect_s)); + if (!custom_effect) return NULL; + _D("%s, from_h : %d to_h: %d", __func__, from_h, to_h); + custom_effect->from_h = from_h; + custom_effect->to_h = to_h; + + return custom_effect; +} + + + +static void __custom_effect_op(Elm_Transit_Effect *effect, Elm_Transit *transit, double progress) +{ + custom_effect_s *custom_effect = effect; + const Eina_List *list = NULL; + const Eina_List *objs = NULL; + Evas_Object *obj = NULL; + Evas_Coord h = 0; + + if (!effect) { + _D("effect is alrealy exist"); + return; + } + + objs = elm_transit_objects_get(transit); + + h = (Evas_Coord) ((custom_effect->from_h * (1.0 - progress)) + (custom_effect->to_h * progress)); + + _D("change the attach-panel height : %d(progress: %f)", h, progress); + EINA_LIST_FOREACH(objs, list, obj) { + evas_object_size_hint_min_set(obj, -1, h); + evas_object_size_hint_max_set(obj, -1, h); + } +} + + + +static void __custom_effect_free(Elm_Transit_Effect *effect, Elm_Transit *transit) +{ + _D(""); + free(effect); +} + + + +static void __attach_panel_transit_del_cb(void *data, Elm_Transit *transit) +{ + attach_panel_h attach_panel = data; + _D("%s : transit is ended", __func__); + + gesture_info_s.transit = NULL; + if (gesture_info_s.attach_panel_state == ATTACH_PANEL_STATE_HIDE) { + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,hide,finished", ""); + if (attach_panel->event_cb) { + attach_panel->event_cb(attach_panel, ATTACH_PANEL_EVENT_HIDE_FINISH, NULL, attach_panel->event_data); + } + if (attach_panel->is_delete) { + _attach_panel_del(attach_panel); + } + } else { + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,finished", ""); + if (attach_panel->event_cb) { + attach_panel->event_cb(attach_panel, ATTACH_PANEL_EVENT_SHOW_FINISH, NULL, attach_panel->event_data); + } + } +} + + + +static void __attach_panel_transit_set(attach_panel_h attach_panel, Evas_Coord from_h, Evas_Coord to_h, double duration) +{ + Elm_Transit_Effect *custom_effect = NULL; + + if (gesture_info_s.transit) { + _E("Transit is already activating"); + if (attach_panel->cur_event_state == ATTACH_PANEL_EVENT_HIDE_START) { + if (gesture_info_s.attach_panel_state != ATTACH_PANEL_STATE_HIDE) { + if (attach_panel->event_cb) { + attach_panel->event_cb(attach_panel, ATTACH_PANEL_EVENT_HIDE_FINISH, NULL, attach_panel->event_data); + attach_panel->event_cb(attach_panel, ATTACH_PANEL_EVENT_SHOW_START, NULL, attach_panel->event_data); + } + } + } else { + if (gesture_info_s.attach_panel_state == ATTACH_PANEL_STATE_HIDE) { + if (attach_panel->event_cb) { + attach_panel->event_cb(attach_panel, ATTACH_PANEL_EVENT_SHOW_FINISH, NULL, attach_panel->event_data); + attach_panel->event_cb(attach_panel, ATTACH_PANEL_EVENT_HIDE_START, NULL, attach_panel->event_data); + } + } + } + return; + } + + custom_effect = __custom_effect_new(from_h, to_h); + ret_if(!custom_effect); + + if (gesture_info_s.attach_panel_state == ATTACH_PANEL_STATE_HIDE) { + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,hide,started", ""); + attach_panel->cur_event_state = ATTACH_PANEL_EVENT_HIDE_START; + if (attach_panel->event_cb) { + attach_panel->event_cb(attach_panel, ATTACH_PANEL_EVENT_HIDE_START, NULL, attach_panel->event_data); + } + } else { + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,started", ""); + attach_panel->cur_event_state = ATTACH_PANEL_EVENT_SHOW_START; + if (attach_panel->event_cb) { + attach_panel->event_cb(attach_panel, ATTACH_PANEL_EVENT_SHOW_START, NULL, attach_panel->event_data); + } + } + + gesture_info_s.transit = elm_transit_add(); + if (!gesture_info_s.transit) { + _E("Fail to create transit"); + __custom_effect_free(custom_effect, NULL); + return; + } + elm_transit_del_cb_set(gesture_info_s.transit, __attach_panel_transit_del_cb, attach_panel); + elm_transit_object_add(gesture_info_s.transit, attach_panel->attach_panel_rect); + elm_transit_tween_mode_set(gesture_info_s.transit, ELM_TRANSIT_TWEEN_MODE_DECELERATE); + elm_transit_smooth_set(gesture_info_s.transit, EINA_FALSE); + elm_transit_effect_add(gesture_info_s.transit, __custom_effect_op, custom_effect, __custom_effect_free); + elm_transit_duration_set(gesture_info_s.transit, duration); + elm_transit_go(gesture_info_s.transit); +} + + + +void _gesture_show(attach_panel_h attach_panel) +{ + gesture_info_s.attach_panel_state = ATTACH_PANEL_STATE_HALF; + _D("gesture show start"); + + if (attach_panel->rotate) { + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_MULTIPLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + attach_panel->attach_panel_land_state = ATTACH_PANEL_STATE_FULL; + gesture_info_s.attach_panel_state = ATTACH_PANEL_STATE_FULL; + __attach_panel_transit_set(attach_panel, 0, attach_panel->transit_height, TRANSIT_DURATION); + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,full", ""); + + + } else { + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_SINGLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + elm_scroller_movement_block_set(attach_panel->grid, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL); + attach_panel->attach_panel_port_state = ATTACH_PANEL_STATE_HALF; + gesture_info_s.attach_panel_state = ATTACH_PANEL_STATE_HALF; + __attach_panel_transit_set(attach_panel, 0, attach_panel->transit_height, TRANSIT_DURATION); + } +} + + + +void _gesture_hide(attach_panel_h attach_panel) +{ + _D("gestrue hide start"); + if (attach_panel->rotate) { + attach_panel->attach_panel_land_state = ATTACH_PANEL_STATE_HIDE; + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,half", ""); + } else { + if (ATTACH_PANEL_STATE_FULL == attach_panel->attach_panel_port_state) { + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,half", ""); + } + attach_panel->attach_panel_port_state = ATTACH_PANEL_STATE_HIDE; + } + gesture_info_s.attach_panel_state = ATTACH_PANEL_STATE_HIDE; + attach_panel->flick = EINA_TRUE; + __attach_panel_transit_set(attach_panel, attach_panel->transit_height, 0, TRANSIT_DURATION); +} + + + +void _gesture_set_full_mode(attach_panel_h attach_panel) +{ + if (attach_panel->rotate) { + return; + } + if (attach_panel->attach_panel_port_state == ATTACH_PANEL_STATE_HALF) { + attach_panel->attach_panel_port_state = ATTACH_PANEL_STATE_FULL; + gesture_info_s.attach_panel_state = ATTACH_PANEL_STATE_FULL; + elm_scroller_movement_block_set(attach_panel->grid, ELM_SCROLLER_MOVEMENT_NO_BLOCK); + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,full", ""); + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_MULTIPLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + } +} + + + +static Evas_Event_Flags __flick_end_cb(void *data, void *event_info) +{ + attach_panel_h attach_panel = data; + Elm_Gesture_Line_Info *line_info = (Elm_Gesture_Line_Info *) event_info; + + retv_if(!attach_panel, EVAS_EVENT_FLAG_ON_HOLD); + _D("flick end event"); + + if (EINA_TRUE == attach_panel->is_delete) { + _E("Attach panel is already removed"); + return EVAS_EVENT_FLAG_ON_HOLD; + } + + if (_scroller_is_scrolling(attach_panel->scroller)) { + return EVAS_EVENT_FLAG_ON_HOLD; + } + if (!_grid_can_flick(attach_panel)) { + return EVAS_EVENT_FLAG_ON_HOLD; + } + + if (!attach_panel->flick) { + _D("attach_panel flick is disable"); + return EVAS_EVENT_FLAG_ON_HOLD; + } + + if ((line_info->angle > 45 && line_info->angle < 135) || (line_info->angle > 225 && line_info->angle < 315)) { + _D("it is not flick event"); + return EVAS_EVENT_FLAG_ON_HOLD; + } + + /* Flick Up */ + if (line_info->momentum.my < 0) { + if (attach_panel->rotate) { + return EVAS_EVENT_FLAG_ON_HOLD; + } + if (attach_panel->attach_panel_port_state == ATTACH_PANEL_STATE_HALF) { + attach_panel->attach_panel_port_state = ATTACH_PANEL_STATE_FULL; + gesture_info_s.attach_panel_state = ATTACH_PANEL_STATE_FULL; + elm_scroller_movement_block_set(attach_panel->grid, ELM_SCROLLER_MOVEMENT_NO_BLOCK); + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,full", ""); + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_MULTIPLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + } + } + /* Flick Down */ + else { + if (attach_panel->rotate) { + if (attach_panel->attach_panel_land_state == ATTACH_PANEL_STATE_FULL) { + _gesture_hide(attach_panel); + } + } else { + if (attach_panel->attach_panel_port_state == ATTACH_PANEL_STATE_FULL) { + attach_panel->attach_panel_port_state = ATTACH_PANEL_STATE_HALF; + gesture_info_s.attach_panel_state = ATTACH_PANEL_STATE_HALF; + elm_scroller_movement_block_set(attach_panel->grid, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL); + elm_object_signal_emit(attach_panel->conformant, "elm,state,attach_panel,show,half", ""); + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_SINGLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + } else if (attach_panel->attach_panel_port_state == ATTACH_PANEL_STATE_HALF) { + _gesture_hide(attach_panel); + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_SINGLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + } + } + } + + return EVAS_EVENT_FLAG_ON_HOLD; +} + + + +Evas_Object *_gesture_create(attach_panel_h attach_panel) +{ + Evas_Object *gesture_layer = NULL; + + retv_if(!attach_panel, NULL); + retv_if(!attach_panel->ui_manager, NULL); + + _D("gesture create"); + + gesture_layer = elm_gesture_layer_add(attach_panel->scroller); + retv_if(!gesture_layer, NULL); + elm_gesture_layer_attach(gesture_layer, attach_panel->scroller); + evas_object_show(gesture_layer); + + elm_gesture_layer_cb_set(gesture_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, __flick_end_cb, attach_panel); + + return gesture_layer; + +} + + + +void _gesture_destroy(attach_panel_h attach_panel) +{ + ret_if(!attach_panel); + ret_if(!attach_panel->gesture); + + evas_object_del(attach_panel->gesture); + attach_panel->gesture = NULL; +} diff --git a/src/grid.c b/src/grid.c new file mode 100644 index 0000000..d0bfcf4 --- /dev/null +++ b/src/grid.c @@ -0,0 +1,583 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "attach_bundle.h" +#include "conf.h" +#include "content_list.h" +#include "gesture.h" +#include "grid.h" +#include "log.h" + + + +static const char *const FILE_LAYOUT_EDJ = EDJEDIR"/layout.edj"; +static const char *const PRIVATE_DATA_KEY_GRID_LIST = "p_g_lt"; +static const char *const PRIVATE_DATA_KEY_GIC = "p_gic"; +static const char *const PRIVATE_DATA_KEY_LIST_INDEX = "p_lt_ix"; +static const char *const PRIVATE_DATA_KEY_ICON_WIDTH = "p_ic_w"; +static const char *const PRIVATE_DATA_KEY_ICON_HEIGHT = "p_ic_h"; +static const char *const PRIVATE_DATA_KEY_ITEM_WIDTH = "p_it_w"; +static const char *const PRIVATE_DATA_KEY_ITEM_HEIGHT = "p_it_h"; +static const char *const PRIVATE_DATA_KEY_ANIMATOR = "p_tm"; +static const char *const DEFAULT_ICON = "/usr/share/icons/A01-1_icon_Menu.png"; + + + +Eina_Bool _grid_can_flick(attach_panel_h attach_panel) +{ + content_s *current_content_info = NULL; + int content_h, grid_h; + + if (attach_panel->rotate) { + if (ATTACH_PANEL_STATE_FULL != attach_panel->attach_panel_land_state) { + _D("panel is not full state(land mode)"); + return EINA_TRUE; + } + } else { + if (ATTACH_PANEL_STATE_FULL != attach_panel->attach_panel_port_state) { + _D("panel is not full state(port mode)"); + evas_object_data_set(attach_panel->grid, DATA_KEY_EDGE_TOP, (void *) 1); + return EINA_TRUE; + } + } + + current_content_info = eina_list_nth(attach_panel->content_list, attach_panel->cur_page_no); + retv_if(!current_content_info, EINA_TRUE); + + if (attach_panel->grid != current_content_info->content) { + _D("current page is ug page"); + return EINA_TRUE; + } + + elm_scroller_child_size_get(attach_panel->grid, NULL, &content_h); + evas_object_geometry_get(attach_panel->grid, NULL, NULL, NULL, &grid_h); + + if (content_h < grid_h) { + _D("scrolling is not exist(grid size : %d, content size : %d", grid_h, content_h); + return EINA_TRUE; + } + + if (!evas_object_data_del(attach_panel->grid, DATA_KEY_EDGE_TOP)) { + _D("grid can not reach the edge top"); + return EINA_FALSE; + } + + return EINA_TRUE; +} + + + +static char *__text_get(void *data, Evas_Object *obj, const char *part) +{ + content_s *info = data; + innate_content_s *innate_content_info = NULL; + char *buf = NULL; + retv_if(!info, NULL); + + innate_content_info = info->innate_content_info; + retv_if(!innate_content_info, NULL); + if (!strcmp(part, "elm.text")) { + buf = elm_entry_utf8_to_markup(D_(innate_content_info->name)); + return buf; + } + + return NULL; +} + + + +static Evas_Object *__add_icon(Evas_Object *parent, const char *file) +{ + const char *real_icon_file = NULL; + Evas_Object *icon = NULL; + Evas_Object *icon_layout = NULL; + int w, h; + + real_icon_file = file; + if (access(real_icon_file, R_OK) != 0) { + _E("Failed to access an icon(%s)", real_icon_file); + real_icon_file = DEFAULT_ICON; + } + + icon = elm_icon_add(parent); + retv_if(!icon, NULL); + + if (elm_image_file_set(icon, real_icon_file, NULL) == EINA_FALSE) { + _E("Icon file is not accessible (%s)", real_icon_file); + evas_object_del(icon); + return NULL; + } + + w = (int) evas_object_data_get(parent, PRIVATE_DATA_KEY_ICON_WIDTH); + h = (int) evas_object_data_get(parent, PRIVATE_DATA_KEY_ICON_HEIGHT); + evas_object_size_hint_min_set(icon, w, h); + + elm_image_preload_disabled_set(icon, EINA_TRUE); + elm_image_smooth_set(icon, EINA_TRUE); + elm_image_no_scale_set(icon, EINA_FALSE); + evas_object_show(icon); + + icon_layout = elm_layout_add(parent); + retv_if(!icon_layout, NULL); + + elm_layout_file_set(icon_layout, FILE_LAYOUT_EDJ, "grid,icon"); + evas_object_size_hint_weight_set(icon_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(icon_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(icon_layout); + + elm_object_part_content_set(icon_layout, "icon", icon); + + return icon_layout; +} + + + +static Evas_Object *__content_get(void *data, Evas_Object *obj, const char *part) +{ + content_s *info = data; + innate_content_s *innate_content_info = NULL; + + retv_if(!info, NULL); + innate_content_info = info->innate_content_info; + retv_if(!innate_content_info, NULL); + + if (!strcmp(part, "elm.swallow.end")) { + Evas_Object *bg = evas_object_rectangle_add(evas_object_evas_get(obj)); + retv_if(!bg, NULL); + int w, h; + + w = (int) evas_object_data_get(obj, PRIVATE_DATA_KEY_ITEM_WIDTH); + h = (int) evas_object_data_get(obj, PRIVATE_DATA_KEY_ITEM_HEIGHT); + + evas_object_size_hint_min_set(bg, w, h); + evas_object_color_set(bg, 0, 0, 0, 0); + evas_object_show(bg); + return bg; + } else if (!strcmp(part, "elm.swallow.icon")) { + retv_if(!innate_content_info->icon, NULL); + return __add_icon(obj, innate_content_info->icon); + } else if (!strcmp(part, "selected")) { + + } + return NULL; +} + + + +static void __del(void *data, Evas_Object *obj) +{ + ret_if(NULL == data); +} + + + +static void __reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data) +{ + content_s *content_info = user_data; + char **select = NULL; + int i = 0; + int length = 0; + int ret = APP_CONTROL_ERROR_NONE; + + ret_if(!content_info); + ret_if(!content_info->attach_panel); + + /* This is just for protocol log */ + _D("relay callback is called"); + ret = app_control_get_extra_data_array(reply, "http://tizen.org/appcontrol/data/selected", &select, &length); + if (APP_CONTROL_ERROR_NONE == ret && select) { + for (i = 0; i < length; i++) { + _D("selected is %s[%d]", select[i], i); + } + } + + ret = app_control_get_extra_data_array(reply, "http://tizen.org/appcontrol/data/path", &select, &length); + if (APP_CONTROL_ERROR_NONE == ret && select) { + for (i = 0; i < length; i++) { + _D("path is %s[%d]", select[i], i); + } + } + + if (content_info->attach_panel->result_cb) { + content_info->attach_panel->result_cb(content_info->attach_panel + , content_info->innate_content_info->content_category + , reply + , result + , content_info->attach_panel->result_data); + + if (ATTACH_PANEL_STATE_FULL == _gesture_get_state()) { + /* This is same with attach_panel_hide() */ + _content_list_set_pause(content_info->attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); + _gesture_hide(content_info->attach_panel); + } + } else { + _D("content_info->attach_panel->result_cb is NULL"); + } +} + + + +static void __launch_app(content_s *content_info) +{ + app_control_h app_control = NULL; + innate_content_s *innate_content_info = NULL; + char value[BUF_SIZE] = {0, }; + int ret; + + ret_if(!content_info); + + innate_content_info = content_info->innate_content_info; + ret_if(!innate_content_info); + + ret = app_control_create(&app_control); + ret_if(APP_CONTROL_ERROR_NONE != ret); + + if (content_info->innate_content_info->operation) { + ret = app_control_set_operation(app_control, content_info->innate_content_info->operation); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to set operation"); + } + + if (content_info->innate_content_info->mode) { + snprintf(value, sizeof(value), "%d", content_info->innate_content_info->mode); + ret = app_control_add_extra_data(app_control, "http://tizen.org/appcontrol/data/mode", value); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to add 'http://tizen.org/appcontrol/data/mode'"); + } + + if (content_info->innate_content_info->type) { + ret = app_control_add_extra_data(app_control, "http://tizen.org/appcontrol/data/type", content_info->innate_content_info->type); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to add 'http://tizen.org/appcontrol/data/type'"); + } + + if (content_info->innate_content_info->item_type) { + ret = app_control_add_extra_data(app_control, "http://tizen.org/appcontrol/data/item_type", content_info->innate_content_info->item_type); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to add 'http://tizen.org/appcontrol/data/item_type'"); + } + + if (content_info->innate_content_info->selection_mode) { + ret = app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, content_info->innate_content_info->selection_mode); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to add APP_CONTROL_DATA_SELECTION_MODE"); + } + + if (content_info->innate_content_info->mime) { + ret = app_control_set_mime(app_control, content_info->innate_content_info->mime); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to set mime"); + } + + if (content_info->innate_content_info->max) { + snprintf(value, sizeof(value), "%d", content_info->innate_content_info->max); + ret = app_control_add_extra_data(app_control, "http://tizen.org/appcontrol/data/max", value); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to add 'http://tizen.org/appcontrol/data/max'"); + } + + if (content_info->extra_data) { + _D("app control add the extra data for app"); + _bundle_add_to_app_control(content_info->extra_data, app_control); + } + + ret = app_control_add_extra_data(app_control, AUL_SVC_K_RUA_STAT_CALLER, "attach-panel"); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to add 'AUL_SVC_K_RUA_STAT_CALLER'"); + + ret = app_control_add_extra_data(app_control, AUL_SVC_K_RUA_STAT_TAG, content_info->innate_content_info->appid); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to add 'AUL_SVC_K_RUA_STAT_TAG'"); + + ret = app_control_add_extra_data(app_control, "__CALLER_PANEL__", "attach-panel"); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to add '__CALLER_PANEL__'"); + + ret = app_control_set_launch_mode(app_control, APP_CONTROL_LAUNCH_MODE_GROUP); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to set launch mode"); + + ret = app_control_send_launch_request(app_control, __reply_cb, content_info); + if (APP_CONTROL_ERROR_NONE != ret) + _E("Fail to send launch request"); + + app_control_destroy(app_control); +} + + + +static void __item_selected(void *data, Evas_Object *obj, void *event_info) +{ + content_s *info = data; + innate_content_s *innate_content_info = NULL; + Elm_Object_Item *selected_item = NULL; + + ret_if(!info); + innate_content_info = info->innate_content_info; + ret_if(!innate_content_info); + + selected_item = elm_gengrid_selected_item_get(obj); + ret_if(!selected_item); + elm_gengrid_item_selected_set(selected_item, EINA_FALSE); + + _D("Selected an item[%s]", innate_content_info->operation); + + __launch_app(info); +} + + + +Eina_Bool __animator_cb(void *data) +{ + Evas_Object *grid = data; + Elm_Gengrid_Item_Class *gic = NULL; + Eina_List *list = NULL; + content_s *info = NULL; + + int index = 0; + int count = 0; + + retv_if(!grid, ECORE_CALLBACK_CANCEL); + + list = evas_object_data_get(grid, PRIVATE_DATA_KEY_GRID_LIST); + retv_if(!list, ECORE_CALLBACK_CANCEL); + + gic = evas_object_data_get(grid, PRIVATE_DATA_KEY_GIC); + retv_if(!gic, ECORE_CALLBACK_CANCEL); + + index = (int) evas_object_data_get(grid, PRIVATE_DATA_KEY_LIST_INDEX); + + count = eina_list_count(list); + if (index == count) goto OUT; + info = eina_list_nth(list, index); + if (info && info->innate_content_info) { + if (!info->innate_content_info->is_ug) { + elm_gengrid_item_append(grid, gic, info, __item_selected, info); + } + } + index++; + if (index == count) goto OUT; + evas_object_data_set(grid, PRIVATE_DATA_KEY_LIST_INDEX, (void *) index); + + return ECORE_CALLBACK_RENEW; + +OUT: + _D("Loading apps is done"); + + Elm_Object_Item *first_it = elm_gengrid_first_item_get(grid); + if (first_it) { + elm_gengrid_item_bring_in(first_it, ELM_GENGRID_ITEM_SCROLLTO_TOP); + } + evas_object_data_del(grid, PRIVATE_DATA_KEY_LIST_INDEX); + evas_object_data_del(grid, PRIVATE_DATA_KEY_ANIMATOR); + + return ECORE_CALLBACK_CANCEL; +} + + + +void _grid_refresh(Evas_Object *grid) +{ + Ecore_Animator *anim = NULL; + + ret_if(!grid); + + elm_gengrid_clear(grid); + + anim = evas_object_data_del(grid, PRIVATE_DATA_KEY_ANIMATOR); + if (anim) { + ecore_animator_del(anim); + } + anim = ecore_animator_add(__animator_cb, grid); + ret_if(!anim); + + evas_object_data_set(grid, PRIVATE_DATA_KEY_ANIMATOR, anim); +} + + + +static void __edge_top_cb(void *data, Evas_Object *grid, void *event_info) +{ + ret_if(!grid); + _D("grid reach the edge top"); + evas_object_data_set(grid, DATA_KEY_EDGE_TOP, (void *) 1); +} + + + +static void __scroll_cb(void *data, Evas_Object *grid, void *event_info) +{ + ret_if(!grid); + evas_object_data_del(grid, DATA_KEY_EDGE_TOP); +} + + + +static void __lang_changed_cb(void *data, Evas_Object *grid, void *event_info) +{ + ret_if(!grid); + elm_gengrid_realized_items_update(grid); +} + + + +Evas_Object *_grid_create(Evas_Object *page, attach_panel_h attach_panel) +{ + Evas_Object *grid = NULL; + Elm_Gengrid_Item_Class *gic = NULL; + + int item_w = 0, item_h = 0, icon_size = 0; + int w, h; + + retv_if(!attach_panel, NULL); + + grid = elm_gengrid_add(page); + goto_if(!grid, ERROR); + + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_geometry_get(attach_panel->conformant, NULL, NULL, &w, &h); + + if (w < h) { + item_w = w / GRID_ROW_COUNT; + } else { + item_w = h / GRID_ROW_COUNT; + } + item_h = item_w * GRID_ITEM_HEIGHT_REL; + icon_size = item_h * GRID_ICON_SIZE_REL; + _D("item_size : %d, %d, icon_size : %d", item_w, item_h, icon_size); + + evas_object_data_set(grid, PRIVATE_DATA_KEY_ITEM_WIDTH, (void *) item_w); + evas_object_data_set(grid, PRIVATE_DATA_KEY_ITEM_HEIGHT, (void *) item_h); + evas_object_data_set(grid, PRIVATE_DATA_KEY_ICON_WIDTH, (void *) icon_size); + evas_object_data_set(grid, PRIVATE_DATA_KEY_ICON_HEIGHT, (void *) icon_size); + + elm_gengrid_item_size_set(grid, item_w, item_h); + elm_gengrid_align_set(grid, 0.0, 0.0); + elm_gengrid_horizontal_set(grid, EINA_FALSE); + elm_gengrid_multi_select_set(grid, EINA_FALSE); + elm_object_style_set(grid, "popup"); + + gic = elm_gengrid_item_class_new(); + goto_if(!gic, ERROR); + gic->func.text_get = __text_get; + gic->func.content_get = __content_get; + gic->func.state_get = NULL; + gic->func.del = __del; + gic->item_style = "default"; + + evas_object_data_set(grid, PRIVATE_DATA_KEY_GRID_LIST, attach_panel->content_list); + evas_object_data_set(grid, PRIVATE_DATA_KEY_GIC, gic); + evas_object_data_set(grid, PRIVATE_DATA_KEY_LIST_INDEX, NULL); + evas_object_data_set(grid, DATA_KEY_EDGE_TOP, (void *)1); + evas_object_smart_callback_add(grid, "edge,top", __edge_top_cb, NULL); + evas_object_smart_callback_add(grid, "scroll", __scroll_cb, NULL); + evas_object_smart_callback_add(grid, "language,changed", __lang_changed_cb, NULL); + + elm_scroller_movement_block_set(grid, ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL); + + evas_object_show(grid); + + return grid; + +ERROR: + _grid_destroy(grid); + return NULL; +} + + + +void _grid_destroy(Evas_Object *grid) +{ + ret_if(!grid); + + Ecore_Animator *animator = NULL; + + evas_object_data_del(grid, PRIVATE_DATA_KEY_GRID_LIST); + evas_object_data_del(grid, PRIVATE_DATA_KEY_LIST_INDEX); + evas_object_data_del(grid, PRIVATE_DATA_KEY_ICON_WIDTH); + evas_object_data_del(grid, PRIVATE_DATA_KEY_ICON_HEIGHT); + evas_object_data_del(grid, PRIVATE_DATA_KEY_ITEM_WIDTH); + evas_object_data_del(grid, PRIVATE_DATA_KEY_ITEM_HEIGHT); + evas_object_data_del(grid, DATA_KEY_EDGE_TOP); + + evas_object_data_del(grid, PRIVATE_DATA_KEY_GIC); + + animator = evas_object_data_del(grid, PRIVATE_DATA_KEY_ANIMATOR); + if (animator) { + ecore_animator_del(animator); + animator = NULL; + } + + evas_object_del(grid); +} + + + +Elm_Object_Item *_grid_append_item(Evas_Object *grid, content_s *content_info) +{ + Elm_Gengrid_Item_Class *gic = NULL; + Elm_Object_Item *item = NULL; + + retv_if(!grid, NULL); + retv_if(!content_info, NULL); + + gic = evas_object_data_get(grid, PRIVATE_DATA_KEY_GIC); + retv_if(!gic, NULL); + + item = elm_gengrid_item_append(grid, gic, content_info, __item_selected, content_info); + retv_if(!item, NULL); + _D("grid append item : %s", content_info->innate_content_info->name); + content_info->grid_item = item; + + return item; +} + + + +void _grid_remove_item(Evas_Object *grid, content_s *content_info) +{ + Elm_Object_Item *item = NULL; + + ret_if(!grid); + ret_if(!content_info); + + item = content_info->grid_item; + ret_if(!item); + elm_object_item_del(item); + content_info->grid_item = NULL; +} + + + +int _grid_count_item(Evas_Object *grid) +{ + int count = 0; + + retv_if(!grid, 0); + + count = elm_gengrid_items_count(grid); + + return count; +} diff --git a/src/list.c b/src/list.c new file mode 100644 index 0000000..12928ad --- /dev/null +++ b/src/list.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "conf.h" +#include "log.h" + + + +static struct { + int ordering; +} list_info = { + .ordering = 1, +}; + +static int __rua_stat_tag_iter_cb(const char *rua_stat_tag, void *data) +{ + Eina_List *content_list = data; + Eina_List *l = NULL; + Eina_List *ln = NULL; + content_s *content_info = NULL; + + retv_if(!content_list, -1); + retv_if(!rua_stat_tag, -1); + + _D("[Rua] %d : %s", list_info.ordering, rua_stat_tag); + EINA_LIST_FOREACH_SAFE(content_list, l, ln, content_info) { + continue_if(!content_info); + continue_if(!content_info->innate_content_info); + if (!strcmp(rua_stat_tag, content_info->innate_content_info->appid)) { + content_info->order = list_info.ordering; + list_info.ordering ++; + } + } + + return 0; +} + + + +static int __sort_cb(const void *d1, const void *d2) +{ + content_s *content_info1 = (content_s *) d1; + content_s *content_info2 = (content_s *) d2; + + if (!content_info1 || !content_info1->innate_content_info) { + return 1; + } + if (!content_info2 || !content_info2->innate_content_info) { + return -1; + } + if (content_info1->innate_content_info->is_ug || content_info2->innate_content_info->is_ug) { + return -1; + } + if (content_info1->order < content_info2->order) { + return -1; + } else if (content_info1->order > content_info2->order) { + return 1; + } else { + return (strcmp(content_info1->innate_content_info->appid, content_info2->innate_content_info->appid)); + } +} + + + +Eina_List * _list_sort_by_rua(Eina_List *content_list) +{ + int ret = 0; + + retv_if(!content_list, NULL); + + list_info.ordering = 1; + ret = rua_stat_get_stat_tags("attach-panel", __rua_stat_tag_iter_cb, content_list); + retv_if(0 != ret, NULL); + + content_list = eina_list_sort(content_list, eina_list_count(content_list), __sort_cb); + + return content_list; +} diff --git a/src/page.c b/src/page.c new file mode 100644 index 0000000..84e0c98 --- /dev/null +++ b/src/page.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "conf.h" +#include "log.h" +#include "page.h" + + + +static const char *const PAGE_EDJE_FILE = EDJEDIR"/page.edj"; + + + +Evas_Object *_page_create(attach_panel_h attach_panel, int width, int height) +{ + Evas_Object *page = NULL; + Evas_Object *page_bg = NULL; + Evas *e = NULL; + + page = elm_layout_add(attach_panel->scroller); + retv_if(!page, NULL); + elm_layout_file_set(page, PAGE_EDJE_FILE, "page"); + + evas_object_size_hint_weight_set(page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(page, EVAS_HINT_FILL, EVAS_HINT_FILL); + + e = evas_object_evas_get(attach_panel->scroller); + goto_if(!e, ERROR); + + page_bg = evas_object_rectangle_add(e); + goto_if(!page_bg, ERROR); + evas_object_size_hint_weight_set(page_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(page_bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(page_bg, width, height); + evas_object_color_set(page_bg, 0, 0, 0, 0); + evas_object_repeat_events_set(page_bg, EINA_TRUE); + evas_object_show(page_bg); + elm_object_part_content_set(page, "bg", page_bg); + + evas_object_show(page); + return page; + +ERROR: + _page_destroy(page); + return NULL; +} + + + +void _page_destroy(Evas_Object *page) +{ + Evas_Object *bg = NULL; + + ret_if(!page); + + bg = elm_object_part_content_unset(page, "bg"); + if (bg) { + evas_object_del(bg); + } + + evas_object_del(page); +} + + + +void _page_resize(Evas_Object *page, int width, int height) +{ + Evas_Object *bg = NULL; + + ret_if(!page); + + bg = elm_object_part_content_get(page, "bg"); + ret_if(!bg); + + evas_object_size_hint_min_set(bg, width, height); + evas_object_size_hint_max_set(bg, width, height); +} diff --git a/src/scroller.c b/src/scroller.c new file mode 100644 index 0000000..1af8cf1 --- /dev/null +++ b/src/scroller.c @@ -0,0 +1,411 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "conf.h" +#include "content_list.h" +#include "log.h" +#include "page.h" +#include "scroller.h" + + + +static const char *const PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING = "p_is_sc"; +static const char *const PRIVATE_DATA_KEY_SCROLLER_DRAG_START = "p_dg_st"; +static const char *const PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST = "pdkec"; + + + +struct _event_cb { + int event_type; + void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *user_data); + void *user_data; +}; +typedef struct _event_cb event_cb_s; + + + +int _scroller_is_scrolling(Evas_Object *scroller) +{ + retv_if(!scroller, 0); + return (int)evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING); +} + + + +static void __anim_start_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _D("start the scroller(%p) animation", scroller); + evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING, (void *)1); +} + + + +static void __anim_stop_cb(void *data, Evas_Object *scroller, void *event_info) +{ + attach_panel_h attach_panel = data; + + int index = 0; + int x = 0; + int page_w = 0; + + ret_if(!attach_panel); + ret_if(!scroller); + + _D("stop the scroller(%p) animation", scroller); + evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_IS_SCROLLING); + evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG_START); + + elm_scroller_region_get(scroller, &x, NULL, NULL, NULL); + elm_scroller_page_size_get(scroller, &page_w, NULL); + ret_if(!page_w); + + index = x / page_w; + x = x % page_w; + if (x != 0) { + return; + } + + if (attach_panel->cur_page_no != index) { + _content_list_send_message_to_content(attach_panel->content_list, "__ATTACH_PANEL_SHOW_CONTENT_CATEGORY__", "false", attach_panel->cur_page_no); + _content_list_send_message_to_content(attach_panel->content_list, "__ATTACH_PANEL_SHOW_CONTENT_CATEGORY__", "true", index); + attach_panel->cur_page_no = index; + _D("change the show page : %d", index); + } +} + + + +static void __drag_start_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _D("start to drag the scroller(%p)", scroller); + evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG_START, (void *)1); +} + + + +static void __drag_stop_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _D("stop to drag the scroller(%p)", scroller); +} + + + +static void __scroll_cb(void *data, Evas_Object *scroller, void *event_info) +{ + attach_panel_h attach_panel = data; + Elm_Object_Item *tabbar_item = NULL; + Eina_List *event_cb_list = NULL; + const Eina_List *l = NULL; + const Eina_List *ln = NULL; + content_s *info = NULL; + event_cb_s *event_cb_info = NULL; + + int index = 0; + int i = 0; + int x = 0; + int page_w = 0; + + ret_if(!attach_panel); + ret_if(!scroller); + + if (!evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG_START)) + return; + + event_cb_list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST); + ret_if(!event_cb_list); + + elm_scroller_region_get(scroller, &x, NULL, NULL, NULL); + elm_scroller_page_size_get(scroller, &page_w, NULL); + ret_if(!page_w); + + index = x / page_w; + x = x % page_w; + if (x > (page_w / 2)) + index++; + + EINA_LIST_FOREACH(attach_panel->content_list, l, info) { + if (index == i) { + tabbar_item = info->tabbar_item; + attach_panel->cur_page_no = i; + break; + } + i++; + } + ret_if(!tabbar_item); + + EINA_LIST_FOREACH_SAFE(event_cb_list, l, ln, event_cb_info) { + if (SCROLLER_EVENT_TYPE_SCROLL == event_cb_info->event_type) { + if (event_cb_info->event_cb) { + event_cb_info->event_cb(scroller, SCROLLER_EVENT_TYPE_SCROLL, tabbar_item, event_cb_info->user_data); + } + } + } +} + + + +static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Object *scroller = obj; + attach_panel_h attach_panel = data; + + int x, y, w, h; + int screen_w = 0, screen_h = 0; + + ret_if(!scroller); + ret_if(!attach_panel); + + elm_win_screen_size_get(attach_panel->win, NULL, NULL, &screen_w, &screen_h); + + evas_object_geometry_get(scroller, &x, &y, &w, &h); + _D("scroller resize(%d, %d, %d, %d)", x, y, w, h); + + if (w == screen_w || w == screen_h) { + _D("screen size(%d, %d)", screen_w, screen_h); + elm_scroller_page_show(scroller, attach_panel->cur_page_no, 0); + } +} + + + +Evas_Object *_scroller_create(Evas_Object *ui_manager, attach_panel_h attach_panel) +{ + Evas_Object *box = NULL; + Evas_Object *scroller = NULL; + + retv_if(!ui_manager, NULL); + retv_if(!attach_panel, NULL); + + scroller = elm_scroller_add(ui_manager); + retv_if(!scroller, NULL); + + elm_scroller_bounce_set(scroller, EINA_TRUE, EINA_FALSE); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_scroll_limit_set(scroller, 1, 1); + elm_scroller_content_min_limit(scroller, EINA_FALSE, EINA_TRUE); + elm_scroller_single_direction_set(scroller, ELM_SCROLLER_SINGLE_DIRECTION_HARD); + + elm_scroller_page_size_set(scroller, attach_panel->transit_width, attach_panel->transit_height); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_min_set(scroller, 0, 0); + + elm_object_style_set(scroller, "effect"); + evas_object_show(scroller); + elm_object_scroll_lock_y_set(scroller, EINA_TRUE); + + evas_object_smart_callback_add(scroller, "scroll,anim,start", __anim_start_cb, NULL); + evas_object_smart_callback_add(scroller, "scroll,anim,stop", __anim_stop_cb, attach_panel); + evas_object_smart_callback_add(scroller, "scroll,drag,start", __drag_start_cb, NULL); + evas_object_smart_callback_add(scroller, "scroll,drag,stop", __drag_stop_cb, NULL); + evas_object_smart_callback_add(scroller, "scroll", __scroll_cb, attach_panel); + evas_object_event_callback_add(scroller, EVAS_CALLBACK_RESIZE, __resize_cb, attach_panel); + + box = elm_box_add(scroller); + goto_if(!box, ERROR); + + elm_box_horizontal_set(box, EINA_TRUE); + elm_box_align_set(box, 0.5, 0.0); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(box); + + elm_object_content_set(scroller, box); + attach_panel->cur_page_no = 0; + + return scroller; + +ERROR: + if (scroller) { + evas_object_del(scroller); + } + return NULL; +} + + + +void _scroller_destroy(Evas_Object *scroller) +{ + Evas_Object *box = NULL; + ret_if(!scroller); + + evas_object_event_callback_del(scroller, EVAS_CALLBACK_RESIZE, __resize_cb); + box = elm_object_content_unset(scroller); + if (box) { + evas_object_del(box); + } + + evas_object_del(scroller); +} + + + +void _scroller_append_page(Evas_Object *scroller, Evas_Object *page) +{ + Evas_Object *box = NULL; + + box = elm_object_content_get(scroller); + ret_if(!box); + + elm_box_pack_end(box, page); +} + + + +void _scroller_remove_page(Evas_Object *scroller, Evas_Object *page) +{ + Evas_Object *box = NULL; + Evas_Object *tmp = NULL; + Eina_List *list = NULL; + + int is_page_exist = 0; + + box = elm_object_content_get(scroller); + ret_if(!box); + + list = elm_box_children_get(box); + EINA_LIST_FREE(list, tmp) { + continue_if(!tmp); + if (page == tmp) { + is_page_exist = 1; + } + } + + if (!is_page_exist) { + _D("No page to remove"); + return; + } + + elm_box_unpack(box, page); +} + + + +void _scroller_bring_in_page(Evas_Object *scroller, Evas_Object *page, int *cur_page_no) +{ + Evas_Object *box = NULL; + Evas_Object *tmp = NULL; + Eina_List *list = NULL; + int index = 0; + int exist = 1; + + ret_if(!scroller); + ret_if(!page); + + box = elm_object_content_get(scroller); + ret_if(!box); + + list = elm_box_children_get(box); + ret_if(!list); + + EINA_LIST_FREE(list, tmp) { + continue_if(!tmp); + if (page == tmp) { + exist = 0; + } + index += exist; + } + + if (exist) { + index = 0; + } + + *cur_page_no = index; + + elm_scroller_page_bring_in(scroller, index, 0); +} + + + +void _scroller_resize(Evas_Object *scroller, int width, int height) +{ + Evas_Object *box = NULL; + Evas_Object *page = NULL; + Eina_List *list = NULL; + + ret_if(!scroller); + + elm_scroller_page_size_set(scroller, width, height); + + box = elm_object_content_get(scroller); + ret_if(!box); + + list = elm_box_children_get(box); + ret_if(!list); + + EINA_LIST_FREE(list, page) { + _page_resize(page, width, height); + } + elm_box_recalculate(box); +} + + + +int _scroller_register_event_cb(Evas_Object *scroller, int event_type, void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *user_data), void *user_data) +{ + Eina_List *event_cb_list = NULL; + event_cb_s *event_cb_info = NULL; + + retv_if(!scroller, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(event_type <= SCROLLER_EVENT_TYPE_INVALID, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(event_type >= SCROLLER_EVENT_TYPE_MAX, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!event_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + event_cb_info = calloc(1, sizeof(event_cb_s)); + retv_if(!event_cb_info, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + + event_cb_info->event_type = event_type; + event_cb_info->event_cb = event_cb; + event_cb_info->user_data = user_data; + + event_cb_list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST); + event_cb_list = eina_list_append(event_cb_list, event_cb_info); + evas_object_data_set(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list); + + return ATTACH_PANEL_ERROR_NONE; +} + + + +int _scroller_unregister_event_cb(Evas_Object *scroller, int event_type, void (*event_cb)(Evas_Object *scroller, int event_type, void *event_info, void *user_data)) +{ + Eina_List *event_cb_list = NULL; + const Eina_List *l = NULL; + const Eina_List *ln = NULL; + event_cb_s *event_cb_info = NULL; + + retv_if(!scroller, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(event_type <= SCROLLER_EVENT_TYPE_INVALID, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(event_type >= SCROLLER_EVENT_TYPE_MAX, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!event_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + event_cb_list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST); + retv_if(!event_cb_list, ATTACH_PANEL_ERROR_NOT_INITIALIZED); + + EINA_LIST_FOREACH_SAFE(event_cb_list, l, ln, event_cb_info) { + if (event_cb_info->event_type == event_type + && event_cb_info->event_cb == event_cb) { + event_cb_list = eina_list_remove(event_cb_list, event_cb_info); + break; + } + } + + evas_object_data_set(scroller, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list); + + return ATTACH_PANEL_ERROR_NONE; +} diff --git a/src/toolbar.c b/src/toolbar.c new file mode 100644 index 0000000..173073e --- /dev/null +++ b/src/toolbar.c @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "conf.h" +#include "log.h" +#include "toolbar.h" + + + +static const char *const PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST = "pdkec"; + + + +struct _event_cb { + int event_type; + void (*event_cb)(Evas_Object *toolbar, int event_type, void *event_info, void *user_data); + void *user_data; +}; +typedef struct _event_cb event_cb_s; + + + +static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Object *toolbar = obj; + + int x, y, w, h; + + ret_if(!toolbar); + + evas_object_geometry_get(toolbar, &x, &y, &w, &h); + _D("toolbar resize(%d, %d, %d, %d)", x, y, w, h); +} + + + +Evas_Object *_toolbar_create(Evas_Object *ui_manager, attach_panel_h attach_panel) +{ + Evas_Object *toolbar = NULL; + + retv_if(!ui_manager, NULL); + retv_if(!attach_panel, NULL); + + toolbar = elm_toolbar_add(ui_manager); + goto_if(!toolbar, ERROR); + + /* This will expand the transverse(horizontal) length of items according to the length of toolbar */ + elm_toolbar_transverse_expanded_set(toolbar, EINA_TRUE); + elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND); + elm_toolbar_homogeneous_set(toolbar, EINA_FALSE); + elm_toolbar_select_mode_set(toolbar, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_object_style_set(toolbar, "light_view"); + elm_object_focus_set(toolbar, EINA_TRUE); + + evas_object_show(toolbar); + evas_object_data_set(toolbar, DATA_KEY_ATTACH_PANEL_INFO, attach_panel); + + evas_object_event_callback_add(toolbar, EVAS_CALLBACK_RESIZE, __resize_cb, NULL); + + return toolbar; + +ERROR: + _toolbar_destroy(toolbar); + return NULL; +} + + + +void _toolbar_destroy(Evas_Object *toolbar) +{ + attach_panel_h attach_panel = NULL; + + ret_if(!toolbar); + + attach_panel = evas_object_data_del(toolbar, DATA_KEY_ATTACH_PANEL_INFO); + ret_if(!attach_panel); + + evas_object_event_callback_del(toolbar, EVAS_CALLBACK_RESIZE, __resize_cb); + evas_object_del(toolbar); +} + + + +static void __view_changed_cb(void *user_data, Evas_Object *obj, void *event_info) +{ + Evas_Object *toolbar = obj; + Evas_Object *page = user_data; + Eina_List *event_cb_list = NULL; + const Eina_List *l = NULL; + const Eina_List *ln = NULL; + event_cb_s *event_cb_info = NULL; + + ret_if(!toolbar); + ret_if(!page); + + event_cb_list = evas_object_data_get(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST); + ret_if(!event_cb_list); + + EINA_LIST_FOREACH_SAFE(event_cb_list, l, ln, event_cb_info) { + if (TOOLBAR_EVENT_TYPE_CHANGE_TAB == event_cb_info->event_type) { + if (event_cb_info->event_cb) { + event_cb_info->event_cb(toolbar, TOOLBAR_EVENT_TYPE_CHANGE_TAB, page, event_cb_info->user_data); + } + } + } +} + + + +Elm_Object_Item *_toolbar_append_item(Evas_Object *toolbar, const char *tab_name, Evas_Object *page) +{ + Elm_Object_Item *tab_item = NULL; + + retv_if(!toolbar, NULL); + retv_if(!tab_name, NULL); + + tab_item = elm_toolbar_item_append(toolbar, NULL, tab_name, __view_changed_cb, page); + elm_object_item_domain_text_translatable_set(tab_item, PACKAGE, EINA_TRUE); + retv_if(!tab_item, NULL); + + return tab_item; +} + + + +void _toolbar_remove_item(Evas_Object *toolbar, Elm_Object_Item *tabbar_item) +{ + ret_if(!toolbar); + ret_if(!tabbar_item); + + elm_object_item_del(tabbar_item); + + /* If the selected item is removed, we have to activate the current */ +} + + + +void _toolbar_bring_in(Evas_Object *toolbar, Elm_Object_Item *tabbar_item) +{ + Elm_Object_Item *selected_item = NULL; + + ret_if(!toolbar); + ret_if(!tabbar_item); + + selected_item = elm_toolbar_selected_item_get(toolbar); + if (selected_item && selected_item == tabbar_item) { + return; + } + + elm_toolbar_item_selected_set(tabbar_item, EINA_TRUE); + elm_object_focus_set(toolbar, EINA_TRUE); +} + + + +unsigned int _toolbar_count_item(Evas_Object *toolbar) +{ + retv_if(!toolbar, 0); + + return elm_toolbar_items_count(toolbar); +} + + + +int _toolbar_register_event_cb(Evas_Object *toolbar, int event_type, void (*event_cb)(Evas_Object *toolbar, int event_type, void *event_info, void *user_data), void *user_data) +{ + Eina_List *event_cb_list = NULL; + event_cb_s *event_cb_info = NULL; + + retv_if(!toolbar, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(event_type <= TOOLBAR_EVENT_TYPE_INVALID, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(event_type >= TOOLBAR_EVENT_TYPE_MAX, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!event_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + event_cb_info = calloc(1, sizeof(event_cb_s)); + retv_if(!event_cb_info, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + + event_cb_info->event_type = event_type; + event_cb_info->event_cb = event_cb; + event_cb_info->user_data = user_data; + + event_cb_list = evas_object_data_get(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST); + event_cb_list = eina_list_append(event_cb_list, event_cb_info); + evas_object_data_set(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list); + + return ATTACH_PANEL_ERROR_NONE; +} + + + +int _toolbar_unregister_event_cb(Evas_Object *toolbar, int event_type, void (*event_cb)(Evas_Object *toolbar, int event_type, void *event_info, void *user_data)) +{ + Eina_List *event_cb_list = NULL; + const Eina_List *l = NULL; + const Eina_List *ln = NULL; + event_cb_s *event_cb_info = NULL; + + retv_if(!toolbar, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(event_type <= TOOLBAR_EVENT_TYPE_INVALID, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(event_type >= TOOLBAR_EVENT_TYPE_MAX, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!event_cb, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + event_cb_list = evas_object_data_get(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST); + retv_if(!event_cb_list, ATTACH_PANEL_ERROR_NOT_INITIALIZED); + + EINA_LIST_FOREACH_SAFE(event_cb_list, l, ln, event_cb_info) { + if (event_cb_info->event_type == event_type + && event_cb_info->event_cb == event_cb) { + event_cb_list = eina_list_remove(event_cb_list, event_cb_info); + break; + } + } + + evas_object_data_set(toolbar, PRIVATE_DATA_KEY_EVENT_CALLBACK_LIST, event_cb_list); + + return ATTACH_PANEL_ERROR_NONE; +} diff --git a/src/ug.c b/src/ug.c new file mode 100644 index 0000000..ddebc99 --- /dev/null +++ b/src/ug.c @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "attach_bundle.h" +#include "content_list.h" +#include "gesture.h" +#include "log.h" + + + +static void __result_cb(ui_gadget_h ui_gadget, app_control_h result, void *priv) +{ + content_s *content_info = priv; + char *enable = NULL; + char **select = NULL; + + int i = 0; + int length = 0; + int ret = 0; + + ret_if(!content_info); + + if (ATTACH_PANEL_STATE_HIDE == _gesture_get_state()) + return; + + ret = app_control_get_extra_data(result, "__ATTACH_PANEL_FLICK_DOWN__", &enable); + if (APP_CONTROL_ERROR_NONE == ret) { + ret_if(!enable); + + _D("attach panel flick %s", enable); + if (!strcmp(enable, MODE_ENABLE)) { + content_info->attach_panel->flick = EINA_TRUE; + } else if (!strcmp(enable, MODE_DISABLE)) { + content_info->attach_panel->flick = EINA_FALSE; + } else { + _E("__ATTACH_PANEL_FLICK_DOWN__ value is wrong type(%s)", enable); + content_info->attach_panel->flick = EINA_TRUE; + } + return; + } + + ret = app_control_get_extra_data(result, "__ATTACH_PANEL_FULL_MODE__", &enable); + if (APP_CONTROL_ERROR_NONE == ret) { + ret_if(!enable); + + _D("attach panel full mode %s", enable); + if (!strcmp(enable, MODE_ENABLE)) { + _gesture_set_full_mode(content_info->attach_panel); + } else { + _E("__ATTACH_PANEL_FULL_MODE__ value is wrong type(%s)", enable); + } + return; + } + + /* This can be called by clicking the 'Cancel' button on the UGs */ + ret = app_control_get_extra_data(result, "__ATTACH_PANEL_SHOW_PANEL__", &enable); + if (APP_CONTROL_ERROR_NONE == ret) { + ret_if(!enable); + + _D("attach panel show panel %s", enable); + if (!strcmp(enable, MODE_TRUE)) { + if (ATTACH_PANEL_STATE_HIDE == _gesture_get_state()) { + /* This is same with attach_panel_show() */ + _content_list_set_resume(content_info->attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); + _content_list_send_message(content_info->attach_panel->content_list, "__ATTACH_PANEL_INITIALIZE__", MODE_ENABLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + _gesture_show(content_info->attach_panel); + } + } else { + if (ATTACH_PANEL_STATE_HIDE != _gesture_get_state()) { + /* This is same with attach_panel_hide() */ + _content_list_set_pause(content_info->attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); + _gesture_hide(content_info->attach_panel); + } + } + return; + } + + /* This can be called on the state of recording video. */ + ret = app_control_get_extra_data(result, "__ATTACH_PANEL_SHOW_TOOLBAR__", &enable); + if (APP_CONTROL_ERROR_NONE == ret) { + ret_if(!enable); + + _D("attach panel show toolbar %s", enable); + if (!strcmp(enable, MODE_TRUE)) { + elm_object_signal_emit(content_info->attach_panel->ui_manager, "toolbar,show", "toolbar"); + } else { + elm_object_signal_emit(content_info->attach_panel->ui_manager, "toolbar,hide", "toolbar"); + } + return; + } + + _D("The core of the panel sends the results to the caller"); + + /* This is just for protocol log */ + _D("relay callback is called"); + ret = app_control_get_extra_data_array(result, "http://tizen.org/appcontrol/data/selected", &select, &length); + if (APP_CONTROL_ERROR_NONE == ret && select) { + for (i = 0; i < length; i++) { + _D("selected is %s[%d]", select[i], i); + } + } + + ret = app_control_get_extra_data_array(result, "http://tizen.org/appcontrol/data/path", &select, &length); + if (APP_CONTROL_ERROR_NONE == ret && select) { + for (i = 0; i < length; i++) { + _D("path is %s[%d]", select[i], i); + } + } + + if (content_info->attach_panel->result_cb) { + content_info->attach_panel->result_cb(content_info->attach_panel + , content_info->innate_content_info->content_category + , result + , APP_CONTROL_RESULT_SUCCEEDED + , content_info->attach_panel->result_data); + + if (ATTACH_PANEL_STATE_FULL == _gesture_get_state()) { + /* This is same with attach_panel_hide() */ + _content_list_set_pause(content_info->attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); + _gesture_hide(content_info->attach_panel); + } + } else { + _D("content_info->attach_panel->result_cb is NULL"); + } +} + + + +static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Object *ui_manager = obj; + + int x, y, w, h; + + ret_if(!ui_manager); + + evas_object_geometry_get(ui_manager, &x, &y, &w, &h); + _D("%s resize(%d, %d, %d, %d)", data, x, y, w, h); +} + + + +Evas_Object *_ug_create(const char *appid, const char *operation, const char *selection_mode, const char *mime, bundle *b, content_s *content_info) +{ + app_control_h app_control = NULL; + ui_gadget_h ui_gadget = NULL; + Evas_Object *ug = NULL; + struct ug_cbs cbs = { + .layout_cb = NULL, + .result_cb = __result_cb, + .destroy_cb = NULL, + .priv = content_info, + }; + int ret = APP_CONTROL_ERROR_NONE; + + ret = app_control_create(&app_control); + goto_if(APP_CONTROL_ERROR_NONE != ret, ERROR); + + ret = app_control_set_operation(app_control, operation); + goto_if(APP_CONTROL_ERROR_NONE != ret, ERROR); + + ret = app_control_add_extra_data(app_control, "__CALLER_PANEL__", "attach-panel"); + goto_if(APP_CONTROL_ERROR_NONE != ret, ERROR); + + ret = app_control_add_extra_data(app_control, APP_CONTROL_DATA_SELECTION_MODE, selection_mode); + goto_if(APP_CONTROL_ERROR_NONE != ret, ERROR); + + if (mime) { + ret = app_control_set_mime(app_control, mime); + goto_if(APP_CONTROL_ERROR_NONE != ret, ERROR); + } + + if (b) { + _D("app control add the extra data for ug"); + _bundle_add_to_app_control(b, app_control); + } + + ui_gadget = ug_create(NULL, appid, UG_MODE_FRAMEVIEW, app_control, &cbs); + if (!ui_gadget) { + _E("The UG of %s is failed to launch", appid); + goto ERROR; + } + + ug = ug_get_layout(ui_gadget); + goto_if(!ug, ERROR); + + evas_object_show(ug); + evas_object_data_set(ug, DATA_KEY_UG, ui_gadget); + evas_object_event_callback_add(ug, EVAS_CALLBACK_RESIZE, __resize_cb, "ug"); + + ret = app_control_destroy(app_control); + if (APP_CONTROL_ERROR_NONE != ret) { + _E("cannot destroy app_control"); + } + + return ug; + +ERROR: + if (app_control) app_control_destroy(app_control); + + return NULL; +} + + + +void _ug_destroy(Evas_Object *ug) +{ + ui_gadget_h ui_gadget = NULL; + + ret_if(!ug); + + evas_object_event_callback_del(ug, EVAS_CALLBACK_RESIZE, __resize_cb); + ui_gadget = evas_object_data_del(ug, DATA_KEY_UG); + ret_if(!ui_gadget); + + ug_destroy(ui_gadget); +} diff --git a/src/ui_manager.c b/src/ui_manager.c new file mode 100644 index 0000000..1a24276 --- /dev/null +++ b/src/ui_manager.c @@ -0,0 +1,531 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +#include "attach_panel.h" +#include "attach_panel_internal.h" +#include "conf.h" +#include "content_list.h" +#include "gesture.h" +#include "list.h" +#include "log.h" +#include "page.h" +#include "scroller.h" +#include "toolbar.h" +#include "ug.h" +#include "grid.h" + + + +static const char *const FILE_LAYOUT_EDJ = EDJEDIR"/layout.edj"; +static const char *const GROUP_LAYOUT = "layout"; + + + +Evas_Object *_ui_manager_create_content(Evas_Object *page, content_s *content_info, attach_panel_h attach_panel) +{ + Evas_Object *content = NULL; + Elm_Object_Item *item = NULL; + + retv_if(!page, NULL); + retv_if(!content_info, NULL); + retv_if(!attach_panel, NULL); + + switch (content_info->innate_content_info->content_category) { + case ATTACH_PANEL_CONTENT_CATEGORY_IMAGE: + case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA: + case ATTACH_PANEL_CONTENT_CATEGORY_VOICE: + content = _ug_create(content_info->innate_content_info->appid + , content_info->innate_content_info->operation + , content_info->innate_content_info->selection_mode + , content_info->innate_content_info->mime + , content_info->extra_data + , content_info); + evas_object_show(content); + content_info->grid_item = NULL; + break; + default: + /* This function can return NULL, if there is already a grid content */ + if (attach_panel->grid) { + content = attach_panel->grid; + } else { + content = _grid_create(page, attach_panel); + attach_panel->grid = content; + } + + item = _grid_append_item(attach_panel->grid, content_info); + break_if(!item); + + break; + } + + evas_object_size_hint_weight_set(content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(page, "content", content); + + evas_object_data_set(content, DATA_KEY_PAGE, page); + + return content; +} + + + +void _ui_manager_destroy_content(content_s *content_info, attach_panel_h attach_panel) +{ + ret_if(!content_info->content); + ret_if(!attach_panel); + + evas_object_data_del(content_info->content, DATA_KEY_PAGE); + + switch (content_info->innate_content_info->content_category) { + case ATTACH_PANEL_CONTENT_CATEGORY_IMAGE: + case ATTACH_PANEL_CONTENT_CATEGORY_CAMERA: + case ATTACH_PANEL_CONTENT_CATEGORY_VOICE: + _ug_destroy(content_info->content); + break; + default: + _grid_remove_item(attach_panel->grid, content_info); + + if (!_grid_count_item(attach_panel->grid)) { + _grid_destroy(attach_panel->grid); + attach_panel->grid = NULL; + } + + break; + } +} + + + +int _ui_manager_append_content_category(Evas_Object *ui_manager, innate_content_s *innate_content_info, bundle *extra_data) +{ + attach_panel_h attach_panel = NULL; + content_s *content_info = NULL; + Evas_Object *page = NULL; + + retv_if(!ui_manager, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + retv_if(!innate_content_info, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + attach_panel = evas_object_data_get(ui_manager, DATA_KEY_ATTACH_PANEL_INFO); + retv_if(!attach_panel, ATTACH_PANEL_ERROR_INVALID_PARAMETER); + + content_info = calloc(1, sizeof(content_s)); + retv_if(!content_info, ATTACH_PANEL_ERROR_OUT_OF_MEMORY); + content_info->attach_panel = attach_panel; + content_info->innate_content_info = innate_content_info; + content_info->extra_data = extra_data; + content_info->order = ORDER_MAX; + + if (innate_content_info->is_ug) { + /* UG side */ + page = _page_create(attach_panel, attach_panel->transit_width, 0); + goto_if(!page, ERROR); + _scroller_append_page(attach_panel->scroller, page); + + content_info->tabbar_item = + _toolbar_append_item(attach_panel->toolbar, innate_content_info->name, page); + goto_if(!content_info->tabbar_item, ERROR); + content_info->content = NULL; + content_info->order = 0; + } else { + /* App side */ + if (attach_panel->grid) { + /* Grid */ + page = attach_panel->grid_page; + content_info->tabbar_item = attach_panel->grid_tabbar_item; + } else { + /* No grid */ + Evas_Object *page_bg = NULL; + page = _page_create(attach_panel, attach_panel->transit_width, 0); + page_bg = elm_object_part_content_get(page, "bg"); + if (page_bg) { + evas_object_color_set(page_bg, 250, 250, 250, 255); + } + attach_panel->grid_page = page; + goto_if(!page, ERROR); + _scroller_append_page(attach_panel->scroller, page); + + content_info->tabbar_item = _toolbar_append_item(attach_panel->toolbar, content_info->innate_content_info->tabbar_name, page); + attach_panel->grid_tabbar_item = content_info->tabbar_item; + goto_if(!content_info->tabbar_item, ERROR); + } + content_info->content = _ui_manager_create_content(page, content_info, attach_panel); + goto_if(!content_info->content, ERROR); + elm_object_part_content_set(page, "content", content_info->content); + } + + content_info->page = page; + + if (1 == _toolbar_count_item(attach_panel->toolbar)) { + _toolbar_bring_in(attach_panel->toolbar, content_info->tabbar_item); + } + + attach_panel->content_list = eina_list_append(attach_panel->content_list, content_info); + content_info->index = eina_list_count(attach_panel->content_list) - 1; + + return ATTACH_PANEL_ERROR_NONE; + +ERROR: + if (content_info->tabbar_item) _toolbar_remove_item(attach_panel->toolbar, content_info->tabbar_item); + if (content_info->content) _ui_manager_destroy_content(content_info, attach_panel); + if (page) _page_destroy(page); + free(content_info); + + return ATTACH_PANEL_ERROR_NOT_INITIALIZED; +} + + + +void _ui_manager_remove_content_category(Evas_Object *ui_manager, content_s *content_info) +{ + attach_panel_h attach_panel = NULL; + + ret_if(!ui_manager); + ret_if(!content_info); + + attach_panel = evas_object_data_get(ui_manager, DATA_KEY_ATTACH_PANEL_INFO); + ret_if(!attach_panel); + + _ui_manager_destroy_content(content_info, attach_panel); + + if (content_info->innate_content_info->is_ug + || !attach_panel->grid) { + Evas_Object *page = evas_object_data_get(content_info->content, DATA_KEY_PAGE); + if (page) { + _page_destroy(page); + } + _toolbar_remove_item(attach_panel->toolbar, content_info->tabbar_item); + } + + attach_panel->content_list = eina_list_remove(attach_panel->content_list, content_info); + free(content_info); +} + + + +static void __remove_content_categories(Evas_Object *ui_manager) +{ + attach_panel_h attach_panel = NULL; + content_s *content_info = NULL; + + ret_if(!ui_manager); + + attach_panel = evas_object_data_get(ui_manager, DATA_KEY_ATTACH_PANEL_INFO); + ret_if(!attach_panel); + + EINA_LIST_FREE(attach_panel->content_list, content_info) { + Evas_Object *page = NULL; + + _ui_manager_destroy_content(content_info, attach_panel); + page= evas_object_data_get(content_info->content, DATA_KEY_PAGE); + if (page) { + elm_object_part_content_unset(page, "content"); + _page_destroy(page); + } + _toolbar_remove_item(attach_panel->toolbar, content_info->tabbar_item); + free(content_info); + } +} + + + +static void __resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Object *ui_manager = obj; + Evas_Coord x = 0; + Evas_Coord y = 0; + Evas_Coord w = 0; + Evas_Coord h = 0; + + ret_if(!ui_manager); + + evas_object_geometry_get(ui_manager, &x, &y, &w, &h); + _D("ui_manager resize(%d, %d, %d, %d)", x, y, w, h); +} + + + +static void _change_tab_cb(Evas_Object *toolbar, int event_type, void *event_info, void *data) +{ + attach_panel_h attach_panel = data; + Evas_Object *page = event_info; + content_s *content_info = NULL; + + ret_if(!attach_panel); + ret_if(!attach_panel->toolbar); + ret_if(!attach_panel->scroller); + ret_if(!page); + + content_info = eina_list_nth(attach_panel->content_list, attach_panel->cur_page_no); + ret_if(!content_info); + ret_if(!content_info->innate_content_info); + + if (EINA_TRUE == attach_panel->is_delete) { + _D("This is attach_panel_destroy"); + return; + } + + if (page == content_info->page) { + _D("Tab the same page"); + return; + } + + if (ATTACH_PANEL_STATE_HIDE == _gesture_get_state()) { + _D("state of attach_panel is hide state"); + return; + } + + /* TODO : destroy the ug when page is not shown + + if (content_info->innate_content_info->is_ug) { + _ui_manager_destroy_content(content_info, attach_panel); + content_info->content = NULL; + } */ + + _scroller_bring_in_page(attach_panel->scroller, page, &attach_panel->cur_page_no); + content_info = eina_list_nth(attach_panel->content_list, attach_panel->cur_page_no); + ret_if(!content_info); + ret_if(!content_info->innate_content_info); + + if (!content_info->innate_content_info->is_ug) { + return; + } + + if (content_info->content) { + return; + } + + _D("change tab for create ug (%s)", content_info->innate_content_info->appid); + + content_info->content = _ui_manager_create_content(content_info->page, content_info, attach_panel); + ret_if(!content_info->content); + if (ATTACH_PANEL_STATE_FULL == _gesture_get_state()) { + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_MULTIPLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + } else { + _content_list_send_message(attach_panel->content_list, APP_CONTROL_DATA_SELECTION_MODE, SELECTION_MODE_SINGLE, ATTACH_PANEL_CONTENT_CATEGORY_UG); + } +} + + + +static void _scroll_cb(Evas_Object *scroller, int event_type, void *event_info, void *data) +{ + attach_panel_h attach_panel = data; + Elm_Object_Item *tabbar_item = event_info; + + ret_if(!attach_panel); + ret_if(!attach_panel->toolbar); + ret_if(!tabbar_item); + + _toolbar_bring_in(attach_panel->toolbar, tabbar_item); +} + + + +static void __window_resume_cb(void *data, Evas_Object *scroller, void *event_info) +{ + attach_panel_h attach_panel = data; + ret_if(!attach_panel); + + if (ATTACH_PANEL_STATE_HIDE == _gesture_get_state()) { + _D("attach panel is already hide"); + return; + } + + _D("caller window is resumed"); + _content_list_set_resume(attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); + + attach_panel->content_list = _list_sort_by_rua(attach_panel->content_list); + _grid_refresh(attach_panel->grid); +} + + + +static void __window_pause_cb(void *data, Evas_Object *scroller, void *event_info) +{ + attach_panel_h attach_panel = data; + ret_if(!attach_panel); + + if (ATTACH_PANEL_STATE_HIDE == _gesture_get_state()) { + _D("attach panel is already hide"); + return; + } + + _D("caller window is paused"); + _content_list_set_pause(attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); +} + + + +static void __lang_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + _D("language changed"); + ug_send_event(UG_EVENT_LANG_CHANGE); +} + + + +static void __keypad_on_cb(void *data, Evas_Object *obj, void *event_info) +{ + attach_panel_h attach_panel = data; + ret_if(!attach_panel); + + _D("keypad state on"); + + if (ATTACH_PANEL_STATE_HIDE == _gesture_get_state()) { + _D("attach panel is already hide"); + return; + } + /* This is same with attach_panel_hide */ + _content_list_set_pause(attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); + _gesture_hide(attach_panel); +} + + + +static void __key_back_cb(void *data, Evas_Object *obj, void *event_info) +{ + attach_panel_h attach_panel = data; + ret_if(!attach_panel); + + if (ATTACH_PANEL_STATE_HIDE == _gesture_get_state()) { + _D("attach panel is already hide"); + return; + } + /* This is same with attach_panel_hide() */ + _content_list_set_pause(attach_panel->content_list, ATTACH_PANEL_CONTENT_CATEGORY_UG); + _gesture_hide(attach_panel); +} + + + +Evas_Object *_ui_manager_create(attach_panel_h attach_panel) +{ + Evas_Object *ui_manager = NULL; + Evas_Object *parent = NULL; + int ret = ATTACH_PANEL_ERROR_NONE; + + retv_if(!attach_panel, NULL); + retv_if(!attach_panel->conformant, NULL); + + ui_manager = elm_layout_add(attach_panel->conformant); + retv_if(!ui_manager, NULL); + elm_layout_file_set(ui_manager, FILE_LAYOUT_EDJ, GROUP_LAYOUT); + evas_object_size_hint_weight_set(ui_manager, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ui_manager, EVAS_HINT_FILL, 1.0); + evas_object_show(ui_manager); + + evas_object_data_set(ui_manager, DATA_KEY_ATTACH_PANEL_INFO, attach_panel); + evas_object_event_callback_add(ui_manager, EVAS_CALLBACK_RESIZE, __resize_cb, NULL); + + attach_panel->toolbar = _toolbar_create(ui_manager, attach_panel); + goto_if(!attach_panel->toolbar, ERROR); + elm_object_part_content_set(ui_manager, "toolbar", attach_panel->toolbar); + + ret = _toolbar_register_event_cb(attach_panel->toolbar, TOOLBAR_EVENT_TYPE_CHANGE_TAB, _change_tab_cb, attach_panel); + goto_if(ATTACH_PANEL_ERROR_NONE != ret, ERROR); + + attach_panel->scroller = _scroller_create(ui_manager, attach_panel); + goto_if(!attach_panel->scroller, ERROR); + elm_object_part_content_set(ui_manager, "scroller", attach_panel->scroller); + + ret = _scroller_register_event_cb(attach_panel->scroller, SCROLLER_EVENT_TYPE_SCROLL, _scroll_cb, attach_panel); + goto_if(ATTACH_PANEL_ERROR_NONE != ret, ERROR); + + parent = attach_panel->conformant; + do { + const char *type = NULL; + + parent = elm_object_parent_widget_get(parent); + break_if(!parent); + + type = elm_object_widget_type_get(parent); + continue_if(!type); + if (!strcmp(type, "Elm_Win")) { + UG_INIT_EFL(parent, UG_OPT_INDICATOR_DISABLE); + attach_panel->win = parent; + break; + } + } while (parent); + + evas_object_smart_callback_add(parent, "normal", __window_resume_cb, attach_panel); + evas_object_smart_callback_add(parent, "iconified", __window_pause_cb, attach_panel); + evas_object_smart_callback_add(attach_panel->conformant, "language,changed", __lang_changed_cb, NULL); + evas_object_smart_callback_add(attach_panel->conformant, "virtualkeypad,state,on", __keypad_on_cb, attach_panel); + eext_object_event_callback_add(ui_manager, EEXT_CALLBACK_BACK, __key_back_cb, attach_panel); + + return ui_manager; + +ERROR: + if (attach_panel->toolbar) { + _toolbar_destroy(attach_panel->toolbar); + } + + if (ui_manager) { + evas_object_del(ui_manager); + } + + return NULL; +} + + + +void _ui_manager_destroy(Evas_Object *ui_manager) +{ + attach_panel_h attach_panel = NULL; + int ret = ATTACH_PANEL_ERROR_NONE; + + __remove_content_categories(ui_manager); + + /* attach_panel_h is used in the __remove_content_categories */ + attach_panel = evas_object_data_del(ui_manager, DATA_KEY_ATTACH_PANEL_INFO); + ret_if(!attach_panel); + + eext_object_event_callback_del(ui_manager, EEXT_CALLBACK_BACK, __key_back_cb); + evas_object_smart_callback_del(attach_panel->conformant, "virtualkeypad,state,on", __keypad_on_cb); + evas_object_smart_callback_del(attach_panel->conformant, "language,changed", __lang_changed_cb); + evas_object_event_callback_del(ui_manager, EVAS_CALLBACK_RESIZE, __resize_cb); + if (attach_panel->win) { + evas_object_smart_callback_del(attach_panel->win, "normal", __window_resume_cb); + evas_object_smart_callback_del(attach_panel->win, "iconified", __window_pause_cb); + } + + if (attach_panel->scroller) { + ret = _scroller_unregister_event_cb(attach_panel->scroller, SCROLLER_EVENT_TYPE_SCROLL, _scroll_cb); + if (ATTACH_PANEL_ERROR_NONE != ret) { + _E("cannot unregiter event_cb for scroller"); + } + elm_object_part_content_unset(ui_manager, "scroller"); + _scroller_destroy(attach_panel->scroller); + } + + if (attach_panel->toolbar) { + ret = _toolbar_unregister_event_cb(attach_panel->toolbar, TOOLBAR_EVENT_TYPE_CHANGE_TAB, _change_tab_cb); + if (ATTACH_PANEL_ERROR_NONE != ret) { + _E("cannot unregiter event_cb for toolbar"); + } + elm_object_part_content_unset(ui_manager, "toolbar"); + _toolbar_destroy(attach_panel->toolbar); + } + + if (attach_panel->ui_manager) { + evas_object_del(ui_manager); + } +} -- 2.7.4