From cfab5ec1a32a0e77e71420cf4e7025dda4963800 Mon Sep 17 00:00:00 2001 From: Jinkun Jang Date: Sat, 16 Mar 2013 01:04:10 +0900 Subject: [PATCH] merge with master --- CMakeLists.txt | 3 + data/CMakeLists.txt | 1 + data/edje/CMakeLists.txt | 10 + data/edje/all_apps_portrait.edc | 50 ++-- data/edje/button_edit.edc | 277 ++++++++++++++++++ data/edje/item_4x4.edc | 161 +++++++++- data/edje/pagecontrol.edc | 155 ---------- 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/default.png | Bin 0 -> 17581 bytes data/images/menu_badge_01.png | Bin 0 -> 1414 bytes data/org.tizen.menu-screen.xml.in | 2 +- debian/changelog | 36 +++ debian/control | 4 +- include/item.h | 7 + include/item_badge.h | 35 +++ include/list.h | 1 + include/page_scroller.h | 4 + include/popup.h | 1 + include/util.h | 12 +- packaging/org.tizen.menu-screen.spec | 30 +- src/all_apps/layout.c | 186 +++++++++++- src/all_apps/list.c | 4 +- src/index.c | 12 +- src/item.c | 179 ++++++++--- src/item_badge.c | 180 ++++++++++++ src/item_event.c | 58 +++- src/layout.c | 12 +- src/list.c | 44 ++- src/mapbuf.c | 16 +- src/menu_screen.c | 18 +- src/mouse.c | 6 +- src/page.c | 30 +- src/page_scroller.c | 186 ++++++++++-- src/pkgmgr.c | 95 ++++-- src/popup.c | 80 ++++- src/util.c | 8 +- 42 files changed, 1557 insertions(+), 347 deletions(-) create mode 100644 data/edje/button_edit.edc delete mode 100644 data/edje/pagecontrol.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/default.png create mode 100644 data/images/menu_badge_01.png create mode 100644 include/item_badge.h create mode 100644 src/item_badge.c 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 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/default.png b/data/images/default.png new file mode 100644 index 0000000000000000000000000000000000000000..983c883493a0ae561b9592d54ea8204042b4b6fb GIT binary patch literal 17581 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 U9b!e3T>t<807*qoM6N<$f~Z@#n*aa+ literal 0 HcmV?d00001 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; -- 2.34.1