From: Jinkun Jang Date: Fri, 15 Mar 2013 16:04:10 +0000 (+0900) Subject: merge with master X-Git-Tag: submit/tizen_2.1/20130424.223356~4^2~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cfab5ec1a32a0e77e71420cf4e7025dda4963800;p=apps%2Fhome%2Fmenu-screen.git merge with master --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 6817739..cb4b565 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,7 @@ INCLUDE(FindPkgConfig) pkg_check_modules(MENU_PKGS REQUIRED ail aul + badge bundle capi-appfw-application dlog @@ -32,6 +33,7 @@ pkg_check_modules(MENU_PKGS REQUIRED evas heynoti pkgmgr + pkgmgr-info sysman syspopup-caller utilX @@ -59,6 +61,7 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) ADD_EXECUTABLE(${PROJECT_NAME} src/index.c src/item.c + src/item_badge.c src/item_event.c src/layout.c src/list.c diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index dcc6f83..8b9e6d0 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -5,5 +5,6 @@ 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) # End of a file diff --git a/data/edje/CMakeLists.txt b/data/edje/CMakeLists.txt index 02cf548..2e334a0 100644 --- a/data/edje/CMakeLists.txt +++ b/data/edje/CMakeLists.txt @@ -48,4 +48,14 @@ 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 index 5534e0f..466ebd3 100644 --- a/data/edje/all_apps_portrait.edc +++ b/data/edje/all_apps_portrait.edc @@ -46,32 +46,44 @@ collections { visible: 0; } } - part { - name: "index"; - type: SWALLOW; - mouse_events: 0; - description { - state: "default" 0.0; - align: 0.5 0.5; + 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: "content_bg"; - type: RECT; - scale: 1; - mouse_events: 1; - description { + } + } + 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";} + visible: 1; + } + } + part { + name: "content_bg"; + type: RECT; + scale: 1; + mouse_events: 1; + description { state: "default" 0.0; rel1 { relative: 0.0 84/1210; to, "bg"; } // 154 - 70 rel2 { relative: 1.0 1144/1210; to, "bg"; } color: 34 34 34 255; visible: 0; - } - } + } + } part { name: "content"; @@ -80,7 +92,7 @@ collections { mouse_events: 1; description { state: "default" 0.0; - align: 0.5 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; diff --git a/data/edje/button_edit.edc b/data/edje/button_edit.edc new file mode 100644 index 0000000..dc6e2e3 --- /dev/null +++ b/data/edje/button_edit.edc @@ -0,0 +1,277 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +images { + image: "../images/RM06_App_tray_setting.png" COMP; + image: "../images/RM06_App_tray_setting_press.png" COMP; + image: "../images/RM06_App_tray_edit_btn.png" COMP; + image: "../images/RM06_App_tray_edit_btn_press.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: 25/128 0.0; } + rel2 { relative: 1.0 1.0; } + visible: 0; + } + description { + state: "enable" 0.0; + rel1 { relative: 0.0 0.0; } + rel2 { relative: 1.0 1.0; } + visible: 0; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 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: 119 54; + max: 119 54; + fixed: 1 1; + image { + normal: "../images/RM06_App_tray_edit_btn.png"; + border: 3 3 3 3; + middle: DEFAULT; + border_scale: 0; + } + color: 0 0 0 0; + visible: 1; + } + description { + state: "enable" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "press" 0.0; + rel1 { relative: 0.5 0.5; to, "edit_button"; } + rel2 { relative: 0.5 0.5; to, "edit_button"; } + min: 119 54; + max: 119 54; + fixed: 1 1; + image { + normal: "../images/RM06_App_tray_edit_btn_press.png"; + border: 3 3 3 3; + middle: DEFAULT; + border_scale: 0; + } + color: 255 255 255 255; + visible: 1; + } + 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: 30/119 0.5; to, "edit_button_bg";} + rel2 { relative: 30/119 0.5; to, "edit_button_bg";} + image { + normal: "../images/RM06_App_tray_setting.png"; + } + min:42 42; + fixed: 1 1; + visible: 1; + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + image { + normal: "../images/RM06_App_tray_setting_press.png"; + } + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "edit_button_text"; + type: TEXT; + effect: SOFT_SHADOW; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 50/119 0.15; to, "edit_button_bg";} // origin : 59/119 0.0 + rel2 { relative: 1.0 1.0; to, "edit_button_bg";} + color: 183 183 183 255; + color2: 0 0 0 35; + color3: 0 0 0 35; + text { + text_class: "menu_item"; + font: "TIZEN:style=medium"; + size: 6; + fit: 1 1; + align: 0.5 0.5; + } + visible: 1; + } + description { + state: "press" 0.0; + inherit: "default" 0.0; + color: 249 249 249 255; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + + part { + name: "edit_button_event"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + align: 0.5 0.5; + color: 0 0 0 0; + rel1 { relative: 0.0 0.0; to, "edit_button";} + rel2 { relative: 1.0 1.0; to, "edit_button";} + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + + programs { + program { + name: "edit_button,down"; + signal: "mouse,down,*"; + source: "edit_button_event"; + action: STATE_SET "press" 0.0; + target: "edit_button_image"; + target: "edit_button_text"; + 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,*"; + source: "edit_button_event"; + action: STATE_SET "default" 0.0; + target: "edit_button_image"; + target: "edit_button_text"; + after: "edit_button,up,after"; + } + program { + name: "edit_button,up,after"; + action: SIGNAL_EMIT "edit_button,up" "menu"; + } + + program { + name: "edit_button,enable"; + signal: "edit_button,enable"; + source: "menu"; + action: STATE_SET "enable" 0.0; + target: "edit_button"; + target: "edit_button_bg"; + transition: DECELERATE 0.4; + } + program { + name: "edit_button,disable"; + signal: "edit_button,disable"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "edit_button"; + target: "edit_button_bg"; + transition: DECELERATE 0.4; + } + + program { + name: "edit_button,enable,press"; + signal: "edit_button,enable,press"; + source: "menu"; + action: STATE_SET "press" 0.0; + target: "edit_button_bg"; + } + program { + name: "edit_button,enable,release"; + signal: "edit_button,enable,release"; + source: "menu"; + action: STATE_SET "enable" 0.0; + target: "edit_button_bg"; + } + program { + name: "edit_button_image,hide"; + signal: "edit_button_image,hide"; + source: "menu"; + action: STATE_SET "hide" 0.0; + target: "edit_button"; + target: "edit_button_bg"; + target: "edit_button_image"; + target: "edit_button_text"; + target: "edit_button_event"; + } + program { + name: "edit_button_image,show"; + signal: "edit_button_image,show"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "edit_button"; + target: "edit_button_bg"; + target: "edit_button_image"; + target: "edit_button_text"; + target: "edit_button_event"; + } + } + } +} + + +// End of file diff --git a/data/edje/item_4x4.edc b/data/edje/item_4x4.edc index c243069..527dfad 100644 --- a/data/edje/item_4x4.edc +++ b/data/edje/item_4x4.edc @@ -25,7 +25,11 @@ styles { } } - +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 { @@ -81,7 +85,56 @@ collections { visible: 1; } } + part { + name: "badge"; + type: IMAGE; + scale: 1; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + rel1 { relative: 120/180 10/180; to, "bg"; } + rel2 { relative: 180/180 70/180; 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: "menu_item"; + 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; @@ -100,6 +153,52 @@ collections { visible: 0; } } + part { + name: "uninstall"; + type: IMAGE; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 10/180 10/180; to, "bg"; } + rel2 { relative: 70/180 70/180; to, "bg"; } + image { + normal: "../images/RM06_App tray_Btn_Uninstall.png"; + } + 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: "uninstall_event"; + type: RECT; + scale: 1; + mouse_events: 1; + description { + state: "default" 0.0; + rel1 { relative: 0/180 10/180; to, "bg"; } + rel2 { relative: 60/180 70/180; to, "bg"; } + color: 0 0 0 0; + visible: 0; + } + description { + state: "edit,release" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } part { name: "txt"; type: TEXT; @@ -147,6 +246,66 @@ collections { 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"; + } + program { + name: "uninstall,off"; + signal: "uninstall,off"; + source: "menu"; + action: STATE_SET "default" 0.0; + target: "block_event"; + target: "uninstall"; + target: "uninstall_event"; + } + 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/pagecontrol.edc b/data/edje/pagecontrol.edc deleted file mode 100644 index ebb5c31..0000000 --- a/data/edje/pagecontrol.edc +++ /dev/null @@ -1,155 +0,0 @@ - /* - * Copyright 2012 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.tizenopensource.org/license - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -collections { - group { - name: "elm/pagecontrol/base/default"; - - parts { - part { - name: "bg"; - type: RECT; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - color: 0 0 0 0; - } - } - part { - name: "elm.swallow.page"; - type: SWALLOW; - mouse_events: 1; - scale: 1; - description { - state: "default" 0.0; - min: 332 32; - } - } - } - } - - #define PAGE_ITEM(number) \ - group { \ - name: "elm/page/item/default_"number; \ - images { \ - image: "../images/RM06_App tray_page indicator.png" COMP; \ - image: "../images/RM06_App tray_page indicator_focus.png" COMP; \ - } \ - parts { \ - part { \ - name: "bg"; \ - type: RECT; \ - mouse_events: 0; \ - scale: 1; \ - description { \ - state: "default" 0.0; \ - min: 44 40; \ - max: 44 40; \ - align: 0.5 0.5; \ - color: 0 0 0 0; \ - } \ - } \ - part { \ - name: "indicator_1"; \ - mouse_events: 0; \ - scale: 1; \ - description { \ - state: "default" 0.0; \ - min: 8 8; \ - max: 8 8; \ - fixed: 1 1; \ - align: 0.5 0.5; \ - visible: 1; \ - rel1 { to: "bg"; } \ - rel2 { to: "bg"; } \ - image { \ - normal: "../images/RM06_App tray_page indicator.png"; \ - } \ - } \ - description { \ - state: "selected" 0.0; \ - inherit: "default" 0.0; \ - min: 8 8; \ - max: 8 8; \ - visible: 0; \ - } \ - } \ - part { \ - name: "indicator_2"; \ - mouse_events: 0; \ - scale: 1; \ - description { \ - state: "default" 0.0; \ - min: 8 8; \ - max: 8 8; \ - fixed: 1 1; \ - align: 0.5 0.5; \ - visible: 0; \ - rel1 { to: "bg"; } \ - rel2 { to: "bg"; } \ - image { \ - normal: "../images/RM06_App tray_page indicator_focus.png"; \ - } \ - } \ - description { \ - state: "selected" 0.0; \ - inherit: "default" 0.0; \ - min: 8 8; \ - max: 8 8; \ - visible: 1; \ - } \ - } \ - } \ - programs { \ - program { \ - name: "indicator_on"; \ - signal: "elm,state,indicator,on"; \ - source: "elm"; \ - action: STATE_SET "selected" 0.0; \ - target: "indicator_1"; \ - target: "indicator_2"; \ - } \ - program { \ - name: "indicator_off"; \ - signal: "elm,state,indicator,off"; \ - source: "elm"; \ - action: STATE_SET "default" 0.0; \ - target: "indicator_1"; \ - target: "indicator_2"; \ - } \ - program { \ - name: "indicator_clicked"; \ - signal: "mouse,clicked,1"; \ - source: "bg"; \ - action: SIGNAL_EMIT "clicked" "indicator_clicked"; \ - } \ - } \ - } \ - - PAGE_ITEM(1) - PAGE_ITEM(2) - PAGE_ITEM(3) - PAGE_ITEM(4) - PAGE_ITEM(5) - PAGE_ITEM(6) - PAGE_ITEM(7) - PAGE_ITEM(8) - PAGE_ITEM(9) - PAGE_ITEM(10) -} 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 0000000..7145638 Binary files /dev/null and b/data/images/RM06_App tray_Btn_Uninstall.png differ diff --git a/data/images/RM06_App tray_Btn_Uninstall_press.png b/data/images/RM06_App tray_Btn_Uninstall_press.png new file mode 100644 index 0000000..2ac8311 Binary files /dev/null and b/data/images/RM06_App tray_Btn_Uninstall_press.png differ diff --git a/data/images/RM06_App_tray_edit_btn.png b/data/images/RM06_App_tray_edit_btn.png new file mode 100644 index 0000000..0674e9c Binary files /dev/null and b/data/images/RM06_App_tray_edit_btn.png differ diff --git a/data/images/RM06_App_tray_edit_btn_press.png b/data/images/RM06_App_tray_edit_btn_press.png new file mode 100644 index 0000000..eefc4f9 Binary files /dev/null and b/data/images/RM06_App_tray_edit_btn_press.png differ diff --git a/data/images/RM06_App_tray_setting.png b/data/images/RM06_App_tray_setting.png new file mode 100644 index 0000000..1b357fc Binary files /dev/null and b/data/images/RM06_App_tray_setting.png differ 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 0000000..3858945 Binary files /dev/null and b/data/images/RM06_App_tray_setting_press.png differ diff --git a/data/images/default.png b/data/images/default.png new file mode 100644 index 0000000..983c883 Binary files /dev/null and b/data/images/default.png differ diff --git a/data/images/menu_badge_01.png b/data/images/menu_badge_01.png new file mode 100644 index 0000000..f297f72 Binary files /dev/null and b/data/images/menu_badge_01.png differ diff --git a/data/org.tizen.menu-screen.xml.in b/data/org.tizen.menu-screen.xml.in index 2499869..1d99f9a 100755 --- a/data/org.tizen.menu-screen.xml.in +++ b/data/org.tizen.menu-screen.xml.in @@ -1,5 +1,5 @@ - + Jin Yoon Youngjoo Park diff --git a/debian/changelog b/debian/changelog index 169686b..e48e901 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,39 @@ +org.tizen.menu-screen (1.0.27) unstable; urgency=low + + * Git: apps/home/menu-screen + * Tag: menu-screen_1.0.27 + + * Disable the routines for pkgmgr temporarily. + + -- Jin Yoon Tue, 12 Mar 2013 17:06:12 +0900 + +org.tizen.menu-screen (1.0.26) unstable; urgency=low + + * Git: apps/home/menu-screen + * Tag: menu-screen_1.0.26 + + * Merge some features with the private + + -- Jin Yoon Tue, 12 Mar 2013 10:14:39 +0900 + +org.tizen.menu-screen (1.0.25) unstable; urgency=low + + * Git: apps/home/menu-screen + * Tag: menu-screen_1.0.25 + + * Merge with the Private Menu-screen + + -- Jin Yoon Wed, 06 Mar 2013 19:15:21 +0900 + +org.tizen.menu-screen (1.0.24) unstable; urgency=low + + * Git: apps/home/menu-screen + * Tag: menu-screen_1.0.24 + + * sync with the private + + -- Jin Yoon Thu, 14 Feb 2013 17:47:51 +0900 + org.tizen.menu-screen (1.0.23) unstable; urgency=low * Git: apps/home/menu-screen diff --git a/debian/control b/debian/control index 1a1fe81..4f38e1f 100644 --- a/debian/control +++ b/debian/control @@ -2,14 +2,14 @@ Source: menu-screen Section: utils Priority: extra Maintainer: Jin Yoon -Build-Depends: debhelper (>= 5), libelm-dev, libslp-utilx-dev, libslp-setting-dev, libefreet-dev, libslp-sysman-dev, libslp-pm-dev, dlog-dev, libecore-dev, libaul-1-dev, libpkgmgr-client-dev, syspopup-caller-dev, libheynoti-dev, libail-0-dev, librua-dev, libslp-shortcut-dev, menu-daemon, capi-appfw-application-dev +Build-Depends: debhelper (>= 5), libelm-dev, libslp-utilx-dev, libslp-setting-dev, libefreet-dev, libslp-sysman-dev, libslp-pm-dev, dlog-dev, libecore-dev, libaul-1-dev, libpkgmgr-client-dev, syspopup-caller-dev, libheynoti-dev, libail-0-dev, librua-dev, libslp-shortcut-dev, menu-daemon, capi-appfw-application-dev, libbadge-dev, pkgmgr-info-dev Homepage: N/A Standards-Version: 0.1.0 Package: org.tizen.menu-screen Section: utils Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, libelm, libeina, libslp-utilx-0, libslp-setting-0, libefreet, libslp-sysman, libslp-pm-0, libdlog-0, libaul-1, libpkgmgr-client-0, syspopup-caller-0, libheynoti-0, libail-0, menu-daemon, capi-appfw-application +Depends: ${shlibs:Depends}, ${misc:Depends}, libelm, libeina, libslp-utilx-0, libslp-setting-0, libefreet, libslp-sysman, libslp-pm-0, libdlog-0, libaul-1, libpkgmgr-client-0, syspopup-caller-0, libheynoti-0, libail-0, menu-daemon, capi-appfw-application, libbadge, pkgmgr-info Description: inhouse menu-screen Package: org.tizen.menu-screen-dbg diff --git a/include/item.h b/include/item.h index 70844a3..60d4db7 100644 --- a/include/item.h +++ b/include/item.h @@ -45,6 +45,13 @@ extern void item_set_desktop(Evas_Object *item, char *name, 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); diff --git a/include/item_badge.h b/include/item_badge.h new file mode 100644 index 0000000..8e13bdf --- /dev/null +++ b/include/item_badge.h @@ -0,0 +1,35 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#ifndef __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/list.h b/include/list.h index 7e5465b..d749dc2 100644 --- a/include/list.h +++ b/include/list.h @@ -32,6 +32,7 @@ typedef struct char *icon; char *desktop; bool nodisplay; + bool enabled; bool x_slp_removable; bool x_slp_taskmanage; pid_t pid; diff --git a/include/page_scroller.h b/include/page_scroller.h index 4f12bda..0a9f1ca 100644 --- a/include/page_scroller.h +++ b/include/page_scroller.h @@ -45,6 +45,10 @@ 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); + #endif //__MENU_SCREEN_PAGE_SCROLLER_H__ // End of a file diff --git a/include/popup.h b/include/popup.h index 7a2dc3c..d8ed123 100644 --- a/include/popup.h +++ b/include/popup.h @@ -25,6 +25,7 @@ extern void popup_free_list(); extern Evas_Object *popup_create(Evas_Object *parent, const char *warning); extern void popup_destroy(Evas_Object *popup); +extern Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item); #endif //__MENU_SCREEN_POPUP_H__ diff --git a/include/util.h b/include/util.h index 9d93f62..522a580 100644 --- a/include/util.h +++ b/include/util.h @@ -33,15 +33,15 @@ /* Log */ #if !defined(_W) -#define _W(fmt, arg...) LOGW("[%s:%d] "fmt"\n", __func__, __LINE__, ##arg) +#define _W(fmt, arg...) LOGW(fmt"\n", ##arg) #endif #if !defined(_D) -#define _D(fmt, arg...) LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##arg) +#define _D(fmt, arg...) LOGD(fmt"\n", ##arg) #endif #if !defined(_E) -#define _E(fmt, arg...) LOGE("[%s:%d] "fmt"\n", __func__, __LINE__, ##arg) +#define _E(fmt, arg...) LOGE(fmt"\n", ##arg) #endif #if !defined(_T) @@ -57,6 +57,12 @@ #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; \ diff --git a/packaging/org.tizen.menu-screen.spec b/packaging/org.tizen.menu-screen.spec index f084a02..8415cd9 100644 --- a/packaging/org.tizen.menu-screen.spec +++ b/packaging/org.tizen.menu-screen.spec @@ -14,32 +14,34 @@ Name: org.tizen.menu-screen Summary: An utility library of the menu screen -Version: 1.0.23 +Version: 1.0.27 Release: 1.1 Group: TO_BE/FILLED_IN License: Flora Software License Source0: %{name}-%{version}.tar.gz -BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(ail) BuildRequires: pkgconfig(appcore-efl) -BuildRequires: pkgconfig(utilX) BuildRequires: pkgconfig(aul) -BuildRequires: pkgconfig(dlog) -BuildRequires: pkgconfig(sysman) +BuildRequires: pkgconfig(badge) BuildRequires: pkgconfig(bundle) -BuildRequires: pkgconfig(pkgmgr) -BuildRequires: pkgconfig(syspopup-caller) -BuildRequires: pkgconfig(heynoti) -BuildRequires: pkgconfig(evas) -BuildRequires: pkgconfig(ecore-evas) -BuildRequires: pkgconfig(edje) +BuildRequires: pkgconfig(capi-appfw-application) +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(ail) -BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(elementary) +BuildRequires: pkgconfig(evas) +BuildRequires: pkgconfig(heynoti) +BuildRequires: pkgconfig(pkgmgr) +BuildRequires: pkgconfig(pkgmgr-info) +BuildRequires: pkgconfig(sysman) +BuildRequires: pkgconfig(syspopup-caller) +BuildRequires: pkgconfig(utilX) BuildRequires: cmake BuildRequires: edje-tools BuildRequires: gettext-tools @@ -92,9 +94,11 @@ init_vconf %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 %{_usr_datadir}/packages/org.tizen.menu-screen.xml %{_usr_datadir}/license/%{name} diff --git a/src/all_apps/layout.c b/src/all_apps/layout.c index 7d394ea..b525436 100644 --- a/src/all_apps/layout.c +++ b/src/all_apps/layout.c @@ -34,6 +34,163 @@ #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 STR_DONE _("Done") + + +HAPI void all_apps_layout_edit(Evas_Object *all_apps) +{ + Evas_Object *edit_button; + Evas_Object *scroller; + + edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART); + ret_if(NULL == edit_button); + edje_object_signal_emit(_EDJ(edit_button), "edit_button,enable", "menu"); + if (edje_object_part_text_set(_EDJ(edit_button), "edit_button_text", STR_DONE) == EINA_FALSE) { + _E("Failed to set text on the part, edje:%p, part:%s, text:%s", _EDJ(edit_button), "edit_button_text", STR_DONE); + } + + scroller = elm_object_part_content_get(all_apps, "content"); + ret_if(NULL == scroller); + page_scroller_edit(scroller); +} + + + +HAPI void all_apps_layout_unedit(Evas_Object *all_apps) +{ + Evas_Object *edit_button; + + ret_if(NULL == all_apps); + + do { + edit_button = elm_object_part_content_get(all_apps, ALL_APPS_EDIT_BUTTON_PART); + ret_if(NULL == edit_button); + + edje_object_signal_emit(_EDJ(edit_button), "edit_button,disable", "menu"); + if (edje_object_part_text_set(_EDJ(edit_button), "edit_button_text", "") == EINA_FALSE) { + _E("Failed to set text on the part, edje:%p, part:%s, text:(null)", _EDJ(edit_button), "edit_button_text"); + } + } 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 void _press_edit_button(Evas_Object *edje) +{ + edje_object_signal_emit(edje, "edit_button,enable,press", "menu"); +} + + + +static void _release_edit_button(Evas_Object *edje) +{ + edje_object_signal_emit(edje, "edit_button,enable,release", "menu"); +} + + + +static void _edit_button_down_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + Evas_Object *scroller = data; + + _D("Edit button is down"); + + if (page_scroller_is_edited(scroller)) { + _press_edit_button(obj); + } +} + + + +static void _edit_button_up_cb(void *data, Evas_Object *obj, const char* emission, const char* source) +{ + Evas_Object *scroller = data; + Evas_Object *all_apps; + + _D("Edit button is up"); + + all_apps = evas_object_data_get(scroller, "tab"); + if (page_scroller_is_edited(scroller)) { + Evas_Object *eo; + bool pressed = false; + + eo = evas_object_data_get(obj, "evas_object"); + pressed = (bool) evas_object_data_get(eo, "pressed"); + if (pressed) { + all_apps_layout_unedit(all_apps); + } else { + _release_edit_button(obj); + } + } else { + all_apps_layout_edit(all_apps); + } +} + + + +static void _button_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _D("Edit button is out"); + evas_object_data_set(obj, "pressed", (void *) false); +} + + + +static void _button_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + _D("Edit button is in"); + evas_object_data_set(obj, "pressed", (void *) true); +} + + + +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); + evas_object_event_callback_add(button, EVAS_CALLBACK_MOUSE_OUT, _button_out_cb, NULL); + evas_object_event_callback_add(button, EVAS_CALLBACK_MOUSE_IN, _button_in_cb, NULL); + evas_object_data_set(button, "pressed", (void *) false); + + return button; +} + + + +static void _remove_edit_button(Evas_Object *button) +{ + ret_if(NULL == button); + + 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); + evas_object_event_callback_del(button, EVAS_CALLBACK_MOUSE_OUT, _button_out_cb); + evas_object_event_callback_del(button, EVAS_CALLBACK_MOUSE_IN, _button_in_cb); + evas_object_data_del(button, "pressed"); + + layout_unload_edj(button); +} + static menu_screen_error_e _load_item(Evas_Object *scroller, app_list_item *item) @@ -42,8 +199,8 @@ static menu_screen_error_e _load_item(Evas_Object *scroller, app_list_item *item retv_if(NULL == item, MENU_SCREEN_ERROR_FAIL); ai = item->data; - if (ai->nodisplay == true) { - return MENU_SCREEN_ERROR_FAIL; + if (ai->nodisplay || !ai->enabled) { + return MENU_SCREEN_ERROR_OK; } retv_if(MENU_SCREEN_ERROR_FAIL == page_scroller_push_item(scroller, ai), MENU_SCREEN_ERROR_FAIL); @@ -80,6 +237,15 @@ ERROR: page_scroller_bring_in(scroller, 0); menu_screen_set_done(true); + 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 ECORE_CALLBACK_CANCEL; } @@ -102,7 +268,7 @@ static menu_screen_error_e _push_items(Evas_Object *all_apps) -Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate) +HAPI Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate) { Evas_Object *all_apps; Evas_Object *index; @@ -176,11 +342,23 @@ Evas_Object *all_apps_layout_create(Evas_Object *controlbar, int rotate) -void all_apps_layout_destroy(Evas_Object *all_apps) +HAPI void all_apps_layout_destroy(Evas_Object *all_apps) { Evas_Object *index; Evas_Object *scroller; + ret_if(NULL == all_apps); + + 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); + index = evas_object_data_get(all_apps, "index"); scroller = evas_object_data_get(all_apps, "scroller"); diff --git a/src/all_apps/list.c b/src/all_apps/list.c index e3d2e6c..531bbbd 100644 --- a/src/all_apps/list.c +++ b/src/all_apps/list.c @@ -85,7 +85,7 @@ static int _all_apps_sort_cb(const void *d1, const void *d2) -app_list *all_apps_list_create(void) +HAPI app_list *all_apps_list_create(void) { int count = 0; app_list *list; @@ -123,7 +123,7 @@ app_list *all_apps_list_create(void) -void all_apps_list_destroy(app_list *list) +HAPI void all_apps_list_destroy(app_list *list) { app_list_item *item; diff --git a/src/index.c b/src/index.c index 81f536c..d840d3d 100644 --- a/src/index.c +++ b/src/index.c @@ -28,7 +28,7 @@ -inline void index_bring_in(Evas_Object *index, int idx) +HAPI inline void index_bring_in(Evas_Object *index, int idx) { Elm_Object_Item *idx_it; @@ -39,7 +39,7 @@ inline void index_bring_in(Evas_Object *index, int idx) -void index_destroy(Evas_Object *index) +HAPI void index_destroy(Evas_Object *index) { evas_object_data_del(index, "win"); evas_object_data_del(index, "layout"); @@ -52,7 +52,7 @@ void index_destroy(Evas_Object *index) -Evas_Object *index_create(Evas_Object *tab, unsigned int count) +HAPI Evas_Object *index_create(Evas_Object *tab, unsigned int count) { Evas_Object *index; Evas_Object *scroller; @@ -106,7 +106,7 @@ Evas_Object *index_create(Evas_Object *tab, unsigned int count) -Evas_Object *index_update(Evas_Object *layout, Evas_Object *index, unsigned int count) +HAPI Evas_Object *index_update(Evas_Object *layout, Evas_Object *index, unsigned int count) { index_destroy(index); @@ -115,14 +115,14 @@ Evas_Object *index_update(Evas_Object *layout, Evas_Object *index, unsigned int -void index_hide(Evas_Object *index) +HAPI void index_hide(Evas_Object *index) { edje_object_signal_emit(_EDJ(index), "hide", "index"); } -void index_show(Evas_Object *index) +HAPI void index_show(Evas_Object *index) { edje_object_signal_emit(_EDJ(index), "show", "index"); } diff --git a/src/item.c b/src/item.c index aeb1812..6ebfde8 100644 --- a/src/item.c +++ b/src/item.c @@ -22,6 +22,7 @@ #include #include "menu_screen.h" +#include "item_badge.h" #include "conf.h" #include "item.h" #include "item_event.h" @@ -29,6 +30,7 @@ #include "list.h" #include "mapbuf.h" #include "page.h" +#include "page_scroller.h" #include "popup.h" #include "util.h" @@ -88,7 +90,7 @@ static char *_space_to_new_line(const char *str) -void item_set_icon(Evas_Object *edje, char *icon, int sync) +HAPI void item_set_icon(Evas_Object *edje, char *icon, int sync) { char *tmp; int changed; @@ -114,7 +116,7 @@ void item_set_icon(Evas_Object *edje, char *icon, int sync) -inline char *item_get_icon(Evas_Object *edje) +HAPI inline char *item_get_icon(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_ICON); } @@ -122,7 +124,7 @@ inline char *item_get_icon(Evas_Object *edje) -void item_set_name(Evas_Object *edje, char *name, int sync) +HAPI void item_set_name(Evas_Object *edje, char *name, int sync) { char *tmp; int changed; @@ -168,14 +170,14 @@ void item_set_name(Evas_Object *edje, char *name, int sync) -inline char *item_get_name(Evas_Object *edje) +HAPI inline char *item_get_name(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_NAME); } -void item_set_desktop(Evas_Object *edje, char *name, int sync) +HAPI void item_set_desktop(Evas_Object *edje, char *name, int sync) { char *tmp; int changed; @@ -201,14 +203,14 @@ void item_set_desktop(Evas_Object *edje, char *name, int sync) -inline char *item_get_desktop(Evas_Object *edje) +HAPI inline char *item_get_desktop(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_DESKTOP); } -void item_set_package(Evas_Object *edje, char *package, int sync) +HAPI void item_set_package(Evas_Object *edje, char *package, int sync) { char *tmp; int changed; @@ -235,14 +237,14 @@ void item_set_package(Evas_Object *edje, char *package, int sync) -inline char *item_get_package(Evas_Object *edje) +HAPI inline char *item_get_package(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_PKG_NAME); } -void item_set_removable(Evas_Object *edje, int removable, int sync) +HAPI void item_set_removable(Evas_Object *edje, int removable, int sync) { int value; int changed; @@ -263,14 +265,14 @@ void item_set_removable(Evas_Object *edje, int removable, int sync) -inline int item_get_removable(Evas_Object *edje) +HAPI inline int item_get_removable(Evas_Object *edje) { return (int) evas_object_data_get(edje, STR_ATTRIBUTE_REMOVABLE); } -void item_set_page(Evas_Object *edje, Evas_Object *page, int sync) +HAPI void item_set_page(Evas_Object *edje, Evas_Object *page, int sync) { Evas_Object *value; int changed; @@ -291,7 +293,7 @@ void item_set_page(Evas_Object *edje, Evas_Object *page, int sync) -inline Evas_Object *item_get_page(Evas_Object *edje) +HAPI inline Evas_Object *item_get_page(Evas_Object *edje) { return evas_object_data_get(edje, STR_ATTRIBUTE_PAGE); } @@ -299,7 +301,7 @@ inline Evas_Object *item_get_page(Evas_Object *edje) -inline void item_enable_delete(Evas_Object *item) +HAPI inline void item_enable_delete(Evas_Object *item) { if (item_get_removable(item) > 0) { edje_object_signal_emit(_EDJ(item), "delete,on", "menu"); @@ -308,7 +310,7 @@ inline void item_enable_delete(Evas_Object *item) -inline void item_disable_delete(Evas_Object *item) +HAPI inline void item_disable_delete(Evas_Object *item) { if (item_get_removable(item) > 0) { edje_object_signal_emit(_EDJ(item), "delete,off", "menu"); @@ -316,7 +318,50 @@ inline void item_disable_delete(Evas_Object *item) } -void item_enable_progress(Evas_Object *obj) + +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; @@ -347,7 +392,7 @@ void item_enable_progress(Evas_Object *obj) -void item_update_progress(Evas_Object *obj, int value) +HAPI void item_update_progress(Evas_Object *obj, int value) { Evas_Object *progress; @@ -363,7 +408,7 @@ void item_update_progress(Evas_Object *obj, int value) -void item_disable_progress(Evas_Object *obj) +HAPI void item_disable_progress(Evas_Object *obj) { Evas_Object *progress; @@ -381,18 +426,50 @@ void item_disable_progress(Evas_Object *obj) -int item_is_enabled_progress(Evas_Object *obj) +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); @@ -413,6 +490,10 @@ static Evas_Object *_add_icon_image(Evas_Object *item, const char *icon_file) 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; @@ -430,7 +511,7 @@ static Evas_Object *_add_edje_icon(Evas_Object *item, const char *icon_file) -menu_screen_error_e item_is_edje_icon(const char *icon) +HAPI menu_screen_error_e item_is_edje_icon(const char *icon) { int len; const char *ext = "jde."; @@ -449,17 +530,33 @@ menu_screen_error_e item_is_edje_icon(const char *icon) -void item_update(Evas_Object *item, app_info_t *ai) +HAPI void item_update(Evas_Object *item, app_info_t *ai) { - Evas_Object *icon; + Evas_Object *icon = NULL; + + ret_if(NULL == item); + ret_if(NULL == ai); if (!ai->image) { - 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); + if (0 != access(ai->icon, R_OK)) { + _E("Failed to access to [%s]", ai->icon); } else { - icon = _add_icon_image(item, ai->icon); - evas_object_data_set(item, "icon_image_type", STR_ICON_IMAGE_TYPE_OBJECT); + 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; @@ -483,11 +580,23 @@ void item_update(Evas_Object *item, app_info_t *ai) 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); } -Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai) +HAPI Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai) { Evas_Object *item; Evas_Object *bg; @@ -505,6 +614,7 @@ Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai) bg = evas_object_rectangle_add(menu_screen_get_evas()); if (!bg) { + _E("Cannot add an rectangle"); evas_object_del(item); return NULL; } @@ -540,7 +650,7 @@ Evas_Object *item_create(Evas_Object *scroller, app_info_t* ai) -void item_destroy(Evas_Object *item) +HAPI void item_destroy(Evas_Object *item) { Evas_Object *icon; Evas_Object *bg; @@ -565,6 +675,9 @@ void item_destroy(Evas_Object *item) } } + if (item_badge_is_registered(item)) { + item_badge_unregister(item); + } item_event_unregister(item); item_set_package(item, NULL, 1); @@ -617,7 +730,7 @@ static Eina_Bool _unblock_cb(void *data) -void item_launch(Evas_Object *obj) +HAPI void item_launch(Evas_Object *obj) { char *package; char *name; @@ -661,7 +774,7 @@ void item_launch(Evas_Object *obj) -int item_get_position(Evas_Object *item) +HAPI int item_get_position(Evas_Object *item) { Evas_Object *scroller; Evas_Object *layout; @@ -716,21 +829,21 @@ int item_get_position(Evas_Object *item) -void item_mark_dirty(Evas_Object *item) +HAPI void item_mark_dirty(Evas_Object *item) { evas_object_data_set(item, "dirty", (void *) 1); } -void item_unmark_dirty(Evas_Object *item) +HAPI void item_unmark_dirty(Evas_Object *item) { evas_object_data_set(item, "dirty", (void *) 0); } -int item_is_dirty(Evas_Object *item) +HAPI int item_is_dirty(Evas_Object *item) { return (int) evas_object_data_get(item, "dirty"); } diff --git a/src/item_badge.c b/src/item_badge.c new file mode 100644 index 0000000..8762099 --- /dev/null +++ b/src/item_badge.c @@ -0,0 +1,180 @@ + /* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +#include +#include +#include + +#include "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 index 30fd27a..e5eec04 100644 --- a/src/item_event.c +++ b/src/item_event.c @@ -29,6 +29,8 @@ #include "mouse.h" #include "page.h" #include "page_scroller.h" +#include "pkgmgr.h" +#include "popup.h" #include "util.h" #include "all_apps/layout.h" @@ -70,6 +72,7 @@ static void _item_down_cb(void *data, Evas_Object *obj, const char* emission, co static void _item_up_cb(void *data, Evas_Object *obj, const char* emission, const char* source) { + Evas_Object *scroller; Evas_Object *icon_image; Evas_Object *item; @@ -91,12 +94,57 @@ static void _item_up_cb(void *data, Evas_Object *obj, const char* emission, cons if (mouse_is_scrolling()) return; + scroller = evas_object_data_get(item, "scroller"); + ret_if(NULL == scroller); + + if (true == page_scroller_is_edited(scroller)) { + return; + } item_launch(item); } -void item_event_register(Evas_Object *item) +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; + Evas_Object *scroller; + char *package; + + ret_if(mouse_is_scrolling()); + + win = menu_screen_get_win(); + ret_if(NULL == win); + + _D("Uninstall button is up"); + scroller = evas_object_data_get(item, "scroller"); + 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"); + + package = item_get_package(obj); + 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 void item_event_register(Evas_Object *item) { Evas_Object *item_edje; item_edje = _EDJ(item); @@ -104,11 +152,14 @@ void item_event_register(Evas_Object *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); } -void item_event_unregister(Evas_Object *item) +HAPI void item_event_unregister(Evas_Object *item) { Evas_Object *item_edje; item_edje = _EDJ(item); @@ -116,6 +167,9 @@ void item_event_unregister(Evas_Object *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"); } diff --git a/src/layout.c b/src/layout.c index f28751b..43edf93 100644 --- a/src/layout.c +++ b/src/layout.c @@ -33,7 +33,7 @@ -Evas_Object *layout_create(Evas_Object *conformant, const char *file, const char *group, int rotate) +HAPI Evas_Object *layout_create(Evas_Object *conformant, const char *file, const char *group, int rotate) { Evas_Object *layout; @@ -77,7 +77,7 @@ Evas_Object *layout_create(Evas_Object *conformant, const char *file, const char -void layout_destroy(Evas_Object *layout) +HAPI void layout_destroy(Evas_Object *layout) { Evas_Object *all_apps; @@ -94,7 +94,7 @@ void layout_destroy(Evas_Object *layout) -void layout_enable_block(Evas_Object *layout) +HAPI void layout_enable_block(Evas_Object *layout) { ret_if(NULL == layout); @@ -104,7 +104,7 @@ void layout_enable_block(Evas_Object *layout) -void layout_disable_block(Evas_Object *layout) +HAPI void layout_disable_block(Evas_Object *layout) { ret_if(NULL == layout); @@ -114,7 +114,7 @@ void layout_disable_block(Evas_Object *layout) -Evas_Object* layout_load_edj(Evas_Object *parent, const char *edjname, const char *grpname) +HAPI Evas_Object* layout_load_edj(Evas_Object *parent, const char *edjname, const char *grpname) { Evas_Object *eo; @@ -132,7 +132,7 @@ Evas_Object* layout_load_edj(Evas_Object *parent, const char *edjname, const cha -void layout_unload_edj(Evas_Object *layout) +HAPI void layout_unload_edj(Evas_Object *layout) { Evas_Object *evas_object; diff --git a/src/list.c b/src/list.c index 48c9a08..2aa4142 100644 --- a/src/list.c +++ b/src/list.c @@ -27,7 +27,7 @@ -menu_screen_error_e list_count(app_list *list, int *count) +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); @@ -40,7 +40,7 @@ menu_screen_error_e list_count(app_list *list, int *count) -menu_screen_error_e list_first(app_list *list) +HAPI menu_screen_error_e list_first(app_list *list) { retv_if(NULL == list, MENU_SCREEN_ERROR_INVALID_PARAMETER); @@ -51,7 +51,7 @@ menu_screen_error_e list_first(app_list *list) -menu_screen_error_e list_next(app_list *list) +HAPI menu_screen_error_e list_next(app_list *list) { int count; @@ -68,7 +68,7 @@ menu_screen_error_e list_next(app_list *list) -menu_screen_error_e list_is_ended(app_list *list, bool *flag) +HAPI menu_screen_error_e list_is_ended(app_list *list, bool *flag) { int count; @@ -83,7 +83,7 @@ menu_screen_error_e list_is_ended(app_list *list, bool *flag) -menu_screen_error_e list_get_item(app_list *list, app_list_item **item) +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); @@ -96,7 +96,7 @@ menu_screen_error_e list_get_item(app_list *list, app_list_item **item) -menu_screen_error_e list_get_values(const char *package, app_info_t *ai) +HAPI menu_screen_error_e list_get_values(const char *package, app_info_t *ai) { ail_appinfo_h appinfo_h; char *exec; @@ -115,6 +115,7 @@ menu_screen_error_e list_get_values(const char *package, app_info_t *ai) 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); @@ -139,20 +140,35 @@ menu_screen_error_e list_get_values(const char *package, app_info_t *ai) -void list_free_values(app_info_t *ai) +HAPI void list_free_values(app_info_t *ai) { ret_if(NULL == ai); /* Origin field */ - if (ai->package) free(ai->package); - if (ai->exec) free(ai->exec); - if (ai->name) free(ai->name); - if (ai->icon) free(ai->icon); + 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; + } } -menu_screen_error_e list_append_item(app_list *list, app_list_item *item) +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); @@ -165,7 +181,7 @@ menu_screen_error_e list_append_item(app_list *list, app_list_item *item) -menu_screen_error_e list_remove_item(app_list *list, app_list_item *item) +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); @@ -178,7 +194,7 @@ menu_screen_error_e list_remove_item(app_list *list, app_list_item *item) -menu_screen_error_e list_sort(app_list *list, int (*_sort_cb)(const void *d1, const void *d2)) +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); diff --git a/src/mapbuf.c b/src/mapbuf.c index 098b12b..b807395 100644 --- a/src/mapbuf.c +++ b/src/mapbuf.c @@ -26,7 +26,7 @@ -Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj) +HAPI Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj) { Evas_Object *mapbuf; @@ -42,7 +42,7 @@ Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj) -Evas_Object *mapbuf_get_page(Evas_Object *obj) +HAPI Evas_Object *mapbuf_get_page(Evas_Object *obj) { Evas_Object *page; @@ -58,13 +58,11 @@ Evas_Object *mapbuf_get_page(Evas_Object *obj) -menu_screen_error_e mapbuf_enable(Evas_Object *obj, int force) +HAPI menu_screen_error_e mapbuf_enable(Evas_Object *obj, int force) { Evas_Object *mapbuf; int cnt; - _D("Mapbuf disabled version"); - mapbuf = mapbuf_get_mapbuf(obj); if (!mapbuf) { _D("Failed to get the mapbuf object"); @@ -96,7 +94,7 @@ menu_screen_error_e mapbuf_enable(Evas_Object *obj, int force) -int mapbuf_is_enabled(Evas_Object *obj) +HAPI int mapbuf_is_enabled(Evas_Object *obj) { Evas_Object *mapbuf; mapbuf = mapbuf_get_mapbuf(obj); @@ -109,7 +107,7 @@ int mapbuf_is_enabled(Evas_Object *obj) -int mapbuf_disable(Evas_Object *obj, int force) +HAPI int mapbuf_disable(Evas_Object *obj, int force) { Evas_Object *mapbuf; int cnt; @@ -143,7 +141,7 @@ int mapbuf_disable(Evas_Object *obj, int force) -Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page) +HAPI Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page) { Evas_Object *mapbuf; @@ -167,7 +165,7 @@ Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page) -Evas_Object *mapbuf_unbind(Evas_Object *obj) +HAPI Evas_Object *mapbuf_unbind(Evas_Object *obj) { Evas_Object *page; Evas_Object *mapbuf; diff --git a/src/menu_screen.c b/src/menu_screen.c index 0ce4d1b..8f4f5b4 100644 --- a/src/menu_screen.c +++ b/src/menu_screen.c @@ -64,49 +64,49 @@ static struct { -Evas *menu_screen_get_evas(void) +HAPI Evas *menu_screen_get_evas(void) { return menu_screen_info.evas; } -int menu_screen_get_root_width(void) +HAPI int menu_screen_get_root_width(void) { return menu_screen_info.root_width; } -int menu_screen_get_root_height(void) +HAPI int menu_screen_get_root_height(void) { return menu_screen_info.root_height; } -Evas_Object *menu_screen_get_win(void) +HAPI Evas_Object *menu_screen_get_win(void) { return menu_screen_info.win; } -Elm_Theme *menu_screen_get_theme(void) +HAPI Elm_Theme *menu_screen_get_theme(void) { return menu_screen_info.theme; } -bool menu_screen_get_done(void) +HAPI bool menu_screen_get_done(void) { return menu_screen_info.is_done; } -void menu_screen_set_done(bool is_done) +HAPI void menu_screen_set_done(bool is_done) { menu_screen_info.is_done = is_done; } @@ -299,7 +299,7 @@ static void _fini_theme(void) -Evas_Object *_create_conformant(Evas_Object *win) +static Evas_Object *_create_conformant(Evas_Object *win) { Evas_Object *conformant; @@ -319,7 +319,7 @@ Evas_Object *_create_conformant(Evas_Object *win) -void _destroy_conformant(Evas_Object *conformant) +static void _destroy_conformant(Evas_Object *conformant) { evas_object_data_del(conformant, "win"); evas_object_del(conformant); diff --git a/src/mouse.c b/src/mouse.c index 078323f..f6cf446 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -68,7 +68,7 @@ static struct { -bool mouse_is_scrolling(void) +HAPI bool mouse_is_scrolling(void) { bool scroll_x = false; bool scroll_y = false; @@ -141,7 +141,7 @@ static Eina_Bool _move_cb(void *data, int type, void *event) -void mouse_register(void) +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) { @@ -168,7 +168,7 @@ void mouse_register(void) -void mouse_unregister(void) +HAPI void mouse_unregister(void) { if (mouse_info.mouse_down) { ecore_event_handler_del(mouse_info.mouse_down); diff --git a/src/page.c b/src/page.c index 0492364..6da6598 100644 --- a/src/page.c +++ b/src/page.c @@ -34,7 +34,7 @@ -inline void page_mark_dirty(Evas_Object *page) +HAPI inline void page_mark_dirty(Evas_Object *page) { int value; value = (int) evas_object_data_get(page, "dirty"); @@ -43,7 +43,7 @@ inline void page_mark_dirty(Evas_Object *page) -inline void page_unmark_dirty(Evas_Object *page) +HAPI inline void page_unmark_dirty(Evas_Object *page) { int value; value = (int) evas_object_data_get(page, "dirty"); @@ -54,14 +54,14 @@ inline void page_unmark_dirty(Evas_Object *page) -inline void page_clean_dirty(Evas_Object *page) +HAPI inline void page_clean_dirty(Evas_Object *page) { evas_object_data_set(page, "dirty", 0); } -inline int page_is_dirty(Evas_Object *page) +HAPI inline int page_is_dirty(Evas_Object *page) { return (int) evas_object_data_get(page, "dirty"); } @@ -137,7 +137,7 @@ static void _dim_up_cb(void *data, Evas_Object *obj, const char* emission, const -Evas_Object *page_create(Evas_Object *scroller, int idx, int rotate) +HAPI Evas_Object *page_create(Evas_Object *scroller, int idx, int rotate) { Evas_Object *page; Evas_Object *bg; @@ -218,7 +218,7 @@ Evas_Object *page_create(Evas_Object *scroller, int idx, int rotate) -void page_destroy(Evas_Object *scroller, Evas_Object *page) +HAPI void page_destroy(Evas_Object *scroller, Evas_Object *page) { Evas_Object *mapbuf; Evas_Object *bg; @@ -279,7 +279,7 @@ void page_destroy(Evas_Object *scroller, Evas_Object *page) -Evas_Object *page_get_item_at(Evas_Object *page, unsigned int idx) +HAPI Evas_Object *page_get_item_at(Evas_Object *page, unsigned int idx) { Eina_List *pending_list; Eina_List *n; @@ -305,7 +305,7 @@ Evas_Object *page_get_item_at(Evas_Object *page, unsigned int idx) -menu_screen_error_e page_unpack_item(Evas_Object *page, Evas_Object *item) +HAPI menu_screen_error_e page_unpack_item(Evas_Object *page, Evas_Object *item) { char tmp[PATH_MAX]; Evas_Object *check_item; @@ -347,7 +347,7 @@ menu_screen_error_e page_unpack_item(Evas_Object *page, Evas_Object *item) -Evas_Object *page_unpack_item_at(Evas_Object *page, int idx) +HAPI Evas_Object *page_unpack_item_at(Evas_Object *page, int idx) { Eina_List *pending_list; Eina_List *n; @@ -390,7 +390,7 @@ Evas_Object *page_unpack_item_at(Evas_Object *page, int idx) -void page_pack_item(Evas_Object *page, int idx, Evas_Object *item) +HAPI void page_pack_item(Evas_Object *page, int idx, Evas_Object *item) { char tmp[PATH_MAX]; Evas_Object *object; @@ -426,7 +426,7 @@ void page_pack_item(Evas_Object *page, int idx, Evas_Object *item) -void page_set_item(Evas_Object *page, int idx, Evas_Object *item) +HAPI void page_set_item(Evas_Object *page, int idx, Evas_Object *item) { Eina_List *list; @@ -448,7 +448,7 @@ void page_set_item(Evas_Object *page, int idx, Evas_Object *item) -inline unsigned int page_count_item(Evas_Object *page) +HAPI inline unsigned int page_count_item(Evas_Object *page) { register unsigned int i; unsigned int count = 0; @@ -466,7 +466,7 @@ inline unsigned int page_count_item(Evas_Object *page) -int page_find_empty_near(Evas_Object *page, int pivot) +HAPI int page_find_empty_near(Evas_Object *page, int pivot) { int pivot_saved = pivot; Evas_Object *obj; @@ -503,7 +503,7 @@ int page_find_empty_near(Evas_Object *page, int pivot) -int page_find_first_empty(Evas_Object *page, int pivot) +HAPI int page_find_first_empty(Evas_Object *page, int pivot) { Evas_Object *item; Evas_Object *scroller; @@ -525,7 +525,7 @@ int page_find_first_empty(Evas_Object *page, int pivot) -void page_trim_items(Evas_Object *page) +HAPI void page_trim_items(Evas_Object *page) { Evas_Object *item; register unsigned int i; diff --git a/src/page_scroller.c b/src/page_scroller.c index 20b7116..cd42b1f 100644 --- a/src/page_scroller.c +++ b/src/page_scroller.c @@ -19,6 +19,7 @@ #include #include +#include "item_badge.h" #include "conf.h" #include "index.h" #include "item.h" @@ -52,7 +53,7 @@ static int _count_pages(Evas_Object *scroller) -void page_scroller_bring_in(Evas_Object *scroller, int idx) +HAPI void page_scroller_bring_in(Evas_Object *scroller, int idx) { Evas_Object *index; int w, h; @@ -74,7 +75,7 @@ void page_scroller_bring_in(Evas_Object *scroller, int idx) -void page_scroller_show_region(Evas_Object *scroller, int idx) +HAPI void page_scroller_show_region(Evas_Object *scroller, int idx) { Evas_Object *index; int w, h; @@ -192,7 +193,7 @@ static void _scroller_unregister(Evas_Object *scroller) -menu_screen_error_e _find_position_by_default(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) +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; @@ -234,7 +235,7 @@ menu_screen_error_e _find_position_by_default(Evas_Object *scroller, int *candid -menu_screen_error_e _find_position_by_package(Evas_Object *scroller, int *candidate_page, int *candidate_pos, void *data) +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; @@ -282,6 +283,54 @@ menu_screen_error_e _find_position_by_package(Evas_Object *scroller, int *candid +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; @@ -393,7 +442,7 @@ static Evas_Object *_animated_unpack_item(Evas_Object *scroller, Evas_Object *pa -menu_screen_error_e page_scroller_push_item(Evas_Object *scroller, app_info_t *ai) +HAPI menu_screen_error_e page_scroller_push_item(Evas_Object *scroller, app_info_t *ai) { Evas_Object *page; Evas_Object *item; @@ -417,7 +466,7 @@ menu_screen_error_e page_scroller_push_item(Evas_Object *scroller, app_info_t *a }, { .sort_type = PAGE_SCROLLER_SORT_BY_NAME, - .sort_func = NULL, + .sort_func = _find_position_by_name, }, { .sort_type = PAGE_SCROLLER_SORT_MAX, @@ -476,7 +525,8 @@ static inline menu_screen_error_e _create_cb(const char *package, void *data) break; } - if (ai.nodisplay) { + if (ai.nodisplay || !ai.enabled) + { Evas_Object *page; _D("package %s is not visible", package); @@ -484,7 +534,7 @@ static inline menu_screen_error_e _create_cb(const char *package, void *data) if (item) { if (page) { page_unpack_item(page, item); - page_trim_items(page); + page_scroller_trim_items(scroller); } item_destroy(item); @@ -544,14 +594,14 @@ static inline menu_screen_error_e _update_cb(const char *package, void *data) _D("There is no loaded item is found"); item = pkgmgr_find_pended_object(package, 1, scroller, &page); if (item) { - if (!ai.nodisplay) { + 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_trim_items(page); + page_scroller_trim_items(scroller); } item_destroy(item); } @@ -559,7 +609,7 @@ static inline menu_screen_error_e _update_cb(const char *package, void *data) int ret; _D("Item is not found. Create a new one"); - ret = (ai.nodisplay == false ? page_scroller_push_item(scroller, &ai) : MENU_SCREEN_ERROR_OK); + ret = ((!ai.nodisplay && ai.enabled) ? page_scroller_push_item(scroller, &ai) : MENU_SCREEN_ERROR_OK); if (ret == MENU_SCREEN_ERROR_OK) { break; } else { @@ -576,7 +626,7 @@ static inline menu_screen_error_e _update_cb(const char *package, void *data) _D("Cannot find package in the install list"); } - if (ai.nodisplay == false) { + if (!ai.nodisplay && ai.enabled) { item_update(item, &ai); break; } @@ -584,7 +634,7 @@ static inline menu_screen_error_e _update_cb(const char *package, void *data) page = page_scroller_get_page_at(scroller, page_no); if (page) { page_unpack_item(page, item); - page_trim_items(page); + page_scroller_trim_items(scroller); } item_destroy(item); } @@ -736,7 +786,7 @@ static void _mapbuf_cb(keynode_t *node, void *data) -void _mouse_wheel_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +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; @@ -761,7 +811,7 @@ void _mouse_wheel_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scroller_sort_type_e sort_type, int rotate) +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; @@ -823,7 +873,7 @@ Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scr evas_object_show(box); evas_object_show(scroller); - if (vconf_notify_key_changed("memory/menuscreen/desktop", _desktop_cb, scroller) < 0) { + if (vconf_notify_key_changed(VCONFKEY_AIL_INFO_STATE, _desktop_cb, scroller) < 0) { _E("Failed to register a desktop change event handler"); } @@ -831,14 +881,16 @@ Evas_Object *page_scroller_create(Evas_Object *tab, Evas_Object *index, page_scr _E("Failed to register a vconf cb for %s", "memory/menuscreen/mapbuf"); } - pkgmgr_init(scroller); + // FIXME : This will be enabled after rebuilding the routine for appid <-> pkgid. + //pkgmgr_init(scroller); + item_badge_register_changed_cb(scroller); return scroller; } -void page_scroller_destroy(Evas_Object *scroller) +HAPI void page_scroller_destroy(Evas_Object *scroller) { Evas_Object *box; Evas_Object *page; @@ -852,7 +904,10 @@ void page_scroller_destroy(Evas_Object *scroller) ret_if(NULL == (box = evas_object_data_get(scroller, "box"))); ret_if(NULL == (page_list = elm_box_children_get(box))); - pkgmgr_fini(); + 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; @@ -903,7 +958,7 @@ void page_scroller_destroy(Evas_Object *scroller) 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); - if (vconf_ignore_key_changed("memory/menuscreen/desktop", _desktop_cb) < 0) { + if (vconf_ignore_key_changed(VCONFKEY_AIL_INFO_STATE, _desktop_cb) < 0) { _E("Failed to ignore the desktop event"); } @@ -914,7 +969,7 @@ void page_scroller_destroy(Evas_Object *scroller) -void page_scroller_clean(Evas_Object *scroller) +HAPI void page_scroller_clean(Evas_Object *scroller) { Evas_Object *page; Evas_Object *item; @@ -947,7 +1002,7 @@ void page_scroller_clean(Evas_Object *scroller) -Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx) +HAPI Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx) { const Eina_List *page_list; Evas_Object *item; @@ -971,7 +1026,7 @@ Evas_Object *page_scroller_get_page_at(Evas_Object *scroller, unsigned int idx) -unsigned int page_scroller_count_page(Evas_Object *scroller) +HAPI unsigned int page_scroller_count_page(Evas_Object *scroller) { const Eina_List *page_list; Evas_Object *box; @@ -987,7 +1042,7 @@ unsigned int page_scroller_count_page(Evas_Object *scroller) -int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page) +HAPI int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page) { Evas_Object *item; Evas_Object *box; @@ -1018,7 +1073,7 @@ int page_scroller_get_page_no(Evas_Object* scroller, Evas_Object *page) -Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const char *package, int *page_no) +HAPI Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const char *package, int *page_no) { register int i; register int j; @@ -1059,7 +1114,7 @@ Evas_Object *page_scroller_find_item_by_package(Evas_Object *scroller, const cha -void page_scroller_trim_items(Evas_Object *scroller) +HAPI void page_scroller_trim_items(Evas_Object *scroller) { register unsigned int i; register unsigned int j; @@ -1130,4 +1185,83 @@ void page_scroller_trim_items(Evas_Object *scroller) } + +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"); +} + + + // End of a file diff --git a/src/pkgmgr.c b/src/pkgmgr.c index a0fb33a..9b01b2f 100644 --- a/src/pkgmgr.c +++ b/src/pkgmgr.c @@ -18,6 +18,7 @@ #include #include +#include #include "conf.h" #include "index.h" @@ -46,23 +47,56 @@ static struct { -inline menu_screen_error_e pkgmgr_uninstall(Evas_Object *item) +HAPI inline menu_screen_error_e pkgmgr_uninstall(Evas_Object *item) { - pkgmgr_client *req_pc = NULL; 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); - if (pkgmgr_client_uninstall(req_pc, NULL, item_get_package(item), PM_QUIET, NULL, NULL) < 0) { + 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 (pkgmgr_client_free(req_pc) != PKGMGR_R_OK) { - _E("cannot free pkgmgr_client for request."); + 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; @@ -116,6 +150,7 @@ static menu_screen_error_e _start_uninstall(const char *package, void *scroller) 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); @@ -157,18 +192,19 @@ static menu_screen_error_e _start_update(const char *package, void *scroller) 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) { + 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_trim_items(pi->page); + page_scroller_trim_items(scroller); item_destroy(pi->item); } @@ -220,25 +256,40 @@ static menu_screen_error_e _start_install(const char *package, void *scroller) 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) { - pi->page = page_scroller_get_page_at(scroller, page_no); + if (!pi->item) { + if (MENU_SCREEN_ERROR_FAIL == 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) { + 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_trim_items(pi->page); + page_scroller_trim_items(scroller); item_destroy(pi->item); } @@ -336,7 +387,9 @@ static menu_screen_error_e _icon_path(const char *package, const char *val, void 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 (MENU_SCREEN_ERROR_FAIL == page_scroller_push_item(scroller, &pi->ai)) { _E("Failed to create a new item, remove this package from the installing list"); @@ -346,6 +399,7 @@ static menu_screen_error_e _icon_path(const char *package, const char *val, void free(pi); } } else { + _D("There is an item for [%s:%p]", package, pi->item); item_update(pi->item, &pi->ai); } } @@ -382,7 +436,7 @@ static menu_screen_error_e _download_percent(const char *package, const char *va _D("Invalid state for %s, This is not started from the download_begin state(%s)", package, val); } - if (!pi->ai.nodisplay && pi->item) { + if (!pi->ai.nodisplay && pi->ai.enabled && pi->item) { if (!item_is_enabled_progress(pi->item)) { item_enable_progress(pi->item); } @@ -434,7 +488,7 @@ static menu_screen_error_e _install_percent(const char *package, const char *val _D("Invalid state for %s, This is not the uninstall or install_begin state(%s)", package, val); } - if (!pi->ai.nodisplay && pi->item) { + if (!pi->ai.nodisplay && pi->ai.enabled && pi->item) { if (!item_is_enabled_progress(pi->item)) { item_enable_progress(pi->item); } @@ -562,13 +616,12 @@ static menu_screen_error_e _end_unknown(const char *package, struct package_info // 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 || - pi->status == UPDATE_BEGIN || pi->status == UPDATING || pi->status == UPDATE_END + pi->status == DOWNLOAD_BEGIN || pi->status == DOWNLOADING || pi->status == DOWNLOAD_END ) { if (pi->page) { page_unpack_item(pi->page, pi->item); - page_trim_items(pi->page); + page_scroller_trim_items(scroller); } else { _D("Page is not valid (%s)", package); } @@ -635,6 +688,10 @@ static menu_screen_error_e _end(const char *package, const char *val, void *scro 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); } @@ -732,7 +789,7 @@ static menu_screen_error_e _pkgmgr_cb(int req_id, const char *pkg_type, const ch -menu_screen_error_e pkgmgr_init(Evas_Object *scroller) +HAPI menu_screen_error_e pkgmgr_init(Evas_Object *scroller) { if (NULL != pkg_mgr_info.listen_pc) { return MENU_SCREEN_ERROR_OK; @@ -748,7 +805,7 @@ menu_screen_error_e pkgmgr_init(Evas_Object *scroller) -void pkgmgr_fini(void) +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) { @@ -759,7 +816,7 @@ void pkgmgr_fini(void) -Evas_Object *pkgmgr_find_pended_object(const char *package, int with_desktop_file, Evas_Object *scroller, Evas_Object **page) +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; diff --git a/src/popup.c b/src/popup.c index c83e305..af27631 100644 --- a/src/popup.c +++ b/src/popup.c @@ -39,7 +39,7 @@ static void _response_cb(void *data, Evas_Object *obj, void *event_info) -Evas_Object *popup_create(Evas_Object *parent, const char *warning) +HAPI Evas_Object *popup_create(Evas_Object *parent, const char *warning) { Evas_Object *popup; Evas_Object *btn; @@ -70,5 +70,83 @@ Evas_Object *popup_create(Evas_Object *parent, const char *warning) } +static void _uninstall_yes_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *popup; + Evas_Object *item; + + ret_if(NULL == data); + + popup = data; + 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); + + if (MENU_SCREEN_ERROR_OK != pkgmgr_uninstall(item)) { + _E("Cannot communicate with the pkgmgr-server."); + } +} + + + +static void _uninstall_no_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *popup; + + ret_if(NULL == data); + popup = data; + 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); +} + + + +HAPI Evas_Object *popup_create_uninstall(Evas_Object *parent, Evas_Object *item) +{ + Evas_Object *popup; + Evas_Object *btn1; + Evas_Object *btn2; + char warning[BUFSZE]; + + retv_if(NULL == warning, NULL); + + 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_text_set(btn1, D_("IDS_COM_SK_YES")); + evas_object_data_set(popup, "button1", btn1); + elm_object_part_content_set(popup, "button1", btn1); + evas_object_smart_callback_add(btn1, "clicked", _uninstall_yes_cb, popup); + + btn2 = elm_button_add(popup); + if (NULL == btn2) { + evas_object_del(popup); + return NULL; + } + elm_object_text_set(btn2, D_("IDS_COM_SK_NO")); + evas_object_data_set(popup, "button2", btn2); + elm_object_part_content_set(popup, "button2", btn2); + evas_object_smart_callback_add(btn2, "clicked", _uninstall_no_cb, popup); + + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + snprintf(warning, sizeof(warning), _("Uninstall %s?"), item_get_name(item)); + elm_object_text_set(popup, warning); + evas_object_show(popup); + + return popup; +} + + // End of a file diff --git a/src/util.c b/src/util.c index 7ec1f36..281b53c 100644 --- a/src/util.c +++ b/src/util.c @@ -22,7 +22,7 @@ -void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +HAPI void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Coord x; Evas_Coord y; @@ -35,14 +35,14 @@ void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_i -void _evas_object_event_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +HAPI void _evas_object_event_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { _D("%s IS REMOVED!", (const char *) data); } -void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +HAPI void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Coord x; Evas_Coord y; @@ -55,7 +55,7 @@ void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *eve -void _evas_object_event_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +HAPI void _evas_object_event_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Coord x; Evas_Coord y;