From a60d722d1ef542f51dd435e053b2e36c44d76183 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:55:45 +0900 Subject: [PATCH] Initialize Tizen 2.3 --- .gitattributes | 3 + AUTHORS | 2 + CMakeLists.txt | 98 ++ LICENSE.Flora | 206 +++ NOTICE | 3 + data/CMakeLists.txt | 11 + data/edje/CMakeLists.txt | 61 + data/edje/all_apps_portrait.edc | 145 ++ data/edje/button_edit.edc | 294 ++++ data/edje/conf.edc | 1 + data/edje/group_4x4_portrait.edc | 219 +++ data/edje/index.edc | 179 +++ data/edje/item_4x4.edc | 345 +++++ data/edje/layout_portrait.edc | 90 ++ data/images/CMakeLists.txt | 1 + data/images/RM06_App tray_Btn_Uninstall.png | Bin 0 -> 6062 bytes .../RM06_App tray_Btn_Uninstall_press.png | Bin 0 -> 6231 bytes data/images/RM06_App_tray_edit_btn.png | Bin 0 -> 3040 bytes data/images/RM06_App_tray_edit_btn_press.png | Bin 0 -> 3029 bytes data/images/RM06_App_tray_setting.png | Bin 0 -> 4380 bytes data/images/RM06_App_tray_setting_press.png | Bin 0 -> 3331 bytes data/images/btn_edit_nor.9.png | Bin 0 -> 6025 bytes data/images/btn_edit_press.9.png | Bin 0 -> 6603 bytes data/images/default.png | Bin 0 -> 17581 bytes data/images/icon_btn_done_nor.png | Bin 0 -> 3176 bytes data/images/icon_btn_done_press.png | Bin 0 -> 3135 bytes data/images/icon_btn_edit_nor.png | Bin 0 -> 1468 bytes data/images/icon_btn_edit_press.png | Bin 0 -> 1375 bytes data/images/menu_badge_01.png | Bin 0 -> 1414 bytes data/images/page indicator.png | Bin 0 -> 412 bytes data/images/page indicator_focus.png | Bin 0 -> 391 bytes data/menu-screen-env.sh | 6 + data/org.tizen.menu-screen.desktop.in | 7 + data/org.tizen.menu-screen.xml.in | 11 + data/po/CMakeLists.txt | 79 + data/po/ar.po | 8 + data/po/az.po | 8 + data/po/bg.po | 8 + data/po/ca.po | 8 + data/po/cs.po | 8 + data/po/da.po | 8 + data/po/de_DE.po | 8 + data/po/el_GR.po | 8 + data/po/en.po | 8 + data/po/en_PH.po | 8 + data/po/en_US.po | 8 + data/po/es_ES.po | 8 + data/po/es_MX.po | 8 + data/po/et.po | 8 + data/po/eu.po | 8 + data/po/fa.po | 8 + data/po/fi.po | 8 + data/po/fr_CA.po | 8 + data/po/fr_FR.po | 8 + data/po/ga.po | 8 + data/po/gl.po | 8 + data/po/hi.po | 8 + data/po/hr.po | 8 + data/po/hu.po | 8 + data/po/hy.po | 8 + data/po/is.po | 8 + data/po/it_IT.po | 8 + data/po/ja_JP.po | 8 + data/po/ka.po | 8 + data/po/kk.po | 8 + data/po/ko_KR.po | 8 + data/po/lt.po | 8 + data/po/lv.po | 8 + data/po/mk.po | 8 + data/po/nb.po | 8 + data/po/nl_NL.po | 8 + data/po/pl.po | 8 + data/po/pt_BR.po | 8 + data/po/pt_PT.po | 8 + data/po/ro.po | 8 + data/po/ru_RU.po | 8 + data/po/sk.po | 8 + data/po/sl.po | 8 + data/po/sr.po | 8 + data/po/sv.po | 8 + data/po/th.po | 8 + data/po/tr_TR.po | 8 + data/po/uk.po | 8 + data/po/ur.po | 8 + data/po/uz.po | 8 + data/po/zh_CN.po | 8 + data/po/zh_HK.po | 8 + data/po/zh_SG.po | 8 + data/po/zh_TW.po | 8 + include/all_apps/db.h | 47 + include/all_apps/layout.h | 35 + include/all_apps/list.h | 27 + include/all_apps/shortcut.h | 35 + include/conf.h | 37 + include/db.h | 47 + include/index.h | 35 + include/item.h | 78 + include/item_badge.h | 35 + include/item_event.h | 29 + include/key.h | 29 + include/layout.h | 36 + include/list.h | 70 + include/mapbuf.h | 40 + include/menu_screen.h | 38 + include/mouse.h | 33 + include/page.h | 50 + include/page_scroller.h | 58 + include/pkgmgr.h | 66 + include/popup.h | 29 + include/util.h | 168 +++ org.tizen.menu-screen.manifest | 11 + org.tizen.menu-screen.rule | 94 ++ packaging/org.tizen.menu-screen.spec | 143 ++ src/all_apps/db.c | 209 +++ src/all_apps/layout.c | 420 ++++++ src/all_apps/list.c | 149 ++ src/all_apps/shortcut.c | 236 +++ src/db.c | 316 ++++ src/index.c | 145 ++ src/item.c | 981 ++++++++++++ src/item_badge.c | 180 +++ src/item_event.c | 156 ++ src/key.c | 230 +++ src/layout.c | 151 ++ src/list.c | 209 +++ src/mapbuf.c | 219 +++ src/menu_screen.c | 627 ++++++++ src/mouse.c | 191 +++ src/page.c | 568 +++++++ src/page_scroller.c | 1309 +++++++++++++++++ src/pkgmgr.c | 865 +++++++++++ src/popup.c | 249 ++++ src/util.c | 71 + 133 files changed, 10944 insertions(+) create mode 100644 .gitattributes create mode 100644 AUTHORS create mode 100644 CMakeLists.txt create mode 100644 LICENSE.Flora create mode 100644 NOTICE create mode 100644 data/CMakeLists.txt create mode 100644 data/edje/CMakeLists.txt create mode 100644 data/edje/all_apps_portrait.edc create mode 100644 data/edje/button_edit.edc create mode 120000 data/edje/conf.edc create mode 100644 data/edje/group_4x4_portrait.edc create mode 100644 data/edje/index.edc create mode 100644 data/edje/item_4x4.edc create mode 100644 data/edje/layout_portrait.edc create mode 100644 data/images/CMakeLists.txt create mode 100644 data/images/RM06_App tray_Btn_Uninstall.png create mode 100644 data/images/RM06_App tray_Btn_Uninstall_press.png create mode 100644 data/images/RM06_App_tray_edit_btn.png create mode 100644 data/images/RM06_App_tray_edit_btn_press.png create mode 100644 data/images/RM06_App_tray_setting.png create mode 100644 data/images/RM06_App_tray_setting_press.png create mode 100644 data/images/btn_edit_nor.9.png create mode 100644 data/images/btn_edit_press.9.png create mode 100644 data/images/default.png create mode 100644 data/images/icon_btn_done_nor.png create mode 100644 data/images/icon_btn_done_press.png create mode 100644 data/images/icon_btn_edit_nor.png create mode 100644 data/images/icon_btn_edit_press.png create mode 100644 data/images/menu_badge_01.png create mode 100644 data/images/page indicator.png create mode 100644 data/images/page indicator_focus.png create mode 100755 data/menu-screen-env.sh create mode 100644 data/org.tizen.menu-screen.desktop.in create mode 100755 data/org.tizen.menu-screen.xml.in create mode 100644 data/po/CMakeLists.txt create mode 100644 data/po/ar.po create mode 100644 data/po/az.po create mode 100644 data/po/bg.po create mode 100644 data/po/ca.po create mode 100644 data/po/cs.po create mode 100644 data/po/da.po create mode 100644 data/po/de_DE.po create mode 100644 data/po/el_GR.po create mode 100644 data/po/en.po create mode 100644 data/po/en_PH.po create mode 100644 data/po/en_US.po create mode 100644 data/po/es_ES.po create mode 100644 data/po/es_MX.po create mode 100644 data/po/et.po create mode 100644 data/po/eu.po create mode 100755 data/po/fa.po create mode 100644 data/po/fi.po create mode 100644 data/po/fr_CA.po create mode 100644 data/po/fr_FR.po create mode 100644 data/po/ga.po create mode 100644 data/po/gl.po create mode 100644 data/po/hi.po create mode 100644 data/po/hr.po create mode 100644 data/po/hu.po create mode 100644 data/po/hy.po create mode 100644 data/po/is.po create mode 100644 data/po/it_IT.po create mode 100644 data/po/ja_JP.po create mode 100644 data/po/ka.po create mode 100644 data/po/kk.po create mode 100644 data/po/ko_KR.po create mode 100644 data/po/lt.po create mode 100644 data/po/lv.po create mode 100644 data/po/mk.po create mode 100644 data/po/nb.po create mode 100644 data/po/nl_NL.po create mode 100644 data/po/pl.po create mode 100644 data/po/pt_BR.po create mode 100644 data/po/pt_PT.po create mode 100644 data/po/ro.po create mode 100644 data/po/ru_RU.po create mode 100644 data/po/sk.po create mode 100644 data/po/sl.po create mode 100644 data/po/sr.po create mode 100644 data/po/sv.po create mode 100755 data/po/th.po create mode 100644 data/po/tr_TR.po create mode 100644 data/po/uk.po create mode 100755 data/po/ur.po create mode 100644 data/po/uz.po create mode 100644 data/po/zh_CN.po create mode 100644 data/po/zh_HK.po create mode 100644 data/po/zh_SG.po create mode 100644 data/po/zh_TW.po create mode 100644 include/all_apps/db.h create mode 100644 include/all_apps/layout.h create mode 100644 include/all_apps/list.h create mode 100644 include/all_apps/shortcut.h create mode 100644 include/conf.h create mode 100644 include/db.h create mode 100644 include/index.h create mode 100644 include/item.h create mode 100644 include/item_badge.h create mode 100644 include/item_event.h create mode 100644 include/key.h create mode 100644 include/layout.h create mode 100644 include/list.h create mode 100644 include/mapbuf.h create mode 100644 include/menu_screen.h create mode 100644 include/mouse.h create mode 100644 include/page.h create mode 100644 include/page_scroller.h create mode 100644 include/pkgmgr.h create mode 100644 include/popup.h create mode 100644 include/util.h create mode 100644 org.tizen.menu-screen.manifest create mode 100644 org.tizen.menu-screen.rule create mode 100644 packaging/org.tizen.menu-screen.spec create mode 100644 src/all_apps/db.c create mode 100644 src/all_apps/layout.c create mode 100644 src/all_apps/list.c create mode 100644 src/all_apps/shortcut.c create mode 100644 src/db.c create mode 100644 src/index.c create mode 100644 src/item.c create mode 100644 src/item_badge.c create mode 100644 src/item_event.c create mode 100644 src/key.c create mode 100644 src/layout.c create mode 100644 src/list.c create mode 100644 src/mapbuf.c create mode 100644 src/menu_screen.c create mode 100644 src/mouse.c create mode 100644 src/page.c create mode 100644 src/page_scroller.c create mode 100644 src/pkgmgr.c create mode 100644 src/popup.c create mode 100644 src/util.c diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..4f9114b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +.gitattributes export-ignore +.gitignore export-ignore +debian export-ignore diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..95e1254 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Jin Yoon +Youngjoo Park diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5fe2f0d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,98 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(menu-screen C) + +SET(PACKAGE_NAME "org.tizen.${PROJECT_NAME}") +SET(PREFIX "/usr/apps/${PACKAGE_NAME}") +SET(EXEC_PREFIX "${PREFIX}/bin") +SET(LIBDIR "${PREFIX}/lib") +SET(DATADIR "/opt${PREFIX}/data") +SET(RESDIR "${PREFIX}/res") +SET(IMAGEDIR "${RESDIR}/images") +SET(EDJEDIR "${RESDIR}/edje") +SET(LOCALEDIR "${RESDIR}/locale") +SET(VERSION 0.1.0) + +INCLUDE(FindPkgConfig) +pkg_check_modules(MENU_PKGS REQUIRED + ail + appsvc + aul + badge + bundle + capi-appfw-application + capi-system-info + dlog + ecore + ecore-evas + ecore-file + ecore-imf + ecore-input + ecore-x + edje + eet + eina + elementary + evas + heynoti + pkgmgr + pkgmgr-info + shortcut + sysman + syspopup-caller + utilX +) + +ADD_DEFINITIONS("-DENABLE_BGIMAGE") +ADD_DEFINITIONS("-DLOG_TAG=\"MENU_SCREEN\"") +ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"") +ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE_NAME}\"") +ADD_DEFINITIONS("-DVERSION=\"${VERSION}\"") +ADD_DEFINITIONS("-DDATADIR=\"${DATADIR}\"") +ADD_DEFINITIONS("-DRESDIR=\"${RESDIR}\"") +ADD_DEFINITIONS("-DIMAGEDIR=\"${IMAGEDIR}\"") +ADD_DEFINITIONS("-DEDJEDIR=\"${EDJEDIR}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") + +FOREACH (flag ${MENU_PKGS_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) + +SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fdata-sections -ffunction-sections -Wl,--gc-sections") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) + +ADD_EXECUTABLE(${PROJECT_NAME} + src/db.c + src/index.c + src/item.c + src/item_badge.c + src/item_event.c + src/key.c + src/layout.c + src/list.c + src/mapbuf.c + src/menu_screen.c + src/mouse.c + src/page.c + src/page_scroller.c + src/pkgmgr.c + src/popup.c + src/util.c + src/all_apps/db.c + src/all_apps/layout.c + src/all_apps/list.c + src/all_apps/shortcut.c +) + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -lm) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${MENU_PKGS_LDFLAGS}) + +# Install +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${EXEC_PREFIX}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.Flora DESTINATION /usr/share/license RENAME ${PACKAGE_NAME}) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}.rule DESTINATION /opt/etc/smack/accesses.d) + +ADD_SUBDIRECTORY(data) + +# End of a file diff --git a/LICENSE.Flora b/LICENSE.Flora new file mode 100644 index 0000000..571fe79 --- /dev/null +++ b/LICENSE.Flora @@ -0,0 +1,206 @@ +Flora License + +Version 1.1, April, 2013 + +http://floralicense.org/license/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and +all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of +this definition, "control" means (i) the power, direct or indirect, +to cause the direction or management of such entity, +whether by contract or otherwise, or (ii) ownership of fifty percent (50%) +or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided +in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, +Derivative Works shall not include works that remain separable from, +or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or +its representatives, including but not limited to communication on +electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Tizen Compliance Specification +and passes the Tizen Compliance Tests as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work +solely as incorporated into a Tizen Certified Platform, where such +license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work solely +as incorporated into a Tizen Certified Platform to which such +Contribution(s) was submitted. If You institute patent litigation +against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent infringement, +then any patent licenses granted to You under this License for that +Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that + You distribute, all copyright, patent, trademark, and attribution + notices from the Source form of the Work, excluding those notices + that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of + the Derivative Works, in at least one of the following places: + within a NOTICE text file distributed as part of the Derivative Works; + within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, + if and wherever such third-party notices normally appear. + The contents of the NOTICE file are for informational purposes only + and do not modify the License. You may add Your own attribution notices + within Derivative Works that You distribute, alongside or as an addendum + to the NOTICE text from the Work, provided that such additional attribution + notices cannot be construed as modifying the License. You may add Your own + copyright statement to Your modifications and may provide additional or + different license terms and conditions for use, reproduction, or + distribution of Your modifications, or for any such Derivative Works + as a whole, provided Your use, reproduction, and distribution of + the Work otherwise complies with the conditions stated in this License + and your own copyright statement or terms and conditions do not conflict + the conditions stated in the License including section 3. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.1 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/ + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..04443b1 --- /dev/null +++ b/NOTICE @@ -0,0 +1,3 @@ +Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under the Flora License, Version 1.1. +Please, see the LICENCE.Flora file for the Flora License, Version 1.1 terms and conditions. diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt new file mode 100644 index 0000000..b491de5 --- /dev/null +++ b/data/CMakeLists.txt @@ -0,0 +1,11 @@ +SET(MANIFESTDIR "/usr/share/packages") + +# manifest +CONFIGURE_FILE(${PACKAGE_NAME}.xml.in ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}.xml) +INSTALL(FILES ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}.xml DESTINATION ${MANIFESTDIR}) + +ADD_SUBDIRECTORY(edje) +ADD_SUBDIRECTORY(images) +ADD_SUBDIRECTORY(po) + +# End of a file diff --git a/data/edje/CMakeLists.txt b/data/edje/CMakeLists.txt new file mode 100644 index 0000000..2e334a0 --- /dev/null +++ b/data/edje/CMakeLists.txt @@ -0,0 +1,61 @@ +ADD_CUSTOM_TARGET(index.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/../images ${EDJE_CFLAGS} + ${CMAKE_CURRENT_SOURCE_DIR}/index.edc index.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/index.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} index.edj) +INSTALL(FILES index.edj DESTINATION ${EDJEDIR}) + + + +ADD_CUSTOM_TARGET(item_4x4.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/../images ${EDJE_CFLAGS} + ${CMAKE_CURRENT_SOURCE_DIR}/item_4x4.edc item_4x4.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/item_4x4.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} item_4x4.edj) +INSTALL(FILES item_4x4.edj DESTINATION ${EDJEDIR}) + + + +ADD_CUSTOM_TARGET(group_4x4_portrait.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/../images ${EDJE_CFLAGS} + ${CMAKE_CURRENT_SOURCE_DIR}/group_4x4_portrait.edc group_4x4_portrait.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/group_4x4_portrait.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} group_4x4_portrait.edj) +INSTALL(FILES group_4x4_portrait.edj DESTINATION ${EDJEDIR}) + + + +ADD_CUSTOM_TARGET(all_apps_portrait.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/../images ${EDJE_CFLAGS} + ${CMAKE_CURRENT_SOURCE_DIR}/all_apps_portrait.edc all_apps_portrait.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/all_apps_portrait.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} all_apps_portrait.edj) +INSTALL(FILES all_apps_portrait.edj DESTINATION ${EDJEDIR}) + + + +ADD_CUSTOM_TARGET(layout_portrait.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/../images ${EDJE_CFLAGS} + ${CMAKE_CURRENT_SOURCE_DIR}/layout_portrait.edc layout_portrait.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/layout_portrait.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} layout_portrait.edj) +INSTALL(FILES layout_portrait.edj DESTINATION ${EDJEDIR}) + + + +ADD_CUSTOM_TARGET(button_edit.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/../images ${EDJE_CFLAGS} + ${CMAKE_CURRENT_SOURCE_DIR}/button_edit.edc button_edit.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/button_edit.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} button_edit.edj) +INSTALL(FILES button_edit.edj DESTINATION ${EDJEDIR}) + + + +# End of a file diff --git a/data/edje/all_apps_portrait.edc b/data/edje/all_apps_portrait.edc new file mode 100644 index 0000000..b413286 --- /dev/null +++ b/data/edje/all_apps_portrait.edc @@ -0,0 +1,145 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +collections { + group { + name: "all_apps"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + visible: 0; + } + } + + part { + name: "index_bg"; + type: RECT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.0 20/1210; to, "bg";} // 1280 - 70(indicator) + rel2 { relative: 1.0 124/1210; to, "bg";} // 174 - 70 + color: 0 0 0 255; + visible: 0; + } + } + part { + name: "index"; + type: SWALLOW; + mouse_events: 0; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 0.2 0.0; to, "index_bg";} + rel2 { relative: 0.8 1.0; to, "index_bg";} + visible: 1; + } + } + part { + name: "button_edit"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 16/720 8/70; to, "index_bg";} + rel2 { relative: 144/720 62/70; to, "index_bg";} + fixed: 1 1; + visible: 1; + } + } + part { + name: "content_bg"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 134/1210; to, "bg"; } // 154 - 70 + rel2 { relative: 1.0 1164/1210; to, "bg"; } + color: 34 34 34 255; + visible: 0; + } + } + + part { + name: "content"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.0; + rel1 { relative: 0.0 0.0; to, "content_bg";} + rel2 { relative: 1.0 1.0; to, "content_bg";} + visible: 1; + } + } + + part { + name: "content,blocker"; + type: RECT; + 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";} + color: 0 0 0 0; + visible: 0; + } + description { + state: "block" 0.0; + inherit: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + } + } + + programs { + program { + name: "block,content"; + signal: "block"; + source: "layout"; + action: STATE_SET "block" 0.0; + target: "content,blocker"; + } + program { + name: "unblock,content"; + signal: "unblock"; + source: "layout"; + action: STATE_SET "default" 0.0; + target: "content,blocker"; + } + } + } // group +} // collections + + + +// End of file diff --git a/data/edje/button_edit.edc b/data/edje/button_edit.edc new file mode 100644 index 0000000..982220c --- /dev/null +++ b/data/edje/button_edit.edc @@ -0,0 +1,294 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#define BUTTON_EDIT_BG_SIZE 98 56 +#define BUTTON_EDIT_IMAGE_SIZE 35 35 + + + +images { + image: "../images/btn_edit_nor.9.png" COMP; + image: "../images/btn_edit_press.9.png" COMP; + image: "../images/icon_btn_edit_press.png" COMP; + image: "../images/icon_btn_edit_nor.png" COMP; + image: "../images/icon_btn_done_press.png" COMP; + image: "../images/icon_btn_done_nor.png" COMP; +} + + + +collections { + group { + name: "button_edit"; + parts { + part { + name: "edit_button"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + visible: 0; + } + description { + state: "enable" 0.0; + inherit: "default" 0.0; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "edit_button_bg"; + type: IMAGE; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.5 0.5; to, "edit_button"; } + rel2 { relative: 0.5 0.5; to, "edit_button"; } + min: BUTTON_EDIT_BG_SIZE; + max: BUTTON_EDIT_BG_SIZE; + fixed: 1 1; + image { + normal: "../images/btn_edit_nor.9.png"; + border: 30 30 0 0; + middle: DEFAULT; + border_scale: 1; + } + color: 255 255 255 255; + visible: 1; + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + } + description { + state: "enable" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + image { + normal: "../images/btn_edit_press.9.png"; + } + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "edit_button_image"; + type: IMAGE; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1 { relative: 0.5 0.5; to, "edit_button_bg";} + rel2 { relative: 0.5 0.5; to, "edit_button_bg";} + image { + normal: "../images/icon_btn_edit_nor.png"; + } + min: BUTTON_EDIT_IMAGE_SIZE; + max: BUTTON_EDIT_IMAGE_SIZE; + fixed: 1 1; + visible: 1; + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + image { + normal: "../images/icon_btn_done_nor.png"; + } + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + image { + normal: "../images/icon_btn_edit_press.png"; + } + } + description { + state: "edit_press" 0.0; + inherit: "default" 0.0; + image { + normal: "../images/icon_btn_done_press.png"; + } + } + } + part { + name: "edit_button_event"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: -0.1 -0.1; to: "edit_button_bg"; } + rel2 { relative: 1.1 1.1; to: "edit_button_bg"; } + color: 0 0 0 0; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "focus"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to: "edit_button_event"; } + rel2 { relative: 1.0 1.0; to: "edit_button_event"; } + fixed: 1 1; + visible: 1; + } + } + part { + name: "state_edit"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 0; + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + } + } + } + + programs { + program { + name: "edit_button,down"; + signal: "mouse,down,1"; + source: "edit_button_event"; + action: STATE_SET "press" 0.0; + target: "edit_button_bg"; + after: "press_state"; + } + program { + name: "press_state"; + script { + new st[31]; + new Float:vl; + get_state(PART:"state_edit", st, 30, vl); + if (!strcmp(st, "default")) + { + set_state(PART:"edit_button_image", "press", 0.0); + } + else + { + set_state(PART:"edit_button_image", "edit_press", 0.0); + } + } + after: "edit_button,down,after"; + } + program { + name: "edit_button,down,after"; + action: SIGNAL_EMIT "edit_button,down" "menu"; + } + + program { + name: "edit_button,up"; + signal: "mouse,up,1"; + source: "edit_button_event"; + action: STATE_SET "default" 0.0; + target: "edit_button_bg"; + after: "edit_button,up,after"; + } + program { // Edit or unedit in C codes. + name: "edit_button,up,after"; + action: SIGNAL_EMIT "edit_button,up" "menu"; + } + program { // This program is called from C. + name: "release_state"; + signal: "edit_button,release"; + source: "menu"; + script { + new st[31]; + new Float:vl; + get_state(PART:"state_edit", st, 30, vl); + if (!strcmp(st, "default")) // Normal mode + { + set_state(PART:"edit_button_image", "default", 0.0); + } + else // Edit mode + { + set_state(PART:"edit_button_image", "edit", 0.0); + } + } + } + + program { // Edit mode + name: "edit_button_state,edit"; + signal: "edit_button_state,edit"; + source: "menu"; + action: STATE_SET "edit" 0.0; + target: "state_edit"; + target: "edit_button_bg"; + target: "edit_button_image"; + } + program { // Normal mode + name: "edit_button_state,unedit"; + signal: "edit_button_state,unedit"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "state_edit"; + target: "edit_button_bg"; + target: "edit_button_image"; + } + + program { + name: "edit_button,show"; + signal: "edit_button,show"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "edit_button_bg"; + target: "edit_button_image"; + target: "edit_button_event"; + } + program { + name: "edit_button,hide"; + signal: "edit_button,hide"; + source: "menu"; + action: STATE_SET "hide" 0.0; + target: "edit_button_bg"; + target: "edit_button_image"; + target: "edit_button_event"; + } + } + } +} + + +// End of file diff --git a/data/edje/conf.edc b/data/edje/conf.edc new file mode 120000 index 0000000..de97229 --- /dev/null +++ b/data/edje/conf.edc @@ -0,0 +1 @@ +../../include/conf.h \ No newline at end of file diff --git a/data/edje/group_4x4_portrait.edc b/data/edje/group_4x4_portrait.edc new file mode 100644 index 0000000..de78a2a --- /dev/null +++ b/data/edje/group_4x4_portrait.edc @@ -0,0 +1,219 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#define MENU(part_name, p_relx, p_rely, relx, rely, n_relx, n_rely) \ + part { \ + name: "menu_swallow_"part_name; \ + type: SWALLOW; \ + scale: 1; \ + mouse_events: 1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + fixed: 1 1; \ + rel1 { relative: (relx) (rely); to, "bg"; } \ + rel2 { relative: (relx) (rely); to, "bg"; } \ + } \ + description { \ + state: "prev" 0.0; \ + inherit: "default" 0.0; \ + rel1.relative: (p_relx) (p_rely); \ + rel2.relative: (p_relx) (p_rely); \ + } \ + description { \ + state: "next" 0.0; \ + inherit: "default" 0.0; \ + rel1.relative: (n_relx) (n_rely); \ + rel2.relative: (n_relx) (n_rely); \ + } \ + description { \ + state: "invisible" 0.0; \ + inherit: "default" 0.0; \ + visible: 0; \ + rel1.relative: (n_relx) (n_rely); \ + rel2.relative: (n_relx) (n_rely); \ + } \ + } \ + +#define MENU_PROGRAM(part_name) \ + program { \ + name: "menu_"part_name"_prev"; \ + signal: "move,prev"; \ + source: "menu"part_name; \ + action: STATE_SET "prev" 0.0; \ + target: "menu_swallow_"part_name; \ + } \ + program { \ + name: "menu_"part_name"_next"; \ + signal: "move,next"; \ + source: "menu"part_name; \ + action: STATE_SET "next" 0.0; \ + target: "menu_swallow_"part_name; \ + } \ + program { \ + name: "menu_"part_name"_ani"; \ + signal: "ani,return"; \ + source: "menu"part_name; \ + action: STATE_SET "default" 0.0; \ + target: "menu_swallow_"part_name; \ + transition: DECELERATE 0.4; \ + } \ + program { \ + name: "menu_"part_name"_invisible"; \ + signal: "invisible"; \ + source: "menu"part_name; \ + action: STATE_SET "invisible" 0.0; \ + target: "menu_swallow_"part_name; \ + } + +#define ITEM_00_X (1.0/8.0) +#define ITEM_00_Y (1.0/8.0) +#define ITEM_01_X (3.0/8.0) +#define ITEM_01_Y ITEM_00_Y +#define ITEM_02_X (5.0/8.0) +#define ITEM_02_Y ITEM_00_Y +#define ITEM_03_X (7.0/8.0) +#define ITEM_03_Y ITEM_00_Y + +#define ITEM_04_X ITEM_00_X +#define ITEM_04_Y (3.0/8.0) +#define ITEM_05_X ITEM_01_X +#define ITEM_05_Y ITEM_04_Y +#define ITEM_06_X ITEM_02_X +#define ITEM_06_Y ITEM_04_Y +#define ITEM_07_X ITEM_03_X +#define ITEM_07_Y ITEM_04_Y + +#define ITEM_08_X ITEM_00_X +#define ITEM_08_Y (5.0/8.0) +#define ITEM_09_X ITEM_01_X +#define ITEM_09_Y ITEM_08_Y +#define ITEM_10_X ITEM_02_X +#define ITEM_10_Y ITEM_08_Y +#define ITEM_11_X ITEM_03_X +#define ITEM_11_Y ITEM_08_Y + +#define ITEM_12_X ITEM_00_X +#define ITEM_12_Y (7.0/8.0) +#define ITEM_13_X ITEM_01_X +#define ITEM_13_Y ITEM_12_Y +#define ITEM_14_X ITEM_02_X +#define ITEM_14_Y ITEM_12_Y +#define ITEM_15_X ITEM_03_X +#define ITEM_15_Y ITEM_12_Y + +collections { + group { + name: "menu_bg"; + parts { + part { + name: "bg"; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + } + } + + MENU("0", ITEM_00_X, ITEM_00_Y, ITEM_00_X, ITEM_00_Y, ITEM_01_X, ITEM_01_Y) + MENU("1", ITEM_00_X, ITEM_00_Y, ITEM_01_X, ITEM_01_Y, ITEM_02_X, ITEM_02_Y) + MENU("2", ITEM_01_X, ITEM_01_Y, ITEM_02_X, ITEM_02_Y, ITEM_03_X, ITEM_03_Y) + MENU("3", ITEM_02_X, ITEM_02_Y, ITEM_03_X, ITEM_03_Y, ITEM_04_X, ITEM_04_Y) + MENU("4", ITEM_03_X, ITEM_03_Y, ITEM_04_X, ITEM_04_Y, ITEM_05_X, ITEM_05_Y) + MENU("5", ITEM_04_X, ITEM_04_Y, ITEM_05_X, ITEM_05_Y, ITEM_06_X, ITEM_06_Y) + MENU("6", ITEM_05_X, ITEM_05_Y, ITEM_06_X, ITEM_06_Y, ITEM_07_X, ITEM_07_Y) + MENU("7", ITEM_06_X, ITEM_06_Y, ITEM_07_X, ITEM_07_Y, ITEM_08_X, ITEM_08_Y) + MENU("8", ITEM_07_X, ITEM_07_Y, ITEM_08_X, ITEM_08_Y, ITEM_09_X, ITEM_09_Y) + MENU("9", ITEM_08_X, ITEM_08_Y, ITEM_09_X, ITEM_09_Y, ITEM_10_X, ITEM_10_Y) + MENU("10", ITEM_09_X, ITEM_09_Y, ITEM_10_X, ITEM_10_Y, ITEM_11_X, ITEM_11_Y) + MENU("11", ITEM_10_X, ITEM_10_Y, ITEM_11_X, ITEM_11_Y, ITEM_12_X, ITEM_12_Y) + MENU("12", ITEM_11_X, ITEM_11_Y, ITEM_12_X, ITEM_12_Y, ITEM_13_X, ITEM_13_Y) + MENU("13", ITEM_12_X, ITEM_12_Y, ITEM_13_X, ITEM_13_Y, ITEM_14_X, ITEM_14_Y) + MENU("14", ITEM_13_X, ITEM_13_Y, ITEM_14_X, ITEM_14_Y, ITEM_15_X, ITEM_15_Y) + MENU("15", ITEM_14_X, ITEM_14_Y, ITEM_15_X, ITEM_15_Y, ITEM_15_X, ITEM_15_Y) + + part { + name: "dim"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 0.0 0.0; to, "bg"; } + rel2 { relative: 1.0 1.0; to, "bg"; } + } + description { + state: "edit" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 0 0 0 102; + } + } + } + + programs { + MENU_PROGRAM("0") + MENU_PROGRAM("1") + MENU_PROGRAM("2") + MENU_PROGRAM("3") + MENU_PROGRAM("4") + MENU_PROGRAM("5") + MENU_PROGRAM("6") + MENU_PROGRAM("7") + MENU_PROGRAM("8") + MENU_PROGRAM("9") + MENU_PROGRAM("10") + MENU_PROGRAM("11") + MENU_PROGRAM("12") + MENU_PROGRAM("13") + MENU_PROGRAM("14") + MENU_PROGRAM("15") + + program { + name: "dim,on"; + signal: "dim,on"; + source: "menu"; + action: STATE_SET "edit" 0.0; + target: "dim"; + } + program { + name: "dim,off"; + signal: "dim,off"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "dim"; + } + + program { + name: "dim,down"; + signal: "mouse,down,1"; + source: "dim"; + action: SIGNAL_EMIT "dim,down" "menu"; + } + program { + name: "dim,up"; + signal: "mouse,up,1"; + source: "dim"; + action: SIGNAL_EMIT "dim,up" "menu"; + } + } + } // group +} // collections diff --git a/data/edje/index.edc b/data/edje/index.edc new file mode 100644 index 0000000..a5f2336 --- /dev/null +++ b/data/edje/index.edc @@ -0,0 +1,179 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define INDEX_PAGECONTROL_IND_INC 35 35 +#define INDEX_PAGECONTROL_IND_MIN_INC 35 35 +#define INDEX_PAGECONTROL_FONT_COLOR_INC 255 255 255 +#define INDEX_PAGECONTROL_FONT_SIZE_INC 18 + +collections { + group { + name: "elm/index/base/vertical/menuscreen/index"; + alias: "elm/index/base/horizontal/menuscreen/index"; + parts { + part { name: "clip"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + } + description { state: "active" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + part { name: "elm.swallow.index.0"; + type: SWALLOW; + scale: 1; + mouse_events: 0; + clip_to: "clip"; + description { + state: "default" 0.0; + align: 0.5 0.5; + rel1.relative: 0 0; + rel2.relative: 1 1; + } + } + part { name: "elm.swallow.event.0"; + type: SWALLOW; + mouse_events: 0; + repeat_events: 0; + description { state: "default" 0.0; + align: 0.5 0.5; + } + } + } + programs { + program { name: "active"; + signal: "elm,state,active"; + source: "elm"; + action: STATE_SET "active" 0.0; + transition: DECELERATE 0.5; + target: "clip"; + } + program { name: "inactive"; + signal: "elm,state,inactive"; + source: "elm"; + action: STATE_SET "default" 0.0; + transition: DECELERATE 0.5; + target: "clip"; + } + } + } + group { + name: "elm/index/item/vertical/menuscreen/index"; + alias: "elm/index/item_odd/vertical/menuscreen/index"; + alias: "elm/index/item/horizontal/menuscreen/index"; + alias: "elm/index/item_odd/horizontal/menuscreen/index"; + images { + image: "../images/page indicator.png" COMP; + image: "../images/page indicator_focus.png" COMP; + } + parts { + part { name:"bg"; + type : RECT; + scale: 1; + description { state: "default" 0.0; + min: INDEX_PAGECONTROL_IND_INC; + max: INDEX_PAGECONTROL_IND_INC; + visible: 0; + align: 0.5 0.5; + } + } + part { name: "indicator1"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + align: 0.5 0.5; + fixed: 1 1; + rel1.to: "bg"; + rel2.to: "bg"; + image { + normal: "../images/page indicator.png"; + } + } + description { state: "active" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "indicator2"; + type: IMAGE; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + align: 0.5 0.5; + fixed: 1 1; + min: INDEX_PAGECONTROL_IND_MIN_INC; + max: INDEX_PAGECONTROL_IND_MIN_INC; + image.normal: "../images/page indicator_focus.png"; + visible: 0; + } + description { state: "active" 0.0; + inherit: "default" 0.0; + min: INDEX_PAGECONTROL_IND_INC; + max: INDEX_PAGECONTROL_IND_INC; + visible: 1; + } + } + part { name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { state: "default" 0.0; + fixed: 1 1; + color: INDEX_PAGECONTROL_FONT_COLOR_INC 0; + align: 0.5 0.5; + text { + font: "TIZEN:style=Bold"; + size: INDEX_PAGECONTROL_FONT_SIZE_INC; + min: 0 1; + //FIXME:values should be 0.5 0.5 when fonts are aligned correctly. + align: 0.53 0.56; + } + rel1 { to: "indicator2"; } + rel2 { to: "indicator2"; } + } + description { state: "active" 0.0; + inherit: "default" 0.0; + color: INDEX_PAGECONTROL_FONT_COLOR_INC 255; + } + } + } + programs { + program { name: "active"; + signal: "elm,state,active"; + source: "elm"; + action: STATE_SET "active" 0.0; + target: "indicator1"; + target: "indicator2"; + target: "elm.text"; + transition: LINEAR 0.2; + } + program { name: "inactive"; + signal: "elm,state,inactive"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "indicator1"; + target: "indicator2"; + target: "elm.text"; + transition: LINEAR 0.2; + } + } + } +} diff --git a/data/edje/item_4x4.edc b/data/edje/item_4x4.edc new file mode 100644 index 0000000..6d9716b --- /dev/null +++ b/data/edje/item_4x4.edc @@ -0,0 +1,345 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include "conf.edc" + + + +styles { + style { + name: "app_name_style"; + base: "font=TIZEN:style=MEDIUM font_size=27 align=center valign=top color=#FFFFFF style=soft_shadow shadow_color=#00000060 ellipsis=1"; + + tag: "br" "\n"; + } +} + +images { + image: "../images/RM06_App tray_Btn_Uninstall.png" COMP; + image: "../images/RM06_App tray_Btn_Uninstall_press.png" COMP; + image: "../images/menu_badge_01.png" COMP; +} + + + +collections { + group { + name: "icon"; + + parts { + part { + name: "bg"; + type: SWALLOW; + mouse_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + fixed: 1 1; + visible: 0; + } + } + part { + name: "icon_image"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.5 60/ITEM_HEIGHT; to: "bg"; } + rel2 { relative: 0.5 60/ITEM_HEIGHT; to: "bg"; } + align: 0.5 0.5; + min: 117 117; + fixed: 1 1; + } + } + part { + name: "icon_image_event"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + /* Enlarge the starting point of Y for tester's request */ + rel1 { relative: 0.0 0.0; to, "bg"; } //0.0 -0.1 + rel2 { relative: 1.0 1.0; to, "bg"; } + color: 0 0 0 0; + visible: 1; + } + } + part { + name: "badge"; + type: IMAGE; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 110/ITEM_WIDTH 0.0; to, "bg"; } + rel2 { relative: 170/ITEM_WIDTH 60/ITEM_HEIGHT; to, "bg"; } + image { + normal: "../images/menu_badge_01.png"; + } + } + description { + state: "badge" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { + name: "badge,txt"; + type: TEXT; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 0.1 0.1; to, "badge"; } + rel2 { relative: 0.9 0.9; to, "badge"; } + align: 0.5 0.5; + color: 255 255 255 255; + color2: 0 0 0 35; + color3: 0 0 0 35; + text { + text_class: "tizen"; + font: "TIZEN:style=medium"; + size: 12; + text: "1"; + align: 0.5 0.5; + fit: 1 1; + } + } + description { + state: "badge" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "block_event"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 0.0 0.0; to, "bg"; } + rel2 { relative: 1.0 1.0; to, "bg"; } + color: 0 0 0 0; + } + description { + state: "edit,release" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "uninstall"; + type: IMAGE; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 40/ITEM_WIDTH 30/ITEM_HEIGHT; to, "bg"; } + rel2 { relative: 40/ITEM_WIDTH 30/ITEM_HEIGHT; to, "bg"; } + image { + normal: "../images/RM06_App tray_Btn_Uninstall.png"; + } + min: 54 54; + fixed: 1 1; + visible: 0; + } + description { + state: "edit,release" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "edit,press" 0.0; + inherit: "default" 0.0; + image { + normal: "../images/RM06_App tray_Btn_Uninstall_press.png"; + } + visible: 1; + } + } + part { + name: "txt"; + type: TEXT; + effect: SOFT_SHADOW; + scale: 1; + mouse_events: 1; + description + { + state: "default" 0.0; + rel1 { relative: 0.0 1.0; to_x, "bg"; to_y, "icon_image"; offset: 0 7; } + rel2 { relative: 1.0 1.0; to, "bg"; } + align: 0.5 0.0; + color: 255 255 255 255; + color2: 0 0 0 35; + color3: 0 0 0 35; + text { + text_class: "tizen"; + font: "TIZEN:style=medium"; + size: 16; + align: 0.5 0.1; + } + } + description + { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + color: 0 0 0 0; + } + } + part { + name: "focus"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + /* Enlarge the starting point of Y for tester's request */ + rel1 { relative: 0.0 -0.1; to, "bg"; } + rel2 { relative: 1.0 1.0; to, "bg"; } + fixed: 1 1; + visible: 1; + } + } + part { + name: "uninstall_event"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: -0.2 -0.2; to, "uninstall"; } + rel2 { relative: 1.1 1.1; to, "uninstall"; } + color: 0 0 0 0; + visible: 0; + } + description { + state: "edit,release" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "uninstall_focus"; + type: SWALLOW; + scale: 1; + mouse_events: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; to, "uninstall_event"; } + rel2 { relative: 1.0 1.0; to, "uninstall_event"; } + visible: 0; + } + description { + state: "edit,release" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + + programs { + program { + name: "item,down"; + signal: "mouse,down,1"; + source: "icon_image_event"; + action: SIGNAL_EMIT "item,down" "menu"; + } + program { + name: "item,up"; + signal: "mouse,up,1"; + source: "icon_image_event"; + action: SIGNAL_EMIT "item,up" "menu"; + } + + // Badge + program { + name: "badge,on"; + signal: "badge,on"; + source: "menu"; + action: STATE_SET "badge" 0.0; + target: "badge"; + target: "badge,txt"; + } + program { + name: "badge,off"; + signal: "badge,off"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "badge"; + target: "badge,txt"; + } + + program { + name: "uninstall,on"; + signal: "uninstall,on"; + source: "menu"; + action: STATE_SET "edit,release" 0.0; + target: "block_event"; + target: "uninstall"; + target: "uninstall_event"; + target: "uninstall_focus"; + } + program { + name: "uninstall,off"; + signal: "uninstall,off"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "block_event"; + target: "uninstall"; + target: "uninstall_event"; + target: "uninstall_focus"; + } + program { + name: "uninstall,down"; + signal: "mouse,down,*"; + source: "uninstall_event"; + action: SIGNAL_EMIT "uninstall,down" "menu"; + after: "uninstall,down,after"; + } + program { + name: "uninstall,down,after"; + action: STATE_SET "edit,press" 0.0; + target: "uninstall"; + } + program { + name: "uninstall,up"; + signal: "mouse,up,*"; + source: "uninstall_event"; + action: SIGNAL_EMIT "uninstall,up" "menu"; + after: "uninstall,up,after"; + } + program { + name: "uninstall,up,after"; + action: STATE_SET "edit,release" 0.0; + target: "uninstall"; + } + } + } // group +} // collections diff --git a/data/edje/layout_portrait.edc b/data/edje/layout_portrait.edc new file mode 100644 index 0000000..50c40e2 --- /dev/null +++ b/data/edje/layout_portrait.edc @@ -0,0 +1,90 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +collections { + group { + name: "layout"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: 0 0 0 0; + visible: 0; + } + } + 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";} + visible: 1; + } + } + part { + name: "content,blocker"; + type: RECT; + scale: 1; + mouse_events: 1; + repeat_events: 0; + description { + state: "default" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + color: 0 0 0 0; + visible: 0; + } + description { + state: "block" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + + programs { + program { + name: "block,content"; + signal: "block"; + source: "layout"; + action: STATE_SET "block" 0.0; + target: "content,blocker"; + } + program { + name: "unblock,content"; + signal: "unblock"; + source: "layout"; + action: STATE_SET "default" 0.0; + target: "content,blocker"; + } + } + } // group +} // collections + + + +// End of file diff --git a/data/images/CMakeLists.txt b/data/images/CMakeLists.txt new file mode 100644 index 0000000..cb60ac7 --- /dev/null +++ b/data/images/CMakeLists.txt @@ -0,0 +1 @@ +INSTALL(FILES default.png DESTINATION ${IMAGEDIR}) diff --git a/data/images/RM06_App tray_Btn_Uninstall.png b/data/images/RM06_App tray_Btn_Uninstall.png new file mode 100644 index 0000000000000000000000000000000000000000..7145638a5f44c73aa14a628de3bd38e3d8ddd639 GIT binary patch literal 6062 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 WM<)VQ^V*UC0000c(O literal 0 HcmV?d00001 diff --git a/data/images/RM06_App_tray_setting_press.png b/data/images/RM06_App_tray_setting_press.png new file mode 100644 index 0000000000000000000000000000000000000000..38589452b10dbc74e28bf0966d70bb16d0b04902 GIT binary patch literal 3331 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 N002ovPDHLkV1iQ`Ktlik literal 0 HcmV?d00001 diff --git a/data/images/btn_edit_nor.9.png b/data/images/btn_edit_nor.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb7440890f476a5d8449d826e6dfc32f60c68b3 GIT binary patch literal 6025 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 DRRFHd literal 0 HcmV?d00001 diff --git a/data/images/btn_edit_press.9.png b/data/images/btn_edit_press.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8619ff3cad9200043031203e8902d12364b48ae8 GIT binary patch literal 6603 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 Z4gkKT&JQGniW>j`002ovPDHLkV1ndu)l2{Y literal 0 HcmV?d00001 diff --git a/data/images/icon_btn_edit_nor.png b/data/images/icon_btn_edit_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..f79ea9250caf0c5108cf7053b777e7e0e43b079e GIT binary patch literal 1468 zcmeAS@N?(olHy`uVBq!ia0vp^${@_a1|;QfZjJ;}k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDi`X>M-r=;Y$&Xk=n(Xy|HWY3SzYW@zf-;^yXN z>1JpE)9aF-T$-DjR|3-)y{k_+Y+zn(Lh=K<@U2KEi?7Z_GX z1T?PlQcAUUa2S9eB!4kHFoYko=eh#t_NAK+!^vPV*BCyldmjJzAHb|;J^|N zg~QBKOoGg(HJ9xO(n;3z!*Lxp)=lsqez#=27#`SagajFuk3v z&m($M%V6K6CvpZX76QqP2?q`=T&~!7U5@|K}nvxw)_)B8>tuhLmrW?=ql!Lu_O)3}UN8=tEy zE>XW=U0ada`1ibe=^2N0pHFO4XODGy_*tRh=Jy$uleHOceSdqaE7ITXp2Mbl)m}G6 zH_aE3NS>Fuan-V@d@T+)bH>bqBSNe7&HGJQ6~qlSg=e6!?Mc9gz0JiyU(qUcSqCG&;Q{pW22x3kKA(YT*p7puOZ jdV9pS#dSM>i6t-u8}4_nK2kdcRGxae`njxgN@xNAD-0U? literal 0 HcmV?d00001 diff --git a/data/images/icon_btn_edit_press.png b/data/images/icon_btn_edit_press.png new file mode 100644 index 0000000000000000000000000000000000000000..aaaa7fab503bd3ac7b7207e6decb693912ba771d GIT binary patch literal 1375 zcmeAS@N?(olHy`uVBq!ia0vp^${@_a1|;QfZjJ;}k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDkcXl!6)>}F!*Xk=n(Xy|HWVP@{^Xlm@_=;-WZ zY3k|%)9aF-T$-DjR|3Q!gkfv4~Pj*wm=R%;iu*SQ+p9GSx@wJJIlbpc-hm%F{I+w zo(S%V%?1Kz7cy{KvU@yGxxy$kp`kUnfkmZ&uZg)}g4K!Eb7^Wzf9_E^F#G1qDS2k= zXa8kgHYI7nl_)FS)zfC~`~BtH{nlxA3%)CM2wgYIn)pig(B_LJ7bb6+H{a1s!+u%w zJBbTZ!zUZIM76ueaJ>8aHA&>ynx&~vZ)~Y)7ttz{-!|jW+>}KfvcYRpm!1!@c{yXA zp;1it0$=fL$6_JD*%u!DINX2TkV#Xrd5MxbcTSJm*4IqVzjr+gP-y3=-d%Tg#gWxc z=S}8Ko6s~bRmX{Q>8-fc0VV1SmOVPbe_o#R+xD30zb;tqF=lw((kW@Oc*24w^VZ3~ z&fU5?@Yk%nUWSUsyEnP)`nOT`58JO(ackv>*Nar`G<0@wfeURUT2vE)&z= z>@rY0!o2+K&O>TPGrn%s-oVgQ>@j0{ZYJaH%_o;xE=@@na$5E0j7D&P&&(77C+)?r zTf9_CTHAl!S*NSnwnI5$HjmS#bq7>G_w2lK^Y~p=A*r`lo~4|TnCCAsBf#lWg~ZNF zah@Hmw-}8!FH5*`Y2m5zn9u|#Q45Q^&KwrrOWrAzzx~?Nz29Y4%#zph-PFF+9h+Kv r$obcl@5bNUY;(50000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU%C`m*?RCwCVSX)dSWfVR$yUXs*vKJOA zphb~#FBI8U2@yqN)0kK__@Fi#A1XfhqDd1IpEUa9Q@uRsL$UFp5Bgx6*7#y*Dr!T# z0CEvpZe6*SOZUp|>}7VwbC!R|umM??W#gZGVdkHmbG|wM`Okko0RBgV+phtC_nZ5A z-`;g0V>0x60r4Q>VT1)?LYNUEB7z7Z?jU9nVI-?$n+%V508w94>ZtGPs6X0X>2%q- zs8itMc0mV@Z~}Z`+2HppMo;gQXQ2DW*x$F8d}H_yVF5|W`z1rqix3T`8p|I4;Q3?E z)tZ8j$srFYQ4Byl3W}TnAn-ci5MVF@XS4usal);L_4g024S)aR$lOh|F^X7Aja0g1 zC>o7LR#V%hx1R1iZt=H+e@QQkL3A#q5lcPrW-EFtmHI>W-q*goeq}8f`4yjxXrq)4 z8T>?Wxylcd(&y+^fAfJAi}|sbu&a zB2v>(R`}%QuH*08J-5r`z-nehXyAMFKG`9AWS8tC34XV&P4~rCbKZ-6@11<7*gsJ% zhrIxbl7%9|0WTE5vb}nu_2Zt;f@174&MqSq?Q&>|7!WPj&OOsr6?Z>MiHaGTwW6jZ zVqoRsg>5azO_y#?PT|xXLf(!Hg{|_H)~eH8b^PnHcY#YQQTN0~0Y!?!VTZYVHfow3 zo%hV+tVfNGcHJl{wdYP&KP&r}_>6NTog6~@^50=n1SP5W)Yo-Z=>jK*-cb*;vvQ0<8=Dm za6v!hkNl<-I%aXR;=fwO@4fzWT-W?@%}0#V1r-R+#ja)74F8 zrY0+?@j^ve^3e;&I;-*mE>aAeijq!wiWn^g9VM!wL?tj8vkkm|b@&P@N+R(OVv-d( zaXa0#o1!F9Z)Z`eAabaCY-ihRkG545JVILA!p95DI2F>(Tnpv=~tV;`W_tQAJY!${CvJX5Wm8YKgZ z6p_eh%V=Va8P7;btZvYDU1tO$tlaOK{h9oKM#l&kw2hIbk|&sRiCw2%6aE!o0CWl| U9b!e3T>t<807*qoM6N<$f~Z@#n*aa+ literal 0 HcmV?d00001 diff --git a/data/images/page indicator.png b/data/images/page indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..28081e7b1d23685ab1db57b790a9b87dc26f6e9f GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^3=*07`vZ__4DbnY{r~?zkXc+>JWxp8bQUAf z1zIIRe!&b3awm=X+ih-K`YF-7i}RieTbFkTbIZex$F|p*t@w7hV*Zw^x21Iz*Lm=S z7;FRTTHxv87*Y{;_40MD!v;KU7pv0DU;2EXSM{G=M^_@nTcK*^`(F*lb^UEKxH4x) zu63G{asSZvYuWRBma%h8{W?SOs#L);r6ZyO(|1qVqmVm!g5-r~hME$S^bKw@hPR!Z zrt0nUO(!z3D5dk@l8GlH?Ov$ZzjLn0e0cfqN9HT79c?`iXLZb8JlSZXL3!B>Rav#U p<^P#$|E4^Xef8#c*^5a$8~88naoFV&+5-xI22WQ%mvv4FO#q@YuQC7t literal 0 HcmV?d00001 diff --git a/data/images/page indicator_focus.png b/data/images/page indicator_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..42beee6e463acb06c956f2e9c6b24463f107d220 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAH3s;Exc>kDpP_XL4N>P324n=W z3nBt$&leQ@1ayp6NswPK!yiT6X+l4F9*WLsTzcu%Jp;4n-_Ex%tJFzzPL|L*^F+eZ zY`(PmjTT-0D}SQ-fx5aqT^vIy;z}=G=R2&x(-tVKu=(Y^>i++K@g1ocsU) literal 0 HcmV?d00001 diff --git a/data/menu-screen-env.sh b/data/menu-screen-env.sh new file mode 100755 index 0000000..284a0ba --- /dev/null +++ b/data/menu-screen-env.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +export LAUNCHER_ENGINE=gl +export LAUNCHER_FPS=6000 + +# End of a file diff --git a/data/org.tizen.menu-screen.desktop.in b/data/org.tizen.menu-screen.desktop.in new file mode 100644 index 0000000..a762e53 --- /dev/null +++ b/data/org.tizen.menu-screen.desktop.in @@ -0,0 +1,7 @@ +Name=Simple Menu Screen +Type=Application +Exec=@EXEC_PREFIX@/@PROJECT_NAME@ +Icon=@PACKAGE_NAME@.png +NoDisplay=True +X-Tizen-TaskManage=False +X-Tizen-Removable=False diff --git a/data/org.tizen.menu-screen.xml.in b/data/org.tizen.menu-screen.xml.in new file mode 100755 index 0000000..a814e39 --- /dev/null +++ b/data/org.tizen.menu-screen.xml.in @@ -0,0 +1,11 @@ + + + + Jin Yoon + Youngjoo Park + Simple Menu-screen Application + + + + + diff --git a/data/po/CMakeLists.txt b/data/po/CMakeLists.txt new file mode 100644 index 0000000..794280d --- /dev/null +++ b/data/po/CMakeLists.txt @@ -0,0 +1,79 @@ +# for i18n + +SET(POFILES + ar.po + az.po + bg.po + ca.po + cs.po + da.po + de_DE.po + el_GR.po + en.po + en_PH.po + en_US.po + es_ES.po + es_MX.po + et.po + eu.po + fa.po + fi.po + fr_CA.po + fr_FR.po + ga.po + gl.po + hi.po + hr.po + hu.po + hy.po + is.po + it_IT.po + ja_JP.po + ka.po + kk.po + ko_KR.po + lt.po + lv.po + mk.po + nb.po + nl_NL.po + pl.po + pt_BR.po + pt_PT.po + ro.po + ru_RU.po + sk.po + sl.po + sr.po + sv.po + 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") + +MESSAGE(STATUS "po files ---") +FOREACH(pofile ${POFILES}) + SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile}) + MESSAGE(STATUS " ${pofile}") + GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE) + GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE) + SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) + ADD_CUSTOM_COMMAND( + OUTPUT ${moFile} + COMMAND ${MSGFMT} -o ${moFile} ${absPofile} + DEPENDS ${absPofile} + ) + INSTALL(FILES ${moFile} + DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo) + SET(moFiles ${moFiles} ${moFile}) +ENDFOREACH(pofile) + +ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles}) diff --git a/data/po/ar.po b/data/po/ar.po new file mode 100644 index 0000000..31821ad --- /dev/null +++ b/data/po/ar.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "تم" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "هل تريد إلغاء تثبيت %s؟" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "إلغاء التثبيت" \ No newline at end of file diff --git a/data/po/az.po b/data/po/az.po new file mode 100644 index 0000000..991ce16 --- /dev/null +++ b/data/po/az.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Tamam" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%s silinsin?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Quraşdırılma ləğv edilsin" \ No newline at end of file diff --git a/data/po/bg.po b/data/po/bg.po new file mode 100644 index 0000000..20cb7d5 --- /dev/null +++ b/data/po/bg.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Готово" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Деинсталиране на %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Деинсталиране" \ No newline at end of file diff --git a/data/po/ca.po b/data/po/ca.po new file mode 100644 index 0000000..a4bc2cb --- /dev/null +++ b/data/po/ca.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Realit" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Desinstal·lar %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Desinstal·lar" \ No newline at end of file diff --git a/data/po/cs.po b/data/po/cs.po new file mode 100644 index 0000000..71d1942 --- /dev/null +++ b/data/po/cs.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Hot." + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Odinstalovat %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Odinstalovat" \ No newline at end of file diff --git a/data/po/da.po b/data/po/da.po new file mode 100644 index 0000000..d99306a --- /dev/null +++ b/data/po/da.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Udført" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Afinstallér %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Afinstallér" \ No newline at end of file diff --git a/data/po/de_DE.po b/data/po/de_DE.po new file mode 100644 index 0000000..f5f4d32 --- /dev/null +++ b/data/po/de_DE.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Fertig" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%s deinstallieren?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Deinstallieren" \ No newline at end of file diff --git a/data/po/el_GR.po b/data/po/el_GR.po new file mode 100644 index 0000000..be489f7 --- /dev/null +++ b/data/po/el_GR.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Τέλος" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Κατάργηση της εγκατάστασης του %s;" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Κατάργηση εγκατάστασης" \ No newline at end of file diff --git a/data/po/en.po b/data/po/en.po new file mode 100644 index 0000000..9536899 --- /dev/null +++ b/data/po/en.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Done" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Uninstall %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Uninstall" \ No newline at end of file diff --git a/data/po/en_PH.po b/data/po/en_PH.po new file mode 100644 index 0000000..9536899 --- /dev/null +++ b/data/po/en_PH.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Done" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Uninstall %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Uninstall" \ No newline at end of file diff --git a/data/po/en_US.po b/data/po/en_US.po new file mode 100644 index 0000000..9536899 --- /dev/null +++ b/data/po/en_US.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Done" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Uninstall %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Uninstall" \ No newline at end of file diff --git a/data/po/es_ES.po b/data/po/es_ES.po new file mode 100644 index 0000000..02cc757 --- /dev/null +++ b/data/po/es_ES.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Finalizado" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "¿Desinstalar %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Desinstalar" \ No newline at end of file diff --git a/data/po/es_MX.po b/data/po/es_MX.po new file mode 100644 index 0000000..279a111 --- /dev/null +++ b/data/po/es_MX.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Realiz." + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "¿Desinstalar %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Desinstalar" \ No newline at end of file diff --git a/data/po/et.po b/data/po/et.po new file mode 100644 index 0000000..be64f0c --- /dev/null +++ b/data/po/et.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Valmis" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Kas desinstallida %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Deinstalli" \ No newline at end of file diff --git a/data/po/eu.po b/data/po/eu.po new file mode 100644 index 0000000..13b5795 --- /dev/null +++ b/data/po/eu.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Egina" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Desinstalatu %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Desinstalatu" \ No newline at end of file diff --git a/data/po/fa.po b/data/po/fa.po new file mode 100755 index 0000000..e77e4a2 --- /dev/null +++ b/data/po/fa.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "انجام شد" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "لغو نصب %s؟" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "لغو نصب" diff --git a/data/po/fi.po b/data/po/fi.po new file mode 100644 index 0000000..0802515 --- /dev/null +++ b/data/po/fi.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Valmis" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Poistetaanko kohteen %s asennus?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Poista asennus" \ No newline at end of file diff --git a/data/po/fr_CA.po b/data/po/fr_CA.po new file mode 100644 index 0000000..7977fd8 --- /dev/null +++ b/data/po/fr_CA.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "OK" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Désinstaller %s ?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Désinstaller" \ No newline at end of file diff --git a/data/po/fr_FR.po b/data/po/fr_FR.po new file mode 100644 index 0000000..7977fd8 --- /dev/null +++ b/data/po/fr_FR.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "OK" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Désinstaller %s ?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Désinstaller" \ No newline at end of file diff --git a/data/po/ga.po b/data/po/ga.po new file mode 100644 index 0000000..36117b4 --- /dev/null +++ b/data/po/ga.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Déanta" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Díshuiteáil %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Díshuiteáil" \ No newline at end of file diff --git a/data/po/gl.po b/data/po/gl.po new file mode 100644 index 0000000..5c99a7f --- /dev/null +++ b/data/po/gl.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Feito" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Desexas desinstalar %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Desinstalar" \ No newline at end of file diff --git a/data/po/hi.po b/data/po/hi.po new file mode 100644 index 0000000..78e0813 --- /dev/null +++ b/data/po/hi.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "पूरा हुआ" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%s की स्थापना रद्द करें?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "अस्थापित करें" \ No newline at end of file diff --git a/data/po/hr.po b/data/po/hr.po new file mode 100644 index 0000000..8a4cf42 --- /dev/null +++ b/data/po/hr.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Kraj" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Deinstalirati %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Deinstaliraj" \ No newline at end of file diff --git a/data/po/hu.po b/data/po/hu.po new file mode 100644 index 0000000..6140991 --- /dev/null +++ b/data/po/hu.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Kész" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Eltávolítja a(z) %s animált emotikont?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Eltávolítás" \ No newline at end of file diff --git a/data/po/hy.po b/data/po/hy.po new file mode 100644 index 0000000..ec74b44 --- /dev/null +++ b/data/po/hy.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Արված է" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Ապատեղադրե՞լ %s-ը:" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Ապատեղադրել" \ No newline at end of file diff --git a/data/po/is.po b/data/po/is.po new file mode 100644 index 0000000..0d5ee01 --- /dev/null +++ b/data/po/is.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Lokið" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Fjarlægja %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Fjarlægja" \ No newline at end of file diff --git a/data/po/it_IT.po b/data/po/it_IT.po new file mode 100644 index 0000000..81b02da --- /dev/null +++ b/data/po/it_IT.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Fatto" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Disinstallare %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Disinstalla" \ No newline at end of file diff --git a/data/po/ja_JP.po b/data/po/ja_JP.po new file mode 100644 index 0000000..bacd41c --- /dev/null +++ b/data/po/ja_JP.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "完了" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%sをアンインストールしますか?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "アンインストール" \ No newline at end of file diff --git a/data/po/ka.po b/data/po/ka.po new file mode 100644 index 0000000..31d2726 --- /dev/null +++ b/data/po/ka.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "შესრულდა" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "ამოინსტალირდეს %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "ინსტალაციის გაუქმება" \ No newline at end of file diff --git a/data/po/kk.po b/data/po/kk.po new file mode 100644 index 0000000..c1d9813 --- /dev/null +++ b/data/po/kk.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Дайын" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%s жою керек пе?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Жою" \ No newline at end of file diff --git a/data/po/ko_KR.po b/data/po/ko_KR.po new file mode 100644 index 0000000..606c7c2 --- /dev/null +++ b/data/po/ko_KR.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "완료" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%s을(를) 삭제할까요?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "삭제" \ No newline at end of file diff --git a/data/po/lt.po b/data/po/lt.po new file mode 100644 index 0000000..dd44366 --- /dev/null +++ b/data/po/lt.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Atlikta" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Pašalinti „%s“?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Pašalinti" \ No newline at end of file diff --git a/data/po/lv.po b/data/po/lv.po new file mode 100644 index 0000000..8160d6c --- /dev/null +++ b/data/po/lv.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Gatavs" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Vai atinstalēt %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Atinstalēt" \ No newline at end of file diff --git a/data/po/mk.po b/data/po/mk.po new file mode 100644 index 0000000..eb6aca3 --- /dev/null +++ b/data/po/mk.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Готово" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Да се деинсталира %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Деинсталирај" \ No newline at end of file diff --git a/data/po/nb.po b/data/po/nb.po new file mode 100644 index 0000000..e6961ca --- /dev/null +++ b/data/po/nb.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Utført" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Avinstallere %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Avinstaller" \ No newline at end of file diff --git a/data/po/nl_NL.po b/data/po/nl_NL.po new file mode 100644 index 0000000..f29bdb7 --- /dev/null +++ b/data/po/nl_NL.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Gereed" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%s verwijderen?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Verwijderen" \ No newline at end of file diff --git a/data/po/pl.po b/data/po/pl.po new file mode 100644 index 0000000..c971254 --- /dev/null +++ b/data/po/pl.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Gotowe" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Odinstalować %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Odinstaluj" \ No newline at end of file diff --git a/data/po/pt_BR.po b/data/po/pt_BR.po new file mode 100644 index 0000000..28b996a --- /dev/null +++ b/data/po/pt_BR.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Concluído" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Desinstalar %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Desinstalar" \ No newline at end of file diff --git a/data/po/pt_PT.po b/data/po/pt_PT.po new file mode 100644 index 0000000..8140980 --- /dev/null +++ b/data/po/pt_PT.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Concluir" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Desinstalar %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Desinstalar" \ No newline at end of file diff --git a/data/po/ro.po b/data/po/ro.po new file mode 100644 index 0000000..a93f226 --- /dev/null +++ b/data/po/ro.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Efectuat" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Dezinstalaţi %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Dezinstalare" \ No newline at end of file diff --git a/data/po/ru_RU.po b/data/po/ru_RU.po new file mode 100644 index 0000000..83768b3 --- /dev/null +++ b/data/po/ru_RU.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Готово" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Удалить %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Удалить" \ No newline at end of file diff --git a/data/po/sk.po b/data/po/sk.po new file mode 100644 index 0000000..bd962da --- /dev/null +++ b/data/po/sk.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Hotovo" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Odinštalovať program %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Odinštalovať" \ No newline at end of file diff --git a/data/po/sl.po b/data/po/sl.po new file mode 100644 index 0000000..4b5555e --- /dev/null +++ b/data/po/sl.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Končano" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Želite odstraniti %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Odstrani" \ No newline at end of file diff --git a/data/po/sr.po b/data/po/sr.po new file mode 100644 index 0000000..a9fb721 --- /dev/null +++ b/data/po/sr.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Gotovo" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Deinstalirati %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Deinstaliraj" \ No newline at end of file diff --git a/data/po/sv.po b/data/po/sv.po new file mode 100644 index 0000000..330726d --- /dev/null +++ b/data/po/sv.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Klar" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Avinstallera %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Avinstallera" \ No newline at end of file diff --git a/data/po/th.po b/data/po/th.po new file mode 100755 index 0000000..57e613c --- /dev/null +++ b/data/po/th.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "เรียบร้อย" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "ถอนการติดตั้ง %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "ลบการติดตั้ง" diff --git a/data/po/tr_TR.po b/data/po/tr_TR.po new file mode 100644 index 0000000..32ce85c --- /dev/null +++ b/data/po/tr_TR.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Tamam" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%s kaldırılsın mı?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Kaldır" \ No newline at end of file diff --git a/data/po/uk.po b/data/po/uk.po new file mode 100644 index 0000000..d50f5c5 --- /dev/null +++ b/data/po/uk.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Готово" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "Видалити %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Видалити" \ No newline at end of file diff --git a/data/po/ur.po b/data/po/ur.po new file mode 100755 index 0000000..08ede49 --- /dev/null +++ b/data/po/ur.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "مکمل" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%s نا تنصیب کریں؟" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "نا تنصیب کریں" diff --git a/data/po/uz.po b/data/po/uz.po new file mode 100644 index 0000000..170b97a --- /dev/null +++ b/data/po/uz.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "Qilindi" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "%s olib tashlansinmi?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "Olib tashlash" \ No newline at end of file diff --git a/data/po/zh_CN.po b/data/po/zh_CN.po new file mode 100644 index 0000000..781b4f0 --- /dev/null +++ b/data/po/zh_CN.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "完成" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "是否卸载 %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "卸载" \ No newline at end of file diff --git a/data/po/zh_HK.po b/data/po/zh_HK.po new file mode 100644 index 0000000..708e6ef --- /dev/null +++ b/data/po/zh_HK.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "完成" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "解除安裝 %s 嗎?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "解除安裝" \ No newline at end of file diff --git a/data/po/zh_SG.po b/data/po/zh_SG.po new file mode 100644 index 0000000..781b4f0 --- /dev/null +++ b/data/po/zh_SG.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "完成" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "是否卸载 %s?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "卸载" \ No newline at end of file diff --git a/data/po/zh_TW.po b/data/po/zh_TW.po new file mode 100644 index 0000000..708e6ef --- /dev/null +++ b/data/po/zh_TW.po @@ -0,0 +1,8 @@ +msgid "IDS_HS_BUTTON_DONE" +msgstr "完成" + +msgid "IDS_AT_POP_UNINSTALL_PS_Q" +msgstr "解除安裝 %s 嗎?" + +msgid "IDS_AT_BODY_UNINSTALL" +msgstr "解除安裝" \ No newline at end of file diff --git a/include/all_apps/db.h b/include/all_apps/db.h new file mode 100644 index 0000000..60aeeb6 --- /dev/null +++ b/include/all_apps/db.h @@ -0,0 +1,47 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_ALL_APPS_DB_H__ +#define __MENU_SCREEN_ALL_APPS_DB_H__ + +#include "Elementary.h" +#include "util.h" + +typedef struct _db_info { + long long rowid; + int type; + + char *appid; + char *name; + char *content_info; + char *icon; +} db_info; + +extern menu_screen_error_e all_apps_db_init(void); +extern void all_apps_db_fini(void); + +extern Eina_List *all_apps_db_retrieve_all_info(void); +extern void all_apps_db_unretrieve_info(db_info *info); +extern void all_apps_db_unretrieve_all_info(Eina_List *list); + +extern long long all_apps_db_insert_shortcut(const char *appid, const char *name, int type, const char *content_info, const char *icon); +extern menu_screen_error_e all_apps_db_delete_shortcut(long long rowid); +extern int all_apps_db_count_shortcut(const char *appid, const char *name); + +#endif // __MENU_SCREEN_ALL_APPS_DB_H__ +// End of file diff --git a/include/all_apps/layout.h b/include/all_apps/layout.h new file mode 100644 index 0000000..73cd023 --- /dev/null +++ b/include/all_apps/layout.h @@ -0,0 +1,35 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _MENU_SCREEN_CONTROLBAR_ALL_APPS_H_ +#define _MENU_SCREEN_CONTROLBAR_ALL_APPS_H_ + +#include + +#define PAGE_MAX_APP 16 + +extern bool all_apps_layout_is_edited(Evas_Object *all_apps); +extern void all_apps_layout_edit(Evas_Object *all_apps); +extern void all_apps_layout_unedit(Evas_Object *all_apps); + +extern Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate); +extern void all_apps_layout_destroy(Evas_Object *all_apps); + +#endif // _MENU_SCREEN_CONTROLBAR_ALL_APPS_H_ + +// End of a file diff --git a/include/all_apps/list.h b/include/all_apps/list.h new file mode 100644 index 0000000..fe93e4f --- /dev/null +++ b/include/all_apps/list.h @@ -0,0 +1,27 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_LIST_ALL_APPS_H__ +#define __MENU_SCREEN_LIST_ALL_APPS_H__ + +extern app_list *all_apps_list_create(void); +extern void all_apps_list_destroy(app_list *list); + +#endif //__MENU_SCREEN_LIST_ALL_APPS_H__ + +// End of a file diff --git a/include/all_apps/shortcut.h b/include/all_apps/shortcut.h new file mode 100644 index 0000000..0d536bf --- /dev/null +++ b/include/all_apps/shortcut.h @@ -0,0 +1,35 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _MENU_SCREEN_ALL_APPS_SHORTCUT_H_ +#define _MENU_SCREEN_ALL_APPS_SHORTCUT_H_ + +#include +#include + +extern Evas_Object *all_apps_shortcut_add(Evas_Object *scroller, long long rowid, const char *pkgname, const char *exec, const char *name, const char *icon, int type); +extern void all_apps_shortcut_remove(Evas_Object *item); + +extern menu_screen_error_e all_apps_shortcut_add_all(Evas_Object *scroller); + +extern bool all_apps_shortcut_init(Evas_Object *all_apps); +extern void all_apps_shortcut_fini(void); + +#endif // _MENU_SCREEN_ALL_APPS_SHORTCUT_H_ + +// End of a file diff --git a/include/conf.h b/include/conf.h new file mode 100644 index 0000000..50d40f8 --- /dev/null +++ b/include/conf.h @@ -0,0 +1,37 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef _MENU_SCREEN_CONF_H_ +#define _MENU_SCREEN_CONF_H_ + +#define MAX_PAGE_NO 9 + +#define BASE_HEIGHT 1280.0f +#define BASE_WIDTH 720.0f + +#define PAGE_PORTRAIT_HEIGHT 1030.0f +#define INDEX_HEIGHT 70 + +#define ITEM_WIDTH 180.0 +#define ITEM_WIDTH_PROP (ITEM_WIDTH/BASE_WIDTH) +#define ITEM_HEIGHT 198.0 +#define ITEM_HEIGHT_PROP (ITEM_HEIGHT/BASE_HEIGHT) + +#endif // _MENU_SCREEN_CONF_H_ + +// End of a file diff --git a/include/db.h b/include/db.h new file mode 100644 index 0000000..dd962f6 --- /dev/null +++ b/include/db.h @@ -0,0 +1,47 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MENU_SCREEN_DB_H__ +#define __MENU_SCREEN_DB_H__ + +#include + +#include "util.h" + +typedef struct stmt stmt_h; + +extern stmt_h *db_prepare(const char *query); +extern menu_screen_error_e db_bind_bool(stmt_h *handle, int idx, bool value); +extern menu_screen_error_e db_bind_int(stmt_h *handle, int idx, int value); +extern menu_screen_error_e db_bind_str(stmt_h *handle, int idx, const char *str); +extern menu_screen_error_e db_next(stmt_h *handle); +extern bool db_get_bool(stmt_h *handle, int index); +extern int db_get_int(stmt_h *handle, int index); +extern long long db_get_long_long(stmt_h *handle, int index); +extern const char *db_get_str(stmt_h *handle, int index); +extern menu_screen_error_e db_reset(stmt_h *handle); +extern menu_screen_error_e db_finalize(stmt_h *handle); +extern menu_screen_error_e db_exec(const char *query); +extern long long db_last_insert_rowid(void); + +extern menu_screen_error_e db_open(const char *db_file); +extern void db_close(void); + +extern menu_screen_error_e db_begin_transaction(void); +extern menu_screen_error_e db_end_transaction(bool success); + +#endif // __MENU_SCREEN_DB_H__ +// End of file diff --git a/include/index.h b/include/index.h new file mode 100644 index 0000000..fcc2454 --- /dev/null +++ b/include/index.h @@ -0,0 +1,35 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_PAGE_CONTROL_H__ +#define __MENU_SCREEN_PAGE_CONTROL_H__ + +#include + +extern void index_bring_in(Evas_Object *index, int idx); + +extern Evas_Object *index_create(Evas_Object *layout, unsigned int count, unsigned int current_idx); +extern Evas_Object *index_update(Evas_Object *layout, Evas_Object *index, unsigned int count); +extern void index_destroy(Evas_Object *index); + +extern void index_show(Evas_Object *index); +extern void index_hide(Evas_Object *index); + +#endif //__MENU_SCREEN_PAGE_CONTROL_H__ + +// End of the file diff --git a/include/item.h b/include/item.h new file mode 100644 index 0000000..ab7fe21 --- /dev/null +++ b/include/item.h @@ -0,0 +1,78 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_ITEM_H__ +#define __MENU_SCREEN_ITEM_H__ + +#include + +#include "list.h" +#include "util.h" + +extern char *item_get_icon(Evas_Object *item); +extern void item_set_icon(Evas_Object *item, char *icon, int sync); + +extern char *item_get_name(Evas_Object *item); +extern void item_set_name(Evas_Object *item, char *name, int sync); + +extern char *item_get_package(Evas_Object *item); +extern void item_set_package(Evas_Object *item, char *package, int sync); + +extern int item_get_removable(Evas_Object *item); +extern void item_set_removable(Evas_Object *item, int removable, int sync); + +extern Evas_Object *item_get_page(Evas_Object *edje); +extern void item_set_page(Evas_Object *edje, Evas_Object *page, int sync); + +extern char *item_get_desktop(Evas_Object *item); +extern void item_set_desktop(Evas_Object *item, char *name, int sync); + +extern int item_get_type(Evas_Object *item); +extern void item_set_type(Evas_Object *edje, int type, int sync); + +extern void item_enable_delete(Evas_Object *obj); +extern void item_disable_delete(Evas_Object *item); + +extern void item_show_badge(Evas_Object *obj, int value); +extern void item_hide_badge(Evas_Object *obj); +extern int item_is_enabled_badge(Evas_Object *obj); + +extern void item_edit(Evas_Object *item); +extern void item_unedit(Evas_Object *item); + +extern Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai); +extern void item_update(Evas_Object *item, app_info_t *ai); +extern void item_destroy(Evas_Object *obj); + +extern void item_launch(Evas_Object *obj); + +extern void item_enable_progress(Evas_Object *obj); +extern int item_is_enabled_progress(Evas_Object *obj); +extern void item_update_progress(Evas_Object *obj, int value); +extern void item_disable_progress(Evas_Object *obj); + +extern menu_screen_error_e item_is_edje_icon(const char *icon); +extern int item_get_position(Evas_Object *item); + +extern void item_mark_dirty(Evas_Object *item); +extern void item_unmark_dirty(Evas_Object *item); +extern int item_is_dirty(Evas_Object *item); + +#endif //__MENU_SCREEN_ITEM_H__ + +// End of a file diff --git a/include/item_badge.h b/include/item_badge.h new file mode 100644 index 0000000..068d03b --- /dev/null +++ b/include/item_badge.h @@ -0,0 +1,35 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_BADGE_H__ +#define __MENU_SCREEN_BADGE_H__ + +#include + +#include "util.h" + +extern menu_screen_error_e item_badge_register(Evas_Object *item); +extern void item_badge_unregister(Evas_Object *item); +extern bool item_badge_is_registered(Evas_Object *item); +extern int item_badge_count(char *package); + +extern void item_badge_register_changed_cb(Evas_Object *scroller); +extern void item_badge_unregister_changed_cb(void); + +#endif +// End of a file diff --git a/include/item_event.h b/include/item_event.h new file mode 100644 index 0000000..547103a --- /dev/null +++ b/include/item_event.h @@ -0,0 +1,29 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_ITEM_EVENT_H__ +#define __MENU_SCREEN_ITEM_EVENT_H__ + +#include + +extern void item_event_register(Evas_Object *obj); +extern void item_event_unregister(Evas_Object *obj); + +#endif //__MENU_SCREEN_ITEM_EVENT_H__ + +// End of a file diff --git a/include/key.h b/include/key.h new file mode 100644 index 0000000..def465f --- /dev/null +++ b/include/key.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MENU_SCREEN_INPUT_KEY_H__ +#define __MENU_SCREEN_INPUT_KEY_H__ + +#include "util.h" + +HAPI void key_register(void); +HAPI void key_unregister(void); +HAPI void key_grab_home(void); +HAPI void key_ungrab_home(void); + +#endif //__MENU_SCREEN_INPUT_KEY_H__ + +// End of a file diff --git a/include/layout.h b/include/layout.h new file mode 100644 index 0000000..d24aad0 --- /dev/null +++ b/include/layout.h @@ -0,0 +1,36 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_LAYOUT_H__ +#define __MENU_SCREEN_LAYOUT_H__ + +#include +#include "util.h" + +extern Evas_Object *layout_create(Evas_Object *conformant, const char *file, const char *group, int rotate); +extern void layout_destroy(Evas_Object *layout); + +extern void layout_enable_block(Evas_Object *layout); +extern void layout_disable_block(Evas_Object *layout); + +extern Evas_Object* layout_load_edj(Evas_Object *parent, const char *edjname, const char *grpname); +extern void layout_unload_edj(Evas_Object *layout); + +#endif //__MENU_SCREEN_LAYOUT_H__ + +// End of a file diff --git a/include/list.h b/include/list.h new file mode 100644 index 0000000..e39d285 --- /dev/null +++ b/include/list.h @@ -0,0 +1,70 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_LIST_H__ +#define __MENU_SCREEN_LIST_H__ + +#include +#include + +#include "util.h" + +typedef struct +{ + char *package; + char *exec; + char *name; + char *icon; + char *desktop; + bool nodisplay; + bool enabled; + bool x_slp_removable; + bool x_slp_taskmanage; + pid_t pid; + Evas_Object *image; +} app_info_t; + +typedef struct _app_list { + Eina_List *list; + unsigned int cur_idx; +} app_list; + +typedef struct _app_list_item { + char *package; + pid_t pid; + time_t launch_time; + long long installed_time; + void *data; +} app_list_item; + +extern menu_screen_error_e list_count(app_list *list, int *count); +extern menu_screen_error_e list_first(app_list *list); +extern menu_screen_error_e list_next(app_list *list); +extern menu_screen_error_e list_is_ended(app_list *list, bool *flag); + +extern menu_screen_error_e list_get_item(app_list *list, app_list_item **item); +extern menu_screen_error_e list_get_values(const char *package, app_info_t *ai); +extern void list_free_values(app_info_t *ai); + +extern menu_screen_error_e list_append_item(app_list *list, app_list_item *item); +extern menu_screen_error_e list_remove_item(app_list *list, app_list_item *item); +extern menu_screen_error_e list_sort(app_list *list, int (*_sort_cb)(const void *d1, const void *d2)); + +#endif //__MENU_SCREEN_LIST_H__ + +// End of a file diff --git a/include/mapbuf.h b/include/mapbuf.h new file mode 100644 index 0000000..d42f1f5 --- /dev/null +++ b/include/mapbuf.h @@ -0,0 +1,40 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_MAPBUF_H__ +#define __MENU_SCREEN_MAPBUF_H__ + +#include + +#include "util.h" + +extern menu_screen_error_e mapbuf_enable(Evas_Object *obj, int force); +extern int mapbuf_disable(Evas_Object *obj, int force); + +extern Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page); +extern Evas_Object *mapbuf_unbind(Evas_Object *obj); + +extern Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj); +extern Evas_Object *mapbuf_get_page(Evas_Object *obj); + +extern int mapbuf_is_enabled(Evas_Object *obj); + + +#endif //__MENU_SCREEN_MAPBUF_H__ + +// End of a file diff --git a/include/menu_screen.h b/include/menu_screen.h new file mode 100644 index 0000000..03848f3 --- /dev/null +++ b/include/menu_screen.h @@ -0,0 +1,38 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_H__ +#define __MENU_SCREEN_H__ + +#include +#include +#include + +extern int menu_screen_get_root_width(void); +extern int menu_screen_get_root_height(void); +extern Evas *menu_screen_get_evas(void); +extern Evas_Object *menu_screen_get_win(void); +extern Elm_Theme *menu_screen_get_theme(void); +extern bool menu_screen_get_done(void); +extern void menu_screen_set_done(bool is_done); +extern int menu_screen_get_state(void); +extern int menu_screen_is_tts(void); + +#endif //__MENU_SCREEN_H__ + +// End of a file diff --git a/include/mouse.h b/include/mouse.h new file mode 100644 index 0000000..50b3442 --- /dev/null +++ b/include/mouse.h @@ -0,0 +1,33 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_EVENT_H__ +#define __MENU_SCREEN_EVENT_H__ + +#include + +#include "util.h" + +extern bool mouse_is_scrolling(void); + +extern void mouse_register(void); +extern void mouse_unregister(void); + +#endif //__MENU_SCREEN_EVENT_H__ + +// End of a file diff --git a/include/page.h b/include/page.h new file mode 100644 index 0000000..990d860 --- /dev/null +++ b/include/page.h @@ -0,0 +1,50 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_PAGE_H__ +#define __MENU_SCREEN_PAGE_H__ + +#include +#include "util.h" +#include "list.h" + +extern void page_mark_dirty(Evas_Object *page); +extern void page_clean_dirty(Evas_Object *page); +extern void page_unmark_dirty(Evas_Object *page); +extern int page_is_dirty(Evas_Object *page); + +extern Evas_Object *page_get_item_at(Evas_Object *menu, unsigned int idx); + +extern menu_screen_error_e page_unpack_item(Evas_Object *page, Evas_Object *item); +extern Evas_Object *page_unpack_item_at(Evas_Object *page, int idx); + +extern void page_pack_item(Evas_Object *menu, int idx, Evas_Object *item); +extern void page_set_item(Evas_Object *page, int idx, Evas_Object *item); + +extern unsigned int page_count_item(Evas_Object *page); + +extern Evas_Object *page_create(Evas_Object *scroller, int idx, int rotate); +extern void page_destroy(Evas_Object *scroller, Evas_Object *page); + +extern int page_find_empty_near(Evas_Object *menu_edje, int pivot); +extern int page_find_first_empty(Evas_Object *page, int pivot); +extern void page_trim_items(Evas_Object *page); + +#endif //__MENU_SCREEN_PAGE_H__ +// End of a file + diff --git a/include/page_scroller.h b/include/page_scroller.h new file mode 100644 index 0000000..282a5f2 --- /dev/null +++ b/include/page_scroller.h @@ -0,0 +1,58 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_PAGE_SCROLLER_H__ +#define __MENU_SCREEN_PAGE_SCROLLER_H__ + +#include +#include +#include +#include "list.h" + +typedef enum { + PAGE_SCROLLER_SORT_BY_DEFAULT = 0, + PAGE_SCROLLER_SORT_BY_PACKAGE, + PAGE_SCROLLER_SORT_BY_NAME, + PAGE_SCROLLER_SORT_MAX, +} page_scroller_sort_type_e; + +extern Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scroller_sort_type_e sort_type, int rotate); +extern void page_scroller_destroy(Evas_Object *scroller); +extern void page_scroller_clean(Evas_Object *scroller); + +extern Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx); +extern unsigned int page_scroller_count_page(Evas_Object *scroller); +extern int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page); + +extern Evas_Object *page_scroller_push_item(Evas_Object *scroller, app_info_t *ai); +extern int page_scroller_get_current_page_no(Evas_Object *scroller); +extern Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const char *package, int *page_no); +extern void page_scroller_trim_items(Evas_Object *scroller); +extern void page_scroller_bring_in(Evas_Object *scroller, int idx); +extern void page_scroller_show_region(Evas_Object *scroller, int idx); + +extern void page_scroller_edit(Evas_Object *scroller); +extern void page_scroller_unedit(Evas_Object *scroller); +extern bool page_scroller_is_edited(Evas_Object *scroller); + +extern void page_scroller_focus(Evas_Object *scroller); +extern void page_scroller_focus_into_vector(Evas_Object *scroller, int vector); + +#endif //__MENU_SCREEN_PAGE_SCROLLER_H__ + +// End of a file diff --git a/include/pkgmgr.h b/include/pkgmgr.h new file mode 100644 index 0000000..42b29c1 --- /dev/null +++ b/include/pkgmgr.h @@ -0,0 +1,66 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_PKGMGR_H__ +#define __MENU_SCREEN_PKGMGR_H__ + +#include + +#include "list.h" +#include "util.h" + + + +enum package_install_status { + UNKNOWN = 0x00, + DOWNLOAD_BEGIN, + DOWNLOADING, + DOWNLOAD_END, + INSTALL_BEGIN, + INSTALLING, + INSTALL_END, + UNINSTALL_BEGIN, + UNINSTALLING, + UNINSTALL_END, + UPDATE_BEGIN, + UPDATING, + UPDATE_END, + MAX_STATUS, +}; + + + +struct package_info { + enum package_install_status status; + app_info_t ai; + Evas_Object *item; + Evas_Object *page; + Eina_Bool desktop_file_found; + int error_count; +}; + + + +extern menu_screen_error_e pkgmgr_init(Evas_Object *scroller); +extern void pkgmgr_fini(void); +extern Evas_Object *pkgmgr_find_pended_object(const char *package, int with_desktop_file, Evas_Object *scroller, Evas_Object **page); +extern menu_screen_error_e pkgmgr_uninstall(Evas_Object *obj); + +#endif //__MENU_SCREEN_PKGMGR_H__ + +// End of a file diff --git a/include/popup.h b/include/popup.h new file mode 100644 index 0000000..b894376 --- /dev/null +++ b/include/popup.h @@ -0,0 +1,29 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_POPUP_H__ +#define __MENU_SCREEN_POPUP_H__ + +extern Evas_Object *popup_exist(void); +extern void popup_destroy_all(void); +extern Evas_Object *popup_create_confirm(Evas_Object *parent, const char *warning); +extern Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item); + +#endif //__MENU_SCREEN_POPUP_H__ + +// End of a file diff --git a/include/util.h b/include/util.h new file mode 100644 index 0000000..44579b3 --- /dev/null +++ b/include/util.h @@ -0,0 +1,168 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __MENU_SCREEN_UTIL_H__ +#define __MENU_SCREEN_UTIL_H__ +#include +#include + +#define STR_MOVE_PREV "move,prev" +#define STR_MOVE_NEXT "move,next" +#define STR_ANI_RETURN "ani,return" +#define STR_ENV_MAPBUF "BEATUX_MAPBUF" + +#define ALL_APPS_TABLE "all_apps" + +/* Accessibility */ +#define ACCESS_BUTTON "button" +#define ACCESS_EDIT "edit" + +/* Multi-language */ +#define D_(str) dgettext("sys_string", str) + +/* Log */ +#if !defined(_W) +#define _W(fmt, arg...) LOGW(fmt"\n", ##arg) +#endif + +#if !defined(_D) +#define _D(fmt, arg...) LOGD(fmt"\n", ##arg) +#endif + +#if !defined(_E) +#define _E(fmt, arg...) LOGE(fmt"\n", ##arg) +#endif + +#if !defined(_T) +#define _T(package) LOG(LOG_DEBUG, "LAUNCH", "[%s:Menuscreen:launch:done]", package); +#endif + +/* Multi-language */ +#ifndef _ +#define _(str) gettext(str) +#endif + +#define gettext_noop(str) (str) +#define N_(str) gettext_noop(str) +#define D_(str) dgettext("sys_string", str) + +/* Build */ +#define HAPI __attribute__((visibility("hidden"))) + +/* Packaging */ +#define DEFAULT_ICON IMAGEDIR"/default.png" + +#ifdef APPFWK_MEASUREMENT +#define PRINT_APPFWK() do { \ + struct timeval tv; \ + char str_time[64] = {0,}; \ + int re; \ + gettimeofday(&tv, NULL); \ + sprintf(str_time, "APP_START_TIME=%u %u", (int)tv.tv_sec, (int)tv.tv_usec); \ + re = putenv(str_time); \ +} while (0) +#else +#define PRINT_APPFWK() +#endif + +#if defined(TIME_CHECK) +#define PRINT_TIME() do { \ + struct timeval tv; \ + gettimeofday(&tv, NULL); \ + _D("[%s:%d] TIME=%u %u", __func__, __LINE__, (int)tv.tv_sec, (int)tv.tv_usec); \ +} while (0) +#else +#define PRINT_TIME() +#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; \ + } \ +} + +#if !defined(_EDJ) +#define _EDJ(a) elm_layout_edje_get(a) +#endif + +typedef enum { + MENU_SCREEN_ERROR_OK = 0, + MENU_SCREEN_ERROR_FAIL = -1, + MENU_SCREEN_ERROR_DB_FAILED = -2, + MENU_SCREEN_ERROR_OUT_OF_MEMORY = -3, + MENU_SCREEN_ERROR_INVALID_PARAMETER = -4, + MENU_SCREEN_ERROR_NO_DATA = -5, +} menu_screen_error_e; + +typedef enum { + TRAY_TYPE_ALL_APPS = 0, + TRAY_TYPE_RUNNING_APPS, + TRAY_TYPE_DOWNLOADED_APPS, + TRAY_TYPE_FAVORITE_APPS, + TRAY_TYPE_FREQUENTLY_USED_APPS, + TRAY_TYPE_MAX, +} tray_type_e; + +enum { + APP_STATE_PAUSE = 1, + APP_STATE_RESUME, +}; + +enum { + MENU_SCREEN_ROTATE_PORTRAIT = 0, + MENU_SCREEN_ROTATE_LANDSCAPE, +}; + + + +extern void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +extern void _evas_object_event_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +extern void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +extern void _evas_object_event_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); + + +#endif /* __MENU_SCREEN_UTIL_H__ */ diff --git a/org.tizen.menu-screen.manifest b/org.tizen.menu-screen.manifest new file mode 100644 index 0000000..af98acf --- /dev/null +++ b/org.tizen.menu-screen.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/org.tizen.menu-screen.rule b/org.tizen.menu-screen.rule new file mode 100644 index 0000000..fe79e16 --- /dev/null +++ b/org.tizen.menu-screen.rule @@ -0,0 +1,94 @@ +org.tizen.menu-screen pkgmgr::db rw +org.tizen.menu-screen ail::db rw +org.tizen.menu-screen system::homedir rwxat +org.tizen.menu-screen system::vconf rwxat +org.tizen.menu-screen system::media rwxat +org.tizen.menu-screen system::share rwxat +org.tizen.menu-screen system::use_internet r +org.tizen.menu-screen device::app_logging w +org.tizen.menu-screen device::camera rwx +org.tizen.menu-screen sys-assert::core rwxat +org.tizen.menu-screen pulseaudio rwxat +org.tizen.menu-screen net-config rx +org.tizen.menu-screen xorg rwx +org.tizen.menu-screen isf rwx +org.tizen.menu-screen dbus rwx +org.tizen.menu-screen ug-image-viewer-efl rx +org.tizen.menu-screen cbhm rx +org.tizen.menu-screen sound_server rwx +org.tizen.menu-screen svi-data rx +org.tizen.menu-screen data-provider-master rwx +org.tizen.menu-screen org.tizen.indicator rwx +org.tizen.menu-screen org.tizen.setting rx +org.tizen.menu-screen sqlfs rx +org.tizen.menu-screen e17 rwx +org.tizen.menu-screen dlogutil rx +org.tizen.menu-screen immvibed rwx +org.tizen.menu-screen rua::db rw +org.tizen.menu-screen org.tizen.clock w +org.tizen.menu-screen badge::db rw +org.tizen.menu-screen aul rwx +org.tizen.menu-screen system-server rx +org.tizen.menu-screen deviced rx +org.tizen.menu-screen sensor-framework rx +org.tizen.menu-screen secure-storage rx +org.tizen.menu-screen pkgmgr-client rx +org.tizen.menu-screen syslogd w +org.tizen.menu-screen system::vconf_multimedia rw +org.tizen.indicator org.tizen.menu-screen rwx +org.tizen.browser org.tizen.menu-screen rw +org.tizen.contact org.tizen.menu-screen rw +org.tizen.youtube-shortcut org.tizen.menu-screen rw +org.tizen.message org.tizen.menu-screen rw +org.tizen.voicerecorder org.tizen.menu-screen rw +org.tizen.calendar org.tizen.menu-screen rw +org.tizen.episode org.tizen.menu-screen rw +org.tizen.keepit org.tizen.menu-screen rw +org.tizen.calculator org.tizen.menu-screen rw +org.tizen.clock org.tizen.menu-screen rw +org.tizen.camera-app org.tizen.menu-screen rw +org.tizen.svoice org.tizen.menu-screen rw +org.tizen.group-cast org.tizen.menu-screen rw +org.tizen.phone org.tizen.menu-screen rw +org.tizen.smartsearch org.tizen.menu-screen rw +org.tizen.setting org.tizen.menu-screen rw +org.tizen.myfile org.tizen.menu-screen rw +org.tizen.rcs-im org.tizen.menu-screen rw +org.tizen.smemo org.tizen.menu-screen rw +org.tizen.facebook org.tizen.menu-screen rw +org.tizen.dailybriefing-ynews org.tizen.menu-screen rw +org.tizen.gallery org.tizen.menu-screen rw +org.tizen.email org.tizen.menu-screen rw +org.tizen.dailybriefing-yfinance org.tizen.menu-screen rw +org.tizen.music-player org.tizen.menu-screen rw +org.tizen.nfc-app org.tizen.menu-screen rw +org.tizen.dailybriefing-accuweather org.tizen.menu-screen rw +org.tizen.video-player org.tizen.menu-screen rw +org.tizen.contacts org.tizen.menu-screen rw +dbus org.tizen.menu-screen rwx +e17 org.tizen.menu-screen rwx +stest-service org.tizen.menu-screen rx +org.tizen.menu-screen stest-service w +org.tizen.menu-screen org.tizen.setting::default-resources rx +org.tizen.menu-screen pkgmgr::svc rx +org.tizen.menu-screen pkgmgr::info r +org.tizen.menu-screen system::vconf_system rw +org.tizen.menu-screen system::vconf_inhouse rw +org.tizen.menu-screen aul::launch x +org.tizen.menu-screen data-provider-master::shortcut rw +org.tizen.menu-screen data-provider-master::shortcut.shortcut w +org.tizen.menu-screen data-provider-master::notification rw +org.tizen.menu-screen data-provider-master::notification.client w +org.tizen.menu-screen data-provider-master::badge rw +org.tizen.menu-screen data-provider-master::badge.client w +org.tizen.menu-screen tts-server rwx +org.tizen.menu-screen idlescreen::vconf rwx +org.tizen.app-tray org.tizen.menu-screen rx +org.tizen.menu-screen factory-15 rx +org.tizen.menu-screen telephony_framework::api_manager r +org.tizen.menu-screen telephony_framework::api_modem r +org.tizen.menu-screen telephony_framework::api_network r +org.tizen.menu-screen atd-server r +org.tizen.menu-screen factory::vconf rw +org.tizen.menu-screen mobileprint x +org.tizen.menu-screen _ wx diff --git a/packaging/org.tizen.menu-screen.spec b/packaging/org.tizen.menu-screen.spec new file mode 100644 index 0000000..bb6eab5 --- /dev/null +++ b/packaging/org.tizen.menu-screen.spec @@ -0,0 +1,143 @@ +%define _optdir /opt +%define _usrdir /usr +%define _appdir %{_usrdir}/apps +%define _usr_datadir %{_usrdir}/share + +%define _project_name menu-screen +%define _package_name org.tizen.%{_project_name} + +%define _packagedir %{_appdir}/%{_package_name} +%define _bindir %{_packagedir}/bin +%define _datadir %{_optdir}%{_packagedir}/data +%define _resdir %{_packagedir}/res +%define _sharedir %{_packagedir}/share + +%define _localedir %{_resdir}/locale + +Name: org.tizen.menu-screen +Summary: An utility library of the menu screen +Version: 1.2.7 +Release: 1.1 +Group: TO_BE/FILLED_IN +License: Flora Software License +Source0: %{name}-%{version}.tar.gz +BuildRequires: pkgconfig(ail) +BuildRequires: pkgconfig(appcore-efl) +BuildRequires: pkgconfig(appsvc) +BuildRequires: pkgconfig(aul) +BuildRequires: pkgconfig(badge) +BuildRequires: pkgconfig(bundle) +BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(capi-system-info) +BuildRequires: pkgconfig(dlog) +BuildRequires: pkgconfig(ecore) +BuildRequires: pkgconfig(ecore-evas) +BuildRequires: pkgconfig(ecore-file) +BuildRequires: pkgconfig(ecore-imf) +BuildRequires: pkgconfig(ecore-input) +BuildRequires: pkgconfig(edje) +BuildRequires: pkgconfig(eet) +BuildRequires: pkgconfig(eina) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(heynoti) +BuildRequires: pkgconfig(pkgmgr) +BuildRequires: pkgconfig(pkgmgr-info) +BuildRequires: pkgconfig(shortcut) +BuildRequires: pkgconfig(sysman) +BuildRequires: pkgconfig(syspopup-caller) +BuildRequires: pkgconfig(utilX) +BuildRequires: cmake +BuildRequires: edje-tools +BuildRequires: gettext-tools + + +%description +An utility library for developers of the menu screen. + + + +%package devel +Summary: An utility library of the menu screen (devel) +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +An utility library for developers of the menu screen (devel) + + +%prep +%setup -q + +%build +cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} +CFLAGS="${CFLAGS} -Wall" LDFLAGS="${LDFLAGS} -Wl,--hash-style=both -Wl,--as-needed" +make %{?jobs:-j%jobs} + +%install +%make_install +mkdir -p %{buildroot}%{_datadir} +mkdir -p %{buildroot}/usr/share/license + +%post +INHOUSE_ID="5000" + +init_vconf() +{ + vconftool set -t int memory/idle-screen/top 0 -i -u 5000 -f + vconftool set -t string file/private/org.tizen.menu-screen/engine "gl" -i -u 5000 -f + vconftool set -t string db/setting/menuscreen/package_name "org.tizen.menu-screen" -i -u 5000 -f +} +init_vconf + +if [ ! -d %{_datadir}/dbspace ] +then + mkdir -p %{_datadir}/dbspace +fi + +if [ ! -d %{_datadir}/shortcut ] +then + mkdir -p %{_datadir}/shortcut +else + rm -rf %{_datadir}/shortcut/* +fi + +sqlite3 %{_datadir}/dbspace/.menu_screen.db 'PRAGMA journal_mode = PERSIST; + create table if not exists shortcut ( + ROWID INTEGER PRIMARY KEY AUTOINCREMENT, + appid TEXT, + name TEXT, + type INTEGER, + content_info TEXT, + icon TEXT + ); +' + +INHOUSE_ID="5000" +chown -R $INHOUSE_ID:$INHOUSE_ID %{_datadir} +chown root:$INHOUSE_ID %{_datadir}/dbspace/.menu_screen.db +chown root:$INHOUSE_ID %{_datadir}/dbspace/.menu_screen.db-journal + +chmod 660 %{_datadir}/dbspace/.menu_screen.db +chmod 660 %{_datadir}/dbspace/.menu_screen.db-journal + +if [ -f /usr/lib/rpm-plugins/msm.so ] +then + chsmack -a 'org.tizen.menu-screen' %{_datadir}/dbspace/.menu_screen.db* +fi + +%files +%manifest %{name}.manifest +%defattr(-,root,root,-) +%{_bindir}/menu-screen +%{_resdir}/edje/all_apps_portrait.edj +%{_resdir}/edje/button_edit.edj +%{_resdir}/edje/group_4x4_portrait.edj +%{_resdir}/edje/item_4x4.edj +%{_resdir}/edje/layout_portrait.edj +%{_resdir}/edje/index.edj +%{_resdir}/images/default.png +%{_localedir}/*/*/*.mo +%{_usr_datadir}/packages/org.tizen.menu-screen.xml +%{_usr_datadir}/license/%{name} +/opt/etc/smack/accesses.d/%{_package_name}.rule diff --git a/src/all_apps/db.c b/src/all_apps/db.c new file mode 100644 index 0000000..ffed9c7 --- /dev/null +++ b/src/all_apps/db.c @@ -0,0 +1,209 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include + +#include "db.h" +#include "util.h" +#include "all_apps/db.h" + +#define QUERY_LEN 1024 + +#define MENU_SCREEN_DB_FILE "/opt/usr/apps/com.samsung.menu-screen/data/dbspace/.menu_screen.db" +#define SHORTCUT_TABLE "shortcut" +#define QUERY_INSERT_SHORTCUT "INSERT INTO "SHORTCUT_TABLE" ("\ + "appid,"\ + "name,"\ + "type,"\ + "content_info,"\ + "icon"\ + ") VALUES ("\ + "'%s', '%s', %d, '%s', '%s');" +#define QUERY_DELETE_SHORTCUT "DELETE FROM "SHORTCUT_TABLE" WHERE ROWID=%lld" +#define QUERY_GET_ALL "SELECT ROWID, appid, name, type, content_info, icon FROM "SHORTCUT_TABLE +#define QUERY_COUNT_SHORTCUT "SELECT COUNT(*) FROM "SHORTCUT_TABLE" WHERE appid='%s' AND name='%s'" + + + +HAPI menu_screen_error_e all_apps_db_init(void) +{ + return db_open(MENU_SCREEN_DB_FILE); +} + + + +HAPI void all_apps_db_fini(void) +{ + db_close(); +} + + + +HAPI Eina_List *all_apps_db_retrieve_all_info(void) +{ + stmt_h *st; + Eina_List *list = NULL; + + retv_if(MENU_SCREEN_ERROR_OK != db_open(MENU_SCREEN_DB_FILE), NULL); + + st = db_prepare(QUERY_GET_ALL); + retv_if(NULL == st, NULL); + + menu_screen_error_e ret = MENU_SCREEN_ERROR_FAIL; + for (ret = db_next(st); MENU_SCREEN_ERROR_FAIL != ret && MENU_SCREEN_ERROR_NO_DATA != ret; ret = db_next(st)) { + db_info *info; + info = calloc(1, sizeof(db_info)); + break_if(NULL == info); + + info->rowid = db_get_long_long(st, 0); // 0 : ROWID + + char *tmp = NULL; + tmp = (char *) db_get_str(st, 1); // 1 : appid + if (tmp && strlen(tmp)) { + info->appid = strdup(tmp); + goto_if(NULL == info->appid, APP_ERROR); + } + + tmp = (char *) db_get_str(st, 2); // 2 : name + if (tmp && strlen(tmp)) { + info->name = strdup(tmp); + goto_if(NULL == info->name, APP_ERROR); + } + + info->type = db_get_int(st, 3); // 3 : type + + tmp = (char *) db_get_str(st, 4); // 4 : content_info + if (tmp && strlen(tmp)) { + info->content_info = strdup(tmp); + goto_if(NULL == info->content_info, APP_ERROR); + } + + tmp = (char *) db_get_str(st, 5); // 5 : icon + if (tmp && strlen(tmp)) { + info->icon = strdup(tmp); + goto_if(NULL == info->icon, APP_ERROR); + } + + list = eina_list_append(list, info); + + continue; +APP_ERROR: + if (info->appid) free(info->appid); + if (info->name) free(info->name); + if (info->content_info) free(info->content_info); + if (info->icon) free(info->icon); + if (info) free(info); + } + + db_finalize(st); + + return list; +} + + + +HAPI void all_apps_db_unretrieve_info(db_info *info) +{ + ret_if(NULL == info); + if (info->appid) free(info->appid); + if (info->name) free(info->name); + if (info->content_info) free(info->content_info); + if (info->icon) free(info->icon); + if (info) free(info); +} + + + +HAPI void all_apps_db_unretrieve_all_info(Eina_List *list) +{ + db_info *info = NULL; + + EINA_LIST_FREE(list, info) { + if (NULL == info) break; + if (info->appid) free(info->appid); + if (info->name) free(info->name); + if (info->content_info) free(info->content_info); + if (info->icon) free(info->icon); + if (info) free(info); + } + + eina_list_free(list); +} + + + +HAPI int all_apps_db_count_shortcut(const char *appid, const char *name) +{ + retv_if(MENU_SCREEN_ERROR_OK != db_open(MENU_SCREEN_DB_FILE), -1); + + char q[QUERY_LEN]; + snprintf(q, sizeof(q), QUERY_COUNT_SHORTCUT, appid, name); + + stmt_h *st; + st = db_prepare(q); + retv_if(NULL == st, -1); + + menu_screen_error_e ret = MENU_SCREEN_ERROR_FAIL; + ret = db_next(st); + retv_if(MENU_SCREEN_ERROR_FAIL == ret, -1); + + int count = -1; + count = db_get_int(st, 0); + + db_finalize(st); + + return count; +} + + + +HAPI long long all_apps_db_insert_shortcut(const char *appid, const char *name, int type, const char *content_info, const char *icon) +{ + char q[QUERY_LEN]; + + retv_if(MENU_SCREEN_ERROR_OK != db_open(MENU_SCREEN_DB_FILE), -1l); + + snprintf(q, sizeof(q), QUERY_INSERT_SHORTCUT, appid, name, type, content_info, icon); + retv_if(db_exec(q) < 0, -1l); + + long long id = -1l; + id = db_last_insert_rowid(); + + return id; +} + + + +HAPI menu_screen_error_e all_apps_db_delete_shortcut(long long rowid) +{ + char q[QUERY_LEN]; + + retv_if(MENU_SCREEN_ERROR_OK != db_open(MENU_SCREEN_DB_FILE), MENU_SCREEN_ERROR_FAIL); + + snprintf(q, sizeof(q), QUERY_DELETE_SHORTCUT, rowid); + retv_if(db_exec(q) < 0, MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; +} + + + +// END diff --git a/src/all_apps/layout.c b/src/all_apps/layout.c new file mode 100644 index 0000000..7182481 --- /dev/null +++ b/src/all_apps/layout.c @@ -0,0 +1,420 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include + +#include "menu_screen.h" +#include "conf.h" +#include "index.h" +#include "item_event.h" +#include "key.h" +#include "layout.h" +#include "list.h" +#include "page_scroller.h" +#include "popup.h" +#include "util.h" +#include "all_apps/layout.h" +#include "all_apps/list.h" +#include "all_apps/shortcut.h" + +#define ALL_APPS_EDJE_PORTRAIT EDJEDIR"/all_apps_portrait.edj" +#define ALL_APPS_GROUP "all_apps" + +#define GROUP_4X4_EDJE_PORTRAIT EDJEDIR"/group_4x4_portrait.edj"; + +#define ALL_APPS_EDIT_BUTTON_EDJE EDJEDIR"/button_edit.edj" +#define ALL_APPS_EDIT_BUTTON_GROUP "button_edit" +#define ALL_APPS_EDIT_BUTTON_PART "button_edit" + +#define IDS_HS_BUTTON_DONE "IDS_HS_BUTTON_DONE" + + + +HAPI bool all_apps_layout_is_edited(Evas_Object *all_apps) +{ + retv_if(NULL == all_apps, false); + return (bool) evas_object_data_get(all_apps, "is_edited"); +} + + + +HAPI void all_apps_layout_edit(Evas_Object *all_apps) +{ + Evas_Object *edit_button; + Evas_Object *scroller; + + //elm_object_tree_focus_allow_set(all_apps, EINA_FALSE); + evas_object_data_set(all_apps, "is_edited", (void *) true); + + edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART); + ret_if(NULL == edit_button); + elm_object_signal_emit(edit_button, "edit_button_state,edit", "menu"); + + scroller = elm_object_part_content_get(all_apps, "content"); + ret_if(NULL == scroller); + page_scroller_edit(scroller); + + key_grab_home(); +} + + + +HAPI void all_apps_layout_unedit(Evas_Object *all_apps) +{ + Evas_Object *edit_button; + + ret_if(NULL == all_apps); + + //elm_object_tree_focus_allow_set(all_apps, EINA_TRUE); + key_ungrab_home(); + popup_destroy_all(); + + bool is_edited = (bool) evas_object_data_get(all_apps, "is_edited"); + if (false == is_edited) return; + + do { + edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART); + ret_if(NULL == edit_button); + elm_object_signal_emit(edit_button, "edit_button_state,unedit", "menu"); + } while (0); + + do { + Evas_Object *scroller; + + scroller = elm_object_part_content_get(all_apps, "content"); + ret_if(NULL == scroller); + + page_scroller_unedit(scroller); + } while (0); +} + + + +static char *_access_info_cb(void *data, Evas_Object *obj) +{ + Evas_Object *scroller = data; + + char *info; + if (page_scroller_is_edited(scroller)) { + info = _(IDS_HS_BUTTON_DONE); + } else { + info = ACCESS_EDIT; + } + + char *tmp; + tmp = strdup(info); + if (!tmp) return NULL; + return tmp; +} + + + +static void _focus_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *scroller = data; + + _D("Edit button is up"); + + Evas_Object *all_apps; + all_apps = evas_object_data_get(scroller, "tab"); + ret_if(NULL == all_apps); + + if (page_scroller_is_edited(scroller)) { + _D("Go to the normal mode"); + all_apps_layout_unedit(all_apps); + } else { + _D("Go to the edit mode"); + all_apps_layout_edit(all_apps); + } + + elm_object_signal_emit(obj, "edit_button,release", "menu"); +} + + + + +static void _edit_button_down_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + _D("Edit button is down"); +} + + + +static void _edit_button_up_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + _D("Edit button is up"); + + elm_object_signal_emit(obj, "edit_button,release", "menu"); +} + + + +static Evas_Object *_add_edit_button(Evas_Object *parent, Evas_Object *scroller) +{ + Evas_Object *button; + + retv_if(NULL == parent, NULL); + retv_if(NULL == scroller, NULL); + + button = layout_load_edj(parent, ALL_APPS_EDIT_BUTTON_EDJE, ALL_APPS_EDIT_BUTTON_GROUP); + retv_if(NULL == button, NULL); + + edje_object_signal_callback_add(_EDJ(button), "edit_button,down", "menu", _edit_button_down_cb, scroller); + edje_object_signal_callback_add(_EDJ(button), "edit_button,up", "menu", _edit_button_up_cb, scroller); + + do { // focus + Evas_Object *focus= NULL; + focus = elm_button_add(button); + retv_if(NULL == focus, NULL); + + elm_object_style_set(focus, "focus"); + elm_object_part_content_set(button, "focus", focus); + elm_access_info_cb_set(focus, ELM_ACCESS_INFO, _access_info_cb, scroller); + evas_object_smart_callback_add(focus, "clicked", _focus_clicked_cb, scroller); + } while (0); + + return button; +} + + + +static void _remove_edit_button(Evas_Object *button) +{ + ret_if(NULL == button); + + do { + Evas_Object *focus = NULL; + focus = elm_object_part_content_unset(button, "focus"); + if (NULL == focus) break; + evas_object_smart_callback_del(focus, "clicked", _focus_clicked_cb); + evas_object_del(focus); + } while (0); + + edje_object_signal_callback_del(_EDJ(button), "edit_button,down", "menu", _edit_button_down_cb); + edje_object_signal_callback_del(_EDJ(button), "edit_button,up", "menu", _edit_button_up_cb); + + layout_unload_edj(button); +} + + + +static menu_screen_error_e _load_item(Evas_Object *scroller, app_list_item *item) +{ + app_info_t *ai; + + retv_if(NULL == item, MENU_SCREEN_ERROR_FAIL); + ai = item->data; + if (ai->nodisplay || !ai->enabled) { + return MENU_SCREEN_ERROR_OK; + } + + retv_if(NULL == page_scroller_push_item(scroller, ai), MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; + +} + + + +static Eina_Bool _push_items_idler_cb(void *all_apps) +{ + bool flag = true; + app_list *list; + app_list_item *item; + Evas_Object *scroller; + + list = evas_object_data_get(all_apps, "list"); + scroller = evas_object_data_get(all_apps, "scroller"); + + retv_if(NULL == list, ECORE_CALLBACK_CANCEL); + goto_if(NULL == scroller, ERROR); + goto_if(MENU_SCREEN_ERROR_OK != list_is_ended(list, &flag), ERROR); + goto_if(flag == true, ERROR); + goto_if(MENU_SCREEN_ERROR_OK != list_get_item(list, &item), ERROR); + goto_if(MENU_SCREEN_ERROR_OK != _load_item(scroller, item), ERROR); + goto_if(MENU_SCREEN_ERROR_OK != list_next(list), ERROR); + + return ECORE_CALLBACK_RENEW; + +ERROR: + all_apps_list_destroy(list); + evas_object_data_del(all_apps, "list"); + page_scroller_bring_in(scroller, 0); + page_scroller_focus(scroller); + menu_screen_set_done(true); + + return ECORE_CALLBACK_CANCEL; +} + + + +static menu_screen_error_e _push_items(Evas_Object *all_apps) +{ + app_list *list; + Ecore_Idler *idle_timer; + + list = all_apps_list_create(); + retv_if(MENU_SCREEN_ERROR_OK != list_first(list), MENU_SCREEN_ERROR_FAIL); + + evas_object_data_set(all_apps, "list", list); + idle_timer = ecore_idler_add(_push_items_idler_cb, all_apps); + retv_if(NULL == idle_timer, MENU_SCREEN_ERROR_FAIL); + + Evas_Object *scroller; + scroller = evas_object_data_get(all_apps, "scroller"); + if (MENU_SCREEN_ERROR_OK != all_apps_shortcut_add_all(scroller)) + _E("Cannot add shortcuts"); + + do { + Evas_Object *button; + button = _add_edit_button(all_apps, scroller); + if (NULL == button) { + _D("cannot make the edit button"); + } + elm_object_part_content_set(all_apps, ALL_APPS_EDIT_BUTTON_PART, button); + } while (0); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate) +{ + Evas_Object *all_apps; + Evas_Object *index; + Evas_Object *scroller; + + static const char item_edje[] = EDJEDIR"/item_4x4.edj"; + static const char *page_edje; + static const char *all_apps_edje; + int item_width, item_height; + int width; + int height; + + all_apps = elm_layout_add(controlbar); + retv_if(NULL == all_apps, NULL); + + all_apps_edje = ALL_APPS_EDJE_PORTRAIT; + page_edje = GROUP_4X4_EDJE_PORTRAIT; + width = menu_screen_get_root_width(); + height = menu_screen_get_root_height() - INDEX_HEIGHT; + + item_width = ITEM_WIDTH_PROP * menu_screen_get_root_width(); + item_height = ITEM_HEIGHT_PROP * menu_screen_get_root_height(); + + if (EINA_FALSE == elm_layout_file_set(all_apps, all_apps_edje, ALL_APPS_GROUP)) { + evas_object_del(all_apps); + _E("cannot load layout"); + return NULL; + } + + evas_object_data_set(all_apps, "win", evas_object_data_get(controlbar, "win")); + evas_object_data_set(all_apps, "layout", evas_object_data_get(controlbar, "layout")); + evas_object_data_set(all_apps, "controlbar", controlbar); + evas_object_data_set(all_apps, "page_edje", (void *) page_edje); + evas_object_data_set(all_apps, "page_max_app", (void *) PAGE_MAX_APP); + evas_object_data_set(all_apps, "item_edje", (void *) item_edje); + evas_object_data_set(all_apps, "item_width", (void *) item_width); + evas_object_data_set(all_apps, "item_height", (void *) item_height); + evas_object_data_set(all_apps, "item_enable_long_press", (void *) true); + evas_object_data_set(all_apps, "item_text_dual_line", (void *) true); + evas_object_data_set(all_apps, "is_under_pkgmgr", (void *) true); + evas_object_data_set(all_apps, "rotate", (void *) rotate); + evas_object_data_set(all_apps, "enable_bg_image", (void *) true); + evas_object_data_set(all_apps, "is_edited", (void *) true); + evas_object_size_hint_min_set(all_apps, width, height); + evas_object_size_hint_max_set(all_apps, width, height); + evas_object_resize(all_apps, width, height); + + index = index_create(all_apps, 0, 0); + if (NULL == index) { + evas_object_del(all_apps); + _E("cannot create index."); + return NULL; + } + elm_object_part_content_set(all_apps, "index", index); + evas_object_data_set(all_apps, "index", index); + + scroller = page_scroller_create(all_apps, index, PAGE_SCROLLER_SORT_BY_PACKAGE, rotate); + if (NULL == scroller) { + evas_object_del(all_apps); + index_destroy(index); + _E("cannot create scroller."); + return NULL; + } + + elm_object_part_content_set(all_apps, "content", scroller); + evas_object_data_set(all_apps, "scroller", scroller); + if (!all_apps_shortcut_init(all_apps)) _E("Cannot initialize shortcut"); + retv_if(MENU_SCREEN_ERROR_FAIL == _push_items(all_apps), NULL); + + return all_apps; +} + + + +HAPI void all_apps_layout_destroy(Evas_Object *all_apps) +{ + Evas_Object *index; + Evas_Object *scroller; + + ret_if(NULL == all_apps); + + all_apps_shortcut_fini(); + + do { + Evas_Object *button; + if(all_apps) { + button = elm_object_part_content_unset(all_apps, ALL_APPS_EDIT_BUTTON_PART); + _remove_edit_button(button); + } else { + _D("cannot find the all_apps object"); + } + } while (0); + + scroller = evas_object_data_get(all_apps, "scroller"); + ret_if(NULL == scroller); + if (scroller) page_scroller_destroy(scroller); + + index = evas_object_data_get(scroller, "index"); + if (index) index_destroy(index); + + evas_object_data_del(all_apps, "win"); + evas_object_data_del(all_apps, "layout"); + evas_object_data_del(all_apps, "controlbar"); + evas_object_data_del(all_apps, "index"); + evas_object_data_del(all_apps, "scroller"); + evas_object_data_del(all_apps, "page_edje"); + evas_object_data_del(all_apps, "page_max_app"); + evas_object_data_del(all_apps, "item_edje"); + evas_object_data_del(all_apps, "item_width"); + evas_object_data_del(all_apps, "item_height"); + evas_object_data_del(all_apps, "item_enable_long_press"); + evas_object_data_del(all_apps, "item_text_dual_line"); + evas_object_data_del(all_apps, "is_under_pkgmgr"); + evas_object_data_del(all_apps, "rotate"); + evas_object_data_del(all_apps, "enable_bg_image"); + evas_object_data_del(all_apps, "is_edited"); + + evas_object_del(all_apps); +} + + + +// End of a file diff --git a/src/all_apps/list.c b/src/all_apps/list.c new file mode 100644 index 0000000..ee06cfc --- /dev/null +++ b/src/all_apps/list.c @@ -0,0 +1,149 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include + +#include "menu_screen.h" +#include "conf.h" +#include "list.h" + + + +static ail_cb_ret_e _all_apps_cb(ail_appinfo_h ai, void *data) +{ + app_list *list = data; + app_list_item *item; + char *value; + + retv_if(ail_appinfo_get_str(ai, AIL_PROP_PACKAGE_STR, &value) == AIL_ERROR_FAIL, AIL_CB_RET_CANCEL); + retv_if(NULL == (item = calloc(1, sizeof(struct _app_list_item))), AIL_CB_RET_CANCEL); + + if (NULL == (item->package = strdup(value))) { + free(item); + return AIL_CB_RET_CANCEL; + } + + if (NULL == (item->data = calloc(1, sizeof(app_info_t)))) { + free(item->package); + free(item); + return AIL_CB_RET_CANCEL; + } + + if (MENU_SCREEN_ERROR_OK != list_get_values(item->package, item->data)) { + free(item->data); + free(item->package); + free(item); + return AIL_CB_RET_CANCEL; + } + + if (list_append_item(list, item) != MENU_SCREEN_ERROR_OK) { + free(item->data); + free(item->package); + free(item); + return AIL_CB_RET_CANCEL; + } + + _D("[ALL Apps] package=%s", item->package); + + return AIL_CB_RET_CONTINUE; +} + + + +static int _all_apps_sort_cb(const void *d1, const void *d2) +{ + app_info_t *ai[2]; + app_list_item *item[2]; + + retv_if(NULL == d1, 0); + retv_if(NULL == d2, 0); + + item[0] = (app_list_item *) d1; + item[1] = (app_list_item *) d2; + + ai[0] = item[0]->data; + ai[1] = item[1]->data; + + return strcmp(ai[0]->name, ai[1]->name); +} + + + +HAPI app_list *all_apps_list_create(void) +{ + int count = 0; + app_list *list; + ail_filter_h f; + + list = calloc(1, sizeof(app_list)); + retv_if(NULL == list, NULL); + + if (ail_filter_new(&f) != AIL_ERROR_OK) { + free(list); + return NULL; + } + + if (ail_filter_add_bool(f, AIL_PROP_NODISPLAY_BOOL, false) != AIL_ERROR_OK){ + _E("Failed to add filter"); + ail_filter_destroy(f); + free(list); + return NULL; + } + + ail_filter_list_appinfo_foreach(f, _all_apps_cb, list); + ail_filter_destroy(f); + + if(MENU_SCREEN_ERROR_FAIL == list_sort(list, _all_apps_sort_cb)) { + _D("Cannot sort apps."); + } + + if(MENU_SCREEN_ERROR_FAIL == list_count(list, &count)) { + _D("Cannot count apps."); + } + _D("Total package count = %d", count); + + return list; +} + + + +HAPI void all_apps_list_destroy(app_list *list) +{ + app_list_item *item; + + ret_if(NULL == list); + ret_if(NULL == list->list); + + EINA_LIST_FREE(list->list, item) { + if (NULL == item) break; + if (item->package) free(item->package); + if (item->data) { + list_free_values(item->data); + free(item->data); + } + free(item); + } + + eina_list_free(list->list); + free(list); +} + + + +// End of a file diff --git a/src/all_apps/shortcut.c b/src/all_apps/shortcut.c new file mode 100644 index 0000000..fff1a61 --- /dev/null +++ b/src/all_apps/shortcut.c @@ -0,0 +1,236 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include + +#include "item.h" +#include "list.h" +#include "page_scroller.h" +#include "util.h" +#include "all_apps/db.h" + + + +HAPI Evas_Object *all_apps_shortcut_add( + Evas_Object *scroller, + long long rowid, + const char *pkgname, + const char *exec, + const char *name, + const char *content_info, + const char *icon, + int type) +{ + _D("Shortcut : pkgname(%s) exec(%s) name(%s) icon(%s)", pkgname, exec, name, icon); + + app_info_t ai = {0, }; + ai.package = (char *) pkgname; + ai.exec = (char *) exec; + ai.name = (char *) name; + ai.icon = (char *) icon; + ai.nodisplay = 0; + ai.enabled = 1; + ai.x_slp_removable = 1; + ai.x_slp_taskmanage = 0; + + if (ADD_TO_HOME_IS_LIVEBOX(type)) { + _D("This is a livebox"); + return NULL; + } + + Evas_Object *item = NULL; + retv_if(NULL == (item = page_scroller_push_item(scroller, &ai)), NULL); + + long long *tmp; + tmp = calloc(1, sizeof(long long)); + if (NULL == tmp) { + item_destroy(item); + return NULL; + } + + if (LAUNCH_BY_PACKAGE == type) { + _D("This is a package"); + evas_object_data_set(item, "shortcut_launch_package", (void *) true); + } else { + _D("This is a shortcut"); + evas_object_data_set(item, "shortcut_launch_package", (void *) false); + } + + *tmp = rowid; + evas_object_data_set(item, "is_shortcut", (void *) true); + evas_object_data_set(item, "rowid", tmp); + evas_object_data_set(item, "type", (void *) type); + evas_object_data_set(item, "content_info", content_info); + + return item; +} + + + +static Eina_Bool _push_items_idler_cb(void *data) +{ + Evas_Object *scroller = data; + Eina_List *list = evas_object_data_get(scroller, "list"); + Eina_List *n; + Eina_List *t; + db_info *info = NULL; + EINA_LIST_FOREACH_SAFE(list, n, t, info) { + goto_if(NULL == info, ERROR); + Evas_Object *item = NULL; + item = all_apps_shortcut_add( + scroller, + info->rowid, + info->appid, + NULL, + info->name, + info->content_info, + info->icon, + info->type); + + list = eina_list_remove(list, info); + evas_object_data_set(scroller, "list", list); + + all_apps_db_unretrieve_info(info); + break_if(NULL == item); + } + + return ECORE_CALLBACK_RENEW; +ERROR: + list = evas_object_data_del(scroller, "list"); + all_apps_db_unretrieve_all_info(list); + return ECORE_CALLBACK_CANCEL; +} + + + +HAPI menu_screen_error_e all_apps_shortcut_add_all(Evas_Object *scroller) +{ + Eina_List *list; + + list = all_apps_db_retrieve_all_info(); + if (NULL == list) { + _D("There is no shortcut"); + return MENU_SCREEN_ERROR_OK; + } + + evas_object_data_set(scroller, "list", list); + + Ecore_Idler *idle_timer = NULL; + idle_timer = ecore_idler_add(_push_items_idler_cb, scroller); + retv_if(NULL == idle_timer, MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI void all_apps_shortcut_remove(Evas_Object *item) +{ + long long *tmp; + tmp = evas_object_data_del(item, "rowid"); + if (tmp) { + all_apps_db_delete_shortcut(*tmp); + free(tmp); + } + + Evas_Object *scroller; + scroller = evas_object_data_get(item, "scroller"); + + evas_object_data_del(item, "type"); + evas_object_data_del(item, "content_info"); + evas_object_data_del(item, "shortcut_launch_package"); + evas_object_data_del(item, "is_shortcut"); + item_destroy(item); + + if (scroller) page_scroller_trim_items(scroller); +} + + + +static int _shorcut_request_cb( + const char *pkgname, + const char *name, + int type, + const char *content_info, + const char *icon, + int pid, + double period, + int allow_duplicate, + void *data) +{ + Evas_Object *scroller = data; + + retv_if(NULL == pkgname, -1); + + _D("Package name: %s", pkgname); + _D("Name: %s", name); + _D("Type: %d", type); + _D("Content: %s", content_info); + _D("Icon: %s", icon); + _D("Requested from: %d", pid); + _D("period : %.2f", period); + _D("CBDATA: %p", data); + + if (!allow_duplicate) { + int count = 0; + count = all_apps_db_count_shortcut(pkgname, name); + if (0 < count) { + _D("There is already a package(%s:%s) in the Menu-screen", pkgname, name); + return -1; + } + } + + long long rowid = -1l; + rowid = all_apps_db_insert_shortcut(pkgname, name, type, content_info, icon); + retv_if(0l > rowid, -1); + + Evas_Object *item = NULL; + item = all_apps_shortcut_add(scroller, rowid, pkgname, NULL, name, content_info, icon, type); + retv_if(NULL == item, -1); + + return 0; +} + + + +HAPI bool all_apps_shortcut_init(Evas_Object *all_apps) +{ + retv_if(NULL == all_apps, false); + retv_if(MENU_SCREEN_ERROR_OK != all_apps_db_init(), false); + + Evas_Object *scroller; + scroller = evas_object_data_get(all_apps, "scroller"); + retv_if(NULL == scroller, false); + + int ret; + ret = shortcut_set_request_cb(_shorcut_request_cb, scroller); + + return 0 == ret ? true : false; +} + + + +HAPI void all_apps_shortcut_fini(void) +{ + all_apps_db_fini(); +} + + + +// End of file. diff --git a/src/db.c b/src/db.c new file mode 100644 index 0000000..58a489c --- /dev/null +++ b/src/db.c @@ -0,0 +1,316 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include +#include +#include + +#include "util.h" +#include "db.h" + + + +#define retv_with_dbmsg_if(expr, val) do { \ + if (expr) { \ + _E("%s", sqlite3_errmsg(db_info.db)); \ + return (val); \ + } \ +} while (0) + + + +static struct { + sqlite3 *db; +} db_info = { + .db = NULL, +}; + +struct stmt { + sqlite3_stmt *stmt; +}; + + + +HAPI menu_screen_error_e db_open(const char *db_file) +{ + int ret; + + retv_if(NULL == db_file, MENU_SCREEN_ERROR_INVALID_PARAMETER); + if (db_info.db) { + return MENU_SCREEN_ERROR_OK; + } + + ret = db_util_open(db_file, &db_info.db, DB_UTIL_REGISTER_HOOK_METHOD); + retv_with_dbmsg_if(ret != SQLITE_OK, MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI stmt_h *db_prepare(const char *query) +{ + int ret; + stmt_h *handle; + + retv_if(NULL == query, NULL); + + handle = calloc(1, sizeof(stmt_h)); + retv_if(NULL == handle, NULL); + + ret = sqlite3_prepare_v2(db_info.db, query, strlen(query), &(handle->stmt), NULL); + if (ret != SQLITE_OK) { + free(handle); + _E("%s", sqlite3_errmsg(db_info.db)); + return NULL; + } + + return handle; +} + + + +HAPI menu_screen_error_e db_bind_bool(stmt_h *handle, int idx, bool value) +{ + int ret; + + retv_if(NULL == handle, MENU_SCREEN_ERROR_FAIL); + + ret = sqlite3_bind_int(handle->stmt, idx, (int) value); + retv_with_dbmsg_if(ret != SQLITE_OK, MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e db_bind_int(stmt_h *handle, int idx, int value) +{ + int ret; + + retv_if(NULL == handle, MENU_SCREEN_ERROR_FAIL); + + ret = sqlite3_bind_int(handle->stmt, idx, value); + retv_with_dbmsg_if(ret != SQLITE_OK, MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e db_bind_str(stmt_h *handle, int idx, const char *str) +{ + int ret; + + retv_if(NULL == handle, MENU_SCREEN_ERROR_FAIL); + + ret = sqlite3_bind_text(handle->stmt, idx, str, strlen(str), SQLITE_TRANSIENT); + retv_with_dbmsg_if(ret != SQLITE_OK, MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e db_next(stmt_h *handle) +{ + int ret; + + retv_if(NULL == handle, MENU_SCREEN_ERROR_FAIL); + + ret = sqlite3_step(handle->stmt); + switch (ret) { + case SQLITE_ROW: + return MENU_SCREEN_ERROR_OK; + case SQLITE_DONE: + return MENU_SCREEN_ERROR_NO_DATA; + default: + retv_with_dbmsg_if(1, MENU_SCREEN_ERROR_FAIL); + } +} + + + +HAPI bool db_get_bool(stmt_h *handle, int index) +{ + retv_if(NULL == handle, false); + return (bool) sqlite3_column_int(handle->stmt, index); +} + + + +HAPI int db_get_int(stmt_h *handle, int index) +{ + retv_if(NULL == handle, 0); + return sqlite3_column_int(handle->stmt, index); +} + + + +HAPI long long db_get_long_long(stmt_h *handle, int index) +{ + retv_if(NULL == handle, 0l); + return sqlite3_column_int64(handle->stmt, index); +} + + +HAPI const char *db_get_str(stmt_h *handle, int index) +{ + retv_if(NULL == handle, NULL); + return (const char *) sqlite3_column_text(handle->stmt, index); +} + + + +HAPI menu_screen_error_e db_reset(stmt_h *handle) +{ + int ret; + + retv_if(NULL == handle, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == handle->stmt, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + ret = sqlite3_reset(handle->stmt); + retv_with_dbmsg_if(ret != SQLITE_OK, MENU_SCREEN_ERROR_FAIL); + + sqlite3_clear_bindings(handle->stmt); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e db_finalize(stmt_h *handle) +{ + int ret; + + retv_if(NULL == handle, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == handle->stmt, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + ret = sqlite3_finalize(handle->stmt); + retv_with_dbmsg_if(ret != SQLITE_OK, MENU_SCREEN_ERROR_FAIL); + free(handle); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI long long db_last_insert_rowid(void) +{ + retv_if(NULL == db_info.db, -1l); + + long long rowid = sqlite3_last_insert_rowid(db_info.db); + + return rowid; +} + + + +HAPI menu_screen_error_e db_exec(const char *query) +{ + int ret; + char *errmsg; + + retv_if(NULL == query, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == db_info.db, MENU_SCREEN_ERROR_FAIL); + + ret = sqlite3_exec(db_info.db, query, NULL, NULL, &errmsg); + if (ret != SQLITE_OK) { + _E("Cannot execute this query - %s. because %s", + query, errmsg? errmsg:"uncatched error"); + sqlite3_free(errmsg); + return MENU_SCREEN_ERROR_FAIL; + } + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI void db_close(void) +{ + ret_if(!db_info.db); + sqlite3_close(db_info.db); + db_info.db = NULL; +} + + + +HAPI menu_screen_error_e db_begin_transaction(void) +{ + int ret = -1; + + ret = sqlite3_exec(db_info.db, "BEGIN IMMEDIATE TRANSACTION", NULL, NULL, NULL); + + while (SQLITE_BUSY == ret) { + sleep(1); + ret = sqlite3_exec(db_info.db, "BEGIN IMMEDIATE TRANSACTION", NULL, NULL, NULL); + } + + if (SQLITE_OK != ret) { + _E("sqlite3_exec() Failed(%d)", ret); + return MENU_SCREEN_ERROR_FAIL; + } + + return MENU_SCREEN_ERROR_OK; +} + + + +#define MENU_SCREEN_COMMIT_TRY_MAX 3 +HAPI menu_screen_error_e db_end_transaction(bool success) +{ + int ret = -1; + int i = 0; + char *errmsg = NULL; + + if (success) { + ret = sqlite3_exec(db_info.db, "COMMIT TRANSACTION", NULL, NULL, &errmsg); + if (SQLITE_OK != ret) { + _E("sqlite3_exec(COMMIT) Failed(%d, %s)", ret, errmsg); + sqlite3_free(errmsg); + + while (SQLITE_BUSY == ret && i < MENU_SCREEN_COMMIT_TRY_MAX) { + i++; + sleep(1); + ret = sqlite3_exec(db_info.db, "COMMIT TRANSACTION", NULL, NULL, NULL); + } + + if (SQLITE_OK != ret) { + _E("sqlite3_exec() Failed(%d)", ret); + ret = sqlite3_exec(db_info.db, "ROLLBACK TRANSACTION", NULL, NULL, NULL); + if (SQLITE_OK != ret) { + _E("sqlite3_exec() Failed(%d)", ret); + } + + return MENU_SCREEN_ERROR_FAIL; + } + } + } else { + sqlite3_exec(db_info.db, "ROLLBACK TRANSACTION", NULL, NULL, NULL); + } + + return MENU_SCREEN_ERROR_OK; +} + + + +// End of file. diff --git a/src/index.c b/src/index.c new file mode 100644 index 0000000..fb21705 --- /dev/null +++ b/src/index.c @@ -0,0 +1,145 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include + +#include "conf.h" +#include "util.h" +#include "page.h" +#include "layout.h" +#include "menu_screen.h" + +#define PAGE_CONTROLLER_GROUP_NAME "index" + + + +HAPI inline void index_bring_in(Evas_Object *index, int idx) +{ + Elm_Object_Item *idx_it; + + idx_it = elm_index_item_find(index, (void *) idx); + ret_if(NULL == idx_it); + elm_index_item_selected_set(idx_it, EINA_TRUE); +} + + + +HAPI void index_destroy(Evas_Object *index) +{ + ret_if(NULL == index); + + evas_object_data_del(index, "win"); + evas_object_data_del(index, "layout"); + evas_object_data_del(index, "controlbar"); + evas_object_data_del(index, "tab"); + evas_object_data_del(index, "count"); + elm_index_item_clear(index); + evas_object_del(index); +} + + + +HAPI Evas_Object *index_create(Evas_Object *tab, unsigned int count, unsigned int current_idx) +{ + Evas_Object *index; + Evas_Object *scroller; + register int i; + char *number; + + retv_if(NULL == tab, NULL); + index = elm_index_add(tab); + retv_if(NULL == index, NULL); + + elm_object_theme_set(index, menu_screen_get_theme()); + elm_object_style_set(index, "menuscreen/index"); + elm_index_horizontal_set(index, EINA_TRUE); + elm_index_autohide_disabled_set(index, EINA_TRUE); + + number = malloc(((size_t) log10((double) MAX_PAGE_NO)) + 2); + retv_if(NULL == number, NULL); + + for (i = 0; i < count; i++) { + sprintf(number, "%d", i + 1); + elm_index_item_append(index, number, NULL, (void *) i); + } + elm_index_level_go(index, 0); + + if (count > 0) { + index_bring_in(index, current_idx); + } + + elm_object_part_content_set(tab, PAGE_CONTROLLER_GROUP_NAME, index); + + // FIXME : This part will be removed when fixing Elementary API for index_update. + scroller = evas_object_data_get(tab, "scroller"); + if (scroller) { + evas_object_data_set(scroller, "index", index); + } + + evas_object_data_set(index, "win", evas_object_data_get(tab, "win")); + evas_object_data_set(index, "layout", evas_object_data_get(tab, "layout")); + evas_object_data_set(index, "controlbar", evas_object_data_get(tab, "controlbar")); + evas_object_data_set(index, "tab", tab); + evas_object_data_set(index, "count", (void *) count); + + evas_object_data_set(tab, "index", index); + _D("COUNT:%d", count); + + evas_object_show(index); + free(number); + + return index; +} + + + +HAPI Evas_Object *index_update(Evas_Object *layout, Evas_Object *index, unsigned int count) +{ + int idx = 0; + + int cur_count = (int) evas_object_data_get(index, "count"); + if (cur_count > 0) { + Elm_Object_Item *idx_it = elm_index_selected_item_get(index, 0); + if (idx_it) idx = (int) elm_object_item_data_get(idx_it); + } + + if(count == idx) idx--; + if(idx == -1) idx = 0; + + _D("Current index %d, Current count: %d", idx,count); + index_destroy(index); + return index_create(layout, count,idx); +} + + + +HAPI void index_hide(Evas_Object *index) +{ + edje_object_signal_emit(_EDJ(index), "hide", "index"); +} + + + +HAPI void index_show(Evas_Object *index) +{ + edje_object_signal_emit(_EDJ(index), "show", "index"); +} + + + +// End of the file diff --git a/src/item.c b/src/item.c new file mode 100644 index 0000000..b29b03d --- /dev/null +++ b/src/item.c @@ -0,0 +1,981 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include +#include + +#include "menu_screen.h" +#include "item_badge.h" +#include "conf.h" +#include "item.h" +#include "item_event.h" +#include "layout.h" +#include "list.h" +#include "mapbuf.h" +#include "page.h" +#include "page_scroller.h" +#include "pkgmgr.h" +#include "popup.h" +#include "util.h" + +#define LINE_SIZE 10 +#define LAYOUT_BLOCK_INTERVAL 1.0 +#define ITEM_GROUP_NAME "icon" + +#define STR_ATTRIBUTE_NAME "name" +#define STR_ATTRIBUTE_ICON "icon" +#define STR_ATTRIBUTE_PKG_NAME "package" +#define STR_ATTRIBUTE_REMOVABLE "removable" +#define STR_ATTRIBUTE_DESKTOP "desktop" +#define STR_ATTRIBUTE_TYPE "type" +#define STR_ATTRIBUTE_PAGE "pending,page" +#define STR_ICON_IMAGE_TYPE_OBJECT "object" +#define STR_ICON_IMAGE_TYPE_EDJE "edje" + +#define BUFSZE 1024 + + + +HAPI void item_set_icon(Evas_Object *edje, char *icon, int sync) +{ + char *tmp; + int changed; + + tmp = evas_object_data_get(edje, STR_ATTRIBUTE_ICON); + changed = (tmp && icon) ? strcmp(icon, tmp) : 1; + + if (!changed) { + return; + } + + free(tmp); + evas_object_data_del(edje, STR_ATTRIBUTE_ICON); + if (icon) { + tmp = strdup(icon); + if (tmp) { + evas_object_data_set(edje, STR_ATTRIBUTE_ICON, tmp); + }else { + _E("No more memory for allocating space \"%s\"", icon); + } + } +} + + + +HAPI char *item_get_icon(Evas_Object *edje) +{ + return evas_object_data_get(edje, STR_ATTRIBUTE_ICON); +} + + + +HAPI void item_set_name(Evas_Object *edje, char *name, int sync) +{ + char *tmp; + int changed; + + tmp = evas_object_data_get(edje, STR_ATTRIBUTE_NAME); + if (!(tmp||name)) return; + changed = (tmp && name) ? strcmp(name, tmp) : 1; + + if (!changed) { + return; + } + + if (tmp) free(tmp); + evas_object_data_del(edje, STR_ATTRIBUTE_NAME); + if (name && (strcmp(name, "(NULL)"))) { + tmp = strdup(name); + ret_if(NULL == tmp); + evas_object_data_set(edje, STR_ATTRIBUTE_NAME, tmp); + if (edje_object_part_text_set(_EDJ(edje), "txt", tmp) == EINA_FALSE){ + //_E("Failed to set text on the part"); + } + } +} + + + +HAPI inline char *item_get_name(Evas_Object *edje) +{ + return evas_object_data_get(edje, STR_ATTRIBUTE_NAME); +} + + + +HAPI void item_set_desktop(Evas_Object *edje, char *name, int sync) +{ + char *tmp; + int changed; + + tmp = evas_object_data_get(edje, STR_ATTRIBUTE_DESKTOP); + changed = (tmp && name) ? strcmp(name, tmp) : 1; // We have to do sync when an attribute is created + + if (!changed) { + return; + } + + free(tmp); // NOTE: I can accept this, "free" will not do anything for NULL + evas_object_data_del(edje, STR_ATTRIBUTE_DESKTOP); + if (name) { + tmp = strdup(name); + if (!tmp) { + _E("No more memory for allocating space \"%s\"", name); + } else { + evas_object_data_set(edje, STR_ATTRIBUTE_DESKTOP, tmp); + } + } +} + + + +HAPI inline char *item_get_desktop(Evas_Object *edje) +{ + return evas_object_data_get(edje, STR_ATTRIBUTE_DESKTOP); +} + + + +HAPI void item_set_type(Evas_Object *edje, int type, int sync) +{ + int tmp; + int changed; + + tmp = (int) evas_object_data_get(edje, STR_ATTRIBUTE_TYPE); + changed = (tmp == type ? 0 : 1); // We have to do sync when an attribute is created + + if (!changed) { + return ; + } + + evas_object_data_set(edje, STR_ATTRIBUTE_TYPE, (void *) type); +} + + + +HAPI inline int item_get_type(Evas_Object *edje) +{ + return (int) evas_object_data_get(edje, STR_ATTRIBUTE_TYPE); +} + + + +HAPI void item_set_package(Evas_Object *edje, char *package, int sync) +{ + char *tmp; + int changed; + + tmp = evas_object_data_get(edje, STR_ATTRIBUTE_PKG_NAME); + changed = (package && tmp) ? strcmp(tmp, package) : 1; + + if (!changed) { + return; + } + + free(tmp); + evas_object_data_del(edje, STR_ATTRIBUTE_PKG_NAME); + + if (package) { + tmp = strdup(package); + if (!tmp) { + _E("No more space for string \"%s\"", package); + } else { + evas_object_data_set(edje, STR_ATTRIBUTE_PKG_NAME, tmp); + } + } +} + + + +HAPI char *item_get_package(Evas_Object *edje) +{ + return evas_object_data_get(edje, STR_ATTRIBUTE_PKG_NAME); +} + + + +HAPI void item_set_removable(Evas_Object *edje, int removable, int sync) +{ + int value; + int changed; + + value = (int)evas_object_data_get(edje, STR_ATTRIBUTE_REMOVABLE); + changed = (int)(value != removable); + + if (!changed) { + return; + } + + evas_object_data_del(edje, STR_ATTRIBUTE_REMOVABLE); + + if (removable >= 0) { + evas_object_data_set(edje, STR_ATTRIBUTE_REMOVABLE, (void*) removable); + } +} + + + +HAPI int item_get_removable(Evas_Object *edje) +{ + return (int) evas_object_data_get(edje, STR_ATTRIBUTE_REMOVABLE); +} + + + +HAPI void item_set_page(Evas_Object *edje, Evas_Object *page, int sync) +{ + Evas_Object *value; + int changed; + + value = evas_object_data_get(edje, STR_ATTRIBUTE_PAGE); + changed = (int)(value != page); + + if (!changed) { + return; + } + + evas_object_data_del(edje, STR_ATTRIBUTE_PAGE); + + if (page) { + evas_object_data_set(edje, STR_ATTRIBUTE_PAGE, page); + } +} + + + +HAPI Evas_Object *item_get_page(Evas_Object *edje) +{ + return evas_object_data_get(edje, STR_ATTRIBUTE_PAGE); +} + + + + +HAPI void item_enable_delete(Evas_Object *item) +{ + if (item_get_removable(item) > 0) { + edje_object_signal_emit(_EDJ(item), "delete,on", "menu"); + } +} + + + +HAPI void item_disable_delete(Evas_Object *item) +{ + if (item_get_removable(item) > 0) { + edje_object_signal_emit(_EDJ(item), "delete,off", "menu"); + } +} + + + +HAPI void item_show_badge(Evas_Object *obj, int value) +{ + char str[BUFSZE]; + Evas_Object *scroller; + + ret_if(NULL == obj); + ret_if(value <= 0); + + sprintf(str, "%d", value); + if (edje_object_part_text_set(_EDJ(obj), "badge,txt", str) == EINA_FALSE) { + _E("Failed to set text on the part, edje:%p, part:%s, text:%s", _EDJ(obj), "badge,txt", str); + } + + scroller = evas_object_data_get(obj, "scroller"); + ret_if(NULL == scroller); + ret_if(page_scroller_is_edited(scroller)); + + edje_object_signal_emit(_EDJ(obj), "badge,on", "menu"); + evas_object_data_set(obj, "badge,enabled", (void*)1); + + _D("Badge is updated to %s", str); +} + + + +HAPI void item_hide_badge(Evas_Object *obj) +{ + ret_if(NULL == obj); + + edje_object_signal_emit(_EDJ(obj), "badge,off", "menu"); + evas_object_data_del(obj, "badge,enabled"); +} + + + +HAPI int item_is_enabled_badge(Evas_Object *obj) +{ + return evas_object_data_get(obj, "badge,enabled") != NULL; +} + + + +HAPI void item_enable_progress(Evas_Object *obj) +{ + Evas_Object *progress; + + ret_if(evas_object_data_get(obj, "progress,enabled")); + + progress = elm_object_part_content_unset(obj, "progress,swallow"); + if (progress) { + _D("Progress bar is already registered... Hmm.. just remove it"); + evas_object_del(progress); + } + + progress = elm_progressbar_add(obj); + ret_if(NULL == progress); + + elm_object_part_content_set(obj, "progress,swallow", progress); + + evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_progressbar_value_set(progress, 0.0f); + elm_progressbar_horizontal_set(progress, EINA_TRUE); + evas_object_show(progress); + + edje_object_signal_emit(_EDJ(obj), "progress,enable", "item"); + + evas_object_data_set(obj, "progress,enabled", "true"); +} + + + +HAPI void item_update_progress(Evas_Object *obj, int value) +{ + Evas_Object *progress; + + ret_if(NULL == evas_object_data_get(obj, "progress,enabled")); + + progress = edje_object_part_swallow_get(_EDJ(obj), "progress,swallow"); + ret_if(NULL == progress); + + elm_progressbar_value_set(progress, (float)value/100.0f); + + _D("progress is updated to %d", value); +} + + + +HAPI void item_disable_progress(Evas_Object *obj) +{ + Evas_Object *progress; + + ret_if(NULL == evas_object_data_get(obj, "progress,enabled")); + + edje_object_signal_emit(_EDJ(obj), "progress,disable", "item"); + + progress = elm_object_part_content_unset(obj, "progress,swallow"); + if (progress) { + evas_object_del(progress); + } + + evas_object_data_del(obj, "progress,enabled"); +} + + + +HAPI int item_is_enabled_progress(Evas_Object *obj) +{ + return evas_object_data_get(obj, "progress,enabled") != NULL; +} + + + +HAPI void item_edit(Evas_Object *item) +{ + if (item_get_removable(item)) { + edje_object_signal_emit(_EDJ(item), "uninstall,on", "menu"); + } + edje_object_signal_emit(_EDJ(item), "badge,off", "menu"); + item_unmark_dirty(item); +} + + + +HAPI void item_unedit(Evas_Object *item) +{ + char *package; + + edje_object_signal_emit(_EDJ(item), "uninstall,off", "menu"); + + package = item_get_package(item); + if (item_badge_is_registered(item) + && item_badge_count(package) > 0) + { + edje_object_signal_emit(_EDJ(item), "badge,on", "menu"); + } +} + + + +static Evas_Object *_add_icon_image(Evas_Object *item, const char *icon_file) +{ + Evas_Object *icon; + + retv_if(NULL == item, NULL); + retv_if(NULL == icon_file, NULL); + + icon = elm_icon_add(item); + retv_if(NULL == icon, NULL); + + if (elm_image_file_set(icon, icon_file, NULL) == EINA_FALSE) { + _E("Icon file is not accessible (%s)", icon_file); + evas_object_del(icon); + icon = NULL; + } + + elm_image_resizable_set(icon, EINA_TRUE, EINA_TRUE); + + if (menu_screen_get_root_height() > BASE_HEIGHT || menu_screen_get_root_width() > BASE_WIDTH) { + elm_image_no_scale_set(icon, EINA_TRUE); + } + + return icon; +} + + + +static Evas_Object *_add_edje_icon(Evas_Object *item, const char *icon_file) +{ + Evas_Object *icon; + + retv_if(NULL == item, NULL); + retv_if(NULL == icon_file, NULL); + + if (access(icon_file, R_OK) != 0) { + _E("Failed to get an icon"); + return NULL; + } + + icon = layout_load_edj(item, (char*)icon_file, ITEM_GROUP_NAME); + if (!icon) { + _E("Failed to load an edje, [%s] group icon", icon_file); + evas_object_del(icon); + icon = NULL; + } + + return icon; +} + + + +HAPI menu_screen_error_e item_is_edje_icon(const char *icon) +{ + int len; + const char *ext = "jde."; + + retv_if(!icon, MENU_SCREEN_ERROR_FAIL); + + len = strlen(icon) - 1; + + while (len >= 0 && *ext && icon[len] == *ext) { + len --; + ext ++; + } + + return *ext ? MENU_SCREEN_ERROR_FAIL : MENU_SCREEN_ERROR_OK; +} + + + +HAPI void item_update(Evas_Object *item, app_info_t *ai) +{ + Evas_Object *icon = NULL; + + ret_if(NULL == item); + ret_if(NULL == ai); + + if (!ai->image) { + if (ai->icon && 0 == access(ai->icon, R_OK)) { + ; + } else { + _E("Failed to access to [%s]", ai->icon); + if (ai->icon) free(ai->icon); + + ai->icon = strdup(DEFAULT_ICON); + if (!ai->icon) _E("Critical! strdup error"); + } + + if (ai->icon) { + FILE *fp; + fp = fopen(ai->icon, "rb"); + if (fp) { + fseek(fp, 0L, SEEK_END); + _D("Access to file [%s], size[%ld]", ai->icon, ftell(fp)); + fclose(fp); + } else _E("Cannot get the file pointer[%s]", ai->icon); + + if (item_is_edje_icon(ai->icon) == MENU_SCREEN_ERROR_OK) { + icon = _add_edje_icon(item, ai->icon); + evas_object_data_set(item, "icon_image_type", STR_ICON_IMAGE_TYPE_EDJE); + } else { + icon = _add_icon_image(item, ai->icon); + evas_object_data_set(item, "icon_image_type", STR_ICON_IMAGE_TYPE_OBJECT); + } + } + } else { + icon = ai->image; + evas_object_data_set(item, "icon_image_type", STR_ICON_IMAGE_TYPE_OBJECT); + } + + if (icon) { + Evas_Object *temp_item; + temp_item = elm_object_part_content_unset(item, "icon_image"); + if (temp_item) { + evas_object_del(temp_item); + } + + elm_object_part_content_set(item, "icon_image", icon); + evas_object_data_set(item, "icon_image", icon); + } + + item_set_package(item, ai->package, 0); + item_set_desktop(item, ai->desktop, 0); + item_set_name(item, ai->name, 0); + item_set_icon(item, ai->icon, 0); + evas_object_data_set(item, STR_ATTRIBUTE_REMOVABLE, (void*) ai->x_slp_removable); + evas_object_data_set(item, "pid", (void *) ai->pid); + + item_badge_register(item); + + do { + Evas_Object *scroller; + + scroller = evas_object_data_get(item, "scroller"); + break_if(NULL == scroller); + + if (false == page_scroller_is_edited(scroller)) break; + item_edit(item); + } while (0); +} + + + +static char *_access_info_cb(void *data, Evas_Object *obj) +{ + Evas_Object *item = data; + char *name = NULL; + name = item_get_name(item); + retv_if(NULL == name, NULL); + + char *tmp = NULL; + tmp = strdup(name); + retv_if(NULL == tmp, NULL); + return tmp; +} + + + +/* This function is similar to _item_up_cb. But it's apparently different */ +static void _focus_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *scroller; + + Evas_Object *item = data; + ret_if(NULL == item); + + _D("ITEM: mouse up event callback is invoked for %p", item); + PRINT_APPFWK(); + + scroller = evas_object_data_get(item, "scroller"); + ret_if(NULL == scroller); + + if (true == page_scroller_is_edited(scroller)) { + return; + } + item_launch(item); +} + + + +#define IDS_AT_BODY_UNINSTALL "IDS_AT_BODY_UNINSTALL" +static char *_access_uninstall_cb(void *data, Evas_Object *obj) +{ + char *info; + char *tmp; + info = _(IDS_AT_BODY_UNINSTALL); + if (!info) return NULL; + tmp = strdup(info); + if (!tmp) return NULL; + return tmp; +} + + + +/* This function is similar to _uninstall_up_cb in item_event.c */ +static void _uninstall_focus_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *win; + Evas_Object *scroller; + char *package; + + win = menu_screen_get_win(); + ret_if(NULL == win); + + _D("Uninstall button is up"); + + Evas_Object *item = data; + scroller = evas_object_data_get(item, "scroller"); + + package = item_get_package(item); + ret_if(!package || strlen(package) == 0); + ret_if(pkgmgr_find_pended_object(package, 0, scroller, NULL)); + + _D("Uninstalling... [%s]", package); + + popup_create_uninstall(win, item); +} + + + +HAPI Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai) +{ + Evas_Object *item; + Evas_Object *bg; + + char *item_edje; + int item_width; + int item_height; + + item_edje = evas_object_data_get(scroller, "item_edje"); + item = layout_load_edj(scroller, item_edje, ITEM_GROUP_NAME); + if (!item) { + _E("Failed to load an item object"); + return NULL; + } + + Evas_Object *item_focus = NULL; + Evas_Object *focus = NULL; + + do { // focus + item_focus = elm_button_add(item); + retv_if(NULL == item_focus, NULL); + + elm_object_style_set(item_focus, "focus"); + elm_object_part_content_set(item, "focus", item_focus); + elm_access_info_cb_set(item_focus, ELM_ACCESS_INFO, _access_info_cb, item); + evas_object_smart_callback_add(item_focus, "clicked", _focus_clicked_cb, item); + } while (0); + + do { // make a button for a focus button of deleting. + focus = elm_button_add(item); + retv_if(NULL == focus, NULL); + + elm_object_style_set(focus, "focus"); + elm_object_part_content_set(item, "uninstall_focus", focus); + elm_access_info_cb_set(focus, ELM_ACCESS_INFO, _access_uninstall_cb, item); + evas_object_smart_callback_add(focus, "clicked", _uninstall_focus_clicked_cb, item); + } while (0); + + elm_object_focus_next_object_set(item_focus, focus, ELM_FOCUS_UP); + elm_object_focus_next_object_set(focus, item_focus, ELM_FOCUS_DOWN); + + bg = evas_object_rectangle_add(menu_screen_get_evas()); + if (!bg) { + _E("Cannot add an rectangle"); + evas_object_del(item); + return NULL; + } + + item_width = (int) evas_object_data_get(scroller, "item_width"); + item_height = (int) evas_object_data_get(scroller, "item_height"); + + evas_object_color_set(bg, 0, 0, 0, 0); + evas_object_resize(bg, item_width, item_height); + evas_object_size_hint_min_set(bg, item_width, item_height); + evas_object_size_hint_max_set(bg, item_width, item_height); + elm_object_part_content_set(item, "bg", bg); + + edje_object_text_class_set(_EDJ(item), "tizen", "TIZEN:style=medium", 24); + + evas_object_data_set(item, "win", evas_object_data_get(scroller, "win")); + evas_object_data_set(item, "layout", evas_object_data_get(scroller, "layout")); + evas_object_data_set(item, "controlbar", evas_object_data_get(scroller, "controlbar")); + evas_object_data_set(item, "tab", evas_object_data_get(scroller, "tab")); + evas_object_data_set(item, "scroller", scroller); + evas_object_data_set(item, "item_enable_long_press", evas_object_data_get(scroller, "item_enable_long_press")); + evas_object_data_set(item, "item_text_dual_line", evas_object_data_get(scroller, "item_text_dual_line")); + evas_object_data_set(item, "pending,idx", (void *) 0); + evas_object_data_set(item, "x", (void *) 0); + evas_object_data_set(item, "y", (void *) 0); + evas_object_data_set(item, "dirty", (void *) 0); + + item_update(item, ai); + item_event_register(item); + + return item; +} + + + +HAPI void item_destroy(Evas_Object *item) +{ + Evas_Object *icon; + Evas_Object *bg; + Evas_Object *page; + Eina_List *pending_list; + Eina_List *n; + Eina_List *t; + Evas_Object *pend_item; + int pending_idx; + const char *icon_image_type; + + ret_if(NULL == item); + + page = item_get_page(item); + pending_list = evas_object_data_get(page, "pending,list"); + EINA_LIST_FOREACH_SAFE(pending_list, n, t, pend_item) { + if (pend_item == item) { + pending_idx = (int)evas_object_data_get(pend_item, "pending,idx"); + pending_list = eina_list_remove(pending_list, pend_item); + evas_object_data_set(page, "pending,list", pending_list); + evas_object_data_del(pend_item, "pending,idx"); + } + } + + if (item_badge_is_registered(item)) { + item_badge_unregister(item); + } + item_event_unregister(item); + + item_set_package(item, NULL, 1); + item_set_desktop(item, NULL, 1); + item_set_name(item, NULL, 1); + item_set_icon(item, NULL, 1); + item_set_page(item, NULL, 1); + evas_object_data_del(item, STR_ATTRIBUTE_REMOVABLE); + evas_object_data_del(item, "pid"); + evas_object_data_del(_EDJ(item), "evas_object"); + bg = elm_object_part_content_unset(item, "bg"); + if (bg) { + evas_object_del(bg); + } + + elm_object_part_content_unset(item, "icon_image"); + icon = evas_object_data_del(item, "icon_image"); + icon_image_type = evas_object_data_get(item, "icon_image_type"); + if (icon_image_type) { + if (!strcmp(icon_image_type, STR_ICON_IMAGE_TYPE_OBJECT)) { + evas_object_del(icon); + } else if (!strcmp(icon_image_type, STR_ICON_IMAGE_TYPE_EDJE)) { + layout_unload_edj(icon); + } + } + + evas_object_data_del(item, "win"); + evas_object_data_del(item, "layout"); + evas_object_data_del(item, "controlbar"); + evas_object_data_del(item, "tab"); + evas_object_data_del(item, "scroller"); + evas_object_data_del(item, "item_enable_long_press"); + evas_object_data_del(item, "item_text_dual_line"); + evas_object_data_del(item, "pending,idx"); + evas_object_data_del(item, "x"); + evas_object_data_del(item, "y"); + evas_object_data_del(item, "dirty"); + + do { + Evas_Object *focus = NULL; + focus = elm_object_part_content_unset(item, "focus"); + if (NULL == focus) break; + evas_object_smart_callback_del(focus, "clicked", _focus_clicked_cb); + evas_object_del(focus); + } while (0); + + do { + Evas_Object *focus = NULL; + focus = elm_object_part_content_unset(item, "uninstall_focus"); + if (NULL == focus) break; + evas_object_smart_callback_del(focus, "clicked", _uninstall_focus_clicked_cb); + evas_object_del(focus); + } while (0); + + layout_unload_edj(item); +} + + + +static Eina_Bool _unblock_cb(void *data) +{ + Evas_Object *layout; + layout = evas_object_data_get(menu_screen_get_win(), "layout"); + layout_disable_block(layout); + return EINA_FALSE; +} + + + +static void _run_cb(bundle *b, int request_code, appsvc_result_val result, void *data) +{ +} + + + +HAPI void item_launch(Evas_Object *obj) +{ + char *package; + char *name; + int ret_aul; + Evas_Object *layout; + + ret_if(NULL == obj); + + name = item_get_name(obj); + package = item_get_package(obj); + ret_if(NULL == package); + + layout = evas_object_data_get(menu_screen_get_win(), "layout"); + layout_enable_block(layout); + + bool is_shortcut = (bool) evas_object_data_get(obj, "is_shortcut"); + bool shortcut_launch_package = (bool) evas_object_data_get(obj, "shortcut_launch_package"); + if (is_shortcut && !shortcut_launch_package) { + bundle *b = NULL; + b = bundle_create(); + ret_if(NULL == b); + + appsvc_set_operation(b, APPSVC_OPERATION_VIEW); + appsvc_set_uri(b, evas_object_data_get(obj, "content_info")); + + int ret = -1; + ret = appsvc_run_service(b, 0, _run_cb, NULL); + if (0 > ret) { + _E("cannot run service. ret [%d]", ret); + layout_disable_block(layout); + } else { + _D("Launch app's ret : [%d]", ret); + ecore_timer_add(LAYOUT_BLOCK_INTERVAL, _unblock_cb, NULL); + } + + bundle_free(b); + } else { + ret_aul = aul_open_app(package); + if (ret_aul == AUL_R_EINVAL) { + char* sinform; + int len; + + if (!name) { + name = package; + } + + // IDS_IDLE_POP_UNABLE_TO_LAUNCH_PS : "Unable to launch %s" + len = strlen(D_("IDS_IDLE_POP_UNABLE_TO_LAUNCH_PS")) + strlen(name) + 1; + + sinform = calloc(len, sizeof(char)); + if (!sinform) { + _E("cannot calloc for popup."); + return; + } + + snprintf(sinform, len, D_("IDS_IDLE_POP_UNABLE_TO_LAUNCH_PS"), name); + popup_create_confirm(layout, sinform); + + free(sinform); + layout_disable_block(layout); + } else { + _D("Launch app's ret : [%d]", ret_aul); + _T(package); + ecore_timer_add(LAYOUT_BLOCK_INTERVAL, _unblock_cb, NULL); + } + } +} + + + +HAPI int item_get_position(Evas_Object *item) +{ + Evas_Object *scroller; + Evas_Object *layout; + + Evas_Coord item_x; + Evas_Coord item_y; + + Evas_Coord scroller_x; + Evas_Coord scroller_y; + Evas_Coord scroller_w; + Evas_Coord scroller_h; + + int layout_width; + + int items_per_line; + int nth_line; + int nth_item; + + int item_width; + int item_height; + + layout = evas_object_data_get(item, "layout"); + scroller = evas_object_data_get(item, "scroller"); + + layout_width = (int) evas_object_data_get(layout, "width"); + item_width = (int) evas_object_data_get(scroller, "item_width"); + item_height = (int) evas_object_data_get(scroller, "item_height"); + + evas_object_geometry_get(item, &item_x, &item_y, NULL, NULL); + evas_object_geometry_get(scroller, &scroller_x, &scroller_y, &scroller_w, &scroller_h); + + if (item_x < ((float) layout_width) * 0.005f) { + return -1; + } + + if (item_x + ((float) item_width * 0.85f) > ((float) layout_width) * 0.98f) { + return (int) evas_object_data_get(scroller, "page_max_app"); + } + + if (0 == item_width || 0 == item_height) { + _E("item_widht or item_heiht is zero."); + return 0; + } + + items_per_line = scroller_w / item_width; + nth_line = (item_y - (float) item_height * 0.3) / item_height; + nth_line = nth_line < 0 ? 0 : nth_line; + nth_item = (item_x + (float) item_width * 0.5) / item_width; + + return (nth_line * items_per_line) + nth_item; +} + + + +HAPI void item_mark_dirty(Evas_Object *item) +{ + evas_object_data_set(item, "dirty", (void *) 1); +} + + + +HAPI void item_unmark_dirty(Evas_Object *item) +{ + evas_object_data_set(item, "dirty", (void *) 0); +} + + + +HAPI int item_is_dirty(Evas_Object *item) +{ + return (int) evas_object_data_get(item, "dirty"); +} + + + +// End of a file diff --git a/src/item_badge.c b/src/item_badge.c new file mode 100644 index 0000000..aa95272 --- /dev/null +++ b/src/item_badge.c @@ -0,0 +1,180 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include + +#include "menu_screen.h" +#include "conf.h" +#include "item.h" +#include "page_scroller.h" +#include "util.h" + + + +HAPI int item_badge_count(char *package) +{ + unsigned int is_display = 0; + unsigned int count = 0; + badge_error_e err = BADGE_ERROR_NONE; + + err = badge_get_display(package, &is_display); + if (BADGE_ERROR_NONE != err) _D("cannot get badge display"); + + if (0 == is_display) return 0; + + err = badge_get_count(package, &count); + if (BADGE_ERROR_NONE != err) _D("cannot get badge count"); + + _D("Badge for package %s : %u", package, count); + + return (int) count; +} + + + +static Eina_Bool _idler_cb(void *data) +{ + char *package; + int count; + Evas_Object *item = data; + + package = item_get_package(item); + if (!package) { + _D("Failed to get a package name"); + evas_object_data_del(item, "idle_timer"); + return ECORE_CALLBACK_CANCEL; + } + + count = item_badge_count(package); + if (count) item_show_badge(item, count); + else item_hide_badge(item); + + evas_object_data_del(item, "idle_timer"); + + return ECORE_CALLBACK_CANCEL; +} + + + +HAPI bool item_badge_is_registered(Evas_Object *item) +{ + const char *pkgname; + badge_error_e err; + bool existing = false; + + pkgname = item_get_package(item); + retv_if(NULL == pkgname, false); + + err = badge_is_existing(pkgname, &existing); + if (BADGE_ERROR_NONE != err) _E("cannot know whether the badge for %s is or not.", pkgname); + + return existing? true : false; +} + + + +HAPI menu_screen_error_e item_badge_register(Evas_Object *item) +{ + Ecore_Idler *idle_timer; + bool is_registered; + + is_registered = item_badge_is_registered(item); + if (false == is_registered) return MENU_SCREEN_ERROR_OK; + + idle_timer = ecore_idler_add(_idler_cb, item); + retv_if(NULL == idle_timer, MENU_SCREEN_ERROR_FAIL); + evas_object_data_set(item, "idle_timer", idle_timer); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI void item_badge_unregister(Evas_Object *item) +{ + char *package; + Ecore_Idler *idle_timer; + + package = item_get_package(item); + if (!package) return; + + idle_timer = evas_object_data_get(item, "idle_timer"); + if (idle_timer) { + _D("Badge handler for package %s is not yet ready", package); + evas_object_data_del(item, "idle_timer"); + ecore_idler_del(idle_timer); + return; + } + + item_hide_badge(item); +} + + + +static void _badge_change_cb(unsigned int action, const char *pkgname, unsigned int count, void *data) +{ + Evas_Object *scroller = data; + Evas_Object *item; + unsigned int is_display = 0; + badge_error_e err; + + _D("Badge changed, action : %u, pkgname : %s, count : %u", action, pkgname, count); + + ret_if(NULL == pkgname); + + if (BADGE_ACTION_REMOVE == action) { + count = 0; + is_display = false; + } else { + err = badge_get_display(pkgname, &is_display); + if (BADGE_ERROR_NONE != err) _D("cannot get badge display"); + if (0 == is_display) count = 0; + } + + item = page_scroller_find_item_by_package(scroller, pkgname, NULL); + if (NULL == item) return; + + if (count) item_show_badge(item, count); + else item_hide_badge(item); +} + + + +HAPI void item_badge_register_changed_cb(Evas_Object *scroller) +{ + badge_error_e err; + + err = badge_register_changed_cb(_badge_change_cb, scroller); + ret_if(BADGE_ERROR_NONE != err); +} + + + +HAPI void item_badge_unregister_changed_cb(void) +{ + badge_error_e err; + + err = badge_unregister_changed_cb(_badge_change_cb); + ret_if(BADGE_ERROR_NONE != err); +} + + + +// End of a file diff --git a/src/item_event.c b/src/item_event.c new file mode 100644 index 0000000..4b9ef37 --- /dev/null +++ b/src/item_event.c @@ -0,0 +1,156 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include + +#include "menu_screen.h" +#include "conf.h" +#include "item.h" +#include "item_event.h" +#include "mapbuf.h" +#include "mouse.h" +#include "page.h" +#include "page_scroller.h" +#include "pkgmgr.h" +#include "popup.h" +#include "util.h" +#include "all_apps/layout.h" + +#define LONG_PRESS_TIME 1.0f +#define BUFSZE 1024 + + + +static struct { + Evas_Object *pressed_item; +} item_event_info = { + .pressed_item = NULL, +}; + + + +static void _item_down_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + Evas_Object *icon_image; + Evas_Object *item; + bool item_enable_long_press; + + item = evas_object_data_get(obj, "item"); + item_enable_long_press = (bool) evas_object_data_get(item, "item_enable_long_press"); + + _D("ITEM: mouse down event callback is invoked for %p", item); + + item_event_info.pressed_item = item; + + icon_image = evas_object_data_get(item, "icon_image"); + evas_object_color_set(icon_image, 100, 100, 100, 100); + + if (!item_enable_long_press) { + return; + } +} + + + +static void _item_up_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + Evas_Object *icon_image; + Evas_Object *item; + + item = evas_object_data_get(obj, "item"); + ret_if(NULL == item); + + _D("ITEM: mouse up event callback is invoked for %p", item); + PRINT_APPFWK(); + + icon_image = evas_object_data_get(item, "icon_image"); + evas_object_color_set(icon_image, 255, 255, 255, 255); + + ret_if(NULL == item_event_info.pressed_item); + if (item != item_event_info.pressed_item) { + item_event_info.pressed_item = NULL; + return; + } + item_event_info.pressed_item = NULL; +} + + + +static void _uninstall_down_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + _D("Uninstall button is down"); + obj = evas_object_data_get(obj, "evas_object"); + if (obj) evas_object_data_set(obj, "removing", (void*)1); +} + + + +static void _uninstall_up_cb(void *item, Evas_Object *obj, const char* emission, const char* source) +{ + Evas_Object *win; + + ret_if(mouse_is_scrolling()); + + win = menu_screen_get_win(); + ret_if(NULL == win); + + _D("Uninstall button is up"); + obj = evas_object_data_get(obj, "evas_object"); + ret_if(NULL == obj); + ret_if(NULL == evas_object_data_get(obj, "removing")); + + evas_object_data_del(obj, "removing"); +} + + + +HAPI void item_event_register(Evas_Object *item) +{ + Evas_Object *item_edje; + item_edje = _EDJ(item); + evas_object_data_set(item_edje, "item", item); + + edje_object_signal_callback_add(item_edje, "item,down", "menu", _item_down_cb, NULL); + edje_object_signal_callback_add(item_edje, "item,up", "menu", _item_up_cb, NULL); + + edje_object_signal_callback_add(item_edje, "uninstall,down", "menu", _uninstall_down_cb, NULL); + edje_object_signal_callback_add(item_edje, "uninstall,up", "menu", _uninstall_up_cb, item); +} + + + +HAPI void item_event_unregister(Evas_Object *item) +{ + Evas_Object *item_edje; + item_edje = _EDJ(item); + + edje_object_signal_callback_del(item_edje, "item,down", "menu", _item_down_cb); + edje_object_signal_callback_del(item_edje, "item,up", "menu", _item_up_cb); + + edje_object_signal_callback_del(item_edje, "uninstall,down", "menu", _uninstall_down_cb); + edje_object_signal_callback_del(item_edje, "uninstall,up", "menu", _uninstall_up_cb); + + evas_object_data_del(item_edje, "item"); +} + + + +// End of a file diff --git a/src/key.c b/src/key.c new file mode 100644 index 0000000..c8130fb --- /dev/null +++ b/src/key.c @@ -0,0 +1,230 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include + +#include "conf.h" +#include "key.h" +#include "menu_screen.h" +#include "page_scroller.h" +#include "popup.h" +#include "util.h" +#include "all_apps/layout.h" + + + +static struct { + Eina_Bool pressed; + Ecore_Event_Handler *press_handler; + Ecore_Event_Handler *release_handler; + Eina_Bool register_handler; + Ecore_Timer *long_press; + Eina_Bool home_grabbed; +} key_info = { + .pressed = 0, + .press_handler = NULL, + .release_handler = NULL, + .register_handler = EINA_FALSE, + .long_press = NULL, + .home_grabbed = EINA_FALSE, +}; + + + +#define KEY_LEFT "Left" +#define KEY_RIGHT "Right" +#define KEY_UP "Up" +#define KEY_DOWN "Down" +#define KEY_ESC "Escape" +static Eina_Bool _key_release_cb(void *data, int type, void *event) +{ + Evas_Event_Key_Up *ev = event; + + retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL); + retv_if(NULL == ev, ECORE_CALLBACK_CANCEL); + + _D("Key(%s) released %d", ev->keyname, key_info.pressed); + + if (key_info.pressed == EINA_FALSE) return ECORE_CALLBACK_CANCEL; + + do { + Evas_Object *win; + win = menu_screen_get_win(); + break_if(NULL == win); + + Evas_Object *layout; + layout = evas_object_data_get(win, "layout"); + break_if(NULL == layout); + + Evas_Object *all_apps; + all_apps = evas_object_data_get(layout, "all_apps"); + break_if(NULL == all_apps); + + Evas_Object *scroller = evas_object_data_get(all_apps, "scroller"); + break_if(NULL == scroller); + + if (!strcmp(ev->keyname, KEY_SELECT) || !strcmp(ev->keyname, KEY_BACK)) { + if (popup_exist()) { + popup_destroy_all(); + break; + } + + if (all_apps_layout_is_edited(all_apps)) { + all_apps_layout_unedit(all_apps); + } + } else if (!strcmp(ev->keyname, KEY_LEFT) || + !strcmp(ev->keyname, KEY_RIGHT) || + !strcmp(ev->keyname, KEY_UP) || + !strcmp(ev->keyname, KEY_DOWN)) + { + int cur_idx = page_scroller_get_current_page_no(scroller); + int idx = 0, x = 0, w = 0; + elm_scroller_region_get(scroller, &x, NULL, &w, NULL); + + if (w) idx = x / w; + if (cur_idx != idx) { + page_scroller_bring_in(scroller, idx); + break; + } + + /* If there are no items to be focused after pressing keys, + Menu-screen forces to focus the first item of the other page */ + int rest = x % w; + if (rest) { + page_scroller_focus_into_vector(scroller, rest > w / 2 ? -1 : 1); + } + } + else if (!strcmp(ev->keyname, KEY_ESC)) + { + if (popup_exist()) + { + popup_destroy_all(); + break; + } + if (all_apps_layout_is_edited(all_apps)) { + all_apps_layout_unedit(all_apps); + } + } + } while (0); + + key_info.pressed = EINA_FALSE; + + return ECORE_CALLBACK_CANCEL; +} + + + +static Eina_Bool _key_press_cb(void *data, int type, void *event) +{ + Evas_Event_Key_Down *ev = event; + + retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_CANCEL); + retv_if(NULL == ev, ECORE_CALLBACK_CANCEL); + + key_info.pressed = EINA_TRUE; + _D("Key pressed %d", key_info.pressed); + + return ECORE_CALLBACK_CANCEL; +} + + + +HAPI void key_register(void) +{ + if (!key_info.release_handler) { + key_info.release_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_release_cb, NULL); + if (!key_info.release_handler) { + _E("Failed to register a key up event handler"); + } + } + + if (!key_info.press_handler) { + key_info.press_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_press_cb, NULL); + if (!key_info.press_handler) { + _E("Failed to register a key down event handler"); + } + } + + key_info.pressed = EINA_FALSE; + key_info.register_handler = EINA_TRUE; +} + + + +HAPI void key_unregister(void) +{ + if (key_info.long_press) { + ecore_timer_del(key_info.long_press); + key_info.long_press = NULL; + } + + if (key_info.release_handler) { + ecore_event_handler_del(key_info.release_handler); + key_info.release_handler = NULL; + } + + if (key_info.press_handler) { + ecore_event_handler_del(key_info.press_handler); + key_info.press_handler = NULL; + } + + key_info.register_handler = EINA_FALSE; +} + + + +HAPI void key_grab_home(void) +{ + if (EINA_TRUE == key_info.home_grabbed) return; + + Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win()); + Display* dpy = ecore_x_display_get(); + + int ret = utilx_grab_key(dpy, win, KEY_SELECT, TOP_POSITION_GRAB); + ret_if(0 != ret); + + ret = utilx_grab_key(dpy, win, KEY_BACK, TOP_POSITION_GRAB); + ret_if(0 != ret); + + key_info.home_grabbed = EINA_TRUE; +} + + + +HAPI void key_ungrab_home(void) +{ + if (key_info.home_grabbed == EINA_FALSE) return; + + Ecore_X_Window win = elm_win_xwindow_get(menu_screen_get_win()); + Display* dpy = ecore_x_display_get(); + + int ret = utilx_ungrab_key(dpy, win, KEY_SELECT); + ret_if(0 != ret); + + ret = utilx_ungrab_key(dpy, win, KEY_BACK); + ret_if(0 != ret); + + key_info.home_grabbed = EINA_FALSE; +} + + + +// End of a file diff --git a/src/layout.c b/src/layout.c new file mode 100644 index 0000000..8ac7374 --- /dev/null +++ b/src/layout.c @@ -0,0 +1,151 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include + +#include "menu_screen.h" +#include "conf.h" +#include "item_event.h" +#include "layout.h" +#include "mapbuf.h" +#include "page.h" +#include "item.h" +#include "util.h" +#include "all_apps/layout.h" + + + +HAPI Evas_Object *layout_create(Evas_Object *conformant, const char *file, const char *group, int rotate) +{ + Evas_Object *layout; + + do { + int width; + int height; + + layout = layout_load_edj(conformant, file, group); + retv_if(NULL == layout, NULL); + + width = menu_screen_get_root_width(); + height = menu_screen_get_root_height() - INDEX_HEIGHT; + + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_min_set(layout, width, height); + evas_object_size_hint_max_set(layout, width, height); + evas_object_resize(layout, width, height); + evas_object_show(layout); + + evas_object_data_set(layout, "win", menu_screen_get_win()); + evas_object_data_set(layout, "rotate", (void *) rotate); + evas_object_data_set(layout, "width", (void *) width); + evas_object_data_set(layout, "height", (void *) height); + } while (0); + + do { + Evas_Object *all_apps; + + all_apps = all_apps_layout_create(layout, rotate); + if (NULL == all_apps) { + _E("Failed to create scroller"); + layout_destroy(layout); + return NULL; + } + evas_object_data_set(layout, "all_apps", all_apps); + elm_object_part_content_set(layout, "content", all_apps); + } while (0); + + return layout; +} + + + +HAPI void layout_destroy(Evas_Object *layout) +{ + Evas_Object *all_apps; + + all_apps = evas_object_data_del(layout, "all_apps"); + all_apps_layout_destroy(all_apps); + + evas_object_data_del(layout, "win"); + evas_object_data_del(layout, "rotate"); + evas_object_data_del(layout, "width"); + evas_object_data_del(layout, "height"); + + layout_unload_edj(layout); +} + + + +HAPI void layout_enable_block(Evas_Object *layout) +{ + ret_if(NULL == layout); + + _D("Enable layout blocker"); + edje_object_signal_emit(_EDJ(layout), "block", "layout"); +} + + + +HAPI void layout_disable_block(Evas_Object *layout) +{ + ret_if(NULL == layout); + + _D("Disable layout blocker"); + edje_object_signal_emit(_EDJ(layout), "unblock", "layout"); +} + + + +HAPI Evas_Object* layout_load_edj(Evas_Object *parent, const char *edjname, const char *grpname) +{ + Evas_Object *eo; + + retv_if(NULL == parent, NULL); + + eo = elm_layout_add(parent); + retv_if(NULL == eo, NULL); + retv_if(EINA_FALSE == elm_layout_file_set(eo, edjname, grpname), NULL); + + evas_object_data_set(_EDJ(eo), "evas_object", eo); + evas_object_show(eo); + + return eo; +} + + + +HAPI void layout_unload_edj(Evas_Object *layout) +{ + Evas_Object *evas_object; + + ret_if(NULL == layout); + + evas_object = evas_object_data_get(_EDJ(layout), "evas_object"); + if (evas_object) { + evas_object_data_del(_EDJ(layout), "evas_object"); + } + + evas_object_del(layout); +} + + + +// End of file diff --git a/src/list.c b/src/list.c new file mode 100644 index 0000000..94fe8df --- /dev/null +++ b/src/list.c @@ -0,0 +1,209 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include + +#include "list.h" +#include "util.h" +#include "all_apps/list.h" + + + +HAPI menu_screen_error_e list_count(app_list *list, int *count) +{ + retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == list->list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == count, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + *count = eina_list_count(list->list); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e list_first(app_list *list) +{ + retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + list->cur_idx = 0; + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e list_next(app_list *list) +{ + int count; + + retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == list->list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + count = eina_list_count(list->list); + if (list->cur_idx + 1 == count) return MENU_SCREEN_ERROR_NO_DATA; + + list->cur_idx ++; + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e list_is_ended(app_list *list, bool *flag) +{ + int count; + + retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == list->list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + count = eina_list_count(list->list); + *flag = (list->cur_idx == count) ? true : false; + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e list_get_item(app_list *list, app_list_item **item) +{ + retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == list->list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + *item = eina_list_nth(list->list, list->cur_idx); + + return MENU_SCREEN_ERROR_OK; +} + + + + +HAPI menu_screen_error_e list_get_values(const char *package, app_info_t *ai) +{ + ail_appinfo_h appinfo_h; + char *exec; + char *name; + char *icon; + ail_error_e ret; + + retv_if(NULL == package, MENU_SCREEN_ERROR_FAIL); + retv_if(NULL == ai, MENU_SCREEN_ERROR_FAIL); + retv_if(NULL == (ai->package = strdup(package)), MENU_SCREEN_ERROR_FAIL); + + ret = ail_get_appinfo(ai->package, &appinfo_h); + if (AIL_ERROR_OK == ret) { + do { + break_if(ail_appinfo_get_str(appinfo_h, AIL_PROP_EXEC_STR, &exec) < 0); + break_if(ail_appinfo_get_str(appinfo_h, AIL_PROP_NAME_STR, &name) < 0); + break_if(ail_appinfo_get_str(appinfo_h, AIL_PROP_ICON_STR, &icon) < 0); + break_if(ail_appinfo_get_bool(appinfo_h, AIL_PROP_NODISPLAY_BOOL, &ai->nodisplay) < 0); + break_if(ail_appinfo_get_bool(appinfo_h, AIL_PROP_X_SLP_ENABLED_BOOL, &ai->enabled) < 0); + break_if(ail_appinfo_get_bool(appinfo_h, AIL_PROP_X_SLP_REMOVABLE_BOOL, &ai->x_slp_removable) < 0); + break_if(ail_appinfo_get_bool(appinfo_h, AIL_PROP_X_SLP_TASKMANAGE_BOOL, &ai->x_slp_taskmanage) < 0); + + break_if(NULL == exec || NULL == (ai->exec = strdup(exec))); + break_if(NULL == name || NULL == (ai->name = strdup(name))); + break_if(NULL == icon || NULL == (ai->icon = strdup(icon))); + + ail_destroy_appinfo(appinfo_h); + + return MENU_SCREEN_ERROR_OK; + } while(0); + + ail_destroy_appinfo(appinfo_h); + list_free_values(ai); + return MENU_SCREEN_ERROR_FAIL; + } else if (AIL_ERROR_NO_DATA == ret) { + return MENU_SCREEN_ERROR_OK; + } + + return MENU_SCREEN_ERROR_FAIL; +} + + + +HAPI void list_free_values(app_info_t *ai) +{ + ret_if(NULL == ai); + + /* Origin field */ + if (ai->package) { + free(ai->package); + ai->package = NULL; + } + + if (ai->exec) { + free(ai->exec); + ai->exec = NULL; + } + + if (ai->name) { + free(ai->name); + ai->name = NULL; + } + + if (ai->icon) { + free(ai->icon); + ai->icon = NULL; + } +} + + + +HAPI menu_screen_error_e list_append_item(app_list *list, app_list_item *item) +{ + retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == item, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + list->list = eina_list_append(list->list, item); + retv_if(NULL == list->list, MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e list_remove_item(app_list *list, app_list_item *item) +{ + retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == list->list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == item, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + list->list = eina_list_remove(list->list, item); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI menu_screen_error_e list_sort(app_list *list, int (*_sort_cb)(const void *d1, const void *d2)) +{ + retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + list->list = eina_list_sort(list->list, eina_list_count(list->list), _sort_cb); + retv_if(NULL == list->list, MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; +} + + + +// End of a file diff --git a/src/mapbuf.c b/src/mapbuf.c new file mode 100644 index 0000000..af31932 --- /dev/null +++ b/src/mapbuf.c @@ -0,0 +1,219 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include + +#include "menu_screen.h" +#include "conf.h" +#include "layout.h" +#include "mapbuf.h" +#include "util.h" + + + +HAPI Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj) +{ + Evas_Object *mapbuf; + + if (obj == NULL) return NULL; + + mapbuf = evas_object_data_get(obj, "mapbuf"); + if (!mapbuf && evas_object_data_get(obj, "page")) { + mapbuf = obj; + } + + return mapbuf; +} + + + +HAPI Evas_Object *mapbuf_get_page(Evas_Object *obj) +{ + Evas_Object *page; + + if (obj == NULL) return NULL; + + page = evas_object_data_get(obj, "page"); + if (!page && evas_object_data_get(obj, "mapbuf")) { + page = obj; + } + + return page; +} + + + +static void _move_pages(Evas_Object *page) +{ + if(NULL == page) return; + + Evas_Object *scroller = evas_object_data_get(page, "scroller"); + if(NULL == scroller) return; + + Evas_Coord x, y; + evas_object_geometry_get(scroller, &x, &y, NULL, NULL); + evas_object_move(page, x, y); +} + + + +HAPI menu_screen_error_e mapbuf_enable(Evas_Object *obj, int force) +{ + Evas_Object *mapbuf; + int cnt; + + mapbuf = mapbuf_get_mapbuf(obj); + if (!mapbuf) { + _D("Failed to get the mapbuf object"); + return MENU_SCREEN_ERROR_FAIL; + } + + Evas_Object *page = mapbuf_get_page(obj); + if(!page) { + return MENU_SCREEN_ERROR_FAIL; + } + + if(menu_screen_is_tts()) { + evas_object_data_set(mapbuf, "mapbuf_enabled", (void*)0); + elm_mapbuf_enabled_set(mapbuf, 0); + return MENU_SCREEN_ERROR_OK; + } + + if (force) { + evas_object_data_set(mapbuf, "mapbuf_enabled", (void*)0); + _move_pages(page); + elm_mapbuf_enabled_set(mapbuf, 1); // Mapbuf has been disabled because of a mapbuf bug. + return MENU_SCREEN_ERROR_OK; + } + + cnt = (int)evas_object_data_get(mapbuf, "mapbuf_enabled"); + cnt ++; + evas_object_data_set(mapbuf, "mapbuf_enabled", (void*)cnt); + //_D("[%s] CNT = %d", __func__, cnt); + + if (cnt == 0) { + if (!elm_mapbuf_enabled_get(mapbuf)) { + _move_pages(page); + elm_mapbuf_enabled_set(mapbuf, 1); // Mapbuf has been disabled because of a mapbuf bug. + //_D("[%s] mapbuf enabled", __func__); + } + } + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI int mapbuf_is_enabled(Evas_Object *obj) +{ + Evas_Object *mapbuf; + mapbuf = mapbuf_get_mapbuf(obj); + if (!mapbuf) { + return 0; + } + + return elm_mapbuf_enabled_get(mapbuf); +} + + + +HAPI int mapbuf_disable(Evas_Object *obj, int force) +{ + Evas_Object *mapbuf; + int cnt; + + mapbuf = mapbuf_get_mapbuf(obj); + if (!mapbuf) { + _D("Failed to get the mapbuf object"); + return MENU_SCREEN_ERROR_FAIL; + } + + if (force) { + evas_object_data_set(mapbuf, "mapbuf_enabled", (void*)-1); + elm_mapbuf_enabled_set(mapbuf, 0); + return MENU_SCREEN_ERROR_OK; + } + + cnt = (int)evas_object_data_get(mapbuf, "mapbuf_enabled"); + if (cnt == 0) { + if (elm_mapbuf_enabled_get(mapbuf)) { + elm_mapbuf_enabled_set(mapbuf, 0); + //_D("[%s] disableld mapbuf", __func__); + } + } + + cnt --; + evas_object_data_set(mapbuf, "mapbuf_enabled", (void*)cnt); + //_D("[%s] CNT = %d", __func__, cnt); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page) +{ + Evas_Object *mapbuf; + + mapbuf = elm_mapbuf_add(box); + if (!mapbuf) { + _D("Failed to create a new mapbuf"); + return NULL; + } + + elm_mapbuf_smooth_set(mapbuf, EINA_TRUE); + elm_mapbuf_alpha_set(mapbuf, EINA_TRUE); + elm_object_content_set(mapbuf, page); + + evas_object_data_set(page, "mapbuf", mapbuf); + evas_object_data_set(mapbuf, "page", page); + mapbuf_disable(mapbuf, 1); + evas_object_show(mapbuf); + + return mapbuf; +} + + + +HAPI Evas_Object *mapbuf_unbind(Evas_Object *obj) +{ + Evas_Object *page; + Evas_Object *mapbuf; + + page = evas_object_data_get(obj, "page"); + if (page) { + mapbuf = obj; + } else { + page = obj; + mapbuf = evas_object_data_get(obj, "mapbuf"); + } + + if (mapbuf) { + elm_mapbuf_enabled_set(mapbuf, 0); + evas_object_data_del(page, "mapbuf"); + evas_object_data_del(mapbuf, "page"); + evas_object_data_del(mapbuf, "mapbuf_enabled"); + page = elm_object_content_unset(mapbuf); + evas_object_del(mapbuf); + } + return page; +} + + + +// End of a file diff --git a/src/menu_screen.c b/src/menu_screen.c new file mode 100644 index 0000000..5ad84b9 --- /dev/null +++ b/src/menu_screen.c @@ -0,0 +1,627 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "conf.h" +#include "item.h" +#include "key.h" +#include "layout.h" +#include "mapbuf.h" +#include "menu_screen.h" +#include "mouse.h" +#include "page.h" +#include "page_scroller.h" +#include "util.h" + +#define MENU_SCREEN_ENGINE "file/private/org.tizen.menu-screen/engine" + +#define LAYOUT_EDJE_PORTRAIT EDJEDIR"/layout_portrait.edj" +#define LAYOUT_GROUP_NAME "layout" + + + +// Define prototype of the "hidden API of AUL" +extern int aul_listen_app_dead_signal(int (*func)(int signal, void *data), void *data); +static struct { + int state; + int root_width; + int root_height; + int is_tts; + Evas *evas; + Ecore_Evas *ee; + Evas_Object *win; + Elm_Theme *theme; + bool is_done; +} menu_screen_info = { + .state = APP_STATE_PAUSE, + .is_tts = false, + .evas = NULL, + .ee = NULL, + .win = NULL, + .theme = NULL, + .is_done = false, +}; + + + +HAPI Evas *menu_screen_get_evas(void) +{ + return menu_screen_info.evas; +} + + + +HAPI int menu_screen_get_root_width(void) +{ + return menu_screen_info.root_width; +} + + + +HAPI int menu_screen_get_root_height(void) +{ + return menu_screen_info.root_height; +} + + + +HAPI Evas_Object *menu_screen_get_win(void) +{ + return menu_screen_info.win; +} + + + +HAPI Elm_Theme *menu_screen_get_theme(void) +{ + return menu_screen_info.theme; +} + + + +HAPI bool menu_screen_get_done(void) +{ + return menu_screen_info.is_done; +} + + + +HAPI void menu_screen_set_done(bool is_done) +{ + menu_screen_info.is_done = is_done; +} + + + +HAPI int menu_screen_get_state(void) +{ + return menu_screen_info.state; +} + + + +HAPI int menu_screen_is_tts(void) +{ + return menu_screen_info.is_tts; +} + + + +static menu_screen_error_e _create_canvas(char *name, char *title) +{ + Ecore_X_Atom ATOM_WM_WINDOW_ROLE; + + menu_screen_info.win = elm_win_add(NULL, name, ELM_WIN_BASIC); + retv_if(NULL == menu_screen_info.win, MENU_SCREEN_ERROR_FAIL); + + if (title) { + elm_win_title_set(menu_screen_info.win, title); + } + elm_win_borderless_set(menu_screen_info.win, EINA_TRUE); + + ecore_x_icccm_name_class_set(elm_win_xwindow_get(menu_screen_info.win), "MENU_SCREEN", "MENU_SCREEN"); + ATOM_WM_WINDOW_ROLE = ecore_x_atom_get("WM_WINDOW_ROLE"); + if (ATOM_WM_WINDOW_ROLE) { + ecore_x_window_prop_string_set(elm_win_xwindow_get(menu_screen_info.win), ATOM_WM_WINDOW_ROLE, "MENU_SCREEN"); + } else { + _D("Failed to set the window role as MENU_SCREEN"); + } + + menu_screen_info.evas = evas_object_evas_get(menu_screen_info.win); + if (!menu_screen_info.evas) { + _E("[%s] Failed to get the evas object", __func__); + } + + menu_screen_info.ee = ecore_evas_ecore_evas_get(menu_screen_info.evas); + if (!menu_screen_info.ee) { + _E("[%s] Failed to get ecore_evas object", __func__); + } + + evas_object_size_hint_min_set(menu_screen_info.win, menu_screen_info.root_width, menu_screen_info.root_height); + evas_object_size_hint_max_set(menu_screen_info.win, menu_screen_info.root_width, menu_screen_info.root_height); + evas_object_resize(menu_screen_info.win, menu_screen_info.root_width, menu_screen_info.root_height); + evas_object_show(menu_screen_info.win); + + return MENU_SCREEN_ERROR_OK; +} + + + +static void _destroy_canvas(void) +{ + evas_object_del(menu_screen_info.win); +} + + + +static int _dead_cb(int pid, void *data) +{ + return EXIT_SUCCESS; +} + + + +static void _get_window_size(void) +{ + Ecore_X_Window focus_win; + Ecore_X_Window root_win; + + focus_win = ecore_x_window_focus_get(); + root_win = ecore_x_window_root_get(focus_win); + ecore_x_window_size_get(root_win, &menu_screen_info.root_width, &menu_screen_info.root_height); + + _D("width:%d, height:%d", menu_screen_info.root_width, menu_screen_info.root_height); +} + + + +static void _create_bg(void) +{ + char *buf; + Evas_Coord w; + Evas_Coord h; + Evas_Object *bg; + double f, wf, hf; + static int trigger = 0; + const char *key; + int width; + int height; + + buf = vconf_get_str(VCONFKEY_BGSET); + ret_if(NULL == buf); + + width = menu_screen_get_root_width(); + height = menu_screen_get_root_height(); + + bg = evas_object_data_get(menu_screen_get_win(), "bg"); + if (NULL == bg) { + Evas_Object *rect; + + rect = evas_object_rectangle_add(menu_screen_get_evas()); + ret_if(NULL == rect); + evas_object_data_set(menu_screen_get_win(), "rect", rect); + evas_object_color_set(rect, 0, 0, 0, 255); + evas_object_size_hint_min_set(rect, width, height); + evas_object_size_hint_max_set(rect, width, height); + evas_object_resize(rect, width, height); + evas_object_show(rect); + + bg = evas_object_image_add(menu_screen_get_evas()); + if (NULL == bg) { + free(buf); + return; + } + evas_object_image_load_orientation_set(bg, EINA_TRUE); + evas_object_data_set(menu_screen_get_win(), "bg", bg); + } + + if (trigger == 0) { + key = "/"; + trigger = 1; + } else { + key = NULL; + trigger = 0; + } + + evas_object_image_file_set(bg, buf, key); + evas_object_image_size_get(bg, &w, &h); + evas_object_image_filled_set(bg, 1); + + wf = (double) width / (double) w; + hf = (double) height / (double) h; + + f = wf < hf ? hf : wf; + + w = (int) ((double) f * (double) w); + h = (int) ((double) f * (double) h); + + evas_object_image_load_size_set(bg, w, h); + evas_object_image_fill_set(bg, 0, 0, w, h); + evas_object_move(bg, (width - w) / 2, (height - h) / 2); + evas_object_resize(bg, w, h); + evas_object_show(bg); + + free(buf); +} + + + + +static void _destroy_bg() +{ + Evas_Object *rect; + Evas_Object *bg; + + rect = evas_object_data_del(menu_screen_get_win(), "rect"); + evas_object_del(rect); + + bg = evas_object_data_del(menu_screen_get_win(), "bg"); + evas_object_del(bg); +} + + + +static void _change_bg_cb(keynode_t *node, void *data) +{ + _D("Background image is changed."); + _create_bg(); +} + + + +static void _init_theme(void) +{ + menu_screen_info.theme = elm_theme_new(); + elm_theme_ref_set(menu_screen_info.theme, NULL); + elm_theme_extension_add(menu_screen_info.theme, EDJEDIR"/index.edj"); +} + + + +static void _fini_theme(void) +{ + elm_theme_extension_del(menu_screen_info.theme, EDJEDIR"/index.edj"); + elm_theme_free(menu_screen_info.theme); + menu_screen_info.theme = NULL; + +} + + + +static Evas_Object *_create_conformant(Evas_Object *win) +{ + Evas_Object *conformant; + + conformant = elm_conformant_add(win); + retv_if(NULL == conformant, NULL); + + elm_object_style_set(conformant, "nokeypad"); + evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_data_set(conformant, "win", win); + evas_object_show(conformant); + + elm_win_resize_object_add(win, conformant); + elm_win_conformant_set(win, EINA_TRUE); + + return conformant; +} + + + +static void _destroy_conformant(Evas_Object *conformant) +{ + evas_object_data_del(conformant, "win"); + evas_object_del(conformant); +} + + + +static void _tts_cb(keynode_t *node, void *data) +{ + _D("change tts"); + + int val = -1; + if (0 == vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &val) && + menu_screen_info.is_tts != val) + { + menu_screen_info.is_tts = val; + } +} + + + +static bool _create_cb(void *data) +{ + Evas_Object *conformant; + + _get_window_size(); + _init_theme(); + retv_if(MENU_SCREEN_ERROR_FAIL == _create_canvas(PACKAGE, PACKAGE), false); + elm_win_indicator_mode_set(menu_screen_info.win, ELM_WIN_INDICATOR_SHOW); + + if (vconf_notify_key_changed(VCONFKEY_BGSET, _change_bg_cb, NULL) < 0) { + _E("Failed to register a vconf cb for %s\n", VCONFKEY_BGSET); + } + _create_bg(); + + conformant = _create_conformant(menu_screen_info.win); + retv_if(NULL == conformant, false); + evas_object_data_set(menu_screen_info.win, "conformant", conformant); + + Evas_Object *layout; + layout = layout_create(conformant, LAYOUT_EDJE_PORTRAIT, + LAYOUT_GROUP_NAME, MENU_SCREEN_ROTATE_PORTRAIT); + if (NULL == layout) { + _E("Failed to load an edje object"); + evas_object_del(menu_screen_info.win); + return false; + } + evas_object_data_set(menu_screen_info.win, "layout", layout); + +if (vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, _tts_cb, NULL) < 0) { + _E("Failed to register the tts callback"); + } + retv_if(vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &menu_screen_info.is_tts) < 0, MENU_SCREEN_ERROR_FAIL); + + elm_object_content_set(conformant, layout); + mouse_register(); + aul_listen_app_dead_signal(_dead_cb, NULL); + key_register(); + + return true; +} + + + +static void _terminate_cb(void *data) +{ + Evas_Object *conformant; + Evas_Object *layout; + + if (vconf_ignore_key_changed(VCONFKEY_BGSET, _change_bg_cb) < 0) { + _E("Failed to remove bgset [%s]\n", VCONFKEY_BGSET); + } + + if (vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, _tts_cb) < 0) { + _E("Failed to ignore the alpha callback"); + } + + evas_object_hide(menu_screen_info.win); + + key_unregister(); + mouse_unregister(); + + layout = evas_object_data_del(menu_screen_info.win, "layout"); + if (layout) layout_destroy(layout); + + conformant = evas_object_data_del(menu_screen_info.win, "conformant"); + if (conformant) _destroy_conformant(conformant); + + _destroy_bg(); + _destroy_canvas(); + _fini_theme(); + evas_object_del(menu_screen_info.win); +} + + + +static void _pause_cb(void *data) +{ + _D("Pause start"); + + if (vconf_set_int(VCONFKEY_IDLE_SCREEN_TOP, VCONFKEY_IDLE_SCREEN_TOP_FALSE) < 0) { + _E("Failed to set %s to 0", VCONFKEY_IDLE_SCREEN_TOP); + } + + menu_screen_info.state = APP_STATE_PAUSE; +} + + + +static void _resume_cb(void *data) +{ + _D("START RESUME"); + + if (vconf_set_int(VCONFKEY_IDLE_SCREEN_TOP, VCONFKEY_IDLE_SCREEN_TOP_TRUE) < 0) { + _E("Failed to set %s to 1", VCONFKEY_IDLE_SCREEN_TOP); + } + + do { // Focus + Evas_Object *layout = evas_object_data_get(menu_screen_info.win, "layout"); + break_if(NULL == layout); + + Evas_Object *all_apps = evas_object_data_get(layout, "all_apps"); + break_if(NULL == all_apps); + + Evas_Object *scroller = elm_object_part_content_get(all_apps, "content"); + break_if(NULL == scroller); + + page_scroller_focus(scroller); + } while (0); + + menu_screen_info.state = APP_STATE_RESUME; +} + + + +static void _service_cb(service_h service, void *data) +{ + _D("START RESET : %d", menu_screen_info.state); + + if (vconf_set_int(VCONFKEY_IDLE_SCREEN_TOP, VCONFKEY_IDLE_SCREEN_TOP_TRUE) < 0) { + _E("Failed to set %s to 1", VCONFKEY_IDLE_SCREEN_TOP); + } + + do { // Focus + Evas_Object *layout = evas_object_data_get(menu_screen_info.win, "layout"); + break_if(NULL == layout); + + Evas_Object *all_apps = evas_object_data_get(layout, "all_apps"); + break_if(NULL == all_apps); + + Evas_Object *scroller = elm_object_part_content_get(all_apps, "content"); + break_if(NULL == scroller); + + page_scroller_focus(scroller); + } while (0); +} + + + +static void _language_changed_cb(void *data) +{ + register unsigned int i; + register unsigned int j; + unsigned int count; + Evas_Object *layout; + Evas_Object *all_apps; + Evas_Object *scroller; + Evas_Object *page; + Evas_Object *item; + unsigned int page_max_app; + + _D("Language is changed"); + + if (false == menu_screen_info.is_done) { + elm_exit(); + } + + layout = evas_object_data_get(menu_screen_info.win, "layout"); + ret_if(NULL == layout); + all_apps = evas_object_data_get(layout, "all_apps"); + ret_if(NULL == all_apps); + scroller = elm_object_part_content_get(all_apps, "content"); + ret_if(NULL == scroller); + + count = page_scroller_count_page(scroller); + page_max_app = (unsigned int) evas_object_data_get(scroller, "page_max_app"); + for (i = 0; i < count; i ++) { + page = page_scroller_get_page_at(scroller, i); + if (!page) continue; + if (mapbuf_is_enabled(page)) { + mapbuf_disable(page, 1); + } + + for (j = 0; j < page_max_app; j ++) { + ail_appinfo_h ai; + char *name; + + item = page_get_item_at(page, j); + if (!item) continue; + + if (ail_get_appinfo(item_get_package(item), &ai) < 0) continue; + if (ail_appinfo_get_str(ai, AIL_PROP_NAME_STR, &name) < 0) { + ail_destroy_appinfo(ai); + continue; + } + + if (!name) { + _D("Failed to get name for %s", item_get_package(item)); + ail_destroy_appinfo(ai); + continue; + } + + item_set_name(item, name, 0); + ail_destroy_appinfo(ai); + } + + mapbuf_enable(page, 1); + } +} + + + +static void _init(app_event_callback_s *event_callback) +{ + event_callback->create = _create_cb; + event_callback->terminate = _terminate_cb; + event_callback->pause = _pause_cb; + event_callback->resume = _resume_cb; + event_callback->service = _service_cb; + event_callback->low_memory = NULL; + event_callback->low_battery = NULL; + event_callback->device_orientation = NULL; + event_callback->language_changed = _language_changed_cb; + event_callback->region_format_changed = NULL; +} + + + +static void _fini(void) +{ +} + + + +#define QP_EMUL_STR "Emulator" +static bool _is_emulator_on(void) +{ + char *info; + + if (system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &info) == 0) { + if (info == NULL) return false; + if (!strncmp(QP_EMUL_STR, info, strlen(info))) { + return true; + } + } + + return false; +} + + + +int main(int argc, char *argv[]) +{ + char *buf; + app_event_callback_s event_callback; + + if (_is_emulator_on()) { + _D("ELM_ENGINE is set as [software_x11]"); + setenv("ELM_ENGINE", "software_x11", 1); + } else { + buf = vconf_get_str(MENU_SCREEN_ENGINE); + if (buf) { + _D("ELM_ENGINE is set as [%s]", buf); + setenv("ELM_ENGINE", buf, 1); + free(buf); + } else { + _D("ELM_ENGINE is set as [gl]"); + setenv("ELM_ENGINE", "gl", 1); + } + } + + _init(&event_callback); + app_efl_main(&argc, &argv, &event_callback, NULL); + _fini(); + + return EXIT_SUCCESS; +} + + + + + +// End of a file diff --git a/src/mouse.c b/src/mouse.c new file mode 100644 index 0000000..e27d284 --- /dev/null +++ b/src/mouse.c @@ -0,0 +1,191 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include +#include +#include + +#include "menu_screen.h" +#include "conf.h" +#include "item.h" +#include "mouse.h" +#include "page.h" +#include "page_scroller.h" +#include "util.h" + +#define CHAGNE_POSITION_TIME 0.1f +#define CHANGE_POSITION_COUNT 5 +#define MOVE_THRESHOLD 10 + + + +static struct { + Ecore_Event_Handler *mouse_down; + Ecore_Event_Handler *mouse_up; + Ecore_Event_Handler *mouse_move; + bool pressed; + + Evas_Coord pre_x; + Evas_Coord pre_y; + bool is_initialized; + + Evas_Coord down_x; + Evas_Coord down_y; + Evas_Coord move_x; + Evas_Coord move_y; +} mouse_info = { + .mouse_down = NULL, + .mouse_up = NULL, + .mouse_move = NULL, + .pressed = false, + + .pre_x = 0, + .pre_y = 0, + .is_initialized = false, + + .down_x = 0, + .down_y = 0, + .move_x = 0, + .move_y = 0, +}; + + + +HAPI bool mouse_is_scrolling(void) +{ + bool scroll_x = false; + bool scroll_y = false; + + if (mouse_info.move_x > mouse_info.down_x + MOVE_THRESHOLD + || mouse_info.move_x < mouse_info.down_x - MOVE_THRESHOLD) + { + scroll_x = true; + } + + if (mouse_info.move_y > mouse_info.down_y + MOVE_THRESHOLD + || mouse_info.move_y < mouse_info.down_y - MOVE_THRESHOLD) + { + scroll_y = true; + } + + return scroll_x || scroll_y; +} + + + +static Eina_Bool _down_cb(void *data, int type, void *event) +{ + Ecore_Event_Mouse_Button *move = event; + + retv_if(true == mouse_info.pressed, ECORE_CALLBACK_RENEW); + + _D("Mouse down (%d,%d)", move->root.x, move->root.y); + + mouse_info.pressed = true; + mouse_info.is_initialized = false; + + mouse_info.down_x = move->root.x; + mouse_info.down_y = move->root.y; + + return ECORE_CALLBACK_RENEW; +} + + + +static Eina_Bool _up_cb(void *data, int type, void *event) +{ + Ecore_Event_Mouse_Button *move = event; + + _D("Mouse up (%d,%d)", move->root.x, move->root.y); + + retv_if(mouse_info.pressed == false, ECORE_CALLBACK_RENEW); + mouse_info.pressed = false; + mouse_info.pre_x = 0; + mouse_info.pre_y = 0; + + return ECORE_CALLBACK_RENEW; +} + + + +static Eina_Bool _move_cb(void *data, int type, void *event) +{ + Ecore_Event_Mouse_Move *move = event; + + mouse_info.move_x = move->root.x; + mouse_info.move_y = move->root.y; + + if (mouse_info.pressed == false) { + return ECORE_CALLBACK_RENEW; + } + + return ECORE_CALLBACK_RENEW; +} + + + +HAPI void mouse_register(void) +{ + mouse_info.mouse_down = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _down_cb, NULL); + if (!mouse_info.mouse_down) { + _D("Failed to register the mouse down event callback"); + } + + mouse_info.mouse_move = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _move_cb, NULL); + if (!mouse_info.mouse_move) { + _D("Failed to register the mouse move event callback"); + ecore_event_handler_del(mouse_info.mouse_down); + mouse_info.mouse_down = NULL; + } + + mouse_info.mouse_up = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _up_cb, NULL); + if (!mouse_info.mouse_up) { + _D("Failed to register the mouse up event callback"); + ecore_event_handler_del(mouse_info.mouse_down); + ecore_event_handler_del(mouse_info.mouse_move); + + mouse_info.mouse_down = NULL; + mouse_info.mouse_move = NULL; + } +} + + + +HAPI void mouse_unregister(void) +{ + if (mouse_info.mouse_down) { + ecore_event_handler_del(mouse_info.mouse_down); + mouse_info.mouse_down = NULL; + } + + if (mouse_info.mouse_up) { + ecore_event_handler_del(mouse_info.mouse_up); + mouse_info.mouse_up = NULL; + } + + if (mouse_info.mouse_move) { + ecore_event_handler_del(mouse_info.mouse_move); + mouse_info.mouse_move = NULL; + } +} + + + +// End of a file diff --git a/src/page.c b/src/page.c new file mode 100644 index 0000000..dffa633 --- /dev/null +++ b/src/page.c @@ -0,0 +1,568 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include + +#include "menu_screen.h" +#include "conf.h" +#include "index.h" +#include "item.h" +#include "item_event.h" +#include "layout.h" +#include "mapbuf.h" +#include "page.h" +#include "page_scroller.h" +#include "util.h" + +#define PAGE_GROUP_NAME "menu_bg" +#define PROP_PORTRAIT_HEIGHT (PAGE_PORTRAIT_HEIGHT / BASE_HEIGHT) + + + +HAPI inline void page_mark_dirty(Evas_Object *page) +{ + int value; + value = (int) evas_object_data_get(page, "dirty"); + evas_object_data_set(page, "dirty", (void*)(value + 1)); +} + + + +HAPI inline void page_unmark_dirty(Evas_Object *page) +{ + int value; + value = (int) evas_object_data_get(page, "dirty"); + if (value > 0) { + evas_object_data_set(page, "dirty", (void*)(value - 1)); + } +} + + + +HAPI inline void page_clean_dirty(Evas_Object *page) +{ + evas_object_data_set(page, "dirty", 0); +} + + + +HAPI inline int page_is_dirty(Evas_Object *page) +{ + return (int) evas_object_data_get(page, "dirty"); +} + + + +static menu_screen_error_e _insert_page_at(Evas_Object *scroller, Evas_Object *page, int index) +{ + unsigned int nr_of_pages; + Evas_Object *mapbuf; + Evas_Object *box; + + retv_if(NULL == page, MENU_SCREEN_ERROR_FAIL); + + if (index < 0) { + _D("Out of range"); + index = 0; + } + + box = evas_object_data_get(scroller, "box"); + retv_if(NULL == box, MENU_SCREEN_ERROR_FAIL); + + nr_of_pages = page_scroller_count_page(scroller); + if (index >= nr_of_pages) { + _D("Out of range. index : %d, total : %d", index, nr_of_pages); + mapbuf = evas_object_data_get(page, "mapbuf"); + if (mapbuf) { + elm_box_pack_end(box, mapbuf); + } else { + elm_box_pack_end(box, page); + } + } else { + Evas_Object *current; + Evas_Object *current_mapbuf; + const Eina_List *page_list; + + page_list = elm_box_children_get(box); + retv_if(NULL == page_list, MENU_SCREEN_ERROR_FAIL); + + current = eina_list_nth(page_list, index); + retv_if(NULL == current, MENU_SCREEN_ERROR_FAIL); + + current_mapbuf = mapbuf_get_mapbuf(current); + mapbuf = mapbuf_get_mapbuf(page); + + if (current_mapbuf && mapbuf) { + elm_box_pack_before(box, mapbuf, current_mapbuf); + } else if (!current_mapbuf && !mapbuf) { + elm_box_pack_before(box, page, current); + } else { + _D("Page has mapbuf, invalid"); + } + } + + page_mark_dirty(page); + + return MENU_SCREEN_ERROR_OK; +} + + + +static void _dim_down_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + _D("Dim down"); +} + + + +static void _dim_up_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + _D("Dim up"); +} + + + +HAPI Evas_Object *page_create(Evas_Object *scroller, int idx, int rotate) +{ + Evas_Object *page; + Evas_Object *bg; + Evas_Object *index; + Evas_Object *tab; + Evas_Object *mapbuf; + Evas_Object *box; + + char *page_edje; + bool enable_bg_image; + + unsigned int count; + int page_height; + int page_width; + + _D("Create a new page[%d]", idx); + + page_edje = evas_object_data_get(scroller, "page_edje"); + enable_bg_image = (bool) evas_object_data_get(scroller, "enable_bg_image"); + + page = layout_load_edj(scroller, page_edje, PAGE_GROUP_NAME); + retv_if(!page, NULL); + + edje_object_signal_callback_add(_EDJ(page), "dim,down", "menu", _dim_down_cb, NULL); + edje_object_signal_callback_add(_EDJ(page), "dim,up", "menu", _dim_up_cb, NULL); + + box = evas_object_data_get(scroller, "box"); + mapbuf = mapbuf_bind(box, page); + if (!mapbuf) { + _D("Failed to bind the object with mapbuf"); + } + + bg = evas_object_rectangle_add(menu_screen_get_evas()); + if (!bg) { + evas_object_del(page); + return NULL; + } + evas_object_color_set(bg, 0, 0, 0, 0); + + page_width = menu_screen_get_root_width(); + page_height = (int) ((double) PROP_PORTRAIT_HEIGHT * ((double) menu_screen_get_root_height())); + + evas_object_size_hint_min_set(bg, page_width, page_height); + evas_object_size_hint_max_set(bg, page_width, page_height); + + evas_object_size_hint_min_set(page, page_width, page_height); + evas_object_size_hint_max_set(page, page_width, page_height); + evas_object_resize(page, page_width, page_height); + + elm_object_part_content_set(page, "bg", bg); + + evas_object_data_set(page, "win", evas_object_data_get(scroller, "win")); + evas_object_data_set(page, "layout", evas_object_data_get(scroller, "layout")); + evas_object_data_set(page, "controlbar", evas_object_data_get(scroller, "controlbar")); + evas_object_data_set(page, "tab", evas_object_data_get(scroller, "tab")); + evas_object_data_set(page, "scroller", scroller); + evas_object_data_set(page, "page_edje", page_edje); + evas_object_data_set(page, "page_max_app", evas_object_data_get(scroller, "page_max_app")); + evas_object_data_set(page, "bg", bg); + evas_object_data_set(page, "pending,list", NULL); + evas_object_data_set(page, "dirty", (void *) 0); + + if (_insert_page_at(scroller, page, idx) != MENU_SCREEN_ERROR_OK) { + evas_object_del(bg); + evas_object_del(page); + return NULL; + } + + index = evas_object_data_get(scroller, "index"); + if (index) { + tab = evas_object_data_get(scroller, "tab"); + count = page_scroller_count_page(scroller); + index = index_update(tab, index, count); + evas_object_data_set(scroller, "index", index); + } + + return page; +} + + + +HAPI void page_destroy(Evas_Object *scroller, Evas_Object *page) +{ + Evas_Object *mapbuf; + Evas_Object *bg; + Evas_Object *item; + Evas_Object *box; + Evas_Object *index; + Evas_Object *tab; + Eina_List *pending_list; + + register unsigned int i; + int page_max_app; + unsigned int count; + + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + for (i = 0; i < page_max_app; i ++) { + item = page_unpack_item_at(page, i); + if (!item) continue; + + item_destroy(item); + } + + pending_list = evas_object_data_get(page, "pending,list"); + eina_list_free(pending_list); + + bg = evas_object_data_get(page, "bg"); + evas_object_del(bg); + + box = evas_object_data_get(scroller, "box"); + ret_if(NULL == box); + + mapbuf = mapbuf_get_mapbuf(page); + if (mapbuf) { + elm_box_unpack(box, mapbuf); + mapbuf_unbind(mapbuf); + } else { + elm_box_unpack(box, page); + } + + index = evas_object_data_get(scroller, "index"); + tab = evas_object_data_get(scroller, "tab"); + if (index && tab) { + count = page_scroller_count_page(scroller); + if (count) { + index = index_update(tab, index, count); + evas_object_data_set(scroller, "index", index); + } + else { + index_destroy(index); + evas_object_data_set(scroller, "index", NULL); + } + } + + evas_object_data_del(page, "win"); + evas_object_data_del(page, "layout"); + evas_object_data_del(page, "controlbar"); + evas_object_data_del(page, "tab"); + evas_object_data_del(page, "scroller"); + evas_object_data_del(page, "page_edje"); + evas_object_data_del(page, "page_max_app"); + evas_object_data_del(page, "bg"); + evas_object_data_del(page, "pending,list"); + evas_object_data_del(page, "dirty"); + layout_unload_edj(page); +} + + + +HAPI Evas_Object *page_get_item_at(Evas_Object *page, unsigned int idx) +{ + Eina_List *pending_list; + Eina_List *n; + Eina_List *t; + + Evas_Object *pending_item; + + char swallow_name[PATH_MAX]; + int pending_idx; + + pending_list = evas_object_data_get(page, "pending,list"); + EINA_LIST_FOREACH_SAFE(pending_list, n, t, pending_item) { + pending_idx = (int) evas_object_data_get(pending_item, "pending,idx"); + if (pending_idx == idx) { + return pending_item; + } + } + + snprintf(swallow_name, sizeof(swallow_name), "menu_swallow_%d", idx); + + return edje_object_part_swallow_get(_EDJ(page), swallow_name); +} + + + +HAPI menu_screen_error_e page_unpack_item(Evas_Object *page, Evas_Object *item) +{ + char tmp[PATH_MAX]; + Evas_Object *check_item; + + Eina_List *pending_list; + Eina_List *n; + Eina_List *t; + Evas_Object *pend_item; + int pending_idx = -1; + + retv_if(NULL == item, MENU_SCREEN_ERROR_FAIL); + + pending_list = evas_object_data_get(page, "pending,list"); + EINA_LIST_FOREACH_SAFE(pending_list, n, t, pend_item) { + if (pend_item == item) { + pending_idx = (int)evas_object_data_get(pend_item, "pending,idx"); + pending_list = eina_list_remove(pending_list, pend_item); + evas_object_data_set(page, "pending,list", pending_list); + } + } + + retv_if(pending_idx == -1, MENU_SCREEN_ERROR_FAIL); + sprintf(tmp, "menu_swallow_%d", pending_idx); + + check_item = edje_object_part_swallow_get(_EDJ(page), tmp); + retv_if(check_item != item, MENU_SCREEN_ERROR_FAIL); + + check_item = elm_object_part_content_unset(page, tmp); + if (check_item) { + elm_object_part_content_set(page, tmp, NULL); + page_mark_dirty(page); + } + + mapbuf_disable(page, 1); + mapbuf_enable(page, 1); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI Evas_Object *page_unpack_item_at(Evas_Object *page, int idx) +{ + Eina_List *pending_list; + Eina_List *n; + Eina_List *t; + + Evas_Object *object; + Evas_Object *pending_item; + + char tmp[PATH_MAX]; + int pending_idx; + + pending_list = evas_object_data_get(page, "pending,list"); + EINA_LIST_FOREACH_SAFE(pending_list, n, t, pending_item) { + pending_idx = (int) evas_object_data_get(pending_item, "pending,idx"); + if (pending_idx == idx) { + pending_list = eina_list_remove(pending_list, pending_item); + evas_object_data_set(page, "pending,list", pending_list); + } + } + + object = page_get_item_at(page, idx); + if (object) { + Evas_Object *check_object; + sprintf(tmp, "menu_swallow_%d", idx); + + check_object = elm_object_part_content_unset(page, tmp); + if (check_object != object) { + elm_object_part_content_set(page, tmp, NULL); + _D("page_unpack_item_at - different object is picked up"); + } + + page_mark_dirty(page); + } + + mapbuf_disable(page, 1); + mapbuf_enable(page, 1); + + return object; +} + + + +HAPI void page_pack_item(Evas_Object *page, int idx, Evas_Object *item) +{ + char tmp[PATH_MAX]; + Evas_Object *object; + Eina_List *list; + + ret_if(NULL == page); + ret_if(NULL == item); + + list = evas_object_data_get(page, "pending,list"); + if (NULL == eina_list_data_find(list, item)) { + list = eina_list_append(list, item); + evas_object_data_set(page, "pending,list", list); + } + evas_object_data_set(item, "pending,idx", (void*)idx); + + mapbuf_disable(page, 0); + + snprintf(tmp, sizeof(tmp), "menu_swallow_%d", idx); + object = elm_object_part_content_unset(page, tmp); + if (object) { + elm_object_part_content_set(page, tmp, NULL); + item_destroy(object); + } + + item_set_page(item, page, 1); + item_mark_dirty(item); + elm_object_part_content_set(page, tmp, item); + page_mark_dirty(page); + + mapbuf_disable(page, 1); + mapbuf_enable(page, 1); +} + + + +HAPI void page_set_item(Evas_Object *page, int idx, Evas_Object *item) +{ + Eina_List *list; + + ret_if(NULL == page); + ret_if(NULL == item); + + list = evas_object_data_get(page, "pending,list"); + if (NULL == eina_list_data_find(list, item)) { + list = eina_list_append(list, item); + evas_object_data_set(page, "pending,list", list); + } + evas_object_data_set(item, "pending,idx", (void *) idx); + + item_set_page(item, page, 1); + + mapbuf_disable(page, 1); + mapbuf_enable(page, 1); +} + + + +HAPI inline unsigned int page_count_item(Evas_Object *page) +{ + register unsigned int i; + unsigned int count = 0; + int page_max_app; + + page_max_app = (int) evas_object_data_get(page, "page_max_app"); + for (i = 0; i < page_max_app; i++) { + if (page_get_item_at(page, i)) { + count ++; + } + } + + return count; +} + + + +HAPI int page_find_empty_near(Evas_Object *page, int pivot) +{ + int pivot_saved = pivot; + Evas_Object *obj; + int page_max_app; + + retv_if(NULL == page, -1); + + obj = page_get_item_at(page, pivot); + if (NULL == obj) return pivot; + + for (pivot --; pivot >= 0; pivot --) { + obj = page_get_item_at(page, pivot); + if (!obj) { + break; + } + } + + if (pivot >= 0) { + return (int) pivot; + } + + page_max_app = (int) evas_object_data_get(page, "page_max_app"); + for (pivot = pivot_saved + 1; pivot < page_max_app; pivot ++) { + obj = page_get_item_at(page, pivot); + if (!obj) break; + } + + if (pivot < page_max_app) { + return pivot; + } + + return -1; +} + + + +HAPI int page_find_first_empty(Evas_Object *page, int pivot) +{ + Evas_Object *item; + Evas_Object *scroller; + int idx; + int page_max_app; + + scroller = evas_object_data_get(page, "tab"); + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + + for (idx = pivot; idx < page_max_app; idx ++) { + item = page_get_item_at(page, idx); + if (!item) { + break; + } + } + + return idx; +} + + + +HAPI void page_trim_items(Evas_Object *page) +{ + Evas_Object *item; + register unsigned int i; + char buf[32]; + int to = -1; + int page_max_app; + + page_max_app = (int) evas_object_data_get(page, "page_max_app"); + for (i = 0; i < page_max_app; i ++) { + item = page_get_item_at(page, i); + if (!item) { + if (to < 0) { + to = i; + } + continue; + } + + if (to >= 0) { + item = page_unpack_item_at(page, i); + page_pack_item(page, to, item); + snprintf(buf, 32, "menu%d", to); + edje_object_signal_emit(_EDJ(page), STR_MOVE_NEXT, buf); + edje_object_signal_emit(_EDJ(page), STR_ANI_RETURN, buf); + to ++; + } + } +} + + + + +// End of a file diff --git a/src/page_scroller.c b/src/page_scroller.c new file mode 100644 index 0000000..aefcc49 --- /dev/null +++ b/src/page_scroller.c @@ -0,0 +1,1309 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include + +#include "item_badge.h" +#include "conf.h" +#include "index.h" +#include "item.h" +#include "item_event.h" +#include "layout.h" +#include "list.h" +#include "mapbuf.h" +#include "menu_screen.h" +#include "page.h" +#include "page_scroller.h" +#include "pkgmgr.h" +#include "util.h" + +#define BUFSZE 1024 +#define PAGE_SCROLL_SENSITIVE 0.2 +#define PROP_PORTRAIT_HEIGHT (PAGE_PORTRAIT_HEIGHT / BASE_HEIGHT) + + + +HAPI void page_scroller_bring_in(Evas_Object *scroller, int idx) +{ + Evas_Object *index; + int w, h; + + _D("BRING IN TO %d", idx); + + evas_object_data_set(scroller, "current_idx", (void *) idx); + + evas_object_geometry_get(scroller, NULL, NULL, &w, &h); + elm_scroller_region_bring_in(scroller, idx * w, 0, w, h); + + index = evas_object_data_get(scroller, "index"); + if (!index) { + _E("cannot find index."); + } + _D("page index bring in to %d", idx); + index_bring_in(index, idx); +} + + + +HAPI void page_scroller_show_region(Evas_Object *scroller, int idx) +{ + Evas_Object *index; + int w, h; + + evas_object_geometry_get(scroller, NULL, NULL, &w, &h); + elm_scroller_region_show(scroller, idx * w, 0, w, h); + + index = evas_object_data_get(scroller, "index"); + if (!index) { + _E("cannot find index."); + } + _D("page index bring in to %d", idx); + index_bring_in(index, idx); +} + + + +static void _anim_stop_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _D("stop the scroller(%p) animation", scroller); + + /* page_scroller_focus & index_bring_in in _drag_stop_cb & _anim_stop_cb */ + Evas_Coord x, y, w, h; + elm_scroller_region_get(scroller, &x, &y, &w, &h); + + if (x % w) return; + + if(evas_object_data_get(scroller, "mouse_wheel_scroller_start")) { + // "page_scroller_bring_in" was invoked in "_mouse_wheel_cb", + // so condition cur_idx == idx will be true and "page_scroller_focus" won't be executed + // so "page_scroller_focus" is executed here. + evas_object_data_set(scroller, "mouse_wheel_scroller_start", (void *) 0); + page_scroller_focus(scroller); + } + + int cur_idx = page_scroller_get_current_page_no(scroller); + int idx = 0; + if (w) idx = x / w; + if (cur_idx == idx) return; + + page_scroller_bring_in(scroller, idx); + page_scroller_focus(scroller); +} + + + +static void _anim_start_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _D("start the scroller(%p) animation", scroller); + + int drag_start = (int) evas_object_data_get(scroller, "drag_start"); + if (drag_start == 0) return; + evas_object_data_set(scroller, "drag_start", (void *) 0); +} + + + + + + +static void _drag_start_cb(void *data, Evas_Object *scroller, void *event_info) +{ + int previous_x; + + _D("Invoked"); + + elm_scroller_region_get(scroller, &previous_x, NULL, NULL, NULL); + evas_object_data_set(scroller, "previous_x", (void *) previous_x); + evas_object_data_set(scroller, "drag_start", (void *) 1); +} + + + +static void _drag_stop_cb(void *data, Evas_Object *scroller, void *event_info) +{ + Evas_Coord x, y, w, h; + int previous_x; + + _D("Invoked"); + + elm_scroller_region_get(scroller, &x, &y, &w, &h); + previous_x = (int) evas_object_data_get(scroller, "previous_x"); + if (x == previous_x) { + _D("Hold scroller (previous) %d (current) %d", previous_x, x); + } + + /* page_scroller_focus & index_bring_in in _drag_stop_cb & _anim_stop_cb */ + if (x % w) return; + + int cur_idx = page_scroller_get_current_page_no(scroller); + int idx = 0; + if (w) idx = x / w; + + if (cur_idx == idx) return; + + page_scroller_bring_in(scroller, idx); + page_scroller_focus(scroller); +} + + +static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info) +{ + _drag_stop_cb(data, scroller, event_info); +} + + + +static menu_screen_error_e _find_position_by_default(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) +{ + Evas_Object *page; + Evas_Object *item; + register unsigned int page_no; + register unsigned int position_no; + unsigned int nr_of_pages; + int page_max_app; + + retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + *candidate_page = 0; + *candidate_pos = 0; + nr_of_pages = page_scroller_count_page(scroller); + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + for (page_no = 0; page_no < nr_of_pages; page_no ++) { + page = page_scroller_get_page_at(scroller, page_no); + if (!page) { + _D("Page is not found at %d", page_no); + return MENU_SCREEN_ERROR_FAIL; + } + + for (position_no = 0; position_no < page_max_app; position_no ++) { + item = page_get_item_at(page, position_no); + if (!item) { + *candidate_page = page_no; + *candidate_pos = position_no; + return MENU_SCREEN_ERROR_OK; + } + } + } + + *candidate_page = page_no; + *candidate_pos = 0; + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _find_position_by_package(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) +{ + Evas_Object *page; + Evas_Object *item; + register int page_no; + register int position_no; + unsigned int nr_of_pages; + int page_max_app; + app_info_t *ai = data; + + retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == data, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == ai->package, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + *candidate_page = 0; + *candidate_pos = 0; + nr_of_pages = page_scroller_count_page(scroller); + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + for (page_no = 0; page_no < nr_of_pages; page_no ++) { + page = page_scroller_get_page_at(scroller, page_no); + if (!page) { + _D("Page is not found at %d", page_no); + return MENU_SCREEN_ERROR_FAIL; + } + + for (position_no = 0; position_no < page_max_app; position_no ++) { + char *package; + + item = page_get_item_at(page, position_no); + if (!item) { + *candidate_page = page_no; + *candidate_pos = position_no; + return MENU_SCREEN_ERROR_OK; + } else if ((package = item_get_package(item)) && strcmp(package, ai->package) > 0) { + *candidate_page = page_no; + *candidate_pos = position_no; + return MENU_SCREEN_ERROR_OK; + } + } + } + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _find_position_by_name(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) +{ + Evas_Object *page; + Evas_Object *item; + register int page_no; + register int position_no; + unsigned int nr_of_pages; + int page_max_app; + app_info_t *ai = data; + + retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == candidate_page, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == candidate_pos, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == data, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == ai->name, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + *candidate_page = 0; + *candidate_pos = 0; + nr_of_pages = page_scroller_count_page(scroller); + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + for (page_no = 0; page_no < nr_of_pages; page_no ++) { + page = page_scroller_get_page_at(scroller, page_no); + if (!page) { + _D("Page is not found at %d", page_no); + return MENU_SCREEN_ERROR_FAIL; + } + + for (position_no = 0; position_no < page_max_app; position_no ++) { + char *name; + + item = page_get_item_at(page, position_no); + if (!item) { + *candidate_page = page_no; + *candidate_pos = position_no; + return MENU_SCREEN_ERROR_OK; + } else if ((name = item_get_name(item)) && strcmp(name, ai->name) > 0) { + *candidate_page = page_no; + *candidate_pos = position_no; + return MENU_SCREEN_ERROR_OK; + } + } + } + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _animated_pack_item(Evas_Object *item, Evas_Object *scroller, Evas_Object *page, int from) +{ + Evas_Object *item_out_page = NULL; + char buf[32]; + int to; + int page_no; + + retv_if(NULL == item, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == scroller, MENU_SCREEN_ERROR_INVALID_PARAMETER); + retv_if(NULL == page, MENU_SCREEN_ERROR_INVALID_PARAMETER); + + page_no = page_scroller_get_page_no(scroller, page); + do { + to = page_find_empty_near(page, from); + if (to < 0) { + int page_max_app; + page_max_app = (int) evas_object_data_get(page, "page_max_app"); + to = page_max_app - 1; + item_out_page = page_unpack_item_at(page, to); + } + + for (to --; to >= from; to --) { + Evas_Object *item_in_page; + item_in_page = page_unpack_item_at(page, to); + page_pack_item(page, to + 1, item_in_page); + snprintf(buf, 32, "menu%d", to + 1); + edje_object_signal_emit(_EDJ(page), STR_MOVE_PREV, buf); + edje_object_signal_emit(_EDJ(page), STR_ANI_RETURN, buf); + } + + page_pack_item(page, from, item); + + if (!item_out_page) break; + + page_no ++; + page = page_scroller_get_page_at(scroller, page_no); + if (!page) { + int rotate; + rotate = (int) evas_object_data_get(scroller, "rotate"); + page = page_create(scroller, page_no, rotate); + retv_if(NULL == page, MENU_SCREEN_ERROR_FAIL); + mapbuf_enable(page, 0); + } + + from = 0; + item = item_out_page; + item_out_page = NULL; + } while (page && item); + + return MENU_SCREEN_ERROR_OK; +} + + + +static Evas_Object *_animated_unpack_item(Evas_Object *scroller, Evas_Object *page, unsigned int pos) +{ + Evas_Object *out = NULL; + Evas_Object *item; + Evas_Object *next_page; + + char buf[32]; + unsigned int page_max_app; + unsigned int page_no; + page_scroller_sort_type_e sort_type; + + out = page_unpack_item_at(page, pos); + retv_if(NULL == out, NULL); + + page_no = page_scroller_get_page_no(scroller, page); + page_max_app = (unsigned int) evas_object_data_get(scroller, "page_max_app"); + sort_type = (page_scroller_sort_type_e) evas_object_data_get(scroller, "sort_type"); + + pos ++; + while (page && page_no < MAX_PAGE_NO) { + if (0 == page_count_item(page)) { + page_destroy(scroller, page); + break; + } + + for (; pos < page_max_app; pos ++) { + item = page_unpack_item_at(page, pos); + if (NULL == item) continue; + + page_pack_item(page, pos - 1, item); + snprintf(buf, 32, "menu%d", pos - 1); + edje_object_signal_emit(_EDJ(page), STR_MOVE_NEXT, buf); + edje_object_signal_emit(_EDJ(page), STR_ANI_RETURN, buf); + } + + if (sort_type == PAGE_SCROLLER_SORT_MAX) { + return NULL; + } + + page_no ++; + next_page = page_scroller_get_page_at(scroller, page_no); + if (next_page) { + item = page_unpack_item_at(next_page, 0); + if (NULL == item) continue; + + page_pack_item(page, page_max_app - 1, item); + } else break; + + pos = 1; + page = next_page; + } + + return out; +} + + + +HAPI Evas_Object *page_scroller_push_item(Evas_Object *scroller, app_info_t *ai) +{ + Evas_Object *page; + Evas_Object *item; + unsigned int nr_of_pages; + int candidate_page = -1; + int candidate_pos = 0; + int sort_type; + register int i; + + struct { + page_scroller_sort_type_e sort_type; + menu_screen_error_e (*sort_func)(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data); + } sort_type_map[] = { + { + .sort_type = PAGE_SCROLLER_SORT_BY_DEFAULT, + .sort_func = _find_position_by_default, + }, + { + .sort_type = PAGE_SCROLLER_SORT_BY_PACKAGE, + .sort_func = _find_position_by_package, + }, + { + .sort_type = PAGE_SCROLLER_SORT_BY_NAME, + .sort_func = _find_position_by_name, + }, + { + .sort_type = PAGE_SCROLLER_SORT_MAX, + .sort_func = NULL, + }, + }; + + sort_type = (int) evas_object_data_get(scroller, "sort_type"); + sort_type_map[sort_type].sort_func(scroller, &candidate_page, &candidate_pos, ai); + + nr_of_pages = page_scroller_count_page(scroller); + + for (i = nr_of_pages; i <= candidate_page; i ++) { + Evas_Object *new_page; + int rotate; + + rotate = (int) evas_object_data_get(scroller, "rotate"); + new_page = page_create(scroller, nr_of_pages, rotate); + retv_if(NULL == new_page, NULL); + mapbuf_enable(new_page, 0); + } + + item = item_create(scroller, ai); + retv_if(NULL == item, NULL); + + page = page_scroller_get_page_at(scroller, candidate_page); + if (!page) { + _D("Impossible, page is not found"); + item_destroy(item); + return NULL; + } + + retv_if(MENU_SCREEN_ERROR_OK != + _animated_pack_item(item, scroller, page, candidate_pos), + NULL); + + return item; +} + + + +static inline menu_screen_error_e _create_cb(const char *package, void *data) +{ + app_info_t ai = {0,}; + Evas_Object *item; + Evas_Object *scroller = data; + + if (MENU_SCREEN_ERROR_FAIL == list_get_values(package, &ai)) { + list_free_values(&ai); + return MENU_SCREEN_ERROR_FAIL; + } + + do { + if (!scroller) { + _D("Scroller is NULL."); + break; + } + + if (ai.nodisplay || !ai.enabled) + { + Evas_Object *page; + + _D("package %s is not visible", package); + item = pkgmgr_find_pended_object(ai.package, 1, scroller, &page); + if (item) { + if (page) { + page_unpack_item(page, item); + page_scroller_trim_items(scroller); + } + + item_destroy(item); + } + + break; + } + + item = pkgmgr_find_pended_object(ai.package, 1, scroller, NULL); + if (!item) { + item = page_scroller_find_item_by_package(scroller, ai.package, NULL); + if (!item) { + Evas_Object *item; + _D("package %s is installed directly", package); + item = page_scroller_push_item(scroller, &ai); + if (item) { + break; + } else { + list_free_values(&ai); + retv_if(1, MENU_SCREEN_ERROR_FAIL); + } + } + } + + _D("Package %s is found, update it!", package); + item_update(item, &ai); + } while(0); + + list_free_values(&ai); + return MENU_SCREEN_ERROR_OK; +} + + + +static inline menu_screen_error_e _update_cb(const char *package, void *data) +{ + Evas_Object *scroller = data; + Evas_Object *item; + int page_no = 0; + app_info_t ai = {0,}; + + if (MENU_SCREEN_ERROR_FAIL == list_get_values(package, &ai)) { + list_free_values(&ai); + return MENU_SCREEN_ERROR_FAIL; + } + + do { + if (!scroller) { + _D("Scroller is NULL."); + break; + } + + item = page_scroller_find_item_by_package(scroller, package, &page_no); + if (!item) { + Evas_Object *page; + _D("There is no loaded item is found"); + item = pkgmgr_find_pended_object(package, 1, scroller, &page); + if (item) { + if (!ai.nodisplay && ai.enabled) { + _D("Item is found for updating from the install list, Ignore this."); + item_update(item, &ai); + } else { + _D("Item is found for updating from the install list, But nodisplay"); + if (page) { + page_unpack_item(page, item); + page_scroller_trim_items(scroller); + } + item_destroy(item); + } + } else { + Evas_Object *item; + _D("Item is not found. Create a new one"); + item = ((!ai.nodisplay && ai.enabled) ? page_scroller_push_item(scroller, &ai) : NULL); + if (item) { + break; + } else { + list_free_values(&ai); + retv_if(1, MENU_SCREEN_ERROR_FAIL); + } + } + } else { + Evas_Object *page; + Evas_Object *pended_item; + + pended_item = pkgmgr_find_pended_object(package, 1, scroller, &page); + if (!pended_item ) { + _D("Cannot find package in the install list"); + } + + if (!ai.nodisplay && ai.enabled) { + item_update(item, &ai); + break; + } + + page = page_scroller_get_page_at(scroller, page_no); + if (page) { + page_unpack_item(page, item); + page_scroller_trim_items(scroller); + } + item_destroy(item); + } + } while (0); + + list_free_values(&ai); + return MENU_SCREEN_ERROR_OK; +} + + + +static inline menu_screen_error_e _delete_cb(const char *package, void *data) +{ + Evas_Object *item; + Evas_Object *page; + Evas_Object *scroller = data; + Evas_Object *tmp; + int page_no = 0; + register unsigned int i; + unsigned int page_max_app; + + do { + if (!scroller) { + _D("Scroller is NULL."); + break; + } + + tmp = pkgmgr_find_pended_object(package, 1, scroller, NULL); + + item = page_scroller_find_item_by_package(scroller, package, &page_no); + retv_if(NULL == item, MENU_SCREEN_ERROR_FAIL); + + if (tmp != item) { + _D("Pended item is %p, Found item is %p", tmp, item); + } + + page = page_scroller_get_page_at(scroller, page_no); + retv_if(NULL == page, MENU_SCREEN_ERROR_FAIL); + + page_max_app = (unsigned int) evas_object_data_get(scroller, "page_max_app"); + for (i = 0; i < page_max_app; i++) { + if (item == page_get_item_at(page, i)) { + break; + } + } + + item = _animated_unpack_item(scroller, page, i); + retv_if(NULL == item, MENU_SCREEN_ERROR_FAIL); + item_destroy(item); + } while (0); + + return MENU_SCREEN_ERROR_OK; +} + + + +static struct pkg_event_handler { + const char *event_name; + int (*event_handler)(const char *package, void *data); +} event_table[] = { + { + .event_name = "create", + .event_handler = _create_cb, + }, + { + .event_name = "update", + .event_handler = _update_cb, + }, + { + .event_name = "delete", + .event_handler = _delete_cb, + }, + { + .event_name = NULL, + .event_handler = NULL, + }, +}; + + + +static void _desktop_cb(keynode_t *node, void *data) +{ + char *event; + char type[10]; + char package[BUFSZE]; + register int i; + + event = vconf_get_str(vconf_keynode_get_name(node)); + ret_if(NULL == event); + + if (sscanf(event, "%10[^:]:%1023s", type, package) != 2) { + _D("Failed to parse the event format : [%s], [%s]", type, package); + } + + _D("command[%s], package[%s]", type, package); + + for (i = 0; event_table[i].event_name; i ++) { + if (!strcasecmp(type, event_table[i].event_name)) { + if (event_table[i].event_handler(package, data) == MENU_SCREEN_ERROR_FAIL) { + _E("Failed to handles the desktop notification event"); + } + + free(event); + return; + } + } + + _E("Failed to find a proper event handler"); + free(event); +} + + + +static void _mapbuf_cb(keynode_t *node, void *data) +{ + int value; + int nr_of_pages; + register int i; + Evas_Object *page; + + if (vconf_get_int("memory/menuscreen/mapbuf", &value) < 0) { + _D("Failed to get mapbuf status"); + return; + } + + nr_of_pages = page_scroller_count_page(data); + if (value) { + for (i = 0; i < nr_of_pages; i ++) { + page = page_scroller_get_page_at(data, i); + if (!page) continue; + + if (!mapbuf_is_enabled(page)) { + _D("Enable mapbuf %d", i); + mapbuf_enable(page, 1); + } + } + } else { + for (i = 0; i < nr_of_pages; i ++) { + page = page_scroller_get_page_at(data, i); + if (!page) continue; + + if (mapbuf_is_enabled(page)) { + _D("Disable mapbuf %d", i); + mapbuf_disable(page, 1); + } + } + } +} + + + +static void _mouse_wheel_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Wheel *ei = event_info; + Evas_Object *scroller = data; + int x, y, w, h; + int idx = -1; + + _D("Wheel's up or down(%d)", ei->z); + + elm_scroller_region_get(scroller, &x, &y, &w, &h); + if (ei->z > 0) { // Wheel's up + idx = x / w; + idx ++; + } else if (ei->z < 0) { // Wheel's down + idx = x / w; // Scroller got ECORE events at first, then Menu-screen gets EVAS events. + } else { // Wheel's not moving. + _D("Wheel's not moving"); + } + + if (idx >= page_scroller_count_page(scroller) || idx < 0) return; + evas_object_data_set(scroller, "mouse_wheel_scroller_start", (void *) 1); + page_scroller_bring_in(scroller, idx); +} + + + +HAPI Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scroller_sort_type_e sort_type, int rotate) +{ + Evas_Object *box; + Evas_Object *scroller; + int width; + int height; + + scroller = elm_scroller_add(tab); + retv_if(NULL == scroller, NULL); + + elm_scroller_content_min_limit(scroller, EINA_FALSE, EINA_FALSE); + elm_scroller_bounce_set(scroller, EINA_TRUE, EINA_FALSE); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + + width = menu_screen_get_root_width(); + height = (int) ((double) PROP_PORTRAIT_HEIGHT * ((double) menu_screen_get_root_height())); + elm_scroller_page_size_set(scroller, width, height); + elm_scroller_page_scroll_limit_set(scroller, 1, 1); + + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(scroller, width, height); + evas_object_size_hint_max_set(scroller, width, height); + + box = elm_box_add(scroller); + if (!box) { + _D("Failed to create box"); + evas_object_del(scroller); + return NULL; + } + elm_box_horizontal_set(box, 1); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + evas_object_data_set(scroller, "win", evas_object_data_get(tab, "win")); + evas_object_data_set(scroller, "layout", evas_object_data_get(tab, "layout")); + evas_object_data_set(scroller, "controlbar", evas_object_data_get(tab, "controlbar")); + evas_object_data_set(scroller, "tab", tab); + evas_object_data_set(scroller, "page_edje", evas_object_data_get(tab, "page_edje")); + evas_object_data_set(scroller, "page_max_app", evas_object_data_get(tab, "page_max_app")); + evas_object_data_set(scroller, "item_edje", evas_object_data_get(tab, "item_edje")); + evas_object_data_set(scroller, "item_width", evas_object_data_get(tab, "item_width")); + evas_object_data_set(scroller, "item_height", evas_object_data_get(tab, "item_height")); + evas_object_data_set(scroller, "item_enable_long_press", evas_object_data_get(tab, "item_enable_long_press")); + evas_object_data_set(scroller, "item_text_dual_line", evas_object_data_get(tab, "item_text_dual_line")); + evas_object_data_set(scroller, "enable_bg_image", evas_object_data_get(tab, "enable_bg_image")); + evas_object_data_set(scroller, "box", box); + evas_object_data_set(scroller, "drag_start", (void *) 0); + evas_object_data_set(scroller, "previous_x", (void *) 0); + evas_object_data_set(scroller, "index", index); + evas_object_data_set(scroller, "sort_type", (void *) sort_type); + evas_object_data_set(scroller, "install_list", (void *) 0); + evas_object_data_set(scroller, "rotate", (void *) rotate); + evas_object_data_set(scroller, "is_edited", (void *) false); + elm_object_content_set(scroller, box); + + 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, NULL); + 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, NULL); + evas_object_event_callback_add(box, EVAS_CALLBACK_DEL, _evas_object_event_del_cb, "BOX"); + evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb, scroller); + + evas_object_show(box); + evas_object_show(scroller); + + if (vconf_notify_key_changed(VCONFKEY_AIL_INFO_STATE, _desktop_cb, scroller) < 0) { + _E("Failed to register a desktop change event handler"); + } + + if (vconf_notify_key_changed("memory/menuscreen/mapbuf", _mapbuf_cb, scroller) < 0) { + _E("Failed to register a vconf cb for %s", "memory/menuscreen/mapbuf"); + } + + // FIXME : This will be enabled after rebuilding the routine for appid <-> pkgid. + //pkgmgr_init(scroller); + item_badge_register_changed_cb(scroller); + + return scroller; +} + + + +HAPI void page_scroller_destroy(Evas_Object *scroller) +{ + Evas_Object *box; + Evas_Object *page; + Evas_Object *tmp; + + const Eina_List *page_list; + const Eina_List *l; + const Eina_List *ln; + + ret_if(NULL == scroller); + ret_if(NULL == (box = evas_object_data_get(scroller, "box"))); + ret_if(NULL == (page_list = elm_box_children_get(box))); + + item_badge_unregister_changed_cb(); + + // FIXME : This will be enabled after rebuilding the routine for appid <-> pkgid. + //pkgmgr_fini(); + + EINA_LIST_FOREACH_SAFE(page_list, l, ln, page) { + int count; + + if (!page) { + _D("page list contains nil item"); + continue; + } + + count = eina_list_count(page_list); + _D("page_list count : %d", count); + if (count < 1) { + elm_box_unpack(box, page); + } + + tmp = mapbuf_get_page(page); + if (tmp) page = tmp; + + page_destroy(scroller, page); + } + + box = elm_object_content_unset(scroller); + evas_object_del(box); + + evas_object_data_del(scroller, "win"); + evas_object_data_del(scroller, "layout"); + evas_object_data_del(scroller, "controlbar"); + evas_object_data_del(scroller, "tab"); + evas_object_data_del(scroller, "page_edje"); + evas_object_data_del(scroller, "page_max_app"); + evas_object_data_del(scroller, "item_edje"); + evas_object_data_del(scroller, "item_width"); + evas_object_data_del(scroller, "item_height"); + evas_object_data_del(scroller, "item_enable_long_press"); + evas_object_data_del(scroller, "item_text_dual_line"); + evas_object_data_del(scroller, "enable_bg_image"); + evas_object_data_del(scroller, "box"); + evas_object_data_del(scroller, "drag_start"); + evas_object_data_del(scroller, "previous_x"); + evas_object_data_del(scroller, "index"); + evas_object_data_del(scroller, "sort_type"); + evas_object_data_del(scroller, "rotate"); + evas_object_data_del(scroller, "is_edited"); + evas_object_data_del(scroller, "install_list"); + + evas_object_smart_callback_del(scroller, "scroll,anim,start", _anim_start_cb); + evas_object_smart_callback_del(scroller, "scroll,anim,stop", _anim_stop_cb); + evas_object_smart_callback_del(scroller, "scroll,drag,start", _drag_start_cb); + evas_object_smart_callback_del(scroller, "scroll,drag,stop", _drag_stop_cb); + evas_object_smart_callback_del(scroller, "scroll", _scroll_cb); + evas_object_event_callback_del(box, EVAS_CALLBACK_DEL, _evas_object_event_del_cb); + evas_object_event_callback_del(scroller, EVAS_CALLBACK_MOUSE_WHEEL, _mouse_wheel_cb); + + evas_object_del(scroller); + + if (vconf_ignore_key_changed(VCONFKEY_AIL_INFO_STATE, _desktop_cb) < 0) { + _E("Failed to ignore the desktop event"); + } + + if (vconf_ignore_key_changed("memory/menuscreen/mapbuf", _mapbuf_cb) < 0) { + _E("Failed to remove vconf %s", "memory/menuscreen/mapbuf"); + } +} + + + +HAPI void page_scroller_clean(Evas_Object *scroller) +{ + Evas_Object *page; + Evas_Object *item; + + register unsigned int i; + unsigned int page_max_app; + unsigned int count; + + count = page_scroller_count_page(scroller); + if (count == 0) return; + + for (i = 1; i < MAX_PAGE_NO; i++) { + page = page_scroller_get_page_at(scroller, i); + if (NULL == page) break; + + page_destroy(scroller, page); + } + + page = page_scroller_get_page_at(scroller, 0); + ret_if(NULL == page); + + page_max_app = (unsigned int) evas_object_data_get(scroller, "page_max_app"); + for (i = 0; i < page_max_app; i++) { + item = page_get_item_at(page, i); + if (item) { + item_destroy(item); + } else break; + } +} + + + +HAPI Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx) +{ + const Eina_List *page_list; + Evas_Object *item; + Evas_Object *box; + + retv_if(idx >= MAX_PAGE_NO, NULL); + + box = evas_object_data_get(scroller, "box"); + retv_if(NULL == box, NULL); + + page_list = elm_box_children_get(box); + retv_if(NULL == page_list, NULL); + + item = eina_list_nth(page_list, idx); + if (item) { + item = mapbuf_get_page(item); + } + + return item; +} + + + +HAPI unsigned int page_scroller_count_page(Evas_Object *scroller) +{ + const Eina_List *page_list; + Evas_Object *box; + + box = evas_object_data_get(scroller, "box"); + retv_if(NULL == box, 0); + + page_list = elm_box_children_get(box); + retv_if(NULL == page_list, 0); + + return eina_list_count(page_list); +} + + + +HAPI int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page) +{ + Evas_Object *item; + Evas_Object *box; + register int idx = 0; + const Eina_List *page_list; + const Eina_List *pos; + + box = evas_object_data_get(scroller, "box"); + retv_if(NULL == box, 0); + + page_list = elm_box_children_get(box); + EINA_LIST_FOREACH(page_list, pos, item) { + if (!item) { + _D("page list contains nil item"); + continue; + } + + item = mapbuf_get_page(item); + if (item == page) { + return idx; + } + + idx ++; + } + + return -1; +} + + + +HAPI int page_scroller_get_current_page_no(Evas_Object *scroller) +{ + return (int) evas_object_data_get(scroller, "current_idx"); +} + + + +HAPI Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const char *package, int *page_no) +{ + register int i; + register int j; + Evas_Object *page; + Evas_Object *item; + const char *tmp; + int local_page_no; + int page_max_app; + + if (!page_no) page_no = &local_page_no; + + retv_if(NULL == package, NULL); + + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + for (i = 0; i < page_scroller_count_page(scroller); i ++) { + page = page_scroller_get_page_at(scroller, i); + if (!page) continue; + + for (j = 0; j < page_max_app; j ++) { + item = page_get_item_at(page, j); + if (!item) continue; + + tmp = item_get_package(item); + if (!tmp) { + _D("Something goes wrong, this package has no name?"); + continue; + } + + if (!strcmp(tmp, package)) { + *page_no = i; + return item; + } + } + } + + return NULL; +} + + + +HAPI void page_scroller_trim_items(Evas_Object *scroller) +{ + register unsigned int i; + register unsigned int j; + int page_max_app; + int pos = 0; + + Evas_Object *page; + Evas_Object *item; + Eina_List *list = NULL; + + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + for (i = 0; i < MAX_PAGE_NO; i ++) { + page = page_scroller_get_page_at(scroller, i); + if (!page) break; + + for (j = 0; j < page_max_app; j++) { + item = page_unpack_item_at(page, j); + if (item) { + list = eina_list_append(list, item); + _D("LIST APPEND : %s", item_get_package(item)); + } + } + + } + + for (i = 0; i < eina_list_count(list); i++) { + if (i % page_max_app == 0) { + page = page_scroller_get_page_at(scroller, i / page_max_app); + _D("PAGE GET : 0x%x", page); + if (NULL == page) { + _E("Cannot get page"); + break; + } + } + + item = eina_list_nth(list, i); + if (NULL == item) { + _E("Cannot get item"); + break; + } + _D("LIST GET : [%d] %s", pos, item_get_package(item)); + + page_pack_item(page, pos % page_max_app, item); + pos++; + } + + for (i = pos / page_max_app; i < MAX_PAGE_NO; i++) { + int count; + + page = page_scroller_get_page_at(scroller, i); + if (NULL == page) { + break; + } + count = page_count_item(page); + if (count == 0) { + Evas_Coord w; + Evas_Coord h; + + _D("PAGE IS EMPTY : 0x%x", page); + + page_destroy(scroller, page); + evas_object_geometry_get(scroller, NULL, NULL, &w, &h); + elm_scroller_region_show(scroller, 0, 0, w, h); + } + } + pos --; + eina_list_free(list); +} + + + +HAPI void page_scroller_edit(Evas_Object *scroller) +{ + Evas_Object *page; + Evas_Object *item; + register unsigned int page_no; + register unsigned int position_no; + unsigned int nr_of_pages; + int page_max_app; + + nr_of_pages = page_scroller_count_page(scroller); + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + for (page_no = 0; page_no < nr_of_pages; page_no ++) { + page = page_scroller_get_page_at(scroller, page_no); + ret_if(NULL == page); + + for (position_no = 0; position_no < page_max_app; position_no ++) { + item = page_get_item_at(page, position_no); + if (!item) { + continue; + } + + item_edit(item); + } + } + evas_object_data_set(scroller, "is_edited", (void *) true); +} + + + +HAPI void page_scroller_unedit(Evas_Object *scroller) +{ + Evas_Object *all_apps; + Evas_Object *page; + Evas_Object *item; + register int page_no; + register unsigned int position_no; + unsigned int nr_of_pages; + int page_max_app; + + ret_if(NULL == scroller); + + all_apps = evas_object_data_get(scroller, "tab"); + ret_if(NULL == all_apps); + + nr_of_pages = page_scroller_count_page(scroller); + page_max_app = (int) evas_object_data_get(scroller, "page_max_app"); + + for (page_no = nr_of_pages - 1; page_no >= 0; page_no --) { + int count; + + page = page_scroller_get_page_at(scroller, page_no); + if (NULL == page) break; + count = page_count_item(page); + + page_scroller_trim_items(scroller); + + for (position_no = 0; position_no < page_max_app; position_no ++) { + item = page_get_item_at(page, position_no); + if (!item) { + break; + } + + item_unedit(item); + } + } + + evas_object_data_set(scroller, "is_edited", (void *) false); +} + + + +HAPI bool page_scroller_is_edited(Evas_Object *scroller) +{ + return (bool) evas_object_data_get(scroller, "is_edited"); +} + + + +HAPI void page_scroller_focus(Evas_Object *scroller) +{ + int idx = 0; + idx = page_scroller_get_current_page_no(scroller); + + Evas_Object *page = NULL; + page = page_scroller_get_page_at(scroller, (unsigned int) idx); + ret_if(NULL == page); + + Evas_Object *item = NULL; + item = page_get_item_at(page, 0); + ret_if(NULL == item); + + Evas_Object *focus_button = NULL; + focus_button = elm_object_part_content_get(item, "focus"); + ret_if(NULL == focus_button); + + _D("Focus set scroller(%p), page:%d, item:%s", scroller, idx, item_get_name(item)); + elm_object_focus_set(focus_button, EINA_TRUE); +} + + + +HAPI void page_scroller_focus_into_vector(Evas_Object *scroller, int vector) +{ + int idx = 0; + idx = page_scroller_get_current_page_no(scroller); + idx += vector; + + ret_if(0 > idx); + + Evas_Object *page = NULL; + page = page_scroller_get_page_at(scroller, (unsigned int) idx); + ret_if(NULL == page); + + Evas_Object *item = NULL; + item = page_get_item_at(page, 0); + ret_if(NULL == item); + + Evas_Object *focus_button = NULL; + focus_button = elm_object_part_content_get(item, "focus"); + ret_if(NULL == focus_button); + + _D("Focus set scroller(%p), page:%d, item:%s", scroller, idx, item_get_name(item)); + elm_object_focus_set(focus_button, EINA_TRUE); + + page_scroller_bring_in(scroller, idx); +} + + + +// End of a file diff --git a/src/pkgmgr.c b/src/pkgmgr.c new file mode 100644 index 0000000..d7fecc2 --- /dev/null +++ b/src/pkgmgr.c @@ -0,0 +1,865 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include + +#include "conf.h" +#include "index.h" +#include "item.h" +#include "list.h" +#include "page.h" +#include "page_scroller.h" +#include "mapbuf.h" +#include "pkgmgr.h" +#include "util.h" + + + +struct pkgmgr_handler { + const char *key; + int (*func)(const char *package, const char *val, void *data); +}; + + + +static struct { + pkgmgr_client *listen_pc; +} pkg_mgr_info = { + .listen_pc = NULL, +}; + + + +HAPI inline menu_screen_error_e pkgmgr_uninstall(Evas_Object *item) +{ + int ret = MENU_SCREEN_ERROR_OK; + + retv_if(NULL == item, MENU_SCREEN_ERROR_FAIL); + + char *pkgid = NULL; + char *appid = item_get_package(item); + retv_if(NULL == appid, MENU_SCREEN_ERROR_FAIL); + + pkgmgr_client *req_pc = NULL; + req_pc = pkgmgr_client_new(PC_REQUEST); + retv_if(NULL == req_pc, MENU_SCREEN_ERROR_FAIL); + + pkgmgrinfo_appinfo_h handle; + if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_appinfo(appid, &handle)) { + if (PKGMGR_R_OK != pkgmgr_client_free(req_pc)) { + _E("cannot free pkgmgr_client for request."); + } + return MENU_SCREEN_ERROR_FAIL; + } + + if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid)) { + if (PMINFO_R_OK != pkgmgrinfo_appinfo_destroy_appinfo(handle)) { + _E("cannot destroy the appinfo"); + } + + if (PKGMGR_R_OK != pkgmgr_client_free(req_pc)) { + _E("cannot free pkgmgr_client for request."); + } + + return MENU_SCREEN_ERROR_FAIL; + } + + if (!pkgid) pkgid = appid; + + _D("Uninstall a package[%s] from an app[%s]", pkgid, appid); + if (pkgmgr_client_uninstall(req_pc, NULL, pkgid, PM_QUIET, NULL, NULL) < 0) { + _E("cannot uninstall %s.", item_get_package(item)); + ret = MENU_SCREEN_ERROR_FAIL; + } + + if (PMINFO_R_OK != pkgmgrinfo_appinfo_destroy_appinfo(handle)) { + _E("cannot destroy the appinfo"); + ret = MENU_SCREEN_ERROR_FAIL; + } + + if (PMINFO_R_OK != pkgmgr_client_free(req_pc)) { + _E("cannot free pkgmgr_client"); + ret = MENU_SCREEN_ERROR_FAIL; + } + + return ret; +} + + + +static menu_screen_error_e _start_download(const char *package, void *scroller) +{ + struct package_info *pi; + Eina_List *install_list; + + install_list = evas_object_data_get(scroller, "install_list"); + pi = calloc(1, sizeof(struct package_info)); + retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + + pi->status = DOWNLOAD_BEGIN; + pi->ai.package = strdup(package); + pi->ai.name = strdup("Download"); + + install_list = eina_list_append(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + _D("Package [%s] is jump into the downloading phase", package); + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _start_uninstall(const char *package, void *scroller) +{ + Eina_List *l; + Eina_List *tmp; + int page_no = 0; + struct package_info *pi = NULL; + Eina_List *install_list; + + install_list = evas_object_data_get(scroller, "install_list"); + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + break; + } + pi = NULL; + } + + retv_if(pi, MENU_SCREEN_ERROR_FAIL); + + pi = calloc(1, sizeof(struct package_info)); + retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + + pi->status = UNINSTALL_BEGIN; + pi->ai.package = strdup(package); + pi->ai.nodisplay = false; + pi->ai.enabled = true; + pi->item = page_scroller_find_item_by_package(scroller, package, &page_no); + pi->page = page_scroller_get_page_at(scroller, page_no); + + install_list = eina_list_append(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _start_update(const char *package, void *scroller) +{ + Eina_List *l; + Eina_List *tmp; + struct package_info *pi = NULL; + Eina_List *install_list; + + install_list = evas_object_data_get(scroller, "install_list"); + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + break; + } + pi = NULL; + } + + if (!pi) { + int page_no = 0; + _D("Package [%s] is starting update phase directly (without downloading phase)", package); + + pi = calloc(1, sizeof(struct package_info)); + retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + + pi->ai.package = strdup(package); + pi->item = page_scroller_find_item_by_package(scroller, package, &page_no); + if (pi->item) { + pi->page = page_scroller_get_page_at(scroller, page_no); + } + + if (pi->item && pi->page) { + pi->ai.nodisplay = false; + pi->ai.enabled = true; + } + + install_list = eina_list_append(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + } else { + if (pi->status != DOWNLOAD_END && pi->status != INSTALL_END) { + _D("Package [%s] is in invalid state (%d), cancel this", package, pi->status); + install_list = eina_list_remove(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + if (pi->item) { + page_unpack_item(pi->page, pi->item); + page_scroller_trim_items(scroller); + item_destroy(pi->item); + } + + list_free_values(&pi->ai); + free(pi); + return MENU_SCREEN_ERROR_FAIL; + } + } + + pi->status = UPDATE_BEGIN; + pi->ai.name = strdup("Update"); + if (pi->item) { + item_set_name(pi->item, pi->ai.name, 0); + } + + _D("Package [%s] is jump into the updating phase", package); + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _start_recover(const char *package, void *scroller) +{ + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _start_install(const char *package, void *scroller) +{ + Eina_List *l; + Eina_List *tmp; + struct package_info *pi = NULL; + Eina_List *install_list; + + install_list = evas_object_data_get(scroller, "install_list"); + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + break; + } + pi = NULL; + } + + if (!pi) { + int page_no = 0; + _D("Package [%s] is starting install phase directly (without downloading phase)", package); + pi = calloc(1, sizeof(struct package_info)); + retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + + pi->ai.package = strdup(package); + if (!pi->ai.package) { + free(pi); + return MENU_SCREEN_ERROR_FAIL; + } + + pi->ai.icon = strdup(DEFAULT_ICON); + if (!pi->ai.icon) { + free(pi->ai.package); + free(pi); + return MENU_SCREEN_ERROR_FAIL; + } + + pi->item = page_scroller_find_item_by_package(scroller, package, &page_no); + if (!pi->item) { + if (NULL == page_scroller_push_item(scroller, &pi->ai)) _E("Cannot push an item"); + } + pi->item = page_scroller_find_item_by_package(scroller, package, &page_no); + pi->page = page_scroller_get_page_at(scroller, page_no); + + if (pi->item && pi->page) { + pi->ai.nodisplay = false; + pi->ai.enabled = true; + } + + install_list = eina_list_append(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + } else { + if (pi->status != DOWNLOAD_END && pi->status != INSTALL_END) { + _D("Package [%s] is in invalid state (%d), cancel this", package, pi->status); + install_list = eina_list_remove(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + if (pi->item) { + page_unpack_item(pi->page, pi->item); + page_scroller_trim_items(scroller); + item_destroy(pi->item); + } + + list_free_values(&pi->ai); + free(pi); + return MENU_SCREEN_ERROR_FAIL; + } + } + + pi->status = INSTALL_BEGIN; + pi->ai.name = strdup("Install"); + if (pi->item) { + // Update app name to install + item_set_name(pi->item, pi->ai.name, 0); + } + _D("Package [%s] is jump into the installing phase", package); + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _start(const char *package, const char *val, void *scroller) +{ + struct start_cb_set { + const char *name; + int (*handler)(const char *package, void *scroller); + } start_cb[] = { + { + .name = "download", + .handler = _start_download, + }, + { + .name = "uninstall", + .handler = _start_uninstall, + }, + { + .name = "install", + .handler = _start_install, + }, + { + .name = "update", + .handler = _start_update, + }, + { + .name = "recover", + .handler = _start_recover, + }, + { + .name = NULL, + .handler = NULL, + }, + }; + + register unsigned int i; + + _D("package [%s]", package); + + for (i = 0; start_cb[i].name; i ++) { + if (!strcasecmp(val, start_cb[i].name) && start_cb[i].handler) { + return start_cb[i].handler(package, scroller); + } + } + + _D("Unknown status for starting phase signal'd from package manager"); + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _icon_path(const char *package, const char *val, void *scroller) +{ + Eina_List *l; + Eina_List *tmp; + struct package_info *pi = NULL; + Eina_List *install_list; + + install_list = evas_object_data_get(scroller, "install_list"); + retv_if(!package, MENU_SCREEN_ERROR_FAIL); + retv_if(!val, MENU_SCREEN_ERROR_FAIL); + + _D("package [%s] with %s", package, val); + + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + break; + } + pi = NULL; + } + retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + + if (strlen(val)) { + pi->ai.icon = strdup(val); + retv_if (NULL == pi->ai.icon, MENU_SCREEN_ERROR_OUT_OF_MEMORY); + + if (!pi->item) { + _D("There is no item for [%s]", package); + pi->ai.nodisplay = false; + pi->ai.enabled = true; + + if (NULL == page_scroller_push_item(scroller, &pi->ai)) { + _E("Failed to create a new item, remove this package from the installing list"); + list_free_values(&pi->ai); + install_list = eina_list_remove(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + free(pi); + } + } else { + _D("There is an item for [%s:%p]", package, pi->item); + item_update(pi->item, &pi->ai); + } + } + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _download_percent(const char *package, const char *val, void *scroller) +{ + Eina_List *l; + Eina_List *tmp; + struct package_info *pi = NULL; + Eina_List *install_list; + + _D("package [%s] with %s", package, val); + + install_list = evas_object_data_get(scroller, "install_list"); + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + break; + } + pi = NULL; + } + + retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + + if (pi->status == DOWNLOAD_BEGIN) { + pi->status = DOWNLOADING; + } else if (pi->status == DOWNLOADING) { + // Do nothing, just we are in proper state + } else { + _D("Invalid state for %s, This is not started from the download_begin state(%s)", package, val); + } + + if (!pi->ai.nodisplay && pi->ai.enabled && pi->item) { + if (!item_is_enabled_progress(pi->item)) { + item_enable_progress(pi->item); + } + + item_update_progress(pi->item, atoi(val)); + } + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _install_percent(const char *package, const char *val, void *scroller) +{ + Eina_List *l; + Eina_List *tmp; + struct package_info *pi; + int progress; + Eina_List *install_list; + + _D("package [%s] with %s", package, val); + + pi = NULL; + install_list = evas_object_data_get(scroller, "install_list"); + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + break; + } + + pi = NULL; + } + + retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + + progress = atoi(val); + + if (pi->status == INSTALL_BEGIN) { + pi->status = INSTALLING; + } else if (pi->status == UNINSTALL_BEGIN) { + progress = 100 - progress; + pi->status = UNINSTALLING; + } else if (pi->status == UPDATE_BEGIN) { + pi->status = UPDATING; + } else if (pi->status == INSTALLING) { + } else if (pi->status == UNINSTALLING) { + progress = 100 - progress; + } else if (pi->status == UPDATING) { + } else { + _D("Invalid state for %s, This is not the uninstall or install_begin state(%s)", package, val); + } + + if (!pi->ai.nodisplay && pi->ai.enabled && pi->item) { + if (!item_is_enabled_progress(pi->item)) { + item_enable_progress(pi->item); + } + + item_update_progress(pi->item, progress); + } + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _error(const char *package, const char *val, void *scroller) +{ + struct package_info *pi = NULL; + Eina_List *l; + Eina_List *tmp; + Eina_List *install_list; + + _D("package [%s] with %s", package, val); + + install_list = evas_object_data_get(scroller, "install_list"); + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + break; + } + + pi = NULL; + } + + retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + + pi->error_count ++; + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _end_downloading(const char *package, struct package_info *pi, void *scroller) +{ + pi->status = DOWNLOAD_END; + _D("Package downloading is complete, waiting install progress"); + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _end_installing(const char *package, struct package_info *pi, void *scroller) +{ + // This status will not be referenced from the others. + // because it will be freed right after set it. ;) + Eina_List *install_list; + + pi->status = INSTALL_END; + _D("Package installing is complete"); + + install_list = evas_object_data_get(scroller, "install_list"); + if (pi->desktop_file_found == 1) { + install_list = eina_list_remove(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + list_free_values(&pi->ai); + free(pi); + } + + + // TODO: Need to register a timer callback + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _end_updating(const char *package, struct package_info *pi, void *scroller) +{ + // This status will not be referenced from the others. + // because it will be freed right after set it. ;) + Eina_List *install_list; + + pi->status = UPDATE_END; + _D("Package updating is complete"); + + install_list = evas_object_data_get(scroller, "install_list"); + if (pi->desktop_file_found == 1) { + install_list = eina_list_remove(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + list_free_values(&pi->ai); + free(pi); + } + + + // TODO: Need to register a timer callback + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _end_uninstalling(const char *package, struct package_info *pi, void *scroller) +{ + Eina_List *install_list; + + pi->status = UNINSTALL_END; + _D("Package uninstalling is complete"); + + install_list = evas_object_data_get(scroller, "install_list"); + if (pi->desktop_file_found == 1) { + install_list = eina_list_remove(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + list_free_values(&pi->ai); + free(pi); + } + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _end_unknown(const char *package, struct package_info *pi, void *scroller) +{ + Eina_List *install_list; + + install_list = evas_object_data_get(scroller, "install_list"); + install_list = eina_list_remove(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + + if (pi->item) { + // Remove an item only if it is installing. + if ( + pi->status == INSTALL_BEGIN || pi->status == INSTALLING || pi->status == INSTALL_END || + pi->status == DOWNLOAD_BEGIN || pi->status == DOWNLOADING || pi->status == DOWNLOAD_END + ) + { + if (pi->page) { + page_unpack_item(pi->page, pi->item); + page_scroller_trim_items(scroller); + } else { + _D("Page is not valid (%s)", package); + } + item_destroy(pi->item); + page_scroller_trim_items(scroller); + } + } + + list_free_values(&pi->ai); + free(pi); + + return MENU_SCREEN_ERROR_OK; +} + + + +static menu_screen_error_e _end(const char *package, const char *val, void *scroller) +{ + Eina_List *l; + Eina_List *tmp; + struct package_info *pi; + register int i; + struct end_cb_set { + int status; + int (*handler)(const char *package, struct package_info *pi, void *scroller); + } end_cb[] = { + { + .status = DOWNLOADING, + .handler = _end_downloading, + }, + { + .status = INSTALLING, + .handler = _end_installing, + }, + { + .status = UNINSTALLING, + .handler = _end_uninstalling, + }, + { + .status = UPDATING, + .handler = _end_updating, + }, + { + .status = UNKNOWN, + .handler = _end_unknown, + }, + { + .status = MAX_STATUS, + .handler = NULL, + }, + }; + Eina_List *install_list; + + _D("package [%s], val [%s]", package, val); + + pi = NULL; + install_list = evas_object_data_get(scroller, "install_list"); + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + break; + } + pi = NULL; + } + + retv_if(NULL == pi, MENU_SCREEN_ERROR_FAIL); + + list_free_values(&pi->ai); + if (MENU_SCREEN_ERROR_OK != list_get_values(package, &pi->ai)) _E("Cannot get values"); + item_update(pi->item, &pi->ai); + + if (item_is_enabled_progress(pi->item)) { + item_disable_progress(pi->item); + } + + // NOTE: Don't release the 'pi' + // Release it from each handler + for (i = 0; end_cb[i].handler; i ++) { + if (end_cb[i].status == pi->status && end_cb[i].handler) { + int ret; + + if (strcasecmp(val, "ok")) { + ret = _end_unknown(package, pi, scroller); + } else { + ret = end_cb[i].handler(package, pi, scroller); + } + + return ret; + } + } + + return _end_unknown(package, pi, scroller); +} + + + +static menu_screen_error_e _change_pkg_name(const char *package, const char *val, void *scroller) +{ + Eina_List *l; + Eina_List *tmp; + struct package_info *pi; + Eina_List *install_list; + + _D("package [%s]", package); + + install_list = evas_object_data_get(scroller, "install_list"); + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (!pi) { + continue; + } + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + _D("Replace package name %s to %s", pi->ai.package, val); + free(pi->ai.package); + pi->ai.package = strdup(val); + if (!pi->ai.package) { + _E("cannot strdup"); + return MENU_SCREEN_ERROR_FAIL; + } + if (pi->item) { + item_set_package(pi->item, (char*) val, 0); + } + return MENU_SCREEN_ERROR_OK; + } + } + + return MENU_SCREEN_ERROR_FAIL; +} + + + +static struct pkgmgr_handler pkgmgr_cbs[] = { + { "start", _start }, + { "icon_path", _icon_path }, + { "download_percent", _download_percent }, + { "command", NULL }, + { "install_percent", _install_percent }, + { "error", _error }, + { "end", _end }, + { "change_pkg_name", _change_pkg_name }, +}; + + + +static menu_screen_error_e _pkgmgr_cb(int req_id, const char *pkg_type, const char *package, const char *key, const char *val, const void *pmsg, void *data) +{ + register unsigned int i; + Evas_Object *scroller = data; + + _D("pkgmgr request [%s] for %s, val(%s)", key, package, val); + + for (i = 0; i < sizeof(pkgmgr_cbs) / sizeof(struct pkgmgr_handler); i++) { + if (!strcasecmp(pkgmgr_cbs[i].key, key)) { + if (pkgmgr_cbs[i].func) { + if (MENU_SCREEN_ERROR_OK != pkgmgr_cbs[i].func(package, val, scroller)) { + _E("pkgmgr_cbs[%u].func has errors.", i); + } + } else { + _E("Cannot find pkgmgr_cbs[%u].func.", i); + } + return MENU_SCREEN_ERROR_OK; + } + } + + return MENU_SCREEN_ERROR_FAIL; +} + + + +HAPI menu_screen_error_e pkgmgr_init(Evas_Object *scroller) +{ + if (NULL != pkg_mgr_info.listen_pc) { + return MENU_SCREEN_ERROR_OK; + } + + pkg_mgr_info.listen_pc = pkgmgr_client_new(PC_LISTENING); + retv_if(NULL == pkg_mgr_info.listen_pc, MENU_SCREEN_ERROR_FAIL); + retv_if(pkgmgr_client_listen_status(pkg_mgr_info.listen_pc, + _pkgmgr_cb, scroller) != PKGMGR_R_OK, MENU_SCREEN_ERROR_FAIL); + + return MENU_SCREEN_ERROR_OK; +} + + + +HAPI void pkgmgr_fini(void) +{ + ret_if(NULL == pkg_mgr_info.listen_pc); + if (pkgmgr_client_free(pkg_mgr_info.listen_pc) != PKGMGR_R_OK) { + _E("cannot free pkgmgr_client for listen."); + } + pkg_mgr_info.listen_pc = NULL; +} + + + +HAPI Evas_Object *pkgmgr_find_pended_object(const char *package, int with_desktop_file, Evas_Object *scroller, Evas_Object **page) +{ + Eina_List *l; + Eina_List *tmp; + struct package_info *pi; + Eina_List *install_list; + + _D("package [%s]", package); + + retv_if(NULL == package, NULL); + install_list = evas_object_data_get(scroller, "install_list"); + EINA_LIST_FOREACH_SAFE(install_list, l, tmp, pi) { + if (!pi) { + continue; + } + if (pi->ai.package && !strcmp(pi->ai.package, package)) { + Evas_Object *item; + _D("Installing(Downloading) package is found (%p)", pi->item); + + item = pi->item; + + if (with_desktop_file) { + pi->desktop_file_found = 1; + + if (pi->status == INSTALL_END || pi->status == UNINSTALL_END || pi->status == UPDATE_END) { + install_list = eina_list_remove(install_list, pi); + evas_object_data_set(scroller, "install_list", install_list); + list_free_values(&pi->ai); + free(pi); + pi = NULL; + } + } + + if (page) { + *page = pi ? pi->page : NULL; + } + return item; + } + } + + _D("Failed to find a installing/downloading package"); + return NULL; +} + + + +// End of a file diff --git a/src/popup.c b/src/popup.c new file mode 100644 index 0000000..a3fa311 --- /dev/null +++ b/src/popup.c @@ -0,0 +1,249 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include + +#include "conf.h" +#include "item.h" +#include "menu_screen.h" +#include "pkgmgr.h" +#include "util.h" +#include "all_apps/shortcut.h" + +#define BUFSZE 1024 +#define ELLIPSIS "..." +#define STRSZE 128 + + + +static struct { + Evas_Object *popup; +} popup_info = { + .popup = NULL, +}; + + + +HAPI Evas_Object *popup_exist(void) +{ + return popup_info.popup; +} + + + +HAPI void popup_destroy_all(void) +{ + void (*_destroy_popup)(void *data, Evas_Object *obj, void *event_info); + + if (NULL == popup_info.popup) return; + + _destroy_popup = evas_object_data_get(popup_info.popup, "func_destroy_popup"); + if (_destroy_popup) _destroy_popup(popup_info.popup, NULL, NULL); + + popup_info.popup = NULL; +} + + + +static void _response_cb(void *data, Evas_Object *obj, void *event_info) +{ + ret_if(NULL == data); + + Evas_Object *popup = data; + evas_object_data_del(popup, "func_destroy_popup"); + popup_info.popup = NULL; + + evas_object_del(evas_object_data_del(popup, "button")); + evas_object_del(popup); +} + + + +HAPI Evas_Object *popup_create_confirm(Evas_Object *parent, const char *warning) +{ + Evas_Object *popup; + Evas_Object *btn; + + retv_if(NULL == warning, NULL); + + popup_destroy_all(); + + popup = elm_popup_add(parent); + retv_if(NULL == popup, NULL); + + btn = elm_button_add(popup); + if (NULL == btn) { + evas_object_del(popup); + return NULL; + } + + elm_object_text_set(btn, D_("IDS_COM_SK_OK")); + evas_object_data_set(popup, "button", btn); + + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _response_cb, popup); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + elm_object_part_text_set(popup, "title,text", D_("IDS_COM_POP_WARNING")); + elm_object_text_set(popup, warning); + elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); + evas_object_show(popup); + + evas_object_data_set(popup, "func_destroy_popup", _response_cb); + popup_info.popup = popup; + + return popup; +} + + + +static void _uninstall_no_cb(void *data, Evas_Object *obj, void *event_info) +{ + ret_if(NULL == data); + + Evas_Object *popup = data; + evas_object_data_del(popup, "func_destroy_popup"); + popup_info.popup = NULL; + + evas_object_del(evas_object_data_del(popup, "button1")); + evas_object_del(evas_object_data_del(popup, "button2")); + evas_object_data_del(popup, "item"); + evas_object_del(popup); +} + + + +static void _uninstall_yes_cb(void *data, Evas_Object *obj, void *event_info) +{ + ret_if(NULL == data); + + Evas_Object *popup = data; + evas_object_data_del(popup, "func_destroy_popup"); + popup_info.popup = NULL; + + Evas_Object *item; + item = evas_object_data_del(popup, "item"); + + evas_object_del(evas_object_data_del(popup, "button1")); + evas_object_del(evas_object_data_del(popup, "button2")); + evas_object_del(popup); + + bool is_shortcut = false; + is_shortcut = (bool) evas_object_data_get(item, "is_shortcut"); + + if (is_shortcut) { + all_apps_shortcut_remove(item); + } else { + if (MENU_SCREEN_ERROR_OK != pkgmgr_uninstall(item)) { + _E("Cannot communicate with the pkgmgr-server."); + } + } +} + + + +static char *_popup_set_name(Evas_Object *item) +{ + char *name; + char *get_name = item_get_name(item); + if(!get_name) get_name = item_get_package(item); + retv_if(NULL == get_name, NULL); + + name = calloc(strlen(get_name)+1, sizeof(char)); + retv_if(NULL == name, NULL); + strncpy(name, get_name, strlen(get_name)); + + if (strlen(name) > STRSZE) { + char *temp, *ellipsis = ELLIPSIS; + + name = realloc(name, (STRSZE + strlen(ellipsis) + 1)*sizeof(char)); + retv_if(NULL == name, NULL); + + temp = name + STRSZE; + + while (*ellipsis) *temp++ = *ellipsis++; + *temp = '\0'; + } + return name; +} + + + +#define IDS_AT_POP_UNINSTALL_PS_Q "IDS_AT_POP_UNINSTALL_PS_Q" +HAPI Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item) +{ + Evas_Object *popup; + Evas_Object *btn1; + Evas_Object *btn2; + char warning[BUFSZE]; + + popup_destroy_all(); + + popup = elm_popup_add(parent); + retv_if(NULL == popup, NULL); + + evas_object_data_set(popup, "item", item); + + btn1 = elm_button_add(popup); + if (NULL == btn1) { + evas_object_del(popup); + return NULL; + } + elm_object_style_set(btn1, "popup_button/default"); + elm_object_text_set(btn1, D_("IDS_COM_SK_CANCEL")); + evas_object_data_set(popup, "button1", btn1); + elm_object_part_content_set(popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", _uninstall_no_cb, popup); + + btn2 = elm_button_add(popup); + if (NULL == btn2) { + evas_object_del(popup); + return NULL; + } + elm_object_style_set(btn2, "popup_button/default"); + elm_object_text_set(btn2, D_("IDS_COM_SK_OK")); + evas_object_data_set(popup, "button2", btn2); + elm_object_part_content_set(popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", _uninstall_yes_cb, popup); + + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_data_set(popup, "func_destroy_popup", _uninstall_no_cb); + popup_info.popup = popup; + evas_object_show(popup); + char *name = _popup_set_name(item); + retv_if(NULL == name, popup); + + char *markup_name = elm_entry_utf8_to_markup(name); + if (NULL == markup_name) { + _E("(NULL == markup_name) -> %s() return", __func__); + free(name); + return popup; + } + + snprintf(warning, sizeof(warning), _(IDS_AT_POP_UNINSTALL_PS_Q), markup_name); + free(name); + free(markup_name); + + elm_object_text_set(popup, warning); + + return popup; +} + + + +// End of a file diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..864cb1e --- /dev/null +++ b/src/util.c @@ -0,0 +1,71 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include + +#include "util.h" + + + +HAPI void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Coord x; + Evas_Coord y; + Evas_Coord w; + Evas_Coord h; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + _D("%s is resized to (%d, %d, %d, %d)", data, x, y, w, h); +} + + + +HAPI void _evas_object_event_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _D("%s IS REMOVED!", (const char *) data); +} + + + +HAPI void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Coord x; + Evas_Coord y; + Evas_Coord w; + Evas_Coord h; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + _D("%s's GEOMETRY : [%d, %d, %d, %d]", (const char *) data, x, y, w, h); +} + + + +HAPI void _evas_object_event_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Evas_Coord x; + Evas_Coord y; + Evas_Coord w; + Evas_Coord h; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + _D("%s's GEOMETRY : [%d, %d, %d, %d]", (const char *) data, x, y, w, h); +} + + + +// End of a file -- 2.34.1