From 339eab3ada8582d1b6ff443f4518412a7e5ba158 Mon Sep 17 00:00:00 2001 From: JuWan Kim Date: Thu, 29 Jan 2015 15:32:02 +0900 Subject: [PATCH 2/6] Base code / protex done / build check done (32/64bit) Change-Id: Ie572ec19fc5afdad3c7018201036b71bd43193c8 Signed-off-by: JuWan Kim --- CMakeLists.txt | 129 + LICENSE | 204 ++ data/CMakeLists.txt | 17 + data/images/allbrowser_menu_bg.png | Bin 0 -> 17782 bytes data/images/btn_down.png | Bin 0 -> 17853 bytes data/images/btn_text_foc.png | Bin 0 -> 17864 bytes data/images/btn_text_nor.png | Bin 0 -> 17860 bytes data/images/btn_up.png | Bin 0 -> 17851 bytes data/images/checkbox_check_foc.png | Bin 0 -> 18058 bytes data/images/checkbox_check_nor.png | Bin 0 -> 18051 bytes data/images/checkbox_uncheck_foc.png | Bin 0 -> 17866 bytes data/images/checkbox_uncheck_nor.png | Bin 0 -> 17882 bytes data/images/ico_arrow_down.png | Bin 0 -> 15473 bytes data/images/ico_arrow_up.png | Bin 0 -> 15473 bytes data/images/ico_hyperlink_arrow.png | Bin 0 -> 15115 bytes data/images/ico_settings.png | Bin 0 -> 21525 bytes data/images/ico_settings_channel.png | Bin 0 -> 18483 bytes data/images/ico_settings_device.png | Bin 0 -> 17841 bytes data/images/ico_settings_network.png | Bin 0 -> 18793 bytes data/images/ico_settings_picture.png | Bin 0 -> 18088 bytes data/images/ico_settings_sound.png | Bin 0 -> 18239 bytes data/images/ico_settings_support.png | Bin 0 -> 18628 bytes data/images/ico_settings_system.png | Bin 0 -> 18371 bytes data/images/ico_spincontrol_check.png | Bin 0 -> 18264 bytes data/images/input_box_highlight.png | Bin 0 -> 10237 bytes data/images/input_box_nor.png | Bin 0 -> 4567 bytes data/images/list_highlight.png | Bin 0 -> 9239 bytes data/images/listview_menu_bg.png | Bin 0 -> 18418 bytes data/images/modal_dialogs_bg.png | Bin 0 -> 18657 bytes data/images/progress_wheel.png | Bin 0 -> 18939 bytes data/images/radiobtn_br_off_nor.png | Bin 0 -> 18307 bytes data/images/radiobtn_on_foc.png | Bin 0 -> 18282 bytes data/images/round_rectangle_4X4.png | Bin 0 -> 18179 bytes data/images/round_rectangle_8X8_top.png | Bin 0 -> 17774 bytes data/images/scrollbar_horizontal.png | Bin 0 -> 17735 bytes data/images/scrollbar_vertical.png | Bin 0 -> 17745 bytes data/images/search_searchbar_bg_foc.png | Bin 0 -> 17789 bytes data/images/search_searchbar_bg_nor.png | Bin 0 -> 17740 bytes data/images/search_searchbar_small_bg_foc.png | Bin 0 -> 17688 bytes data/images/search_searchbar_small_bg_nor.png | Bin 0 -> 17688 bytes data/images/second_depth_bg.png | Bin 0 -> 22286 bytes data/images/setting_highlight.png | Bin 0 -> 5209 bytes data/images/setting_list_dot.png | Bin 0 -> 2869 bytes data/images/setting_list_dot_s.png | Bin 0 -> 2899 bytes data/images/settings_bg.png | Bin 0 -> 117649 bytes data/images/settings_bg_shadow.png | Bin 0 -> 17691 bytes data/images/slider_thumb.png | Bin 0 -> 18869 bytes data/images/tooltip_arrow.png | Bin 0 -> 17852 bytes data/images/tooltip_bg.png | Bin 0 -> 17912 bytes data/org.tizen.settings-tv-ref-theme.edc | 23 + data/org.tizen.settings-tv-ref.edc | 177 ++ data/viewer/change_passcode.edc | 413 +++ data/viewer/icon.edc | 421 ++++ data/viewer/maincatalog.edc | 292 +++ data/viewer/sublist.edc | 36 + data/widget/button.edc | 1718 +++++++++++++ data/widget/ctxpopup.edc | 268 ++ data/widget/progressbar.edc | 357 +++ data/widget/scroller.edc | 430 ++++ include/data_wrapper.h | 81 + include/dbg.h | 40 + include/def.h | 288 +++ include/json_marco.h | 73 + include/parser.h | 57 + include/settings_provider.h | 32 + include/timeout_handler.h | 31 + include/utils.h | 38 + include/view_bottomslider.h | 24 + include/view_bottomsublist.h | 24 + include/view_device_manager.h | 24 + include/view_maincatalog.h | 24 + include/view_need_pwd.h | 24 + include/view_pwd_popup.h | 24 + include/view_resetpopup.h | 24 + include/view_sublist.h | 24 + include/view_system_clock.h | 24 + include/view_uigadget.h | 24 + include/view_upgrade_popup.h | 45 + include/viewmgr.h | 95 + json/channel-lock.json | 33 + json/channel.json | 41 + json/clock.json | 20 + json/device-manager.json | 20 + json/helper.json | 35 + json/maincatalog.json | 53 + json/network.json | 35 + json/picture.json | 241 ++ json/sound.json | 68 + json/support.json | 20 + json/system.json | 189 ++ log.txt | 211 ++ org.tizen.settings-tv-ref.manifest | 8 + org.tizen.settings-tv-ref.png | Bin 0 -> 21525 bytes org.tizen.settings-tv-ref.xml.in | 10 + org.tizen.settings-tv-ref_4x2.png | Bin 0 -> 89073 bytes packaging/org.tizen.settings-tv-ref.spec | 159 ++ po/CMakeLists.txt | 37 + po/POTFILES.in | 2 + po/org.tizen.settings.pot | 22 + po/update-po.sh | 59 + src/data_wrapper.c | 1554 ++++++++++++ src/main.c | 326 +++ src/parser.c | 617 +++++ src/settings_provider.c | 914 +++++++ src/timeout_handler.c | 192 ++ src/utils.c | 382 +++ src/view_bottomslider.c | 89 + src/view_bottomsublist.c | 89 + src/view_device_manager.c | 59 + src/view_maincatalog.c | 2110 ++++++++++++++++ src/view_need_pwd.c | 758 ++++++ src/view_pwd_popup.c | 902 +++++++ src/view_resetpopup.c | 89 + src/view_sublist.c | 777 ++++++ src/view_system_clock.c | 776 ++++++ src/view_uigadget.c | 353 +++ src/view_upgrade_popup.c | 51 + src/viewmgr.c | 812 ++++++ ug/channel/CMakeLists.txt | 75 + ug/channel/edje/CMakeLists.txt | 14 + ug/channel/edje/images/btn_text_foc.png | Bin 0 -> 17864 bytes ug/channel/edje/images/btn_text_nor.png | Bin 0 -> 17860 bytes ug/channel/edje/images/list_highlight.png | Bin 0 -> 9239 bytes ug/channel/edje/images/radiobtn_off_br.png | Bin 0 -> 18295 bytes ug/channel/edje/images/radiobtn_off_dark.png | Bin 0 -> 18125 bytes ug/channel/edje/images/radiobtn_on_br.png | Bin 0 -> 18488 bytes ug/channel/edje/images/radiobtn_on_dark.png | Bin 0 -> 18330 bytes ug/channel/edje/images/round_rectangle_4X4.png | Bin 0 -> 18179 bytes ug/channel/edje/images/second_depth_bg.png | Bin 0 -> 22286 bytes .../edje/images/thumbnail_highlight_glowrect.png | Bin 0 -> 11341 bytes ug/channel/edje/images/wi_progress_bar.png | Bin 0 -> 3171 bytes ug/channel/edje/images/wi_progress_bg.png | Bin 0 -> 3537 bytes ug/channel/edje/tizen-hd-inc.edc | 1093 ++++++++ ug/channel/edje/ug_auto_program.edc | 735 ++++++ ug/channel/edje/ug_auto_program_theme.edc | 25 + ug/channel/edje/widgets/button.edc | 510 ++++ ug/channel/edje/widgets/progressbar.edc | 202 ++ ug/channel/include/dbg.h | 36 + ug/channel/include/defs.h | 97 + ug/channel/include/tv_scan.h | 65 + ug/channel/include/ug_auto_program.h | 32 + ug/channel/include/util.h | 29 + ug/channel/include/view_result_page.h | 24 + ug/channel/include/view_scan_start.h | 25 + ug/channel/include/view_search_page.h | 25 + ug/channel/include/viewmgr_auto_program.h | 46 + ug/channel/src/tv_scan.c | 669 +++++ ug/channel/src/ug_auto_program.c | 273 ++ ug/channel/src/util.c | 242 ++ ug/channel/src/view_result_page.c | 241 ++ ug/channel/src/view_scan_start.c | 696 ++++++ ug/channel/src/view_search_page.c | 616 +++++ ug/channel/src/viewmgr_auto_program.c | 280 +++ ug/network/CMakeLists.txt | 75 + ug/network/edje/CMakeLists.txt | 14 + ug/network/edje/images/btn_down.png | Bin 0 -> 17853 bytes ug/network/edje/images/btn_focused.png | Bin 0 -> 275 bytes ug/network/edje/images/btn_normal.png | Bin 0 -> 4033 bytes ug/network/edje/images/btn_up.png | Bin 0 -> 17851 bytes ug/network/edje/images/check_foc.png | Bin 0 -> 18316 bytes ug/network/edje/images/check_nor.png | Bin 0 -> 18363 bytes ug/network/edje/images/ico_dropdown_menu_check.png | Bin 0 -> 17850 bytes ug/network/edje/images/ico_spincontrol_check.png | Bin 0 -> 18264 bytes ug/network/edje/images/ico_spincontrol_down.png | Bin 0 -> 17890 bytes ug/network/edje/images/ico_spincontrol_up.png | Bin 0 -> 17871 bytes ug/network/edje/images/ico_wifi.png | Bin 0 -> 18239 bytes ug/network/edje/images/ico_wifi_lock.png | Bin 0 -> 18310 bytes ug/network/edje/images/modal_dialogs_bg.png | Bin 0 -> 18657 bytes ug/network/edje/images/progress_wheel.png | Bin 0 -> 18939 bytes ug/network/edje/images/radiobtn_br_off_nor.png | Bin 0 -> 18307 bytes ug/network/edje/images/radiobtn_off_foc.png | Bin 0 -> 18125 bytes ug/network/edje/images/radiobtn_off_nor.png | Bin 0 -> 18295 bytes ug/network/edje/images/radiobtn_on_foc.png | Bin 0 -> 18282 bytes ug/network/edje/images/radiobtn_on_nor.png | Bin 0 -> 18195 bytes ug/network/edje/images/round_rectangle_4X4.png | Bin 0 -> 18179 bytes .../edje/images/round_rectangle_4X4_bottom.png | Bin 0 -> 17711 bytes ug/network/edje/images/round_rectangle_4X4_top.png | Bin 0 -> 17710 bytes ug/network/edje/images/round_rectangle_8X8_top.png | Bin 0 -> 17774 bytes ug/network/edje/images/second_depth_bg.png | Bin 0 -> 22286 bytes ug/network/edje/images/setting_ico_no_network.png | Bin 0 -> 20127 bytes .../edje/images/setting_ico_no_network.png.png | Bin 0 -> 20127 bytes .../edje/images/setting_ico_plug_network_Cable.png | Bin 0 -> 19103 bytes ug/network/edje/images/sub_popup_bg.png | Bin 0 -> 3615 bytes ug/network/edje/ug-network-settings-theme.edc | 22 + ug/network/edje/ug-network-settings.edc | 1809 ++++++++++++++ ug/network/edje/widgets/button.edc | 2023 +++++++++++++++ ug/network/edje/widgets/genlist.edc | 825 ++++++ ug/network/include/common.h | 53 + ug/network/include/connection_mgr.h | 57 + ug/network/include/dbg.h | 40 + ug/network/include/defs.h | 159 ++ ug/network/include/i18n.h | 35 + ug/network/include/ip_setting_view.h | 25 + ug/network/include/main_view.h | 28 + ug/network/include/network_viewmgr.h | 61 + ug/network/include/util.h | 35 + ug/network/include/vconf_mgr.h | 39 + ug/network/include/wifi_mgr.h | 69 + ug/network/include/wifi_passcode_view.h | 28 + ug/network/src/connection_mgr.c | 651 +++++ ug/network/src/ip_setting_view.c | 2640 ++++++++++++++++++++ ug/network/src/main_view.c | 2552 +++++++++++++++++++ ug/network/src/network_viewmgr.c | 260 ++ ug/network/src/ug_network_settings.c | 301 +++ ug/network/src/util.c | 360 +++ ug/network/src/vconf_mgr.c | 404 +++ ug/network/src/wifi_mgr.c | 615 +++++ ug/network/src/wifi_passcode_view.c | 973 ++++++++ ug/proxy/CMakeLists.txt | 72 + ug/proxy/edje/CMakeLists.txt | 14 + ug/proxy/edje/images/ico_dropdown_menu_check.png | Bin 0 -> 17850 bytes ug/proxy/edje/images/ico_spincontrol_down.png | Bin 0 -> 17890 bytes ug/proxy/edje/images/ico_spincontrol_up.png | Bin 0 -> 17871 bytes ug/proxy/edje/images/modal_dialogs_bg.png | Bin 0 -> 18657 bytes ug/proxy/edje/images/round_rectangle_4X4.png | Bin 0 -> 18179 bytes ug/proxy/edje/images/round_rectangle_8X8_top.png | Bin 0 -> 17774 bytes ug/proxy/edje/ug-proxy-settings-theme.edc | 21 + ug/proxy/edje/ug-proxy-settings.edc | 711 ++++++ ug/proxy/edje/widgets/button.edc | 1407 +++++++++++ ug/proxy/include/common.h | 35 + ug/proxy/include/connection_mgr.h | 37 + ug/proxy/include/dbg.h | 40 + ug/proxy/include/defs.h | 116 + ug/proxy/include/i18n.h | 35 + ug/proxy/include/main_view.h | 25 + ug/proxy/include/util.h | 32 + ug/proxy/include/vconf_mgr.h | 28 + ug/proxy/include/wifi_mgr.h | 31 + ug/proxy/src/connection_mgr.c | 370 +++ ug/proxy/src/main_view.c | 2069 +++++++++++++++ ug/proxy/src/ug_proxy_settings.c | 287 +++ ug/proxy/src/util.c | 274 ++ ug/proxy/src/vconf_mgr.c | 111 + ug/proxy/src/wifi_mgr.c | 287 +++ ug/system/clock/CMakeLists.txt | 66 + ug/system/clock/edje/CMakeLists.txt | 17 + .../clock/edje/images/ico_dropdown_menu_check.png | Bin 0 -> 17850 bytes .../clock/edje/images/round_rectangle_4X4.png | Bin 0 -> 18179 bytes ug/system/clock/edje/images/second_depth_bg.png | Bin 0 -> 22286 bytes .../clock/edje/images/spincontrol_arrow_down.png | Bin 0 -> 17900 bytes .../clock/edje/images/spincontrol_arrow_up.png | Bin 0 -> 17881 bytes ug/system/clock/edje/ug_clock.edc | 789 ++++++ ug/system/clock/edje/ug_clock_theme.edc | 21 + ug/system/clock/edje/widgets/button.edc | 1550 ++++++++++++ ug/system/clock/include/dbg.h | 33 + ug/system/clock/include/ug_clock.h | 24 + ug/system/clock/include/ug_clock_define.h | 101 + ug/system/clock/include/ug_clock_spin_control.h | 26 + ug/system/clock/include/ug_clock_sublist.h | 24 + .../clock/include/ug_clock_time_spin_control.h | 25 + ug/system/clock/include/ug_clock_utils.h | 65 + ug/system/clock/src/ug_clock.c | 1188 +++++++++ ug/system/clock/src/ug_clock_spin_control.c | 797 ++++++ ug/system/clock/src/ug_clock_sublist.c | 517 ++++ ug/system/clock/src/ug_clock_time_spin_control.c | 842 +++++++ ug/system/clock/src/ug_clock_utils.c | 340 +++ ug/wifi-direct/CMakeLists.txt | 72 + ug/wifi-direct/edje/CMakeLists.txt | 14 + .../edje/images/ico_dropdown_menu_check.png | Bin 0 -> 17850 bytes ug/wifi-direct/edje/images/loading_96_01.png | Bin 0 -> 14922 bytes ug/wifi-direct/edje/images/loading_96_02.png | Bin 0 -> 14977 bytes ug/wifi-direct/edje/images/loading_96_03.png | Bin 0 -> 15099 bytes ug/wifi-direct/edje/images/loading_96_04.png | Bin 0 -> 15112 bytes ug/wifi-direct/edje/images/loading_96_05.png | Bin 0 -> 15010 bytes ug/wifi-direct/edje/images/loading_96_06.png | Bin 0 -> 14824 bytes ug/wifi-direct/edje/images/loading_96_07.png | Bin 0 -> 14980 bytes ug/wifi-direct/edje/images/loading_96_08.png | Bin 0 -> 15089 bytes ug/wifi-direct/edje/images/loading_96_09.png | Bin 0 -> 15054 bytes ug/wifi-direct/edje/images/loading_96_10.png | Bin 0 -> 14752 bytes ug/wifi-direct/edje/images/loading_96_11.png | Bin 0 -> 14882 bytes ug/wifi-direct/edje/images/loading_96_12.png | Bin 0 -> 14976 bytes ug/wifi-direct/edje/images/loading_96_13.png | Bin 0 -> 15052 bytes ug/wifi-direct/edje/images/loading_96_14.png | Bin 0 -> 14991 bytes ug/wifi-direct/edje/images/loading_96_15.png | Bin 0 -> 14803 bytes ug/wifi-direct/edje/images/loading_96_16.png | Bin 0 -> 14991 bytes ug/wifi-direct/edje/images/loading_96_17.png | Bin 0 -> 15112 bytes ug/wifi-direct/edje/images/loading_96_18.png | Bin 0 -> 15135 bytes ug/wifi-direct/edje/images/round_rectangle_4X4.png | Bin 0 -> 18179 bytes ug/wifi-direct/edje/images/second_depth_bg.png | Bin 0 -> 22286 bytes ug/wifi-direct/edje/ug-wifi-direct-theme.edc | 23 + ug/wifi-direct/edje/ug-wifi-direct.edc | 629 +++++ ug/wifi-direct/edje/widgets/button.edc | 598 +++++ ug/wifi-direct/edje/widgets/genlist.edc | 165 ++ ug/wifi-direct/edje/widgets/progressbar.edc | 90 + ug/wifi-direct/include/dbg.h | 38 + ug/wifi-direct/include/defs.h | 112 + ug/wifi-direct/include/i18n.h | 35 + ug/wifi-direct/include/util.h | 29 + ug/wifi-direct/include/wifi_direct_mgr.h | 81 + ug/wifi-direct/include/wifi_direct_view.h | 25 + ug/wifi-direct/src/ug_wifi_direct.c | 242 ++ ug/wifi-direct/src/util.c | 206 ++ ug/wifi-direct/src/wifi_direct_mgr.c | 613 +++++ ug/wifi-direct/src/wifi_direct_view.c | 2038 +++++++++++++++ 294 files changed, 55258 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 data/CMakeLists.txt create mode 100644 data/images/allbrowser_menu_bg.png create mode 100644 data/images/btn_down.png create mode 100644 data/images/btn_text_foc.png create mode 100644 data/images/btn_text_nor.png create mode 100644 data/images/btn_up.png create mode 100644 data/images/checkbox_check_foc.png create mode 100644 data/images/checkbox_check_nor.png create mode 100644 data/images/checkbox_uncheck_foc.png create mode 100644 data/images/checkbox_uncheck_nor.png create mode 100644 data/images/ico_arrow_down.png create mode 100644 data/images/ico_arrow_up.png create mode 100644 data/images/ico_hyperlink_arrow.png create mode 100644 data/images/ico_settings.png create mode 100644 data/images/ico_settings_channel.png create mode 100644 data/images/ico_settings_device.png create mode 100644 data/images/ico_settings_network.png create mode 100644 data/images/ico_settings_picture.png create mode 100644 data/images/ico_settings_sound.png create mode 100644 data/images/ico_settings_support.png create mode 100644 data/images/ico_settings_system.png create mode 100644 data/images/ico_spincontrol_check.png create mode 100644 data/images/input_box_highlight.png create mode 100644 data/images/input_box_nor.png create mode 100644 data/images/list_highlight.png create mode 100644 data/images/listview_menu_bg.png create mode 100644 data/images/modal_dialogs_bg.png create mode 100644 data/images/progress_wheel.png create mode 100644 data/images/radiobtn_br_off_nor.png create mode 100644 data/images/radiobtn_on_foc.png create mode 100644 data/images/round_rectangle_4X4.png create mode 100644 data/images/round_rectangle_8X8_top.png create mode 100644 data/images/scrollbar_horizontal.png create mode 100644 data/images/scrollbar_vertical.png create mode 100644 data/images/search_searchbar_bg_foc.png create mode 100644 data/images/search_searchbar_bg_nor.png create mode 100644 data/images/search_searchbar_small_bg_foc.png create mode 100644 data/images/search_searchbar_small_bg_nor.png create mode 100644 data/images/second_depth_bg.png create mode 100644 data/images/setting_highlight.png create mode 100644 data/images/setting_list_dot.png create mode 100644 data/images/setting_list_dot_s.png create mode 100644 data/images/settings_bg.png create mode 100644 data/images/settings_bg_shadow.png create mode 100644 data/images/slider_thumb.png create mode 100644 data/images/tooltip_arrow.png create mode 100644 data/images/tooltip_bg.png create mode 100644 data/org.tizen.settings-tv-ref-theme.edc create mode 100644 data/org.tizen.settings-tv-ref.edc create mode 100644 data/viewer/change_passcode.edc create mode 100644 data/viewer/icon.edc create mode 100755 data/viewer/maincatalog.edc create mode 100644 data/viewer/sublist.edc create mode 100644 data/widget/button.edc create mode 100644 data/widget/ctxpopup.edc create mode 100644 data/widget/progressbar.edc create mode 100644 data/widget/scroller.edc create mode 100644 include/data_wrapper.h create mode 100644 include/dbg.h create mode 100644 include/def.h create mode 100644 include/json_marco.h create mode 100644 include/parser.h create mode 100644 include/settings_provider.h create mode 100644 include/timeout_handler.h create mode 100644 include/utils.h create mode 100644 include/view_bottomslider.h create mode 100644 include/view_bottomsublist.h create mode 100644 include/view_device_manager.h create mode 100644 include/view_maincatalog.h create mode 100644 include/view_need_pwd.h create mode 100644 include/view_pwd_popup.h create mode 100644 include/view_resetpopup.h create mode 100644 include/view_sublist.h create mode 100644 include/view_system_clock.h create mode 100644 include/view_uigadget.h create mode 100644 include/view_upgrade_popup.h create mode 100644 include/viewmgr.h create mode 100644 json/channel-lock.json create mode 100644 json/channel.json create mode 100644 json/clock.json create mode 100644 json/device-manager.json create mode 100644 json/helper.json create mode 100644 json/maincatalog.json create mode 100644 json/network.json create mode 100644 json/picture.json create mode 100644 json/sound.json create mode 100644 json/support.json create mode 100644 json/system.json create mode 100644 log.txt create mode 100755 org.tizen.settings-tv-ref.manifest create mode 100644 org.tizen.settings-tv-ref.png create mode 100644 org.tizen.settings-tv-ref.xml.in create mode 100644 org.tizen.settings-tv-ref_4x2.png create mode 100644 packaging/org.tizen.settings-tv-ref.spec create mode 100644 po/CMakeLists.txt create mode 100644 po/POTFILES.in create mode 100644 po/org.tizen.settings.pot create mode 100644 po/update-po.sh create mode 100644 src/data_wrapper.c create mode 100644 src/main.c create mode 100644 src/parser.c create mode 100644 src/settings_provider.c create mode 100644 src/timeout_handler.c create mode 100644 src/utils.c create mode 100644 src/view_bottomslider.c create mode 100644 src/view_bottomsublist.c create mode 100644 src/view_device_manager.c create mode 100644 src/view_maincatalog.c create mode 100644 src/view_need_pwd.c create mode 100644 src/view_pwd_popup.c create mode 100644 src/view_resetpopup.c create mode 100644 src/view_sublist.c create mode 100644 src/view_system_clock.c create mode 100644 src/view_uigadget.c create mode 100644 src/view_upgrade_popup.c create mode 100644 src/viewmgr.c create mode 100644 ug/channel/CMakeLists.txt create mode 100644 ug/channel/edje/CMakeLists.txt create mode 100644 ug/channel/edje/images/btn_text_foc.png create mode 100644 ug/channel/edje/images/btn_text_nor.png create mode 100644 ug/channel/edje/images/list_highlight.png create mode 100644 ug/channel/edje/images/radiobtn_off_br.png create mode 100644 ug/channel/edje/images/radiobtn_off_dark.png create mode 100644 ug/channel/edje/images/radiobtn_on_br.png create mode 100644 ug/channel/edje/images/radiobtn_on_dark.png create mode 100644 ug/channel/edje/images/round_rectangle_4X4.png create mode 100644 ug/channel/edje/images/second_depth_bg.png create mode 100644 ug/channel/edje/images/thumbnail_highlight_glowrect.png create mode 100644 ug/channel/edje/images/wi_progress_bar.png create mode 100644 ug/channel/edje/images/wi_progress_bg.png create mode 100644 ug/channel/edje/tizen-hd-inc.edc create mode 100644 ug/channel/edje/ug_auto_program.edc create mode 100644 ug/channel/edje/ug_auto_program_theme.edc create mode 100644 ug/channel/edje/widgets/button.edc create mode 100644 ug/channel/edje/widgets/progressbar.edc create mode 100644 ug/channel/include/dbg.h create mode 100644 ug/channel/include/defs.h create mode 100644 ug/channel/include/tv_scan.h create mode 100644 ug/channel/include/ug_auto_program.h create mode 100644 ug/channel/include/util.h create mode 100644 ug/channel/include/view_result_page.h create mode 100644 ug/channel/include/view_scan_start.h create mode 100644 ug/channel/include/view_search_page.h create mode 100644 ug/channel/include/viewmgr_auto_program.h create mode 100644 ug/channel/src/tv_scan.c create mode 100644 ug/channel/src/ug_auto_program.c create mode 100644 ug/channel/src/util.c create mode 100644 ug/channel/src/view_result_page.c create mode 100644 ug/channel/src/view_scan_start.c create mode 100644 ug/channel/src/view_search_page.c create mode 100644 ug/channel/src/viewmgr_auto_program.c create mode 100644 ug/network/CMakeLists.txt create mode 100644 ug/network/edje/CMakeLists.txt create mode 100644 ug/network/edje/images/btn_down.png create mode 100644 ug/network/edje/images/btn_focused.png create mode 100644 ug/network/edje/images/btn_normal.png create mode 100644 ug/network/edje/images/btn_up.png create mode 100644 ug/network/edje/images/check_foc.png create mode 100644 ug/network/edje/images/check_nor.png create mode 100644 ug/network/edje/images/ico_dropdown_menu_check.png create mode 100644 ug/network/edje/images/ico_spincontrol_check.png create mode 100644 ug/network/edje/images/ico_spincontrol_down.png create mode 100644 ug/network/edje/images/ico_spincontrol_up.png create mode 100644 ug/network/edje/images/ico_wifi.png create mode 100644 ug/network/edje/images/ico_wifi_lock.png create mode 100644 ug/network/edje/images/modal_dialogs_bg.png create mode 100644 ug/network/edje/images/progress_wheel.png create mode 100644 ug/network/edje/images/radiobtn_br_off_nor.png create mode 100644 ug/network/edje/images/radiobtn_off_foc.png create mode 100644 ug/network/edje/images/radiobtn_off_nor.png create mode 100644 ug/network/edje/images/radiobtn_on_foc.png create mode 100644 ug/network/edje/images/radiobtn_on_nor.png create mode 100644 ug/network/edje/images/round_rectangle_4X4.png create mode 100644 ug/network/edje/images/round_rectangle_4X4_bottom.png create mode 100644 ug/network/edje/images/round_rectangle_4X4_top.png create mode 100644 ug/network/edje/images/round_rectangle_8X8_top.png create mode 100644 ug/network/edje/images/second_depth_bg.png create mode 100644 ug/network/edje/images/setting_ico_no_network.png create mode 100644 ug/network/edje/images/setting_ico_no_network.png.png create mode 100644 ug/network/edje/images/setting_ico_plug_network_Cable.png create mode 100644 ug/network/edje/images/sub_popup_bg.png create mode 100644 ug/network/edje/ug-network-settings-theme.edc create mode 100644 ug/network/edje/ug-network-settings.edc create mode 100644 ug/network/edje/widgets/button.edc create mode 100644 ug/network/edje/widgets/genlist.edc create mode 100644 ug/network/include/common.h create mode 100644 ug/network/include/connection_mgr.h create mode 100644 ug/network/include/dbg.h create mode 100644 ug/network/include/defs.h create mode 100644 ug/network/include/i18n.h create mode 100644 ug/network/include/ip_setting_view.h create mode 100644 ug/network/include/main_view.h create mode 100644 ug/network/include/network_viewmgr.h create mode 100644 ug/network/include/util.h create mode 100644 ug/network/include/vconf_mgr.h create mode 100644 ug/network/include/wifi_mgr.h create mode 100644 ug/network/include/wifi_passcode_view.h create mode 100644 ug/network/src/connection_mgr.c create mode 100644 ug/network/src/ip_setting_view.c create mode 100644 ug/network/src/main_view.c create mode 100644 ug/network/src/network_viewmgr.c create mode 100644 ug/network/src/ug_network_settings.c create mode 100644 ug/network/src/util.c create mode 100644 ug/network/src/vconf_mgr.c create mode 100644 ug/network/src/wifi_mgr.c create mode 100644 ug/network/src/wifi_passcode_view.c create mode 100644 ug/proxy/CMakeLists.txt create mode 100644 ug/proxy/edje/CMakeLists.txt create mode 100644 ug/proxy/edje/images/ico_dropdown_menu_check.png create mode 100644 ug/proxy/edje/images/ico_spincontrol_down.png create mode 100644 ug/proxy/edje/images/ico_spincontrol_up.png create mode 100644 ug/proxy/edje/images/modal_dialogs_bg.png create mode 100644 ug/proxy/edje/images/round_rectangle_4X4.png create mode 100644 ug/proxy/edje/images/round_rectangle_8X8_top.png create mode 100644 ug/proxy/edje/ug-proxy-settings-theme.edc create mode 100644 ug/proxy/edje/ug-proxy-settings.edc create mode 100644 ug/proxy/edje/widgets/button.edc create mode 100644 ug/proxy/include/common.h create mode 100644 ug/proxy/include/connection_mgr.h create mode 100644 ug/proxy/include/dbg.h create mode 100644 ug/proxy/include/defs.h create mode 100644 ug/proxy/include/i18n.h create mode 100644 ug/proxy/include/main_view.h create mode 100644 ug/proxy/include/util.h create mode 100644 ug/proxy/include/vconf_mgr.h create mode 100644 ug/proxy/include/wifi_mgr.h create mode 100644 ug/proxy/src/connection_mgr.c create mode 100644 ug/proxy/src/main_view.c create mode 100644 ug/proxy/src/ug_proxy_settings.c create mode 100644 ug/proxy/src/util.c create mode 100644 ug/proxy/src/vconf_mgr.c create mode 100644 ug/proxy/src/wifi_mgr.c create mode 100755 ug/system/clock/CMakeLists.txt create mode 100755 ug/system/clock/edje/CMakeLists.txt create mode 100644 ug/system/clock/edje/images/ico_dropdown_menu_check.png create mode 100644 ug/system/clock/edje/images/round_rectangle_4X4.png create mode 100644 ug/system/clock/edje/images/second_depth_bg.png create mode 100644 ug/system/clock/edje/images/spincontrol_arrow_down.png create mode 100644 ug/system/clock/edje/images/spincontrol_arrow_up.png create mode 100755 ug/system/clock/edje/ug_clock.edc create mode 100755 ug/system/clock/edje/ug_clock_theme.edc create mode 100755 ug/system/clock/edje/widgets/button.edc create mode 100755 ug/system/clock/include/dbg.h create mode 100755 ug/system/clock/include/ug_clock.h create mode 100755 ug/system/clock/include/ug_clock_define.h create mode 100755 ug/system/clock/include/ug_clock_spin_control.h create mode 100755 ug/system/clock/include/ug_clock_sublist.h create mode 100755 ug/system/clock/include/ug_clock_time_spin_control.h create mode 100755 ug/system/clock/include/ug_clock_utils.h create mode 100755 ug/system/clock/src/ug_clock.c create mode 100644 ug/system/clock/src/ug_clock_spin_control.c create mode 100644 ug/system/clock/src/ug_clock_sublist.c create mode 100644 ug/system/clock/src/ug_clock_time_spin_control.c create mode 100755 ug/system/clock/src/ug_clock_utils.c create mode 100644 ug/wifi-direct/CMakeLists.txt create mode 100644 ug/wifi-direct/edje/CMakeLists.txt create mode 100644 ug/wifi-direct/edje/images/ico_dropdown_menu_check.png create mode 100644 ug/wifi-direct/edje/images/loading_96_01.png create mode 100644 ug/wifi-direct/edje/images/loading_96_02.png create mode 100644 ug/wifi-direct/edje/images/loading_96_03.png create mode 100644 ug/wifi-direct/edje/images/loading_96_04.png create mode 100644 ug/wifi-direct/edje/images/loading_96_05.png create mode 100644 ug/wifi-direct/edje/images/loading_96_06.png create mode 100644 ug/wifi-direct/edje/images/loading_96_07.png create mode 100644 ug/wifi-direct/edje/images/loading_96_08.png create mode 100644 ug/wifi-direct/edje/images/loading_96_09.png create mode 100644 ug/wifi-direct/edje/images/loading_96_10.png create mode 100644 ug/wifi-direct/edje/images/loading_96_11.png create mode 100644 ug/wifi-direct/edje/images/loading_96_12.png create mode 100644 ug/wifi-direct/edje/images/loading_96_13.png create mode 100644 ug/wifi-direct/edje/images/loading_96_14.png create mode 100644 ug/wifi-direct/edje/images/loading_96_15.png create mode 100644 ug/wifi-direct/edje/images/loading_96_16.png create mode 100644 ug/wifi-direct/edje/images/loading_96_17.png create mode 100644 ug/wifi-direct/edje/images/loading_96_18.png create mode 100644 ug/wifi-direct/edje/images/round_rectangle_4X4.png create mode 100644 ug/wifi-direct/edje/images/second_depth_bg.png create mode 100644 ug/wifi-direct/edje/ug-wifi-direct-theme.edc create mode 100644 ug/wifi-direct/edje/ug-wifi-direct.edc create mode 100644 ug/wifi-direct/edje/widgets/button.edc create mode 100644 ug/wifi-direct/edje/widgets/genlist.edc create mode 100644 ug/wifi-direct/edje/widgets/progressbar.edc create mode 100644 ug/wifi-direct/include/dbg.h create mode 100644 ug/wifi-direct/include/defs.h create mode 100644 ug/wifi-direct/include/i18n.h create mode 100644 ug/wifi-direct/include/util.h create mode 100644 ug/wifi-direct/include/wifi_direct_mgr.h create mode 100644 ug/wifi-direct/include/wifi_direct_view.h create mode 100644 ug/wifi-direct/src/ug_wifi_direct.c create mode 100644 ug/wifi-direct/src/util.c create mode 100644 ug/wifi-direct/src/wifi_direct_mgr.c create mode 100644 ug/wifi-direct/src/wifi_direct_view.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f58b1d2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,129 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(settings-tv-ref) + +INCLUDE(FindPkgConfig) +pkg_check_modules(HOMEPANEL_PKGS REQUIRED + capi-appfw-application + dlog + edje + elementary + ecore-x + evas + utilX + x11 + glib-2.0 + eina + aul + ui-gadget-1 + json-glib-1.0 + vconf + capi-network-wifi + capi-network-connection + capi-system-info + capi-media-sound-manager +) + #capi-system-tvtimer + #tv-service + #tv-player-core + +SET(PREFIX ${CMAKE_INSTALL_PREFIX}) + +IF(NOT DEFINED PACKAGE_NAME) + SET(PACKAGE_NAME "org.tizen.${PROJECT_NAME}") +ENDIF(NOT DEFINED PACKAGE_NAME) +IF(NOT DEFINED BINDIR) + SET(BINDIR "${PREFIX}/bin") +ENDIF(NOT DEFINED BINDIR) +IF(NOT DEFINED RESDIR) + SET(RESDIR "${PREFIX}/res") +ENDIF(NOT DEFINED RESDIR) +IF(NOT DEFINED IMAGEDIR) + SET(IMAGEDIR "${PREFIX}/res/images") +ENDIF(NOT DEFINED IMAGEDIR) +IF(NOT DEFINED EDJEDIR) + SET(EDJEDIR "${PREFIX}/res/edje") +ENDIF(NOT DEFINED EDJEDIR) +IF(NOT DEFINED LOCALEDIR) + SET(LOCALEDIR "${PREFIX}/res/locale") +ENDIF(NOT DEFINED LOCALEDIR) +IF(NOT DEFINED MANIFESTDIR) + SET(MANIFESTDIR "${PREFIX}/share/packages") +ENDIF(NOT DEFINED MANIFESTDIR) +IF(NOT DEFINED DESKTOP_ICONDIR) + SET(DESKTOP_ICONDIR "/usr/share/icons/default/small") +ENDIF(NOT DEFINED DESKTOP_ICONDIR) +IF(NOT DEFINED DESKTOP_ICON) + SET(DESKTOP_ICON ${PACKAGE_NAME}.png) +ENDIF(NOT DEFINED DESKTOP_ICON) +IF(NOT DEFINED JSONDIR) + SET(JSONDIR "${PREFIX}/res/json") +ENDIF(NOT DEFINED JSONDIR) +IF(NOT DEFINED UGLIBDIR) + SET(UGLIBDIR "/usr/ug/lib") +ENDIF(NOT DEFINED UGLIBDIR) + +SET(EDJ_FILE "org.tizen.settings-tv-ref.edj") +SET(EDJ_THEME "org.tizen.settings-tv-ref-theme.edj") + +ADD_DEFINITIONS("-DPROJECTNAME=\"${PROJECT_NAME}\"") +ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE_NAME}\"") +ADD_DEFINITIONS("-DIMAGEDIR=\"${IMAGEDIR}\"") +ADD_DEFINITIONS("-DEDJEDIR=\"${EDJEDIR}\"") +ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"") +ADD_DEFINITIONS("-DEDJ_FILE=\"${EDJEDIR}/${EDJ_FILE}\"") +ADD_DEFINITIONS("-DEDJ_THEME=\"${EDJEDIR}/${EDJ_THEME}\"") +ADD_DEFINITIONS("-DJSON_OUTPUT_DIR=\"${JSONOUTPUTDIR}\"") +ADD_DEFINITIONS("-DJSON_HELPER_FILE=\"${JSONHELPERFILE}\"") + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) + +ADD_EXECUTABLE(${PROJECT_NAME} + src/main.c + src/parser.c + src/data_wrapper.c + src/utils.c + src/viewmgr.c + src/view_maincatalog.c + src/view_uigadget.c + src/view_sublist.c + src/view_bottomsublist.c + src/view_bottomslider.c + src/settings_provider.c + src/view_pwd_popup.c + src/view_device_manager.c + src/view_resetpopup.c + src/view_upgrade_popup.c + src/view_system_clock.c + src/view_need_pwd.c + src/timeout_handler.c +) + +FOREACH (flag ${HOMEPANEL_PKGS_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") + +FOREACH (flag ${HOMEPANEL_PKGS_CFLAGS}) + SET(EXTRA_CXXFLAGS "${EXTRA_CFLAGS} ${flag}") +ENDFOREACH(flag) +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS}") + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${HOMEPANEL_PKGS_LDFLAGS}) + +CONFIGURE_FILE(${PACKAGE_NAME}.xml.in ${PACKAGE_NAME}.xml) + +# Install +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR}) +INSTALL(FILES ${PACKAGE_NAME}.xml DESTINATION ${MANIFESTDIR}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/${DESKTOP_ICON} DESTINATION ${DESKTOP_ICONDIR}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/${DESKTOP_ICON_4X2} DESTINATION ${DESKTOP_ICONDIR}) +#INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/data/images/ DESTINATION ${IMAGEDIR}) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/json DESTINATION ${RESDIR}) +ADD_SUBDIRECTORY(data) +#ADD_SUBDIRECTORY(po) +ADD_SUBDIRECTORY(ug/channel) +ADD_SUBDIRECTORY(ug/network) +ADD_SUBDIRECTORY(ug/proxy) +ADD_SUBDIRECTORY(ug/wifi-direct) +ADD_SUBDIRECTORY(ug/system/clock) +#ADD_SUBDIRECTORY(ug/system/wakeup_timer) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4474dd1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,204 @@ +Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt new file mode 100644 index 0000000..0f82f74 --- /dev/null +++ b/data/CMakeLists.txt @@ -0,0 +1,17 @@ +ADD_CUSTOM_TARGET(${PACKAGE_NAME}.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/images + ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}.edc ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} ${PACKAGE_NAME}.edj) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}.edj DESTINATION ${EDJEDIR}) + +ADD_CUSTOM_TARGET(${PACKAGE_NAME}-theme.edj + COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/images -sd ${CMAKE_CURRENT_SOURCE_DIR}/sounds + ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}-theme.edc ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}-theme.edj + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}-theme.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} ${PACKAGE_NAME}-theme.edj) + +INSTALL(FILES ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}-theme.edj DESTINATION ${EDJEDIR}) diff --git a/data/images/allbrowser_menu_bg.png b/data/images/allbrowser_menu_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..55a4ed88d0e55b5816adf2dea6d9644a90a3a3ac GIT binary patch literal 17782 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 literal 0 HcmV?d00001 diff --git a/data/images/btn_text_foc.png b/data/images/btn_text_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..c43ca3c388f629adf187ddfcef456af6f55157ee GIT binary patch literal 17864 zcmeI3cT`i^x5qDv^rli�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 literal 0 HcmV?d00001 diff --git a/data/images/btn_up.png b/data/images/btn_up.png new file mode 100644 index 0000000000000000000000000000000000000000..4609691a1fc2707bbb3f36278900da023b8e57a3 GIT binary patch literal 17851 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 literal 0 HcmV?d00001 diff --git a/data/images/checkbox_check_foc.png b/data/images/checkbox_check_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..3880414e6cc859b66368209b7f5a2fd3e1efab70 GIT binary patch literal 18058 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 literal 0 HcmV?d00001 diff --git a/data/images/checkbox_uncheck_foc.png b/data/images/checkbox_uncheck_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c57a3a03d0698119454e3185b3f41c2ee67691 GIT binary patch literal 17866 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 z zPH*E|#6&50HUy8Q$fFGq$)&9)CdHKa8ra!I3I{tgbM;hxGBOV zoDak+!UX{$+!Wyw&IjTZ;er4WZi;XT=L7MIa6y0wH$}LF^MQCpxFA4;n<8Ao`9QoP zTo53_O%X2Pd>~#CE(j3erU;jCJ`k@67X*lKQ-n)6ABb0k3j##ADZ(Y355z0N1py-5 z6yXxi2jUgsf&dY2if{?%1M!M*L4XK1MYx3Xfp|r@AV7qhB3#1xK)fPc5Fo-$5ia3; zAYKtJ2oT|>2$yg^5U&Uq1c-1`giAOdh*yLQ0z|ke!X=y!#4ExD0V3QK;S$aV;uYb7 z01<8q#U(xcq$iyXKHljEKF8STcyiBH{Ptjr88IfOCZr?>F!%D9~SIh zX37I%()`0nN1s$PW-ZxY=}A2BDPQ*Of@jp-wrI00j}M_0t(GVb88vK6t}UL+1zcbQ zm59)#Poi(130idVm+O4C)aKAnrZoYxqN7?%@_6T6R>H(*Ij!DMwK*|`quY3Ou5?U_ z&M~q4UQOlTy|32FQ5n}|6!p;G{Hf-WGYyu6w4t^JRq}GJ>v*vk01?DcS)4!1@M^@O z`Lq-@#aPuN05h#mo3u*P`K9};WbLGcu2KnLnG?Lh>#bfEIAXxo($ON%eEYtC15&@1 A6#xJL literal 0 HcmV?d00001 diff --git a/data/images/ico_arrow_down.png b/data/images/ico_arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..5b55a18d8b05507837c63554fc842afa06327a58 GIT binary patch literal 15473 zcmeI3e{d6J8pq$#;+57aQh##xOoR0&$tG!jE=iyy)mAT+X@d=%c-`#2X?B`q_p)1> z_U4?5rvk@x98eL8iXBf8IpG}ia89mO1`p>B90xh6a04Tb!X1bX;teS3yGfd)Z`=2J zqxXk1@6NQz^M2pw`|kUBpZCrFvnv)f-Cj{PvkU-G(b(W`MxQrnf29|p|Es>)5l0`> zt*NK8h-)ak(0AAl#jJC&Sxn|y#%y9NE`!<3 zS{$hUx0+GIrG(rDQu}cDY=P$--DH2Gql# zbSG3UWk@KqGA1KFeyH$CQC3AMq0@Z1u+*t~^m=We+?AbIT+R)YP_pb0MJC0`jM->n zCP)ed$Z7HTxS5JtzZBg`c4p%as06!Z$TUMm>P+&mekn|-v&Op#fzSEKoyl05kH9l9 z2IDA2K{sz6_ZH-+q)JLunqb~JdBWMNVkEyfqo$xK6Q;qGI6<1GWYW^5kXa!&sz273 zgq$iRgOU{UW~yw#$ldFFKHW{NVnUF*l$+fQ-aEh4c_ZlOROm&eXf>Fu28$zTcCxiD z)@HfYlzB)&=QftnW&S=n&#!1%0%;|6hj~$7ak> z4Wfcdr@Nq}P+_HynHKn~(XAswOiUjaGM7}KwhKM_k!_eeUvkHXmXqGiEXQjHjhEMI z6(Yc+TJyJ+%gm;UV;698lr#PX=@XC96@>{>!Dp<}y(TtMq=?$ZC1G7Vs)_%y4Ks$L zGjL}&qn*hy@&B*}3b*w8t-$2A(2sou^0muHxkNh@yv#`1jxe%XO_W$5WD_%`Q1IlH-rkv3 z^jwD?DVf|e<(QqHI~#wxYa9J_!PEyQpBQY~Wt#rh+ElOnc^aU(NA7Z{7J(-PPTf{A0WF*H7L4_jQkLoWGwRs=L9t&(-t@m&iJ7Hyk)w0LMv@2b~YkF0$e zy@KI9)mP;`!~D&p3ZY_@{@j>@D6kbK22{z2&ED# z!p5Dp@?W1@`$n6*=D8Ef<@FD*=WoB`Jv9k>oqb!^T;E-`OKwqm`WHT8tKMHzqyqI# zll$qt5nexVLOnmD{@sP%pB%k-Uir{Py-QBrcVpkNL$m)jLqG6&>g!E=PyIrjdf5fA zvTW$s;p4LN^{3zYM7nZM^A2m^;hp!MZtj=PO^KZtxZ;s}c2vSc6Rj)n!*@0K9Qcb0&2ZuMlaq{epsh@w_cm6tg_puJ}Mg2n+56%htw3mV#>zn*9 I&2L-w9Y+2eYybcN literal 0 HcmV?d00001 diff --git a/data/images/ico_arrow_up.png b/data/images/ico_arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..6286bcc020f26db0f884be2b841d839c9924829f GIT binary patch literal 15473 zcmeI3ZEzdK8OP5KIM~F-0pmchK@pP>Aky9G#nxRV1tZz9n@DwR;g{5Ha=JTP7fW|n z-Pw}eq~p4tHnfHb&Onov451E?iJ=2@hK6{i&`?4eO36!STo}@1Iw=%FCn9E~zw3&?|LB!N zF>otZ8#^_Exc(;NS3vyW@mmOjd0Pr~=pBI#EU(0@oS=k7Yci&S+63WVn^ZZzSJX{m zu}6|U=8KcBm`#%4F}FJdR6zBK5vg%7F18K^L;PSb&j{wV-V%3`1p#8B&Y6<2sI0L` zk2w{W1&7rNONe?z7@V0p|DT~}F>Oe7N4gx#vddq|pL7?QG)Hk$?1 zuxJCa&Lu6fc4s=sbR55^@o`DjB}FzFak;S4r+dt1qoM4T8COirHY95qc7P(8|PckE$vq3F1po(ORs40DMUaapIW&O^%IwA1cIBH)!n&Kny zq!<-rz(oU{r|0Z~8c}pbizxGqJ1fsSdR^+yP0oxV7|OhEVp5vN%}~;AsZ>bMkQ?M5 z>x+w=uEax%67{CDta-ZkCZEr=x?Pe5C86EzCgIw-sm=uw{hTg(K`J^dl*3}H4bd*v z&agJ-UW#EUDlbU7CKMw8(q7_Hg48{*peVVTGh+k-Y?G|%oXm?&elHli zRgwgjsUeY#^DHCn6N-u?7ZL*!xY84gznTJXS&Y{?N|6dBZo4f1rS3!CAtLKwGHVT9@FW?VN*mO^42NpB4H`aS3cfTr{ta(fj|ji8;c| zYN}DvK3}mm;K**$*ps8u|6mR@uK&NAfrTxh|MwZloxD=Z zJ6#ISb>K)zX3vzfR(^JG{5&6WBlJ9aiRG@D#ir?L7NyCnh&I6To4en ziE*L%Kq|%s0YRG>7n%>GVq6dqw25({`9Lbh1pz^u7#Erkq+(nU5VVPLq4_{6#svXE zn-~|G52RvT5D>J9aiRG@D#ir?L7NyCnh&I6To4eniE*L%Kq|%s0YRG>7n%>GVq6dq zw25({`9Lbh1pz^u7#Erkq+(nU5VVPLq4_{6#svXEn-~|G52RvT5D>J9aiRG@D#ir? zL7NyCnh&I6To4eniE*L%Kq|%s0YRHcTqU`$G({PFnwbFKV6LmtR)X(0O?+cZfFK6J z^U${l;;&c1{X>H2qX^=oEd;^tCWvLq*yh(82%@m6$zK;rzWec>w}MCRD}UqaWciwJ zl;7n0k!Sag#djPT*>(G%^W@@lv2CT>3zEbQUB^#8Lv>ZGEvvsrbe}jn{3muYdM_=% zxU9eD{i!|g?3I@KNBVBRvDbU0;HrDe&BRFg)1P$JjqhsoYp)LP3)%Mn;pfBqTz@;( zQ1;!z)(!vIzxj%}>dl9{7P-c&Dk^U%lm2Kr?R)XK@4C_x%Fa_Ko?m_Gn{Ai(HJ{h2 zUo9Fc9-@bCy=(NKXL!e{NBy@Pi4{iH{Ijwkd2RXf^D9?A>fdy!tFnp+5g!*GxOL>q zzuj8-(kb<47oRAqQ!fmB)$`QZiccm?@e|O|KxVZ-ryY- zYH(ZK2ltnK=d}yJ+4Ne`zQ(UVKXqa6;yU%2p^5W#4>yeeux+C6*k4RLB2QLM$d{K7 zdFsz>E4uW^3ok8gAA5FbVX|dv=j)rEz31GDq3@4+HZECqwD-+VJ?pI3Tspdya7^wg z8Gq{dZNaJssmJ&}`{ALQ-#xHn@~(+9zb|P$sUGbAo@4ap7pC4_fBK7OzjElXP~6Zy z*xWhRGdgZszvPKW9y<8#!i}qT|8m8O^@%6jLcchCwe-&nQT>x$FYk}+{=oPsxT!wq K|MC4>hW`Z%$OZ)f literal 0 HcmV?d00001 diff --git a/data/images/ico_hyperlink_arrow.png b/data/images/ico_hyperlink_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4fadf1d62cdf2977306412242579b1620224b3 GIT binary patch literal 15115 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 literal 0 HcmV?d00001 diff --git a/data/images/ico_settings_channel.png b/data/images/ico_settings_channel.png new file mode 100644 index 0000000000000000000000000000000000000000..1886f43dbd2da06c5fafe8cfd591e402962a9c21 GIT binary patch literal 18483 zcmeI4c{tST-^ah=AZv@Ik{Y`(o3S)wjAiWmzCIX8$VnKcZR8O)G5dcD7W!aMKY)3>iXI@X~n#M(*GNsxGbAxPj<0FNVWECXV zt}}^~IQLT6x^BI`K8M(YoH+J`gvjH<)=GTGcsjWTB+e%sz7Tip(cGKx3*OHwXNH;= zZoR+^UzyA*Y2~Wr=1Va`SgS_zq2Uc;LKh;|f@v>&jJyM!PSI4{Kp%toNm zijuWl)c{*a2QN2JYo1vP+Zwwl_)a(7l`ZlJTP-bVrzv-&5TG5FpnD0>Heid)N|Ut( zayS6@CcH;KUEUdE%P9$AwwxpYw2>I62Y6`!S6Us8=>twMK*-bd z9unvT12AJpPb1)38Bp7@j`s$@%?H4&O_ z&l`f;w}70HSB{f@OKkMdC6>Q@IXE!TX>w231^3ADzyhh>t=4hg=R*Yg)68^V^;_vE z<=s(+9J77(kEhHoZf!le_J~LK&shyV?<5 z>3j9M>vVYtky``YcU(E7D<9K*OWXC>;4I5xyfgC52SSxcHGsT#p;j@g0ijl?H31J)p8 zT@CIeX*>Xw4}FTMG=!gux?!#Pl-Auc4N>~F zYt=Y{bwRjoIz~=rP8OX;mqA;lRo1^+tG<@~h;_Z3Wb$Rxo3eM-f4H~FLm3|HWTYhZ ze8Y*2&~@Q)*n8^I8;)X?<;oM+7+=q|Yv0gr(C%v^HKLTCsbaK6D*53ng7*zBfhmNla7LvA>XE({uTp-Fnp% zyL5}rmD*gjj=j85B`5>gd|1TT^kUKZ(;Zv9M7?InSO1{hS>JPdn?>pq$M&WX!#`60 zV4n)+&crwykIrc>>m6iOBL3nx9| zIc;)U_OzG+)Goi^Qo-v2Ui(S=Cc6{)du$IB8`vXk`}5a6O)0c5$g+BGD`rc|*SH*8 zK)Ot|)5?u-oeWdn#8zquqtNy3}IFeWHU^`7kY=9l~TDO9A* zi&w;J7UZ8pVi6_?#}b>#Q=VE}{b~NQXJ{5{hvoB9CnJu%78>92c8Ay{6|-_U(bc;k zB{jvV(5TS5(C~egTJdOJ)}<=_3g@{f0i8w@IafJD(utPevW9J6+V z1>P6M&Q<6I*ZAg*rDa#|iOe>m=DiNB8veNT0Ce7Np7Jqo+K|tQvxHBYvx~1~6Z*cY zKNT$wZS4Bn8oT?hHufU!G%oeck)-lA^o3^zzZ(c1CpWnEOZQV6C=C~6Ib|heP0in# zk7d}HmtWd(NyALTtg-oV^ZDlI>8hEU@E6L%nZubcGJDJ1cZKXyD!p8Kn`nGvVAmz* zvC>N4=v_$Xi%#~tc9$3wWfjRhuPCa>Tc1~Mk!(?z{hW07+TW!QOY_S%UmNV?>?$s$ zlpes5JVZ%l_lxh2C08XMxO3q5c}*_<*p~u@;=9Bn0&fNgp&U@JGg{7!X&tyfl`;Y) zIkm29?L_pKZfx3dkDO(j*YI>*%l8S+3iZ%2+s2VV#P5bYD6V^VR zm06NmKYF?A>X_OXc`Ua3>|>R)JF=Y-flux}!1h@WwrTO6Jq`2jy%J%GwTvR&8kU0M zp-GNKFRqnc3@(_#jf-Ob!33P`$MmDsUn{?Mc6+Q|TlS!=$?`5W+by~mdr)eTuo$-3 z2INJ`u#wo0M(ISkteKk)+b>a*poQup{&VBysLt`6avfov6Nicp4b~M&cs=+tu}ETO zIIShAg)9(l74gUOCtSE8T>RY#KDp@FXvY|>1iv_^Ep6~r)!?>nY+$e6N4*ri*O?@^ zCGslRL{$M(0NIOvrG7`{j#dN2)A{i;rz|I9AJeT!h(fWNuTORFr_ssSw^?s_`@==k zpbvKYg`R7vpNh^C$%kxELZxV%#aZk;^_R{%h07wxWhOQT%OvoG){EDZB%y6;ZE>Ag zSA}gB6GjT=VJH7gs#Fb?zK^)5G+2H_E5KBG&&1m`?QBjwSA1_M(73&NA!|Gs%&*38|NEJSw^Dw3p#vi`YkOz5@uObtJ05=J z4OhqZec~i>=w987i422G+l)CE50^WZk1=h}-@Oj|WZ1P`@Qe!DIn-p*?jiZr$f1s8 z(nRa=tkYQsA|M~S-Mh}0h7aRgdiM%a$M3A8y=m89j33sh)M#;?xJ{e5(KWcy@wQ{e zRg@d$9qk=@A-Th{vEoccMsc~TcllUY)va*PnGvyU^_HHgs?fhh7N0-MMr!s{O@>it z?$1p3iu6PT$j!GjRlE$A8!M``taO{w9@Tk??TLM+<+9M-Io^G6Z*6eSWLvl43}^J= z)`g_$6N1>^PNbh`is6rWpS=@>C+hixUa%4Ul$oL^`v78QX;%szYnqNOdZ z?Of_aYH|%_|Hb)tweL4y?P{oR*jD{81OeYOJ#6Wxi*^fr1`hu3?;ykE9 zG)+m#rGdU4pXWvK`#O+s;AeJpiqH_89~2IOL4P4KH)k%RP=2Zmr0MUYpULN${dB-U zyHGzO)P@*H4GO>$_4g5dX;MEs2?G9W9KWCdpJhG-Je24|q|haS^pl7G^c4KQd;|F^ z|L!!tx_>!)8rk#P;(VuF^88Xp3?ctQw&YonEvLfD3Zd!whr$LBaWrax9hK^XS;?|* z-=FATpX43Mz65G;;0`pDvG=#7{uYR+hoccO^i)&cXr~NAsUlIz2t^nY1%s^$ zveJ_whB-a$2{;<=-$ePYFJl}kf$SOjucCbG`F#v?bCj`fAPwh>CmQQv=yQjV$pjQ$ zh3EnEP~8cJdB8ouc!Y`?cqeWr0<7YJQ&EMhDihT3h~-IsFaII59u*(7ltZ6G6X>Bm zcB%T zbcmmX`C%v{av(i*LRX~}J+YR{j4jds`_?ZGAM$d!@WTZJ5|?(NrsS7x__e-#Egwso z<=u?J;g<>x2EUZ6L;@Q6UF)~g`l|daBmcO7|BmuX{8jQ_j}h!e^ktUtE1{Nq{W?e> z)sq&C3n1!{=sEGp_DjRRTeOv>{C+=usW3n8KQsZ4@}ve(a5M~=f+G>3e!e6$^jqV%G0|VILMSZN zhZtog6NHsOEG6cRl%&LB?;w)XqQ1lu@ z&v)GN-ll7QXk+Z}v{Wm6f|mQME5qmq{f38re3q_uGfJJAOIN!YrQekHzGNCk`SWND z&8t*P7uyx6w)Fc#B8EOS#wNzzR^$+(kCPsmeoY8ms&p#!IW21#9X}O1|4O*Z@maW% zPOI+TmP^D+EB)S(ep?FtdSCiO_4ry}|C1lS&FDWFl_3^u5C$O3O%^WZd>FheTns>% zn=D++`7n4{xEO#iH(9ut^I`C^a4`U3ZnAJO=fmJ-;bH*7++^Wm&WFLv!o>iDxyi!C zoDYMSg^K|QbCZROIUfcu3l{?r<|Ydlb3P1S7A^)L%uN<9=6o2uEL;pgn42tI%=s{Q zS-2R0FgIDanDb%qvT!i~VQ#W;G3UeJW#M7~!rWxxV$O%b%fiI~gt^JW#hed=mxYS~ z2y>H#i#Z<#FAEm~5auQe7jr%gUKTC}Ak0k`F6Mj~yewP{K$x2>T+I0}cv-j@fG{^% zxR~={@Un0*0AX%2#l`dONl&6L{qfFV`g5F;-Rv6lXFx%CBO7x72$KPT$io2eVUhkm z0suiU0C?w4e|$6z07R)L-R>Iz0K1m4o{n9}tL`*&BVlWy#>Me;=tFa&SoC@BbGnB> zaq{_UHu0cPjXIwWE)HEQp_}j6qaDEKb3nUp^3d=?I*I@2KCd?#bIE8zr+Ex^+t>QLcRJ8` zI>mxoU85eC9*B=>;zY8ak(cR{ntS8lC+v5BKST@`y#24np>e2ipNos|K`|g>&5(N6 zthALQPwkoM)3uy^@_)6nRk7L4j{RLa7hzMYoFgl9)`zVc35wreH~Fk#%iA?6Y~r=y z?)D~y6(XBd5(V5~St?ZsNS{8*rTvI2`+oI`=7j1sX{8tP0@P|{5imBIDDaXS&D9Wz zakn&b-|x5ILHp`R*Lgsc{Ve6J1mekQKzaMR`v}g_kGY~dLk(*PyS#<^oEwu67KDcA z{p(N0&h4K}NRQC06>N=WgV4_BWBO*}*gt4+_&rjmR*g`%j>eIPHNo#qn=7QjNl&38 zQPe+Eb1QQ*PdXUAOS!24s;c2No{N~jIISp7$)CQE-N)r~ty*fp(DSgX92qt68c{ud zP+H zE=ovmM?Y{&xcWO=VTVapM4fjzM`&4-C|_*H}46_pwJAGrq z-(p-_WeA-mg~9IIjoy67m49$8N+i#{X9_BDf%9s5o3(o&Pok#4z=R6Wa}cw3tI`uW zM9P9}^K)>aMm(pGm4Iu|gpZ}Rgjf)TYn#T5o6(xofzgzMHZ{2xihEQ<`zY12x8uF#NM|i^6L4T@R}tH`F*`4l0Zk z=W3jc5J?{4VN)VE?aeL=6}%0SwCUFi^ho_U?(o+*FjLyVnRaRG(mw+NjP)(_ign!& F{TI#t!A1Z8 literal 0 HcmV?d00001 diff --git a/data/images/ico_settings_device.png b/data/images/ico_settings_device.png new file mode 100644 index 0000000000000000000000000000000000000000..6d942472d81cda73def9b650297454b054a69046 GIT binary patch literal 17841 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 literal 0 HcmV?d00001 diff --git a/data/images/ico_settings_network.png b/data/images/ico_settings_network.png new file mode 100644 index 0000000000000000000000000000000000000000..e56dee88adca1215ec296e60567804d5d49ca498 GIT binary patch literal 18793 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 KKTpr;=zjs9adv0` literal 0 HcmV?d00001 diff --git a/data/images/ico_settings_picture.png b/data/images/ico_settings_picture.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c097b19ee8e780410fe8b18aad887c7883406d GIT binary patch literal 18088 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 N%FNER*kpU;e*ym^02%-Q literal 0 HcmV?d00001 diff --git a/data/images/ico_settings_sound.png b/data/images/ico_settings_sound.png new file mode 100644 index 0000000000000000000000000000000000000000..79881550d005f73e219108533c66fae1a013ba7e GIT binary patch literal 18239 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 z zocmm`W%&*TssenQNz!nVd9qW|*hcq_*X-|Nn;!H(4f<-)zFho-4#qWb?Fjx3t*tM- zC5}4WcrfKy%B~RD=MJ~_Q$@kOq=wFI;*6nd60GOVW|Iec*Oabl*fe~VHC)i%Bkgk4 zCFwkRE4`o9kC}*Tv9B&UQIeEjyveJ0FsSTuu*Ybhe5!uKllNtT?-ouzXiY^KJSiIq zVvOD%{m{AaNeEMQyrHh-FwBXCCpsPtb?n|&&Q2R?>aZ9U zh}hFO5&I!V95*i}F{Un3Eb?{gYAg!%!jL)M_casONN!X~m76#%yLUo%t4(@- zzWBlEUglWb;<&iUx%>$uUrE}~b^t(2)9?fq!PW*%V$fkkGQ*t$3!wXQ4x#{nF%0k} zlDsG^h&zQ!^D$5wD!HKqp^*)gTy$-Ag zQ&>bu0NvZiA01$zG_8x~e4Z+XD?z5Ku)GYEjHeoe5Ny{$a115|q6^c7lC+Qrh&~F2 z(A7a95SkFA7D5}2(1IgTPy_<4qmM@DLB3r|SYgg543q4Eb~H8r)*Qz&Q1WE4e9>?? zo6Ux?wP6e<6^=lmP;f0I9EpT-YC!!1eOSZ*sE@z$jL3H#Q;I){N%LjV7(S3GU7|Z< zJIg>xX{wI9keL&tYJ(|ei^nFObJQ|O!!e@^ESf9!(q_irFS z!hh+;5BFb3&!Tz!oSa``r#ycRqXf|Y5;onh%-5_E*Qi!L@%*^-m#+DUn6Na#B$Ts-*)(BJo-Xw5~2%OLvtP3azCz zOJt@dNW+$s_GBW9_-|BxsSDO&kZB%)|4QX&&0jTaZP8Xf{w$&oiDG4n<%}Ihqmj`h zqz*!h;_eRhAnB}z>LPSVP!x)Yf)a^jZ4VTQtWP1%4D#3T-=s|$r0r8V^i7(~k=Ak7 zrJz=mbfDU+QAj9JM+eD~Mz}+DDM+L~Szil<(AJ&i$B~{D{+qNtlg8PEh~Bg6O!fYM z+Qc7Zerw8-=Fdr;z*#B9Nv!E@#);zhYw34~H*I>m@Fg<+DO0P^Kqq3bFxu}E`0pss=+6rOdmC&|iVwGhpOKob^>-0} zh6jsHWKxW&oSgV?mf?)xuMuEn418)&_NM(G%z-~~$Nz2y{@oJ#|2_jhbC={v^r2G7 zSors}{a*0zCT(Uae_c=Cw}Ic+ABIdqdoY-EA`45S6R8xquMZUi|5^C6P0WwG5E{qu zW-x6TWC~Ur1OHR;AEP)wuC1H-Z4K-1Xkh}eGQ;U1P&pfI#c&CG-r?D za(o z;o{B*3MW z;coJ9apwc_@^FEGa5s6lxbp#ddALA8xSKp&-1&gKJX|0k+)W-X?tDOA9xf0N?j{cx zcRnC54;Kgscaw*UJ0FmjhYJLRyUD}Foe#*%!vzAu-Q?lo&Ijb>;Q|5SZt`$(=L7Qc zaDjkuH@V^x{`sUQ#fS5FC!6ye=MG^O=f6V$5R#>%EdT_q1c1;z0PuN|^WFyl+qD3o z-;MM5XaWGpF^+7#Z4Ll)c37Dj;{)2>B-naMJIF+yME9@tyku3_B6SIBvRP)+RcD)p z8r$STzV5AZER>yR9PZQN-g457C8<#rAvq>!8oNVUy|TX`@xIKpwPJn zO>lI|Jf#W=mX_Ka8|O#OXt))3#cfEw!o9%b&U=lxs*#%TH+j3$(Z`}I4z%0lnyA+= zOV%yklpJPyzqBn8p}IcZRqRp5ou1)KA?#J8Mq0VKEsSc={kk$i!&~QYh)p6rOn-my zS*!N#<8utRUkqMy0UB2qWF}rTv01k04BwbLGw{ZIL+{%yZ4u3p!f$c}a=n=-&x$VH ztOr5Wc(1ovuPQb050+X{(iU8O8CNDQGVdz3YpIpA>!@2%!%uoMHWt_Lt>J$K+g5P=+5oLaOw}9u@fxaF_R&M;fUxx{qx85#VKj!I>E_;66PT&Vi9#QUhcek8S)Zcpn^ zNM7RDSXBtDGdt6K I6SwgH0!iFsiU0rr literal 0 HcmV?d00001 diff --git a/data/images/round_rectangle_4X4.png b/data/images/round_rectangle_4X4.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1f51d38f87ccd9c29476b13310fb47e158e57c GIT binary patch literal 18179 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 literal 0 HcmV?d00001 diff --git a/data/images/round_rectangle_8X8_top.png b/data/images/round_rectangle_8X8_top.png new file mode 100644 index 0000000000000000000000000000000000000000..dc618e3e557c474f8d3650f87230b2b2c31e2df5 GIT binary patch literal 17774 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 Mjf-`WmG92~0w%OV literal 0 HcmV?d00001 diff --git a/data/images/scrollbar_horizontal.png b/data/images/scrollbar_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..227ddc2d5833629be0a6bd9baa5919049baf7b7d GIT binary patch literal 17735 zcmeI3cT`i^_Qx*+LvI#DMVwF+MA9iHhEPJ4CJ-dpLmH8ikVGkt42TrVfQV9sK^>)| zf}#j0AcBg3;9voiQ9wiod;=mj;CCqkUNyh@t>1fpytQ)IO4(_f@&OZCzWUae@ zy_1cC>{3|(02J(OEnUG+8So`7EeXD_ZfLzY(ZIF!4b zy*UC7-F!fL_sd6~ zH;i3;Kv`S6S)eI*bQvIsihSJ>`MU_S`T^<{$5?E z+^YwYN+}|gYU8ZJH%Y?-q&z$j%XJ&=R97!FqW(ZlHA7Sfr!2vQ8z}ubbO!)3<5j@f z4vhviDi$_28pW0=|QKZ>#he^?e^o_%t&7 z=hbK0;g~JqHWKgttiJQc;qIRiA-cbo$MMSmxWknON(g&(^ zMwM=PxQvAPP3Z+xjkXvuuLBgVSZURi$afl5wi5FXYQt{DEOgPdk2kbMyB;9J+-=nd zO?W@xqBmP#iC=pY!0i1LRc?bm8eZgL@`wCIQfapF(tXw^OEnw8;=C%|Eiqk{eY}hhwgL!Q-#xmmjT&i_66SD0uth_Ssea&Jo3_6-( ztFLu`e%u12^6nT?jj{Ip{UnS|>ER#j&i_tsncrgF;_s@}r=OE%V7pW+;Z_^nr$`ES zR3EnbW@LAI_w{aUw_3Nx;3nC0FSCH(-?=^0b-le~-I5;V9)li9Ml#0S{Zy*!-7o2R-Ql`3>35gR^V_=0YhiMS8~9+;{qp{Ufryuq0j?Q7QSBfY?ay>1BX&H zW3x|gVp1X{&o<8`&*oKyQDJ{p`k4x=GS83Uisp6ebT;eQu;LnjOz(Aj?L?Vn;5GlOf#i&kNSPc8n%(ANEXX$OSa25 zE+*VC4B!ydk#+5VyO6eAHzS><9-}5b-4|clOgPnQ{j0UoA$INNF6}PATEE&;DR5Va)tR*pYaQwu?lhcixSwK}W`cfz=}qfRdyv+7Y5T^Yjrt|oC6^g? zMco_Ecn*}5`$ulXd7h@YZ`@LBU65X|;(l2{S=PL)Ql|u`yo~#->*xM1xmA*LY00^s zhm!4uC4MD)s4Op4)}Y@A#yoLA;_$R52#|KRJ z+<24Nhh$Njl$#!6yGj<+uc~3EyQST;VX3l8`4K}g2lw0Wtw$sg5ov0*k8f6VuM-Rh zYC)3|D)-wlluu`Vs58kq zoOQ8R3rR!9dlWo4cjn}=`u;p4lIpEa(a21 z`{rMV3p7T0lN;k3*@}_tLtos#D@A=yJ$OA-UMDg-(j&?=mK#G^+Kf&z3~cTo@jER) zSSDINNn@d%acAM{4E2b)h#iDB<0}SNOluKL&pWM@bc&s?{W2Uvuh7Wf_iE>-{-Nk+ z>Cfc4cB>{MZ*JiRpJ=Rp6PdLr2QgnCpJ?U~^

l;;)sJ8(sWfZ%r7 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 S+B&FHfW5V|Ri5S6-Twnc%6EqV literal 0 HcmV?d00001 diff --git a/data/images/search_searchbar_bg_nor.png b/data/images/search_searchbar_bg_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1a285d66c3bf941d9f0c7e8f16102e3846dc35 GIT binary patch literal 17740 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 Wk9+DCd6j@;01h@T*2Px7yZ;9iK2@Ut literal 0 HcmV?d00001 diff --git a/data/images/search_searchbar_small_bg_foc.png b/data/images/search_searchbar_small_bg_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..0a81cdcca66f15284f4c0bd3f55e479b49a7d261 GIT binary patch literal 17688 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 Q1wbO;XzOZIWbM22-?q3!>Hq)$ literal 0 HcmV?d00001 diff --git a/data/images/search_searchbar_small_bg_nor.png b/data/images/search_searchbar_small_bg_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..72121449cb0b7129bbaffb6329b3bec0723dc3cf GIT binary patch literal 17688 zcmeI3cT`i^_Qx-S(whZQ5hoN8ku(TkVhANvX#zolJtUV9A%!Fwz!5>ESVlxtnlPxN zbW~6j0R==*5fB_3po{_{I^Y}7!BK&CDFR+Kzxl1-`~C6O%3UjEpMCcC-19m6?0b{7 z?%vgI4$2A(6#xKGc5<}!gg$4EzT{+}_n*1?UC@U-&(T)^0E%-)Us6EI@%aFt;LakG zSFaA>3b}#+E)U^ECL?%!u0JaX1b~p1G%qH_t7o3Y;M2D@&an|koVlLratKeG{SkBH z^$oS<)mFu7pLne9Q8~-bZieQ~j9BS|2O|!sdl)J0Q+OoXseSU`?o+Y*Zhw5X{Z!zC zvcVVi!xtZty7LCoiW+4rY!d!#Ca@hhC=BIW{CVFzu_09N)= z5ot;KUO>hSU~?VauLD?(1U4_-`QjcBk@h}$yA-hQh_<>^Mm&I+1IF3{0V{#L#x?uw z04fHU>+f8R2Oc2-jFXSQBXI5#P|={KSO~}|0T_?isAa&6?ZD=ny1F62o@8LIeZLR! z&*cSb-G&gU94dMIxT~}C(W+{jb+p?)JBFE6n<{*Ug8mLC zej0rD`_<=qk;WS$9cH}$z3R?em(z z@;3uH>4<>c&l*J|Z!Cu#GL`@l{!WL30brx89*T0i$g)-r0BkcN4bNF?zO9^ZR3Wpd za%Nkl;-}4Kdu;Tot8CP46c`bU_?wsI?Xoe5u0N+`xEcMMl@_kTBOp3~r-G{TzN})w zQ~f}bORqF2iFej!gFi#q)Yd{ zqc@%x&6pi&S0QgULu7-XEw*-~x=`I7Ic6ai>EULz$eYVc@A0Tws*{lAd_n)ptiP-0 z`x#?nsE$Uu4`#>BL91<#C0Cp4&E88kURrYK2dDGDQkrKs+c$GOb$g7mQ*n+9brWv2 zFair@@kfjh%Wp+DP6m03@YE_O@2 z>(gA<MDx!kxtv*WZ~uZ?3dS7!I;lHZHJR&8 zH7qv#Nj?6y!qHVn^^a;AqAA%qXL6qAD0&Zg*HPlKH+td2P=?O3jNPTK0% zUYcIa?3GzDIm|3B#q!s1-=V!SzSmu@yOV$Q$T+{LqpSv@NMBGCVx%3YoEyD0(zIIt zeEs8}wi%Wt4QZ9`x5&vpfhU`+GVv+$95~`{Dcg}0{QkJmO}^V8GjSk%-_yBomOWpl zc?RcFf(6$H<{V2rM$L81^~iO2U2ay;o0)c|+^*F3W2B08?W(2gmpU-x8fK<-dp-7g zlBtk6&((tPt^k!2cv|yBsjcW5C$ldp{p!YubQf;s)6nwn4~ur7hbTkr51H>Al&CUA zN_sM_N)7XgH%x=ML@jh}>z^Lv4cD#6r)fuNiO=@LmoyPi-M9bQUiAR0W_^cV2fKz{ zb4p)EUt8bV^_6R1il=MInPq2Ix~z1mt-n)$vi?D`X{rVGp>cO=ck08`_Dh@BhO9Lz z&MLkPIu&-VJ>%O~T*ir7i}yWE^nI&!sZn^0XnAgw!S$wNF z`_h7QU5{j13yRsrJ7`Ql4d$gA1=sr$$`f{6+41v`g{*SSW0hR3wOZkV3;el+HH4=r z4afT|cieb;tOw1cHmWr~GU+IuQ@5;|mFAUt&w;7IED`J;h~2-}c~>1Ok%UUsta);? zymOWCUGRoyVa@N-Qj1cndb3*3_L=pu`eNFCxr6& z>6@b3$vbsN7$adLO+aSE5-Fzi-bm}nbw7N3ANG^>wS$&~R`9RF$Gz4EGD@t~t>bp( z@9L_|*ABS($Dw@f!S1An_y(3r)avk;5AMp+UeNYm4_8_m6%*wXZF!IvOI_H6O*9oX zwUGtwwjXSd**;BWV%_m)k*iD%Nja!3#1``_xGR=5D1YBO_o-=Ary%D=c$8s*87Js! z`={Q4nCEHF6+5hi#-!r>d7{g=>-kILQ(EIO1o(-)~wY;)!% zWv#(OL)k(m=;ME_e(!DkvE20K^}TnBZnqvXKmO*Ik>1%=v!5LZzR`gcrirVqI z?P2c*cPiSq{UYr{bebkfeeb@4xvd(B>N_79w1sqO#&B<6OKv-IAv?Fagwg2V?BDa^ zDKdSX%CVfp7l|qy<;N`-l-t)_=zaH>T`M}V-k`N~cQLu-)HUMeGBER2L;Xri%CD5S zln)fMzUC(vX%F9Xn))=im;HtN<9_S9vcVzJt*foxQr@oj{qKVxojw)~S{Cfh>3M(b zBYQ)>8#}nSR=QbwNLE*+_+iO!_qCcWD4uZ-mcMpTsr~WlaM~LYQrS$|`{&~|&vkjW zp`AU0^6i6*l?g4|4s6eRCVTJ4ZCXq%^cI_x{uKLEuauAL{MKD@ze8$z@ak#UCx_M_ zRgdF{zM-oID7RQGJ-hBDF#8)1q#aG$5sv!1ZFB3%;_cn^hW0J0+&5R$gwLAoM)r5F zEL+*IzW=hYzp%Ayj?ZPEl(U3Q>{r59#NmW{?zN@IOH&F;)(4jKg_U32?myV0nQq?j zeDwtsj%0#N4-B zH{ABLb(yeYk=gJ3Z%bbL%*F|Ir^7{GE2n4(OPbc`_;VU9;(O>uZE)(ByY!J4447_>1SiNz9d<^-%6V&c#tDL~(de1<>4 z)7E}sILNZl2@nc-1Tb3@AO)cuAuR;S5$KMKeAclA z1#~`(CuDIsh*4ddA9t(JLPuwGpvhxmUTogvKpepYJBT7WgvLW-Q5f`hf?Qq2hq2k; zj1&m%wn1kyF|%(DD4>M$K(r?);BMv9LAz}rN2vR)lVH#%b$DC(L1TOvbTk+QvY`+G zbn@75o&xXlFObRbFHU39{oUCMS^iUt^F{2a=euEG2=8n2*WO$jC@ z1QXnH44#0&OcNRJ3Da1Tp9LHaRFX{IYo80I+aim^$48UB^DEtkG^ zG>0an8IUyHgiiPO!{LxLEFOcz;YOv+Kn4<|(PvIJ1-gicE-D6z)Mj29UEW$R~05NoVl@MwGiIJyfhbUtsx$@(%` zK1O54b~AxSA1yQ_`e?3#3?llA)~VB)jGPE#eZ7GHjPkhtwD9kbAqoIF;u3ybYOL4y zMFd=bp@_x@t(j0x{14l3T=2^XxH1tvT9boV{|{>*pl$oVt-wFqLjUb6FqOOX02+r0 zGDzspY5Te1pDo(>QhvFgK9_;7_aBi#C-`&uY?_e7V$+x)n#W-h(Nm36V-hE?LIg55 zh|727GC-0E5&f;^Z$?3XuB{&bZ;d4Ibg)4<*^$k#cr!DkF$z0fW?H{#I-}Py0#sw5 ze5Z}=Z7AleHh6#PXsrm^I@aIZ7y}*94G(logid$ELw&`EPItpYry{*MEFsBwVl-Iu zw5ZXG?Ko5~=)MpnK~sY_!F#V}g@8d+TNZRp5R6tj(}@sx`#0l!zY{mDeIjl=nWo*l zjTMOTR_M+Ux+z6Z-j#k;J0`2^fAY)Jg#MGNFfGX-Fd*Vh2`=$`U|tC>7!dKM1ebU| zFs}p`42XDBf=fIfm{)=e21L9m!6lv#%qzhK10vp(;1bUV=9S=r0TFLXaEa#w^Ga~R zfQUCGxWw~;c_p}DK*XC8T;ln_yb@e6AmU94F7bR|UI{K35b>r2mv}xfuLKtihf(r&j zyeSr!!qjt~AP0K5Qv^N5sb#P34Lt#hpgVfH0zlXj0EpNP0Dq4_pFIGu6$1dTHbW1O zCINs3_wc40_E2AaCtGVuNQ+M}AS4V)d6 VS@c}d>qp20ob23e3v4#;`ZxG?NC*G` literal 0 HcmV?d00001 diff --git a/data/images/second_depth_bg.png b/data/images/second_depth_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3c6243cce9d58310769c773fdbee3cb6b9b926 GIT binary patch literal 22286 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 literal 0 HcmV?d00001 diff --git a/data/images/setting_highlight.png b/data/images/setting_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..a958308a9c8555d0deaee32a86cb66dff3678d74 GIT binary patch literal 5209 zcmch4X*|?l^#2EwT`2n&Np`X?*~T6sTgH;DEG1b|wlHJKM3H1Si0pDwHeZs*D&DhXq{h-4wTNH>ZgS zNN}(OPM4MjeaUSr$C|=C$*?R|nwC%oPZ>J;8C@2D?>P81a@tJLTdCVYG>tKIF|uZx ztJtbRS*s02I2RHIdi#GaD;U6-uLJ`ej7|5%9-oNQ0F+oA9ofrW44nW?#5Wd3pzCHq z*EON!Gxl}EJU1F>B28CVhNdMWlnXG3N;9kg3`}XDh}^68KnV!&#NPE@0&d9zo|19D zz5!4KB`=x=aD6MrO;eHqh+g!88w38=fx5BVDJB5q8o=di*{cOi$^+MKIQg0bA6kH} zQ4W?yfRPorW(!Y}20+n(=b*TF1dx~qaG7p9>HL+g=U9=UGL_e;(|SeA1m?;pAHv|| zq#zTPO(Vp41@d=iDS2{`>f6X}&5kPNsC@XSFa(bm{Y$Vk1nT^hyP-Ajt}-0Iv20Nl<&aIK$L}^;a#h8p|Lki ziQY56(#?)rSk8`xzg_OV;oS<6;aal25Rzt`|8hsU{PGLKH`09)6KD4p=jD#*^ybxo z4-fQcqBG>H?%bu@x0K|7gmo<*0Kj&8Q1^E!Mmnf}!q2hrGqV1PS&0My^}X>X1OVKP zuP8VSHR%s90)TM|Oy&bvaJQRJu8Ur%``k=7%dw|=qT!X^9zza8=6g_~P*3T)ctfe@ zBOioiJQcqi2&;D4`ajPMKCjT@`1!nUF#DkwV^OzM2aE{>9%Q`eB{mJG@lJt=r!n&8 zB~iq>%|RDZuZVtybJkZ4-UGJY>iDL-`dwf^kW>3T*3*Sc2u7*u*6UQ_7* zV)#*0jw$ml_T%L`*4lo754Y>++F$J59s3v#x&SljVp0c%8;W{~fXyLR5bH_vDp8>; zs+`kI8ccMFwmp)UGpj5=U2Wt1*URUvtdtBfmlMZdNWZAa5e+x$)wpuug^{vk>ucH@ zAKyDnT$nJOcw{HOCRbgcYAzt2`E~kUKqG_JTRBnL!K7ux@|R_mWx-{!ZC7T5w?W8z ziv6OL-OvLIei8>sl|=88s|5H{sD(;8cG|vD|zgBL5>g^l*}{kj3MSMi>#|zf-;H@)io70b2TiEJC0a~^lEqe zn0ix375k-XrtjIcjx~r|8}@?se%05jl56~`f*kbU$2y<9pm+Xa^~J{My=}=ykEM=& zQI@;>O%ZZp0c^F;pTN|5uYMevdiGSNJ@-VoJyo}+`kj`MiiL_(liki+Uwww9+z?7( zm^IUiRAtUiY|0!LS$a`gutL?URmsOKpe8#f8&YdtYg=o!fmW~ItVC3xP1>E0VCTUD z7Lsm~W`60T=MXFQQ}(l!%#}Phb+z~E6>0*?1>dzBhhrX9ZsitrxB>@Ie_(&vRr;%9S1oU@-`vW#yV+VHU2)y&y4AqQ@JQ(hK2NPcSBap! zQm|4$D41{Ybct}0Lsg+Z``l<;cBydQLUlY!a?x@whd8?2X);A3kP`TIWP2rNWvg|j zb!`#e@5_h3sIRE%7XA;UNqS;EDi9Up<>$@o*V0%2Wh)b%8PgW?>O_};EqUsEt+0!5 z?Bh?NT-vv_=kiAjxAbHBcC*(M{UBo;W0NXNsEb(X-unpqf^TMiynd~Z6L#RKFD&D+ z3ORZT1%myvgXm?8u)UBwKcgo05Cu&IJ)2d;hAs82`&-E~#lxz_(nZcHkH^0Z8ZFq8 zaQZC8S=R#Q>tbz;Y+!!PE8>cG6*HWWgbyv{;WYT8mnE%W zZg6@$GM?0p6!Rba{TeBDu#!8PF?#=e(yiE4{5XTxFR#=uv8<9w$w^Mn_0xjk5CNQ0 zj#@Zw#^~|9@u6|H@mztQl8sh_yoH*KUX8*7ooS6W)i(Wp1z+dk9}ooO#zRXXEd`l+ z^+yjo=Z`mck{1z+EKAY6xr&2#f+OFJ_UtBA@>DBakkigKu!37_zWoE{kg4K%DY1Pq zTq2D*vPZbb@3JCJ9S5H@a+49U-Zq!H8TICOMu%GDl|GenIZ|t)WcBL~D>kdy0_`H6 z{HLOU%DUQUrGz&buR{!L#BOGy{MP+``98(g`6M--_B~2%Q54By_!`jky6&8_JTuC$ zV%5P#iXg+#=;!0)iy3(_q?KJ;Bs;P>+%!adtx-rWKHI#|bK&P3RQYpDCwXDWFLd1l ztwx=YNFwtR_c__;x9RJ2KBu5$0)N=lZaU@E$D*%B-3)-acMrvPH`4@cusAZ4l43Sy z2%C3oAd1fO&0dGk5rTT$FH-8ch`c%6ag$Or5hTInpdn1&%-c`ZwY{zP#(XDy*M7~( z7rCC#uF3h8bN&(A)buB|`P-j1_x4SQia8@v#P$S~QEM4S=W~Zo<=4@X>-rAw9d;cK z9n`lbW}CeTlt;KN!RU^C)!#pet{n#_dS5$%pfB63JIl6Jwbf91VqGpYfeH3^H zX&o4{IY2i-cfufk9z|&V{zG^|*TF6wFS}uOe&AB)DS{j>&!*1i_^PmfQ9RfEDtcSy|&qW=Z5ihY9s_HmL zTI@J{y+6Gc|1HyRd+a453lS5m@NdSGSc-~XxjQ=lfIW!Z#u4^&!sIM<<$A~UQMc{S zVcU&F(nY7wPWcVm9)as&>pG{I-)sij3)}PSTipU$x1!L^(Y^<3f<+pmv%BcXzdUF7 zA4OWav*?|upo6}Hy?LJ5*igxnQEdBExa1bH!=}Sy*I*MoWi*@oL*MmuW|BM;_n<4h zWCu56c0iw$Fm{@;m(Ff?7h3H~qNo6$CAs@pZeN$$TsM2SIB5D$i7^ z`D&PQoSocM3W1g}B~E>lQg|{FY+kXXNefU4QJ53)3D4s1&ej(wj!I_mB1 zm^sTX4%y$4#{$6^Q4XR5z{h>)PBj!#M+a+K-fR#Tv+0Uph-(SoxmT`+AYjHO<*sX| zRWj7o<r>&%6t9CQ>F3*DRa=4D)=L;)$*8QgnuSG?B_1 z;{s3o*Z25__aQG)=srmD?QvS@(G$k^ny6i6#H9y>{b-XWe2*eaTnZe?2)K%K)V+!% zKi*XS5^9p(_d7IJy0rOOpaB3qx&nn`;&#qY-QUvd>@#cJ7#D1u zyvw00ZUQrmabQ04iQ(r$Su_~(gHVfwF5!|75x_VLsAcAK(xsSz4*2ZHp?P_662D&# z`@Sa4$M!y8R(O0}Op4ABIf&ufnT{oG+i_8vzsY`h!hEXDN$;CrpvcEaJywDBz2*ca zwxd2v1ZL~>G^mDcYomD@1fZa<mx|MGCWsM!(X-J0`NPVg?_t2F0xscUHDw=^PB7TG-620s zzOagZStWOf{GjwWJ?;SrrW!JXBy$H70DvqE%0@yW?+K<~X8e?mJ;DAf+H7)4nTeg# z;NHO!G*j?9wt3_g!_H#Drc&&Yr*j9vI;1$J`xdJqxVF-Ss<#mcmR}}iWmbN$Q1wh9 zHPZb(R`hk_US&VQVv67*3-cU{qTQ$Lz3E!bz*O>KTq1W5NmU@a1~K}DYATPSZ#}MQ zBM=hCFi4a&!w1u z$M!}30*m_S(vuFSxBZE8Q*mUj(>v5S@)8VWxjyxP_4-Tjq2xUQxmQJrw;}!r%M=gA zJ90RTyFN25S_HN|32*&K6Au9Cth59BB|%SBX~98q-M`!B95(Xcb&}rdjNe5%KH1R2 za3uy*w-1 zOEv#5-~K0n`k`VL9$WUUI6OOr+gsHK$>-?H0>_+S(b-#*yj= zvQMMtI-jBr(p&{}X|S)nN?OLM%og%L(ouJbH^^TV{@lDkXgel=v2m&m!mhIWK41^Y z)Ht#-m^F&kH=3Rr`kVygdobY7eFp#gpujrX}Eck*7!W(Dog; z*Z(I7bj<7MU~Tv1O3bryX#s4@FwMd#c!7N8=9ltFm3h`@y6HqweC}Web!?qDO|V#r zu{SPkyn8^=aybht%EA7dr9qO8A3?G5@kkQ#~DwVk?nTv^(z8ql?r(6tub z(kGl%>cB!{DZ%B2C!{COrAfYW#w{mJ}4x)Zu=nSc!L%?_--%ubo@ zLe3(^9`#Jd<=7|n)a?5urJ3lN;7wuL7CmnYo|iL{dg)!#U=*4!Km%ypMl?Qtw&}$F zI|HMF35)(EQ3wkyp(7@E_g8nG!jY|4apc!qQ>A3I&v*cwh9U}Hc=7;K#z`O5C(lkB zeLHcdJK^7UITWML{O|Y9sq3A8Ww#HJMBlj{zDz8&q}j=wgQ?HfxlUa)tGLnI*F({7eZx^cFw`RcE=+<#|3z)&l+hzFFU&T zY~C0Z2HY^QHm*1HjQ>9bBezok literal 0 HcmV?d00001 diff --git a/data/images/setting_list_dot.png b/data/images/setting_list_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..35d2f0cdd686409fa891a6b2582f31abbab7f775 GIT binary patch literal 2869 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 TH%ZO200000NkvXXu0mjfeoa$b literal 0 HcmV?d00001 diff --git a/data/images/setting_list_dot_s.png b/data/images/setting_list_dot_s.png new file mode 100644 index 0000000000000000000000000000000000000000..76f5e78b775a7b7faedad591fca0a17848ed8faf GIT binary patch literal 2899 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 literal 0 HcmV?d00001 diff --git a/data/images/settings_bg.png b/data/images/settings_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..72e6b0b45b9c752632c295ac446dce846c13fe0b GIT binary patch literal 117649 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 c#>XXrk&80pjtv<6>QCwSDiu0V;q-)&Kwi literal 0 HcmV?d00001 diff --git a/data/images/slider_thumb.png b/data/images/slider_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..ae976f0c5c4f0b61656cbcb85c00979ba1ebad0d GIT binary patch literal 18869 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 literal 0 HcmV?d00001 diff --git a/data/images/tooltip_arrow.png b/data/images/tooltip_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..78f85aa7a26bd4902a970376830a0e6dab3f4a83 GIT binary patch literal 17852 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 o$`;9`ypiB<<>p_1|&h7!2kdN literal 0 HcmV?d00001 diff --git a/data/images/tooltip_bg.png b/data/images/tooltip_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c6412496fff064e40980b274317375fd3146e0 GIT binary patch literal 17912 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 literal 0 HcmV?d00001 diff --git a/data/org.tizen.settings-tv-ref-theme.edc b/data/org.tizen.settings-tv-ref-theme.edc new file mode 100644 index 0000000..f8ece3b --- /dev/null +++ b/data/org.tizen.settings-tv-ref-theme.edc @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "../include/def.h" +collections { + #include "widget/button.edc" + #include "widget/progressbar.edc" + #include "widget/ctxpopup.edc" + #include "widget/scroller.edc" +} + diff --git a/data/org.tizen.settings-tv-ref.edc b/data/org.tizen.settings-tv-ref.edc new file mode 100644 index 0000000..aef0b96 --- /dev/null +++ b/data/org.tizen.settings-tv-ref.edc @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/def.h" + +collections { + #include "viewer/maincatalog.edc" + #include "viewer/icon.edc" + #include "viewer/sublist.edc" + #include "viewer/change_passcode.edc" + + group { + name: UG_GROUP; + parts { + part { + name: "bg_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 639 86; + rel2 { + relative: 0 0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1076 908; + rel1 { + to: "bg_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "bg_padding"; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "ug_title_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 70 62; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: UG_TITLE_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 936 84; + text { + size: 30; + align: 0.0 0.5; + } + rel1 { + to: "ug_title_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "ug_title_padding"; + } + color: 255 255 255 255; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: "ug_return_base_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 639 294; + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: UG_RETURN_BASE; + type: SWALLOW; + scale: 1; + description { + state, "default" 0.0; + min: 1076 700; + rel1 { + to: "ug_return_base_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "ug_return_base_padding"; + } + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: "ug_separator_line_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 208; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "ug_separator_line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1076 2; + rel1 { + to: "ug_separator_line_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "ug_separator_line_padding"; + } + fixed: 1 1; + color: 255 255 255 25.5; + align: 0.0 0.0; + } + } + } + } +} diff --git a/data/viewer/change_passcode.edc b/data/viewer/change_passcode.edc new file mode 100644 index 0000000..a26f3c9 --- /dev/null +++ b/data/viewer/change_passcode.edc @@ -0,0 +1,413 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: GRP_PWD_BG; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: WIN_WIDTH WIN_HEIGHT; + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + color: 0 0 0 178; + } + } + } +} + +group { + name: GRP_PWD_VIEW; + styles { + style { + name: "cp_text_style"; + base: "font=APP_TEXT_FONT style=Regular align=center font_size=24 color=#3d3d3d wrap=word"; + tag: "br" "\n"; + } + } + images { + image: "modal_dialogs_bg.png" COMP; + image: "round_rectangle_8X8_top.png" COMP; + } + parts { + part { + name: "change_passcode"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 688 411; + image { + normal: "modal_dialogs_bg.png"; + border: 18 18 15 21; + } + rel2 { + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "title_image_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 9 6; + rel1 { + to: "change_passcode"; + } + rel2 { + to: "change_passcode"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "title_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 670 84; + image { + normal: "round_rectangle_8X8_top.png"; + border: 8 8 8 0; + } + rel1 { + to: "title_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "title_image_padding"; + } + fixed: 1 1; + align: 0.0 0.0; + color: 42 76 130 255; + } + } + part { + name: "title_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 64 0; + rel1 { + to: "title_image"; + } + rel2 { + to: "title_image"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: PART_TITLE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 542 84; + rel1 { + to: "title_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "title_padding"; + } + text { + size: 30; + } + color: 255 255 255 255; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "cancel_btn_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: (688-216)/2.0 303; + rel1 { + to: "change_passcode"; + } + rel2 { + to: "change_passcode"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: SWALLOW_CANCEL_BTN; + type: SWALLOW; + scale: 1; + description { + state, "default" 0.0; + min: 216 70; + rel1 { + to: "cancel_btn_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "cancel_btn_swallow_padding"; + } + align: 0.0 0.0; + } + } + part { + name: "up_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: (688-542)/2.0 (84+40); + rel1 { + to: "change_passcode"; + } + rel2 { + to: "change_passcode"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: PART_UPTEXT; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + min: 542 28; + rel1 { + to: "up_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "up_text_padding"; + } + text { + style: "cp_text_style"; + } + color: 61 61 61 255; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "service_content_area_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: (688-542)/2.0 (84+40+28); + rel1 { + to: "change_passcode"; + } + rel2 { + to: "change_passcode"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: "service_content_area"; + type: RECT; + scale: 1; + description { + state, "default" 0.0; + min: 542 (303-84-80-56); + rel1 { + to: "service_content_area_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "service_content_area_padding"; + } + align: 0.0 0.0; + visible: 0; + } + } + part { + name: "service_content_area_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: (542-266)/2.0 (83-59)/2.0; + rel1 { + to: "service_content_area"; + } + rel2 { + to: "service_content_area"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: SWALLOW_CONTENT_AREA; + type: SWALLOW; + scale: 1; + description { + state, "default" 0.0; + min: 266 59; + rel1 { + to: "service_content_area_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "service_content_area_swallow_padding"; + } + align: 0.0 0.0; + } + } + part { + name: "down_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: (688-542)/2.0 (84+40+28+83); + rel1 { + to: "change_passcode"; + } + rel2 { + to: "change_passcode"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: PART_DOWNTEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 542 28; + rel1 { + to: "down_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "down_text_padding"; + } + text { + size: 24; + } + color: 254 78 78 255; + align: 0.0 0.0; + fixed: 1 1; + } + } + } +} + +group { + name: GRP_PWD_ENTRY; + images { + image: "search_searchbar_small_bg_foc.png" COMP; + image: "search_searchbar_small_bg_nor.png" COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 59 59; + image { + normal: "search_searchbar_small_bg_nor.png"; + border: 2 2 2 2; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + image { + normal: "search_searchbar_small_bg_foc.png"; + border: 5 5 5 5; + } + } + } + part { + name: SWALLOW_ENTRY; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 53 53; + rel1 { + to: "bg"; + relative: 0.5 0.5; + } + rel2 { + to: "bg"; + relative: 0.5 0.5; + } + align: 0.5 0.5; + fixed: 1 1; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + } + } +} \ No newline at end of file diff --git a/data/viewer/icon.edc b/data/viewer/icon.edc new file mode 100644 index 0000000..c4b673e --- /dev/null +++ b/data/viewer/icon.edc @@ -0,0 +1,421 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "picture"; + images { + image: "ico_settings_picture.png" COMP; + } + parts { + part { + name: "icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: "ico_settings_picture.png"; + color: 255 255 255 153; + } + description { + state: "focused" 0.0; + image.normal: "ico_settings_picture.png"; + } + description { + state: "highlight" 0.0; + inherit: "focused" 0.0; + color: 255 255 255 255; + } + } + } + programs { + program { + name: MAIN_BTN_NORMAL; + signal: MAIN_BTN_NORMAL; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_FOCUSED; + signal: MAIN_BTN_FOCUSED; + source: MAIN_BTN; + action: STATE_SET "focused" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_UNFOCUSED; + signal: MAIN_BTN_UNFOCUSED; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_HIGHLIGHT; + signal: MAIN_BTN_HIGHLIGHT; + source: MAIN_BTN; + action: STATE_SET "highlight" 0.0; + target: "icon"; + } + } +} + +group { + name: "sound"; + images { + image: "ico_settings_sound.png" COMP; + } + parts { + part { + name: "icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: "ico_settings_sound.png"; + color: 255 255 255 153; + } + description { + state: "focused" 0.0; + image.normal: "ico_settings_sound.png"; + } + description { + state: "highlight" 0.0; + inherit: "focused" 0.0; + color: 255 255 255 255; + } + } + } + programs { + program { + name: MAIN_BTN_NORMAL; + signal: MAIN_BTN_NORMAL; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_FOCUSED; + signal: MAIN_BTN_FOCUSED; + source: MAIN_BTN; + action: STATE_SET "focused" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_UNFOCUSED; + signal: MAIN_BTN_UNFOCUSED; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_HIGHLIGHT; + signal: MAIN_BTN_HIGHLIGHT; + source: MAIN_BTN; + action: STATE_SET "highlight" 0.0; + target: "icon"; + } + } +} + +group { + name: "channel"; + images { + image: "ico_settings_channel.png" COMP; + } + parts { + part { + name: "icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: "ico_settings_channel.png"; + color: 255 255 255 153; + } + description { + state: "focused" 0.0; + image.normal: "ico_settings_channel.png"; + } + description { + state: "highlight" 0.0; + inherit: "focused" 0.0; + color: 255 255 255 255; + } + } + } + programs { + program { + name: MAIN_BTN_NORMAL; + signal: MAIN_BTN_NORMAL; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_FOCUSED; + signal: MAIN_BTN_FOCUSED; + source: MAIN_BTN; + action: STATE_SET "focused" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_UNFOCUSED; + signal: MAIN_BTN_UNFOCUSED; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_HIGHLIGHT; + signal: MAIN_BTN_HIGHLIGHT; + source: MAIN_BTN; + action: STATE_SET "highlight" 0.0; + target: "icon"; + } + } +} + +group { + name: "network"; + images { + image: "ico_settings_network.png" COMP; + } + parts { + part { + name: "icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: "ico_settings_network.png"; + color: 255 255 255 153; + } + description { + state: "focused" 0.0; + image.normal: "ico_settings_network.png"; + } + description { + state: "highlight" 0.0; + inherit: "focused" 0.0; + color: 255 255 255 255; + } + } + } + programs { + program { + name: MAIN_BTN_NORMAL; + signal: MAIN_BTN_NORMAL; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_FOCUSED; + signal: MAIN_BTN_FOCUSED; + source: MAIN_BTN; + action: STATE_SET "focused" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_UNFOCUSED; + signal: MAIN_BTN_UNFOCUSED; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_HIGHLIGHT; + signal: MAIN_BTN_HIGHLIGHT; + source: MAIN_BTN; + action: STATE_SET "highlight" 0.0; + target: "icon"; + } + } +} + +group { + name: "device-manager"; + images { + image: "ico_settings_device.png" COMP; + } + parts { + part { + name: "icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: "ico_settings_device.png"; + color: 255 255 255 153; + } + description { + state: "focused" 0.0; + image.normal: "ico_settings_device.png"; + } + description { + state: "highlight" 0.0; + inherit: "focused" 0.0; + color: 255 255 255 255; + } + } + } + programs { + program { + name: MAIN_BTN_NORMAL; + signal: MAIN_BTN_NORMAL; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_FOCUSED; + signal: MAIN_BTN_FOCUSED; + source: MAIN_BTN; + action: STATE_SET "focused" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_UNFOCUSED; + signal: MAIN_BTN_UNFOCUSED; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_HIGHLIGHT; + signal: MAIN_BTN_HIGHLIGHT; + source: MAIN_BTN; + action: STATE_SET "highlight" 0.0; + target: "icon"; + } + } +} + +group { + name: "system"; + images { + image: "ico_settings_system.png" COMP; + } + parts { + part { + name: "icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: "ico_settings_system.png"; + color: 255 255 255 153; + } + description { + state: "focused" 0.0; + image.normal: "ico_settings_system.png"; + } + description { + state: "highlight" 0.0; + inherit: "focused" 0.0; + color: 255 255 255 255; + } + } + } + programs { + program { + name: MAIN_BTN_NORMAL; + signal: MAIN_BTN_NORMAL; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_FOCUSED; + signal: MAIN_BTN_FOCUSED; + source: MAIN_BTN; + action: STATE_SET "focused" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_UNFOCUSED; + signal: MAIN_BTN_UNFOCUSED; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_HIGHLIGHT; + signal: MAIN_BTN_HIGHLIGHT; + source: MAIN_BTN; + action: STATE_SET "highlight" 0.0; + target: "icon"; + } + } +} + +group { + name: "support"; + images { + image: "ico_settings_support.png" COMP; + } + parts { + part { + name: "icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: "ico_settings_support.png"; + color: 255 255 255 153; + } + description { + state: "focused" 0.0; + image.normal: "ico_settings_support.png"; + } + description { + state: "highlight" 0.0; + inherit: "focused" 0.0; + color: 255 255 255 255; + } + } + } + programs { + program { + name: MAIN_BTN_NORMAL; + signal: MAIN_BTN_NORMAL; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_FOCUSED; + signal: MAIN_BTN_FOCUSED; + source: MAIN_BTN; + action: STATE_SET "focused" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_UNFOCUSED; + signal: MAIN_BTN_UNFOCUSED; + source: MAIN_BTN; + action: STATE_SET "default" 0.0; + target: "icon"; + } + program { + name: MAIN_BTN_HIGHLIGHT; + signal: MAIN_BTN_HIGHLIGHT; + source: MAIN_BTN; + action: STATE_SET "highlight" 0.0; + target: "icon"; + } + } +} \ No newline at end of file diff --git a/data/viewer/maincatalog.edc b/data/viewer/maincatalog.edc new file mode 100755 index 0000000..92be2bb --- /dev/null +++ b/data/viewer/maincatalog.edc @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: MAIN_VIEW_PAGE; + images{ + image: "settings_bg.png" COMP; + image: "ico_settings.png" COMP; + image: "settings_bg_shadow.png" COMP; + } + parts { + part { + name: MAIN_VIEW_PADDING_LEFT_TOP; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 102.5*2 43*2; + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_BG; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 755*2 454*2; + rel1 { + to: MAIN_VIEW_PADDING_LEFT_TOP; + relative: 1.0 1.0; + } + rel2 { + to: MAIN_VIEW_PADDING_LEFT_TOP; + } + color: 0 0 0 0; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: MAIN_VIEW_BG_IMAGE; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "settings_bg.png"; + } + rel1 { + to: MAIN_VIEW_BG; + } + rel2 { + to: MAIN_VIEW_BG; + } + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_PADDING_BG_SHADOW; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 434 0; + rel1 { + to: MAIN_VIEW_BG; + } + rel2 { + to: MAIN_VIEW_BG; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_BG_SHADOW_IMAGE; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 19 908; + image { + normal: "settings_bg_shadow.png"; + } + rel1 { + to: MAIN_VIEW_PADDING_BG_SHADOW; + relative: 1.0 1.0; + } + rel2 { + to: MAIN_VIEW_PADDING_BG_SHADOW; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: MAIN_VIEW_PADDING_ICON; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 55 64; + rel1 { + to: MAIN_VIEW_PADDING_LEFT_TOP; + relative: 1.0 1.0; + } + rel2 { + to: MAIN_VIEW_PADDING_LEFT_TOP; + } + fixed: 1 1; + visible: 0; + color: 255 0 0 255; + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_ICON; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 80 80; + image { + normal: "ico_settings.png"; + } + rel1 { + to: MAIN_VIEW_PADDING_ICON; + relative: 1.0 1.0; + } + rel2 { + to: MAIN_VIEW_PADDING_ICON; + } + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_PADDING_TEXT; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 155 64; + rel1 { + to: MAIN_VIEW_PADDING_LEFT_TOP; + relative: 1.0 1.0; + } + rel2 { + to: MAIN_VIEW_PADDING_LEFT_TOP; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 259 80; + text { + text: "SETTINGS"; + size: 50; + align: 0.0 0.5; + } + rel1 { + to: MAIN_VIEW_PADDING_TEXT; + relative: 1.0 1.0; + } + rel2 { + to: MAIN_VIEW_PADDING_TEXT; + } + color: 255 255 255 255; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_PADDING_TOPCORNER; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 104*2; + rel1 { + to: MAIN_VIEW_BG; + } + rel2 { + to: MAIN_VIEW_BG; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_ICON_SWALLOW; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + min: 217*2 280*2; + rel1 { + to: MAIN_VIEW_PADDING_TOPCORNER; + relative: 1.0 1.0; + } + rel2 { + to: MAIN_VIEW_PADDING_TOPCORNER; + } + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_PADDING_SUBITEM; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + min: 434 208; + rel1 { + to: MAIN_VIEW_PADDING_LEFT_TOP; + relative: 1.0 1.0; + } + rel2 { + to: MAIN_VIEW_PADDING_LEFT_TOP; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: MAIN_VIEW_SUBITEM_SWALLOW; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + min: 1076 82; + rel1 { + to: MAIN_VIEW_PADDING_SUBITEM; + relative: 1.0 1.0; + } + rel2 { + to: MAIN_VIEW_PADDING_SUBITEM; + } + fixed: 1 1; + align: 0.0 0.0; + } + } + } + programs { + program { + name: MAIN_VIEW_LOAD; + signal: MAIN_VIEW_LOAD; + source: ""; + action: STATE_SET "default" 0.0; + target: MAIN_VIEW_BG_IMAGE; + transition: LINEAR 0.2; + after: MAIN_VIEW_ANIM_FINISH; + } + program { + name: MAIN_VIEW_ANIM_FINISH; + action: SIGNAL_EMIT MAIN_VIEW_ANIM_FINISH MAIN_VIEW_SOURCE; + } + } +} + diff --git a/data/viewer/sublist.edc b/data/viewer/sublist.edc new file mode 100644 index 0000000..53d4367 --- /dev/null +++ b/data/viewer/sublist.edc @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: SUBLIST_VIEW_PAGE; + parts { + part { + name: SUBLIST_VIEW_BG; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1920 1080; + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + color: 0 0 0 130; + } + } + } +} \ No newline at end of file diff --git a/data/widget/button.edc b/data/widget/button.edc new file mode 100644 index 0000000..00056b3 --- /dev/null +++ b/data/widget/button.edc @@ -0,0 +1,1718 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group{ + name: MAINICONBTN; + images { + image: "allbrowser_menu_bg.png" COMP; + } + parts { + part { + name: MAINICONBTN_BG; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 434 80; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: MAINICONBTN_HIGHLIGHT; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "allbrowser_menu_bg.png"; + } + rel1 { + to: MAINICONBTN_BG; + } + rel2 { + to: MAINICONBTN_BG; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 69 143 255 204; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 69 143 255 51; + } + } + part { + name: MAINICONBTN_PADDING_ICON; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 75 20; + rel1 { + to: MAINICONBTN_BG; + } + rel2 { + to: MAINICONBTN_BG; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: MAINICONBTN_ICON_SWALLOW; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 20*2 20*2; + rel1 { + to: MAINICONBTN_PADDING_ICON; + relative: 1.0 1.0; + } + rel2 { + to: MAINICONBTN_PADDING_ICON; + } + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: MAINICONBTN_PADDING_TEXT; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 75*2 10*2; + rel1 { + to: MAINICONBTN_BG; + } + rel2 { + to: MAINICONBTN_BG; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: MAINICONBTN_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 264 40; + rel1 { + to: MAINICONBTN_PADDING_TEXT; + relative: 1.0 1.0; + } + rel2 { + to: MAINICONBTN_PADDING_TEXT; + } + text { + size: 30; + font: TEXT_STYLE_REGULAR; + align: 0.0 0.5; + } + color: 255 255 255 153; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text { + font: TEXT_STYLE_BOLD; + } + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "normal"; + signal: "state,normal"; + source: ""; + action: STATE_SET "default" 0.0; + target: MAINICONBTN_TEXT; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: MAINICONBTN_TEXT; + target: MAINICONBTN_HIGHLIGHT; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: MAINICONBTN_TEXT; + target: MAINICONBTN_HIGHLIGHT; + } + program { + name: MAINICONBTN_FOCUSED_ON_SUBITEM; + signal: MAINICONBTN_FOCUSED_ON_SUBITEM; + source: MAINICONBTN_MAIN_ITEM_SOURCE; + action: STATE_SET "highlight" 0.0; + target: MAINICONBTN_TEXT; + target: MAINICONBTN_HIGHLIGHT; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: MAINICONBTN_HIGHLIGHT; + target: MAINICONBTN_TEXT; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focused" 0.0; + target: MAINICONBTN_HIGHLIGHT; + target: MAINICONBTN_TEXT; + } + } +} + +group { + name: SUBITEMBTN; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1076 82; + visible: 0; + align: 0.0 0.0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 69 143 255 255; + } + } + part { + name: "sub-btn-value-padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 776 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: SUBITEMBTN_VALUE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 230 82; + rel1 { + to: "sub-btn-value-padding"; + relative: 1.0 1.0; + } + rel2 { + to: "sub-btn-value-padding"; + } + text { + font: TEXT_STYLE_REGULAR; + size: 30; + align: 1.0 0.5; + } + color: 255 255 255 204; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 211 211 211 76.5; + } + } + part{ + name: SUBITEMBTN_PADDING_LINE; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 80; + rel1 { + to: SUBITEMBTN_BG; + } + rel2 { + to: SUBITEMBTN_BG; + relative: 0.0 0.0; + } + visible: 0; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: SUBITEMBTN_LINE; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1076 2; + rel1 { + to: SUBITEMBTN_PADDING_LINE; + relative: 1.0 1.0; + } + rel2 { + to: SUBITEMBTN_PADDING_LINE; + } + visible: 1; + align: 0.0 0.0; + fixed: 1 1; + color: 255 255 255 252/10; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: SUBITEMBTN_PADDING_TEXT; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 70 0; + rel1 { + to: SUBITEMBTN_BG; + } + rel2 { + to: SUBITEMBTN_BG; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: SUBITEMBTN_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 455 82; + rel1 { + to: SUBITEMBTN_PADDING_TEXT; + relative: 1.0 1.0; + } + rel2 { + to: SUBITEMBTN_PADDING_TEXT; + } + text { + font: TEXT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 204; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "highlighted" 0.0; + inherit: "default" 0.0; + color: 69 143 255 51; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 211 211 211 76.5; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "normal"; + signal: "state,normal"; + source: ""; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_BG; + target: SUBITEMBTN_LINE; + target: SUBITEMBTN_VALUE; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_BG; + target: SUBITEMBTN_LINE; + target: SUBITEMBTN_VALUE; + } + program { + name: SUBITEMBTN_BUTTON_CLICKED; + signal: SUBITEMBTN_BUTTON_CLICKED; + source: SUBITEMBTN_BUTTON_SOURCE; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_BG; + target: SUBITEMBTN_LINE; + target: SUBITEMBTN_VALUE; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "selected" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_BG; + target: SUBITEMBTN_LINE; + target: SUBITEMBTN_VALUE; + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "dim" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_VALUE; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_VALUE; + } + } +} + +group { + name: "elm/button/base/subbtn_item_title_icon"; + images { + image: "ico_hyperlink_arrow.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1076 82; + visible: 0; + align: 0.0 0.0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 69 143 255 255; + } + } + part { + name: "subbtn_item_icon_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 976 26; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 30 30; + image { + normal: "ico_hyperlink_arrow.png"; + } + rel1 { + to: "subbtn_item_icon_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "subbtn_item_icon_padding"; + } + color: 255 255 255 178.5; + fixed: 1 1; + align: 0.0 0.0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 211 211 211 76.5; + } + } + part{ + name: "line_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 80; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + visible: 0; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1076 2; + rel1 { + to: "line_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "line_padding"; + } + visible: 1; + align: 0.0 0.0; + fixed: 1 1; + color: 255 255 255 252/10; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 70 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: SUBITEMBTN_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 880 82; + rel1 { + to: "text_padding"; + relative: 1 1; + } + rel2 { + to: "text_padding"; + } + text { + font: TEXT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 204; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "highlighted" 0.0; + inherit: "default" 0.0; + color: 69 143 255 51; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 211 211 211 76.5; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "normal"; + signal: "state,normal"; + source: ""; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: SUBITEMBTN_TEXT; + target: "bg"; + target: "line"; + target: "icon"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: "bg"; + target: "line"; + target: "icon"; + } + program { + name: SUBITEMBTN_BUTTON_CLICKED; + signal: SUBITEMBTN_BUTTON_CLICKED; + source: SUBITEMBTN_BUTTON_SOURCE; + action: STATE_SET "selected" 0.0; + target: "bg"; + target: "line"; + target: "icon"; + target: SUBITEMBTN_TEXT; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: "bg"; + target: "line"; + target: "icon"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "selected" 0.0; + target: SUBITEMBTN_TEXT; + target: "bg"; + target: "line"; + target: "icon"; + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "dim" 0.0; + target: SUBITEMBTN_TEXT; + target: "icon"; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: "icon"; + } + } +} + +group { + name: "elm/button/base/subbtn_item_title_slider_value"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1076 82; + visible: 0; + align: 0.0 0.0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 69 143 255 255; + } + } + part { + name: "subbtn_g_value_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 570-10 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: SUBITEMBTN_G_VALUE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 70+10 82; + rel1 { + to: "subbtn_g_value_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "subbtn_g_value_padding"; + } + text { + font: TEXT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 204; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 211 211 211 76.5; + } + } + part { + name: "sub-btn-value-padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 936 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: SUBITEMBTN_VALUE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 70 82; + rel1 { + to: "sub-btn-value-padding"; + relative: 1.0 1.0; + } + rel2 { + to: "sub-btn-value-padding"; + } + text { + font: TEXT_STYLE_REGULAR; + size: 30; + align: 1.0 0.5; + } + color: 255 255 255 204; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 211 211 211 76.5; + } + } + part { + name: "slider_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + min: 648 37; + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: SUBITEMBTN_SLIDER_SWALLOW; + type: "SWALLOW"; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "slider_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "slider_swallow_padding"; + } + min: 280 8; + fixed: 1 1; + align: 0.0 0.0; + } + } + part{ + name: SUBITEMBTN_PADDING_LINE; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 80; + rel1 { + to: SUBITEMBTN_BG; + } + rel2 { + to: SUBITEMBTN_BG; + relative: 0.0 0.0; + } + visible: 0; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: SUBITEMBTN_LINE; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1076 2; + rel1 { + to: SUBITEMBTN_PADDING_LINE; + relative: 1.0 1.0; + } + rel2 { + to: SUBITEMBTN_PADDING_LINE; + } + visible: 1; + align: 0.0 0.0; + fixed: 1 1; + color: 255 255 255 252/10; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: SUBITEMBTN_PADDING_TEXT; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 70 0; + rel1 { + to: SUBITEMBTN_BG; + } + rel2 { + to: SUBITEMBTN_BG; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: SUBITEMBTN_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 455 82; + rel1 { + to: SUBITEMBTN_PADDING_TEXT; + relative: 1.0 1.0; + } + rel2 { + to: SUBITEMBTN_PADDING_TEXT; + } + text { + font: TEXT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 204; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "highlighted" 0.0; + inherit: "default" 0.0; + color: 69 143 255 51; + text { + font: TEXT_STYLE_BOLD; + } + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 211 211 211 76.5; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "normal"; + signal: "state,normal"; + source: ""; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_G_VALUE; + target: SUBITEMBTN_VALUE; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "selected" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_BG; + target: SUBITEMBTN_LINE; + target: SUBITEMBTN_G_VALUE; + target: SUBITEMBTN_VALUE; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_BG; + target: SUBITEMBTN_LINE; + target: SUBITEMBTN_G_VALUE; + target: SUBITEMBTN_VALUE; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_BG; + target: SUBITEMBTN_LINE; + target: SUBITEMBTN_G_VALUE; + target: SUBITEMBTN_VALUE; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "selected" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_BG; + target: SUBITEMBTN_LINE; + target: SUBITEMBTN_G_VALUE; + target: SUBITEMBTN_VALUE; + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "dim" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_G_VALUE; + target: SUBITEMBTN_VALUE; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: SUBITEMBTN_TEXT; + target: SUBITEMBTN_G_VALUE; + target: SUBITEMBTN_VALUE; + } + } +} + +group{ + name: CTXPOPUPBTN; + images { + image: "ico_spincontrol_check.png" COMP; + } + parts { + part { + name: CTXPOPUPBTN_BG; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 310 82; + color: 255 255 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + } + } + part { + name: CTXPOPUPBTN_PADDING_ICON; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 260 27; + rel1 { + to: CTXPOPUPBTN_BG; + } + rel2 { + to: CTXPOPUPBTN_BG; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: CTXPOPUPBTN_ICON; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_spincontrol_check.png"; + } + min: 26 26; + rel1 { + to: CTXPOPUPBTN_PADDING_ICON; + relative: 1.0 1.0; + } + rel2 { + to: CTXPOPUPBTN_PADDING_ICON; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + description { + state: "showed" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + visible: 1; + } + } + part{ + name: CTXPOPUPBTN_PADDING_LINE; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 80; + rel1 { + to: CTXPOPUPBTN_BG; + } + rel2 { + to: CTXPOPUPBTN_BG; + relative: 0.0 0.0; + } + visible: 0; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: CTXPOPUPBTN_LINE; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 310 2; + rel1 { + to: CTXPOPUPBTN_PADDING_LINE; + relative: 1.0 1.0; + } + rel2 { + to: CTXPOPUPBTN_PADDING_LINE; + } + align: 0.0 0.0; + fixed: 1 1; + color: 222 222 222 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + } + } + part { + name: CTXPOPUPBTN_PADDING_TEXT; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 32 0; + rel1 { + to: CTXPOPUPBTN_BG; + } + rel2 { + to: CTXPOPUPBTN_BG; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: CTXPOPUPBTN_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 208 80; + rel1 { + relative: 1.0 1.0; + to: CTXPOPUPBTN_PADDING_TEXT; + } + rel2 { + to: CTXPOPUPBTN_PADDING_TEXT; + } + color:89 89 89 255; + text { + font: TEXT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + text.style: Bold; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text.style: Bold; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "normal"; + signal: "state,normal"; + source: ""; + action: STATE_SET "default" 0.0; + target: CTXPOPUPBTN_TEXT; + target: CTXPOPUPBTN_BG; + } + program { + name: CTXPOPUPBTN_BUTTON_FOCUSED; + signal: CTXPOPUPBTN_BUTTON_FOCUSED; + source: CTXPOPUPBTN_BUTTON_SOURCE; + action: STATE_SET "focused" 0.0; + target: CTXPOPUPBTN_TEXT; + target: CTXPOPUPBTN_BG; + target: CTXPOPUPBTN_LINE; + } + program { + name: CTXPOPUPBTN_BUTTON_UNFOCUSED; + signal: CTXPOPUPBTN_BUTTON_UNFOCUSED; + source: CTXPOPUPBTN_BUTTON_SOURCE; + action: STATE_SET "default" 0.0; + target: CTXPOPUPBTN_TEXT; + target: CTXPOPUPBTN_BG; + target: CTXPOPUPBTN_LINE; + } + program { + name: CTXPOPUPBTN_BUTTON_HIGHLIGHT; + signal: CTXPOPUPBTN_BUTTON_HIGHLIGHT; + source: CTXPOPUPBTN_BUTTON_SOURCE; + action: STATE_SET "selected" 0.0; + target: CTXPOPUPBTN_TEXT; + target: CTXPOPUPBTN_ICON; + target: CTXPOPUPBTN_BG; + target: CTXPOPUPBTN_LINE; + } + program { + name: CTXPOPUPBTN_ICON_FOCUSED; + signal: CTXPOPUPBTN_ICON_FOCUSED; + source: CTXPOPUPBTN_ICON_SOURCE; + action: STATE_SET "showed" 0.0; + target: CTXPOPUPBTN_ICON; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: CTXPOPUPBTN_TEXT; + target: CTXPOPUPBTN_BG; + target: CTXPOPUPBTN_LINE; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focused" 0.0; + target: CTXPOPUPBTN_TEXT; + target: CTXPOPUPBTN_BG; + target: CTXPOPUPBTN_LINE; + } + } +} + +group { + name: "elm/button/base/basic_btn"; + images { + image: "round_rectangle_4X4.png" COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 216 70; + image { + normal: "round_rectangle_4X4.png"; + border: 4 4 4 4; + } + color: 204 204 204 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 204 204 204 102; + } + } + part { + name: "bg_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 176 70; + rel1 { + to: "bg_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "bg_text_padding"; + } + text { + font: TEXT_STYLE_MEDIUM; + size: 28; + } + color: 89 89 89 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text.style: Bold; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 102; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + } +} + +group { + name: "elm/button/base/input_passcode_btn"; + images { + image: "search_searchbar_small_bg_foc.png" COMP; + image: "search_searchbar_small_bg_nor.png" COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 59 59; + image { + normal: "search_searchbar_small_bg_nor.png"; + border: 2 2 2 2; + border_scale: 1; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + image { + normal: "search_searchbar_small_bg_foc.png"; + border: 4 4 4 4; + } + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + image { + normal: "search_searchbar_small_bg_nor.png"; + border: 2 2 2 2; + } + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + } + text { + size: 34; + min: 0 0; + max: 1 0; + } + color: 61 61 61 255; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + } +} \ No newline at end of file diff --git a/data/widget/ctxpopup.edc b/data/widget/ctxpopup.edc new file mode 100644 index 0000000..46d55c8 --- /dev/null +++ b/data/widget/ctxpopup.edc @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: SUBLIST_CTXPOPUP1; + parts { + part { + name: SUBLIST_CTXPOPUP1_CLIPPER; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 310 82; + max: 310 82*8; + } + } + part { + name: SUBLIST_CTXPOPUP1_SWALLOW_CONTENT; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 310 82; + max: 310 82*8; + rel1 { + to: SUBLIST_CTXPOPUP1_CLIPPER; + } + rel2 { + to: SUBLIST_CTXPOPUP1_CLIPPER; + relative: 0.0 0.0; + } + align: 0.0 0.0; + } + } + } +} + +group { + name: SUBLIST_CTXPOPUP2; + images { + image: "btn_down.png" COMP; + image: "btn_up.png" COMP; + } + parts { + part { + name: SUBLIST_CTXPOPUP2_CLIPPER; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 310 82*8+39*2; + } + } + part { + name: SUBLIST_CTXPOPUP2_TOP_PADDING; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 39; + rel1 { + to: SUBLIST_CTXPOPUP2_CLIPPER; + } + rel2 { + to: SUBLIST_CTXPOPUP2_CLIPPER; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: SUBLIST_CTXPOPUP2_SWALLOW_CONTENT; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 310 82*8; + rel1 { + to: SUBLIST_CTXPOPUP2_TOP_PADDING; + relative: 1.0 1.0; + } + rel2 { + to: SUBLIST_CTXPOPUP2_TOP_PADDING; + } + align: 0.0 0.0; + } + } + part { + name: SUBLIST_CTXPOPUP2_PADDING_UPARROW; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 155-11 15; + rel1 { + to: SUBLIST_CTXPOPUP2_CLIPPER; + } + rel2 { + to: SUBLIST_CTXPOPUP2_CLIPPER; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part{ + name: SUBLIST_CTXPOPUP2_UPARROW; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 22 9; + image { + normal: "btn_up.png"; + } + rel1 { + relative: 1.0 1.0; + to: SUBLIST_CTXPOPUP2_PADDING_UPARROW; + } + rel2{ + to: SUBLIST_CTXPOPUP2_PADDING_UPARROW; + } + visible: 0; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 69 143 255 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: SUBLIST_CTXPOPUP2_PADDING_DOWNARROW; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 155-11 82*8+39+15; + rel1 { + to: SUBLIST_CTXPOPUP2_CLIPPER; + } + rel2 { + to: SUBLIST_CTXPOPUP2_CLIPPER; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part{ + name: SUBLIST_CTXPOPUP2_DOWNARROW; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 22 9; + image { + normal: "btn_down.png"; + } + rel1 { + relative: 1.0 1.0; + to: SUBLIST_CTXPOPUP2_PADDING_DOWNARROW; + } + rel2{ + to: SUBLIST_CTXPOPUP2_PADDING_DOWNARROW; + } + visible: 0; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 69 143 255 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { + name: SUBLIST_SHOW_DOWN_ARROW; + signal: SUBLIST_SHOW_DOWN_ARROW; + source: ""; + script { + set_state(PART:SUBLIST_CTXPOPUP2_UPARROW, "default", 0.0); + set_state(PART:SUBLIST_CTXPOPUP2_DOWNARROW, "visible", 0.0); + } + } + program { + name: SUBLIST_SHOW_UP_ARROW; + signal: SUBLIST_SHOW_UP_ARROW; + source: ""; + script { + set_state(PART:SUBLIST_CTXPOPUP2_DOWNARROW, "default", 0.0); + set_state(PART:SUBLIST_CTXPOPUP2_UPARROW, "visible", 0.0); + } + } + program { + name: SUBLIST_SHOW_BOTH_ARROW; + signal: SUBLIST_SHOW_BOTH_ARROW; + source: ""; + script { + set_state(PART:SUBLIST_CTXPOPUP2_DOWNARROW, "visible", 0.0); + set_state(PART:SUBLIST_CTXPOPUP2_UPARROW, "visible", 0.0); + } + } + program { + name: SUBLIST_HIDE_BOTH_ARROW; + signal: SUBLIST_HIDE_BOTH_ARROW; + source: ""; + script { + set_state(PART:SUBLIST_CTXPOPUP2_DOWNARROW, "default", 0.0); + set_state(PART:SUBLIST_CTXPOPUP2_UPARROW, "default", 0.0); + } + } + } +} + +group { name: "elm/ctxpopup/base/change_passcode_ctxpopup"; + parts { + part { + name: elm.swallow.content; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 688 411; + max: 688 411; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.0 0.0; + } + align: 0.0 0.0; + } + } + } +} diff --git a/data/widget/progressbar.edc b/data/widget/progressbar.edc new file mode 100644 index 0000000..75109b9 --- /dev/null +++ b/data/widget/progressbar.edc @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "elm/progressbar/horizontal/subitembtnprogress"; + parts { + part { + name: "elm.background.progressbar"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + part { + name: "elm.swallow.bar"; + scale: 1; + type: SWALLOW; + description { + state: "default" 0.0; + min: 0 8; + max: 99999 16; + rel1 { + to_y: "elm.background.progressbar"; + } + rel2 { + to: "elm.background.progressbar"; + } + } + } + part { + name: "background"; + type: RECT; + scale: 1; + clip_to: "elm.background.progressbar"; + description { + state: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.swallow.bar"; + relative: 1.0 1.0; + } + color: 0 0 0 76.5; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 25.5; + } + } + part { + name: "elm.progress.progressbar"; + type: RECT; + scale: 1; + clip_to: "elm.background.progressbar"; + description { + state: "default" 0.0; + min: 0 0; + fixed: 1 0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.0 0.0; + } + rel2 { + to_y: "elm.swallow.bar"; + to_x: "elm.cur.progressbar"; + offset: -1 -1; + } + color: 103 115 136 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 178.5; + } + description { + state: "invert" 0.0; + inherit: "default" 0.0; + rel1 { + to_y: "elm.swallow.bar"; + to_x: "elm.cur.progressbar"; + } + rel2 { + to: "elm.swallow.bar"; + relative: 1.0 1.0; + } + } + description { + state: "state_begin" 0.0; + inherit: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.swallow.bar"; + relative: 0.1 1.0; + } + } + description { + state: "state_end" 0.0; + inherit: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.9 0.0; + } + rel2 { + to: "elm.swallow.bar"; + relative: 1.0 1.0; + } + } + } + part { + name: "elm.cur.progressbar"; + scale: 1; + dragable { + confine: "background"; + x: 1 1 1; + y: 0 0 0; + } + description { + state: "default" 0.0; + min: 0 18; + fixed: 1 1; + visible: 0; + rel1 { + to: "background"; + relative: 0.0 0.0; + } + rel2 { + to: "background"; + } + } + } + } + programs { + program { + name: "focused"; + signal: SIG_UNCTRL_PB_FOCUSED; + source: SRC_PB_PROG; + action: STATE_SET "focused" 0.0; + target: "background"; + target: "elm.progress.progressbar"; + } + program { + name: "unfocused"; + signal: SIG_UNCTRL_PB_UNFOCUSED; + source: SRC_PB_PROG; + action: STATE_SET "default" 0.0; + target: "background"; + target: "elm.progress.progressbar"; + } + } +} + +group { + name: "elm/progressbar/horizontal/update_progressbar"; + parts { + part { + name: "elm.background.progressbar"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + part { + name: "elm.swallow.bar"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 0 16; + max: 99999 16; + rel1 { + to_y: "elm.background.progressbar"; + } + rel2 { + to: "elm.background.progressbar"; + } + } + } + part { + name: "background"; + type: RECT; + scale: 1; + clip_to: "elm.background.progressbar"; + description { + state: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.swallow.bar"; + relative: 1.0 1.0; + } + color: 0 0 0 25.5; + } + } + part { + name: "elm.progress.progressbar"; + type: RECT; + scale: 1; + clip_to: "elm.background.progressbar"; + description { + state: "default" 0.0; + min: 0 0; + fixed: 1 0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.0 0.0; + } + rel2 { + to_y: "elm.swallow.bar"; + to_x: "elm.cur.progressbar"; + offset: -1 -1; + } + color: 69 143 255 255; + } + description { + state: "invert" 0.0; + inherit: "default" 0.0; + rel1 { + to_y: "elm.swallow.bar"; + to_x: "elm.cur.progressbar"; + } + rel2 { + to: "elm.swallow.bar"; + relative: 1.0 1.0; + } + } + description { + state: "state_begin" 0.0; + inherit: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.swallow.bar"; + relative: 0.1 1.0; + } + } + description { + state: "state_end" 0.0; + inherit: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.9 0.0; + } + rel2 { + to: "elm.swallow.bar"; + relative: 1.0 1.0; + } + } + } + part { + name: "elm.cur.progressbar"; + scale: 1; + dragable { + confine: "background"; + x: 1 1 1; + y: 0 0 0; + } + description { + state: "default" 0.0; + min: 0 18; + fixed: 1 1; + visible: 0; + rel1 { + to: "background"; + relative: 0 0; + } + rel2 { + to: "background"; + } + } + } + part { + name: "textpadding"; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to: "background"; + } + rel2 { + relative:1.0 0.0; + to: "background"; + } + align: 0.0 0.0; + min: 32 32; + fixed: 1 1; + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + effect: SHADOW BOTTOM; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.5; + to: "textpadding"; + } + rel2 { + relative:1.0 0.5; + to: "textpadding"; + } + align: 0.0 0.0; + color:255 255 255 255; + text { + font: APP_TEXT_FONT; + size: 18*2; + min: 1 0; + text_class: "tizen"; + } + fixed: 1 1; + } + } + } +} + diff --git a/data/widget/scroller.edc b/data/widget/scroller.edc new file mode 100644 index 0000000..add5e15 --- /dev/null +++ b/data/widget/scroller.edc @@ -0,0 +1,430 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "elm/scroller/base/sublist_scroller"; + + data { + item: "focus_highlight" "on"; + } + + script { + public sbvis_v, sbvis_h, sbalways_v, sbalways_h, sbvis_timer; + public timer0(val) { + new v; + v = get_int(sbvis_v); + if (v) { + v = get_int(sbalways_v); + if (!v) { + emit("do-hide-vbar", ""); + set_int(sbvis_v, 0); + } + } + v = get_int(sbvis_h); + if (v) { + v = get_int(sbalways_h); + if (!v) { + emit("do-hide-hbar", ""); + set_int(sbvis_h, 0); + } + } + set_int(sbvis_timer, 0); + return 0; + } + } + images { + image: "scrollbar_horizontal.png" COMP; + image: "scrollbar_vertical.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 255 255 255 0; + } + } + part { + name: "clipper"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + } + } + } + part { + name: "elm.swallow.content"; + clip_to: "clipper"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + } + } + } + part { + name: "sb_vbar_clip_master"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + } + description { + state: "hidden" 0.0; + visible: 0; + color: 255 255 255 0; + } + } + part { + name: "sb_vbar_clip"; + clip_to: "sb_vbar_clip_master"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + } + description { + state: "hidden" 0.0; + visible: 0; + color: 255 255 255 0; + } + } + part { + name: "sb_vbar"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + visible: 0; + min: 8 9; + align: 1.0 0.0; + rel1 { + relative: 1.0 0.0; + offset: 0 2; + to_y: "elm.swallow.content"; + to_x: "elm.swallow.content"; + } + rel2 { + relative: 1.0 0.0; + offset: 0 2; + to_y: "sb_hbar"; + to_x: "elm.swallow.content"; + } + } + } + part { + name: "elm.dragable.vbar"; + clip_to: "sb_vbar_clip"; + scale: 1; + dragable { + x: 0 0 0; + y: 1 1 0; + confine: "sb_vbar"; + } + description { + state: "default" 0.0; + fixed: 1 1; + min: 8 9; + max: 8 99; + color: 0 0 0 64; + rel1 { + relative: 0.5 0.5; + offset: 0 0; + to: "sb_vbar"; + } + rel2 { + relative: 0.5 0.5; + offset: 0 0; + to: "sb_vbar"; + } + image { + normal: "scrollbar_vertical.png"; + border: 8 8 4 4; + middle: SOLID; + } + } + } + part { + name: "sb_hbar_clip_master"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + } + description { + state: "hidden" 0.0; + visible: 0; + color: 255 255 255 0; + } + } + part { + name: "sb_hbar_clip"; + clip_to: "sb_hbar_clip_master"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + } + description { + state: "hidden" 0.0; + visible: 0; + color: 255 255 255 0; + } + } + part { + name: "sb_hbar"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + visible: 0; + min: 9 8; + align: 0.0 1.0; + rel1 { + relative: 0.0 1.0; + offset: 2 0; + to_x: "elm.swallow.content"; + to_y: "elm.swallow.content"; + } + rel2 { + relative: 0.0 1.0; + offset: -1 -1; + to_x: "sb_vbar"; + to_y: "elm.swallow.content"; + } + } + } + part { + name: "elm.dragable.hbar"; + clip_to: "sb_hbar_clip"; + scale: 1; + dragable { + x: 1 1 0; + y: 0 0 0; + confine: "sb_hbar"; + } + description { + state: "default" 0.0; + fixed: 1 1; + min: 9 8; + max: 99 8; + color: 0 0 0 64; + rel1 { + relative: 0.5 0.5; + offset: 0 0; + to: "sb_hbar"; + } + rel2 { + relative: 0.5 0.5; + offset: 0 0; + to: "sb_hbar"; + } + image { + normal: "scrollbar_horizontal.png"; + border: 4 4 8 8; + middle: SOLID; + } + } + } + } + programs { + program { + name: "load"; + signal: "load"; + source: ""; + script { + set_state(PART:"sb_hbar_clip", "hidden", 0.0); + set_state(PART:"sb_vbar_clip", "hidden", 0.0); + set_int(sbvis_h, 0); + set_int(sbvis_v, 0); + set_int(sbalways_v, 0); + set_int(sbalways_h, 0); + set_int(sbvis_timer, 0); + } + } + + program { + name: "vbar_show"; + signal: "elm,action,show,vbar"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "sb_vbar_clip_master"; + } + program { + name: "vbar_hide"; + signal: "elm,action,hide,vbar"; + source: "elm"; + action: STATE_SET "hidden" 0.0; + target: "sb_vbar_clip_master"; + } + program { + name: "vbar_show_always"; + signal: "elm,action,show_always,vbar"; + source: "elm"; + script { + new v; + v = get_int(sbvis_v); + v |= get_int(sbalways_v); + if (!v) { + set_int(sbalways_v, 0); + emit("do-show-vbar", ""); + set_int(sbvis_v, 1); + v = timer(5.0, "timer0", 0); + set_int(sbvis_timer, v); + } + } + } + program { + name: "vbar_show_notalways"; + signal: "elm,action,show_notalways,vbar"; + source: "elm"; + script { + new v; + v = get_int(sbalways_v); + if (v) { + set_int(sbalways_v, 0); + v = get_int(sbvis_v); + if (!v) { + emit("do-hide-vbar", ""); + set_int(sbvis_v, 0); + } + } + } + } + program { + name: "sb_vbar_show"; + signal: "do-show-vbar"; + source: ""; + action: STATE_SET "default" 0.0; + transition: LINEAR 0.5; + target: "sb_vbar_clip"; + } + program { + name: "sb_vbar_hide"; + signal: "do-hide-vbar"; + source: ""; + action: STATE_SET "hidden" 0.0; + transition: LINEAR 0.5; + target: "sb_vbar_clip"; + } + program { + name: "hbar_show"; + signal: "elm,action,show,hbar"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "sb_hbar_clip_master"; + } + program { + name: "hbar_hide"; + signal: "elm,action,hide,hbar"; + source: "elm"; + action: STATE_SET "hidden" 0.0; + target: "sb_hbar_clip_master"; + } + program { + name: "hbar_show_always"; + signal: "elm,action,show_always,hbar"; + source: "elm"; + script { + new v; + v = get_int(sbvis_h); + v |= get_int(sbalways_h); + if (!v) { + set_int(sbalways_h, 1); + emit("do-show-hbar", ""); + set_int(sbvis_h, 1); + } + } + } + program { + name: "hbar_show_notalways"; + signal: "elm,action,show_notalways,hbar"; + source: "elm"; + script { + new v; + v = get_int(sbalways_h); + if (v) { + set_int(sbalways_h, 0); + v = get_int(sbvis_h); + if (!v) { + emit("do-hide-hbar", ""); + set_int(sbvis_h, 0); + } + } + } + } + program { + name: "sb_hbar_show"; + signal: "do-show-hbar"; + source: ""; + action: STATE_SET "default" 0.0; + transition: LINEAR 0.5; + target: "sb_hbar_clip"; + } + program { + name: "sb_hbar_hide"; + signal: "do-hide-hbar"; + source: ""; + action: STATE_SET "hidden" 0.0; + transition: LINEAR 0.5; + target: "sb_hbar_clip"; + } + + program { + name: "scroll"; + signal: "elm,action,scroll"; + source: "elm"; + script { + new v; + v = get_int(sbvis_v); + v |= get_int(sbalways_v); + if (!v) { + emit("do-show-vbar", ""); + set_int(sbvis_v, 1); + } + v = get_int(sbvis_h); + v |= get_int(sbalways_h); + if (!v) { + emit("do-show-hbar", ""); + set_int(sbvis_h, 1); + } + v = get_int(sbvis_timer); + if (v > 0) cancel_timer(v); + v = timer(5.0, "timer0", 0); + set_int(sbvis_timer, v); + } + } + } +} \ No newline at end of file diff --git a/include/data_wrapper.h b/include/data_wrapper.h new file mode 100644 index 0000000..020c740 --- /dev/null +++ b/include/data_wrapper.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DATA_WRAPPER_H__ +#define __DATA_WRAPPER_H__ + +#include +#include "stdlib.h" +#include "stdbool.h" +#include "parser.h" + +#define BUF_SIZE 1024 + +struct settingitem; +struct listitem; +struct slideritem; +struct settingmgr_data; +struct settingview_data; + +struct settingmgr_data *viewmgr_data_init(void); +void viewmgr_data_fini(struct settingmgr_data *data); + +struct settingitem *viewmgr_data_get_settingitem( + struct settingmgr_data *data, const char *name); +int viewmgr_data_read_jsonfile_into_hash( + struct settingmgr_data *data, const char *name); +struct settingview_data *viewmgr_data_build_view( + struct settingmgr_data *sdata, const char *name); + +Eina_List *settingitem_get_subitems(struct settingitem *sitem); +Eina_List *settingitem_get_group_list(struct settingitem *sitem); +const char *settingitem_get_parentitem(struct settingitem *item); +const char *settingitem_get_display_name(struct settingitem *item); +const char *settingitem_get_id(struct settingitem *item); +const char *settingitem_get_style(struct settingitem *item); +const char *settingitem_get_status(struct settingitem *item); +const char *settingitem_get_settingui_style(struct settingitem *item); +const char *settingitem_get_settingui_name(struct settingitem *item); +Eina_List *settingitem_get_settingui_args(struct settingitem *item); +const char *settingitem_get_data_key(struct settingitem *item); +const char *settingitem_get_data_type(struct settingitem *item); +Eina_List *settingitem_get_data_list(struct settingitem *item); +struct slideritem *settingitem_get_data_slideritem( + struct settingitem *item); + +const char *listitem_get_display_name(struct listitem *litem); +const char *listitem_get_value(struct listitem *litem); +const char *slideritem_get_min_value(struct slideritem *sitem); +const char *slideritem_get_step_value(struct slideritem *sitem); +const char *slideritem_get_max_value(struct slideritem *sitem); +const char *slideritem_get_min_display_value(struct slideritem *sitem); +const char *slideritem_get_step_display_value(struct slideritem *sitem); +const char *slideritem_get_max_display_value(struct slideritem *sitem); +double slideritem_find_slider_value(double val, struct slideritem *data); +double slideritem_find_slider_display_value( + double val, struct slideritem *data); + +struct settingitem *viewdata_get_parentitem(struct settingview_data *data); +Eina_Array *viewdata_get_childitems(struct settingview_data *data); +Eina_List *viewdata_get_childitems_list(struct settingview_data *view); +void viewdata_free_childitems_list(Eina_List *list); +struct settingview_data *viewdata_allocate(void); +void viewdata_release(struct settingview_data *data); + +Eina_List *settingitem_get_slider_group_list(struct settingitem *item, + struct settingmgr_data *sdata, const char *name); + +#endif /* __DATA_WRAPPER_H__ */ diff --git a/include/dbg.h b/include/dbg.h new file mode 100644 index 0000000..5641211 --- /dev/null +++ b/include/dbg.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DBG_H__ +#define __DBG_H__ + +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "org.tizen.settings-tv-ref" + +#ifndef _ERR +#define _ERR(fmt, args...) (LOGE("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#endif + +#ifndef _DBG +#define _DBG(fmt, args...) (LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#endif + +#ifndef _INFO +#define _INFO(fmt, args...) \ + (LOGI("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#endif + +#endif /* __DBG_H__ */ diff --git a/include/def.h b/include/def.h new file mode 100644 index 0000000..fed4bd5 --- /dev/null +++ b/include/def.h @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DEF_H__ +#define __DEF_H__ + +#define WIN_WIDTH 1920 +#define WIN_HEIGHT 1080 + +/*maincatalog.edc*/ +#define MAIN_VIEW_PAGE "main_catalog_page" +#define MAIN_VIEW_PADDING_LEFT_TOP "padding_left_top" +#define MAIN_VIEW_BG "bg" +#define MAIN_VIEW_BG_IMAGE "bg_image" +#define MAIN_VIEW_PADDING_BG_SHADOW "padding_bg_shadow" +#define MAIN_VIEW_BG_SHADOW_IMAGE "bg_shadow_image" +#define MAIN_VIEW_PADDING_ICON "padding_icon" +#define MAIN_VIEW_ICON "icon" +#define MAIN_VIEW_PADDING_TEXT "padding_text" +#define MAIN_VIEW_TEXT "text" +#define MAIN_VIEW_PADDING_TOPCORNER "padding_topcorner" +#define MAIN_VIEW_ICON_SWALLOW "iconswallowpart" +#define MAIN_VIEW_PADDING_SUBITEM "padding_subitem" +#define MAIN_VIEW_SUBITEM_SWALLOW "subitemswallow" +#define MAIN_VIEW_LOAD "view_load" +#define MAIN_VIEW_ANIM_FINISH "view_anim_finish" +#define MAIN_VIEW_SOURCE "base" + +/*sublist.edc*/ +#define SUBLIST_VIEW_PAGE "sublistpage" +#define SUBLIST_VIEW_BG "sublistpage_bg" + +/*bottomsublist.edc*/ +#define BOTTOMSUBLIST_VIEW_PAGE "bottom_sublist_page" +#define BOTTOMSUBLIST_VIEW_PADDING_BG "padding_bg" +#define BOTTOMSUBLIST_VIEW_BG "bg" +#define BOTTOMSUBLIST_VIEW_BG_IMAGE "bg_image" +#define BOTTOMSUBLIST_VIEW_PADDING_TITLE "padding_title" +#define BOTTOMSUBLIST_VIEW_TITLE "title" +#define BOTTOMSUBLIST_VIEW_PADDING_BOX "padding_box" +#define BOTTOMSUBLIST_VIEW_BOX "box_sublist" + +/*bottomslider.edc*/ +#define BOTTOMSLIDER_VIEW_PAGE "bottomslider_view_page" +#define BOTTOMSLIDER_VIEW_PADDING_BG "padding_bg" +#define BOTTOMSLIDER_VIEW_BG "bg" +#define BOTTOMSLIDER_VIEW_BG_IMAGE "bg_image" +#define BOTTOMSLIDER_VIEW_PADDING_TITLE "padding_title" +#define BOTTOMSLIDER_VIEW_TITLE "title" +#define BOTTOMSLIDER_VIEW_PADDING_LEFT_TEXT "padding_left_text" +#define BOTTOMSLIDER_VIEW_LEFT_TEXT "left_text" +#define BOTTOMSLIDER_VIEW_PADDING_RIGHT_TEXT "padding_right_text" +#define BOTTOMSLIDER_VIEW_RIGHT_TEXT "right_text" +#define BOTTOMSLIDER_VIEW_PADDING_SLIDER "padding_slider" +#define BOTTOMSLIDER_VIEW_SLIDER_SWALLOW_PART "slider_part" +#define BOTTOMSLIDER_VIEW_PADDING_UP_ARROW "padding_up_arrow" +#define BOTTOMSLIDER_VIEW_UP_ARROW_ICON "up_arrow_icon" +#define BOTTOMSLIDER_VIEW_UP_BTN "up_btn" +#define BOTTOMSLIDER_VIEW_PADDING_DOWN_ARROW "padding_down_arrow" +#define BOTTOMSLIDER_VIEW_DOWN_ARROW_ICON "down_arrow_icon" +#define BOTTOMSLIDER_VIEW_DOWN_BTN "down_btn" + +/*tv_speaker.edc*/ +#define TV_SPEAKER_VIEW_PAGE "tvspeaker_view_page" +#define PART_TVSPEAKER_TITLE "speaker_title" +#define PART_TVSPEAKER_CONTENT "tv_speaker_content" +#define PART_BTN_SELECT "btn_select" +#define PART_BTN_CANCEL "btn_cancel" + +#define SPEAKER_RADIO_ON IMAGEDIR"/radiobtn_on_foc.png" +#define SPEAKER_RADIO_OFF IMAGEDIR"/radiobtn_br_off_nor.png" + +/*device_manager.edc*/ +#define DEVICE_MGR_VIEW_GRP "device_mgr_view" +#define PART_DEVICE_MGR_TITLE "device_mgr_title" +#define PART_DEVICE_MGR_SUBTITLE "device_mgr_subtitle" +#define PART_DEVICE_MGR_CONTENT "device_mgr_content" +#define PART_DEVICE_MGR_NO_AIR_CASTING "device_mgr_no_air_cast" +#define PART_BTN_DELETE "btn_delete" +#define PART_BTN_REFRESH "btn_refresh" +#define PART_BTN_CLOSE "btn_close" +#define TEXT_DELETE_BTN "Delete" +#define TEXT_REFRESH_BTN "Refresh" +#define TEXT_CLOSE_BTN "Close" + +#define CHECK_FOC IMAGEDIR"/checkbox_check_foc.png" +#define CHECK_NOR IMAGEDIR"/checkbox_check_nor.png" +#define UNCHECK_FOC IMAGEDIR"/checkbox_uncheck_foc.png" +#define UNCHECK_NOR IMAGEDIR"/checkbox_uncheck_nor.png" + +/*resetpopup*/ +#define RESETPOPUP_VIEW "resetpopup_view" +#define RESETPOPUP_TITLE "confirm" +#define RESETPOPUP_TEXT "show_text" +#define RESETPOPUP_OK_BTN_SWALLOW "ok_button" +#define RESETPOPUP_CANCEL_BTN_SWALLOW "cancel_button" + +/*button.edc*/ +#define MAINICONBTN "elm/button/base/mainiconbtn" +#define MAINICONBTN_STYLE "mainiconbtn" +#define MAINICONBTN_BG "bg" +#define MAINICONBTN_HIGHLIGHT "btn_highlight" +#define MAINICONBTN_PADDING_ICON "padding_icon" +#define MAINICONBTN_ICON_SWALLOW "iconpart" +#define MAINICONBTN_PADDING_TEXT "padding_text" +#define MAINICONBTN_TEXT "elm.text" +#define MAINICONBTN_FOCUSED_ON_SUBITEM "focused_on_subitem" +#define MAINICONBTN_MAIN_ITEM_SOURCE "main_item_btn" + +#define SUBITEMBTN "elm/button/base/subitembtn" +#define SUBITEMBTN_STYLE "subitembtn" +#define SUBITEMBTN_BG "bg" +#define SUBITEMBTN_PADDING_LINE "padding_line" +#define SUBITEMBTN_LINE "line" +#define SUBITEMBTN_PADDING_TEXT "padding_text" +#define SUBITEMBTN_TEXT "elm.text" + +#define SUBITEMBTN_VALUE "value" +#define SUBITEMBTN_G_VALUE "g_value" +#define SUBITEMBTN_TITLE_ICON "subbtn_item_title_icon" +#define SUBITEMBTN_TITLE_SLIDER_VALUE "subbtn_item_title_slider_value" +#define SUBITEMBTN_SLIDER_VALUE "slider_value" +#define SUBITEMBTN_SLIDER_SWALLOW "slider_swallow" + +#define SUBITEMBTN_BUTTON_CLICKED "button_clicked" +#define SUBITEMBTN_BUTTON_SOURCE "src_prog" + +#define CTXPOPUPBTN "elm/button/base/popupbutton" +#define CTXPOPUPBTN_STYLE "popupbutton" +#define CTXPOPUPBTN_BG "bg" +#define CTXPOPUPBTN_PADDING_ICON "padding_icon" +#define CTXPOPUPBTN_ICON "icon_bg" +#define CTXPOPUPBTN_PADDING_LINE "padding_line" +#define CTXPOPUPBTN_LINE "line" +#define CTXPOPUPBTN_CONTENT_SWALLOW "elm.swallow.content" +#define CTXPOPUPBTN_PADDING_TEXT "padding_text" +#define CTXPOPUPBTN_TEXT "elm.text" + +#define CTXPOPUPBTN_BUTTON_SOURCE "sublist_item_btn" +#define CTXPOPUPBTN_ICON_SOURCE "sublist_item_icon" +#define CTXPOPUPBTN_BUTTON_FOCUSED "selected_item_focused" +#define CTXPOPUPBTN_BUTTON_UNFOCUSED "selected_item_unfocused" +#define CTXPOPUPBTN_BUTTON_HIGHLIGHT "selected_item_highlight" +#define CTXPOPUPBTN_ICON_FOCUSED "selected_icon_focused" + +#define SLIDER_ARROW_BTN "elm/button/base/slider_arrow_btn" +#define SLIDER_ARROW_BTN_STYLE "slider_arrow_btn" +#define SLIDER_ARROW_BTN_BG "bg" + +#define RESETPOPUPBTN_OK "elm/button/base/ok_btn" +#define RESETPOPUPBTN_OK_STYLE "ok_btn" +#define RESETPOPUPBTN_CANCEL "elm/button/base/cancel_btn" +#define RESETPOPUPBTN_CANCEL_STYLE "cancel_btn" + +#define PWD_BASIC_BTN "basic_btn" +#define PWD_INPUT_BTN "input_passcode_btn" + +/* progressbar.edc */ +#define SUBITEMBTN_TITILE_SLIDER "subitembtnprogress" +#define SUBITEMBTN_TITLE_VALUE_SLIDER_VALUE "subitembtn_value_progress_value" +#define SIG_UNCTRL_PB_FOCUSED "uncontrollable,progressbar,focused" +#define SIG_UNCTRL_PB_UNFOCUSED "uncontrollable,progressbar,unfocused" +#define SRC_PB_PROG "progressbar,source,program" + +/*focus.edc*/ +#define DEFAULT_FOCUS_INVISIBLE "invisible" + +/*ctxpopup.edc*/ +#define SUBLIST_CTXPOPUP1 "elm/ctxpopup/base/subliststyle1" +#define SUBLIST_CTXPOPUP_STYLE1 "subliststyle1" +#define SUBLIST_CTXPOPUP1_CLIPPER "clipper" +#define SUBLIST_CTXPOPUP1_SWALLOW_CONTENT "elm.swallow.content" + +#define SUBLIST_CTXPOPUP2 "elm/ctxpopup/base/subliststyle2" +#define SUBLIST_CTXPOPUP_STYLE2 "subliststyle2" +#define SUBLIST_CTXPOPUP2_CLIPPER "clipper" +#define SUBLIST_CTXPOPUP2_TOP_PADDING "toppadding" +#define SUBLIST_CTXPOPUP2_SWALLOW_CONTENT "elm.swallow.content" +#define SUBLIST_CTXPOPUP2_PADDING_UPARROW "padding_uparrow" +#define SUBLIST_CTXPOPUP2_UPARROW "uparrow" +#define SUBLIST_CTXPOPUP2_PADDING_DOWNARROW "padding_downarrow" +#define SUBLIST_CTXPOPUP2_DOWNARROW "downarrow" + +#define SUBLIST_SHOW_DOWN_ARROW "showdownarrow" +#define SUBLIST_SHOW_UP_ARROW "showuparrow" +#define SUBLIST_SHOW_BOTH_ARROW "showbotharrow" +#define SUBLIST_HIDE_BOTH_ARROW "hidebotharrow" + +#define RESETPOPUP_CTXPOPUP "elm/ctxpopup/base/resetpopup_layout" +#define RESETPOPUP_CTXPOPUP_STYLE "resetpopup_layout" + +#define CHANGE_PWD_CTXPOPUP_STYLE "change_passcode_ctxpopup" + +/*slider.edc*/ +#define BOTTOM_SLIDER "elm/slider/horizontal/bottom_slider" +#define BOTTOM_SLIDER_STYLE "bottom_slider" +#define BOTTOM_SLIDER_BACKGROUND "background" +#define BOTTOM_SLIDER_PAD_LEFT "pad.left" +#define BOTTOM_SLIDER_PAD_RIGHT "pad.right" +#define BOTTOM_SLIDER_BG "bg" +#define BOTTOM_SLIDER_BASE "base" +#define BOTTOM_SLIDER_GLOW "glow" +#define BOTTOM_SLIDER_DRAGABLE_SLIDER "elm.dragable.slider" +#define BOTTOM_SLIDER_BUTTON "button" +#define BOTTOM_SLIDER_SWALLOW_BAR "elm.swallow.bar" +#define BOTTOM_SLIDER_TRACK_SLIDER "elm.track.slider" +#define BOTTOM_SLIDER_PADDING_TEXT "padding_textpart" +#define BOTTOM_SLIDER_BALLON_BOX "ballonbox" +#define BOTTOM_SLIDER_TEXT_SWALLOW_PART "textpart" +#define BOTTOM_SLIDER_BALLON_ARROW "ballonarrow" + +#define BOTTOM_SLIDER_INDICATOR "elm/slider/horizontal/indicator/default" +#define BOTTOM_SLIDER_KNOB "knob" + +/*label.edc*/ +#define SLIDER_LABEL "elm/label/base/slidervalue" +#define SLIDER_LABEL_STYLE "slidervalue" +#define SLIDER_LABEL_TEXT "elm.text" + +/*scroller.edc*/ +#define SUBLIST_SCROLLER_STYLE "sublist_scroller" + +/* org.tizen.settings-tv-ref.edc */ +#define UG_GROUP "ug_group" +#define UG_RETURN_BASE_SWALLOW "ug_return_base_swallow" +#define UG_TITLE_TEXT "ug_title_text" + +/* String definition for main catalog edc, such as picture.edc...... */ +#define MAIN_BTN_GRP "main" +#define MAIN_BTN "main_btn" +#define MAIN_BTN_NORMAL "main_btn_normal" +#define MAIN_BTN_FOCUSED "main_btn_focused" +#define MAIN_BTN_UNFOCUSED "main_btn_unfocused" +#define MAIN_BTN_HIGHLIGHT "main_btn_highlight" + +/* change_passcode.edc */ +#define GRP_PWD_BG "change_passcode_bg" +#define GRP_PWD_VIEW "change_passcode_view" +#define GRP_PWD_ENTRY "pwd_entry_grp" +#define PART_TITLE "title" +#define PART_UPTEXT "up_text" +#define PART_DOWNTEXT "down_text" +#define SWALLOW_CANCEL_BTN "cancel_btn_swallow" +#define SWALLOW_CONTENT_AREA "service_content_area_swallow" +#define SWALLOW_ENTRY "entry_swallow" +#define STYLE_PWD_ENTRY "password" +#define STYLE_ENTRY_TEXT \ + "DEFAULT='font=Tizen Sans:style=Regular \ + font_size=30 align=center color=#000f'" + +/* text style */ +#define TEXT_STYLE_REGULAR "Tizen Sans:style=Regular" +#define TEXT_STYLE_MEDIUM "Tizen Sans:style=Medium" +#define TEXT_STYLE_BOLD "Tizen Sans:style=Bold" + +/* Key defines */ +#define KEY_UP "Up" +#define KEY_DOWN "Down" +#define KEY_LEFT "Left" +#define KEY_RIGHT "Right" +#define KEY_ENTER "Return" +#define KEY_EXIT "XF86Close" + +#define KEY_0 "0" +#define KEY_1 "1" +#define KEY_2 "2" +#define KEY_3 "3" +#define KEY_4 "4" +#define KEY_5 "5" +#define KEY_6 "6" +#define KEY_7 "7" +#define KEY_8 "8" +#define KEY_9 "9" + +#endif /* __DEF_H__ */ diff --git a/include/json_marco.h b/include/json_marco.h new file mode 100644 index 0000000..2592862 --- /dev/null +++ b/include/json_marco.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __JSON_MARCO_H__ +#define __JSON_MARCO_H__ + +/* json file paths */ +#define CONFIG_JSON_MENU JSON_OUTPUT_DIR"/menu.json" + +/* json strings */ +#define JSONSTR_SETTING_ITEMS "settingitems" +#define JSONSTR_SETTING_TREE "settingtree" +#define JSONSTR_SUBSETTING_SUBITEMS "subsettingitems" +#define JSONSTR_SUBSETTING_PARENTITEM "parentitem" +#define JSONSTR_GROUP "group" + +#define JSONSTR_DISPLAY_NAME "display-name" +#define JSONSTR_STYLE "style" +#define JSONSTR_STATUS "status" +#define JSONSTR_RESOURCE_FILE "resource-file" +#define JSONSTR_SETTINGUI "setting-ui" +#define JSONSTR_SETTINGUI_STYLE "setting-ui.style" +#define JSONSTR_SETTINGUI_NAME "setting-ui.name" +#define JSONSTR_SETTINGUI_ARGS "args" + +#define JSONSTR_DATA "data" +#define JSONSTR_DATA_KEY "key" +#define JSONSTR_DATA_TYPE "type" +#define JSONSTR_DATA_SLIDER "slider" +#define JSONSTR_SLIDER_MIN_DISPLAYVALUE "min.display-value" +#define JSONSTR_SLIDER_MIN_VALUE "min.value" +#define JSONSTR_SLIDER_MAX_DISPLAYVALUE "max.display-value" +#define JSONSTR_SLIDER_MAX_VALUE "max.value" +#define JSONSTR_SLIDER_STEP_DISPLAYVALUE "step.display-value" +#define JSONSTR_SLIDER_STEP_VALUE "step.value" +#define JSONSTR_DATA_LIST "list" +#define JSONSTR_LIST_DISPLAYVALUE "display-value" +#define JSONSTR_LIST_VALUE "value" + +/* settingui style strings */ +#define STYLE_UIGADGET "ui-gadget" +#define STYLE_APP "application" +#define STYLE_CTXPOPUP "ctxpopup" +#define STYLE_BOTTOM_CTXPOPUP "bottom.ctxpopup" +#define STYLE_BOTTOMSLIDER "slider.bottom" +#define STYLE_BOTTOM2WAYSLIDER "2wayslider.bottom" +#define STYLE_PASSCODE_POPUP "passcode-popup" +#define STYLE_DEVICE_MANAGER "device.mgr.genlist" +#define STYLE_RESET_POPUP "reset.popup" +#define STYLE_UPGRADE_POPUP "upgrade-popup" +#define STYLE_CLOCK_CTXPOPUP "clock-ctxpopup" +#define STYLE_NEED_PASSCODE "need-passcode" + +/* style of sub buttons */ +#define STYLE_SUBBUTTON_TITLE_VALUE "title.value" +#define STYLE_SUBBUTTON_TITLE_ICON "title.icon" +#define STYLE_SUBBUTTON_TITLE_SLIDER_VALUE "title.slider.value" +#define STYLE_SUBBUTTON_TITLE_2WAYSLIDER_VALUE "title.2wayslider.value" + +#endif /* __JSON_MARCO_H__ */ diff --git a/include/parser.h b/include/parser.h new file mode 100644 index 0000000..db8150a --- /dev/null +++ b/include/parser.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __PARSER_H__ +#define __PARSER_H__ + +#include +#include +#include "stdbool.h" +#include "json_marco.h" + +#define ARRAY_SIZE 256 + +enum info_type { + DRAWING_INFO, + SUBMENU_INFO +}; + +struct json_parser; + +struct json_parser *parser_init(const char *path); +void parser_fini(struct json_parser *jparser); +void parser_release_member_list(char **list); +JsonReader *parser_get_json_reader(struct json_parser *jparser); +JsonParser *parser_get_json_parser(struct json_parser *jparser); +JsonGenerator *parser_get_json_generator(struct json_parser *jparser); + +char **parser_get_itemlist_from_json(struct json_parser *jparser, + const char *name, int *cnt, enum info_type flag); +char **parser_get_settingui_args_from_json(struct json_parser *jparser, + const char *name, const char *pnode, int *cnt); +char **parser_get_data_list_from_json(struct json_parser *jparser, + const char *name, int *cnt); +char *parser_get_string_value_from_json(struct json_parser *jparser, + const char *path); +Eina_List *parser_get_string_list_from_json(struct json_parser *jparser, + const char *path); +int parser_get_array_length_from_json(struct json_parser *jparser, + const char *path); +bool parser_check_json_path(struct json_parser *jparser, + const char *path); +char *parser_get_parent_item_name(const char *path, const char *name); + +#endif /* __PARSER_H__ */ diff --git a/include/settings_provider.h b/include/settings_provider.h new file mode 100644 index 0000000..169d8f8 --- /dev/null +++ b/include/settings_provider.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SETTINGS_PROVIDER_H__ +#define __SETTINGS_PROVIDER_H__ + +#include "data_wrapper.h" + +int provider_set_list_value(struct settingitem *item, const char *val); +char *provider_get_list_value(struct settingitem *item); +void provider_release_list_value(char *val); +int provider_set_slider_value(struct settingitem *item, const char *val); +double provider_get_slider_value(struct settingitem *item); +char *provider_get_selected_display_name(struct settingitem *item); +int provider_get_passcode(const char *key, char **val); +int provider_init(void); +void provider_fini(void); + +#endif /* __SETTINGS_PROVIDER_H__ */ diff --git a/include/timeout_handler.h b/include/timeout_handler.h new file mode 100644 index 0000000..5b0aaad --- /dev/null +++ b/include/timeout_handler.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIMEOUT_HANDLER_H__ +#define __TIMEOUT_HANDLER_H__ + +#define TIMEOUT_SECS 60 + +struct timeout_handler; + +void timeout_handler_freeze_timer(struct timeout_handler *data); +void timeout_handler_thaw_timer(struct timeout_handler *data); +void timeout_handler_change_interval(struct timeout_handler *data, + double val); +struct timeout_handler *timeout_handler_init(double val); +void timeout_handler_fini(struct timeout_handler *data); + +#endif /* __TIMEOUT_HANDLER_H__ */ diff --git a/include/utils.h b/include/utils.h new file mode 100644 index 0000000..15a7c2b --- /dev/null +++ b/include/utils.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UTILS_H__ +#define __UTILS_H__ + +#include +#include + +#define ELM_SCALE elm_config_scale_get() +#define i18n_init() bindtextdomain(PACKAGE, LOCALEDIR) + +char *utils_get_translation_str(const char *msgid); +Evas_Object *utils_add_btn(Evas_Object *parent, + char *style, const char *text, Eina_Bool event); +Evas_Object *utils_add_scroller(Evas_Object *base); +Evas_Object *utils_add_box(Evas_Object *base); +Evas_Object *utils_add_ctxpopup(Evas_Object *base, char *style); +Evas_Object *utils_add_label(Evas_Object *base); +Evas_Object *utils_add_entry(Evas_Object *parent); +Evas_Object *utils_add_base(Evas_Object *parent); + +void utils_set_focus_directions(Eina_Array *btns, int cnt); + +#endif /* __UTILS_H__ */ diff --git a/include/view_bottomslider.h b/include/view_bottomslider.h new file mode 100644 index 0000000..bff6532 --- /dev/null +++ b/include/view_bottomslider.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_BOTTOMSLIDER_H__ +#define __VIEW_BOTTOMSLIDER_H__ + +#include "viewmgr.h" + +struct setting_class *view_bottomslider_get_vclass(void); + +#endif /* __VIEW_BOTTOMSLIDER_H__ */ diff --git a/include/view_bottomsublist.h b/include/view_bottomsublist.h new file mode 100644 index 0000000..ad32007 --- /dev/null +++ b/include/view_bottomsublist.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_BOTTOMSUBLIST_H__ +#define __VIEW_BOTTOMSUBLIST_H__ + +#include "viewmgr.h" + +struct setting_class *view_bottomsublist_get_vclass(void); + +#endif /* __VIEW_BOTTOMSUBLIST_H__ */ diff --git a/include/view_device_manager.h b/include/view_device_manager.h new file mode 100644 index 0000000..09d9ee1 --- /dev/null +++ b/include/view_device_manager.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_DEVICE_MANAGER_H__ +#define __VIEW_DEVICE_MANAGER_H__ + +#include "viewmgr.h" + +struct setting_class *view_device_manager_get_vclass(void); + +#endif /* __VIEW_DEVICE_MANAGER_H__ */ diff --git a/include/view_maincatalog.h b/include/view_maincatalog.h new file mode 100644 index 0000000..675379a --- /dev/null +++ b/include/view_maincatalog.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_MAINMENU_H__ +#define __VIEW_MAINMENU_H__ + +#include "viewmgr.h" + +struct setting_class *view_maincatalog_get_vclass(void); + +#endif /* __VIEW_MAINMENU_H__ */ diff --git a/include/view_need_pwd.h b/include/view_need_pwd.h new file mode 100644 index 0000000..7dafdf2 --- /dev/null +++ b/include/view_need_pwd.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_NEED_PASSCODE_H__ +#define __VIEW_NEED_PASSCODE_H__ + +#include "viewmgr.h" + +struct setting_class *view_need_passcode_get_vclass(void); + +#endif /* __VIEW_NEED_PASSCODE_H__ */ diff --git a/include/view_pwd_popup.h b/include/view_pwd_popup.h new file mode 100644 index 0000000..58cb88f --- /dev/null +++ b/include/view_pwd_popup.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_PASSCODE_POPUP_H__ +#define __VIEW_PASSCODE_POPUP_H__ + +#include "viewmgr.h" + +struct setting_class *view_passcode_popup_get_vclass(void); + +#endif /* __VIEW_PASSCODE_POPUP_H__ */ diff --git a/include/view_resetpopup.h b/include/view_resetpopup.h new file mode 100644 index 0000000..d9673d9 --- /dev/null +++ b/include/view_resetpopup.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_RESETPOPUP_H__ +#define __VIEW_RESETPOPUP_H__ + +#include "viewmgr.h" + +struct setting_class *view_resetpopup_get_vclass(void); + +#endif /* __VIEW_RESETPOPUP_H__ */ diff --git a/include/view_sublist.h b/include/view_sublist.h new file mode 100644 index 0000000..930faaa --- /dev/null +++ b/include/view_sublist.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_SUBLIST_H__ +#define __VIEW_SUBLIST_H__ + +#include "viewmgr.h" + +struct setting_class *view_sublist_get_vclass(void); + +#endif /* __VIEW_SUBLIST_H__ */ diff --git a/include/view_system_clock.h b/include/view_system_clock.h new file mode 100644 index 0000000..2e9eb3f --- /dev/null +++ b/include/view_system_clock.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _VIEW_SYSTEM_CLOCK_H__ +#define _VIEW_SYSTEM_CLOCK_H__ + +#include "viewmgr.h" + +struct setting_class *view_system_clock_get_vclass(void); + +#endif /* _VIEW_SYSTEM_CLOCK_H__ */ diff --git a/include/view_uigadget.h b/include/view_uigadget.h new file mode 100644 index 0000000..d35ee8b --- /dev/null +++ b/include/view_uigadget.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_UIGADGET_H__ +#define __VIEW_UIGADGET_H__ + +#include "viewmgr.h" + +struct setting_class *view_uigadget_get_vclass(void); + +#endif /* __VIEW_UIGADGET_H__ */ diff --git a/include/view_upgrade_popup.h b/include/view_upgrade_popup.h new file mode 100644 index 0000000..9364ead --- /dev/null +++ b/include/view_upgrade_popup.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_UPGRADE_POPUP_H__ +#define __VIEW_UPGRADE_POPUP_H__ + +#include "viewmgr.h" + +#define UPGRADE_SW_TITLE "Software upgrade" +#define UPGRADE_SW_NOW "Update now" +#define UPGRADE_SW_AVAIL_TEXT "A new software update is available.\ +
Upgrade from version A to version B?" +#define UPGRADE_SW_UNAVAIL_TEXT "There are no new updates\ +
for you at the moment." +#define NETWORK_DISCONNECTED_TEXT "Please check that your network \ +
has been configured." +#define INTERNET_DISCONNECTED_TEXT "Fail to connect.\ +
Please contact your Internet Service Provider." +#define UPDATE_UP_TEXT "Checking for updates..." +#define UPDATE_MIDDLE_TEXT "Last checked for updates
" +#define DYNAMIC_TEXT "Checking for network..." + +#define UPGRADE_BTN_BOX_PADDING 20 + +enum { + UPGRADE_BTN_0, + UPGRADE_BTN_1, + UPGRADE_BTN_MAX +}; +struct setting_class *view_upgrade_popup_get_vclass(void); + +#endif /* __VIEW_UPGRADE_POPUP_H__ */ \ No newline at end of file diff --git a/include/viewmgr.h b/include/viewmgr.h new file mode 100644 index 0000000..40843aa --- /dev/null +++ b/include/viewmgr.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEWMGR_H__ +#define __VIEWMGR_H__ + +#include +#include "data_wrapper.h" + +#define SELECTED_ITEM_ID "bottomslider_selected_item" + +#define VCLASS_TITLE_MAIN_VIEW "Main View" +#define VCLASS_TITLE_BOTTOM_SLIDER "Bottom Slider" +#define VCLASS_TITLE_BOTTOM_SUBLIST "Bottom Sublist" +#define VCLASS_TITLE_DEVICE_MANAGER "Device Manager" +#define VCLASS_TITLE_CHANGE_PASSCODE "Change Passcode" +#define VCLASS_TITLE_RESET_POPUP "Reset Popup" +#define VCLASS_TITLE_SUBLIST "Sublist" +#define VCLASS_TITLE_SYSTEM_CLOCK "System Clock" +#define VCLASS_TITLE_UG "UI Gadget" +#define VCLASS_TITLE_UPGRADE "Upgrade Software" +#define VCLASS_TITLE_NEED_PASSCODE "Need Passcode" + +struct setting_mgr; + +struct evas_obj_data { + Evas_Object *subitem_box; + Evas_Object *cur_btn; + + const char *display_name; +}; + +struct obj_geometry_data { + int width; + int height; + int x; + int y; +}; + +struct setting_class { + const char *title; + Evas_Object * (*create)(struct setting_mgr *mgr, + struct settingview_data *view, void *prev); + void (*show)(Evas_Object *base); + void (*pause)(Evas_Object *base); + void (*resume)(Evas_Object *base); + void (*refresh)(Evas_Object *base); + void (*update)(Evas_Object *base); + void (*hide)(Evas_Object *base); + void (*destroy)(Evas_Object *base); + void (*lang_changed)(Evas_Object *base); + void (*frozen)(Evas_Object *base); + void (*active)(Evas_Object *base); + int hide_view; +}; + +struct setting_mgr *settingmgr_init(Evas_Object *win); +void settingmgr_fini(struct setting_mgr *mgr); +int settingmgr_view_push(struct setting_mgr *mgr, + const char *name, void *data); +void settingmgr_view_pop(struct setting_mgr *mgr); +Evas_Object *settingmgr_get_win(struct setting_mgr *mgr); +struct settingview_data *settingmgr_get_view(struct setting_mgr *mgr, + const char *name); +struct settingmgr_data *settingmgr_get_data(struct setting_mgr *mgr); +Eina_List *settingmgr_get_view_list(struct setting_mgr *mgr); +int settingmgr_launch_item(struct setting_mgr *mgr, + const char *name); +Eina_Array *settingmgr_get_item_path(struct setting_mgr *mgr); +void settingmgr_view_refresh(struct setting_mgr *mgr); +void settingmgr_set_refresh_flag(struct setting_mgr *mgr, + unsigned int val); +unsigned int settingmgr_get_refresh_flag(struct setting_mgr *mgr); +void settingmgr_set_relaunch_flag(struct setting_mgr *mgr, + unsigned int val); +unsigned int settingmgr_get_relaunch_flag(struct setting_mgr *mgr); +void settingmgr_freeze_timeout(struct setting_mgr *mgr); +void settingmgr_thaw_timeout(struct setting_mgr *mgr); +Eina_Bool settingmgr_get_timeout_freeze_state(struct setting_mgr *mgr); +void settingmgr_lang_changed(struct setting_mgr *mgr); + +#endif /* __VIEWMGR_H__ */ diff --git a/json/channel-lock.json b/json/channel-lock.json new file mode 100644 index 0000000..350d3df --- /dev/null +++ b/json/channel-lock.json @@ -0,0 +1,33 @@ +{ + "settingitems": { + "lock-sublist": { + "display-name": "Channel lock", + "style": "none", + "setting-ui": { + "style": "ctxpopup" + }, + "data": { + "key": "settings/channel/channel_lock", + "type": "bool", + "list": [ + { + "display-value": "OFF", + "value": "0" + }, + { + "display-value": "ON", + "value": "1" + } + ] + } + } + }, + "settingtree": { + "channel-lock": { + "subsettingitems": [ + "lock-sublist" + ], + "parentitem": "channel-lock" + } + } +} diff --git a/json/channel.json b/json/channel.json new file mode 100644 index 0000000..0d2d070 --- /dev/null +++ b/json/channel.json @@ -0,0 +1,41 @@ +{ + "settingitems": { + "auto-program": { + "display-name": "Auto program", + "setting-ui": { + "style": "ui-gadget", + "name": "auto-program" + } + }, + "channel-lock": { + "display-name": "Channel lock", + "style": "title.value", + "setting-ui": { + "style": "need-passcode" + }, + "data": { + "key": "settings/channel/channel_lock", + "type": "bool", + "list": [ + { + "display-value": "OFF", + "value": "0" + }, + { + "display-value": "ON", + "value": "1" + } + ] + } + } + }, + "settingtree": { + "channel": { + "subsettingitems": [ + "auto-program", + "channel-lock" + ], + "parentitem": "maincatalog" + } + } +} \ No newline at end of file diff --git a/json/clock.json b/json/clock.json new file mode 100644 index 0000000..23ff3e6 --- /dev/null +++ b/json/clock.json @@ -0,0 +1,20 @@ +{ + "settingitems": { + "manual_clock": { + "display-name": "Clock", + "style": "none", + "setting-ui": { + "style": "ui-gadget", + "name": "clock" + } + } + }, + "settingtree": { + "clock": { + "subsettingitems": [ + "manual_clock" + ], + "parentitem": "clock" + } + } +} diff --git a/json/device-manager.json b/json/device-manager.json new file mode 100644 index 0000000..9ae02a9 --- /dev/null +++ b/json/device-manager.json @@ -0,0 +1,20 @@ +{ + "settingitems": { + "mobile-controller": { + "display-name": "Edit Air casting list", + "style": "title.icon", + "status": "disabled", + "setting-ui": { + "style": "device.mgr.genlist" + } + } + }, + "settingtree": { + "device-manager": { + "subsettingitems": [ + "mobile-controller" + ], + "parentitem": "maincatalog" + } + } +} \ No newline at end of file diff --git a/json/helper.json b/json/helper.json new file mode 100644 index 0000000..ef99f50 --- /dev/null +++ b/json/helper.json @@ -0,0 +1,35 @@ +{ + "Screenadjustment": "picture", + "homebaropacity": "picture", + "tint": "picture", + "color": "picture", + "sharpness": "picture", + "brightness": "picture", + "contrast": "picture", + "picturemode": "picture", + "soundmode": "sound", + "speakersettings": "sound", + "auto-program": "channel", + "channel-lock": "channel", + "lock-sublist": "channel-lock", + "network-settings": "network", + "wifi-direct": "network", + "mobile-controller": "device-manager", + "clock": "system", + "manual_clock": "clock", + "sleep-timer": "system", + "wakeup-timer": "system", + "change-passcode": "system", + "subtitle": "system", + "country": "system", + "language": "system", + "reset": "system", + "software-upgrade": "support", + "picture": "maincatalog", + "sound": "maincatalog", + "channel": "maincatalog", + "network": "maincatalog", + "device-manager": "maincatalog", + "system": "maincatalog", + "support": "maincatalog" +} diff --git a/json/maincatalog.json b/json/maincatalog.json new file mode 100644 index 0000000..85aa908 --- /dev/null +++ b/json/maincatalog.json @@ -0,0 +1,53 @@ +{ + "settingitems": { + "picture": { + "display-name": "PICTURE", + "style": "animicon", + "resource-file": "picture.edj" + }, + "sound": { + "display-name": "SOUND", + "style": "animicon", + "resource-file": "sound.edj" + }, + "channel": { + "display-name": "CHANNEL", + "style": "animicon", + "resource-file": "channel.edj" + }, + "network": { + "display-name": "NETWORK", + "style": "animicon", + "resource-file": "network.edj" + }, + "device-manager": { + "display-name": "DEVICE MANAGER", + "style": "animicon", + "resource-file": "device_manager.edj" + }, + "system": { + "display-name": "SYSTEM", + "style": "animicon", + "resource-file": "system.edj" + }, + "support": { + "display-name": "SUPPORT", + "style": "animicon", + "resource-file": "support.edj" + } + }, + "settingtree": { + "maincatalog": { + "subsettingitems": [ + "picture", + "sound", + "channel", + "network", + "device-manager", + "system", + "support" + ], + "parentitem": "maincatalog" + } + } +} diff --git a/json/network.json b/json/network.json new file mode 100644 index 0000000..21c53ff --- /dev/null +++ b/json/network.json @@ -0,0 +1,35 @@ +{ + "settingitems": { + "network-settings": { + "display-name": "Network settings", + "setting-ui": { + "style": "ui-gadget", + "name": "network-settings" + } + }, + "wifi-direct": { + "display-name": "WIFI direct", + "setting-ui": { + "style": "ui-gadget", + "name": "wifi-direct" + } + }, + "proxy-settings": { + "display-name": "Proxy settings", + "setting-ui": { + "style": "ui-gadget", + "name": "proxy-settings" + } + } + }, + "settingtree": { + "network": { + "subsettingitems": [ + "network-settings", + "wifi-direct", + "proxy-settings" + ], + "parentitem": "maincatalog" + } + } +} \ No newline at end of file diff --git a/json/picture.json b/json/picture.json new file mode 100644 index 0000000..9dd60d0 --- /dev/null +++ b/json/picture.json @@ -0,0 +1,241 @@ +{ + "settingitems": { + "picturemode": { + "display-name": "Picture mode", + "style": "title.value", + "status": "disabled", + "setting-ui": { + "style": "bottom.ctxpopup" + }, + "data": { + "key": "settings/picture/picturemode", + "type": "integer", + "list": [ + { + "display-value": "Standard", + "value": "0" + }, + { + "display-value": "Movie", + "value": "1" + } + ] + } + }, + "contrast": { + "display-name": "Contrast", + "style": "title.slider.value", + "status": "disabled", + "setting-ui": { + "style": "slider.bottom" + }, + "data": { + "type": "integer", + "key": "settings/picture/contrast", + "slider": { + "min": { + "display-value": "0", + "value": "0" + }, + "max": { + "display-value": "100", + "value": "100" + }, + "step": { + "display-value": "1", + "value": "1" + } + } + } + }, + "brightness": { + "display-name": "Brightness", + "style": "title.slider.value", + "status": "disabled", + "setting-ui": { + "style": "slider.bottom" + }, + "data": { + "type": "integer", + "key": "settings/picture/brightness", + "slider": { + "min": { + "display-value": "0", + "value": "0" + }, + "max": { + "display-value": "100", + "value": "100" + }, + "step": { + "display-value": "1", + "value": "1" + } + } + } + }, + "sharpness": { + "display-name": "Sharpness", + "style": "title.slider.value", + "status": "disabled", + "setting-ui": { + "style": "slider.bottom" + }, + "data": { + "type": "integer", + "key": "settings/picture/sharpness", + "slider": { + "min": { + "display-value": "0", + "value": "0" + }, + "max": { + "display-value": "100", + "value": "100" + }, + "step": { + "display-value": "1", + "value": "1" + } + } + } + }, + "color": { + "display-name": "Color", + "style": "title.slider.value", + "status": "disabled", + "setting-ui": { + "style": "slider.bottom" + }, + "data": { + "provider": "picture-dataprovider", + "type": "integer", + "key": "settings/picture/color", + "slider": { + "min": { + "display-value": "0", + "value": "0" + }, + "max": { + "display-value": "100", + "value": "100" + }, + "step": { + "display-value": "1", + "value": "1" + } + } + } + }, + "tint": { + "display-name": "Tint", + "style": "title.2wayslider.value", + "status": "disabled", + "setting-ui": { + "style": "2wayslider.bottom" + }, + "data": { + "type": "integer", + "key": "settings/picture/tint", + "slider": { + "min": { + "display-value": "0", + "value": "0" + }, + "max": { + "display-value": "100", + "value": "100" + }, + "step": { + "display-value": "1", + "value": "1" + } + } + } + }, + "homebaropacity": { + "display-name": "Homebar Opacity", + "style": "title.slider.value", + "status": "disabled", + "setting-ui": { + "style": "slider.bottom" + }, + "data": { + "provider": "picture-dataprovider", + "type": "integer", + "key": "settings/picture/homebaropacity", + "slider": { + "min": { + "display-value": "0", + "value": "0" + }, + "max": { + "display-value": "100", + "value": "100" + }, + "step": { + "display-value": "1", + "value": "1" + } + } + } + }, + "Screenadjustment": { + "display-name": "Screen adjustment", + "style": "title.value", + "status": "disabled", + "setting-ui": { + "style": "bottom.ctxpopup" + }, + "data": { + "key": "settings/picture/screenadjustment", + "type": "integer", + "list": [ + { + "display-value": "16:9", + "value": "0" + }, + { + "display-value": "Auto wide", + "value": "1" + }, + { + "display-value": "Wide zoom", + "value": "2" + }, + { + "display-value": "4:3", + "value": "3" + }, + { + "display-value": "Screen fit", + "value": "4" + } + ] + } + } + }, + "settingtree": { + "picture": { + "subsettingitems": [ + "picturemode", + "contrast", + "brightness", + "sharpness", + "color", + "tint", + "homebaropacity", + "Screenadjustment" + ], + "group": [ + "contrast", + "brightness", + "sharpness", + "color", + "tint", + "homebaropacity" + ], + "parentitem": "maincatalog" + } + } +} diff --git a/json/sound.json b/json/sound.json new file mode 100644 index 0000000..db64a70 --- /dev/null +++ b/json/sound.json @@ -0,0 +1,68 @@ +{ + "settingitems": { + "soundmode": { + "display-name": "Sound mode", + "style": "title.value", + "status": "disabled", + "setting-ui": { + "style": "ctxpopup" + }, + "data": { + "key": "settings/sound/soundmode", + "type": "integer", + "list": [ + { + "display-value": "Standard", + "value": "0" + }, + { + "display-value": "Music", + "value": "1" + }, + { + "display-value": "Movie", + "value": "2" + } + ] + } + }, + "speakersettings": { + "display-name": "Speaker settings", + "style": "title.icon", + "setting-ui": { + "style": "ctxpopup" + }, + "data": { + "key": "settings/sound/speakersettings", + "type": "integer", + "list": [ + { + "display-value": "Audio Out", + "value": "0" + }, + { + "display-value": "TV Speaker", + "value": "1" + }, + { + "display-value": "Receiver", + "value": "2" + }, + { + "display-value": "SoundShare", + "value": "3" + } + ] + } + } + }, + "settingtree": { + "sound": { + "subsettingitems": [ + "soundmode", + "speakersettings" + ], + "parentitem": "maincatalog" + } + } +} diff --git a/json/support.json b/json/support.json new file mode 100644 index 0000000..0af204a --- /dev/null +++ b/json/support.json @@ -0,0 +1,20 @@ +{ + "settingitems": { + "software-upgrade": { + "display-name": "Software Upgrade", + "style": "title.value", + "status": "disabled", + "setting-ui": { + "style": "upgrade-popup" + } + } + }, + "settingtree": { + "support": { + "subsettingitems": [ + "software-upgrade" + ], + "parentitem": "maincatalog" + } + } +} diff --git a/json/system.json b/json/system.json new file mode 100644 index 0000000..4b2ad50 --- /dev/null +++ b/json/system.json @@ -0,0 +1,189 @@ +{ + "settingitems": { + "clock": { + "display-name": "Clock", + "style": "title.value", + "setting-ui": { + "style": "clock-ctxpopup", + "name": "clock" + }, + "data": { + "key": "settings/system/clock_mode", + "type": "integer", + "list": [ + { + "display-value": "Auto", + "value": "0" + }, + { + "display-value": "Manual", + "value": "1" + } + ] + } + }, + "sleep-timer": { + "display-name": "Sleep Timer", + "style": "title.value", + "setting-ui": { + "style": "ctxpopup" + }, + "data": { + "key": "settings/system/sleeptimer", + "type": "integer", + "list": [ + { + "display-value": "OFF", + "value": "0" + }, + { + "display-value": "30 min", + "value": "1" + }, + { + "display-value": "60 min", + "value": "2" + }, + { + "display-value": "90 min", + "value": "3" + }, + { + "display-value": "120 min", + "value": "4" + }, + { + "display-value": "150 min", + "value": "5" + }, + { + "display-value": "180 min", + "value": "6" + } + ] + } + }, + "wakeup-timer": { + "display-name": "Wake up Timer", + "style": "title.value", + "status": "disabled", + "setting-ui": { + "style": "ui-gadget", + "name": "wakeup-timer" + }, + "data": { + "key": "settings/system/wakeup_timer_setup", + "type": "string" + } + }, + "change-passcode": { + "display-name": "Change Passcode", + "style": "title.value", + "setting-ui": { + "style": "passcode-popup" + }, + "data": { + "key": "settings/system/change_passcode", + "type": "string" + } + }, + "subtitle": { + "display-name": "Subtitle", + "style": "title.value", + "setting-ui": { + "style": "ctxpopup" + }, + "data": { + "key": "settings/system/subtitle", + "type": "integer", + "list": [ + { + "display-value": "Korean", + "value": "0" + }, + { + "display-value": "English", + "value": "1" + }, + { + "display-value": "French", + "value": "2" + } + ] + } + }, + "country": { + "display-name": "Country", + "style": "title.value", + "setting-ui": { + "style": "ctxpopup" + }, + "data": { + "key": "settings/system/country", + "type": "string", + "list": [ + { + "display-value": "Korean", + "value": "ko_KR.utf8" + }, + { + "display-value": "USA", + "value": "en_US.utf8" + } + ] + } + }, + "language": { + "display-name": "Language", + "style": "title.value", + "setting-ui": { + "style": "ctxpopup" + }, + "data": { + "key": "settings/system/language", + "type": "string", + "list": [ + { + "display-value": "Korean", + "value": "ko_KR.utf8" + }, + { + "display-value": "English", + "value": "en_US.utf8" + }, + { + "display-value": "French", + "value": "fr_FR.utf8" + } + ] + } + }, + "reset": { + "display-name": "Reset", + "style": "title.icon", + "status": "disabled", + "setting-ui": { + "style": "reset.popup" + }, + "data": { + "key": "settings/system/reset", + "type": "integer" + } + } + }, + "settingtree": { + "system": { + "subsettingitems": [ + "clock", + "sleep-timer", + "wakeup-timer", + "change-passcode", + "subtitle", + "country", + "language", + "reset" + ], + "parentitem": "maincatalog" + } + } +} \ No newline at end of file diff --git a/log.txt b/log.txt new file mode 100644 index 0000000..cc4d26d --- /dev/null +++ b/log.txt @@ -0,0 +1,211 @@ ++ GBS_ROOT=/home/juwankim/GBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/ ++ BUILD_DIR=home/abuild/rpmbuild/BUILD/ ++ cd /home/juwankim/GBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/home/abuild/rpmbuild/BUILD/ ++ ls -1 ++ PROJECT=org.tizen.settings-tv-ref-0.1 ++ echo Source Copying.. +Source Copying.. ++ cp -rf src/data_wrapper.c src/main.c src/parser.c src/settings_provider.c src/timeout_handler.c src/utils.c src/view_bottomslider.c src/view_bottomsublist.c src/view_device_manager.c src/view_maincatalog.c src/view_need_pwd.c src/view_pwd_popup.c src/view_resetpopup.c src/view_sublist.c src/view_system_clock.c src/view_uigadget.c src/view_upgrade_popup.c src/viewmgr.c /home/juwankim/GBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/src/ ++ cp -rf ug/channel ug/network ug/proxy ug/system ug/wifi-direct /home/juwankim/GBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/ ++ cp -rf include/data_wrapper.h include/dbg.h include/def.h include/json_marco.h include/parser.h include/settings_provider.h include/timeout_handler.h include/utils.h include/view_bottomslider.h include/view_bottomsublist.h include/view_device_manager.h include/view_maincatalog.h include/view_need_pwd.h include/view_pwd_popup.h include/view_resetpopup.h include/view_sublist.h include/view_system_clock.h include/view_uigadget.h include/view_upgrade_popup.h include/viewmgr.h /home/juwankim/GBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/include/ ++ echo Build Start +Build Start ++ sudo chroot /home/juwankim/GBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/ /bin/bash -c cd /home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ && make -j16 && exit +-- Configuring done +-- Generating done +-- Build files have been written to: /home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +qemu: Unsupported syscall: 350 +edje_cc: Warning. Part 'elm.text' in group 'elm/progressbar/horizontal/scan_progress' contains description 'default:0' which has text.min: 1 X; but not text.ellipsis: -1; +edje_cc: Warning. This is almost certainly not what you want. +edje_cc: Warning. Part 'elm.text' in group 'elm/progressbar/horizontal/update_progressbar' contains description 'default:0' which has text.min: 1 X; but not text.ellipsis: -1; +edje_cc: Warning. This is almost certainly not what you want. +[ 0%] Built target ug-proxy-settings.edj +[ 0%] Built target ug_auto_program.edj +[ 0%] Built target ug_auto_program_theme.edj +[ 0%] Scanning dependencies of target ug-auto-program +Built target ug-proxy-settings-theme.edj +[ 2%] [ 4%] [ 6%] [ 8%] [ 10%] [ 12%] [ 12%] Building C object ug/channel/CMakeFiles/ug-auto-program.dir/src/ug_auto_program.c.o +Building C object ug/channel/CMakeFiles/ug-auto-program.dir/src/util.c.o +[ 14%] Building C object ug/channel/CMakeFiles/ug-auto-program.dir/src/viewmgr_auto_program.c.o +Building C object ug/channel/CMakeFiles/ug-auto-program.dir/src/view_scan_start.c.o +Built target ug_clock_theme.edj +Scanning dependencies of target ug-proxy-settings +[ 14%] Building C object ug/channel/CMakeFiles/ug-auto-program.dir/src/view_search_page.c.o +Building C object ug/channel/CMakeFiles/ug-auto-program.dir/src/view_result_page.c.o +Built target ug-network-settings.edj +[ 16%] Building C object ug/channel/CMakeFiles/ug-auto-program.dir/src/tv_scan.c.o +[ 18%] [ 18%] [ 18%] [ 20%] Building C object ug/proxy/CMakeFiles/ug-proxy-settings.dir/src/main_view.c.o +Built target ug-network-settings-theme.edj +Building C object ug/proxy/CMakeFiles/ug-proxy-settings.dir/src/ug_proxy_settings.c.o +Built target org.tizen.settings-tv-ref-theme.edj +[ 20%] [ 20%] Building C object ug/proxy/CMakeFiles/ug-proxy-settings.dir/src/vconf_mgr.c.o +[ 22%] Built target ug-wifi-direct.edj +Built target ug_clock.edj +[ 24%] Building C object ug/proxy/CMakeFiles/ug-proxy-settings.dir/src/connection_mgr.c.o +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c: In function '_handle_signal': +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c:300:1: warning: no return statement in function returning non-void [-Wreturn-type] + } + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c: At top level: +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c:103:13: warning: '_handle_begin_signal' defined but not used [-Wunused-function] + static void _handle_begin_signal(struct tv_scan *tvs, + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c:136:13: warning: '_handle_progress_signal' defined but not used [-Wunused-function] + static void _handle_progress_signal(struct tv_scan *tvs, + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c:161:13: warning: '_channel_count' defined but not used [-Wunused-function] + static void _channel_count(unsigned int *atv, unsigned int *dtv, + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c:190:13: warning: '_handle_found_signal' defined but not used [-Wunused-function] + static void _handle_found_signal(struct tv_scan *tvs, + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c:227:13: warning: '_handle_done_signal' defined but not used [-Wunused-function] + static void _handle_done_signal(struct tv_scan *tvs, + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c:250:18: warning: '_handle_signal' defined but not used [-Wunused-function] + static Eina_Bool _handle_signal(void *data) + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c: In function 'tv_scan_pause': +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/ug/channel/src/tv_scan.c:541:1: warning: control reaches end of non-void function [-Wreturn-type] + } + ^ +[ 26%] Building C object ug/proxy/CMakeFiles/ug-proxy-settings.dir/src/wifi_mgr.c.o +Scanning dependencies of target ug-network-settings +[ 28%] Scanning dependencies of target ug-clock +Building C object ug/proxy/CMakeFiles/ug-proxy-settings.dir/src/util.c.o +[ 30%] [ 32%] [ 34%] [ 36%] [ 38%] [ 40%] Building C object ug/network/CMakeFiles/ug-network-settings.dir/src/main_view.c.o +[ 42%] Building C object ug/network/CMakeFiles/ug-network-settings.dir/src/ug_network_settings.c.o +Building C object ug/network/CMakeFiles/ug-network-settings.dir/src/vconf_mgr.c.o +Building C object ug/network/CMakeFiles/ug-network-settings.dir/src/wifi_mgr.c.o +Building C object ug/network/CMakeFiles/ug-network-settings.dir/src/ip_setting_view.c.o +[ 44%] Building C object ug/network/CMakeFiles/ug-network-settings.dir/src/network_viewmgr.c.o +Building C object ug/system/clock/CMakeFiles/ug-clock.dir/src/ug_clock_spin_control.c.o +Building C object ug/system/clock/CMakeFiles/ug-clock.dir/src/ug_clock.c.o +[ 46%] [ 46%] Linking C shared library libug-auto-program.so +Building C object ug/system/clock/CMakeFiles/ug-clock.dir/src/ug_clock_sublist.c.o +Built target ug-wifi-direct-theme.edj +Building C object ug/system/clock/CMakeFiles/ug-clock.dir/src/ug_clock_utils.c.o +[ 48%] [ 51%] Building C object ug/network/CMakeFiles/ug-network-settings.dir/src/connection_mgr.c.o +Building C object ug/network/CMakeFiles/ug-network-settings.dir/src/util.c.o +[ 53%] [ 55%] Building C object ug/network/CMakeFiles/ug-network-settings.dir/src/wifi_passcode_view.c.o +Linking C shared library libug-proxy-settings.so +Building C object ug/system/clock/CMakeFiles/ug-clock.dir/src/ug_clock_time_spin_control.c.o +Scanning dependencies of target ug-wifi-direct +[ 55%] [ 57%] Built target ug-auto-program +[ 61%] [ 61%] [ 63%] Building C object ug/wifi-direct/CMakeFiles/ug-wifi-direct.dir/src/ug_wifi_direct.c.o +Building C object ug/wifi-direct/CMakeFiles/ug-wifi-direct.dir/src/wifi_direct_view.c.o +Building C object ug/wifi-direct/CMakeFiles/ug-wifi-direct.dir/src/util.c.o +Building C object ug/wifi-direct/CMakeFiles/ug-wifi-direct.dir/src/wifi_direct_mgr.c.o +[ 63%] Built target ug-proxy-settings +Linking C shared library libug-clock.so +Linking C shared library libug-network-settings.so +[ 63%] [ 63%] Built target ug-clock +Built target ug-network-settings +[ 63%] Built target org.tizen.settings-tv-ref.edj +Linking C shared library libug-wifi-direct.so +Scanning dependencies of target settings-tv-ref +[ 67%] [ 67%] [ 73%] [ 73%] [ 73%] [ 75%] [ 77%] [ 79%] [ 79%] [ 81%] Built target ug-wifi-direct +Building C object CMakeFiles/settings-tv-ref.dir/src/utils.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/main.c.o +[ 83%] Building C object CMakeFiles/settings-tv-ref.dir/src/viewmgr.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/parser.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/view_uigadget.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/data_wrapper.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/view_maincatalog.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/view_sublist.c.o +[ 87%] [ 87%] Building C object CMakeFiles/settings-tv-ref.dir/src/view_bottomsublist.c.o +[ 89%] Building C object CMakeFiles/settings-tv-ref.dir/src/view_bottomslider.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/settings_provider.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/view_pwd_popup.c.o +[ 91%] Building C object CMakeFiles/settings-tv-ref.dir/src/view_device_manager.c.o +[ 93%] [ 95%] Building C object CMakeFiles/settings-tv-ref.dir/src/view_upgrade_popup.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/view_system_clock.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/view_resetpopup.c.o +[ 97%] In file included from /home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/src/settings_provider.c:21:0: +/usr/include/media/sound_manager.h:220:1: warning: 'sound_session_notify_e' is deprecated (declared at /usr/include/media/sound_manager.h:193) [-Wdeprecated-declarations] + typedef void (*sound_session_notify_cb) (sound_session_notify_e notify, void *user_data) DEPRECATED; // will be deprecated + ^ +/usr/include/media/sound_manager.h:229:1: warning: 'sound_interrupted_code_e' is deprecated (declared at /usr/include/media/sound_manager.h:202) [-Wdeprecated-declarations] + typedef void(* sound_interrupted_cb)(sound_interrupted_code_e code, void *user_data) DEPRECATED; // will be deprecated + ^ +/usr/include/media/sound_manager.h:526:1: warning: 'volume_key_type_e' is deprecated (declared at /usr/include/media/sound_manager.h:84) [-Wdeprecated-declarations] + int sound_manager_set_volume_key_type(volume_key_type_e type) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:726:1: warning: 'sound_session_notify_cb' is deprecated [-Wdeprecated-declarations] + int sound_manager_set_session_notify_cb(sound_session_notify_cb callback, void *user_data) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:745:1: warning: 'sound_interrupted_cb' is deprecated [-Wdeprecated-declarations] + int sound_manager_set_interrupted_cb(sound_interrupted_cb callback, void *user_data) DEPRECATED;// will be deprecated; + ^ +/usr/include/media/sound_manager.h:991:1: warning: 'sound_route_e' is deprecated (declared at /usr/include/media/sound_manager.h:363) [-Wdeprecated-declarations] + typedef bool(* sound_available_route_cb)(sound_route_e route, void *user_data) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:1001:1: warning: 'sound_route_e' is deprecated (declared at /usr/include/media/sound_manager.h:363) [-Wdeprecated-declarations] + typedef void(* sound_available_route_changed_cb)(sound_route_e route, bool available, void *user_data) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:1010:1: warning: 'sound_device_in_e' is deprecated (declared at /usr/include/media/sound_manager.h:339) [-Wdeprecated-declarations] + typedef void(* sound_active_device_changed_cb)(sound_device_in_e in, sound_device_out_e out, void *user_data) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:1010:1: warning: 'sound_device_out_e' is deprecated (declared at /usr/include/media/sound_manager.h:348) [-Wdeprecated-declarations] +/usr/include/media/sound_manager.h:1022:1: warning: 'sound_available_route_cb' is deprecated [-Wdeprecated-declarations] + int sound_manager_foreach_available_route (sound_available_route_cb callback, void *user_data) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:1032:1: warning: 'sound_route_e' is deprecated (declared at /usr/include/media/sound_manager.h:363) [-Wdeprecated-declarations] + int sound_manager_set_active_route (sound_route_e route) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:1043:1: warning: 'sound_device_in_e' is deprecated (declared at /usr/include/media/sound_manager.h:339) [-Wdeprecated-declarations] + int sound_manager_get_active_device (sound_device_in_e *in, sound_device_out_e *out) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:1043:1: warning: 'sound_device_out_e' is deprecated (declared at /usr/include/media/sound_manager.h:348) [-Wdeprecated-declarations] +/usr/include/media/sound_manager.h:1052:1: warning: 'sound_route_e' is deprecated (declared at /usr/include/media/sound_manager.h:363) [-Wdeprecated-declarations] + bool sound_manager_is_route_available (sound_route_e route) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:1065:1: warning: 'sound_available_route_changed_cb' is deprecated [-Wdeprecated-declarations] + int sound_manager_set_available_route_changed_cb (sound_available_route_changed_cb callback, void *user_data) DEPRECATED;// will be deprecated + ^ +/usr/include/media/sound_manager.h:1084:1: warning: 'sound_active_device_changed_cb' is deprecated [-Wdeprecated-declarations] + int sound_manager_set_active_device_changed_cb (sound_active_device_changed_cb callback, void *user_data); + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/src/settings_provider.c: In function '_get_int': +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/src/settings_provider.c:403:20: warning: unused variable 'index' [-Wunused-variable] + int status, size, index; + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/src/settings_provider.c:403:14: warning: unused variable 'size' [-Wunused-variable] + int status, size, index; + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/src/settings_provider.c: At top level: +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/src/settings_provider.c:170:21: warning: 'sleeptimer_value' defined but not used [-Wunused-variable] + static unsigned int sleeptimer_value[] = { + ^ +/home/abuild/rpmbuild/BUILD/org.tizen.settings-tv-ref-0.1/src/settings_provider.c:313:12: warning: '_find_index' defined but not used [-Wunused-function] + static int _find_index(unsigned int *array, int size, int val, int *index) + ^ +[100%] Building C object CMakeFiles/settings-tv-ref.dir/src/view_need_pwd.c.o +Building C object CMakeFiles/settings-tv-ref.dir/src/timeout_handler.c.o +Linking C executable settings-tv-ref +[100%] Built target settings-tv-ref ++ echo Build Done +Build Done diff --git a/org.tizen.settings-tv-ref.manifest b/org.tizen.settings-tv-ref.manifest new file mode 100755 index 0000000..e74f9d1 --- /dev/null +++ b/org.tizen.settings-tv-ref.manifest @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.tizen.settings-tv-ref.png b/org.tizen.settings-tv-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..8b143f37dc9bea4b8827822d768feb5ebc6273d3 GIT binary patch literal 21525 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 literal 0 HcmV?d00001 diff --git a/org.tizen.settings-tv-ref.xml.in b/org.tizen.settings-tv-ref.xml.in new file mode 100644 index 0000000..16bdaec --- /dev/null +++ b/org.tizen.settings-tv-ref.xml.in @@ -0,0 +1,10 @@ + + + + Rong Jinhui + settings-tv-ref Application + + + @DESKTOP_ICON@ + + diff --git a/org.tizen.settings-tv-ref_4x2.png b/org.tizen.settings-tv-ref_4x2.png new file mode 100644 index 0000000000000000000000000000000000000000..a02e5e700c636f6446ff758b4182c9f539e95b31 GIT binary patch literal 89073 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 KL=HmIuOYXQz?Bo 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, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-24 10:49+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/main.c:91 +msgid "ok" +msgstr "" diff --git a/po/update-po.sh b/po/update-po.sh new file mode 100644 index 0000000..17b9428 --- /dev/null +++ b/po/update-po.sh @@ -0,0 +1,59 @@ +#!/bin/sh + +APPNAME=org.tizen.settings +SRCROOT=../ +POTFILES=POTFILES.in + +ALL_LINGUAS="de_DE el_GR en es_ES fr_FR it_IT ja_JP ko_KR nl_NL pt_PT ru_RU tr_TR zh_CN zh_HK zh_TW" + +XGETTEXT=/usr/bin/xgettext +MSGMERGE=/usr/bin/msgmerge + +echo -n "Make ${APPNAME}.pot " +if [ ! -e $POTFILES ] ; then + echo "$POTFILES not found" + exit 1 +fi + +$XGETTEXT --default-domain=${APPNAME} --directory=${SRCROOT} \ + --add-comments --keyword=_ --keyword=N_ --files-from=$POTFILES +if [ $? -ne 0 ]; then + echo "xgettext error" + exit 1 +fi + +if [ ! -f ${APPNAME}.po ]; then + echo "No such file: ${APPNAME}.po" + exit 1 +fi + +rm -f ${APPNAME}.pot && sudo mv ${APPNAME}.po ${APPNAME}.pot +echo "done" + +for LANG in $ALL_LINGUAS; do + echo "$LANG : " + + if [ ! -e $LANG.po ] ; then + sed 's/CHARSET/UTF-8/g' ${APPNAME}.pot > ${LANG}.po + echo "${LANG}.po created" + else + if $MSGMERGE ${LANG}.po ${APPNAME}.pot -o ${LANG}.new.po ; then + if cmp ${LANG}.po ${LANG}.new.po > /dev/null 2>&1; then + rm -f ${LANG}.new.po + else + if mv -f ${LANG}.new.po ${LANG}.po; then + echo "" + else + echo "msgmerge for $LANG.po failed: cannot move $LANG.new.po to $LANG.po" 1>&2 + rm -f ${LANG}.new.po + exit 1 + fi + fi + else + echo "msgmerge for $LANG failed!" + rm -f ${LANG}.new.po + fi + fi + echo "" +done + diff --git a/src/data_wrapper.c b/src/data_wrapper.c new file mode 100644 index 0000000..59327bf --- /dev/null +++ b/src/data_wrapper.c @@ -0,0 +1,1554 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "data_wrapper.h" +#include "dbg.h" + +struct settingui_args { + char *keyname; + char *value; +}; + +struct setting_ui { + char *style; + char *name; + Eina_List *args; +}; + +struct listitem { + char *display_name; + char *value; +}; + +struct slideritem { + char *min_value; + char *min_disp_value; + char *max_value; + char *max_disp_value; + char *step_value; + char *step_disp_value; +}; + +struct uidata { + char *key; + char *type; + Eina_List *item; + struct slideritem *slider_item; +}; + +struct settingitem { + char item_name[ARRAY_SIZE]; + char *display_name; + char *style; + char *status; + struct setting_ui *setting_ui; + struct uidata *data; + Eina_List *sub_settingitems; + Eina_List *group_list; + char *parent_item; +}; + +struct settingmgr_data { + Eina_Hash *jsonhash; + Eina_List *parsed_json_file; +}; + +struct settingview_data { + struct settingitem *parentitem; + Eina_Array *childitems; +}; + +/** +* This function is invoked to release slider item data. +* +* @param item [in] The slideritem data pointer. +* @return void. +*/ +static void _free_slider_item(struct slideritem *item) +{ + if (!item) { + _ERR("Invalid argument"); + return; + } + + free(item->min_value); + free(item->min_disp_value); + free(item->max_value); + free(item->max_disp_value); + free(item->step_value); + free(item->step_disp_value); + free(item); +} + +/** +* This function is invoked to release item list data. +* +* @param list [in] The Eina_List data pointer. +* @return void. +*/ +static void _free_list_item(Eina_List *list) +{ + struct listitem *litem; + + if (!list) { + _ERR("Invalid argument"); + return; + } + + EINA_LIST_FREE(list, litem) { + free(litem->display_name); + free(litem->value); + free(litem); + } +} + +/** +* This function is invoked to release item UI data. +* +* @param data [in] The uidata data pointer. +* @return void. +*/ +static void _free_uidata(struct uidata *data) +{ + if (!data) { + _ERR("Invalid argument"); + return; + } + + free(data->key); + free(data->type); + _free_slider_item(data->slider_item); + _free_list_item(data->item); + free(data); +} + +/** +* This function is invoked to release UI arguments list. +* +* @param list [in] The Eina_List data pointer. +* @return void. +*/ +static void _free_ui_args(Eina_List *list) +{ + struct settingui_args *args; + + if (!list) { + _ERR("Invalid argument"); + return; + } + + EINA_LIST_FREE(list, args) { + free(args->keyname); + free(args->value); + free(args); + } +} + +/** +* This function is invoked to release setting UI data. +* +* @param data [in] The setting_ui data pointer. +* @return void. +*/ +static void _free_setting_ui(struct setting_ui *data) +{ + if (!data) { + _ERR("Invalid argument"); + return; + } + + free(data->style); + free(data->name); + _free_ui_args(data->args); + free(data); +} + +/** +* This function is invoked to release string list. +* +* @param list [in] The Eina_List data pointer. +* @return void. +*/ +static void _free_str_list(Eina_List *list) +{ + char *item; + + if (!list) { + _ERR("Invalid argument"); + return; + } + + EINA_LIST_FREE(list, item) + free(item); +} + +/** +* This function is @Eina_Free_Cb type callback to release every +* setting item data stored in eina hash. +* +* @param data [in] The function specific data which hold settingitem pointer. +* @return void. +*/ +static void _free_settingitem_cb(void *data) +{ + struct settingitem *item; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + item = data; + + free(item->display_name); + free(item->style); + free(item->status); + _free_str_list(item->sub_settingitems); + _free_uidata(item->data); + _free_setting_ui(item->setting_ui); + free(item->parent_item); + _free_str_list(item->group_list); + free(item); +} + +/** +* This function is invoked to initialize eina hash. +* +* @param void. +* @return The Eina_Hash data pointer, NULL on error. +*/ +static Eina_Hash *_hash_init(void) +{ + Eina_Hash *hash; + + hash = eina_hash_string_superfast_new(_free_settingitem_cb); + + return hash; +} + +/** +* This function is invoked to destroy eina hash and release every element. +* +* @param hash [in] The Eina_Hash data pointer. +* @return void. +*/ +static void _hash_fini(Eina_Hash *hash) +{ + if (!hash) + return; + + eina_hash_free(hash); +} + +/** +* This function is invoked to read slider item data from json file. +* +* @param jparser [in] The json_parser data pointer. +* @param name [in] The item name to be read. +* @return The slideritem data pointer, NULL on error. +*/ +static struct slideritem *_read_slider_data_from_json( + struct json_parser *jparser, const char *name) +{ + char buf[BUF_SIZE]; + struct slideritem *item; + + if (!jparser || !name) { + _ERR("Invalid argument"); + return NULL; + } + + item = calloc(1, sizeof(struct slideritem)); + if (!item) + return NULL; + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s.%s", + name, JSONSTR_DATA, JSONSTR_DATA_SLIDER, + JSONSTR_SLIDER_MIN_DISPLAYVALUE); + item->min_disp_value = parser_get_string_value_from_json(jparser, buf); + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s.%s", + name, JSONSTR_DATA, JSONSTR_DATA_SLIDER, + JSONSTR_SLIDER_MIN_VALUE); + item->min_value = parser_get_string_value_from_json(jparser, buf); + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s.%s", + name, JSONSTR_DATA, JSONSTR_DATA_SLIDER, + JSONSTR_SLIDER_MAX_DISPLAYVALUE); + item->max_disp_value = parser_get_string_value_from_json(jparser, buf); + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s.%s", + name, JSONSTR_DATA, JSONSTR_DATA_SLIDER, + JSONSTR_SLIDER_MAX_VALUE); + item->max_value = parser_get_string_value_from_json(jparser, buf); + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s.%s", + name, JSONSTR_DATA, JSONSTR_DATA_SLIDER, + JSONSTR_SLIDER_STEP_DISPLAYVALUE); + item->step_disp_value = parser_get_string_value_from_json(jparser, buf); + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s.%s", + name, JSONSTR_DATA, JSONSTR_DATA_SLIDER, + JSONSTR_SLIDER_STEP_VALUE); + item->step_value = parser_get_string_value_from_json(jparser, buf); + + return item; +} + +/** +* This function is invoked to read list item data from json file and store them into eina list. +* +* @param jparser [in] The json_parser data pointer. +* @param name [in] The item name to be read. +* @return The Eina_List data pointer, NULL on error. +*/ +static Eina_List *_read_list_data_from_json( + struct json_parser *jparser, const char *name) +{ + char buf[BUF_SIZE]; + struct listitem *item; + int i, length; + Eina_List *list; + + if (!jparser || !name) { + _ERR("Invalid argument"); + return NULL; + } + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s", name, + JSONSTR_DATA, JSONSTR_DATA_LIST); + length = parser_get_array_length_from_json(jparser, buf); + + list = NULL; + + for (i = 0; i < length; i++) { + item = calloc(1, sizeof(struct listitem)); + if (!item) { + _free_list_item(list); + return NULL; + } + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s[%d].%s", + name, JSONSTR_DATA, JSONSTR_DATA_LIST, + i, JSONSTR_LIST_DISPLAYVALUE); + item->display_name = parser_get_string_value_from_json( + jparser, buf); + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s[%d].%s", + name, JSONSTR_DATA, JSONSTR_DATA_LIST, + i, JSONSTR_LIST_VALUE); + item->value = parser_get_string_value_from_json(jparser, buf); + + list = eina_list_append(list, item); + } + + return list; +} + +/** +* This function is invoked to read setting UI property's arguments list from json file. +* +* @param jparser [in] The json_parser data pointer. +* @param name [in] The item name to be read. +* @return The Eina_List data pointer, NULL on error. +*/ +static Eina_List *_get_settingui_args_list( + struct json_parser *jparser, const char *name) +{ + int i, cnt; + char **args; + struct settingui_args *data; + Eina_List *list; + char buf[BUF_SIZE]; + + if (!jparser || !name) { + _ERR("Invalid argument"); + return NULL; + } + + cnt = 0; + args = parser_get_settingui_args_from_json(jparser, + name, JSONSTR_SETTINGUI, &cnt); + if (!args) + return NULL; + + list = NULL; + + for (i = 0; i < cnt; i++) { + if (!args[i]) { + _ERR("Memory error"); + goto error; + } + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("Allocate memory failed"); + goto error; + } + + data->keyname = calloc(1, sizeof(char) * ARRAY_SIZE); + if (!data->keyname) { + _ERR("Allocate memory failed"); + free(data); + goto error; + } + + strncpy((char *)data->keyname, args[i], ARRAY_SIZE - 1); + + snprintf(buf, sizeof(buf), "$.menuitems.%s.%s.%s.%s", + name, JSONSTR_SETTINGUI, + JSONSTR_SETTINGUI_ARGS, args[i]); + data->value = parser_get_string_value_from_json(jparser, buf); + + list = eina_list_append(list, data); + } + + parser_release_member_list(args); + + return list; + +error: + parser_release_member_list(args); + _free_ui_args(list); + + return NULL; +} + +/** +* This function is invoked to read setting item's "data" property infomation from json file. +* +* @param jparser [in] The json_parser data pointer. +* @param name [in] The item name to be read. +* @return The uidata data pointer, NULL on error. +*/ +static struct uidata *_get_datainfo_from_json( + struct json_parser *jparser, const char *name) +{ + char **list; + int cnt, i; + char buf[BUF_SIZE]; + struct uidata *data; + + if (!jparser || !name) { + _ERR("Invalid argument"); + return NULL; + } + + data = calloc(1, sizeof(struct uidata)); + if (!data) + return NULL; + + cnt = 0; + list = parser_get_data_list_from_json(jparser, name, &cnt); + if (!list) { + _free_uidata(data); + return NULL; + } + + for (i = 0; i < cnt; i++) { + if (!list[i]) { + _ERR("Memory error"); + parser_release_member_list(list); + _free_uidata(data); + return NULL; + } + + if (!strncmp(list[i], JSONSTR_DATA_KEY, strlen(list[i]))) { + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s", + name, JSONSTR_DATA, JSONSTR_DATA_KEY); + data->key = parser_get_string_value_from_json( + jparser, buf); + } else if (!strncmp(list[i], JSONSTR_DATA_TYPE, + strlen(list[i]))) { + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s.%s", + name, JSONSTR_DATA, JSONSTR_DATA_TYPE); + data->type = parser_get_string_value_from_json( + jparser, buf); + } else if (!strncmp(list[i], JSONSTR_DATA_SLIDER, + strlen(list[i]))) { + data->slider_item = _read_slider_data_from_json( + jparser, name); + } else if (!strncmp(list[i], JSONSTR_DATA_LIST, + strlen(list[i]))) { + data->item = _read_list_data_from_json(jparser, name); + } + } + + parser_release_member_list(list); + + return data; +} + +/** +* This function is invoked to read setting item's infomation from json file. +* +* @param jparser [in] The json_parser data pointer. +* @param data [in] The settingitem data pointer which stored infomation read from json file. +* @param name [in] The item name to be read. +* @return void. +*/ +static void _get_iteminfo_from_json(struct json_parser *jparser, + struct settingitem *data, const char *name) +{ + struct settingitem *item; + char **list; + int cnt, i; + char buf[BUF_SIZE]; + + if (!jparser || !data || !name) { + _ERR("Invalid argument"); + return; + } + + item = data; + + cnt = 0; + list = parser_get_itemlist_from_json(jparser, name, &cnt, DRAWING_INFO); + if (!list) + return; + + for (i = 0; i < cnt; i++) { + if (!list[i]) { + _ERR("Memory error"); + parser_release_member_list(list); + return; + } + + if (!strncmp(list[i], JSONSTR_DISPLAY_NAME, strlen(list[i]))) { + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s", + name, JSONSTR_DISPLAY_NAME); + item->display_name = parser_get_string_value_from_json( + jparser, buf); + } else if (!strncmp(list[i], JSONSTR_STYLE, strlen(list[i]))) { + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s", + name, JSONSTR_STYLE); + item->style = parser_get_string_value_from_json( + jparser, buf); + } else if (!strncmp(list[i], JSONSTR_STATUS, strlen(list[i]))) { + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s", + name, JSONSTR_STATUS); + item->status = parser_get_string_value_from_json( + jparser, buf); + } else if (!strncmp(list[i], JSONSTR_SETTINGUI, + strlen(list[i]))) { + item->setting_ui = calloc(1, sizeof(struct setting_ui)); + if (!item->setting_ui) + continue; + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s", name, + JSONSTR_SETTINGUI_STYLE); + item->setting_ui->style = + parser_get_string_value_from_json( + jparser, buf); + + snprintf(buf, sizeof(buf), "$.settingitems.%s.%s", name, + JSONSTR_SETTINGUI_NAME); + item->setting_ui->name = + parser_get_string_value_from_json( + jparser, buf); + item->setting_ui->args = _get_settingui_args_list( + jparser, name); + } else if (!strncmp(list[i], JSONSTR_DATA, strlen(list[i]))) { + item->data = _get_datainfo_from_json(jparser, name); + if (!item->data) + continue; + } + } + + parser_release_member_list(list); +} + +/** +* This function is invoked to read setting tree's infomation from json file. +* +* @param jparser [in] The json_parser data pointer. +* @param data [in] The settingitem data pointer which stored infomation read from json file. +* @param name [in] The item name to be read. +* @return void. +*/ +static void _get_treeinfo_from_json(struct json_parser *jparser, + struct settingitem *data, const char *name) +{ + struct settingitem *item; + char **list; + int cnt, i; + char buf[BUF_SIZE]; + + if (!jparser || !data || !name) { + _ERR("Invalid argument"); + return; + } + + item = data; + cnt = 0; + + list = parser_get_itemlist_from_json(jparser, name, &cnt, SUBMENU_INFO); + if (!list) + return; + + for (i = 0; i < cnt; i++) { + if (!list[i]) { + _ERR("Memory error"); + parser_release_member_list(list); + return; + } + + if (!strncmp(list[i], JSONSTR_SUBSETTING_SUBITEMS, + strlen(list[i]))) { + snprintf(buf, sizeof(buf), "$.settingtree.%s.%s", + name, JSONSTR_SUBSETTING_SUBITEMS); + item->sub_settingitems = + parser_get_string_list_from_json( + jparser, buf); + } else if (!strncmp(list[i], JSONSTR_SUBSETTING_PARENTITEM, + strlen(list[i]))) { + snprintf(buf, sizeof(buf), "$.settingtree.%s.%s", + name, JSONSTR_SUBSETTING_PARENTITEM); + item->parent_item = parser_get_string_value_from_json( + jparser, buf); + } else if (!strncmp(list[i], JSONSTR_GROUP, strlen(list[i]))) { + snprintf(buf, sizeof(buf), "$.settingtree.%s.%s", + name, JSONSTR_GROUP); + item->group_list = parser_get_string_list_from_json( + jparser, buf); + } + } + + parser_release_member_list(list); +} + +/** +* This function is invoked to read item infomation from json file. +* +* @param jparser [in] The json_parser data pointer. +* @param name [in] The item name to be read. +* @return The settingitem data pointer, NULL on error. +*/ +static struct settingitem *_get_settingitem_from_json( + struct json_parser *jparser, const char *name) +{ + struct settingitem *item; + + if (!jparser || !name) { + _ERR("Parameter error!"); + return NULL; + } + + item = calloc(1, sizeof(*item)); + if (!item) + return NULL; + + item->parent_item = NULL; + item->sub_settingitems = NULL; + + strncpy(item->item_name, name, ARRAY_SIZE - 1); + + _get_iteminfo_from_json(jparser, item, name); + _get_treeinfo_from_json(jparser, item, name); + + return item; +} + +/** +* This function is invoked to merge item infomation between existed and new item. +* +* @param existed [in] The existed settingitem data pointer. +* @param newer [in] The new settingitem data pointer. +* @return void. +*/ +static void _merge_settingitems(struct settingitem *existed, + struct settingitem *newer) +{ + if (!existed || !newer) { + _ERR("Invalid argument"); + return; + } + + if (newer->sub_settingitems) { + _free_str_list(existed->sub_settingitems); + existed->sub_settingitems = newer->sub_settingitems; + } + + if (newer->parent_item) { + free(existed->parent_item); + existed->parent_item = newer->parent_item; + } + + if (newer->display_name) { + free(existed->display_name); + existed->display_name = newer->display_name; + } + + if (newer->setting_ui) { + _free_setting_ui(existed->setting_ui); + existed->setting_ui = newer->setting_ui; + } + + if (newer->style) { + free(existed->style); + existed->style = newer->style; + } + + if (newer->data) { + _free_uidata(existed->data); + existed->data = newer->data; + } + + if (newer->group_list) { + _free_str_list(existed->group_list); + existed->group_list = newer->group_list; + } +} + +/** +* This function is invoked to read a json file and store item infomation to eina hash. +* +* @param hash [in] The Eina_Hash data pointer. +* @param conf [in] The absolute json file path. +* @param name [in] The json file name. +* @return 0 if success, -1 if fail. +*/ +static int _write_settingitems_to_hash(Eina_Hash *hash, + const char *conf, const char *name) +{ + struct json_parser *jparser; + char **list; + struct settingitem *newer; + struct settingitem *existed; + JsonReader *reader; + char path[ARRAY_SIZE]; + int cnt, i; + + if (!hash || !name) { + _ERR("Parameter error!"); + return -1; + } + + if (!conf) + snprintf(path, sizeof(path), "%s/%s.json", + JSON_OUTPUT_DIR, name); + else + snprintf(path, sizeof(path), "%s", conf); + + jparser = parser_init(path); + if (!jparser) { + _ERR("parser_init failed!\n"); + return -1; + } + + reader = parser_get_json_reader(jparser); + if (!reader) { + _ERR("parser_get_json_reader failed!\n"); + parser_fini(jparser); + return -1; + } + + json_reader_read_member(reader, JSONSTR_SETTING_ITEMS); + cnt = json_reader_count_members(reader); + list = json_reader_list_members(reader); + json_reader_end_member(reader); + + for (i = 0; i < cnt; i++) { + newer = _get_settingitem_from_json(jparser, list[i]); + if (!newer) + continue; + + existed = eina_hash_find(hash, list[i]); + if (!existed) + eina_hash_add(hash, list[i], newer); + else + _merge_settingitems(existed, newer); + } + + newer = _get_settingitem_from_json(jparser, name); + existed = eina_hash_find(hash, name); + if (!existed) + eina_hash_add(hash, name, newer); + else + _merge_settingitems(existed, newer); + + parser_release_member_list(list); + parser_fini(jparser); + + return 0; +} + +/** +* This function is invoked to check slider item style. +* +* @param hash [in] The settingitem data pointer. +* @return true if style is bottom slider or bottom 2-way slider +* false if style is other kind of view. +*/ +static bool _check_slider_item(struct settingitem *item) +{ + const char *style; + + if (!item) { + _ERR("Invalid argument"); + return false; + } + + style = settingitem_get_settingui_style(item); + if (!style) + return false; + + if (!strncmp(style, STYLE_BOTTOMSLIDER, strlen(style)) || + !strncmp(style, STYLE_BOTTOM2WAYSLIDER, strlen(style))) + return true; + + return false; +} + +/** +* This function is invoked to tranform string type value to float. +* +* @param str [in] The string value. +* @param val [out] The float value. +* @return 0 if success, -1 if fail. +*/ +static int _get_slider_value(const char *str, double *val) +{ + if (!str || !strlen(str) || !val) { + _ERR("Invalid argument"); + return -1; + } + + *val = atof(str); + + return 0; +} + +/** +* This function is invoked to create and initialize setting manager data structure. +* +* @param void. +* @return The settingmgr_data data pointer, NULL on error. +*/ +struct settingmgr_data *viewmgr_data_init(void) +{ + struct settingmgr_data *data; + + data = calloc(1, sizeof(struct settingmgr_data)); + if (!data) { + _ERR("calloc data failed\n"); + return NULL; + } + + data->jsonhash = _hash_init(); + if (!data->jsonhash) { + free(data); + return NULL; + } + + data->parsed_json_file = NULL; + + return data; +} + +/** +* This function is invoked to destroy and release setting manager data structure. +* +* @param data [in] The settingmgr_data data pointer. +* @return void. +*/ +void viewmgr_data_fini(struct settingmgr_data *data) +{ + char *node; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + _hash_fini(data->jsonhash); + + if (data->parsed_json_file) { + EINA_LIST_FREE(data->parsed_json_file, node) + free(node); + } + + free(data); +} + +/** +* This function is invoked to get setting item data with specific name. +* +* @param data [in] The settingmgr_data data pointer. +* @param name [in] The item name want to get. +* @return The settingitem data pointer, NULL on error. +*/ +struct settingitem *viewmgr_data_get_settingitem( + struct settingmgr_data *data, const char *name) +{ + struct settingitem *item; + + if (!name || !data) + return NULL; + + item = eina_hash_find(data->jsonhash, name); + + return item; +} + +/** +* This function is invoked to parse specific json file and store data into eina hash. +* +* @param data [in] The settingmgr_data data pointer. +* @param name [in] The item name want to read. +* @return 0 if success, -1 if fail. +*/ +int viewmgr_data_read_jsonfile_into_hash( + struct settingmgr_data *data, const char *name) +{ + char *tmp; + const char *style, *ui_name; + struct settingitem *item; + Eina_Hash *hash; + Eina_List *list, *l; + int r, flag; + + if (!data || !name) { + _ERR("Parameter error!"); + return -1; + } + + hash = data->jsonhash; + list = data->parsed_json_file; + flag = 1; + + item = viewmgr_data_get_settingitem(data, name); + style = settingitem_get_settingui_style(item); + ui_name = settingitem_get_settingui_name(item); + + if (style && !ui_name && strncmp(style, + STYLE_NEED_PASSCODE, strlen(style))) + return 0; + + if (style && ui_name && !strncmp(style, STYLE_UIGADGET, strlen(style))) + return 0; + + EINA_LIST_FOREACH(list, l, tmp) { + if (!strncmp(tmp, name, BUF_SIZE)) + flag = 0; + } + + if (flag) { + r = _write_settingitems_to_hash(hash, NULL, name); + if (r == -1) { + _ERR("_write_settingitems_to_hash failed!\n"); + return -1; + } + + tmp = strdup(name); + data->parsed_json_file = eina_list_prepend( + data->parsed_json_file, tmp); + } + + return 0; +} + +/** +* This function is invoked to build setting manager data structure with specific name. +* +* @param sdata [in] The settingmgr_data data pointer. +* @param name [in] The item name. +* @return The settingview_data data pointer, NULL on error. +*/ +struct settingview_data *viewmgr_data_build_view( + struct settingmgr_data *sdata, const char *name) +{ + Eina_List *list, *l; + struct settingitem *item; + const char *node; + struct settingview_data *vdata; + + if (!sdata || !name) { + _ERR("Parameter error!"); + return NULL; + } + + vdata = viewdata_allocate(); + if (!vdata) { + _ERR("Allocate memory failed"); + return NULL; + } + + item = NULL; + l = NULL; + + vdata->parentitem = viewmgr_data_get_settingitem(sdata, name); + list = settingitem_get_subitems(vdata->parentitem); + if (list) { + vdata->childitems = eina_array_new(1); + EINA_LIST_FOREACH(list, l, node) { + item = viewmgr_data_get_settingitem(sdata, node); + if (!item) { + _ERR("childitem not found, continuing"); + continue; + } + + eina_array_push(vdata->childitems, item); + } + } + + return vdata; +} + +/** +* This function is invoked to get sub item list from setting item data structure. +* +* @param sitem [in] The settingitem data pointer. +* @return The Eina_List data pointer, NULL on error. +*/ +Eina_List *settingitem_get_subitems(struct settingitem *sitem) +{ + if (!sitem) + return NULL; + + return sitem->sub_settingitems; +} + +/** +* This function is invoked to get item group list from setting item data structure. +* +* @param sitem [in] The settingitem data pointer. +* @return The Eina_List data pointer, NULL on error. +*/ +Eina_List *settingitem_get_group_list(struct settingitem *sitem) +{ + if (!sitem) + return NULL; + + return sitem->group_list; +} + +/** +* This function is invoked to get parent item name from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The string value, NULL on error. +*/ +const char *settingitem_get_parentitem(struct settingitem *item) +{ + if (!item) + return NULL; + + return item->parent_item; +} + +/** +* This function is invoked to get item display name from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The string value, NULL on error. +*/ +const char *settingitem_get_display_name(struct settingitem *item) +{ + if (!item) + return NULL; + + return item->display_name; +} + +/** +* This function is invoked to get item id from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The string value, NULL on error. +*/ +const char *settingitem_get_id(struct settingitem *item) +{ + if (!item) + return NULL; + + return item->item_name; +} + +/** +* This function is invoked to get item style from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The string value, NULL on error. +*/ +const char *settingitem_get_style(struct settingitem *item) +{ + if (!item) + return NULL; + + return item->style; +} + +/** +* This function is invoked to get item status from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The string value, NULL on error. +*/ +const char *settingitem_get_status(struct settingitem *item) +{ + if (!item) + return NULL; + + return item->status; +} + +/** +* This function is invoked to get item's setting UI style from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The string value, NULL on error. +*/ +const char *settingitem_get_settingui_style(struct settingitem *item) +{ + if (!item || !item->setting_ui) + return NULL; + + return item->setting_ui->style; +} + +/** +* This function is invoked to get item's setting UI name from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The string value, NULL on error. +*/ +const char *settingitem_get_settingui_name(struct settingitem *item) +{ + if (!item || !item->setting_ui) + return NULL; + + return item->setting_ui->name; +} + +/** +* This function is invoked to get item's setting UI arguments from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The Eina_List data pointer, NULL on error. +*/ +Eina_List *settingitem_get_settingui_args(struct settingitem *item) +{ + if (!item || !item->setting_ui) + return NULL; + + return item->setting_ui->args; +} + +/** +* This function is invoked to get item's data key value from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The string value, NULL on error. +*/ +const char *settingitem_get_data_key(struct settingitem *item) +{ + if (!item || !item->data) + return NULL; + + return item->data->key; +} + +/** +* This function is invoked to get item's data type value from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The string value, NULL on error. +*/ +const char *settingitem_get_data_type(struct settingitem *item) +{ + if (!item || !item->data) + return NULL; + + return item->data->type; +} + +/** +* This function is invoked to get item's data list from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The Eina_List data pointer, NULL on error. +*/ +Eina_List *settingitem_get_data_list(struct settingitem *item) +{ + if (!item || !item->data) + return NULL; + + return item->data->item; +} + +/** +* This function is invoked to get item's slider data from setting item data structure. +* +* @param item [in] The settingitem data pointer. +* @return The slideritem data pointer, NULL on error. +*/ +struct slideritem *settingitem_get_data_slideritem(struct settingitem *item) +{ + if (!item || !item->data) + return NULL; + + return item->data->slider_item; +} + +/** +* This function is invoked to get item's list data display name from listitem data structure. +* +* @param litem [in] The listitem data pointer. +* @return The string value, NULL on error. +*/ +const char *listitem_get_display_name(struct listitem *litem) +{ + if (!litem) + return NULL; + + return litem->display_name; +} + +/** +* This function is invoked to get item's list data value from listitem data structure. +* +* @param litem [in] The listitem data pointer. +* @return The string value, NULL on error. +*/ +const char *listitem_get_value(struct listitem *litem) +{ + if (!litem) + return NULL; + + return litem->value; +} + +/** +* This function is invoked to get item's slider minimum value from slideritem data structure. +* +* @param sitem [in] The slideritem data pointer. +* @return The string value, NULL on error. +*/ +const char *slideritem_get_min_value(struct slideritem *sitem) +{ + if (!sitem) + return NULL; + + return sitem->min_value; +} + +/** +* This function is invoked to get item's slider step value from slideritem data structure. +* +* @param sitem [in] The slideritem data pointer. +* @return The string value, NULL on error. +*/ +const char *slideritem_get_step_value(struct slideritem *sitem) +{ + if (!sitem) + return NULL; + + return sitem->step_value; +} + +/** +* This function is invoked to get item's slider maximum value from slideritem data structure. +* +* @param sitem [in] The slideritem data pointer. +* @return The string value, NULL on error. +*/ +const char *slideritem_get_max_value(struct slideritem *sitem) +{ + if (!sitem) + return NULL; + + return sitem->max_value; +} + +/** +* This function is invoked to get item's slider minimum display value +* from slideritem data structure. +* +* @param sitem [in] The slideritem data pointer. +* @return The string value, NULL on error. +*/ +const char *slideritem_get_min_display_value(struct slideritem *sitem) +{ + if (!sitem) + return NULL; + + return sitem->min_disp_value; +} + +/** +* This function is invoked to get item's slider step display value +* from slideritem data structure. +* +* @param sitem [in] The slideritem data pointer. +* @return The string value, NULL on error. +*/ +const char *slideritem_get_step_display_value(struct slideritem *sitem) +{ + if (!sitem) + return NULL; + + return sitem->step_disp_value; +} + +/** +* This function is invoked to get item's slider maximum display value +* from slideritem data structure. +* +* @param sitem [in] The slideritem data pointer. +* @return The string value, NULL on error. +*/ +const char *slideritem_get_max_display_value(struct slideritem *sitem) +{ + if (!sitem) + return NULL; + + return sitem->max_disp_value; +} + +/** +* This function is invoked to calculate slider real value with specific original value. +* +* @param val [in] The original value. +* @param data [in] The slideritem data pointer. +* @return The float slider value, 0.0 on error. +*/ +double slideritem_find_slider_value(double val, struct slideritem *data) +{ + double sval, min, max; + int r; + + if (!data) { + _ERR("Invalid arguments"); + return 0.0; + } + + min = 0.0; + max = 0.0; + + r = _get_slider_value(slideritem_get_min_value(data), &min); + if (r == -1) + return 0.0; + + r = _get_slider_value(slideritem_get_max_value(data), &max); + if (r == -1) + return 0.0; + + if (max - min == 0.0) + return 0.0; + + sval = (val - min) / (max - min); + + return sval; +} + +/** +* This function is invoked to calculate slider display value with specific real value. +* +* @param val [in] The real value. +* @param data [in] The slideritem data pointer. +* @return The float slider display value, 0.0 on error. +*/ +double slideritem_find_slider_display_value(double val, + struct slideritem *data) +{ + double sval, min, max; + int r; + + if (!data) { + _ERR("Invalid arguments"); + return 0.0; + } + + min = 0.0; + max = 0.0; + + r = _get_slider_value(slideritem_get_min_display_value(data), &min); + if (r == -1) + return 0.0; + + r = _get_slider_value(slideritem_get_max_display_value(data), &max); + if (r == -1) + return 0.0; + + sval = min + (val * (max - min)); + + return sval; +} + +/** +* This function is invoked to get parent item from setting view data. +* +* @param data [in] The settingview_data data pointer. +* @return The settingitem data pointer, NULL on error. +*/ +struct settingitem *viewdata_get_parentitem(struct settingview_data *data) +{ + if (!data) { + _ERR("Parameter error!"); + return NULL; + } + + return data->parentitem; +} + +/** +* This function is invoked to get child items array from setting view data. +* +* @param data [in] The settingview_data data pointer. +* @return The Eina_Array data pointer, NULL on error. +*/ +Eina_Array *viewdata_get_childitems(struct settingview_data *data) +{ + if (!data) { + _ERR("Parameter error!"); + return NULL; + } + + return data->childitems; +} + +/** +* This function is invoked to build child items list. +* +* @param view [in] The settingview_data data pointer. +* @return The Eina_List data pointer, NULL on error. +*/ +Eina_List *viewdata_get_childitems_list(struct settingview_data *view) +{ + int i, cnt; + Eina_List *subitems, *list; + struct settingitem *subitem; + + subitems = settingitem_get_subitems(view->parentitem); + if (!subitems) + return NULL; + + list = NULL; + cnt = eina_list_count(subitems); + for (i = 0; i < cnt; i++) { + subitem = eina_array_data_get(view->childitems, i); + list = eina_list_append(list, subitem); + } + + return list; +} + +/** +* This function is invoked to free child items list. +* +* @param list [in] The Eina_List data pointer. +* @return void. +*/ +void viewdata_free_childitems_list(Eina_List *list) +{ + if (!list) { + _ERR("the list is null."); + return; + } + + eina_list_free(list); +} + +/** +* This function is invoked to allocate setting view data. +* +* @param void. +* @return The settingview_data data pointer, NULL on error. +*/ +struct settingview_data *viewdata_allocate(void) +{ + struct settingview_data *vdata; + + vdata = calloc(1, sizeof(*vdata)); + if (!vdata) { + _ERR("Allocate memory failed\n"); + return NULL; + } + + return vdata; +} + +/** +* This function is invoked to release setting view data. +* +* @param data [in] The settingview_data data pointer. +* @return void. +*/ +void viewdata_release(struct settingview_data *data) +{ + if (!data) { + _ERR("Invalid argument"); + return; + } + + if (data->childitems) + eina_array_free(data->childitems); + + free(data); +} + +/** +* This function is invoked to get item group list, these items are slider setting UI style +* and contained specific item. +* +* @param item [in] The settingitem data pointer. +* @param sdata [in] The settingmgr_data data pointer. +* @param name [in] The item name. +* @return The Eina_List data pointer, NULL on error. +*/ +Eina_List *settingitem_get_slider_group_list(struct settingitem *item, + struct settingmgr_data *sdata, const char *name) +{ + Eina_List *l, *group, *result; + struct settingitem *sitem; + const char *node; + int found; + + if (!item || !sdata || !name) { + _ERR("Invalid argument"); + return NULL; + } + + group = settingitem_get_group_list(item); + if (!group) + return NULL; + + found = 0; + + EINA_LIST_FOREACH(group, l, node) { + if (!strncmp(name, node, strlen(name))) { + found = 1; + break; + } + } + + if (!found) + return NULL; + + result = NULL; + + EINA_LIST_FOREACH(group, l, node) { + sitem = viewmgr_data_get_settingitem(sdata, node); + if (_check_slider_item(sitem)) + result = eina_list_append(result, node); + } + + return result; +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..c152f52 --- /dev/null +++ b/src/main.c @@ -0,0 +1,326 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include "dbg.h" +#include "def.h" +#include "viewmgr.h" +#include "utils.h" +#include "json_marco.h" +#include "settings_provider.h" + +#define PARAM_SETTINGS_ITEM "settings-item" +#define MAIN_CATALOG "maincatalog" + +struct _appdata { + Evas_Object *win; + struct setting_mgr *mgr; + const char *name; + char *item; + unsigned int service; +}; + +/** +* Refresh first view stored in view list. +* +* Get first _settinginfo from view_list of setting_mgr, then call vclass->refresh +* and vclass-update to refresh. +* +* @param priv [in] The function specific data which holds _appdata pointer. +* @return void. +*/ +static void _refresh(void *priv) +{ + struct _appdata *data; + + if (!priv) + return; + + data = priv; + + if (!data->mgr) + return; + + settingmgr_view_refresh(data->mgr); +} + +/** +* Add a basic win for settings app. +* +* @param name [in] Window name. +* @return Window evas object, NULL on error. +*/ +static Evas_Object *_add_win(const char *name) +{ + Evas_Object *win; + + win = elm_win_add(NULL, name, ELM_WIN_BASIC); + if (!win) { + _ERR("failed to create window!"); + return NULL; + } + + elm_win_title_set(win, name); + elm_win_alpha_set(win, EINA_TRUE); + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_style_set(win, DEFAULT_FOCUS_INVISIBLE); + + evas_object_show(win); + + return win; +} + +/** +* An app event callback for app_efl_main. +* +* This callback is invoked once as app is launched, this function will +* initialize app. +* +* @param data [in] The function specific data passed by app_efl_main. +* @return true if success, false if fail. +*/ +static bool _create(void *data) +{ + struct _appdata *ad; + Evas_Object *win; + int r; + + ad = data; + if (!ad) + return false; + + elm_theme_overlay_add(NULL, EDJ_THEME); + + win = _add_win(ad->name); + if (!win) + return false; + + r = UG_INIT_EFL(win, UG_OPT_INDICATOR_ENABLE); + if (r == -1) { + _ERR("ug init efl failed."); + evas_object_del(win); + return false; + } + + r = provider_init(); + if (r != 0) { + _ERR("Fail to init provider module"); + evas_object_del(win); + return false; + } + + ad->win = win; + ad->service = 0; + + return true; +} + +/** +* An app event callback for app_efl_main. +* +* This callback is invoked once just before app is terminated, +* this functions will release all resources. +* +* @param data [in] The function specific data passed by app_efl_main. +* @return void. +*/ +static void _terminate(void *data) +{ + struct _appdata *ad; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + ad = data; + + settingmgr_fini(ad->mgr); + + provider_fini(); + + if (ad->win) + evas_object_del(ad->win); + + free(ad->item); +} + +/** +* An app event callback for app_efl_main. +* +* This callback is invoked when the window of app become invisible. +* +* @param data [in] The function specific data passed by app_efl_main. +* @return void. +*/ +static void _pause(void *data) +{ +} + +/** +* An app event callback for app_efl_main. +* +* This callback is invoked when the window of app become visible. +* +* @param data [in] The function specific data passed by app_efl_main. +* @return void. +*/ +static void _resume(void *data) +{ +} + +/** +* An app event callback for app_efl_main. +* +* This callback is invoked after _create callback (just after app enters main loop) +* or after "re-launch". +* +* @param service [in] The launching arguments. +* @param data [in] The function specific data passed by app_efl_main. +* @return void. +*/ +static void _service(service_h service, void *data) +{ + struct _appdata *ad; + struct setting_mgr *mgr; + int r; + char *param; + unsigned int relaunch, refresh; + + if (!data) + return; + + ad = data; + param = NULL; + + if (ad->service) { + service_get_extra_data(service, PARAM_SETTINGS_ITEM, ¶m); + if ((!param && !ad->item) || + (param && ad->item && + !strcmp(ad->item, param))) { + refresh = 1; + relaunch = 0; + } else { + refresh = 0; + relaunch = 1; + } + + if (relaunch) { + settingmgr_fini(ad->mgr); + } else { + if (refresh) + _refresh(ad); + + return; + } + } + + mgr = settingmgr_init(ad->win); + if (!mgr) + app_efl_exit(); + + r = service_get_extra_data(service, PARAM_SETTINGS_ITEM, ¶m); + if (r == SERVICE_ERROR_NONE && param) { + r = settingmgr_launch_item(mgr, param); + if (r != 0) { + _ERR("the item is not exist."); + app_efl_exit(); + } + } else { + settingmgr_view_push(mgr, MAIN_CATALOG, NULL); + } + + ad->mgr = mgr; + ad->service = 1; + + free(ad->item); + ad->item = param; +} + +/** +* An app event callback for app_efl_main. +* +* This callback is invoked when system language is changed. +* +* @param data [in] The function specific data passed by app_efl_main. +* @return void. +*/ +static void _lang_changed(void *data) +{ + struct _appdata *ad; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + ad = data; + if (!ad->mgr) + return; + + settingmgr_lang_changed(ad->mgr); +} + +/** +* An app event callback for app_efl_main. +* +* This callback is invoked when system region is changed. +* +* @param data [in] The function specific data passed by app_efl_main. +* @return void. +*/ +static void _region_changed(void *data) +{ +} + +/** +* App launching entry. +* +* @param argc [in] The launching argument numbers. +* @param argv [in] The launching argument array. +* @return 0 if success. +*/ +int main(int argc, char **argv) +{ + struct _appdata ad; + app_event_callback_s cbs = { + .create = _create, + .terminate = _terminate, + .pause = _pause, + .resume = _resume, + .service = _service, + .low_memory = NULL, + .low_battery = NULL, + .device_orientation = NULL, + .language_changed = _lang_changed, + .region_format_changed = _region_changed, + }; + + memset(&ad, 0x00, sizeof(ad)); + ad.name = PACKAGE; + + i18n_init(); + + app_efl_main(&argc, &argv, &cbs, &ad); + + return 0; +} diff --git a/src/parser.c b/src/parser.c new file mode 100644 index 0000000..285b184 --- /dev/null +++ b/src/parser.c @@ -0,0 +1,617 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "parser.h" +#include "dbg.h" +#include "stdlib.h" + +struct json_parser { + JsonParser *parser; + JsonReader *reader; + JsonGenerator *generator; +}; + +/** +* This is an Internal function, it is used to restore JsonReader location. +* +* The numbers that restored JsonReader location is as same as the numbers moved it. +* +* @param jparser [in] The json_parser data pointer. +* @param cnt [in] The numbers that need to restore. +* @return void. +*/ +static void _restore_json_reader_location(struct json_parser *jparser, + int cnt) +{ + if (!jparser || !jparser->reader) { + _ERR("Invalid argument"); + return; + } + + while (cnt > 0) { + json_reader_end_member(jparser->reader); + cnt--; + } +} + +/** +* This is an Internal function, it is used to get json property value with certain json path. +* +* Use json-glib to create JsonPath variable and load the path to find property +* location, then output property value. +* +* @param jparser [in] The json_parser data pointer. +* @param path [in] The json path. +* @return the property value, NULL on error. +*/ +static gchar *_get_jsonpath_result(struct json_parser *jparser, + const char *path) +{ + JsonPath *jpath; + JsonNode *node; + gchar *output; + + if (!jparser || !path) { + _ERR("Invalid argument!\n"); + return NULL; + } + + jpath = json_path_new(); + json_path_compile(jpath, path, NULL); + node = json_path_match(jpath, json_parser_get_root(jparser->parser)); + + json_generator_set_root(jparser->generator, node); + output = json_generator_to_data(jparser->generator, NULL); + + g_object_unref(jpath); + json_node_free(node); + + return output; +} + +/** +* Create and init a json_parser data with given json file path. +* +* @param path [in] The json file path. +* @return json_parser data pointer, NULL on error. +*/ +struct json_parser *parser_init(const char *path) +{ + struct json_parser *jparser; + GError *error; + JsonParser *parser; + JsonReader *reader; + JsonGenerator *gen; + + if (!path) { + _ERR("Invalid argument!\n"); + return NULL; + } + + jparser = calloc(1, sizeof(*jparser)); + if (!jparser) + return NULL; + + parser = json_parser_new(); + if (!parser) { + _ERR("json_parser_new failed\n"); + free(jparser); + return NULL; + } + + reader = json_reader_new(NULL); + if (!reader) { + _ERR("json_reader_new failed\n"); + free(jparser); + g_object_unref(parser); + return NULL; + } + + gen = json_generator_new(); + if (!gen) { + _ERR("json_reader_new failed\n"); + free(jparser); + g_object_unref(parser); + g_object_unref(reader); + return NULL; + } + + error = NULL; + json_parser_load_from_file(parser, path, &error); + if (error) { + _ERR("json file error: %s", error->message); + free(jparser); + g_error_free(error); + g_object_unref(parser); + g_object_unref(reader); + g_object_unref(gen); + return NULL; + } + + json_reader_set_root(reader, json_parser_get_root(parser)); + + jparser->parser = parser; + jparser->reader = reader; + jparser->generator = gen; + + return jparser; +} + +/** +* Destroy and release given json_parser data. +* +* @param jparser [in] The json_parser data pointer to be release. +* @return void. +*/ +void parser_fini(struct json_parser *jparser) +{ + if (!jparser) + return; + + g_object_unref(jparser->parser); + g_object_unref(jparser->reader); + g_object_unref(jparser->generator); + free(jparser); +} + +/** +* Release given json property key-value pair list. +* +* @param list [in] The given property key-value pair list array. +* @return void. +*/ +void parser_release_member_list(char **list) +{ + if (!list) + return; + + g_strfreev(list); +} + +/** +* Get JsonReader pointer from given json_parser data. +* +* @param jparser [in] The json_parser data pointer. +* @return JsonReader pointer, NULL on error. +*/ +JsonReader *parser_get_json_reader(struct json_parser *jparser) +{ + if (!jparser) { + _ERR("Parameter error!"); + return NULL; + } + + return jparser->reader; +} + +/** +* Get JsonParser pointer from given json_parser data. +* +* @param jparser [in] The json_parser data pointer. +* @return JsonParser pointer, NULL on error. +*/ +JsonParser *parser_get_json_parser(struct json_parser *jparser) +{ + if (!jparser) { + _ERR("Parameter error!"); + return NULL; + } + + return jparser->parser; +} + +/** +* Get JsonGenerator pointer from given json_parser data. +* +* @param jparser [in] The json_parser data pointer. +* @return JsonGenerator pointer, NULL on error. +*/ +JsonGenerator *parser_get_json_generator(struct json_parser *jparser) +{ + if (!jparser) { + _ERR("Parameter error!"); + return NULL; + } + + return jparser->generator; +} + +/** +* Retrieve given item property key-value pair list from json file. +* +* According to info_type value to determine to locate either settingitems or settingtree json object, +* then retrieve given item property key-value pair list. +* +* @param jparser [in] The json_parser data pointer. +* @param name [in] The item name. +* @param cnt [out] The property key-value pair numbers. +* @param flag [in] The info type, it stand for "settingitems" or "settingtree". +* @return given property key-value pair list, NULL on error. +*/ +char **parser_get_itemlist_from_json(struct json_parser *jparser, + const char *name, int *cnt, enum info_type flag) +{ + char **list; + int cursor; + + if (!jparser || !name || !cnt) { + _ERR("Invalid argument!"); + return NULL; + } + + cursor = 0; + + if (flag == DRAWING_INFO) { + if (!json_reader_read_member(jparser->reader, + JSONSTR_SETTING_ITEMS)) + goto error; + } else if (flag == SUBMENU_INFO) { + if (!json_reader_read_member(jparser->reader, + JSONSTR_SETTING_TREE)) + goto error; + } else { + goto error; + } + + cursor++; + + if (!json_reader_read_member(jparser->reader, name)) + goto error; + + cursor++; + + *cnt = json_reader_count_members(jparser->reader); + list = json_reader_list_members(jparser->reader); + _restore_json_reader_location(jparser, cursor); + + return list; + +error: + _restore_json_reader_location(jparser, cursor); + *cnt = 0; + + return NULL; +} + +/** +* Retrieve given item setting UI args property key-value pair list from json file. +* +* According to name value to locate given item of settingitems object, +* then retrieve setting UI args property key-value pair list. +* +* @param jparser [in] The json_parser data pointer. +* @param name [in] The item name. +* @param pnode [in] The args's parent json node name. +* @param cnt [out] The property key-value pair numbers. +* @return given property key-value pair list, NULL on error. +*/ +char **parser_get_settingui_args_from_json(struct json_parser *jparser, + const char *name, const char *pnode, int *cnt) +{ + char **list; + int cursor; + + if (!jparser || !name || !cnt || !pnode) + return NULL; + + cursor = 0; + + if (!json_reader_read_member(jparser->reader, JSONSTR_SETTING_ITEMS)) + goto error; + + cursor++; + + if (!json_reader_read_member(jparser->reader, name)) + goto error; + + cursor++; + + if (!json_reader_read_member(jparser->reader, pnode)) + goto error; + + cursor++; + + if (!json_reader_read_member(jparser->reader, JSONSTR_SETTINGUI_ARGS)) + goto error; + + cursor++; + + *cnt = json_reader_count_members(jparser->reader); + list = json_reader_list_members(jparser->reader); + _restore_json_reader_location(jparser, cursor); + + return list; + +error: + _restore_json_reader_location(jparser, cursor); + *cnt = 0; + + return NULL; +} + +/** +* Retrieve given item data property key-value pair list from json file. +* +* According to name value to locate given item of settingitems object, +* then retrieve data property key-value pair list. +* +* @param jparser [in] The json_parser data pointer. +* @param name [in] The item name. +* @param cnt [out] The property key-value pair numbers. +* @return given property key-value pair list, NULL on error. +*/ +char **parser_get_data_list_from_json(struct json_parser *jparser, + const char *name, int *cnt) +{ + char **list; + int cursor; + + if (!jparser || !name || !cnt) + return NULL; + + cursor = 0; + + if (!json_reader_read_member(jparser->reader, JSONSTR_SETTING_ITEMS)) + goto error; + + cursor++; + + if (!json_reader_read_member(jparser->reader, name)) + goto error; + + cursor++; + + if (!json_reader_read_member(jparser->reader, JSONSTR_DATA)) + goto error; + + cursor++; + + *cnt = json_reader_count_members(jparser->reader); + list = json_reader_list_members(jparser->reader); + _restore_json_reader_location(jparser, cursor); + + return list; + +error: + _restore_json_reader_location(jparser, cursor); + *cnt = 0; + + return NULL; +} + +/** +* Retrieve property value with given json path. +* +* Get property raw value with given json path, then trim raw value and copy it to buffer +* and return buffer pointer. +* +* @param jparser [in] The json_parser data pointer. +* @param path [in] The json path. +* @return given property string value, NULL on error. +*/ +char *parser_get_string_value_from_json(struct json_parser *jparser, + const char *path) +{ + gchar *output; + char *result; + char **arr; + unsigned int cnt; + + if (!jparser || !path) { + _ERR("Invalid argument!\n"); + return NULL; + } + + output = _get_jsonpath_result(jparser, path); + if (!output) { + _ERR("WRONG PATH:%s", path); + return NULL; + } + + if (!strcmp(output, "[]") || + !strncmp(output, "[\n]", strlen(output))) { + g_free(output); + return NULL; + } + + result = calloc(1, sizeof(char) * ARRAY_SIZE); + if (!result) { + g_free(output); + return NULL; + } + + cnt = 0; + arr = eina_str_split_full(output, "\"", 0, &cnt); + + if (cnt == 3) + strncpy(result, arr[1], ARRAY_SIZE - 1); + else if (cnt > 3) + _ERR("Wrong API called %d", cnt); + + free(arr[0]); + free(arr); + g_free(output); + + return result; +} + +/** +* Retrieve property array value with given json path. +* +* Get property raw array value with given json path, then trim raw array value and iterate it +* to get every string value and store them into eina list. +* +* @param jparser [in] The json_parser data pointer. +* @param path [in] The json path. +* @return given property string value eina list, NULL on error. +*/ +Eina_List *parser_get_string_list_from_json(struct json_parser *jparser, + const char *path) +{ + gchar *output; + char **arr; + unsigned int i, cnt; + Eina_List *list; + char *result; + + if (!jparser || !path) + return NULL; + + output = _get_jsonpath_result(jparser, path); + + if (!output) { + _ERR("Data from json is NULL"); + return NULL; + } + + if (!strncmp(output, "[]", strlen(output)) || + !strncmp(output, "[\n]", strlen(output))) { + g_free(output); + return NULL; + } + + cnt = 0; + arr = eina_str_split_full(output, "\"", 0, &cnt); + cnt /= 2; + + list = NULL; + for (i = 0; i < cnt; i++) { + result = calloc(1, sizeof(char) * ARRAY_SIZE); + if (!result) { + free(arr[0]); + free(arr); + g_free(output); + return NULL; + } + + strncpy(result, arr[2*i+1], ARRAY_SIZE - 1); + list = eina_list_append(list, result); + } + + free(arr[0]); + free(arr); + g_free(output); + + return list; +} + +/** +* Retrieve property array length with given json path. +* +* According to path to locate json property node, then get the given node's array length. +* +* @param jparser [in] The json_parser data pointer. +* @param path [in] The json path. +* @return given property array length, 0 on error. +*/ +int parser_get_array_length_from_json(struct json_parser *jparser, + const char *path) +{ + unsigned int i, cnt; + int len; + char **arr; + + if (!jparser || !path) + return 0; + + cnt = 0; + arr = eina_str_split_full(path, ".", 0, &cnt); + + for (i = 1; i < cnt; i++) { + if (!json_reader_read_member(jparser->reader, arr[i])) { + free(arr[0]); + free(arr); + return 0; + } + } + + len = 0; + if (json_reader_is_array(jparser->reader)) + len = json_reader_count_elements(jparser->reader); + + for (i = 1; i < cnt; i++) + json_reader_end_member(jparser->reader); + + free(arr[0]); + free(arr); + + return len; +} + +/** +* check raw property value wether correct or not. +* +* @param jparser [in] The json_parser data pointer. +* @param path [in] The json path. +* @return true if correct, false if error. +*/ +bool parser_check_json_path(struct json_parser *jparser, const char *path) +{ + char *output; + + if (!jparser || !path) + return false; + + output = _get_jsonpath_result(jparser, path); + if (!output) { + _ERR("WRONG PATH:%s", path); + return false; + } + + if (!strncmp(output, "[]", strlen(output)) || + !strncmp(output, "[\n]", strlen(output))) { + g_free(output); + return false; + } + + g_free(output); + + return true; +} + +/** +* Get given item's parent item name value with given json file path. +* +* @param path [in] The json file path. +* @param name [in] The given item name. +* @return given item's parent item name string value, NULL on error. +*/ +char *parser_get_parent_item_name(const char *path, const char *name) +{ + struct json_parser *jparser; + char buf[ARRAY_SIZE]; + char *val; + + jparser = parser_init(path); + if (!jparser) { + _ERR("json parser init failed."); + return NULL; + } + + snprintf(buf, sizeof(buf), "$.%s", name); + + val = parser_get_string_value_from_json(jparser, buf); + if (!val) { + _ERR("json parser get string value failed."); + parser_fini(jparser); + return NULL; + } + + parser_fini(jparser); + + return val; +} diff --git a/src/settings_provider.c b/src/settings_provider.c new file mode 100644 index 0000000..8e9ad3c --- /dev/null +++ b/src/settings_provider.c @@ -0,0 +1,914 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "dbg.h" +#include "settings_provider.h" +#include +//#include "tvtimer.h" +#include +//#include +#include +//#include + +#define _ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) + +#define DATA_TYPE_INT "integer" +#define DATA_TYPE_DOUBLE "double" +#define DATA_TYPE_STRING "string" +#define DATA_TYPE_BOOL "bool" + +#define KEY_PICTURE_SIZE "db/menu/picture/picturesize/mode" +#define KEY_CHANNEL_LOCK "db/menu/broadcasting/channel_lock" +#define KEY_SYSTEM_CLOCK_MODE "db/menu/system/time/clock/clock_mode" +#define KEY_SLEEPTIMER "db/menu/system/time/sleeptimer/value" +#define KEY_SLEEPTIMER_TIMET "db/menu/system/time/sleeptimer/time_t" +#define KEY_SLEEPTIMER_TIMERID "db/menu/system/time/sleeptimer/timer_id" +#define KEY_WAKEUP_TIMER_SETUP "db/menu/system/time/ontimer1/setup" +#define KEY_CHANGE_PASSCODE "db/menu/system/change_pin" +#define KEY_SUBTITLE_LANGUAGE "db/menu/subtitle/subtitlelanguage" +#define KEY_SYSTEM_LANGUAGE "db/menu_widget/language" +#define KEY_SYSTEM_COUNTRY "db/menu_widget/regionformat" + +#define SYSTEM_LANGUAGE_DEFAULT_VALUE "en_US.utf8" +#define WAKEUP_TIMER_SETUP_DEFAULT_VALUE "OFF" +#define SYSTEM_COUNTRY_DEFAULT_VALUE "KOR" + +enum item_type { + INVALID_TYPE = -1, + PICTURE_MODE = 0, + PICTURE_CONTRAST, + PICTURE_BRIGHTNESS, + PICTURE_SHARPNESS, + PICTURE_COLOR, + PICTURE_TINT, + PICTURE_HOMEBAR_OPACITY, + PICTURE_SCREEN_ADJUSTMENT, + SOUND_MODE, + SPEAKER_SETTINGS, + SYSTEM_SLEEPTIMER, + SYSTEM_WAKEUPTIMER, + SYSTEM_SUBTITLE, + SYSTEM_COUNTRY, + SYSTEM_LANGUAGE, + SYSTEM_RESET, + SYSTEM_PASSCODE, + SYSTEM_CLOCK_MODE, + CHANNEL_LOCK +}; + +struct keymap { + const char *key; + enum item_type type; +}; + +static struct keymap item_keymap[] = { + { + .key = "settings/picture/picturemode", + .type = PICTURE_MODE + }, + { + .key = "settings/picture/contrast", + .type = PICTURE_CONTRAST + }, + { + .key = "settings/picture/brightness", + .type = PICTURE_BRIGHTNESS + }, + { + .key = "settings/picture/sharpness", + .type = PICTURE_SHARPNESS + }, + { + .key = "settings/picture/color", + .type = PICTURE_COLOR + }, + { + .key = "settings/picture/tint", + .type = PICTURE_TINT + }, + { + .key = "settings/picture/homebaropacity", + .type = PICTURE_HOMEBAR_OPACITY + }, + { + .key = "settings/picture/screenadjustment", + .type = PICTURE_SCREEN_ADJUSTMENT + }, + { + .key = "settings/sound/soundmode", + .type = SOUND_MODE + }, + { + .key = "settings/sound/speakersettings", + .type = SPEAKER_SETTINGS + }, + { + .key = "settings/system/sleeptimer", + .type = SYSTEM_SLEEPTIMER + }, + { + .key = "settings/system/wakeup_timer_setup", + .type = SYSTEM_WAKEUPTIMER + }, + { + .key = "settings/system/subtitle", + .type = SYSTEM_SUBTITLE + }, + { + .key = "settings/system/country", + .type = SYSTEM_COUNTRY + }, + { + .key = "settings/system/language", + .type = SYSTEM_LANGUAGE + }, + { + .key = "settings/system/reset", + .type = SYSTEM_RESET + }, + { + .key = "settings/system/change_passcode", + .type = SYSTEM_PASSCODE + }, + { + .key = "settings/system/clock_mode", + .type = SYSTEM_CLOCK_MODE + }, + { + .key = "settings/channel/channel_lock", + .type = CHANNEL_LOCK + } +}; + +#if 0 +static sound_tv_output_route_e speakersettings_item[] = { + SOUND_TV_OUTPUT_EXTERNAL_SPEAKER, + SOUND_TV_OUTPUT_SPEAKER , + SOUND_TV_OUTPUT_RECEIVER, + SOUND_TV_OUTPUT_SOUND_SHARE +}; +#endif + +struct sleeptimer_data { + int id; + //tvtimer_h timer; +}; + +static unsigned int sleeptimer_value[] = { + 0, + 30, + 60, + 90, + 120, + 150, + 180 +}; + +/** +* An timer foreach iteration callback for tvtimer_foreach_item. +* +* This callback is invoked once iterate each timer. +* +* @param timer [in] The TV timer info handler. +* @param data [in] The function specific data passed by tvtimer_foreach_item. +* @return void +*/ +#if 0 +static void _timer_callback(tvtimer_h timer, void *data) +{ + int id; + struct sleeptimer_data *priv; + + if (!timer || !data) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + tvtimer_get_id(timer, &id); + +#if 0 + if (priv->id == id) + priv->timer = timer; +#endif +} +#endif + +/** +* Set a sleep timer. +* +* @param val [in] The index value for sleeptimer_value array. +* @return 0 if success, -1 if fail. +*/ +#if 0 +static int _set_sleeptimer(int val) +{ + int size, r, id; + tvtimer_h timer; + struct sleeptimer_data data; + + size = _ARRAY_SIZE(sleeptimer_value); + if (val < 0 || val >= size) { + _ERR("value is invalid"); + return -1; + } + + id = 0; + if (vconf_get_int(KEY_SLEEPTIMER_TIMERID, &id) != 0) { + _ERR("Fail to get vconf value"); + return -1; + } + + data.id = id; + data.timer = NULL; + tvtimer_foreach_item(_timer_callback, &data); + + if (data.timer) { + tvtimer_cancel_timer(data.timer); + tvtimer_free(data.timer); + } + + timer = NULL; + + if (val != 0) { + r = tvtimer_schedule_timer_after_delay(TVTIMER_SLEEP_TIMER, + sleeptimer_value[val]*60, 0, + NULL, NULL, &timer); + if (r != 0) { + _ERR("call tvtimer_schedule_timer_after_delay error"); + return -1; + } + } + + if (vconf_set_int(KEY_SLEEPTIMER, val) != 0) { + _ERR("Fail to set vconf value"); + return -1; + } + + if (timer) { + tvtimer_get_id(timer, &id); + if (vconf_set_int(KEY_SLEEPTIMER_TIMERID, id) != 0) { + _ERR("Fail to set vconf value"); + return -1; + } + } + + return 0; +} +#endif + +/** +* Find item type according to key. +* +* @param key [in] The key defined in json file to identify a item. +* @return item type MARCO value, -1 if fail. +*/ +static enum item_type _find_type(const char *key) +{ + int i, size; + enum item_type result; + + if (!key) { + _ERR("Invalid argument"); + return INVALID_TYPE; + } + + result = INVALID_TYPE; + + size = _ARRAY_SIZE(item_keymap); + for (i = 0; i < size; i++) { + if (!strncmp(item_keymap[i].key, + key, strlen(item_keymap[i].key))) { + result = item_keymap[i].type; + break; + } + } + + return result; +} + +/** +* Find array index according to given array value and size. +* +* @param array [in] The array want to retrieve. +* @param size [in] The array size. +* @param val [in] The given array value. +* @param index [out] The array index want to get. +* @return 0 if success, -1 if fail. +*/ +static int _find_index(unsigned int *array, int size, int val, int *index) +{ + int i; + + if (!array || !index) + return -1; + + for (i = 0; i < size; i++) { + if (array[i] == val) { + *index = i; + return 0; + } + } + + return -1; +} + +/** +* Set data with integer value. +* +* @param key [in] The key defined in json file to identify a item. +* @param val [in] The value want to set to middleware. +* @return 0 if success, -1 if fail. +*/ +static int _set_int(const char *key, int val) +{ + enum item_type type; + int status; + + if (!key) { + _ERR("Invalid argument"); + return -1; + } + + status = -1; + type = _find_type(key); + + switch (type) { + case PICTURE_MODE: + break; + case PICTURE_CONTRAST: + break; + case PICTURE_BRIGHTNESS: + break; + case PICTURE_SHARPNESS: + break; + case PICTURE_COLOR: + break; + case PICTURE_TINT: + break; + case PICTURE_HOMEBAR_OPACITY: + break; + case PICTURE_SCREEN_ADJUSTMENT: + break; + case SOUND_MODE: + break; + case SPEAKER_SETTINGS: +#if 0 + status = sound_manager_set_speaker_selection( + speakersettings_item[val]); +#endif + break; + case SYSTEM_SLEEPTIMER: + //status = _set_sleeptimer(val); + break; + case SYSTEM_SUBTITLE: + status = vconf_set_int(KEY_SUBTITLE_LANGUAGE, val); + break; + case SYSTEM_RESET: + break; + case SYSTEM_CLOCK_MODE: + status = vconf_set_int(KEY_SYSTEM_CLOCK_MODE, val); + break; + default: + break; + } + + return status; +} + +/** +* Get integer value data. +* +* @param key [in] The key defined in json file to identify a item. +* @param val [out] The value want to get from middleware. +* @return 0 if success, -1 if fail. +*/ +static int _get_int(const char *key, int *val) +{ + enum item_type type; + int status, size, index; + + if (!key || !val) { + _ERR("Invalid argument"); + return -1; + } + + status = -1; + type = _find_type(key); + + switch (type) { + case PICTURE_MODE: + break; + case PICTURE_CONTRAST: + break; + case PICTURE_BRIGHTNESS: + break; + case PICTURE_SHARPNESS: + break; + case PICTURE_COLOR: + break; + case PICTURE_TINT: + break; + case PICTURE_HOMEBAR_OPACITY: + break; + case PICTURE_SCREEN_ADJUSTMENT: + break; + case SOUND_MODE: + break; + case SPEAKER_SETTINGS: +#if 0 + status = sound_manager_get_speaker_selection( + (sound_tv_output_route_e *)val); +#endif + if (status == -1) + break; + +#if 0 + size = _ARRAY_SIZE(speakersettings_item); + if (_find_index(speakersettings_item, + size, *val, &index) == -1) { + status = -1; + *val = 0; + } else { + *val = index; + } +#endif + + break; + case SYSTEM_SLEEPTIMER: + status = vconf_get_int(KEY_SLEEPTIMER, val); + break; + case SYSTEM_SUBTITLE: + status = vconf_get_int(KEY_SUBTITLE_LANGUAGE, val); + break; + case SYSTEM_RESET: + break; + case SYSTEM_CLOCK_MODE: + status = vconf_get_int(KEY_SYSTEM_CLOCK_MODE, val); + break; + default: + break; + } + + return status; +} + +/** +* Set data with float value. +* +* @param key [in] The key defined in json file to identify a item. +* @param val [in] The value want to set to middleware. +* @return 0 if success, -1 if fail. +*/ +static int _set_double(const char *key, double val) +{ + return 0; +} + +/** +* Get float value data. +* +* @param key [in] The key defined in json file to identify a item. +* @param val [out] The value want to get from middleware. +* @return 0 if success, -1 if fail. +*/ +static int _get_double(const char *key, double *val) +{ + return 0; +} + +/** +* Set data with string value. +* +* @param key [in] The key defined in json file to identify a item. +* @param val [in] The value want to set to middleware. +* @return 0 if success, -1 if fail. +*/ +static int _set_string(const char *key, const char *val) +{ + enum item_type type; + int status; + + if (!key || !val) { + _ERR("Invalid argument"); + return -1; + } + + status = -1; + type = _find_type(key); + + switch (type) { + case SYSTEM_LANGUAGE: + status = vconf_set_str(KEY_SYSTEM_LANGUAGE, val); + break; + case SYSTEM_COUNTRY: + status = vconf_set_str(KEY_SYSTEM_COUNTRY, val); + break; + case SYSTEM_PASSCODE: + status = vconf_set_str(KEY_CHANGE_PASSCODE, val); + break; + default: + break; + } + + return status; +} + +/** +* Get string value data. +* +* @param key [in] The key defined in json file to identify a item. +* @param val [out] The value want to get from middleware. +* @return 0 if success, -1 if fail. +*/ +static int _get_string(const char *key, char **val) +{ + enum item_type type; + int r; + + if (!key) { + _ERR("Invalid argument"); + return -1; + } + + r = 0; + type = _find_type(key); + + switch (type) { + case SYSTEM_LANGUAGE: + *val = vconf_get_str(KEY_SYSTEM_LANGUAGE); + if (*val == NULL) { + *val = strdup(SYSTEM_LANGUAGE_DEFAULT_VALUE); + r = -1; + } + + break; + case SYSTEM_WAKEUPTIMER: + *val = vconf_get_str(KEY_WAKEUP_TIMER_SETUP); + if (*val == NULL) { + *val = strdup(WAKEUP_TIMER_SETUP_DEFAULT_VALUE); + r = -1; + } + + break; + case SYSTEM_COUNTRY: + *val = vconf_get_str(KEY_SYSTEM_COUNTRY); + if (*val == NULL) { + *val = strdup(SYSTEM_COUNTRY_DEFAULT_VALUE); + r = -1; + } + + break; + case SYSTEM_PASSCODE: + *val = vconf_get_str(KEY_CHANGE_PASSCODE); + break; + default: + break; + } + + return r; +} + +/** +* Set data with bool value. +* +* @param key [in] The key defined in json file to identify a item. +* @param val [in] The value want to set to middleware. +* @return 0 if success, -1 if fail. +*/ +static int _set_bool(const char *key, const int val) +{ + enum item_type type; + int r; + + if (!key) + return -1; + + r = -1; + type = _find_type(key); + + switch (type) { + case CHANNEL_LOCK: + r = vconf_set_bool(KEY_CHANNEL_LOCK, val); + break; + default: + break; + } + + return r; +} + +/** +* Get bool value data. +* +* @param key [in] The key defined in json file to identify a item. +* @param val [out] The value want to get from middleware. +* @return 0 if success, -1 if fail. +*/ +static int _get_bool(const char *key, int *val) +{ + enum item_type type; + int r; + + if (!key || !val) + return -1; + + r = -1; + type = _find_type(key); + + switch (type) { + case CHANNEL_LOCK: + r = vconf_get_bool(KEY_CHANNEL_LOCK, val); + break; + default: + break; + } + + return r; +} + +/** +* Set item value with four kinds of available data type. +* +* @param item [in] The item want to set value. +* @param val [in] The given value want to set. +* @return 0 if success, -1 if fail. +*/ +int provider_set_list_value(struct settingitem *item, const char *val) +{ + const char *key, *type; + int status; + + if (!item || !val) { + _ERR("Invalid argument"); + return -1; + } + + key = settingitem_get_data_key(item); + if (!key) { + _ERR("Get data key failed"); + return -1; + } + + type = settingitem_get_data_type(item); + if (!type) { + _ERR("Get data type failed"); + return -1; + } + + status = -1; + + if (!strncmp(type, DATA_TYPE_INT, strlen(type))) + status = _set_int(key, atoi(val)); + else if (!strncmp(type, DATA_TYPE_DOUBLE, strlen(type))) + status = _set_double(key, atof(val)); + else if (!strncmp(type, DATA_TYPE_STRING, strlen(type))) + status = _set_string(key, val); + else if (!strncmp(type, DATA_TYPE_BOOL, strlen(type))) + status = _set_bool(key, atoi(val)); + + return status; +} + +/** +* Get item value by four kinds of available data type. +* +* @param item [in] The item want to get value. +* @return string value if success, NULL on error. +*/ +char *provider_get_list_value(struct settingitem *item) +{ + const char *key, *type; + int ival, bval; + double dval; + char *strval, *result; + + if (!item) { + _ERR("Invalid argument"); + return NULL; + } + + key = settingitem_get_data_key(item); + if (!key) { + _ERR("Get data key failed"); + return NULL; + } + + type = settingitem_get_data_type(item); + if (!type) { + _ERR("Get data type failed"); + return NULL; + } + + result = calloc(1, ARRAY_SIZE); + if (!result) { + _ERR("Fail to allocate memory"); + return NULL; + } + + ival = 0; + dval = 0.0; + strval = NULL; + bval = 0; + + if (!strncmp(type, DATA_TYPE_INT, strlen(type))) { + _get_int(key, &ival); + snprintf(result, ARRAY_SIZE, "%d", ival); + } else if (!strncmp(type, DATA_TYPE_DOUBLE, strlen(type))) { + _get_double(key, &dval); + snprintf(result, ARRAY_SIZE, "%f", dval); + } else if (!strncmp(type, DATA_TYPE_STRING, strlen(type))) { + _get_string(key, &strval); + snprintf(result, ARRAY_SIZE, "%s", strval); + free(strval); + } else if (!strncmp(type, DATA_TYPE_BOOL, strlen(type))) { + _get_bool(key, &bval); + snprintf(result, ARRAY_SIZE, "%d", bval); + } + + return result; +} + +/** +* Release string value. +* +* @param val [in] The given value want to release. +* @return void. +*/ +void provider_release_list_value(char *val) +{ + if (!val) { + _ERR("Invalid argument"); + return; + } + + free(val); +} + +/** +* Set slider value. +* +* @param item [in] The item want to set value. +* @param val [in] The given value want to set. +* @return 0 if success, -1 if fail. +*/ +int provider_set_slider_value(struct settingitem *item, const char *val) +{ + return provider_set_list_value(item, val); +} + +/** +* Get slider value. +* +* @param item [in] The item want to get value. +* @return double float value, -1.0 if fail. +*/ +double provider_get_slider_value(struct settingitem *item) +{ + const char *key, *type; + int ival; + double dval; + + if (!item) { + _ERR("Invalid argument"); + return -1.0; + } + + key = settingitem_get_data_key(item); + if (!key) { + _ERR("Get data key failed"); + return -1.0; + } + + type = settingitem_get_data_type(item); + if (!type) { + _ERR("Get data type failed"); + return -1.0; + } + + ival = 0; + dval = 0.0; + + if (!strncmp(type, + DATA_TYPE_INT, strlen(type))) { + _get_int(key, &ival); + dval = ival; + } else if (!strncmp(type, + DATA_TYPE_DOUBLE, strlen(type))) { + _get_double(key, &dval); + } + + return dval; +} + +/** +* Get display name that the item value have been selected. +* +* @param item [in] The item want to get. +* @return string value if success, NULL on error. +*/ +char *provider_get_selected_display_name(struct settingitem *item) +{ + char *sel, *result; + const char *val, *disp; + Eina_List *list, *tmp; + struct listitem *litem; + + if (!item) { + _ERR("Invalid argument"); + return NULL; + } + + list = settingitem_get_data_list(item); + if (!list) { + _ERR("Get data list failed"); + return NULL; + } + + sel = provider_get_list_value(item); + if (!sel) { + _ERR("Provider get value failed"); + return NULL; + } + + disp = NULL; + + EINA_LIST_FOREACH(list, tmp, litem) { + val = listitem_get_value(litem); + if (val && !strncmp(sel, val, strlen(sel))) { + disp = listitem_get_display_name(litem); + break; + } + } + + if (!disp) + disp = listitem_get_display_name(eina_list_nth(list, 0)); + + provider_release_list_value(sel); + + result = NULL; + + if (disp) + result = strdup(disp); + + return result; +} + +/** +* Get passcode value. +* +* @param key [in] The key defined in json file to identify a item. +* @param val [out] The passcode value get from middleware. +* @return 0 if success, -1 if fail. +*/ +int provider_get_passcode(const char *key, char **val) +{ + if (!key) + return -1; + + return _get_string(key, val); +} + +/** +* Initialize provider module. +* +* @return 0 if success, -1 if fail. +*/ +int provider_init(void) +{ + _DBG("Not Yet"); +#if 0 + if (tvtimer_init() != 0) { + _ERR("Fail to init tvtimer"); + return -1; + } +#endif + return 0; +} + +/** +* Finalize provider module. +* +* @return void. +*/ +void provider_fini(void) +{ + _DBG("Not Yet"); +#if 0 + tvtimer_fini(); +#endif +} diff --git a/src/timeout_handler.c b/src/timeout_handler.c new file mode 100644 index 0000000..66c4734 --- /dev/null +++ b/src/timeout_handler.c @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "dbg.h" +#include "stdlib.h" +#include "stdbool.h" +#include "timeout_handler.h" + +#define EVENT_HANDLER_NUM 6 + +struct timeout_handler { + Ecore_Event_Handler * event_handler[EVENT_HANDLER_NUM]; + Ecore_Timer *timer; +}; + +/** +* An event callback for ecore_event_handler_add. +* +* This callback is invoked once registered event occured, +* this functions will reset timer. +* +* @param data [in] The function specific data passed by ecore_event_handler_add. +* @param type [in] Type of the event. +* @param event [in] Event data. +* @return EINA_TRUE, if it will keep being called as per normal, for +* each handler set up for that event type; +* EINA_FALSE, if it will cease processing handlers for that particular +* event, so all handler set to handle that event type that have not already +* been called, will not be. +*/ +static Eina_Bool _event_occrued_cb(void *data, int type, void *event) +{ + struct timeout_handler *handler; + + if (!data) { + _ERR("Invalid argument"); + return EINA_FALSE; + } + + handler = data; + + ecore_timer_reset(handler->timer); + + return EINA_FALSE; +} + +/** +* An timer expired callback for ecore_timer_add. +* +* This callback is invoked once timer expired, +* this functions will terminate app. +* +* @param data [in] The function specific data passed by ecore_timer_add. +* @return ECORE_CALLBACK_CANCEL if remove a callback, +* ECORE_CALLBACK_RENEW if keep a callback. +*/ +static Eina_Bool _timer_expired_cb(void *data) +{ + app_efl_exit(); + + return ECORE_CALLBACK_CANCEL; +} + +/** +* Freeze given ecore timer. +* +* @param data [in] The timeout_handler data pointer, it include given ecore timer pointer. +* @return void. +*/ +void timeout_handler_freeze_timer(struct timeout_handler *data) +{ + if (!data || !data->timer) { + _ERR("Invalid argument"); + return; + } + + ecore_timer_freeze(data->timer); +} + +/** +* Thaw given ecore timer. +* +* @param data [in] The timeout_handler data pointer, it include given ecore timer pointer. +* @return void. +*/ +void timeout_handler_thaw_timer(struct timeout_handler *data) +{ + if (!data || !data->timer) { + _ERR("Invalid argument"); + return; + } + + ecore_timer_thaw(data->timer); + ecore_timer_reset(data->timer); +} + +/** +* Change timer interval value. +* +* @param data [in] The timeout_handler data pointer, it include given ecore timer pointer. +* @param val [in] New interval value to be set. +* @return void. +*/ +void timeout_handler_change_interval(struct timeout_handler *data, + double val) +{ + if (!data || !data->timer) { + _ERR("Invalid argument"); + return; + } + + if (val == 0.0) { + ecore_timer_freeze(data->timer); + } else if (val > 0.0) { + ecore_timer_interval_set(data->timer, val); + ecore_timer_reset(data->timer); + ecore_timer_thaw(data->timer); + } +} + +/** +* Create and init timeout_handler data. +* +* @param val [in] Timer interval value. +* @return The timeout_handler data pointer, NULL if error. +*/ +struct timeout_handler *timeout_handler_init(double val) +{ + struct timeout_handler *data; + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("Fail to allocate memory for timeout handler"); + return NULL; + } + + data->event_handler[0] = ecore_event_handler_add( + ECORE_EVENT_KEY_DOWN, _event_occrued_cb, data); + data->event_handler[1] = ecore_event_handler_add( + ECORE_EVENT_KEY_UP, _event_occrued_cb, data); + data->event_handler[2] = ecore_event_handler_add( + ECORE_EVENT_MOUSE_BUTTON_DOWN, + _event_occrued_cb, data); + data->event_handler[3] = ecore_event_handler_add( + ECORE_EVENT_MOUSE_BUTTON_UP, + _event_occrued_cb, data); + data->event_handler[4] = ecore_event_handler_add( + ECORE_EVENT_MOUSE_MOVE, _event_occrued_cb, data); + data->event_handler[5] = ecore_event_handler_add( + ECORE_EVENT_MOUSE_WHEEL, _event_occrued_cb, data); + + data->timer = ecore_timer_add(val, _timer_expired_cb, NULL); + + return data; +} + +/** +* Release given timeout_handler data. +* +* @param data [in] The timeout_handler data pointer. +* @return void. +*/ +void timeout_handler_fini(struct timeout_handler *data) +{ + int i; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + for (i = 0; i < EVENT_HANDLER_NUM; i++) + ecore_event_handler_del(data->event_handler[i]); + + ecore_timer_del(data->timer); + free(data); +} diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..3184ddf --- /dev/null +++ b/src/utils.c @@ -0,0 +1,382 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "dbg.h" +#include "utils.h" +#include "data_wrapper.h" + +/** +* This function is invoked to set focus at down direction between @p and @n button. +* +* @param btns [in] The evas object array contained buttons. +* @param p [in] The array index which point focused button. +* @param n [in] The array index which point next button to be focus at down direction. +* @return void. +*/ +static void _set_focus_down(Eina_Array *btns, int p, int n) +{ + Evas_Object *cur, *next; + + if (!btns) + return; + + cur = eina_array_data_get(btns, p); + next = eina_array_data_get(btns, n); + + if (!cur || !next) + return; + + elm_object_focus_next_object_set(cur, + next, ELM_FOCUS_DOWN); +} + +/** +* This function is invoked to set focus at up direction between @p and @n button. +* +* @param btns [in] The evas object array contained buttons. +* @param p [in] The array index which point focused button. +* @param n [in] The array index which point next button to be focus at up direction. +* @return void. +*/ +static void _set_focus_up(Eina_Array *btns, int p, int n) +{ + Evas_Object *cur, *next; + + if (!btns) + return; + + cur = eina_array_data_get(btns, p); + next = eina_array_data_get(btns, n); + + if (!cur || !next) + return; + + elm_object_focus_next_object_set(cur, + next, ELM_FOCUS_UP); +} + +/** +* @Evas_Callback_Type callback is invoked to handle mouse in event. +* +* @param data [in] The user data. +* @param e [in] The evas handler. +* @param obj [in] The evas object which mouse in event occurred. +* @return void. +*/ +static void _btn_mouse_in_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) { + _ERR("Invalid argument"); + return; + } + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** +* @Evas_Callback_Type callback is invoked to handle mouse out event. +* +* @param data [in] The user data. +* @param e [in] The evas handler. +* @param obj [in] The evas object which mouse out event occurred. +* @return void. +*/ +static void _btn_mouse_out_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ +} + +/** +* This function is invoked to get translation string. +* +* @param msgid [in] The message id defined in po file. +* @return The translated string value, NULL on error. +*/ +char *utils_get_translation_str(const char *msgid) +{ + return gettext(msgid); +} + +/** +* This function is invoked to add a button's evas object with specific ui style and name, +* otherwise caller must define event flag to determine whether register default mouse event +* callback or not. +* +* @param base [in] The layout's evas object to be added button. +* @param style [in] The UI style sting value. +* @param text [in] The name to be set to button. +* @param event [in] The event flag to determine whether register default mouse event +* callback or not. +* @return The button's evas object, NULL on error. +*/ +Evas_Object *utils_add_btn(Evas_Object *base, + char *style, const char *text, Eina_Bool event) +{ + Evas_Object *btn; + + if (!base) { + _ERR("Invalid argument!\n"); + return NULL; + } + + btn = elm_button_add(base); + if (!btn) + return NULL; + + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, + EVAS_HINT_FILL); + + if (style) + elm_object_style_set(btn, style); + + if (text) + elm_object_text_set(btn, utils_get_translation_str(text)); + + if (event == EINA_TRUE) { + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _btn_mouse_in_cb, NULL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_OUT, + _btn_mouse_out_cb, NULL); + } + + evas_object_show(btn); + + return btn; +} + +/** +* This function is invoked to add a scroller's evas object. +* +* @param base [in] The layout's evas object to be added scroller. +* @return The scroller's evas object, NULL on error. +*/ +Evas_Object *utils_add_scroller(Evas_Object *base) +{ + Evas_Object *scroller; + + if (!base) { + _ERR("Invalid argument!\n"); + return NULL; + } + + scroller = elm_scroller_add(base); + if (!scroller) + return NULL; + + evas_object_size_hint_weight_set(scroller, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(scroller, + EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, + ELM_SCROLLER_POLICY_OFF); + elm_object_focus_allow_set(scroller, EINA_FALSE); + + evas_object_show(scroller); + + return scroller; +} + +/** +* This function is invoked to add a box's evas object. +* +* @param base [in] The layout's evas object to be added box. +* @return The box's evas object, NULL on error. +*/ +Evas_Object *utils_add_box(Evas_Object *base) +{ + Evas_Object *box; + + if (!base) { + _ERR("Invalid argument!\n"); + return NULL; + } + + box = elm_box_add(base); + if (!box) + return NULL; + + evas_object_size_hint_weight_set(box, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, + EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_focus_allow_set(box, EINA_FALSE); + + evas_object_show(box); + + return box; +} + +/** +* This function is invoked to add a ctxpopup's evas object with specific UI style. +* +* @param base [in] The layout's evas object to be added ctxpopup. +* @param style [in] The UI style sting value. +* @return The ctxpopup's evas object, NULL on error. +*/ +Evas_Object *utils_add_ctxpopup(Evas_Object *base, char *style) +{ + Evas_Object *ctxpopup; + + if (!base) { + _ERR("Invalid argument"); + return NULL; + } + + ctxpopup = elm_ctxpopup_add(base); + if (!ctxpopup) { + _ERR("Fail to add ctxpopup"); + return NULL; + } + + if (style) + elm_object_style_set(ctxpopup, style); + + return ctxpopup; +} + +/** +* This function is invoked to add a label's evas object. +* +* @param base [in] The layout's evas object to be added label. +* @return The label's evas object, NULL on error. +*/ +Evas_Object *utils_add_label(Evas_Object *base) +{ + Evas_Object *label; + + if (!base) { + _ERR("Invalid argument"); + return NULL; + } + + label = elm_label_add(base); + if (!label) { + _ERR("Add label failed\n"); + return NULL; + } + + evas_object_size_hint_align_set(label, + EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(label, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + evas_object_show(label); + + return label; +} + +/** +* This function is invoked to add a entry's evas object. +* +* @param base [in] The layout's evas object to be added entry. +* @return The entry's evas object, NULL on error. +*/ +Evas_Object *utils_add_entry(Evas_Object *parent) +{ + Evas_Object *entry; + + if (!parent) + return NULL; + + entry = elm_entry_add(parent); + if (!entry) { + _ERR("elm entry add failed."); + return NULL; + } + + evas_object_size_hint_weight_set(entry, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_cursor_end_set(entry); + + evas_object_show(entry); + + return entry; +} + +/** +* This function is invoked to add a base layout's evas object. +* +* @param base [in] The parent's evas object to be added layout. +* @return The layout's evas object, NULL on error. +*/ +Evas_Object *utils_add_base(Evas_Object *parent) +{ + Evas_Object *base; + + if (!parent) + return NULL; + + base = elm_layout_add(parent); + if (!base) { + _ERR("elm layout add failed."); + return NULL; + } + + evas_object_size_hint_weight_set(base, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(base, + EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_show(base); + + return base; +} + +/** +* This function is invoked to set an button array focus direction. +* +* @param btns [in] The evas object array contained buttons. +* @param cnt [in] The array length value. +* @return void. +*/ +void utils_set_focus_directions(Eina_Array *btns, int cnt) +{ + int i; + Evas_Object *btn; + + if (!btns || cnt == 0) + return; + + if (cnt == 1) { + btn = eina_array_data_get(btns, 0); + if (!btn) + return; + + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN); + } else { + for (i = 0; i < cnt; i++) { + if (i == cnt - 1) + _set_focus_down(btns, i, 0); + else + _set_focus_down(btns, i, i + 1); + + if (i == 0) + _set_focus_up(btns, i, cnt - 1); + else + _set_focus_up(btns, i, i - 1); + } + } +} diff --git a/src/view_bottomslider.c b/src/view_bottomslider.c new file mode 100644 index 0000000..edd63ba --- /dev/null +++ b/src/view_bottomslider.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "dbg.h" +#include "def.h" +#include "stdbool.h" +#include "viewmgr.h" +#include "utils.h" +#include "data_wrapper.h" +#include "settings_provider.h" +#include "view_bottomslider.h" + +/** +* This function is invoked to create view layout. +* +* @param mgr [in] The setting_mgr data pointer passed by @settingmgr_view_push. +* @param view [in] The settingview_data data pointer passed by @settingmgr_view_push. +* @param prev [in] The parameter data which passed by prev view or NULL. +* @return View layout evas object, NULL on error. +*/ +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + /*TODO:Implement this function*/ + return NULL; +} + +/** +* This function is invoked to show view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _show(Evas_Object *base) +{ +} + +/** +* This function is invoked to destroy view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _destroy(Evas_Object *base) +{ +} + +/** +* This function is invoked to hide view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _hide(Evas_Object *base) +{ +} + +static struct setting_class _vclass = { + .title = VCLASS_TITLE_BOTTOM_SLIDER, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide, + .hide_view = 1 +}; + +/** +* This function is invoked to get bottom slider view class object. +* +* @return The setting_class data static pointer, NULL on error. +*/ +struct setting_class *view_bottomslider_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_bottomsublist.c b/src/view_bottomsublist.c new file mode 100644 index 0000000..4de5038 --- /dev/null +++ b/src/view_bottomsublist.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "dbg.h" +#include "def.h" +#include "stdbool.h" +#include "viewmgr.h" +#include "utils.h" +#include "data_wrapper.h" +#include "settings_provider.h" +#include "view_bottomsublist.h" + +/** +* This function is invoked to create view layout. +* +* @param mgr [in] The setting_mgr data pointer passed by @settingmgr_view_push. +* @param view [in] The settingview_data data pointer passed by @settingmgr_view_push. +* @param prev [in] The parameter data which passed by prev view or NULL. +* @return View layout evas object, NULL on error. +*/ +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + /*TODO:Implement this function*/ + return NULL; +} + +/** +* This function is invoked to show view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _show(Evas_Object *base) +{ +} + +/** +* This function is invoked to destroy view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _destroy(Evas_Object *base) +{ +} + +/** +* This function is invoked to destroy view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _hide(Evas_Object *base) +{ +} + +static struct setting_class _vclass = { + .title = VCLASS_TITLE_BOTTOM_SUBLIST, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide, + .hide_view = 1 +}; + +/** +* This function is invoked to get bottom sublist view class object. +* +* @return The setting_class data static pointer, NULL on error. +*/ +struct setting_class *view_bottomsublist_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_device_manager.c b/src/view_device_manager.c new file mode 100644 index 0000000..5e49c07 --- /dev/null +++ b/src/view_device_manager.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "dbg.h" +#include "def.h" +#include "stdbool.h" +#include "viewmgr.h" +#include "utils.h" +#include "data_wrapper.h" +#include "settings_provider.h" +#include "view_maincatalog.h" +#include "view_device_manager.h" + +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + /*TODO:Implement this function*/ + return NULL; +} + +static void _show(Evas_Object *base) +{ +} + +static void _destroy(Evas_Object *base) +{ +} + +static void _hide(Evas_Object *base) +{ +} + +static struct setting_class _vclass = { + .title = VCLASS_TITLE_DEVICE_MANAGER, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide, + .hide_view = 0 +}; + +struct setting_class *view_device_manager_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_maincatalog.c b/src/view_maincatalog.c new file mode 100644 index 0000000..869cffc --- /dev/null +++ b/src/view_maincatalog.c @@ -0,0 +1,2110 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "dbg.h" +#include "def.h" +#include "stdbool.h" +#include "viewmgr.h" +#include "utils.h" +#include "view_maincatalog.h" +#include "data_wrapper.h" +#include "settings_provider.h" + +#define DATA_ID "main_setting_data" +#define SUBITEM_DATA_ID "subitem_data_id" +#define SYSTEM_CLOCK_DATA "system_clock_data" +#define ICON_PART "iconpart" +#define PROGRESS_BAR_DATA "progressbar" + +#define SETTING_ID "setting_id" +#define E_CREATE_ITEMS 0 + +#define MAX_PROGRESS_VALUE 100.0 +#define MIN_PROGRESS_VALUE 0.0 +#define ICON_BUTTON_NO_DISP_NAME "No Display Name" +#define CHANGE_PASSCODE_NAME "change-passcode" +#define PASSCODE_MASK "****" +#define DISABLED "disabled" +#define ENABLED "enabled" +#define SIG_CLICKED "clicked" + +enum focused_state { + FOCUS_MAIN_ITEM = 1, + FOCUS_SUB_ITEM +}; + +struct _view_data { + Evas_Object *win; + Evas_Object *base; + Eina_Array *sub_item_btn; + Eina_Array *main_item_btn; + Eina_Array *main_icon_base; + Eina_Array *item_path; + Evas_Object *focused_sub_item_btn; + Evas_Object *focused_main_item_btn; + Evas_Object *subitem_box; + Evas_Object *mainitem_box; + + int focus_status; + int main_item_count; + int sub_item_count; + + struct setting_mgr *mgr; + struct settingview_data *main_setting_view; + struct settingview_data *subsetting_view; +}; + +/** +* This function will be invoked when focus moves from subitem to main item. +* +* @param[in]: data : the user data. +* @param[in]: btn : subitem which focus is on. +* +* @return: void. +*/ +static void _move_from_subitem_to_main_item(struct _view_data *data, + Evas_Object *btn) +{ + if (!data || !btn) + return; + + data->focus_status = FOCUS_MAIN_ITEM; + data->focused_sub_item_btn = btn; + + elm_object_focus_set(data->focused_main_item_btn, EINA_TRUE); +} + +/** +* Evas_Object_Event_Cb type callback for handling key press event. +* +* @param[in]: data : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the corresponding object which the key press event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _subitem_key_pressed_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _view_data *priv; + Evas_Object *pb; + Evas_Object *next; + + if (!data || !ei || !obj) + return; + + ev = ei; + if (!ev->keyname) + return; + + priv = data; + + if (!strcmp(ev->keyname, KEY_LEFT) || + !strcmp(ev->keyname, KEY_BACK)) { + pb = evas_object_data_get(obj, PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, + SIG_UNCTRL_PB_UNFOCUSED, SRC_PB_PROG); + + _move_from_subitem_to_main_item(priv, obj); + } else if (!strncmp(ev->keyname, KEY_DOWN, strlen(ev->keyname))) { + pb = evas_object_data_get(obj, PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, + SIG_UNCTRL_PB_UNFOCUSED, SRC_PB_PROG); + + next = elm_object_focus_next_object_get(obj, + ELM_FOCUS_DOWN); + if (!next) { + _ERR("focus next object get failed."); + return; + } + + pb = evas_object_data_get(next, PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, + SIG_UNCTRL_PB_FOCUSED, SRC_PB_PROG); + } else if (!strncmp(ev->keyname, KEY_UP, strlen(ev->keyname))) { + pb = evas_object_data_get(obj, PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, + SIG_UNCTRL_PB_UNFOCUSED, SRC_PB_PROG); + + next = elm_object_focus_next_object_get(obj, ELM_FOCUS_UP); + if (!next) { + _ERR("focus next object get failed."); + return; + } + + pb = evas_object_data_get(next, PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, + SIG_UNCTRL_PB_FOCUSED, SRC_PB_PROG); + } else if (!strncmp(ev->keyname, KEY_EXIT, strlen(ev->keyname))) { + app_efl_exit(); + } +} + +/** +* Get geometry data of object such as width, height. +* +* @param[in]: obj : the object which you want to get geometry data from. +* @param[out]: param : the geometry data. +* +* @return: void. +*/ +static void _get_geometry_data(Evas_Object *obj, + struct obj_geometry_data *param) +{ + int x, y, w, h; + + if (!param || !obj) { + _ERR("Invalid argument"); + return; + } + + x = y = w = h = 0; + + evas_object_geometry_get(obj, &x, &y, &w, &h); + + param->x = x; + param->y = y; + param->width = w; + param->height = h; +} + +/** +* Entry of showing UI gadget views. +* +* param[in]: data : the user data. +* param[in]: item : item data. +* param[in]: obj : object whose next view is UI gadget. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_ug_view(struct _view_data *data, + struct settingitem *item, Evas_Object *obj) +{ + const char *id; + struct evas_obj_data param; + int r; + + if (!data || !item || !obj) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + param.subitem_box = data->subitem_box; + param.display_name = settingitem_get_display_name(item); + param.cur_btn = obj; + + r = settingmgr_view_push(data->mgr, id, (void *)¶m); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + return 0; +} + +/** +* Entry of showing sublist views. +* +* param[in]: data : the user data. +* param[in]: item : item data. +* param[in]: obj : object whose next view is sublist. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_sublist_view(struct _view_data *data, + struct settingitem *item, Evas_Object *obj) +{ + const char *id; + int r; + struct obj_geometry_data ogd; + + if (!data || !item || !obj) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + _get_geometry_data(obj, &ogd); + + r = settingmgr_view_push(data->mgr, id, (void *)&ogd); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + elm_object_signal_emit(obj, SUBITEMBTN_BUTTON_CLICKED, + SUBITEMBTN_BUTTON_SOURCE); + + return 0; +} + +/** +* Entry of showing bottom sublist views. +* +* param[in]: data : the user data. +* param[in]: item : item data. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_bottom_sublist_view(struct _view_data *data, + struct settingitem *item) +{ + const char *id; + int r; + + if (!data || !item) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + r = settingmgr_view_push(data->mgr, id, NULL); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + return 0; +} + +/** +* Entry of showing bottom slider views. +* +* param[in]: data : the user data. +* param[in]: item : item data. +* param[in]: obj : object whose next view bottom slider. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_bottom_slider_view(struct _view_data *data, + struct settingitem *item, Evas_Object *obj) +{ + const char *id; + int r; + Eina_List *list; + Evas_Object *pb; + + if (!data || !item || !obj) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + pb = evas_object_data_get(obj, PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, + SIG_UNCTRL_PB_UNFOCUSED, SRC_PB_PROG); + + list = settingitem_get_slider_group_list( + viewdata_get_parentitem(data->subsetting_view), + settingmgr_get_data(data->mgr), id); + + r = settingmgr_view_push(data->mgr, id, list); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + return 0; +} + +/** +* Entry of showing passcode popup views. +* +* param[in]: data : the user data. +* param[in]: item : item data. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_passcode_popup_view(struct _view_data *data, + struct settingitem *item) +{ + const char *id; + int r; + + if (!data || !item) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + r = settingmgr_view_push(data->mgr, id, NULL); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + return 0; +} + +/** +* Entry of showing device manager view. +* +* param[in]: data : the user data. +* param[in]: item : item data read from json file. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_device_manager_view(struct _view_data *data, + struct settingitem *item) +{ + const char *id; + struct evas_obj_data param; + int r; + + if (!data || !item) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + param.display_name = settingitem_get_display_name(item); + param.subitem_box = data->subitem_box; + + r = settingmgr_view_push(data->mgr, id, ¶m); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + return 0; +} + +/** +* Entry of showing reset popup view. +* +* param[in]: data : the user data. +* param[in]: item : item data read from json file. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_reset_popup_view(struct _view_data *data, + struct settingitem *item) +{ + const char *id; + int r; + + if (!data || !item) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + r = settingmgr_view_push(data->mgr, id, NULL); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + return 0; +} + +/** +* Entry of showing software upgrade popup view. +* +* param[in]: data : the user data. +* param[in]: item : item data read from json file. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_upgrade_popup_view(struct _view_data *data, + struct settingitem *item) +{ + const char *id; + int r; + + if (!data || !item) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + r = settingmgr_view_push(data->mgr, id, NULL); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + return 0; +} + +/** +* Entry of showing clock sublist view. +* +* param[in]: data : the user data. +* param[in]: item : item data read from json file. +* param[in]: obj : object whose next view is clock sublist view. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_clock_sublist_view(struct _view_data *data, + struct settingitem *item, Evas_Object *obj) +{ + const char *id; + struct evas_obj_data param; + struct obj_geometry_data ogd; + int r; + + if (!data || !item || !obj) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + _get_geometry_data(obj, &ogd); + + param.display_name = settingitem_get_display_name(item); + param.subitem_box = data->subitem_box; + param.cur_btn = obj; + + evas_object_data_set(obj, SYSTEM_CLOCK_DATA, (void *)&ogd); + + r = settingmgr_view_push(data->mgr, id, ¶m); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + elm_object_signal_emit(obj, + SUBITEMBTN_BUTTON_CLICKED, SUBITEMBTN_BUTTON_SOURCE); + + return 0; +} +/** +* Entry of showing channel lock view. +* +* param[in]: data : the user data. +* param[in]: item : item data read from json file. +* param[in]: obj : the channel lock object. +* +* @return: 0 - success, -1 - fail. +*/ +static int _push_need_passcode_view(struct _view_data *data, + struct settingitem *item, Evas_Object *obj) +{ + const char *id; + int r; + struct obj_geometry_data ogd; + + if (!data || !item || !obj) { + _ERR("Invalid argument"); + return -1; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("Fail to get item id"); + return -1; + } + + _get_geometry_data(obj, &ogd); + + r = settingmgr_view_push(data->mgr, id, &ogd); + if (r != 0) { + _ERR("Fail to push view"); + return -1; + } + + elm_object_signal_emit(obj, SUBITEMBTN_BUTTON_CLICKED, + SUBITEMBTN_BUTTON_SOURCE); + + return 0; +} + +/** +* This function will be invoked when subitem is clicked. +* +* @param[in]: data : the user data. +* @param[in]: obj : the subitem object. +* +* @return: void. +*/ +static void _submenu_item_clicked(void *data, Evas_Object *obj) +{ + struct _view_data *priv; + const char *style; + struct settingitem *item; + + if (!data || !obj) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + if (priv->focus_status != FOCUS_SUB_ITEM) + return; + + item = evas_object_data_get(obj, SUBITEM_DATA_ID); + if (!item) { + _ERR("Get sub item failed"); + return; + } + + style = settingitem_get_settingui_style(item); + if (!style) { + _ERR("setting-ui style is null."); + return; + } + + if (!strncmp(style, STYLE_UIGADGET, strlen(style))) { + if (_push_ug_view(priv, item, obj) != 0) + _ERR("Fail to push ug"); + } else if (!strncmp(style, STYLE_CTXPOPUP, + strlen(style))) { + if (_push_sublist_view(priv, item, obj) != 0) + _ERR("Fail to push sublist"); + } else if (!strncmp(style, STYLE_BOTTOM_CTXPOPUP, + strlen(style))) { + if (_push_bottom_sublist_view(priv, item) != 0) + _ERR("Fail to push bottom sublist"); + } else if (!strncmp(style, STYLE_BOTTOMSLIDER, + strlen(style)) || !strncmp(style, + STYLE_BOTTOM2WAYSLIDER, + strlen(style))) { + if (_push_bottom_slider_view(priv, + item, obj) != 0) + _ERR("Fail to push bottom slider"); + } else if (!strncmp(style, STYLE_PASSCODE_POPUP, + strlen(style))) { + if (_push_passcode_popup_view(priv, item) != 0) + _ERR("Fail to push passcode popup"); + } else if (!strncmp(style, STYLE_DEVICE_MANAGER, + strlen(style))) { + if (_push_device_manager_view(priv, item) != 0) + _ERR("Fail to push device mgr view"); + } else if (!strncmp(style, STYLE_RESET_POPUP, + strlen(style))) { + if (_push_reset_popup_view(priv, item) != 0) + _ERR("Fail to push reset popup"); + } else if (!strncmp(style, STYLE_UPGRADE_POPUP, + strlen(style))) { + if (_push_upgrade_popup_view(priv, item) != 0) + _ERR("Fail to push upgrade popup"); + } else if (!strncmp(style, STYLE_CLOCK_CTXPOPUP, + strlen(style))) { + if (_push_clock_sublist_view( + priv, item, obj) != 0) + _ERR("Fail to push clock sublist"); + } else if (!strncmp(style, STYLE_NEED_PASSCODE, + strlen(style))) { + if (_push_need_passcode_view( + priv, item, obj) != 0) + _ERR("Fail to push need passcode view"); + } + + priv->focused_sub_item_btn = obj; +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: data : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _subitem_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + struct _view_data *priv; + Evas_Object *icon; + + if (!data || !obj) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + _submenu_item_clicked(priv, obj); + + elm_object_signal_emit(priv->focused_main_item_btn, + MAINICONBTN_FOCUSED_ON_SUBITEM, + MAINICONBTN_MAIN_ITEM_SOURCE); + + icon = elm_object_part_content_get(priv->focused_main_item_btn, + MAINICONBTN_ICON_SWALLOW); + if (icon) + elm_object_signal_emit(icon, MAIN_BTN_HIGHLIGHT, MAIN_BTN); +} + +/** +* Get item value from item. +* +* @param[in]: item : the item data read from json file. +* +* @return: the value of item or null if error occurred. +*/ +static char *_settingitems_get_value(struct settingitem *item) +{ + char *result; + const char *name, *style; + + if (!item) { + _ERR("Invalid argument"); + return NULL; + } + + result = NULL; + + name = settingitem_get_id(item); + if (name && !strncmp(name, CHANGE_PASSCODE_NAME, strlen(name))) { + result = strdup(PASSCODE_MASK); + return result; + } + + style = settingitem_get_settingui_style(item); + if (!style) { + _ERR("Fail to get setting ui style"); + return NULL; + } + + if (!strncmp(style, STYLE_UIGADGET, strlen(style))) + return provider_get_list_value(item); + else + return provider_get_selected_display_name(item); +} + +/** +* Get percentage value of progress from item data. +* +* @param[in]: item : item data read from json file. +* +* @return: the percentage value or -1.0 if error occurred. +*/ +static double _get_progress_percentage(struct settingitem *item) +{ + struct slideritem *sitem; + double val, persent; + + if (!item) { + _ERR("Invalid argument"); + return -1.0; + } + + sitem = settingitem_get_data_slideritem(item); + if (!sitem) { + _ERR("Get slider item failed"); + return -1.0; + } + + val = provider_get_slider_value(item); + persent = slideritem_find_slider_value(val, sitem); + + return persent; +} + +/** +* Get displaying value of item. +* +* @param[in]: item : item data read from json file. +* @param[in]: value : the percentage value. +* +* @return: the display value. +*/ +static double _get_display_value(struct settingitem *item, double value) +{ + struct slideritem *sitem; + double disp; + + if (!item) { + _ERR("Invalid argument"); + return -1.0; + } + + sitem = settingitem_get_data_slideritem(item); + if (!sitem) { + _ERR("Get slider item failed"); + return -1.0; + } + + disp = slideritem_find_slider_display_value(value, sitem); + + return disp; +} + +/** +* Create slider of subitem. +* +* @param[in]: item : the item data read from json file. +* @param[in]: base : the base layout of subitems. +* @param[in]: btn : the subitem the slider will be created on. +* +* @return: void. +*/ +static void _set_subitem_btn_slider(struct settingitem *item, + Evas_Object *base, Evas_Object *btn) +{ + Evas_Object *pb; + double val, percent; + char buf[BUF_SIZE]; + + if (!item || !base || !btn) { + _ERR("Invalid argument"); + return; + } + + elm_object_style_set(btn, SUBITEMBTN_TITLE_SLIDER_VALUE); + + pb = elm_progressbar_add(base); + if (!pb) { + _ERR("Add progress bar failed."); + return; + } + + elm_object_style_set(pb, SUBITEMBTN_TITILE_SLIDER); + + percent = _get_progress_percentage(item); + val = _get_display_value(item, percent); + elm_progressbar_value_set(pb, percent); + + snprintf(buf, sizeof(buf), "%d", (int)val); + elm_object_part_text_set(btn, SUBITEMBTN_VALUE, buf); + elm_object_part_content_set(btn, SUBITEMBTN_SLIDER_SWALLOW, pb); + + evas_object_data_set(btn, PROGRESS_BAR_DATA, pb); +} + +/** +* Get tint g-value. +* +* @param[in]: item : the item data read from json file. +* @param[in]: tint_r : the tint r-value. +* +* @return: the tint g-value. +*/ +static double _get_disp_tint_g_val(struct settingitem *item, double tint_r) +{ + const char *strval; + struct slideritem *sitem; + double val; + + if (!item) { + _ERR("Invalid argument"); + return -1.0; + } + + sitem = settingitem_get_data_slideritem(item); + if (!sitem) { + _ERR("Get slider item failed"); + return -1.0; + } + + strval = slideritem_get_max_display_value(sitem); + if (strval) + val = atof(strval); + else + val = 100; + + return val - tint_r; +} + +/** +* Create two way slider. +* +* @param[in]: item : the item data read from json file. +* @param[in]: base : the base layout of subitems. +* @param[in]: btn : the subitem which the two way slider will be created on. +* +* @return: void. +*/ +static void _set_subitem_btn_value_slider(struct settingitem *item, + Evas_Object *base, Evas_Object *btn) +{ + Evas_Object *pb; + double tint_r, tint_g, percent; + char buf[BUF_SIZE]; + + if (!item || !base || !btn) { + _ERR("Invalid argument"); + return; + } + + elm_object_style_set(btn, SUBITEMBTN_TITLE_SLIDER_VALUE); + + pb = elm_progressbar_add(base); + if (!pb) { + _ERR("Add progress bar failed."); + return; + } + + elm_object_style_set(pb, SUBITEMBTN_TITILE_SLIDER); + percent = _get_progress_percentage(item); + elm_progressbar_value_set(pb, percent); + + tint_r = _get_display_value(item, percent); + tint_g = _get_disp_tint_g_val(item, tint_r); + + snprintf(buf, sizeof(buf), "R%d", (int)tint_r); + elm_object_part_text_set(btn, SUBITEMBTN_VALUE, + utils_get_translation_str(buf)); + snprintf(buf, sizeof(buf), "G%d", (int)tint_g); + elm_object_part_text_set(btn, SUBITEMBTN_G_VALUE, + utils_get_translation_str(buf)); + + elm_object_part_content_set(btn, SUBITEMBTN_SLIDER_SWALLOW, pb); + + evas_object_data_set(btn, PROGRESS_BAR_DATA, pb); +} + +/** +* Create style for subitem. +* +* @param[in]: base : the base layout of subitems. +* @param[in]: obj : the subitem which the style will be created on. +* @param[in]: style : the style read from json file. +* @param[in]: item : the item data read from json file. +* +* @return: void. +*/ +static void _draw_subitem_with_style(Evas_Object *base, Evas_Object *obj, + const char *style, struct settingitem *item) +{ + char *val; + + if (!style || !base || !obj || !item) + return; + + if (!strncmp(style, STYLE_SUBBUTTON_TITLE_VALUE, strlen(style))) { + val = _settingitems_get_value(item); + elm_object_part_text_set(obj, SUBITEMBTN_VALUE, + utils_get_translation_str(val)); + free(val); + } else if (!strncmp(style, STYLE_SUBBUTTON_TITLE_ICON, strlen(style))) { + elm_object_style_set(obj, SUBITEMBTN_TITLE_ICON); + } else if (!strncmp(style, STYLE_SUBBUTTON_TITLE_SLIDER_VALUE, + strlen(style))) { + _set_subitem_btn_slider(item, base, obj); + } else if (!strncmp(style, STYLE_SUBBUTTON_TITLE_2WAYSLIDER_VALUE, + strlen(style))) { + _set_subitem_btn_value_slider(item, base, obj); + } +} + +/** +* Release resources of subitems. +* +* @param[in]: data : the user data. +* +* @return: void. +*/ +static void _release_subitems(struct _view_data *data) +{ + Evas_Object *btn; + Eina_Array_Iterator a; + unsigned int i; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + if (data->sub_item_btn) { + EINA_ARRAY_ITER_NEXT(data->sub_item_btn, i, btn, a) + evas_object_del(btn); + eina_array_free(data->sub_item_btn); + } + + if (data->subsetting_view) + viewdata_release(data->subsetting_view); + + if (data->subitem_box) + evas_object_del(data->subitem_box); +} + +/** +* Refresh subitems when subitems are changed. +* +* @param[in]: data : the user data. +* +* @return: 0 - success, -1 - fail. +*/ +static int _refresh_subitems(struct _view_data *data) +{ + Evas_Object *btn; + Eina_Array_Iterator a; + unsigned int i; + struct settingitem *item; + const char *style; + + if (!data) { + _ERR("Invalid argument"); + return -1; + } + + EINA_ARRAY_ITER_NEXT(data->sub_item_btn, i, btn, a) { + item = evas_object_data_get(btn, SUBITEM_DATA_ID); + style = settingitem_get_style(item); + if (style) + _draw_subitem_with_style(data->base, btn, style, item); + } + + return 0; +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse out event. +* +* @param[in]: data : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse out event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _subitem_btn_mouse_out_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + /* TODO: Add necessary operations if needed. */ +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse in event. +* +* @param[in]: data : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse in event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _subitem_btn_mouse_in_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + struct _view_data *priv; + Evas_Object *icon, *pb; + + if (!obj || !data) + return; + + priv = data; + + elm_object_focus_set(obj, EINA_TRUE); + + if (priv->focus_status == FOCUS_MAIN_ITEM) { + priv->focus_status = FOCUS_SUB_ITEM; + elm_object_signal_emit(priv->focused_main_item_btn, + MAINICONBTN_FOCUSED_ON_SUBITEM, + MAINICONBTN_MAIN_ITEM_SOURCE); + + icon = elm_object_part_content_get(priv->focused_main_item_btn, + MAINICONBTN_ICON_SWALLOW); + if (icon) + elm_object_signal_emit(icon, + MAIN_BTN_HIGHLIGHT, MAIN_BTN); + } + + pb = evas_object_data_get(priv->focused_sub_item_btn, + PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, SIG_UNCTRL_PB_UNFOCUSED, + SRC_PB_PROG); + + pb = evas_object_data_get(obj, PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, SIG_UNCTRL_PB_FOCUSED, SRC_PB_PROG); + + priv->focused_sub_item_btn = obj; +} + +/** +* Create subitems of settings. +* +* @param[in]: data : the user data. +* @param[in]: name : the name of subitem. +* +* @return: 0 - success, -1 - fail. +*/ +static int _draw_subitems(struct _view_data *data, const char *name) +{ + Evas_Object *box, *btn, *tmp; + struct settingview_data *view; + struct settingitem *item; + Eina_List *list, *l; + int cnt; + Eina_Array_Iterator a; + unsigned int i; + const char *style, *status; + Eina_Array *enabled; + + if (!data || !name || !data->base) { + _ERR("Invalid argument"); + return -1; + } + + view = settingmgr_get_view(data->mgr, name); + if (!view) { + _ERR("get subview failed\n"); + return -1; + } + + list = viewdata_get_childitems_list(view); + if (!list) { + _ERR("childitem list is empty!"); + if (view) + viewdata_release(view); + return -1; + } + + cnt = eina_list_count(list); + + data->sub_item_btn = eina_array_new(1); + enabled = eina_array_new(1); + if (!data->sub_item_btn || !enabled) { + _ERR("Create Eina Array failed\n"); + EINA_LIST_FREE(list, item); + if (view) + viewdata_release(view); + return -1; + } + + box = utils_add_box(data->base); + if (!box) { + _ERR("Add box failed\n"); + EINA_LIST_FREE(list, item); + eina_array_free(data->sub_item_btn); + if (view) + viewdata_release(view); + return -1; + } + + EINA_LIST_FOREACH(list, l, item) { + btn = utils_add_btn(data->base, SUBITEMBTN_STYLE, + settingitem_get_display_name(item), EINA_FALSE); + if (!btn) { + _ERR("Add btn failed"); + evas_object_del(box); + EINA_LIST_FREE(list, item); + EINA_ARRAY_ITER_NEXT(data->sub_item_btn, i, tmp, a) + evas_object_del(tmp); + eina_array_free(data->sub_item_btn); + if (view) + viewdata_release(view); + return -1; + } + + style = settingitem_get_style(item); + if (style) + _draw_subitem_with_style(data->base, btn, style, item); + + evas_object_smart_callback_add(btn, "clicked", + _subitem_btn_clicked_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _subitem_key_pressed_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _subitem_btn_mouse_in_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_OUT, + _subitem_btn_mouse_out_cb, data); + + elm_box_pack_end(box, btn); + eina_array_push(data->sub_item_btn, btn); + + evas_object_data_set(btn, SUBITEM_DATA_ID, item); + + status = settingitem_get_status(item); + if (status && !strncmp(status, DISABLED, strlen(status))) { + elm_object_disabled_set(btn, EINA_TRUE); + evas_object_freeze_events_set(btn, EINA_TRUE); + } else { + eina_array_push(enabled, btn); + } + } + + data->subsetting_view = view; + data->sub_item_count = cnt; + data->subitem_box = box; + + elm_object_part_content_set(data->base, MAIN_VIEW_SUBITEM_SWALLOW, box); + + utils_set_focus_directions(enabled, eina_array_count(enabled)); + + EINA_LIST_FREE(list, item); + eina_array_free(enabled); + + return 0; +} + +/** +* This function will be invoked when the main item is clicked. +* +* @param[in]: data : the user data. +* @param[in]: mainbtn : the main item which the clicked event is occurred. +* +* @return: void. +*/ +static void _move_from_main_item_to_subitem(struct _view_data *data, + Evas_Object *mainbtn) +{ + Evas_Object *btn, *pb, *icon; + int i; + + if (!data || !mainbtn) + return; + + data->focus_status = FOCUS_SUB_ITEM; + + for (i = 0; i < data->sub_item_count; i++) { + btn = eina_array_data_get(data->sub_item_btn, i); + if (!btn) { + _ERR("Get subitem btn failed\n"); + data->focus_status = FOCUS_MAIN_ITEM; + return; + } + + if (elm_object_disabled_get(btn) != EINA_TRUE) + break; + } + + if (i >= data->sub_item_count) { + data->focus_status = FOCUS_MAIN_ITEM; + return; + } + + pb = evas_object_data_get(btn, PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, SIG_UNCTRL_PB_FOCUSED, SRC_PB_PROG); + + elm_object_focus_set(btn, EINA_TRUE); + + data->focused_main_item_btn = mainbtn; + elm_object_signal_emit(mainbtn, MAINICONBTN_FOCUSED_ON_SUBITEM, + MAINICONBTN_MAIN_ITEM_SOURCE); + + icon = elm_object_part_content_get(mainbtn, MAINICONBTN_ICON_SWALLOW); + if (icon) + elm_object_signal_emit(icon, MAIN_BTN_HIGHLIGHT, MAIN_BTN); +} + +/** +* Evas_Object_Event_Cb type callback for handling key press event. +* +* @param[in]: data : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the key press event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _main_setting_key_pressed_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _view_data *priv; + Evas_Object *next, *icon; + const char *name; + + if (!data || !ei || !obj) + return; + + ev = ei; + if (!ev->keyname) + return; + + priv = data; + + if (!strcmp(ev->keyname, KEY_DOWN)) { + icon = elm_object_part_content_get(obj, + MAINICONBTN_ICON_SWALLOW); + if (!icon) { + _ERR("part %s content get failed.", + MAINICONBTN_ICON_SWALLOW); + return; + } + + elm_object_signal_emit(icon, MAIN_BTN_UNFOCUSED, MAIN_BTN); + + next = elm_object_focus_next_object_get(obj, ELM_FOCUS_DOWN); + if (!next) { + _ERR("next object get failed."); + return; + } + + priv->focused_main_item_btn = next; + + icon = elm_object_part_content_get(next, + MAINICONBTN_ICON_SWALLOW); + if (!icon) { + _ERR("part %s content get failed.", + MAINICONBTN_ICON_SWALLOW); + return; + } + + elm_object_signal_emit(icon, MAIN_BTN_FOCUSED, MAIN_BTN); + + _release_subitems(priv); + + name = evas_object_data_get(next, SETTING_ID); + if (name) + _draw_subitems(priv, name); + } else if (!strcmp(ev->keyname, KEY_UP)) { + icon = elm_object_part_content_get(obj, + MAINICONBTN_ICON_SWALLOW); + if (!icon) { + _ERR("part %s content get failed.", + MAINICONBTN_ICON_SWALLOW); + return; + } + + elm_object_signal_emit(icon, MAIN_BTN_UNFOCUSED, MAIN_BTN); + + next = elm_object_focus_next_object_get(obj, ELM_FOCUS_UP); + if (!next) { + _ERR("next object get failed."); + return; + } + + priv->focused_main_item_btn = next; + + icon = elm_object_part_content_get(next, + MAINICONBTN_ICON_SWALLOW); + if (!icon) { + _ERR("part %s content get failed.", + MAINICONBTN_ICON_SWALLOW); + return; + } + + elm_object_signal_emit(icon, MAIN_BTN_FOCUSED, MAIN_BTN); + + _release_subitems(priv); + + name = evas_object_data_get(next, SETTING_ID); + if (name) + _draw_subitems(priv, name); + } else if (!strcmp(ev->keyname, KEY_RIGHT)) { + _move_from_main_item_to_subitem(priv, obj); + } else if (!strcmp(ev->keyname, KEY_EXIT) || + !strcmp(ev->keyname, KEY_BACK)) { + app_efl_exit(); + } +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse in event. +* +* @param[in]: data : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse in event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _mainitem_btn_mouse_in_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + struct _view_data *priv; + const char *name; + Evas_Object *icon; + + if (!data || !obj) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + if (priv->focus_status == FOCUS_SUB_ITEM) + _move_from_subitem_to_main_item(priv, + priv->focused_sub_item_btn); + + icon = elm_object_part_content_get(priv->focused_main_item_btn, + MAINICONBTN_ICON_SWALLOW); + if (icon) + elm_object_signal_emit(icon, MAIN_BTN_UNFOCUSED, MAIN_BTN); + + icon = elm_object_part_content_get(obj, MAINICONBTN_ICON_SWALLOW); + if (icon) + elm_object_signal_emit(icon, MAIN_BTN_FOCUSED, MAIN_BTN); + + _release_subitems(priv); + + name = evas_object_data_get(obj, SETTING_ID); + if (name) + _draw_subitems(priv, name); + + elm_object_focus_set(obj, EINA_TRUE); + priv->focused_main_item_btn = obj; +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse out event. +* +* @param[in]: data : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse out event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _mainitem_btn_mouse_out_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + /* TODO: Add necessary operations if needed. */ +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: data : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _mainitem_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + struct _view_data *priv; + + if (!data || !obj) { + _ERR("Invalid argument"); + return; + } + + priv = data; + _move_from_main_item_to_subitem(priv, obj); +} + +/** +* Create main items of settings. +* +* @param[in]: data : the user data. +* @param[in]: list : the eina list containing data of main items. +* +* @return: 0 - success, -1 - fail. +*/ +static int _add_icon_btns(struct _view_data *data, Eina_List *list) +{ + Evas_Object *btn, *icon; + const char *id, *name; + struct settingitem *item; + char buf[BUF_SIZE]; + int i; + + if (!data || !list || !data->base) { + _ERR("Invalid argument"); + return -1; + } + + for (i = 0; i < data->main_item_count; i++) { + btn = utils_add_btn(data->base, MAINICONBTN_STYLE, + NULL, EINA_FALSE); + if (!btn) { + _ERR("Add btn failed\n"); + return -1; + } + + item = eina_list_nth(list, i); + if (item) { + name = settingitem_get_display_name(item); + elm_object_text_set(btn, + utils_get_translation_str(name)); + } else { + elm_object_text_set(btn, ICON_BUTTON_NO_DISP_NAME); + } + + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _main_setting_key_pressed_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _mainitem_btn_mouse_in_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_OUT, + _mainitem_btn_mouse_out_cb, data); + evas_object_smart_callback_add(btn, SIG_CLICKED, + _mainitem_btn_clicked_cb, data); + + icon = elm_layout_add(btn); + if (icon) { + id = settingitem_get_id(item); + if (!id) { + _ERR("get item name failed."); + evas_object_del(btn); + return -1; + } + + snprintf(buf, sizeof(buf), "%s/%s.edj", + EDJEDIR, PACKAGE); + elm_layout_file_set(icon, buf, id); + elm_object_part_content_set(btn, + MAINICONBTN_ICON_SWALLOW, icon); + elm_object_signal_emit(icon, MAIN_BTN_NORMAL, MAIN_BTN); + eina_array_push(data->main_icon_base, icon); + } + + elm_box_pack_end(data->mainitem_box, btn); + evas_object_data_set(btn, SETTING_ID, settingitem_get_id(item)); + eina_array_push(data->main_item_btn, btn); + } + + return 0; +} + +/** +* Create all the UI components of settings. +* +* @param[in]: data : the user data. +* +* @return: 0 - success, -1 - fail. +*/ +static int _draw_main_items(struct _view_data *data) +{ + Evas_Object *box, *btn, *tmp, *icon; + Eina_Array *btns, *icons; + Eina_List *list; + int cnt, i; + Eina_Array_Iterator a; + + if (!data || !data->base) + return -1; + + box = utils_add_box(data->base); + if (!box) + return -1; + + data->mainitem_box = box; + + cnt = 0; + list = viewdata_get_childitems_list(data->main_setting_view); + if (list) + cnt = eina_list_count(list); + + if (cnt == 0) { + _ERR("There is no child item"); + evas_object_del(box); + viewdata_free_childitems_list(list); + return -1; + } + + data->main_item_count = cnt; + + btns = eina_array_new(1); + if (!btns) { + _ERR("Create Eina Array failed\n"); + evas_object_del(box); + viewdata_free_childitems_list(list); + return -1; + } + + data->main_item_btn = btns; + + icons = eina_array_new(1); + if (!icons) { + _ERR("new array for icon base failed."); + evas_object_del(box); + viewdata_free_childitems_list(list); + eina_array_free(btns); + return -1; + } + + data->main_icon_base = icons; + + if (_add_icon_btns(data, list) == -1) { + _ERR("Fail to add icon buttons"); + goto error; + } + + elm_object_part_content_set(data->base, MAIN_VIEW_ICON_SWALLOW, box); + + if (!data->item_path) { + btn = eina_array_data_get(btns, 0); + if (!btn) + goto error; + + if (_draw_subitems(data, + evas_object_data_get(btn, SETTING_ID)) == -1) + goto error; + + icon = eina_array_data_get(icons, 0); + if (!icon) { + if (data->subsetting_view) + viewdata_release(data->subsetting_view); + goto error; + } + + elm_object_signal_emit(icon, MAIN_BTN_FOCUSED, MAIN_BTN); + + data->focus_status = FOCUS_MAIN_ITEM; + + elm_object_focus_set(btn, EINA_TRUE); + data->focused_main_item_btn = btn; + } + + utils_set_focus_directions(data->main_item_btn, cnt); + + viewdata_free_childitems_list(list); + + return 0; + +error: + evas_object_del(box); + viewdata_free_childitems_list(list); + EINA_ARRAY_ITER_NEXT(btns, i, tmp, a) + evas_object_del(tmp); + eina_array_free(btns); + + EINA_ARRAY_ITER_NEXT(icons, i, tmp, a) + evas_object_del(tmp); + eina_array_free(icons); + + return -1; +} + +/** +* Edje_Signal_Cb type callback for handling signal. +* +* @param[in]: data : the user data. +* @param[in]: obj : the object signal occurred on. +* @param[in]: emission : the signal name. +* @param[in]: source : the source name. +* +* @return: void. +*/ +static void _view_anim_finish(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + struct _view_data *priv; + + if (!data) + return; + + priv = data; + + _draw_main_items(priv); +} + +/** +* This function moves focus from main item to subitem and +* does corresponding operations. +* +* @param[in]: data : the user data. +* +* @return: void. +*/ +void _move_focus_on_subitem(struct _view_data *data) +{ + const char *path, *id; + unsigned int i; + Evas_Object *icon, *subbtn, *pb; + Eina_Array *subbtns; + Eina_Array_Iterator a; + struct settingitem *item; + + if (!data) + return; + + subbtns = data->sub_item_btn; + + path = eina_array_data_get(data->item_path, 0); + + EINA_ARRAY_ITER_NEXT(subbtns, i, subbtn, a) { + item = evas_object_data_get(subbtn, SUBITEM_DATA_ID); + id = settingitem_get_id(item); + if (!id) + return; + + if (!strncmp(id, path, ARRAY_SIZE)) { + icon = elm_object_part_content_get( + data->focused_main_item_btn, + MAINICONBTN_ICON_SWALLOW); + if (icon) + elm_object_signal_emit(icon, + MAIN_BTN_HIGHLIGHT, MAIN_BTN); + + data->focus_status = FOCUS_SUB_ITEM; + data->focused_sub_item_btn = subbtn; + + elm_object_focus_set(subbtn, EINA_TRUE); + elm_object_signal_emit(data->focused_main_item_btn, + MAINICONBTN_FOCUSED_ON_SUBITEM, + MAINICONBTN_MAIN_ITEM_SOURCE); + + pb = evas_object_data_get(subbtn, PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, + SIG_UNCTRL_PB_FOCUSED, + SRC_PB_PROG); + } + } +} + +/** +* Change the language of names of buttons. +* +* @param[in]: list : eina list of item data. +* @param[in]: btns : eina array containing buttons. +* @param[in]: cnt : number of buttons. +* +* @return: void. +*/ +static void _change_buttons_name(Eina_List *list, + Eina_Array *btns, int cnt) +{ + struct settingitem *item; + Evas_Object *btn; + const char *name; + int i; + + if (!list || !btns || !cnt) { + _ERR("Invalid argument"); + return; + } + + for (i = 0; i < cnt; i++) { + item = eina_list_nth(list, i); + btn = eina_array_data_get(btns, i); + if (!item || !btn) + return; + + name = settingitem_get_display_name(item); + if (name) + elm_object_text_set(btn, + utils_get_translation_str(name)); + } +} + +/** +* Create all UI components of settings view. +* +* @param[in]: mgr : the view manager of settings. +* @param[in]: view : the view data. +* @param[in]: prev : the user data. +* +* @return: the base layout of settings or null if error occurred. +*/ +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + Evas_Object *base, *win; + struct _view_data *data; + + if (!mgr || !view) { + _ERR("Invalid argument"); + return NULL; + } + + win = settingmgr_get_win(mgr); + if (!win) { + _ERR("Fail to get win"); + return NULL; + } + + data = calloc(1, sizeof(*data)); + if (!data) + return NULL; + + base = elm_layout_add(win); + if (!base) { + free(data); + return NULL; + } + + if (!elm_layout_file_set(base, EDJ_FILE, MAIN_VIEW_PAGE)) + goto error; + + data->mgr = mgr; + data->win = win; + data->base = base; + data->main_setting_view = view; + data->subsetting_view = NULL; + data->item_path = settingmgr_get_item_path(mgr); + + evas_object_data_set(base, DATA_ID, data); + + elm_object_signal_callback_add(base, MAIN_VIEW_ANIM_FINISH, + MAIN_VIEW_SOURCE, _view_anim_finish, data); + + if (!data->item_path) + elm_object_signal_emit(data->base, MAIN_VIEW_LOAD, ""); + else + _view_anim_finish(data, NULL, NULL, NULL); + + return base; + +error: + evas_object_del(base); + free(data); + + return NULL; +} + +/** +* Show the view of settings. +* +* @param[in]: base : the base layout of settings. +* +* @return: void. +*/ +static void _show(Evas_Object *base) +{ + struct _view_data *data; + unsigned int cnt, i; + const char *name, *path; + Evas_Object *btn, *icon; + Eina_Array *btns; + Eina_Array_Iterator a; + + if (!base) { + _ERR("Invalid argument"); + return; + } + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("evas object data get failed. id: %s", DATA_ID); + return; + } + + path = NULL; + + if (data->item_path) { + btns = data->main_item_btn; + + cnt = eina_array_count(data->item_path); + if (cnt > 1) { + path = eina_array_data_get(data->item_path, cnt - 2); + if (!path) + return; + } + + EINA_ARRAY_ITER_NEXT(btns, i, btn, a) { + name = evas_object_data_get(btn, SETTING_ID); + if (!name) + return; + + if (!strncmp(name, path, ARRAY_SIZE)) { + _draw_subitems(data, name); + + icon = eina_array_data_get( + data->main_icon_base, i); + if (icon) + elm_object_signal_emit(icon, + MAIN_BTN_FOCUSED, + MAIN_BTN); + + elm_object_focus_set(btn, EINA_TRUE); + + data->focus_status = FOCUS_MAIN_ITEM; + data->focused_main_item_btn = btn; + + _move_focus_on_subitem(data); + } + } + } + + evas_object_show(base); +} + +/** +* Hide the view of settings. +* +* @param[in]: base : the base layout of settings. +* +* @return: void. +*/ +static void _hide(Evas_Object *base) +{ + if (!base) { + _ERR("Invalid argument"); + return; + } + + evas_object_hide(base); +} + +/** +* Refresh the view of settings. +* +* @param[in]: base : the base layout of settings. +* +* @return: void. +*/ +static void _refresh(Evas_Object *base) +{ + struct _view_data *data; + char *sld; + const char *id; + int i; + struct settingitem *item; + Eina_Array_Iterator a; + Evas_Object *btn, *pb, *icon; + + if (!base) + return; + + data = evas_object_data_get(base, DATA_ID); + if (!data) + return; + + sld = evas_object_data_del(base, SELECTED_ITEM_ID); + if (sld) { + EINA_ARRAY_ITER_NEXT(data->sub_item_btn, i, btn, a) { + item = evas_object_data_get(btn, SUBITEM_DATA_ID); + id = settingitem_get_id(item); + if (!id) + continue; + + if (item && !strncmp(sld, id, strlen(sld))) { + data->focused_sub_item_btn = btn; + break; + } + } + } + + if (data->focus_status == FOCUS_SUB_ITEM) { + elm_object_focus_set(data->focused_sub_item_btn, EINA_TRUE); + + elm_object_signal_emit(data->focused_main_item_btn, + MAINICONBTN_FOCUSED_ON_SUBITEM, + MAINICONBTN_MAIN_ITEM_SOURCE); + + icon = elm_object_part_content_get(data->focused_main_item_btn, + MAINICONBTN_ICON_SWALLOW); + if (icon) + elm_object_signal_emit(icon, + MAIN_BTN_HIGHLIGHT, MAIN_BTN); + + if (_refresh_subitems(data) == -1) + _ERR("Refresh subitems failed"); + + pb = evas_object_data_get(data->focused_sub_item_btn, + PROGRESS_BAR_DATA); + if (pb) + elm_object_signal_emit(pb, + SIG_UNCTRL_PB_FOCUSED, SRC_PB_PROG); + } + + if (settingmgr_get_timeout_freeze_state(data->mgr) == EINA_TRUE) + settingmgr_thaw_timeout(data->mgr); +} + +/** +* Destroy the view of settings. +* +* @param[in]: base : the base layout of settings. +* +* @return: void. +*/ +static void _destroy(Evas_Object *base) +{ + struct _view_data *data; + Eina_Array_Iterator a; + Evas_Object *tmp; + unsigned int i; + + if (!base) { + _ERR("Parameter error!"); + return; + } + + data = evas_object_data_get(base, DATA_ID); + + if (data->sub_item_btn) { + EINA_ARRAY_ITER_NEXT(data->sub_item_btn, i, tmp, a) + evas_object_del(tmp); + eina_array_free(data->sub_item_btn); + } + + if (data->main_item_btn) { + EINA_ARRAY_ITER_NEXT(data->main_item_btn, i, tmp, a) + evas_object_del(tmp); + eina_array_free(data->main_item_btn); + } + + if (data->main_icon_base) { + EINA_ARRAY_ITER_NEXT(data->main_icon_base, i, tmp, a) + evas_object_del(tmp); + eina_array_free(data->main_icon_base); + } + + if (data->main_setting_view) + viewdata_release(data->main_setting_view); + + if (data->subsetting_view) + viewdata_release(data->subsetting_view); + + free(data); + evas_object_del(base); +} + +/** +* Change the language of view of settings. +* +* @param[in]: base : the base layout of settings. +* +* @return: void. +*/ +static void _lang_changed(Evas_Object *base) +{ + struct _view_data *data; + Eina_List *l; + int cnt; + + if (!base) { + _ERR("Invalid argument"); + return; + } + + data = evas_object_data_get(base, DATA_ID); + if (!data) + return; + + cnt = 0; + l = viewdata_get_childitems_list(data->main_setting_view); + if (l) + cnt = eina_list_count(l); + + _change_buttons_name(l, data->main_item_btn, cnt); + + cnt = 0; + l = viewdata_get_childitems_list(data->subsetting_view); + if (l) + cnt = eina_list_count(l); + + _change_buttons_name(l, data->sub_item_btn, cnt); +} + +/** +* Froze the view of settings. +* +* @param[in]: base : the base layout of settings. +* +* @return: void. +*/ +static void _frozen(Evas_Object *base) +{ + struct _view_data *data; + + if (!base) { + _ERR("Invalid argument"); + return; + } + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("Fail to get mainview data"); + return; + } + + evas_object_freeze_events_set(data->mainitem_box, EINA_TRUE); + evas_object_freeze_events_set(data->subitem_box, EINA_TRUE); +} + +/** +* Activate the view of settings. +* +* @param[in]: base : the base layout of settings. +* +* @return: void. +*/ +static void _active(Evas_Object *base) +{ + struct _view_data *data; + + if (!base) { + _ERR("Invalid argument"); + return; + } + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("Fail to get mainview data"); + return; + } + + evas_object_freeze_events_set(data->mainitem_box, EINA_FALSE); + evas_object_freeze_events_set(data->subitem_box, EINA_FALSE); +} + +static struct setting_class _vclass = { + .title = VCLASS_TITLE_MAIN_VIEW, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide, + .refresh = _refresh, + .frozen = _frozen, + .active = _active, + .lang_changed = _lang_changed, + .hide_view = 0 +}; + +/** +* Return view class of settings view. +* +* @param: void. +* +* @return: the view class of settings view. +*/ +struct setting_class *view_maincatalog_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_need_pwd.c b/src/view_need_pwd.c new file mode 100644 index 0000000..610b9a7 --- /dev/null +++ b/src/view_need_pwd.c @@ -0,0 +1,758 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "dbg.h" +#include "def.h" +#include "utils.h" +#include "settings_provider.h" +#include "view_need_pwd.h" + +#define CHNLLOCK_DATA_ID "view_need_passcode_data" + +#define MSGID_TITLE "Passcode" +#define MSGID_TEXT "Please enter your passcode" +#define MSGID_CANCEL "Cancel" +#define MSGID_WRONG_PWD "Wrong passcode, please try again" + +#define CTXPOPUP_WIDTH 688 +#define CTXPOPUP_HEIGHT 411 + +#define KEY_PASSCODE "settings/system/change_passcode" +#define VCONF_TYPE_STRING "string" + +#define BOX_PADDING 10 + +#define SIG_CLICKED "clicked" +#define SIG_DISMISSED "dismissed" + +#define PWD_SYMBOL "*" +#define PWD_RANGE "0123456789" +#define EMPTY_SYMBOL "" + +enum { + PWD_ENTRY_0, + PWD_ENTRY_1, + PWD_ENTRY_2, + PWD_ENTRY_3, + PWD_ENTRY_MAX +}; + +struct _chnllock_data { + Evas_Object *win; + Evas_Object *bg; + Evas_Object *base; + Evas_Object *ctxpopup; + Evas_Object *cancel_btn; + Evas_Object *box; + + Eina_Array *array; + + char passcode[BUF_SIZE]; + + struct setting_mgr *mgr; + struct settingview_data *view; + struct obj_geometry_data gd; +}; + +static void _free_priv_data(struct _chnllock_data *data); +static void _hide(Evas_Object *base); + +/** +* Free user data. +* +* @param[in]: data : the user data of channel lock. +* +* @return: void. +*/ +static void _free_priv_data(struct _chnllock_data *data) +{ + if (!data) + return; + + if (data->bg) + evas_object_del(data->bg); + + if (data->base) + evas_object_del(data->base); + + if (data->ctxpopup) + evas_object_del(data->ctxpopup); + + if (data->array) + eina_array_free(data->array); + + free(data); +} + +/** +* Create background of channel lock view. +* +* @param[in]: win : the window this view created on. +* +* @return: the created view of type evas object. +*/ +static Evas_Object *_add_view_bg(Evas_Object *win) +{ + Evas_Object *bg; + + if (!win) { + _ERR("window is null."); + return NULL; + } + + bg = utils_add_base(win); + if (!bg) { + _ERR("elm layout add failed."); + return NULL; + } + + elm_layout_file_set(bg, EDJ_FILE, GRP_PWD_BG); + + return bg; +} + +/** +* Create the base layout of channel lock view. +* +* @param[in]: ctxpopup : the ctxpopup which contains channel lock view. +* +* @return: the created base layout of channel lock view. +*/ +static Evas_Object *_add_view_base(Evas_Object *ctxpopup) +{ + Evas_Object *base; + + if (!ctxpopup) + return NULL; + + base = utils_add_base(ctxpopup); + if (!base) { + _ERR("elm layout add failed."); + return NULL; + } + + elm_layout_file_set(base, EDJ_FILE, GRP_PWD_VIEW); + + elm_object_part_text_set(base, PART_TITLE, + utils_get_translation_str(MSGID_TITLE)); + elm_object_part_text_set(base, PART_UPTEXT, + utils_get_translation_str(MSGID_TEXT)); + + return base; +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _cancel_btn_clicked_cb(void *priv, Evas_Object *obj, + void *ev) +{ + struct _chnllock_data *data; + + if (!priv || !obj) + return; + + data = priv; + + settingmgr_view_pop(data->mgr); +} + +/** +* Create cancel button of channel lock view. +* +* @param[in]: data : the user data of channel lock view. +* +* @return: the created cancel button or null if error occurred. +*/ +static Evas_Object *_add_view_cancel_btn(struct _chnllock_data *data) +{ + Evas_Object *btn; + + if (!data || !data->base) + return NULL; + + btn = utils_add_btn(data->base, PWD_BASIC_BTN, + utils_get_translation_str(MSGID_CANCEL), EINA_TRUE); + if (!btn) { + _ERR("utils add button failed."); + return NULL; + } + + evas_object_smart_callback_add(btn, SIG_CLICKED, + _cancel_btn_clicked_cb, data); + elm_object_part_content_set(data->base, SWALLOW_CANCEL_BTN, btn); + + return btn; +} + +/** +* Check if the input passcode is right. +* +* @param[in]: data : the user data of channel lock view. +* +* @return: 0 - wrong passcode, 1 - right passcode. +*/ +static int _check_passcode(struct _chnllock_data *data) +{ + char *passcode; + + if (!data || !data->passcode || !data->view) + return 0; + + passcode = NULL; + provider_get_passcode(KEY_PASSCODE, &passcode); + + if (strncmp(data->passcode, passcode, strlen(passcode))) { + free(passcode); + return 0; + } + + free(passcode); + + return 1; +} + +/** +* Show the ON/OFF sublist of channel lock view. +* +* @param[in]: data : the user data of channel lock view. +* +* @return: void. +*/ +static void _push_next_view(struct _chnllock_data *data) +{ + struct settingitem *item; + Eina_List *list; + const char *id; + + if (!data || !data->view) + return; + + list = viewdata_get_childitems_list(data->view); + if (!list) + return; + + item = eina_list_nth(list, 0); + if (!item) + return; + + id = settingitem_get_id(item); + if (!id) + return; + + settingmgr_view_push(data->mgr, id, &data->gd); +} + +/** +* Evas_Object_Event_Cb type callback for handling key press event. +* +* @param[in]: priv : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the corresponding object which the key press event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _key_down_cb(void *priv, Evas *e, Evas_Object *obj, + void *ei) +{ + Evas_Event_Key_Down *event; + Eina_Array *array; + Evas_Object *entry, *next_entry; + struct _chnllock_data *data; + const char *keyname; + char *text; + int btn_num, i; + + if (!priv || !ei || !obj) + return; + + data = priv; + array = data->array; + if (!array) + return; + + event = ei; + keyname = event->keyname; + if (!keyname) + return; + + btn_num = -1; + for (i = PWD_ENTRY_0; i < PWD_ENTRY_MAX; i++) { + if (obj == eina_array_data_get(array, i)) { + btn_num = i; + break; + } + } + + if (btn_num == -1) + return; + + if (!strncmp(keyname, KEY_BACK, strlen(keyname))) { + settingmgr_view_pop(data->mgr); + } else if (!strncmp(keyname, KEY_DOWN, strlen(keyname))) { + elm_object_focus_set(data->cancel_btn, EINA_TRUE); + } else if (!strncmp(keyname, KEY_0, strlen(keyname)) || + !strncmp(keyname, KEY_1, strlen(keyname)) || + !strncmp(keyname, KEY_2, strlen(keyname)) || + !strncmp(keyname, KEY_3, strlen(keyname)) || + !strncmp(keyname, KEY_4, strlen(keyname)) || + !strncmp(keyname, KEY_5, strlen(keyname)) || + !strncmp(keyname, KEY_6, strlen(keyname)) || + !strncmp(keyname, KEY_7, strlen(keyname)) || + !strncmp(keyname, KEY_8, strlen(keyname)) || + !strncmp(keyname, KEY_9, strlen(keyname))) { + elm_entry_entry_set(obj, PWD_SYMBOL); + data->passcode[btn_num] = keyname[0]; + + if (btn_num < PWD_ENTRY_3) { + elm_object_focus_next(obj, ELM_FOCUS_NEXT); + next_entry = elm_object_focus_next_object_get(obj, + ELM_FOCUS_NEXT); + if (!next_entry) + return; + + elm_object_focus_next_object_set(data->cancel_btn, + next_entry, ELM_FOCUS_UP); + } else { + if (_check_passcode(data)) { + _hide(data->base); + _push_next_view(data); + } else { + text = utils_get_translation_str( + MSGID_WRONG_PWD); + elm_object_part_text_set(data->base, + PART_UPTEXT, text); + + entry = eina_array_data_get(array, PWD_ENTRY_0); + if (!entry) + return; + + elm_object_focus_set(entry, EINA_TRUE); + + for (i = PWD_ENTRY_0; i < PWD_ENTRY_MAX; i++) { + entry = eina_array_data_get(array, i); + if (!entry) + return; + + elm_object_text_set(entry, + EMPTY_SYMBOL); + } + } + } + } +} + +/** +* Set the move directions of focus between entries and cancel button. +* +* @param[in]: array : eina array containing entries. +* @param[in]: cancel_btn : the cancel button. +* +* @return: void. +*/ +static void _set_entry_directions(Eina_Array *array, + Evas_Object *cancel_btn) +{ + Evas_Object *entry; + int idx; + + if (!array || !cancel_btn) + return; + + for (idx = PWD_ENTRY_0; idx < PWD_ENTRY_3; idx++) { + entry = eina_array_data_get(array, idx); + if (!entry) + return; + + elm_object_focus_next_object_set(entry, + eina_array_data_get(array, idx + 1), + ELM_FOCUS_NEXT); + elm_object_focus_next_object_set(entry, + cancel_btn, ELM_FOCUS_DOWN); + } + + elm_object_focus_next_object_set(cancel_btn, + eina_array_data_get(array, PWD_ENTRY_0), + ELM_FOCUS_UP); +} + +/** +* Create entry. +* +* @param[in]: parent : object the entry will be created on. +* +* @return: the created entry or null if error occurred. +*/ +static Evas_Object *_add_entry(Evas_Object *parent) +{ + Evas_Object *entry; + Elm_Entry_Filter_Limit_Size length = { + .max_char_count = 1 + }; + Elm_Entry_Filter_Accept_Set type = { + .accepted = PWD_RANGE + }; + + if (!parent) + return NULL; + + entry = utils_add_entry(parent); + if (!entry) { + _ERR("utils add entry failed."); + return NULL; + } + + elm_entry_markup_filter_append(entry, + elm_entry_filter_limit_size, &length); + elm_entry_markup_filter_append(entry, + elm_entry_filter_accept_set, &type); + + elm_object_style_set(entry, STYLE_PWD_ENTRY); + + elm_entry_text_style_user_push(entry, STYLE_ENTRY_TEXT); + elm_object_part_content_set(parent, SWALLOW_ENTRY, entry); + + return entry; +} + +/** +* Create entries for inputting passcode. +* +* @param[in]: data : the user data of channel lock view. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_view_entries(struct _chnllock_data *data) +{ + Eina_Array *array; + Evas_Object *box; + Evas_Object *entry, *base; + int idx; + + if (!data || !data->base) { + _ERR("invalid arguments."); + return -1; + } + + box = utils_add_box(data->base); + if (!box) + return -1; + + elm_box_horizontal_set(box, EINA_TRUE); + elm_box_padding_set(box, BOX_PADDING, BOX_PADDING); + + array = eina_array_new(1); + if (!array) { + evas_object_del(box); + return -1; + } + + for (idx = PWD_ENTRY_0; idx < PWD_ENTRY_MAX; idx++) { + base = utils_add_base(data->base); + if (!base) { + _ERR("utils add base failed."); + evas_object_del(box); + eina_array_free(array); + return -1; + } + + elm_layout_file_set(base, EDJ_FILE, GRP_PWD_ENTRY); + + entry = _add_entry(base); + if (!entry) { + _ERR("add entry failed."); + evas_object_del(box); + eina_array_free(array); + evas_object_del(base); + return -1; + } + + eina_array_push(array, entry); + elm_box_pack_end(box, base); + + evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN, + _key_down_cb, data); + } + + elm_object_focus_allow_set(eina_array_data_get(array, PWD_ENTRY_0), + EINA_TRUE); + elm_object_focus_set(eina_array_data_get(array, PWD_ENTRY_0), + EINA_TRUE); + + elm_object_part_content_set(data->base, SWALLOW_CONTENT_AREA, box); + + _set_entry_directions(array, data->cancel_btn); + + data->array = array; + data->box = box; + + return 0; +} + +/** +* Evas_Smart_Cb type callback for handling ctxpopup dismissed event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the dismissed event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _ctxpopup_dismissed(void *priv, Evas_Object *obj, + void *ev) +{ + struct _chnllock_data *data; + + if (!priv || !obj) + return; + + data = priv; + if (!data->base || !data->mgr) + return; + + _hide(data->base); + + settingmgr_view_pop(data->mgr); +} + +/** +* Create all the UI components of channel lock view. +* +* @param[in]: mgr : view manager of settings views. +* @param[in]: view : data of view. +* @prev[in]: prev : the user data. +* +* @return: the base layout of channel lock view or null +* if error occurred. +*/ +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + Evas_Object *win, *base, *bg; + Evas_Object *ctxpopup; + Evas_Object *cancel_btn; + struct _chnllock_data *data; + int ret, width, height, xpos, ypos; + struct obj_geometry_data *tmp; + + if (!mgr || !view || !prev) { + _ERR("invalid argument."); + return NULL; + } + + win = settingmgr_get_win(mgr); + if (!win) { + _ERR("settings manager get window failed."); + return NULL; + } + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("calloc memory for _priv_data failed."); + return NULL; + } + + tmp = prev; + + data->win = win; + data->gd = *tmp; + + bg = _add_view_bg(win); + if (!bg) { + _ERR("add background failed."); + goto error; + } + + data->bg = bg; + + ctxpopup = utils_add_ctxpopup(win, CHANGE_PWD_CTXPOPUP_STYLE); + if (!ctxpopup) { + _ERR("add ctxpopup failed."); + goto error; + } + + data->ctxpopup = ctxpopup; + + base = _add_view_base(data->ctxpopup); + if (!base) { + _ERR("add view base failed."); + goto error; + } + + data->base = base; + + elm_object_content_set(ctxpopup, base); + + width = height = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &width, &height); + + xpos = (width - CTXPOPUP_WIDTH) / 2; + ypos = (height - CTXPOPUP_HEIGHT) / 2; + evas_object_move(data->ctxpopup, xpos * ELM_SCALE, + ypos * ELM_SCALE); + + evas_object_smart_callback_add(data->ctxpopup, + SIG_DISMISSED, _ctxpopup_dismissed, data); + + cancel_btn = _add_view_cancel_btn(data); + if (!cancel_btn) { + _ERR("add cancel button faield."); + goto error; + } + + data->cancel_btn = cancel_btn; + + ret = _add_view_entries(data); + if (ret != 0) + goto error; + + data->mgr = mgr; + data->view = view; + + evas_object_data_set(base, CHNLLOCK_DATA_ID, data); + + return base; + +error: + _free_priv_data(data); + return NULL; +} + +/** +* Show the channel lock view. +* +* @param[in]: base : the base layout of channel lock view. +* +* @return: void. +*/ +static void _show(Evas_Object *base) +{ + struct _chnllock_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, CHNLLOCK_DATA_ID); + if (!data) { + _ERR("get data from base failed. ID: %s.", CHNLLOCK_DATA_ID); + return; + } + + evas_object_show(data->ctxpopup); + evas_object_show(data->bg); + evas_object_show(data->base); +} + +/** +* Destroy the channel lock view. +* +* @param[in]: base : the base layout of channel lock view. +* +* @return: void. +*/ +static void _destroy(Evas_Object *base) +{ + struct _chnllock_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, CHNLLOCK_DATA_ID); + if (!data) { + _ERR("get data from base failed. ID: %s.", CHNLLOCK_DATA_ID); + return; + } + + _free_priv_data(data); +} + +/** +* Hide the channel lock view. +* +* @param[in]: base : the base layout of channel lock view. +* +* @return: void. +*/ +static void _hide(Evas_Object *base) +{ + struct _chnllock_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, CHNLLOCK_DATA_ID); + if (!data) + return; + + evas_object_hide(data->base); + evas_object_hide(data->ctxpopup); + evas_object_hide(data->bg); +} + +/** +* Refresh ON/OFF text of channel lock item. +* +* @param[in]: base : the base layout of channel lock view. +* +* @return: void. +*/ +static void _refresh(Evas_Object *base) +{ + struct _chnllock_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, CHNLLOCK_DATA_ID); + if (!data) + return; + + settingmgr_view_pop(data->mgr); +} + +/** +* view class of channel lock view. +*/ +struct setting_class _vclass = { + .title = VCLASS_TITLE_NEED_PASSCODE, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide, + .refresh = _refresh +}; + +/** +* Return view class of channel lock view. +* +* @param: null. +* +* @return: the view class of channel lock view. +*/ +struct setting_class *view_need_passcode_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_pwd_popup.c b/src/view_pwd_popup.c new file mode 100644 index 0000000..0ac8192 --- /dev/null +++ b/src/view_pwd_popup.c @@ -0,0 +1,902 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "dbg.h" +#include "def.h" +#include "view_pwd_popup.h" +#include "utils.h" +#include "settings_provider.h" + +#define PWD_DATA_ID "change_passcode_data" +#define CTXPOPUP_WIDTH 688 +#define CTXPOPUP_HEIGHT 411 +#define PWD_SIZE 5 + +#define BOX_HPADDING 10 +#define BOX_VPADDING 0 + +#define MSGID_PWD_TITLE "Change passcode" +#define MSGID_UPTEXT "Enter your old passcode" +#define MSGID_DOWNTEXT "Default passcode is 0000" +#define MSGID_INVALID_PWD "Failed passcode attempt" +#define MSGID_NEW_PWD "Enter your new passcode" +#define MSGID_REENTER_PWD "Re-enter your new passcode" +#define MSGID_DIFFER_PWD "Not same passcode. Enter again" +#define MSGID_CANCEL "Cancel" +#define PWD_SYMBOL "*" +#define PWD_RANGE "0123456789" + +#define SIG_CLICKED "clicked" +#define SIG_DISMISSED "dismissed" + +enum { + ENTRY_0, + ENTRY_1, + ENTRY_2, + ENTRY_3, + ENTRY_MAX +}; + +struct _pwd_data { + Evas_Object *win; + Evas_Object *bg; + Evas_Object *base; + Evas_Object *cancel_btn; + Evas_Object *ctxpopup; + Evas_Object *box; + + Eina_Array *array; + + char pwd[PWD_SIZE]; + char entered_pwd[PWD_SIZE]; + char reentered_pwd[PWD_SIZE]; + + int new_flag; + int renew_flag; + int wrong_flag; + + struct setting_mgr *mgr; + struct settingview_data *view; +}; + +static void _hide(Evas_Object *base); + +/** +* Free user data. +* +* @param[in]: data : the user data of change passcode view. +* +* @return: void. +*/ +static void _free_pwd_data(struct _pwd_data *data) +{ + if (!data) + return; + + if (data->bg) + evas_object_del(data->bg); + + if (data->base) + evas_object_del(data->base); + + if (data->ctxpopup) + evas_object_del(data->ctxpopup); + + if (data->array) + eina_array_free(data->array); + + free(data); +} + +/** +* Create background of change passcode view. +* +* @param[in]: win : the window this view created on. +* +* @return: the created background of type evas object. +*/ +static Evas_Object *_add_pwd_bg(Evas_Object *win) +{ + Evas_Object *bg; + + if (!win) + return NULL; + + bg = utils_add_base(win); + if (!bg) { + _ERR("elm layout add failed."); + return NULL; + } + + elm_layout_file_set(bg, EDJ_FILE, GRP_PWD_BG); + + return bg; +} + +/** +* Create the base layout of change passcode view. +* +* @param[in]: ctxpopup : the ctxpopup which contains change passcode view. +* +* @return: the created base layout of change passcode view. +*/ +static Evas_Object *_add_pwd_base(Evas_Object *ctxpopup) +{ + Evas_Object *base; + + if (!ctxpopup) + return NULL; + + base = utils_add_base(ctxpopup); + if (!base) { + _ERR("elm layout add failed."); + return NULL; + } + + elm_layout_file_set(base, EDJ_FILE, GRP_PWD_VIEW); + + elm_object_part_text_set(base, PART_TITLE, + utils_get_translation_str(MSGID_PWD_TITLE)); + elm_object_part_text_set(base, PART_UPTEXT, + utils_get_translation_str(MSGID_UPTEXT)); + elm_object_part_text_set(base, PART_DOWNTEXT, + utils_get_translation_str(MSGID_DOWNTEXT)); + + return base; +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _cancelbtn_clicked_cb(void *priv, Evas_Object *obj, void *ev) +{ + struct _pwd_data *data; + + if (!priv || !obj) + return; + + data = priv; + + settingmgr_view_pop(data->mgr); +} + +/** +* Create cancel button of change passcode view. +* +* @param[in]: data : the user data of change passcode view. +* +* @return: the created cancel button or null if error occurred. +*/ +static Evas_Object *_add_pwd_cancel_btn(struct _pwd_data *data) +{ + Evas_Object *btn; + + if (!data || !data->base) + return NULL; + + btn = utils_add_btn(data->base, PWD_BASIC_BTN, + utils_get_translation_str(MSGID_CANCEL), EINA_TRUE); + if (!btn) { + _ERR("utils add button failed."); + return NULL; + } + + evas_object_smart_callback_add(btn, SIG_CLICKED, + _cancelbtn_clicked_cb, data); + + elm_object_part_content_set(data->base, SWALLOW_CANCEL_BTN, btn); + + elm_object_focus_allow_set(btn, EINA_TRUE); + + return btn; +} + +/** +* Set the move directions of focus between entries and cancel button. +* +* @param[in]: array : eina array containing entries. +* @param[in]: cancel_btn : the cancel button. +* +* @return: void. +*/ +static void _set_entry_directions(Eina_Array *array, Evas_Object *cancel_btn) +{ + Evas_Object *en; + Evas_Object *lasten; + int i; + + if (!array || !cancel_btn) + return; + + for (i = ENTRY_0; i < ENTRY_3; i++) { + en = eina_array_data_get(array, i); + if (!en) + return; + + elm_object_focus_next_object_set(en, + eina_array_data_get(array, i + 1), + ELM_FOCUS_NEXT); + elm_object_focus_next_object_set(en, en, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(en, en, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(en, en, ELM_FOCUS_UP); + elm_object_focus_next_object_set(en, cancel_btn, + ELM_FOCUS_DOWN); + } + + lasten = eina_array_data_get(array, ENTRY_3); + elm_object_focus_next_object_set(lasten, lasten, ELM_FOCUS_UP); + elm_object_focus_next_object_set(lasten, cancel_btn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(lasten, lasten, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(lasten, lasten, ELM_FOCUS_RIGHT); + + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(cancel_btn, + eina_array_data_get(array, ENTRY_0), ELM_FOCUS_UP); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_DOWN); +} + +/** +* Get the passcode. +* +* @param[in]: vdata : view data. +* +* @return: the passcode. +*/ +static char *_get_pwd(struct settingview_data *vdata) +{ + struct settingitem *item; + + if (!vdata) + return NULL; + + item = viewdata_get_parentitem(vdata); + if (!item) { + _ERR("get parent item failed."); + return NULL; + } + + return provider_get_list_value(item); +} + +/** +* Check if the input passcode is right. +* +* @param[in]: data : the user data of change passcode view. +* +* @return: 0 - wrong passcode, 1 - right passcode. +*/ +static int _check_pwd(struct _pwd_data *data) +{ + char *pwd; + + if (!data || !data->view) + return 0; + + pwd = _get_pwd(data->view); + if (!pwd) { + _ERR("get passcode failed."); + return 0; + } + + if (strncmp(data->pwd, pwd, strlen(pwd))) { + free(pwd); + return 0; + } + + free(pwd); + + return 1; +} + +/** +* Clear passcode. +* +* @param[in]: pwd : the passcode. +* +* @return: void. +*/ +static void _clear_pwd(char *pwd) +{ + if (!pwd) + return; + + while (pwd) { + if (*pwd == '\0') + break; + + *pwd = 'F'; + pwd++; + } +} + +/** +* Clear passcode. +* +* This function clears displayed passcode in entries when user +* inputs wrong passcode. +* +* @param[in]: data : the user data of change passcode view. +* +* @return: void. +*/ +static void _reset_pwd(struct _pwd_data *data) +{ + Evas_Object *btn, *first; + Eina_Array *array; + int i; + + if (!data || !data->array || !data->base) + return; + + array = data->array; + + first = eina_array_data_get(array, ENTRY_0); + if (!first) + return; + + elm_object_focus_set(first, EINA_TRUE); + elm_object_focus_next_object_set(data->cancel_btn, first, ELM_FOCUS_UP); + + for (i = ENTRY_0; i < ENTRY_MAX; i++) { + btn = eina_array_data_get(array, i); + if (!btn) + return; + + elm_object_text_set(btn, ""); + } +} + +/** +* Set passcode to system. +* +* @param[in]: data : the user data of change passcode view. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _set_pwd(struct _pwd_data *data) +{ + int ret; + struct settingitem *item; + + if (!data || !data->view) + return -1; + + item = viewdata_get_parentitem(data->view); + if (!item) { + _ERR("get parent item failed."); + return -1; + } + + ret = provider_set_list_value(item, data->pwd); + if (ret == -1) { + _ERR("set passcode failed."); + return -1; + } + + return 0; +} + +/** +* Check if the reentered passcode is right. +* +* @param[in]: data : the user data of change passcode view. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _check_reentered_pwd(struct _pwd_data *data) +{ + if (!data) + return 0; + + if (strncmp(data->entered_pwd, data->reentered_pwd, + PWD_SIZE - 1)) + return 0; + + return 1; +} + +/** +* Update text of change passcode view. +* +* @param[in]: data : the user data of change passcode view. +* @param[in]: part : edje part of text. +* @param[in]: msgid : the message id of text. +* +* @return: void. +*/ +static void _update_pwd_ui(struct _pwd_data *data, + const char *part, const char *msgid) +{ + char *text; + + if (!data || !data->base || !msgid || !part) + return; + + _reset_pwd(data); + + text = utils_get_translation_str(msgid); + elm_object_part_text_set(data->base, part, text); +} + +/** +* Evas_Object_Event_Cb type callback for handling key press event. +* +* @param[in]: priv : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the corresponding object which the key press event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _entry_keypress_cb(void *priv, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *event; + Eina_Array *array; + Evas_Object *next_entry; + struct _pwd_data *data; + const char *keyname; + int entry_idx, i; + + if (!priv || !ei || !obj) + return; + + data = priv; + array = data->array; + if (!array) + return; + + event = ei; + keyname = event->keyname; + if (!keyname) + return; + + entry_idx = -1; + for (i = ENTRY_0; i < ENTRY_MAX; i++) { + if (obj == eina_array_data_get(array, i)) { + entry_idx = i; + break; + } + } + + if (!strncmp(keyname, KEY_BACK, strlen(keyname))) { + settingmgr_view_pop(data->mgr); + } else if (!strncmp(keyname, KEY_DOWN, strlen(keyname))) { + elm_object_focus_set(data->cancel_btn, EINA_TRUE); + } else if (!strncmp(keyname, KEY_0, strlen(keyname)) || + !strncmp(keyname, KEY_1, strlen(keyname)) || + !strncmp(keyname, KEY_2, strlen(keyname)) || + !strncmp(keyname, KEY_3, strlen(keyname)) || + !strncmp(keyname, KEY_4, strlen(keyname)) || + !strncmp(keyname, KEY_5, strlen(keyname)) || + !strncmp(keyname, KEY_6, strlen(keyname)) || + !strncmp(keyname, KEY_7, strlen(keyname)) || + !strncmp(keyname, KEY_8, strlen(keyname)) || + !strncmp(keyname, KEY_9, strlen(keyname))) { + elm_entry_entry_set(obj, PWD_SYMBOL); + + data->pwd[entry_idx] = keyname[0]; + + if (data->new_flag && !data->renew_flag) + data->entered_pwd[entry_idx] = keyname[0]; + + if (data->renew_flag) + data->reentered_pwd[entry_idx] = keyname[0]; + + if (entry_idx < ENTRY_3) { + elm_object_focus_next(obj, ELM_FOCUS_NEXT); + next_entry = elm_object_focus_next_object_get(obj, + ELM_FOCUS_NEXT); + if (!next_entry) { + _ERR("next entry is null."); + return; + } + + elm_object_focus_next_object_set(data->cancel_btn, + next_entry, ELM_FOCUS_UP); + } else { + if (!data->new_flag) { + if (_check_pwd(data)) { + _update_pwd_ui(data, PART_UPTEXT, + MSGID_NEW_PWD); + + data->new_flag = 1; + } else { + _update_pwd_ui(data, PART_UPTEXT, + MSGID_INVALID_PWD); + } + } else if (!data->renew_flag) { + _update_pwd_ui(data, PART_UPTEXT, + MSGID_REENTER_PWD); + + data->renew_flag = 1; + } else { + if (_check_reentered_pwd(data)) { + if (_set_pwd(data) != 0) { + _ERR("set passcode failed."); + return; + } + + data->new_flag = 0; + data->renew_flag = 0; + + settingmgr_view_pop(data->mgr); + } else { + _update_pwd_ui(data, PART_UPTEXT, + MSGID_DIFFER_PWD); + + data->renew_flag = 0; + data->new_flag = 1; + } + } + } + } +} + +/** +* Create entry. +* +* @param[in]: parent : object the entry will be created on. +* +* @return: the created entry or null if error occurred. +*/ +static Evas_Object *_add_entry(Evas_Object *parent) +{ + Evas_Object *entry; + Elm_Entry_Filter_Limit_Size length = { + .max_char_count = 1 + }; + Elm_Entry_Filter_Accept_Set type = { + .accepted = PWD_RANGE + }; + + if (!parent) + return NULL; + + entry = utils_add_entry(parent); + if (!entry) { + _ERR("utils add entry failed."); + return NULL; + } + + elm_entry_markup_filter_append(entry, + elm_entry_filter_limit_size, &length); + elm_entry_markup_filter_append(entry, + elm_entry_filter_accept_set, &type); + + elm_object_style_set(entry, STYLE_PWD_ENTRY); + + elm_entry_text_style_user_push(entry, STYLE_ENTRY_TEXT); + elm_object_part_content_set(parent, SWALLOW_ENTRY, entry); + + return entry; +} + +/** +* Create entries for inputting passcode. +* +* @param[in]: data : the user data of change passcode view. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_pwd_entry(struct _pwd_data *data) +{ + Eina_Array *array; + Evas_Object *box; + Evas_Object *entry; + Evas_Object *entry_base; + int i; + + if (!data || !data->base) { + _ERR("invalid arguments."); + return -1; + } + + box = utils_add_box(data->base); + if (!box) { + _ERR("add box failed."); + return -1; + } + + elm_box_horizontal_set(box, EINA_TRUE); + elm_box_padding_set(box, BOX_HPADDING, BOX_VPADDING); + + array = eina_array_new(1); + if (!array) { + _ERR("new eina array failed."); + evas_object_del(box); + return -1; + } + + for (i = ENTRY_0; i < ENTRY_MAX; i++) { + entry_base = utils_add_base(data->base); + if (!entry_base) { + _ERR("entry base created failed."); + evas_object_del(box); + eina_array_free(array); + return -1; + } + + elm_layout_file_set(entry_base, EDJ_FILE, GRP_PWD_ENTRY); + + entry = _add_entry(entry_base); + if (!entry) { + _ERR("add entry failed."); + evas_object_del(box); + evas_object_del(entry_base); + eina_array_free(array); + return -1; + } + + eina_array_push(array, entry); + elm_box_pack_end(box, entry_base); + + evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN, + _entry_keypress_cb, data); + } + + elm_object_part_content_set(data->base, SWALLOW_CONTENT_AREA, box); + + elm_object_focus_allow_set( + eina_array_data_get(array, ENTRY_0), EINA_TRUE); + elm_object_focus_set( + eina_array_data_get(array, ENTRY_0), EINA_TRUE); + + _set_entry_directions(array, data->cancel_btn); + + data->box = box; + data->array = array; + + return 0; +} + +/** +* Evas_Smart_Cb type callback for handling ctxpopup dismissed event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the dismissed event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _ctxpopup_dismissed(void *priv, Evas_Object *obj, + void *ev) +{ + struct _pwd_data *data; + + if (!priv || !obj) + return; + + data = priv; + + if (!data->base || !data->mgr) + return; + + _hide(data->base); + + settingmgr_view_pop(data->mgr); +} + +/** +* Create all the UI components of change passcode view. +* +* @param[in]: mgr : view manager of settings views. +* @param[in]: view : data of view. +* @prev[in]: prev : the user data. +* +* @return: the base layout of change passcode view or null +* if error occurred. +*/ +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + Evas_Object *base, *bg; + Evas_Object *win; + Evas_Object *cancel_btn; + Evas_Object *ctxpopup; + struct _pwd_data *data; + int ret; + int width, height; + int xpos, ypos; + + if (!mgr || !view) { + _ERR("invalid argument."); + return NULL; + } + + win = settingmgr_get_win(mgr); + if (!win) { + _ERR("settingmgr get window failed."); + return NULL; + } + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("calloc _change_passcode_data failed."); + return NULL; + } + + data->win = win; + + _clear_pwd(data->pwd); + + bg = _add_pwd_bg(win); + if (!bg) { + _ERR("add change passcode background failed."); + goto error; + } + + ctxpopup = utils_add_ctxpopup(win, CHANGE_PWD_CTXPOPUP_STYLE); + if (!ctxpopup) { + _ERR("add ctxpopup failed."); + goto error; + } + + data->ctxpopup = ctxpopup; + + base = _add_pwd_base(data->ctxpopup); + if (!base) { + _ERR("add change passcode base layout failed."); + goto error; + } + + data->base = base; + + elm_object_content_set(ctxpopup, base); + + width = height = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &width, &height); + + xpos = (width - CTXPOPUP_WIDTH) / 2; + ypos = (height - CTXPOPUP_HEIGHT) / 2; + evas_object_move(data->ctxpopup, xpos * ELM_SCALE, ypos * ELM_SCALE); + + cancel_btn = _add_pwd_cancel_btn(data); + if (!cancel_btn) { + _ERR("add change passcode cancel button failed."); + goto error; + } + + data->cancel_btn = cancel_btn; + + ret = _add_pwd_entry(data); + if (ret != 0) { + _ERR("add change passcode input buttons failed."); + goto error; + } + + data->mgr = mgr; + data->bg = bg; + data->view = view; + + evas_object_smart_callback_add(data->ctxpopup, + SIG_DISMISSED, _ctxpopup_dismissed, data); + + evas_object_data_set(base, PWD_DATA_ID, data); + + return base; + +error: + _free_pwd_data(data); + return NULL; +} + +/** +* Show the change passcode view. +* +* @param[in]: base : the base layout of change passcode view. +* +* @return: void. +*/ +static void _show(Evas_Object *base) +{ + struct _pwd_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, PWD_DATA_ID); + if (!data) { + _ERR("get data from base failed. ID: %s.", PWD_DATA_ID); + return; + } + + evas_object_show(data->ctxpopup); +} + +/** +* Destroy the change passcode view. +* +* @param[in]: base : the base layout of change passcode view. +* +* @return: void. +*/ +static void _destroy(Evas_Object *base) +{ + struct _pwd_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, PWD_DATA_ID); + if (!data) { + _ERR("get data from base failed. ID: %s.", PWD_DATA_ID); + return; + } + + _free_pwd_data(data); +} + +/** +* Hide the change passcode view. +* +* @param[in]: base : the base layout of change passcode view. +* +* @return: void. +*/ +static void _hide(Evas_Object *base) +{ + struct _pwd_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, PWD_DATA_ID); + if (!data) { + _ERR("get data from base failed. ID: %s.", + PWD_DATA_ID); + return; + } + + evas_object_hide(data->bg); + evas_object_hide(data->ctxpopup); +} + +/** +* view class of change passcode view. +*/ +static struct setting_class _vclass = { + .title = VCLASS_TITLE_CHANGE_PASSCODE, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide +}; + +/** +* Return view class of change passcode view. +* +* @param: null. +* +* @return: the view class of change passcode view. +*/ +struct setting_class *view_passcode_popup_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_resetpopup.c b/src/view_resetpopup.c new file mode 100644 index 0000000..b1d315e --- /dev/null +++ b/src/view_resetpopup.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "dbg.h" +#include "def.h" +#include "stdbool.h" +#include "viewmgr.h" +#include "utils.h" +#include "data_wrapper.h" +#include "settings_provider.h" +#include "view_resetpopup.h" + +/** +* This function is invoked to create view layout. +* +* @param mgr [in] The setting_mgr data pointer passed by @settingmgr_view_push. +* @param view [in] The settingview_data data pointer passed by @settingmgr_view_push. +* @param prev [in] The parameter data which passed by prev view or NULL. +* @return View layout evas object, NULL on error. +*/ +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + /*TODO:Implement this function*/ + return NULL; +} + +/** +* This function is invoked to show view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _show(Evas_Object *base) +{ +} + +/** +* This function is invoked to destroy view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _destroy(Evas_Object *base) +{ +} + +/** +* This function is invoked to hide view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _hide(Evas_Object *base) +{ +} + +static struct setting_class _vclass = { + .title = VCLASS_TITLE_RESET_POPUP, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide, + .hide_view = 0 +}; + +/** +* This function is invoked to get reset popup view class object. +* +* @return The setting_class data static pointer, NULL on error. +*/ +struct setting_class *view_resetpopup_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_sublist.c b/src/view_sublist.c new file mode 100644 index 0000000..6ace773 --- /dev/null +++ b/src/view_sublist.c @@ -0,0 +1,777 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "dbg.h" +#include "def.h" +#include "stdbool.h" +#include "viewmgr.h" +#include "utils.h" +#include "data_wrapper.h" +#include "settings_provider.h" +#include "view_sublist.h" + +#define DATA_ID "SUBLISTDATA" +#define MAX_ITEMS 8 +#define ITEMID "itemdata" + +#define SUBLIST_OFFSET 70.0 +#define SUBLIST_WIDTH 310.0 +#define ITEM_HEIGHT 82 +#define ITEM_OFFSET (39 * 2) + +#define SIG_SCROLL_BOTTOM "edge,bottom" +#define SIG_SCROLL_TOP "edge,top" +#define SIG_SCROLL "scroll" +#define SIG_ITEM_FOCUSED "focused" +#define SIG_ITEM_UNFOCUSED "unfocused" +#define SIG_ITEM_CLICKED "clicked" +#define SIG_CTXPOPUP_DISMISSED "dismissed" + +struct _sublist_data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *ctxpopup; + Evas_Object *popup_box; + Evas_Object *scroller; + Eina_Array *sub_btn_array; + + int sub_items_count; + int selected_index; + struct obj_geometry_data *geometry_data; + struct settingview_data *sublist_view; + struct setting_mgr *mgr; +}; + +static void _destroy(Evas_Object *base); +static void _hide(Evas_Object *base); + +/** +* This function is invoked to exit and pop current view. +* +* @param data [in] The _sublist_data data pointer. +* @return void. +*/ +static void _exit_view(struct _sublist_data *data) +{ + if (!data) + return; + + _hide(data->base); + settingmgr_view_pop(data->mgr); +} + +/** +* This function is invoked to get item's data list. +* +* @param data [in] The settingview_data data pointer. +* @param cnt [out] The list element numbers +* @return The Eina_List data pointer, NULL on error. +*/ +static Eina_List *_get_list_data(struct settingview_data *data, int *cnt) +{ + Eina_List *list; + + if (!data || !cnt) { + _ERR("Invalid arguments"); + return NULL; + } + + list = settingitem_get_data_list(viewdata_get_parentitem(data)); + if (!list) { + *cnt = 0; + return NULL; + } + + *cnt = eina_list_count(list); + + return list; +} + +/** +* This function is invoked to get current selected value. +* +* @param data [in] The _sublist_data data pointer. +* @return The selected string value, NULL on error. +*/ +static char *_get_selected_value(struct _sublist_data *data) +{ + struct settingitem *item; + + if (!data || !data->sublist_view) { + _ERR("Invalid argument"); + return NULL; + } + + item = viewdata_get_parentitem(data->sublist_view); + if (!item) { + _ERR("Get item failed"); + return NULL; + } + + return provider_get_list_value(item); +} + +/** +* This function is invoked to set selected value to middleware. +* +* @param data [in] The _sublist_data data pointer. +* @param obj [in] The evas object user selected. +* @return void. +*/ +static void _set_selected_value(struct _sublist_data *data, + Evas_Object *obj) +{ + struct settingitem *item; + char *val; + int r; + + if (!data || !data->sublist_view || !obj) { + _ERR("Invalid argument"); + return; + } + + item = viewdata_get_parentitem(data->sublist_view); + if (!item) { + _ERR("Get item failed"); + return; + } + + val = evas_object_data_get(obj, ITEMID); + if (val) { + r = provider_set_list_value(item, val); + if (r == -1) + _ERR("Set list value failed"); + } +} + +/** +* This function is a @Evas_Smart_Cb type callback, it will be invoked if scroller go to bottom. +* +* @param data [in] The user data. +* @param obj [in] The corresponding object which event occurred. +* @param event [in] The event infomation. +* @return void. +*/ +static void _scroller_bottom_cb(void *data, Evas_Object *obj, void *event) +{ + struct _sublist_data *priv; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + elm_object_signal_emit(priv->ctxpopup, SUBLIST_SHOW_UP_ARROW, ""); +} + +/** +* This function is a @Evas_Smart_Cb type callback, it will be invoked if scroller go to top. +* +* @param data [in] The user data. +* @param obj [in] The corresponding object which event occurred. +* @param event [in] The event infomation. +* @return void. +*/ +static void _scroller_top_cb(void *data, Evas_Object *obj, void *event) +{ + struct _sublist_data *priv; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + elm_object_signal_emit(priv->ctxpopup, SUBLIST_SHOW_DOWN_ARROW, ""); +} + +/** +* This function is a @Evas_Smart_Cb type callback, it will be invoked if scroller is scrolling. +* +* @param data [in] The user data. +* @param obj [in] The corresponding object which event occurred. +* @param event [in] The event infomation. +* @return void. +*/ +static void _scroll_event_cb(void *data, Evas_Object *obj, void *event) +{ + struct _sublist_data *priv; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + elm_object_signal_emit(priv->ctxpopup, SUBLIST_SHOW_BOTH_ARROW, ""); +} + +/** +* This function is a @Evas_Smart_Cb type callback, it will be invoked if evas object get focus. +* +* @param data [in] The user data. +* @param obj [in] The corresponding object which event occurred. +* @param ev [in] The event infomation. +* @return void. +*/ +static void _subitem_focus_in_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _sublist_data *priv; + char *val, *sel; + + if (!obj || !data) { + _ERR("Invalid arguments\n"); + return; + } + + priv = data; + + val = evas_object_data_get(obj, ITEMID); + if (!val) { + _ERR("Get value from btn failed\n"); + return; + } + + sel = _get_selected_value(priv); + if (!sel) { + _ERR("_get_selected_value failed\n"); + return; + } + + if (!strncmp(sel, val, strlen(sel))) + elm_object_signal_emit(obj, CTXPOPUPBTN_ICON_FOCUSED, + CTXPOPUPBTN_ICON_SOURCE); + + elm_object_signal_emit(obj, CTXPOPUPBTN_BUTTON_FOCUSED, + CTXPOPUPBTN_BUTTON_SOURCE); + + provider_release_list_value(sel); +} + +/** +* This function is a @Evas_Smart_Cb type callback, it will be invoked if evas object lose focus. +* +* @param data [in] The user data. +* @param obj [in] The corresponding object which event occurred. +* @param ev [in] The event infomation. +* @return void. +*/ +static void _subitem_focus_out_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _sublist_data *priv; + char *val, *sel; + + if (!obj || !data) { + _ERR("Invalid arguments\n"); + return; + } + + priv = data; + + val = evas_object_data_get(obj, ITEMID); + if (!val) { + _ERR("Get value from btn failed\n"); + return; + } + + sel = _get_selected_value(priv); + if (!sel) { + _ERR("_get_selected_value failed\n"); + return; + } + + if (!strncmp(sel, val, strlen(sel))) + elm_object_signal_emit(obj, CTXPOPUPBTN_BUTTON_HIGHLIGHT, + CTXPOPUPBTN_BUTTON_SOURCE); + else + elm_object_signal_emit(obj, CTXPOPUPBTN_BUTTON_UNFOCUSED, + CTXPOPUPBTN_BUTTON_SOURCE); + + provider_release_list_value(sel); +} + +/** +* This function is a @Evas_Smart_Cb type callback, it will be invoked if evas object be clicked. +* +* @param data [in] The user data. +* @param obj [in] The corresponding object which event occurred. +* @param ev [in] The event infomation. +* @return void. +*/ +static void _subitem_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _sublist_data *priv; + + if (!data || !obj) + return; + + priv = data; + + _set_selected_value(priv, obj); + + _exit_view(priv); +} + +/** +* This function is a @Evas_Smart_Cb type callback, it will be invoked if +* ctxpopup dismissed. +* +* @param data [in] The user data. +* @param obj [in] The corresponding object which event occurred. +* @param ev [in] The event infomation. +* @return void. +*/ +static void _ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _sublist_data *priv; + + if (!data) + return; + + priv = data; + + _exit_view(priv); +} + +/** +* This function is a @Evas_Smart_Cb type callback, it will be invoked if occurred +* key press event. +* +* @param data [in] The user data. +* @param e [in] The evas handler. +* @param obj [in] The corresponding object which event occurred. +* @param ei [in] The event infomation. +* @return void. +*/ +static void _subitem_key_pressed_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _sublist_data *priv; + + if (!data || !ei) + return; + + ev = ei; + priv = data; + + if (!strcmp(ev->keyname, KEY_BACK)) + _exit_view(priv); +} + +/** +* This function is invoked to draw ctxpopup layout. +* +* @param data [in] The _sublist_data data pointer. +* @return 0 if success, -1 if fail. +*/ +static int _draw_ctxpopup_layout(struct _sublist_data *data) +{ + Evas_Object *box, *ctxpopup, *scroller; + + if (!data || !data->ctxpopup) { + _ERR("Invalid argument"); + return -1; + } + + ctxpopup = data->ctxpopup; + scroller = NULL; + + if (data->sub_items_count > MAX_ITEMS) { + scroller = utils_add_scroller(ctxpopup); + if (!scroller) { + _ERR("elm_scroller_add failed\n"); + return -1; + } + + elm_object_style_set(scroller, SUBLIST_SCROLLER_STYLE); + elm_object_content_set(ctxpopup, scroller); + + box = utils_add_box(ctxpopup); + if (!box) { + _ERR("elm_box_add failed\n"); + evas_object_del(scroller); + return -1; + } + + elm_object_content_set(scroller, box); + + evas_object_smart_callback_add(scroller, SIG_SCROLL_BOTTOM, + _scroller_bottom_cb, data); + evas_object_smart_callback_add(scroller, SIG_SCROLL_TOP, + _scroller_top_cb, data); + evas_object_smart_callback_add(scroller, SIG_SCROLL, + _scroll_event_cb, data); + + elm_object_signal_emit(ctxpopup, SUBLIST_SHOW_DOWN_ARROW, ""); + } else { + box = utils_add_box(ctxpopup); + if (!box) { + _ERR("elm_box_add failed\n"); + return -1; + } + + elm_object_content_set(ctxpopup, box); + + elm_object_signal_emit(ctxpopup, SUBLIST_HIDE_BOTH_ARROW, ""); + } + + data->popup_box = box; + data->scroller = scroller; + + return 0; +} + +/** +* This function is invoked to draw list items. +* +* @param data [in] The _sublist_data data pointer. +* @param list [in] The eina list data pointer. +* @return 0 if success, -1 if fail. +*/ +static int _draw_list_items(struct _sublist_data *data, Eina_List *list) +{ + struct listitem *ldata; + Eina_List *l; + Eina_Array *btns; + Eina_Array_Iterator a; + Evas_Object *btn, *tmp; + char *sel; + const char *name, *val; + int check, i, j; + + if (!data || !list || !data->popup_box) { + _ERR("Invalid argument"); + return -1; + } + + sel = _get_selected_value(data); + if (!sel) { + _ERR("Get selected value failed"); + return -1; + } + + btns = eina_array_new(1); + if (!btns) { + _ERR("Allocate array failed\n"); + provider_release_list_value(sel); + return -1; + } + + i = 0; + j = 0; + check = 0; + + EINA_LIST_FOREACH(list, l, ldata) { + name = listitem_get_display_name(ldata); + + btn = utils_add_btn(data->popup_box, CTXPOPUPBTN_STYLE, + name, EINA_TRUE); + if (!btn) { + _ERR("Add button failed\n"); + EINA_ARRAY_ITER_NEXT(btns, j, tmp, a) + evas_object_del(tmp); + eina_array_free(btns); + provider_release_list_value(sel); + return -1; + } + + val = listitem_get_value(ldata); + if (!strncmp(sel, val, strlen(sel))) { + elm_object_signal_emit(btn, + CTXPOPUPBTN_BUTTON_HIGHLIGHT, + CTXPOPUPBTN_BUTTON_SOURCE); + check = i; + } + + evas_object_data_set(btn, ITEMID, val); + + evas_object_smart_callback_add(btn, SIG_ITEM_FOCUSED, + _subitem_focus_in_cb, data); + evas_object_smart_callback_add(btn, SIG_ITEM_UNFOCUSED, + _subitem_focus_out_cb, data); + evas_object_smart_callback_add(btn, SIG_ITEM_CLICKED, + _subitem_btn_clicked_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _subitem_key_pressed_cb, data); + + elm_box_pack_end(data->popup_box, btn); + eina_array_push(btns, btn); + + if (i == 0) + elm_object_focus_set(btn, EINA_TRUE); + + i++; + } + + data->sub_btn_array = btns; + data->selected_index = check; + + provider_release_list_value(sel); + + return 0; +} + +/** +* This function is invoked to draw sub list view. +* +* @param data [in] The _sublist_data data pointer. +* @return 0 if success, -1 if fail. +*/ +static int _draw_sublist(struct _sublist_data *data) +{ + struct settingview_data *view; + Eina_List *list; + double ratio, w; + int cnt, x, y, height, screen_h; + struct obj_geometry_data *param; + + if (!data || !data->sublist_view || !data->geometry_data) { + _ERR("Invalid argument\n"); + return -1; + } + + view = data->sublist_view; + + cnt = 0; + list = _get_list_data(view, &cnt); + if (!list) { + _ERR("Get item list failed"); + return -1; + } + + data->sub_items_count = cnt; + + if (_draw_ctxpopup_layout(data) == -1) { + _ERR("Fail to draw ctxpopup layout"); + return -1; + } + + if (_draw_list_items(data, list) == -1) { + _ERR("Fail to draw list items"); + return -1; + } + + ecore_x_window_size_get(ecore_x_window_root_first_get(), + NULL, &screen_h); + + param = data->geometry_data; + + w = param->width; + if (w <= 0) { + _ERR("Fail to get clicked button width"); + return -1; + } + + ratio = (w - SUBLIST_WIDTH - SUBLIST_OFFSET) / w; + + x = param->x + param->width * ratio; + y = param->y; + + if (data->sub_items_count < MAX_ITEMS) + height = data->sub_items_count * ITEM_HEIGHT; + else + height = MAX_ITEMS * ITEM_HEIGHT + ITEM_OFFSET; + + if (y > screen_h) + y = y - height; + + evas_object_move(data->ctxpopup, x * ELM_SCALE, y * ELM_SCALE); + + utils_set_focus_directions(data->sub_btn_array, data->sub_items_count); + + return 0; +} + +/** +* This function is invoked to create view layout. +* +* @param mgr [in] The setting_mgr data pointer passed by @settingmgr_view_push. +* @param view [in] The settingview_data data pointer passed by @settingmgr_view_push. +* @param prev [in] The parameter data which passed by prev view or NULL. +* @return View layout evas object, NULL on error. +*/ +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + Evas_Object *base, *ctxpopup, *win; + struct _sublist_data *data; + + if (!mgr || !view || !prev) { + _ERR("Invalid argument!\n"); + return NULL; + } + + win = settingmgr_get_win(mgr); + if (!win) { + _ERR("Fail to get win"); + return NULL; + } + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("Unable to allocate memory\n"); + return NULL; + } + + base = elm_layout_add(win); + if (!base) { + free(data); + return NULL; + } + + elm_layout_file_set(base, EDJ_FILE, SUBLIST_VIEW_PAGE); + + ctxpopup = utils_add_ctxpopup(win, SUBLIST_CTXPOPUP_STYLE1); + if (!ctxpopup) { + _ERR("Fail to add ctxpopup"); + evas_object_del(base); + free(data); + return NULL; + } + + evas_object_smart_callback_add(ctxpopup, SIG_CTXPOPUP_DISMISSED, + _ctxpopup_dismissed_cb, data); + + data->geometry_data = prev; + + data->mgr = mgr; + data->win = win; + data->base = base; + data->ctxpopup = ctxpopup; + data->sublist_view = view; + + evas_object_data_set(base, DATA_ID, data); + + if (_draw_sublist(data) == -1) { + _ERR("Error in drawing items function\n"); + evas_object_del(base); + evas_object_del(ctxpopup); + if (data->sub_btn_array) + eina_array_free(data->sub_btn_array); + + free(data); + return NULL; + } + + return base; + +} + +/** +* This function is invoked to show view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _show(Evas_Object *base) +{ + struct _sublist_data *data; + + if (!base) { + _ERR("Invalid argument\n"); + return; + } + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("Get sublist data failed\n"); + return; + } + + evas_object_show(data->ctxpopup); + evas_object_show(base); +} + +/** +* This function is invoked to destroy view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _destroy(Evas_Object *base) +{ + struct _sublist_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("Invalid arguments"); + evas_object_del(data->ctxpopup); + evas_object_del(base); + return; + } + + if (data->sub_btn_array) + eina_array_free(data->sub_btn_array); + + evas_object_del(data->ctxpopup); + evas_object_del(base); + + if (data->sublist_view) + viewdata_release(data->sublist_view); + + free(data); +} + +/** +* This function is invoked to hide view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _hide(Evas_Object *base) +{ + struct _sublist_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("Invalid arguments"); + return; + } + + evas_object_hide(base); + evas_object_hide(data->ctxpopup); +} + +static struct setting_class _vclass = { + .title = VCLASS_TITLE_SUBLIST, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide, + .hide_view = 0 +}; + +/** +* This function is invoked to get sub list view class object. +* +* @return The setting_class data static pointer, NULL on error. +*/ +struct setting_class *view_sublist_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_system_clock.c b/src/view_system_clock.c new file mode 100644 index 0000000..b3a1628 --- /dev/null +++ b/src/view_system_clock.c @@ -0,0 +1,776 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "dbg.h" +#include "def.h" +#include "stdbool.h" +#include "viewmgr.h" +#include "utils.h" +#include "data_wrapper.h" +#include "settings_provider.h" +#include "view_system_clock.h" + +#define DATA_ID "system_clock_data" +#define MAX_ITEMS 2 +#define ITEM_HEIGHT 82 +#define POS_ADJUST (39 * 2) +#define ITEMID "itemdata" +#define CLOCK_ITEM 0 +#define MANUAL "1" + +#define SUBLIST_WIDTH 310.0 +#define LEFT_MARGIN 70.0 +#define LEFT_OFFSET (SUBLIST_WIDTH + LEFT_MARGIN) + +#define SIG_DISMISSED "dismissed" +#define SIG_FOCUSED "focused" +#define SIG_UNFOCUSED "unfocused" +#define SIG_CLICKED "clicked" + +struct _sysclk_data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *ctxpopup; + Evas_Object *box; + Eina_Array *array; + + int count; + int sel_idx; + struct settingview_data *vdata; + struct setting_mgr *mgr; + + struct evas_obj_data ugd; + struct obj_geometry_data *ogd; +}; + +static void _destroy(Evas_Object *base); +static void _hide(Evas_Object *base); + +/** +* Exit system clock sublist view. +* +* @param[in]: data : the user data of system clock sublist view. +* +* @return: void. +*/ +static void _exit_view(struct _sysclk_data *data) +{ + if (!data || !data->base) + return; + + _hide(data->base); + + settingmgr_view_pop(data->mgr); +} + +/** +* Get item list. +* +* @param[in]: vdata : view data. +* @param[out]: count : number of item. +* +* @return: eina list containing items or null if error occurred. +*/ +static Eina_List *_get_item_list(struct settingview_data *vdata, int *count) +{ + Eina_List *list; + + if (!vdata || !count) { + _ERR("Invalid arguments"); + return NULL; + } + + list = settingitem_get_data_list(viewdata_get_parentitem(vdata)); + if (!list) { + *count = 0; + return NULL; + } + + *count = eina_list_count(list); + + return list; +} + +/** +* Get selected value: Manual or Auto. +* +* @param[in]: data : the user data of system clock sublist view. +* +* @return: the selected value or null if error occurred. +*/ +static char *_get_selected_value(struct _sysclk_data *data) +{ + struct settingitem *item; + + if (!data || !data->vdata) { + _ERR("Invalid argument"); + return NULL; + } + + item = viewdata_get_parentitem(data->vdata); + if (!item) { + _ERR("Get item failed"); + return NULL; + } + + return provider_get_list_value(item); +} + +/** +* Set selected value: Manual or Auto. +* +* @param[in]: data : the user data of system clock sublist view. +* @param[in]: obj : the selected object. +* +* @return: void. +*/ +static void _set_selected_value(struct _sysclk_data *data, Evas_Object *obj) +{ + struct settingitem *item; + char *selval; + int ret; + + if (!data || !data->vdata || !obj) { + _ERR("Invalid argument"); + return; + } + + item = viewdata_get_parentitem(data->vdata); + if (!item) { + _ERR("Get item failed"); + return; + } + + selval = evas_object_data_get(obj, ITEMID); + if (selval) { + ret = provider_set_list_value(item, selval); + if (ret != 0) + _ERR("Set list value failed"); + } +} + +/** +* Evas_Smart_Cb type callback for handling foucs in event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the foucs in event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _subitem_focusin_cb(void *priv, Evas_Object *obj, void *ev) +{ + struct _sysclk_data *data; + char *value; + char *selval; + + if (!obj || !priv) { + _ERR("Invalid arguments\n"); + return; + } + + data = priv; + + value = evas_object_data_get(obj, ITEMID); + if (!value) { + _ERR("Get value from btn failed\n"); + return; + } + + selval = _get_selected_value(data); + if (!selval) { + _ERR("_get_selected_value failed\n"); + return; + } + + if (!strncmp(selval, value, strlen(selval))) { + elm_object_signal_emit(obj, CTXPOPUPBTN_ICON_FOCUSED, + CTXPOPUPBTN_ICON_SOURCE); + } + + elm_object_signal_emit(obj, CTXPOPUPBTN_BUTTON_FOCUSED, + CTXPOPUPBTN_BUTTON_SOURCE); + + provider_release_list_value(selval); +} + +/** +* Evas_Smart_Cb type callback for handling focus out event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the focus out event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _subitem_focusout_cb(void *priv, Evas_Object *obj, void *ev) +{ + struct _sysclk_data *data; + char *value; + char *selval; + + if (!obj || !priv) { + _ERR("Invalid arguments\n"); + return; + } + + data = priv; + + value = evas_object_data_get(obj, ITEMID); + if (!value) { + _ERR("Get value from btn failed\n"); + return; + } + + selval = _get_selected_value(data); + if (!selval) { + _ERR("_get_selected_value failed\n"); + return; + } + + if (!strncmp(selval, value, strlen(selval))) + elm_object_signal_emit(obj, CTXPOPUPBTN_BUTTON_HIGHLIGHT, + CTXPOPUPBTN_BUTTON_SOURCE); + else + elm_object_signal_emit(obj, CTXPOPUPBTN_BUTTON_UNFOCUSED, + CTXPOPUPBTN_BUTTON_SOURCE); + + provider_release_list_value(selval); +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _subitem_clicked_cb(void *priv, Evas_Object *obj, void *ev) +{ + struct _sysclk_data *data; + struct settingitem *item; + Eina_List *list; + char *value; + const char *id; + const char *name; + + if (!priv || !obj) + return; + + data = priv; + + _set_selected_value(data, obj); + + value = evas_object_data_get(obj, ITEMID); + if (!value) { + _ERR("get value from obj failed. DATA_ID: %s", ITEMID); + return; + } + + if (!strncmp(value, MANUAL, BUF_SIZE)) { + _hide(data->base); + + list = viewdata_get_childitems_list(data->vdata); + if (!list) { + _ERR("list of clock is null."); + return; + } + + item = eina_list_nth(list, CLOCK_ITEM); + if (!item) { + _ERR("there is no clock_mode item in list."); + return; + } + + id = settingitem_get_id(item); + if (!id) { + _ERR("get item id failed."); + return; + } + + name = settingitem_get_display_name(item); + if (!name) { + _ERR("get display_name failed."); + return; + } + + data->ugd.display_name = name; + + settingmgr_view_push(data->mgr, id, (void *)&data->ugd); + } else { + _exit_view(data); + } +} + +/** +* Evas_Object_Event_Cb type callback for handling key press event. +* +* @param[in]: priv : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the corresponding object which the key press event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _subitem_keypress_cb(void *priv, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _sysclk_data *data; + + if (!priv || !ei) + return; + + data = priv; + ev = ei; + + if (!ev->keyname) + return; + + if (!strncmp(ev->keyname, KEY_BACK, BUF_SIZE)) + _exit_view(data); +} + +/** +* Create system clock sublist items. +* +* @param[in]: data : the user data. +* @param[in]: list : the eina list containing items. +* @param[in]: selval : the current selected value of item. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_sysclk_sublist_item(struct _sysclk_data *data, + Eina_List *list, const char *selval) +{ + Evas_Object *box, *cp, *btn, *del_btn; + Eina_Array *array; + Eina_Array_Iterator aiter; + struct listitem *li; + Eina_List *iter; + const char *disp, *value; + int idx, i, j; + + if (!data || !list || !data->ctxpopup || !selval) { + _ERR("invalid arguments."); + return -1; + } + + cp = data->ctxpopup; + + box = utils_add_box(cp); + if (!box) { + _ERR("utils add box to ctxpopup failed."); + return -1; + } + + elm_object_content_set(cp, box); + + array = eina_array_new(1); + if (!array) { + _ERR("eina array new failed."); + evas_object_del(box); + return -1; + } + + i = idx = 0; + EINA_LIST_FOREACH(list, iter, li) { + disp = listitem_get_display_name(li); + if (!disp) { + _ERR("display name of list item is null."); + goto error; + } + + btn = utils_add_btn(box, CTXPOPUPBTN_STYLE, disp, EINA_TRUE); + if (!btn) { + _ERR("utils add button failed."); + goto error; + } + + value = listitem_get_value(li); + if (!value) { + _ERR("value of this list item is null."); + goto error; + } + + if (!strncmp(selval, value, strlen(selval))) { + elm_object_signal_emit(btn, + CTXPOPUPBTN_BUTTON_HIGHLIGHT, + CTXPOPUPBTN_BUTTON_SOURCE); + idx = i; + } + + evas_object_data_set(btn, ITEMID, value); + + evas_object_smart_callback_add(btn, SIG_FOCUSED, + _subitem_focusin_cb, data); + evas_object_smart_callback_add(btn, SIG_UNFOCUSED, + _subitem_focusout_cb, data); + evas_object_smart_callback_add(btn, SIG_CLICKED, + _subitem_clicked_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _subitem_keypress_cb, data); + + elm_box_pack_end(box, btn); + eina_array_push(array, btn); + + if (i == 0) + elm_object_focus_set(btn, EINA_TRUE); + + i++; + } + + data->box = box; + data->array = array; + data->sel_idx = idx; + + return 0; + +error: + EINA_ARRAY_ITER_NEXT(array, j, del_btn, aiter) { + if (del_btn) + evas_object_del(del_btn); + } + + evas_object_del(box); + eina_array_free(array); + + return -1; +} + +/** +* Create system clock sublist view. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _draw_sysclk_sublist(struct _sysclk_data *data) +{ + Evas_Object *ctxpopup; + char *selval; + struct settingview_data *vdata; + struct obj_geometry_data *ogd; + Eina_List *itlist; + int xpos, ypos, height, count, r; + double ratio; + + if (!data || !data->ctxpopup || !data->ogd || !data->vdata) { + _ERR("Invalid argument\n"); + return -1; + } + + ctxpopup = data->ctxpopup; + vdata = data->vdata; + ogd = data->ogd; + + count = 0; + itlist = _get_item_list(vdata, &count); + if (!itlist) { + _ERR("Get item list failed"); + return -1; + } + + data->count = count; + + selval = _get_selected_value(data); + if (!selval) { + _ERR("Get selected value failed"); + return -1; + } + + if (count > MAX_ITEMS) { + _ERR("system clock sublist is too many."); + goto error; + } + + r = _add_sysclk_sublist_item(data, itlist, selval); + if (r != 0) { + _ERR("add system clock sublist items failed."); + goto error; + } + + if (ogd->width <= 0) { + _ERR("width of object is less than 0."); + goto error; + } + + ratio = (ogd->width - LEFT_OFFSET) / ogd->width; + xpos = ogd->x + ogd->width * ratio; + ypos = ogd->y; + + height = data->count * ITEM_HEIGHT; + + if (ypos > WIN_HEIGHT) + ypos = ypos - height; + + evas_object_move(ctxpopup, xpos * ELM_SCALE, ypos * ELM_SCALE); + + utils_set_focus_directions(data->array, data->count); + + provider_release_list_value(selval); + + return 0; + +error: + provider_release_list_value(selval); + return -1; +} + +/** +* Evas_Smart_Cb type callback for handling ctxpopup dismissed event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the dismissed event occurred. +* @param[in]: ev : event info. +* +* @return: void. +*/ +static void _ctxpopup_dismissed(void *priv, Evas_Object *obj, + void *ev) +{ + struct _sysclk_data *data; + + if (!priv || !obj) + return; + + data = priv; + + _hide(data->base); + + settingmgr_view_pop(data->mgr); +} + +/** +* Create all the UI components of system clock sublist view. +* +* @param[in]: mgr : view manager of settings views. +* @param[in]: view : data of view. +* @param[in]: prev : the user data. +* +* @return: the base layout of system clock view or null +* if error occurred. +*/ +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + Evas_Object *base; + Evas_Object *ctxpopup; + Evas_Object *win; + struct _sysclk_data *data; + struct evas_obj_data *ugd; + struct obj_geometry_data *ogd; + + if (!mgr || !view || !prev) { + _ERR("Invalid argument!\n"); + return NULL; + } + + ugd = prev; + ogd = evas_object_data_get(ugd->cur_btn, DATA_ID); + + win = settingmgr_get_win(mgr); + if (!win) { + _ERR("settingmgr get window failed."); + return NULL; + } + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("Unable to allocate memory."); + return NULL; + } + + data->ugd = *ugd; + + base = elm_layout_add(win); + if (!base) { + free(data); + return NULL; + } + + elm_layout_file_set(base, EDJ_FILE, SUBLIST_VIEW_PAGE); + + ctxpopup = utils_add_ctxpopup(win, SUBLIST_CTXPOPUP_STYLE1); + if (!ctxpopup) { + _ERR("Fail to add ctxpopup"); + evas_object_del(base); + free(data); + return NULL; + } + + evas_object_smart_callback_add(ctxpopup, SIG_DISMISSED, + _ctxpopup_dismissed, data); + + data->mgr = mgr; + data->win = win; + data->base = base; + data->ctxpopup = ctxpopup; + data->vdata = view; + data->ogd = ogd; + + evas_object_data_set(base, DATA_ID, data); + + if (_draw_sysclk_sublist(data) == -1) { + _ERR("Error in drawing items function\n"); + evas_object_del(base); + evas_object_del(ctxpopup); + free(data); + return NULL; + } + + return base; +} + +/** +* Show the system clock view. +* +* @param[in]: base : the base layout of system clock view. +* +* @return: void. +*/ +static void _show(Evas_Object *base) +{ + struct _sysclk_data *data; + + if (!base) { + _ERR("Invalid argument\n"); + return; + } + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("Get sublist data failed\n"); + return; + } + + evas_object_show(data->ctxpopup); + evas_object_show(base); +} + +/** +* Destroy the system clock view. +* +* @param[in]: base : the base layout of system clock view. +* +* @return: void. +*/ +static void _destroy(Evas_Object *base) +{ + struct _sysclk_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("Invalid arguments"); + evas_object_del(data->ctxpopup); + evas_object_del(base); + return; + } + + if (data->array) { + eina_array_free(data->array); + data->array = NULL; + } + + evas_object_del(data->ctxpopup); + evas_object_del(base); + + if (data->vdata) + viewdata_release(data->vdata); + + free(data); +} + +/** +* Hide the system clock view. +* +* @param[in]: base : the base layout of system clock view. +* +* @return: void. +*/ +static void _hide(Evas_Object *base) +{ + struct _sysclk_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("Invalid arguments"); + return; + } + + evas_object_hide(base); + evas_object_hide(data->ctxpopup); +} + +/** +* Refresh Manual/Auto text of system clock item. +* +* @param[in]: base : the base layout of system clock view. +* +* @return: void. +*/ +static void _refresh(Evas_Object *base) +{ + struct _sysclk_data *data; + + if (!base) { + _ERR("the base of system clock is null."); + return; + } + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("data get failed. DATA_ID: %s", DATA_ID); + return; + } + + _exit_view(data); +} + +/** +* view class of system clock view. +*/ +static struct setting_class _vclass = { + .title = VCLASS_TITLE_SYSTEM_CLOCK, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide, + .refresh = _refresh, + .hide_view = 0 +}; + +/** +* Return view class of system clock view. +* +* @param: void. +* +* @return: the view class of system clock view. +*/ +struct setting_class *view_system_clock_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_uigadget.c b/src/view_uigadget.c new file mode 100644 index 0000000..2dd2767 --- /dev/null +++ b/src/view_uigadget.c @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "view_uigadget.h" +#include "dbg.h" +#include "def.h" + +#define DATA_ID "ugdata" + +struct _data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *subbtn; + Evas_Object *main_item_box; + Evas_Object *subitem_box; + + const char *display_name; + ui_gadget_h ug_handler; + Eina_Bool ug_is_existed; + struct setting_mgr *mgr; + struct settingview_data *view; +}; + +/** +* This function is invoked to hide view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _hide(Evas_Object *base) +{ + if (!base) + return; + + evas_object_hide(base); +} + +/** +* Hide current ug launcher view, then pop this view from view list and return to main view. +* +* @param data [in] The function specific data which hold _data pointer. +* @return void. +*/ +static void _back_to_mainview(struct _data *data) +{ + if (!data) + return; + + _hide(data->base); + settingmgr_view_pop(data->mgr); +} + +/** +* This callback function is invoked with base layout for layout arrangement +* after UI Gadget create create operation is completed. +* +* @param ug [in] The handler data representing a UI gadget. +* @param mode [in] The UI gadget mode. +* @param priv [in] The function specific data passed by UG caller. +* @return void. +*/ +static void _ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv) +{ +} + +/** +* After UG module invoke ug_send_message to send result, +* UG library call this callback function registered by calling ug_create. +* +* @param ug [in] The handler data representing a UI gadget. +* @param result [in] The Service handler. +* @param priv [in] The function specific data passed by UG caller. +* @return void. +*/ +static void _ug_result_cb(ui_gadget_h ug, service_h result, void *priv) +{ +} + +/** +* This function is invoked to show sub item buttons evas object. +* +* @param box [in] The box evas object contained sub item buttons. +* @return void. +*/ +static void _show_item_btns(Evas_Object *box) +{ + Eina_List *list, *l; + Evas_Object *btn; + + if (!box) + return; + + list = elm_box_children_get(box); + if (!list) { + _ERR("button list is null."); + return; + } + + EINA_LIST_FOREACH(list, l, btn) + evas_object_show(btn); + + eina_list_free(list); +} + +/** +* Send the destroy request, use ug_destroy_me, +* then UG library calls this callback function registered by UG caller. +* +* @param ug [in] The handler data representing a UI gadget. +* @param priv [in] The function specific data passed by UG caller. +* @return void. +*/ +static void _ug_destroy_cb(ui_gadget_h ug, void *priv) +{ + struct _data *data; + + if (!ug || !priv) { + _ERR("Invalid parameters in ug destroy callback."); + return; + } + + data = priv; + + _show_item_btns(data->subitem_box); + + elm_object_focus_set(data->subbtn, EINA_TRUE); + elm_object_part_text_set(data->base, UG_TITLE_TEXT, ""); + + ug_destroy(ug); + data->ug_is_existed = EINA_FALSE; + _back_to_mainview(data); +} + +/** +* This function is invoked to create UI Gadget with specific UG name. +* +* @param data [in] The function specific data which hold _data pointer. +* @return 0 if success, -1 if fail. +*/ +static int _load_uigadget(struct _data *data) +{ + ui_gadget_h ug; + const char *name; + struct settingitem *parent; + + struct ug_cbs cbs = { + .layout_cb = _ug_layout_cb, + .result_cb = _ug_result_cb, + .destroy_cb = _ug_destroy_cb, + .end_cb = NULL + }; + + if (!data) { + _ERR("private data is null."); + return -1; + } + + cbs.priv = data; + + parent = viewdata_get_parentitem(data->view); + name = settingitem_get_settingui_name(parent); + elm_object_part_text_set(data->base, + UG_TITLE_TEXT, data->display_name); + + ug = ug_create(NULL, name, UG_MODE_FRAMEVIEW, NULL, &cbs); + if (!ug) { + _ERR("ug create failed."); + return -1; + } else { + data->ug_is_existed = EINA_TRUE; + data->ug_handler = ug; + settingmgr_freeze_timeout(data->mgr); + } + + return 0; +} + +/** +* This function is invoked to hide sub item buttons evas object. +* +* @param box [in] The box evas object contained sub item buttons. +* @return void. +*/ +static void _hide_item_btns(Evas_Object *box) +{ + Eina_List *list, *l; + Evas_Object *btn; + + if (!box) { + _ERR("item box is null."); + return; + } + + list = elm_box_children_get(box); + if (!list) { + _ERR("button list is null."); + return; + } + + EINA_LIST_FOREACH(list, l, btn) + evas_object_hide(btn); + + eina_list_free(list); +} + +/** +* This function is invoked to create UG launcher view layout. +* +* @param mgr [in] The setting_mgr data pointer passed by @settingmgr_view_push. +* @param view [in] The settingview_data data pointer passed by @settingmgr_view_push. +* @param prev [in] The parameter data which passed by prev view or NULL. +* @return View layout evas object, NULL on error. +*/ +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + Evas_Object *win, *base; + struct _data *data; + struct evas_obj_data *param; + int r; + + if (!mgr || !prev || !view) { + _ERR("mgr is null."); + return NULL; + } + + param = prev; + + _hide_item_btns(param->subitem_box); + + win = settingmgr_get_win(mgr); + if (!win) { + _ERR("Invalid argument"); + return NULL; + } + + data = calloc(1, sizeof(struct _data)); + if (!data) { + _ERR("calloc struct _data failed."); + return NULL; + } + + base = elm_layout_add(win); + if (!base) { + _ERR("add base layout failed."); + free(data); + return NULL; + } + + elm_layout_file_set(base, EDJ_FILE, UG_GROUP); + + data->win = win; + data->base = base; + data->mgr = mgr; + data->view = view; + data->subitem_box = param->subitem_box; + data->display_name = param->display_name; + data->subbtn = param->cur_btn; + data->ug_is_existed = EINA_FALSE; + + evas_object_data_set(base, DATA_ID, data); + + r = _load_uigadget(data); + if (r == -1) { + _ERR("load ui gadget failed."); + free(data); + evas_object_del(base); + return NULL; + } + + return base; +} + +/** +* This function is invoked to show view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _show(Evas_Object *base) +{ + if (!base) { + _ERR("Invalid argument!"); + return; + } + + evas_object_show(base); +} + +/** +* This function is invoked to destroy view layout. +* +* @param base [in] The view layout evas object. +* @return void. +*/ +static void _destroy(Evas_Object *base) +{ + struct _data *data; + + if (!base) { + _ERR("Invalid argument!"); + return; + } + + data = evas_object_data_get(base, DATA_ID); + if (!data) { + _ERR("Fail to get uglauncher data"); + return; + } + + if (data->ug_is_existed == EINA_TRUE) + ug_destroy(data->ug_handler); + + if (data->view) + viewdata_release(data->view); + + evas_object_del(base); + free(data); +} + +static struct setting_class _vclass = { + .title = VCLASS_TITLE_UG, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide, + .hide_view = 0 +}; + +/** +* This function is invoked to get UI Gadget launcher view class object. +* +* @return The setting_class data static pointer, NULL on error. +*/ +struct setting_class *view_uigadget_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view_upgrade_popup.c b/src/view_upgrade_popup.c new file mode 100644 index 0000000..7a58b89 --- /dev/null +++ b/src/view_upgrade_popup.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "dbg.h" +#include "utils.h" +#include "view_upgrade_popup.h" + +static Evas_Object *_create(struct setting_mgr *mgr, + struct settingview_data *view, void *prev) +{ + return NULL; +} + +static void _show(Evas_Object *base) +{ +} + +static void _destroy(Evas_Object *base) +{ +} + +static void _hide(Evas_Object *base) +{ +} + +static struct setting_class _vclass = { + .title = VCLASS_TITLE_UPGRADE, + .create = _create, + .show = _show, + .destroy = _destroy, + .hide = _hide +}; + +struct setting_class *view_upgrade_popup_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/viewmgr.c b/src/viewmgr.c new file mode 100644 index 0000000..4bd4f6e --- /dev/null +++ b/src/viewmgr.c @@ -0,0 +1,812 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "viewmgr.h" +#include "data_wrapper.h" +#include "dbg.h" +#include "timeout_handler.h" +#include "view_maincatalog.h" +#include "view_uigadget.h" +#include "view_sublist.h" +#include "view_bottomsublist.h" +#include "view_bottomslider.h" +#include "view_pwd_popup.h" +#include "view_device_manager.h" +#include "view_resetpopup.h" +#include "view_upgrade_popup.h" +#include "view_system_clock.h" +#include "view_need_pwd.h" + +#define MAINCATALOG "maincatalog" +#define PATH_FACTOR 3 + +struct setting_mgr { + Evas_Object *win; + + int depth; + unsigned int refresh; + unsigned int relaunch; + Eina_List *view_list; + struct settingmgr_data *data; + Eina_Array *item_path; + struct timeout_handler *handler; + Eina_Bool is_freeze; +}; + +struct _settinginfo { + Evas_Object *base; + struct setting_class *sclass; + struct settingview_data *sview; +}; + +struct settingui_func_map { + const char *style; + struct setting_class* (*get_vclass)(void); +}; + +static struct settingui_func_map g_func_map[] = { + { + .style = STYLE_UIGADGET, + .get_vclass = view_uigadget_get_vclass + }, + { + .style = STYLE_CTXPOPUP, + .get_vclass = view_sublist_get_vclass + }, + { + .style = STYLE_BOTTOM_CTXPOPUP, + .get_vclass = view_bottomsublist_get_vclass + }, + { + .style = STYLE_BOTTOMSLIDER, + .get_vclass = view_bottomslider_get_vclass + }, + { + .style = STYLE_BOTTOM2WAYSLIDER, + .get_vclass = view_bottomslider_get_vclass + }, + { + .style = STYLE_PASSCODE_POPUP, + .get_vclass = view_passcode_popup_get_vclass + }, + { + .style = STYLE_DEVICE_MANAGER, + .get_vclass = view_device_manager_get_vclass + }, + { + .style = STYLE_RESET_POPUP, + .get_vclass = view_resetpopup_get_vclass + }, + { + .style = STYLE_UPGRADE_POPUP, + .get_vclass = view_upgrade_popup_get_vclass + }, + { + .style = STYLE_CLOCK_CTXPOPUP, + .get_vclass = view_system_clock_get_vclass + }, + { + .style = STYLE_NEED_PASSCODE, + .get_vclass = view_need_passcode_get_vclass + } +}; + +/** +* This function is invoked to build setting view data. +* +* @param mgr [in] The setting_mgr data pointer. +* @param name[in] The item name to be created view. +* @return The settingview_data data pointer, NULL on error. +*/ +static struct settingview_data *_build_setting_view( + struct setting_mgr *mgr, const char *name) +{ + struct settingview_data *data; + int r; + + if (!mgr || !mgr->data || !name) { + _ERR("Parameter error!"); + return NULL; + } + + r = viewmgr_data_read_jsonfile_into_hash(mgr->data, name); + if (r != 0) { + _ERR("Read new json file failed\n"); + return NULL; + } + + data = viewmgr_data_build_view(mgr->data, name); + if (!data) { + _ERR("Build view data failed\n"); + return NULL; + } + + return data; +} + +/** +* This function is invoked to get setting_class data pointer, this data stand for a kind of view. +* +* @param mgr [in] The setting_mgr data pointer. +* @param view[in] The settingview_data data pointer. +* @return The setting_class data pointer, NULL on error. +*/ +static struct setting_class *_get_view_class(struct setting_mgr *mgr, + struct settingview_data *view) +{ + struct setting_class *vclass; + struct settingitem *parent; + Eina_List *list; + const char *style; + int size, i; + + if (!mgr || !view) { + _ERR("Parameter error!"); + return NULL; + } + + parent = viewdata_get_parentitem(view); + list = settingitem_get_subitems(parent); + style = settingitem_get_settingui_style(parent); + if (!list && !style) { + _ERR("there is something wrong in json file."); + return NULL; + } + + vclass = NULL; + + if (list && !style) { + if (mgr->depth == 1) + vclass = view_maincatalog_get_vclass(); + } else { + size = sizeof(g_func_map) / sizeof(*g_func_map); + for (i = 0; i < size; i++) { + if (!strncmp(style, g_func_map[i].style, strlen(style)) + && g_func_map[i].get_vclass) { + vclass = g_func_map[i].get_vclass(); + break; + } + } + } + + return vclass; +} + +/** +* This function is invoked to hide all views stored in view list. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void _hide_view_in_list(struct setting_mgr *mgr) +{ + Eina_List *l; + struct _settinginfo *sinfo; + + if (!mgr) { + _ERR("Invalid arguments\n"); + return; + } + + EINA_LIST_FOREACH(mgr->view_list, l, sinfo) { + if (sinfo->sclass->hide) + sinfo->sclass->hide(sinfo->base); + } +} + +/** +* This function is invoked to show all views stored in view list. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void _show_view_in_list(struct setting_mgr *mgr) +{ + Eina_List *l; + struct _settinginfo *sinfo; + + if (!mgr) { + _ERR("Invalid arguments\n"); + return; + } + + EINA_LIST_FOREACH(mgr->view_list, l, sinfo) { + if (sinfo->sclass->show) + sinfo->sclass->show(sinfo->base); + } +} + +/** +* This function is invoked to destroy all views stored in view list. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void _destroy_views_in_list(struct setting_mgr *mgr) +{ + Eina_List *l; + struct _settinginfo *sinfo; + + if (!mgr) { + _ERR("Invalid arguments\n"); + return; + } + + EINA_LIST_FOREACH(mgr->view_list, l, sinfo) { + if (sinfo->sclass->destroy) + sinfo->sclass->destroy(sinfo->base); + } +} + +/** +* This function is invoked to freeze all views's event stored in view list. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void _frozen_view_in_list(struct setting_mgr *mgr) +{ + Eina_List *l; + struct _settinginfo *sinfo; + + if (!mgr) { + _ERR("Invalid argument"); + return; + } + + EINA_LIST_REVERSE_FOREACH(mgr->view_list, l, sinfo) { + if (sinfo->sclass->frozen) + sinfo->sclass->frozen(sinfo->base); + } +} + +/** +* This function is invoked to activate all views's event stored in view list. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void _active_view_in_list(struct setting_mgr *mgr) +{ + Eina_List *l; + struct _settinginfo *sinfo; + + if (!mgr) { + _ERR("Invalid argument"); + return; + } + + EINA_LIST_REVERSE_FOREACH(mgr->view_list, l, sinfo) { + if (sinfo->sclass->active) + sinfo->sclass->active(sinfo->base); + } +} + +/** +* This function is invoked to initialize setting manager. +* +* @param win [in] The window's evas object. +* @return The setting_mgr data pointer. +*/ +struct setting_mgr *settingmgr_init(Evas_Object *win) +{ + struct setting_mgr *mgr; + struct settingmgr_data *data; + struct timeout_handler *handler; + + if (!win) + return NULL; + + mgr = calloc(1, sizeof(*mgr)); + if (!mgr) + return NULL; + + data = viewmgr_data_init(); + if (!data) { + _ERR("viewmgr_data_init failed!"); + free(mgr); + return NULL; + } + + handler = timeout_handler_init(TIMEOUT_SECS); + if (!handler) { + _ERR("Fail to init timeout handler"); + viewmgr_data_fini(data); + free(mgr); + return NULL; + } + + mgr->win = win; + mgr->depth = 0; + mgr->data = data; + mgr->handler = handler; + mgr->is_freeze = EINA_FALSE; + + return mgr; +} + +/** +* This function is invoked to destroy all views stored in view list and release +* setting_mgr data structure. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void settingmgr_fini(struct setting_mgr *mgr) +{ + struct _settinginfo *sinfo; + + if (!mgr) { + _ERR("Parameter error!"); + return; + } + + _hide_view_in_list(mgr); + _destroy_views_in_list(mgr); + + EINA_LIST_FREE(mgr->view_list, sinfo) + free(sinfo); + + if (mgr->item_path) + eina_array_free(mgr->item_path); + + viewmgr_data_fini(mgr->data); + timeout_handler_fini(mgr->handler); + + free(mgr); +} + +/** +* This function is invoked to push a view with specific name and data. +* +* Firstly, it will build view data, then get specific view class to create view. +* Otherwise, it will freeze or hide background view and store _settinginfo data into view list. +* +* @param mgr [in] The setting_mgr data pointer. +* @param name [in] The item name to be pushed view. +* @param data [in] The function specific data passed by caller. +* @return 0 if success, -1 if fail. +*/ +int settingmgr_view_push(struct setting_mgr *mgr, + const char *name, void *data) +{ + Evas_Object *base; + struct _settinginfo *sinfo; + struct setting_class *sclass; + struct settingview_data *view; + + if (!mgr || !name) + return -1; + + mgr->depth++; + + sinfo = calloc(1, sizeof(*sinfo)); + if (!sinfo) + return -1; + + view = _build_setting_view(mgr, name); + if (!view) { + _ERR("Build setting view data failed\n"); + goto error; + } + + sclass = _get_view_class(mgr, view); + if (!sclass) { + _ERR("failed to get view class."); + goto error; + } + + base = sclass->create(mgr, view, data); + if (!base) { + _ERR("failed to create base layout."); + goto error; + } + + _frozen_view_in_list(mgr); + + if (sclass->hide_view) + _hide_view_in_list(mgr); + + if (sclass->show) + sclass->show(base); + + sinfo->base = base; + sinfo->sclass = sclass; + sinfo->sview = view; + + mgr->view_list = eina_list_prepend(mgr->view_list, sinfo); + + return 0; + +error: + mgr->depth--; + free(sinfo); + viewdata_release(view); + + return -1; +} + +/** +* This function is invoked to pop top view. +* +* Firstly, get top view's _settinginfo data from view list, then call destroy interface of +* view class, finally it will refresh second view, activate and show all views behind top view. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void settingmgr_view_pop(struct setting_mgr *mgr) +{ + struct _settinginfo *sinfo, *prev; + struct setting_class *sclass; + int hide; + char *item; + const char *title; + + if (!mgr) { + _ERR("Invalid arguments\n"); + return; + } + + mgr->depth--; + sinfo = eina_list_data_get(mgr->view_list); + if (!sinfo) { + _DBG("get sinfo failed\n"); + return; + } + + sclass = sinfo->sclass; + hide = sclass->hide_view; + title = sclass->title; + + item = NULL; + + if (!strncmp(title, VCLASS_TITLE_BOTTOM_SLIDER, strlen(title))) + item = evas_object_data_del(sinfo->base, SELECTED_ITEM_ID); + + if (sclass->destroy && sinfo->base) + sclass->destroy(sinfo->base); + + mgr->view_list = eina_list_remove_list(mgr->view_list, mgr->view_list); + free(sinfo); + + if (!mgr->view_list) + return; + + prev = eina_list_data_get(mgr->view_list); + if (!prev || !prev->sclass) + return; + + sclass = prev->sclass; + + if (item && !strncmp(title, VCLASS_TITLE_BOTTOM_SLIDER, strlen(title))) + evas_object_data_set(prev->base, SELECTED_ITEM_ID, item); + + if (sclass->refresh) + sclass->refresh(prev->base); + + if (sclass->update) + sclass->update(prev->base); + + _active_view_in_list(mgr); + + if (hide) + _show_view_in_list(mgr); +} + +/** +* This function is invoked to get window's evas object. +* +* @param mgr [in] The setting_mgr data pointer. +* @return The window's evas object, NULL on error. +*/ +Evas_Object *settingmgr_get_win(struct setting_mgr *mgr) +{ + if (!mgr) + return NULL; + + return mgr->win; +} + +/** +* This function is invoked to get view data with specific name. +* +* @param mgr [in] The setting_mgr data pointer. +* @param name [in] The view name to be got. +* @return The settingview_data data pointer, NULL on error. +*/ +struct settingview_data *settingmgr_get_view(struct setting_mgr *mgr, + const char *name) +{ + return _build_setting_view(mgr, name); +} + +/** +* This function is invoked to get setting manager data. +* +* @param mgr [in] The setting_mgr data pointer. +* @return The settingmgr_data data pointer, NULL on error. +*/ +struct settingmgr_data *settingmgr_get_data(struct setting_mgr *mgr) +{ + if (!mgr) { + _ERR("Parameter error!"); + return NULL; + } + + return mgr->data; +} + +/** +* This function is invoked to get view list. +* +* @param mgr [in] The setting_mgr data pointer. +* @return The Eina_List data pointer, NULL on error. +*/ +Eina_List *settingmgr_get_view_list(struct setting_mgr *mgr) +{ + if (!mgr) { + _ERR("Parameter error!"); + return NULL; + } + + return mgr->view_list; +} + +/** +* This function is invoked to launch view with specific item name. +* +* When launch setting by command-line, this function will be invoked. In this launching +* way, setting will be launched and move focus to specific item. +* +* @param mgr [in] The setting_mgr data pointer. +* @param name [in] The item name. +* @return 0 if success, -1 if fail. +*/ +int settingmgr_launch_item(struct setting_mgr *mgr, + const char *name) +{ + const char *parent; + struct settingitem *item; + Eina_Array *path; + int i, cnt; + + if (!mgr || !name) + return -1; + + path = eina_array_new(1); + if (!path) { + _ERR("new eina array failed."); + return -1; + } + + eina_array_push(path, name); + + parent = parser_get_parent_item_name(JSON_HELPER_FILE, name); + if (!parent) { + _ERR("get parent item name failed."); + eina_array_free(path); + return -1; + } + + eina_array_push(path, parent); + + do { + viewmgr_data_read_jsonfile_into_hash(mgr->data, parent); + + item = viewmgr_data_get_settingitem(mgr->data, parent); + if (!item) + break; + + parent = settingitem_get_parentitem(item); + eina_array_push(path, parent); + } while (parent && strncmp(parent, MAINCATALOG, strlen(parent))); + + mgr->item_path = path; + + settingmgr_view_push(mgr, MAINCATALOG, NULL); + + cnt = eina_array_count(path); + + for (i = cnt - PATH_FACTOR; i > 0; i--) + settingmgr_view_push(mgr, eina_array_data_get(path, i), NULL); + + return 0; +} + +/** +* This function is invoked to get item path. +* +* Item path is a value described all node value from root node to item +* in setting tree of json files. +* +* @param mgr [in] The setting_mgr data pointer. +* @return The Eina_Array data pointer, NULL on error. +*/ +Eina_Array *settingmgr_get_item_path(struct setting_mgr *mgr) +{ + if (!mgr || !mgr->item_path) + return NULL; + + return mgr->item_path; +} + +/** +* This function is invoked to refresh all view stored in view list. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void settingmgr_view_refresh(struct setting_mgr *mgr) +{ + struct _settinginfo *info; + struct setting_class *vclass; + + if (!mgr || !mgr->view_list) + return; + + info = eina_list_data_get(mgr->view_list); + if (!info) + return; + + vclass = info->sclass; + + if (vclass->refresh) + vclass->refresh(info->base); + + if (vclass->update) + vclass->update(info->base); +} + +/** +* This function is invoked to set refresh flag. +* +* @param mgr [in] The setting_mgr data pointer. +* @param val [in] The value to be set. +* @return void. +*/ +void settingmgr_set_refresh_flag(struct setting_mgr *mgr, + unsigned int val) +{ + if (!mgr) + return; + + mgr->refresh = val; +} + +/** +* This function is invoked to get refresh flag. +* +* @param mgr [in] The setting_mgr data pointer. +* @return The refresh flag value, -1 if fail. +*/ +unsigned int settingmgr_get_refresh_flag(struct setting_mgr *mgr) +{ + if (!mgr) + return -1; + + return mgr->refresh; +} + +/** +* This function is invoked to set relaunch flag. +* +* @param mgr [in] The setting_mgr data pointer. +* @param val [in] The value to be set. +* @return void. +*/ +void settingmgr_set_relaunch_flag(struct setting_mgr *mgr, + unsigned int val) +{ + if (!mgr) + return; + + mgr->relaunch = val; +} + +/** +* This function is invoked to get relaunch flag. +* +* @param mgr [in] The setting_mgr data pointer. +* @return The refresh flag value, -1 if fail. +*/ +unsigned int settingmgr_get_relaunch_flag(struct setting_mgr *mgr) +{ + if (!mgr) + return -1; + + return mgr->relaunch; +} + +/** +* This function wrapped timeout_handler interface to freeze timer. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void settingmgr_freeze_timeout(struct setting_mgr *mgr) +{ + if (!mgr) { + _ERR("Invalid argument"); + return; + } + + mgr->is_freeze = EINA_TRUE; + timeout_handler_freeze_timer(mgr->handler); +} + +/** +* This function wrapped timeout_handler interface to thaw timer. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void settingmgr_thaw_timeout(struct setting_mgr *mgr) +{ + if (!mgr) { + _ERR("Invalid argument"); + return; + } + + timeout_handler_thaw_timer(mgr->handler); + mgr->is_freeze = EINA_FALSE; +} + +/** +* This function is invoked to get timeout freeze state. +* +* @param mgr [in] The setting_mgr data pointer. +* @return EINA_TRUE if current state is frozen +* EINA_FALSE if current state is normal or occurred error. +*/ +Eina_Bool settingmgr_get_timeout_freeze_state(struct setting_mgr *mgr) +{ + if (!mgr) { + _ERR("Invalid argument"); + return EINA_FALSE; + } + + return mgr->is_freeze; +} + +/** +* This function is invoked to refresh all views when system language changed. +* +* @param mgr [in] The setting_mgr data pointer. +* @return void. +*/ +void settingmgr_lang_changed(struct setting_mgr *mgr) +{ + struct _settinginfo *sinfo; + Eina_List *l; + + if (!mgr || !mgr->view_list) { + _ERR("Invalid argument"); + return; + } + + EINA_LIST_FOREACH(mgr->view_list, l, sinfo) { + if (!sinfo || !sinfo->sclass) { + _ERR("settings info is NULL"); + return; + } + + if (sinfo->sclass->lang_changed) + sinfo->sclass->lang_changed(sinfo->base); + } +} diff --git a/ug/channel/CMakeLists.txt b/ug/channel/CMakeLists.txt new file mode 100644 index 0000000..ac7b0ab --- /dev/null +++ b/ug/channel/CMakeLists.txt @@ -0,0 +1,75 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(ug-auto-program) +SET(PROJECT_NAME ug-auto-program) + +#SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(PREFIX "/usr/ug") + +IF(NOT DEFINED UGLIBDIR) + SET(UGLIBDIR "/usr/ug/lib") +ENDIF(NOT DEFINED UGLIBDIR) + +IF(NOT DEFINED AUTO_PRGM_EDJEDIR) + SET(AUTO_PRGM_EDJEDIR "${PREFIX}/res/edje/${PROJECT_NAME}") +ENDIF(NOT DEFINED AUTO_PRGM_EDJEDIR) + +IF(NOT DEFINED VERSION) + SET(VERSION 0.1) +ENDIF(NOT DEFINED VERSION) + +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_C_FLAGS_RELEASE "-O2") + +SET(AUTO_PRGM_EDJ_FILE "ug_auto_program.edj") +SET(AUTO_PRGM_EDJ_THEME "ug_auto_program_theme.edj") + +INCLUDE(FindPkgConfig) +pkg_check_modules(AUTO_PRGM_UG_PKGS REQUIRED + dlog + eina + edje + ecore-x + evas + elementary + capi-appfw-application + capi-system-info + utilX + x11 + aul + ui-gadget-1 +) + #tv-service + #tv-player-core + +SET(PKGS_LDFLAGS "${PKGS_LDFLAGS} ${AUTO_PRGM_UG_PKGS_LDFLAGS}") + +FOREACH(FLAG ${AUTO_PRGM_UG_PKGS_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${FLAG}") +ENDFOREACH(FLAG) +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fvisibility=hidden -Wall") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}") + +SET(SRCS + src/ug_auto_program.c + src/util.c + src/viewmgr_auto_program.c + src/view_scan_start.c + src/view_search_page.c + src/view_result_page.c + src/tv_scan.c +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) +ADD_DEFINITIONS("-DPKGNAME=\"${PROJECT_NAME}\"") + +ADD_DEFINITIONS("-DAUTO_PRGM_EDJ_FILE=\"${AUTO_PRGM_EDJEDIR}/${AUTO_PRGM_EDJ_FILE}\"") +ADD_DEFINITIONS("-DAUTO_PRGM_EDJ_THEME=\"${AUTO_PRGM_EDJEDIR}/${AUTO_PRGM_EDJ_THEME}\"") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${AUTO_PRGM_UG_PKGS_LDFLAGS}) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${UGLIBDIR}) + +ADD_SUBDIRECTORY(edje) +#ADD_SUBDIRECTORY(po) diff --git a/ug/channel/edje/CMakeLists.txt b/ug/channel/edje/CMakeLists.txt new file mode 100644 index 0000000..807d152 --- /dev/null +++ b/ug/channel/edje/CMakeLists.txt @@ -0,0 +1,14 @@ +ADD_CUSTOM_TARGET(${AUTO_PRGM_EDJ_FILE} COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/ug_auto_program.edc + ${CMAKE_CURRENT_BINARY_DIR}/${AUTO_PRGM_EDJ_FILE} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ug_auto_program.edc ) + ADD_DEPENDENCIES(${PROJECT_NAME} ${AUTO_PRGM_EDJ_FILE}) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${AUTO_PRGM_EDJ_FILE} DESTINATION ${AUTO_PRGM_EDJEDIR}) + +ADD_CUSTOM_TARGET(${AUTO_PRGM_EDJ_THEME} COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/ug_auto_program_theme.edc + ${CMAKE_CURRENT_BINARY_DIR}/${AUTO_PRGM_EDJ_THEME} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ug_auto_program_theme.edc ) + ADD_DEPENDENCIES(${PROJECT_NAME} ${AUTO_PRGM_EDJ_THEME}) + +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${AUTO_PRGM_EDJ_THEME} DESTINATION ${AUTO_PRGM_EDJEDIR}) \ No newline at end of file diff --git a/ug/channel/edje/images/btn_text_foc.png b/ug/channel/edje/images/btn_text_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..c43ca3c388f629adf187ddfcef456af6f55157ee GIT binary patch literal 17864 zcmeI3cT`i^x5qDv^rli�f<~B$Z}j2qp9?5F}U$NeB^0B8k$J0g+-E5fN#ESP@Vx zC`wbBfFd9$HV{Su5glL#L~OvjfC64MZ{B*p_s3f+SqqYV_WAB}&gbm2?@iXad)GQz zNlPq|002PR#@gHkd>04*q{KwP|Ccr8=ctYpG_CR8Jm^JQcg|?&lYwr+gokjJ&EJ zyY`sSbABj2zfrVIOzNn$uCso)RJPf&`F}>%R8_y|LYPEIXm9{Iv3!~;cT`;n_z;H2 zuTm=$y$J{fJ&+Uw${fkY!nLLBUHwVUu`EAE)ST595g!%m{H!d*{vjn)2-t8$RY52-9)K;R$C?8^Yk>2O>-JdyWE3Fp zZC8Z_p1=W=jk~usaOpZw)*vT&1rU=0P|mSYD*@q9z_V6eJqXy70?1nqy5s*@l_%Gu z4U$T^f-ls-T10FRgKraccSkJKYOqmSC2v5PLrFD3R0O9i#zg4J{yB6H05anhz|{_o z1~tg!H8dC;ERfj(e{)M@T+Pd?bF8~Dmtz6|FL+^1V>-zECE;sC!u`iiF7Fri*({m4 zePqA)6NjY zzSM}oY>KcF{_tnTy?6F!mNp(1-{aNxD$eT5b;bT{9)MhpPVGb6MwnJT|4U!+qevb20&Te;*H zPlG*X8dVi$a%K{=@TCEsE6?vX(~7RYq@wMKd}yMgSLW;!oxqVnRJh%cG2+O6qKIXb zYn4QZ3!B!8Eu^SEixu+PM^-;5rj!!(LABgkc)@-R*qvB;XEnQceQUJKJ`&8$T4m5E zU=B8Bqh(S2npyy}`%83*75YfT6=$P|QrC!u=M0zZu{bHCM0KUv<<&ak3DmmFYUibLtCw6_cYbd1-eGFvDhYqCAr@rm_0*isF>`Om}+#pmvEuFzCVIA?ctMbZ3^Rg1hZ=oqrK zj{2hoaSM@hp|Qj&LyZM{i5ShoLvw5{pC&agXtr!-xv2N*WT)v_FHujp^Ni+uMHG8P z2ezsArh&U9Z*a zq}Oxb1xiUrD@4}BGPD+_EfQVCSRAS6IUcEYa>b7IcIa)b0pn{-0Dbi*_&N=kAAHp%#On8)Z|5symyN+;rJ=giAnI!mfylGMfdK{~3w(z(&wBlN3QT&{n*bBA_u z@~BGjexsc16Ii0It*(2%%g_;TW6{p!Z6A*D9L0OIvXX|v_O;6otbDmr`K+FOA)3C? zH|J>5QF5+zu5+%{+fswPzO3}Kr542=pCe>UYiu<)YFaVk8s??4wgY#w-vmDQh|adUHchCMs0J-D>z)6!kYQPQaYr>tQsDY8hul!i#FRKp_t zZT)R*yb7|W^&e;Arb-jy8A>80>BXM-!Y2Hw7Rx^@We+f`H+E`t`d9l`pIRZZLUo0m z!yAYGR2PTBvn$W8v0r0fQ-81iWc{NQ{WK%=V@yw4PukAkqrNp>?JFl`op)_Gv(XKy6jYOqmp33B^tXB!+UJa1Pt;4maHXQ3W-gW!k z(Ox8j+$h)hM7OhGVcp6qX1Z(I11p9SqmUap6uW<~-R?R>5&@B>T>ZSZw9A$^ylvBq zkmlj^wEVP+zH_Y?`wjY;{V{FF@97<1nc<1vfD++7A>eo?p%ZV|j%oMUa?h~rdhPW(r%HClmZ%Qm@9N{U z@sRN*AS-;i5M%D%2-AoSb3T6v*{OQ#pfRqM{{G6-KGOr4g{BIoal0?Ne>QnpI zp$n=bJ;@F64NRG+wPCLx-4~_2qU^5>lhTZeiE@uNKFEnBFKI$2=?6Bo5xE`apUjV% zx2G}CPS}fZTYYUp4q_|*nPHJ$k#RM`+v8pfIh}0dXSWoK(9Sbp`Q7aJ(l-?IGX14w zXQ)y#vUU?E_(Vg+yQnP1Y{UW`+))$zSjW{z{x+41Y4stySSj5mx|-aG2f)1$78-Dd5-j$D=~ddD~a(D`{DaESu5v#&|(wH|AWUSZJP zy>Hd;y^B4Xo3X0C?_U1h)PKv!_m+Fn=Ux|Z|kd> z+dOwvR9&XvapA)jm1ZN7OWdPXZ>?l%e!DrAJ`f0(HjsAv<5=}eb&h#(SMP{;$H+2i z+_N1ALeIYteel~36^06Ot6Az`s%4sM>gNq!8;YFn5t<&oX%G2g)%u(4F+IFTu?gt5s!NvpWiRrt-5Fgt-TTd2*_D~x-w#u>xisX1Nnk~ln_pB*d)39;y25<06 zYxhF;8}6wWaa;V~@ZR9Z5*|3!6dx;2%`4pKTi72`dM(s@q*pn^u;KZ;(%^p-#~-z1 zV2z%a4u!BsZjTIiC_WDh&>U^3D}EZN*?*zLsbtGLlRnd@#OE7W>jTV6^v37O|1mxFSPo?BrNoo{}Om z>_f}j#|=%%O(&8DlM-(E?>sa5rtIzFi>=ia)yr<)3DQMxez)#(UwL3#pvu6h4q2zJ zov`1v#(h3s9(KK-^*Ld2Lc+N4+~lDzR9$#00N@rdNn{?`!5&9t`y(hcwig`{oEKSXr zAb}6UfdTyKJPItx-;c$`1sSPL#>Ii3Cz_FJu*ohwUn4csi2-3`hqW*wJAe+;N9e<; zC=42Ah()0F^{{BP4h(}r>mt!8BnAsdqj7qMIJ5!m>r0Iw0e-><(7bUj=9XWF11%#p zA0Cf`Lm~qM0}+9`2zCGiiN<2FNE8N%!N9>DaBeV*M+t(nxaw0uzQr-8bEyGL4v)!Z z!6xETyx7}$Mrvvk15LlauFIb@JrIlgl^sYC8ARbA(Fhds7a|7-{xX06pDMXLiyh!h zzOL-219C~h96Hj4&Sh^8pwcaN&{;h7pG|^BosPrV9^g00hek!x{pkLngbPj{{nIIM zzI_9kmVY;mY4nA?GPT!KO8ZDPT{cwNNlzr zVJgdJzCVFqpS0YWEE+qIyAqFt_MX}5nLu=N3Xe_zQ&A6&(t~3#BoqdR*2n3hSD~;t z6lzwGsh*G+4q)2TC_Ku)iSk`vXdE_;=^gy9qRjOCK8Aw>&W6S1QCL*EjX42aJA%oi z;S4c!syBtE5BFM)Lc>?<>*>L<253V#jqXjO>tPJgC|&I2BEOga5Zatg-9C{+UqjO- zLhI_&s5Ao%oPyEyh8ybX(coB`HwC`hYc)ofs!ugE)W>`aJxl&WXr}-sScE8kv-(WT z{(m~ePs02#lr@tJrcUszlmZiLvdp;Bw|(FG&EdzKEEgO~0GB>-3XRmh9mDDRGF?6< zG?S+pN1;v>8Ul49SLrl7^1IfVX-zA?%9uadz<)(~D*i0_ug3`Vp|kiU{8XsPUcU~) zWqb1iDFJj-2AC87%`uz`_`L!e8IPQ($$rfLgFWC%~~G&(^SkNjElPgUTLYip-|TO)8?tju6G7DNLy*1!OcL7-=cnbmJroQdlg4y-X? zzEdX8HmLcb4cebPQ7inmPxd#&puiV+!vns)N@u&FQV;&p*>0$GM(M_4@(5rNo}4J8 zd6sJ8Vmk%Z6}&H`6TqcGo1nedGK1)TWOF8XP2f&cI`ASgDS@{CROd0HLxZ!M5zcaa z6;5T-tedyV3Nh6R-Wq~;rO4^q(jSV)bb0+xewbO&e=;g0mS7MF5dNkB7k@qwuK*VW z2!B(6i$5QTSAYuwguf}k#h(wvE5HQ-!rv6&;?D=-72tvZ;cp6X@#h2a3UEPy@HYjx z`165y1-KwU_?rS;{P{q<0$dOv{7nHa{(K-_0WJs-{-yvIe?Abe02c%Ze^Y>qKOcx! zfC~bIzbU}QpAW<~!{E(j3*rT`azJ`k?}7X%1@Q-F&UI5sR z0)RK3;M1eY0HDM^yydnf*tf;T+>{jbY-fC_ZKda;sN*FkEcWe-EMFzozI*?M&i1A{ zIr(D>X4l(HG?A(a_gVhg33f5N=Z%-2Q8kv1LU!2|)AB!N{PTAimZJk8pA?z=_Igf@ ziO7NQ&oBPCcD2MaRHg*b{Gus@5dK?P_)S|vwUI`k(mBL)3GwgSycD#Ii~%s?=2nTA`dul-Be@{ZkD?vl@qjd zG^Q&pkJC8vSjDw`rnU7{wVPRSl6&_??on~omER@%NV-Gg=-%jKal390JP$wS-&E57 zvUcd=Lvq*YzKnu;=`tDlgLZnZ29ffoEEmpv7F}Ig^}GXZ9wobo2PnxDFf{~&ni9ar z2oh--vP}9aAQ5s;P6jA*N-x7M*fFg5+A?*GMC5jfGGT(TgG{6{U>>&D@&sURBN3UA zqU8=`O$EGb7(VU53KZbIWb4a&KxD?p)Nl!4^#KhPiL3+wF&m7t0{l#X)AcKNSpzgI zpzP~VNdO+90Ia>IuN`pi5>QsBB$p4!$OBl{xR|BD)NsK2rlw{Hussz}wt44C`fFL9 zQkM=yDm9-}w1{9GwOR%hB<<;mUZ`DXuewaxkUoW;W{$21O`V62(pP-ecLxBn5>%ko z_6>&A&B&{(Gu&G^V?FBiHK}2wk5BthXMHZu8~~mRBN~QuF$MD@O{5|@Lq`|)PW4+S zm$k8fw{O0p`9&bB`-x{CZ-kBYk$pvvA9r?iJX&69xtf04bITB`VttwCV8Evc(wF`Z z&#t~$6op?KWjpobvx+l3Ps_`A+b@^ohQFxaLsr`R6w!2)+g)b`?X^nV z(}zEf+-bRg>5avW!^{_Lx&xBrHUr??2C_tW0_x;ihUDK4OO$BBvKRdT@UEC!eqUQg zGSV;ld42HkTeCsiti?d2ul@cY09a?W2u;0RU{);y09IL1I_E6Z-j~nSEt6VMKCPu( z?u)nKcFRST6_!etvdqW@eD9^Fw^?e()}B+>@y6UYSJy9d^@~m9%|KUpT%KXdQ~XSq z$t>3{iJCsu;-<`Oy2g_@37=gw&Al?JsWBfl%I&7k+Pw&ID^A%J>5yPxhjZISMR?e$ zzcb}eA?#RVb0xv#CV=1eCAP#CcOWX?)%3pnMM}|0qxsuyj>_F-3UO)ibF$L!@-NIc z-D7y9>u#=};*)qXr5aoIYOb_iWdIgkb=~s3vF`LlM$LKTY5Cl$`R7)imMq@+fl+@x zc$2&FQ-duL^o167G)J2ABfFD`1&j1&KACPbU2?l?#S&!VNrwwsS7v^yoa=+f z?V#D|YBtS^pN&xpkE2u?Et<8Hf?ra!Z;Ji-Kd6nf8f_W_-88#(Po?YI&DTu4^@Qo4 zFHJb0i&%CurX!={dWT+zT8GBF)v_5r=0Sgabbq1kc6-C}d7Vm~`khi>3f{uwSeo0@ zlSimC4dPc>o;gzJcGh*r$=UiF(+IWEbL<_CpE;UzZ@!lpC*SpK ztm(FWmHbNbeXzVjtV(os97}s%`dsO`ta-t6&!#w@n0IgYylN`e2=^wXD^)R->p{~g z)Y+_(a9cKMd6HI=nhu6~D(6H_YmS^ppGOTf{?t16EqOK`dhYF~rr$r9>yeYO;*GnS zJL{Cm$sIYYlU%CV9}!-IJEgp?J6?C8{Nb8)etmmM6+(_NuOLKM!(Smcc4L%5rPle{ z$D23l6sHWT7wV=pz}HN=JtgSlA))j1F752(zKC6|%5RsxSgLkH z-?0b>uJO+~n0%0yYnSVqYx}0uFs~;&<3y=-vDZM<42$aJOV%v0WyRM`%jj}{?EW-c zHhYefDe*%dI>-OG+L2^W2&3~a;2=jZcaH)PogJ3-=0v^Ksxro=64&#J?yGA?TgwuRh+70 zT2fjXS`JRHoqE&UoQh5?Jz?T#;#ggKr}k)VQ>sC_DefV@E4?fIVS3vo?^PkIbPG=w zUIy*+J64_W>Mbk@j9EqSI!^OgwYI?KOvahTO~q%5vu9=(IVU>jW;U^|pZlxuR^h2j z^UifXl4{N?

h9vwT!pmu}=;?@cUC+;U~h?}Mh&3OgRp$W>pZ9wE5ES0=6`wx-n` z>NVSPNET(n@xQd-^?FmMW`A5ZxEId#A&;8gw!lovv2(^k!+t za^Z)dwa>#EKV+mAq*wHuY(Cp-*vszS(Q^2X{^6yWUV4JN*Kbmuxpp>~$sJC@`nR2q zaG|(Fu`YILVi=eN&od9tT{<3|(@%e^O8%S7Kip1kCmFTkTfNrbF)F)s^HPn=b#CVR zm^R8*&0*$n*l+`o9l2P7CAl-oB5L)NfsbLEHLmS7BQ}G7=RfYT*ppRcp<)rg?aa2$ z@-rHKH~-vsMx(zgr7oe4JtJmC#H*&e()5?~-Pa@Jm&ELd@r*Uw%ZsDUZ@?uR1UIx$ z1Z`HItqxkXrn7J^gtMsS20G*%^aj!sqbvGX%&O47UUweQGHCVz4hslqojk+9fU9j^ zdir*}$ao>w9vk4xUvg?+iKBw!({y6yoU}~{ z4&Iblii_T#urJ6mN5d(xkoB7N(sxtMX)q>#=tkh~OPGa8(zpBz_MM*Qg_13_Jn@RU zO8cRXbUq98^u1QQ^ETmNZsxMuo;wA%oA((VdV6@dXI90m=lctf$2xeT)M+nEPj4XP zlY&Bo0h8kIA=dL{EX4Pbst&g-@LORuUaBp8rZ8>n^RBmMvv);GSxBF!) zDs%OWgE`4BlV=1fJbrRPp>5@bo)3RpH)E1(wVR8h3n@j%u8}U6fZ4a|YE8_je^B33 zKT{2R8=qdJKl~Wj(5n_+^0)q<51Ln(^beA6U2XP|@NjzI`v4rUA1LTI%iEdL{qf)c zXYCnhPEb#^WTWJuwC0S$heh`vs5hEY-Qt^;y|JB9{oB={jJLrk1w#do-w##2(BxT# zc69eoZ|h&EKzy=kPx$HQ()WJbq|Q>uY_Lpwmu8dho;I-BXZ01AJLHC@*R5e+Y@2^m zJfu(Z3SHhuy~Tdgz3pBi>s|exjHHY$5$I1X-pxk~!@C%DZ5tH1Z?7l`pEp_$@9r`w zF{xYg?y~S*eskw+&&!@^XNl`MuZ6EkLy7lXs*4X5r{xu`@h|EPE4>)*+uyC0X;k<0 zeQD@lbB3E9WD-oDmiC2l`)~ArXq)pig1=<2uBP~L@RHs$B`ziF-<$VXJf=L|@xW~L zP|KsYEn7E~1!wg&wAl7b#YEQ+C47iiq)dxXjjxGSh<%f3OePRsnDGa@zhqPDne|$k zszXPIYVuU)U?M&~c=NEXA*JC+^1I~3Yn;u;2Va-HnRm9is-kM))mtHYxOMMW4)l}< zw*;%dJ=Uh^(yQBV(*AT&@&4?zVAG{=H`i(>@} z7<@KQ$mRwjM&i02T{a?(0Ldf8jJab$jM2xjKle< zQXsV61kL2@%6>YafEvmJF>auMyOGZTtv7*zLd~B|g2@<5ka78U(-?REa`i&C@5JVOrycS9QU->we<2(3jLAk*VQhy;Q2r4qe2^~W z@~K>I0C_CSCcZyGU!Sx+*?~-MuwW?(1MfYt)f0h0E4mOQL#e2b!s?^&cq$f8#2FCv zu*7( z=xb;u6xxVxY-DKQV}vqh;`LBQM*2*YG0w*r1sWOP86XzNFfhh{3q48xLueO18!AHd zfJuEuX8(U3;wNE#7|M<3qCSgWuasc~3um=MArvKj#{IetU-@XGAxy$gQ z2eLpW8S^b|zcu``O&iGVtU1BQY67UoM|R7n0c=It#?`0$C)?MB~Jmr17f| zk-`n&@}0O$kgP|-{H*z>D(J_x6=T1xkp*tHmI!-miXo0*Xo$k2ag)PL>NhFQ$aRbe z)fgz>>7!>G()`c{?@t@46#*MZ`y1i0&@KpkD|EbPvLWhH9H#*j+ zaFXMza4ef9-Mo!fh_P1a))2ZY#f;yU{!l!|%j>`M!^DdIol#-2#DlNL;cL4|;-u(9@m4&|{qTvv<*;M?et_J2xi)2wMyQkUJw2KN0IJ;m>u=aVeH-kpET|z*HYb!Wm$aB`T_2(GMrXe69nGoh%eD4d zGFK0f>|V<_EJT6}E08hXvgyifeZ}+kfpq+3$dTbY#u!AQf_NCFfs3=%%#N`g2VSt&-T!6RDrv zZ~B(D%s=*F>o(jfZc|Ns6a89o{k^lV-~Wk}cR6ZjRXLZF^TH&2Evj`x5=#Or^*OVO zC2_+1DdK+Fg=y5XDVL{QF<1Mz5kmqFS4#lRt@gX3^MN5~ae%$GvsIp@_qP85)7X`v literal 0 HcmV?d00001 diff --git a/ug/channel/edje/images/list_highlight.png b/ug/channel/edje/images/list_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..2dbf2466d4bd9d6481f53acf6ebbbbd26d7be70a GIT binary patch literal 9239 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 WSD@M)m^bM^6Jw^CsX-5sgz8DC6p>cD zic+G|rb0xUEh2R16XXBBasMWb67M+5C{Mv&FP+WFVAjO^MSVa)=qJed!1MwDpD{H>z$FxiMj@w z(n`zXG>>o7II%!3aD^Nt1y}$JF58F`rvA@$ZcX3yu>9=QjyAlW!P@(lYph2SY-ME zT~8o$I^b7L@$UfK;DFzvEidl_k?Dg6H;VzQ_G+q#WhMf!*=;uUoOh79be` z$~31NSfCLO7&-dT9Dvj3fr?rs*&;wn4lr_$i_r(BZwCBsYiox9+YSQCc6~nhzZVxO zbr}dq9W26^>R@f7R!PA(Nc#977U)@}iNQ`Rv`*)1IsLNwp0>Cp~ME!^%vUqOfQi(|B$kBzp(*xGZ zW^NqVNh?ycJO^ZUH~aLn$Jp2&*;Cro^rEw~aoG*)Rpct4@Dcj8brn9tL7yVYMSZBlpj zqfcnXTPNw?T-Y#5eco>PMV!!X3Y=a~5Zjyx&t5|j|LC+xiNvdTJ^%oHWvr_Y^rXZi z1EQbR@kifT4BKZe1R`mUNgDuQt&I-CtE$-ImJ|TkWJVdBwwm|;>KwxgiTPJ&v|g1R z^22Pi*12)bTFF|58abcir=P#oT5tQ^(;5bT$Oo1hCKc`h+mqP}h-=;#6wKL*pUF}g zSM|!Hq^DcmmYPl0Y>pH2-$ByeEv0raW>E90!}M7@bzpbml-;$Q5=|XY9y`2X-VPdl z=A3ER*wuCy6PMlw&|8PLm)oQEMisf6Kae{|EX_8XyUp&X>^&+Em71WMnRbtJcCPs@ z%#p5pc>#*e2?XLTql#B^B#mzb86hgKTc25CD4k5HKBJW{msdIW^oo4(viJ{_x-@||XCV38zt zuOV#l?U>H=&g-4Vo%1?1`&P-M`&(`}KIr*e&!cMnGW8cqFHBxYfCtc4-p5iso@5{K znrWJ_(z@VCiN`7T*zDOR8&k1&qg5T9P81y7cYkhxTEGC~)GOY_nNRjDSe|mvr=hyr z{#D8=@%MZ=`Ryvvx8mq}>S=Q%=g`&pb50#_KB<0xr}`}~BQw;S16>Cd53;;T1||3@^ci%h%q*qSv$=tSFS?_-DYOjQxwVvUHcHYLG9XZku_UC!$rn|lIoaaf; zS(+W2OV4I`Ssah>9gdgqz3zP7m3Z7e^US)A@=BO2MZGx0P%}_IZ~Mk5(;K>H?l%3o z$)N1OutwQV^W2;xSfcSVW1nJ={=GB{$&LdX1`qL;OLysIrSwPaXj6Wt|6G6GNfYN% z6u3GtcYn%$Ql3Med!GH9OPIo*tn`zYY|DJVL@8L^TDEBQB71s5?Tqv;&nC|&Su$Cw zF6Ouog^1k16Z4Lg+3>FfXZ0S)xV$zp!HADbKbgme%8sJ+%AFPH`8ba&?DJ2eXn{c}!PA zS5w!?<+V$1s)tMIN&S;cotHY_x?6Mi=-o#LP1DR#kI`LeU1^Wg+Ryu~3|VPdl3j8E zbS&yzdD6GHq&zrgCD!)@$$RCRV!ML$f`yOD3d*u(W|b~aUY?inh<^R_-z9fSa?Y!t ze$gn=Qdq()2`AJ2)#&GM7GCd7zLXq(G5oJ#b4mHwCWSnWl^PM;vm9mI3S3)i?V(7Hr#?dfXtQf_pA+|GEXt<{JW0wQf*<&)c&I+yW2 zY*_Owtl>j?T5;O7p6r%Wy_jA`Z*1$~8k58N8NSBcd)IFhpSr)Ow~#%&&nU1xKf;yh z8bv?XrH!N@6MYIEpFV$rpF2Q)r$+cl;2iECbl}a}&~3i!YRoFm-#%aMdYzTAE~cHh zMSGMw8a7%FWJN9%ql?E!Sw*dy_GK{aPt7a4EpRR1$D*blt6iC;Rw`BrTMM?nxLTkY zaQp3^0?mQ01GR~@422lCh*yv9Ns?cZcV3T>TND!;LwTyZH~Ky zicU)0v%xx7(E)&T_1Gf(hR_z7 z4wV^;x37@M$6we{V!(Xpn%Co#QW$YbH_Rn4YVFmktyj;91-_B>mU$5q{-*VD&l*<} z(zpE_`SbSlc?6aC9fis*YAGsP8ueO3Ud)SSRb4sQy7z2O-i=af9j$@Z{jv?7u}Wco zZpzCPg<$!n=CktcE6(I|1sfE{ZulHV`y)eBE zPtK7a4+huw&f8r6(d6yJmR02g!-PARTfD`*T^`aNf?piJ6c1Pw#^-hq?*GDEQ?Q)5 zq34!(gZQwdwnE9{(gzPU8qB>s5*{snW3O=QkIN(J@Azhbo_Ivu#2V?UO2?OAn7gd}{S;Ia;#0i&ERZUXk_gq7v^}gYD?fuBGKmYghMO z;Pn-?yqN8C!6)?;ZXNSA?=^lT`M&F|vO{I5g{7+lOMAmEo!d+s=$@BhR{P}rrO>}s zM;|@Rz?wg~)E~wgxH<5lUG+%>XVGwNby*XCQEx%HYx%nOmOWNY#3!*2Emn=RHoj}! zvc7_!*+E~Z!(q;u-NAooZ;@FEMgtCPB%ksW`%Kr6gZr{&`~fb;TR?Q!SO(Di>V76Jm^7`+mijo~!&;zQ(&_ z?TW6Qf5NutjRt%=^TG38)|X`U0Km;=c#(J{7iS!W#YB*)EPoIY z!ek2$q5y!m2w{^cfglg&57HUI=34K{u4us+RC6sKQx_u_HW3V9ID~OP&#>iQl(0Yw zma1hzkim!G1OiNuM}~zkgMzuZ5Ob|@U7XVWVQ3?iF%o5jL}TG76wbs9hr+b%ILyuEXBQ2^!}^r69o|kSPe^3ObMa zWf$1ret~=s|DhY--M<|@k3pN9oF8JxJiiSCLm0ma8}m$rji$Z#@>{kEdf!WF_z|!HXR@2kKsQ_+ps7b$8zYa zG*uvN0#ZycC@LBbn$k?*R8tc)d^JEt;Xg^cau|Y5h#WMf z&RFmNuTA_y=BK6{7+gW>gic8*L1K+>GoIjvA4|VEf*9l51)I#_f@7=DTKE~6H?=~ zelNmh(Rh3^2ehIKa^inkh7*E6MnIME$gw>+i18no11@>f|8EBV*%JD1pMlBTr38?J z=^&MW{Fb)g3jW!oO-$vF>*?Dz@bmh^QzX{Tv$|)V2nrps`!^tfXCjMI^a6Rm;VUD&$3<`_Ez|jcQRGBIDrs#~_$8dr@ zMv(91@wF|8`Kb(ApER~t1Z^CzZ-zD!T!I6S;QAUm)eQ~x6&^a(4Go=)^bTh522$yg^5U&Uq1c-1`giAOdh*yLQ0z|ke!X=y!#4ExD0V3QK;S$aV z;uYb701Ai_-%F5!G2UJ)(` z5aFf>mvBB1uLu_eh;UPcOE@2hSA+`!M7Sx!C7ch$E5ZcU$uZ^ zu++b#=&)aqtmSM=jSA^V;-?XDKLx*OesWJ2?&l|AR>DGEIaNKN0YwHw!W_S-lOn^m z>)TC@raFFDoS5&_;{0JBNp$@^4NhgM?Q2%~&p20q%2NkCt9@BbM=>Z){()Vr zcKGaFQSvBmO`bx$w|8UHj>Z!*yV&`BAN_C~QIA##> zE$OY6xIgy{xFuR`&(&1LwRY;uVQp8IDPOs{0E}Gcfo-+(mu+9m)d$lfyoplx^ELZBVBv`8g*0X;0#i+prHpW^MRN$;&dElWVBX^%B)i z|6=nMo?6eU=2RT3no}WFv3Y)1Td(Z~`d1cEp{lW`f*oy_+Z0;+ZT%k= C)e-jq literal 0 HcmV?d00001 diff --git a/ug/channel/edje/images/radiobtn_on_br.png b/ug/channel/edje/images/radiobtn_on_br.png new file mode 100644 index 0000000000000000000000000000000000000000..f14d5bb17f56ec3102268cfa2e2a814c333b90c5 GIT binary patch literal 18488 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 D0{nGT literal 0 HcmV?d00001 diff --git a/ug/channel/edje/images/round_rectangle_4X4.png b/ug/channel/edje/images/round_rectangle_4X4.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1f51d38f87ccd9c29476b13310fb47e158e57c GIT binary patch literal 18179 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 literal 0 HcmV?d00001 diff --git a/ug/channel/edje/images/second_depth_bg.png b/ug/channel/edje/images/second_depth_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3c6243cce9d58310769c773fdbee3cb6b9b926 GIT binary patch literal 22286 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 literal 0 HcmV?d00001 diff --git a/ug/channel/edje/images/thumbnail_highlight_glowrect.png b/ug/channel/edje/images/thumbnail_highlight_glowrect.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c9dbe4376830a8eefa406d2c2937552df4fd32 GIT binary patch literal 11341 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 literal 0 HcmV?d00001 diff --git a/ug/channel/edje/images/wi_progress_bar.png b/ug/channel/edje/images/wi_progress_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..01f58d135b8eccf2b678c67b72e9993b85ccd2c4 GIT binary patch literal 3171 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 JPDHLkV1i4U*8Bhf literal 0 HcmV?d00001 diff --git a/ug/channel/edje/images/wi_progress_bg.png b/ug/channel/edje/images/wi_progress_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb107e414a32a228b99d5c7e59a3af5d9968d98 GIT binary patch literal 3537 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 LNkvXXu0mjfRk@-W literal 0 HcmV?d00001 diff --git a/ug/channel/edje/tizen-hd-inc.edc b/ug/channel/edje/tizen-hd-inc.edc new file mode 100644 index 0000000..56f40dd --- /dev/null +++ b/ug/channel/edje/tizen-hd-inc.edc @@ -0,0 +1,1093 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TIZEN_HD_INC__ +#define __TIZEN_HD_INC__ + +#define BG_DEFAULT_COLOR_INC 248 246 239 255 +#define BG_EDIT_MODE_COLOR_INC 248 246 239 255 +#define BG_GROUP_LIST_COLOR_INC 248 246 239 255 +#define BG_TRANSPARENT_COLOR_INC 0 0 0 0 + +#define LAYOUT_BG_COLOR_INC 248 246 239 255 +#define LAYOUT_EDIT_MODE_BG_COLOR_INC 248 246 239 255 +#define LAYOUT_GROUP_LIST_BG_COLOR_INC 248 246 239 255 +#define LAYOUT_INDICATOR_HEIGHT_INC 60 +#define LAYOUT_INDICATOR_COLOR_INC 0 0 0 255 + +#define NAVIFRAME_TITLE_BG_COLOR_INC 248 246 239 255 +#define NAVIFRAME_TOOLBAR_BG_COLOR_INC 248 246 239 255 +#define NAVIFRAME_TITLE_TOP_PADDING_INC 0 32 +#define NAVIFRAME_TITLE_TOP_PADDING2_INC 0 18 +#define NAVIFRAME_TITLE_RIGHT_PADDING_INC 17 0 +#define NAVIFRAME_TITLE_TOOLBAR_TOP_PADDING_INC 0 33 +#define NAVIFRAME_TITLE_TOOLBAR_BOTTOM_PADDING_INC 0 8 +#define NAVIFRAME_TITLE_H_INC 111 +#define NAVIFRAME_TAB_TITLE_H_INC 165 +#define NAVIFRAME_TOOLBAR_HEIGHT_INC 98 +#define NAVIFRAME_TITLE_FUNC_BTN_SIZE_INC 86 111 +#define NAVIFRAME_PREV_FUNC_BTN_SIZE_INC 86 98 +#define NAVIFRAME_TITLE_TAB_H_INC 68 +#define NAVIFRAME_TITLE_TAB_LARGE_H_INC 111 +#define NAVIFRAME_TITLE_TAB_FONT_SIZE_INC 44 +#define NAVIFRAME_TITLE_TAB_TEXT_H_INC 87 +#define NAVIFRAME_TITLE_FONT_SIZE_INC 56 +#define NAVIFRAME_TITLE_SMALL_FONT_SIZE_INC 44 +#define NAVIFRAME_ICON_SIZE_INC 38 38 +#define NAVIFRAME_PADDING_INC 16 0 +#define NAVIFRAME_PADDING2_INC 9 0 +#define NAVIFRAME_PADDING_BADGE_INC 2 0 +#define NAVIFRAME_PADDING3_INC 8 0 +#define NAVIFRAME_BOTTOM_TEXT_PADDING_INC 0 11 +#define NAVIFRAME_BOTTOM_PADDING_INC 0 10 +#define NAVIFRAME_BADGE_PADDING_INC 85 0 +#define NAVIFRAME_BADGE_TOP_PADDING_INC 0 6 +#define NAVIFRAME_BADGE_LEFT_TEXT_PADDING_INC 10 0 +#define NAVIFRAME_BADGE_TEXT_H_INC 26 +#define NAVIFRAME_BADGE_TEXT_W_INC 42 +#define NAVIFRAME_BADGE_BG_IMAGE_SIZE_INC 54 48 +#define NAVIFRAME_BADGE_BG_IMAGE_BORDER_INC 29 24 0 0 +#define NAVIFRAME_TOOLBAR_BUTTON_BG_PADDING_INC 115 0 +#define NAVIFRAME_TOOLBAR_BUTTONS_PADDING_INC 15 +#define NAVIFRAME_ICON_PADDING_INC 70 0 +#define NAVIFRAME_TITLE_TEXT_COLOR_INC 59 115 182 255 +#define NAVIFRAME_TITLE_STYLE_COLOR_INC "#3B73B6" +#define NAVIFRAME_SUBTITLE_TEXT_COLOR_INC 59 115 182 255 +#define NAVIFRAME_SUBTITLE_FONT_SIZE_INC 32 +#define NAVIFRAME_SUBTITLE_HEIGHT_INC 0 34 +#define NAVIFRAME_TITLE_TEXT_UNSELECTED_COLOR_INC 153 153 153 255 +#define NAVIFRAME_BADGE_TEXT_COLOR_INC 10 100 208 255; + +#define PROGRESSBAR_TITLE_FONT_SIZE_INC 28 +#define PROGRESSBAR_STATUS_TEXT_FONT_SIZE_INC 20 + +#define POPUP_ITEM_BG_DEFAULT_MIN_INC 648 112 +#define POPUP_ITEM_LEFT_MIN_PADDING_INC 26 0 +#define POPUP_ITEM_RIGHT_MIN_PADDING_INC 26 0 +#define POPUP_ITEM_ICON_TEXT_PADDING_INC 16 0 +#define POPUP_ITEM_TEXT_DISABLED_COLOR_INC 128 128 128 255 +#define POPUP_ITEM_TEXT_DISABLED_VISIBLE_COLOR_INC 128 128 128 255 + +#define POPUP_DEFAULT_TITLE_TEXT_COLOR_INC "#3b73b6" +#define POPUP_DEFAULT_TITLE_TEXT_SHADOW_COLOR "#ffffff" +#define POPUP_DEFAULT_TITLE_TEXT_SHADOW_STYLE "far_shadow,bottom" +#define POPUP_DEFAULT_DESCRIPTION_TEXT_COLOR_INC "#000000" +#define POPUP_DIM_BG_DEFAULT_COLOR_INC 0 0 0 0 +#define POPUP_DIM_BG_COLOR_INC 0 0 0 127 +#define POPUP_DIM_BG_CLICKED_COLOR_INC 0 0 0 127 +#define POPUP_DIM_BG_TRANS_COLOR_INC 0 0 0 0 +#define POPUP_DIM_BG_CLICKED_TRANS_COLOR_INC 0 0 0 50 + +#define CTXPOPUP_WIDTH_MIN_INC 386 +#define CTXPOPUP_WIDTH_MAX_INC 620 +#define CTXPOPUP_BUBBLE_BG_IMAGE_BORDER 24 24 22 30 +#define CTXPOPUP_BUBBLE_MASK_IMAGE_BORDER 10 10 10 10 +#define CTXPOPUP_SHADOW_LEFT_PADDING 10 +#define CTXPOPUP_SHADOW_RIGHT_PADDING 10 +#define CTXPOPUP_SHADOW_TOP_PADDING 8 +#define CTXPOPUP_SHADOW_BOTTOM_PADDING 16 +#define CTXPOPUP_CONTENT_PADDING 4 +#define CTXPOPUP_SCROLLER_PADDING 8 +#define CTXPOPUP_SCROLLER_MIN_SIZE_INC 9 12 +#define CTXPOPUP_FRAME_CORNER_ARROW_PADDING 20 +#define CTXPOPUP_BG_COLOR_INC 0 0 0 0 +#define CTXPOPUP_BG_PRESS_COLOR_INC 42 137 194 255 +#define CTXPOPUP_MAIN_TEXT_COLOR_INC 255 255 255 255 +#define CTXPOPUP_MAIN_TEXT_DIM_COLOR_INC 255 255 255 178 +#define CTXPOPUP_MAIN_TEXT_PRESS_COLOR_INC 255 255 255 255 +#define CTXPOPUP_LIST_MAIN_TEXT_COLOR_INC 255 255 255 255 +#define CTXPOPUP_LIST_MAIN_TEXT_DIM_COLOR_INC 255 255 255 178 +#define CTXPOPUP_LIST_MAIN_TEXT_PRESS_COLOR_INC 255 255 255 255 +#define CTXPOPUP_SEPARATOR_PXLINE_SIZE_INC 1 +#define CTXPOPUP_SEPARATOR_PADDING_INC 20 +#define CTXPOPUP_SEPARATOR_COLOR_INC 45 45 45 255 +#define CTXPOPUP_SEPARATOR2_COLOR_INC 91 91 91 255 +#define CTXPOPUP_HORIZONTAL_SEPARATOR_1_COLOR_INC 45 45 45 255 +#define CTXPOPUP_HORIZONTAL_SEPARATOR_2_COLOR_INC 91 91 91 255 +#define CTXPOPUP_HORIZONTAL_SEPARATOR_MIN_SIZE_INC 1 74 +#define CTXPOPUP_HORIZONTAL_SEPARATOR_MAX_SIZE_INC 1 74 +#define CTXPOPUP_TP_BG_COLOR_INC 7 180 211 255 +#define CTXPOPUP_ITEM_DISABLED_COLOR 0 0 0 0 +#define CTXPOPUP_LIST_MAIN_TEXT_SIZE_INC 40 +#define CTXPOPUP_MAIN_TEXT_SIZE_INC 32 +#define CTXPOPUP_ITEM_HEIGHT_MIN_INC 110 +#define CTXPOPUP_ITEM_HEIGHT_MAX_INC 130 +#define CTXPOPUP_TEXT_ITEM_HORIZONTAL_WIDTH_INC 128 +#define CTXPOPUP_ICON_ITEM_HORIZONTAL_WIDTH_INC 112 +#define CTXPOPUP_ITEM_HORIZONTAL_HEIGHT_INC 96 +#define CTXPOPUP_ICON_WIDTH_INC 64 +#define CTXPOPUP_ICON_HEIGHT_INC 64 +#define CTXPOPUP_ICON_HORIZONTAL_WIDTH_INC 48 +#define CTXPOPUP_ICON_HORIZONTAL_HEIGHT_INC 48 +#define CTXPOPUP_ARROW_SIZE_INC 48 48 +#define CTXPOPUP_VERTICAL_ARROW_SIZE_INC 40 30 +#define CTXPOPUP_HORIZONTAL_ARROW_SIZE_INC 30 40 +#define CTXPOPUP_ITEM_TEXT_PADDING_INC 20 +#define CTXPOPUP_ITEM_ICON_PADDING_INC 16 +#define CTXPOPUP_IE_ARROW_SIZE_INC 52 +#define CTXPOPUP_IE_FONT_SIZE_INC 40 +#define CTXPOPUP_IE_ITEM_PADDING_INC 22 +#define CTXPOPUP_IE_ITEM_HEIGHT_INC 75 +#define CTXPOPUP_IE_CONTENT_WIDTH_MAX_INC 720 +#define CTXPOPUP_IE_ICON_WIDTH_INC 60 +#define CTXPOPUP_IE_ICON_HEIGHT_INC 60 +#define CTXPOPUP_TP_ARROW_SIZE_INC 30 +#define CTXPOPUP_TP_HEIGHT_INC 106 +#define CTXPOPUP_MORE_WIDTH_INC 502 +#define CTXPOPUP_MORE_ITEM_PADDING_INC 16 +#define CTXPOPUP_MORE_ITEM_HEIGHT_MIN_INC 110 +#define CTXPOPUP_MORE_ITEM_HEIGHT_MAX_INC 130 +#define CTXPOPUP_MORE_ICON_WIDTH_INC 64 +#define CTXPOPUP_MORE_ICON_HEIGHT_INC 64 +#define CTXPOPUP_MORE_ITEM_TEXT_SIZE_INC 40 +#define CTXPOPUP_MORE_SEPARATOR_PADDING_INC 20 +#define CTXPOPUP_TOOLBAR_SEGMENTEDCONTROL_WIDTH_INC 336 +#define CTXPOPUP_TOOLBAR_SEGMENTEDCONTROL_HEIGHT_MIN_INC 90 +#define CTXPOPUP_TOOLBAR_SEGMENTEDCONTROL_HEIGHT_MAX_INC 130 + +#define DISKSELECTOR_DF_FONT_COLOR_INC 255 255 255 178 +#define DISKSELECTOR_DF_FONT_MOUSE_DOWN_COLOR_INC 255 255 255 255 +#define DISKSELECTOR_DF_ITEM_MIN_SIZE_INC 70 106; +#define DISKSELECTOR_DF_FONT_SIZE_INC 48 +#define DISKSELECTOR_DF_DATA_MIN_HEIGHT_INC "106" + +#define LABEL_TEXT_BLOCK_STYLE_COLOR_INC "#000000" +#define LABEL_FONT_SIZE_INC 36 + +#define GENGRID_FONT_STYLE_18_INC "26" +#define GENGRID_PART_BG_COLOR_INC 0 0 0 0 +#define GENGRID_PART_REORDER_DEFAULT_BG_COLOR_INC 0 0 0 77 +#define GENGRID_PART_REORDER_BG_COLOR_INC 0 0 0 77 +#define GENGRID_PART_TEXTBLOCK_STYLE_COLOR_INC "#000000" +#define GENGRID_PART_BACKGROUND_COLOR_INC 0 0 0 0 +#define GENGRID_PART_ITEM_BG_COLOR_INC 255 255 255 38 +#define GENGRID_EDIT_MODE_CHECK_TOP_RIGHT_INC 6 6 +#define GENGRID_EDIT_MODE_CHECK_SIZE_INC 54 54 +#define GENGRID_EDIT_MODE_CHECK_BG_COLOR_INC 0 0 0 154 +#define GENGRID_ITEM_CHECK_TOP_RIGHT_PADDING_INC 6 6 + +#define GENGRID_DEFAULT_LEFT_TOP_PADDING_INC 5 5 +#define GENGRID_DEFAULT_RIGHT_BOTTOM_PADDING_INC 5 5 +#define GENGRID_DEFAULT_ITEM_BG_LEFT_TOP_PADDING_INC 18 32 +#define GENGRID_DEFAULT_ITEM_BG_RIGHT_BOTTOM_PADDING_INC 18 58 +#define GENGRID_DEFAULT_ITEM_REAL_BG_RIGHT_PADDING_INC 0 0 +#define GENGRID_DEFAULT_LEFT_TOP_FOCUS_PADDING_INC 2 2 +#define GENGRID_DEFAULT_RIGHT_BOTTOM_FOCUS_PADDING_INC 2 2 + +#define GENGRID_LANDSCAPE_LEFT_TOP_PADDING_INC 5 5 +#define GENGRID_LANDSCAPE_RIGHT_BOTTOM_PADDING_INC 5 5 +#define GENGRID_LANDSCAPE_LEFT_TOP_FOCUS_PADDING_INC 4 4 +#define GENGRID_LANDSCAPE_RIGHT_BOTTOM_FOCUS_PADDING_INC 4 4 +#define GENGRID_LANDSCAPE_GRID_TEXT_LEFT_TOP_PADDING_INC 5 5 +#define GENGRID_LANDSCAPE_GRID_TEXT_RIGHT_BOTTOM_PADDING_INC 5 59 +#define GENGRID_LANDSCAPE_GRID_TEXT_LEFT_TOP_FOCUS_PADDING_INC 4 4 +#define GENGRID_LANDSCAPE_GRID_TEXT_RIGHT_BOTTOM_FOCUS_PADDING_INC 4 60 + +#define GENGRID_GRID_TEXT_LEFT_TOP_PADDING_INC 2 2 +#define GENGRID_GRID_TEXT_RIGHT_BOTTOM_PADDING_INC 2 62 +#define GENGRID_GRID_TEXT_ITEM_BG_LEFT_TOP_PADDING_INC 1 1 +#define GENGRID_GRID_TEXT_ITEM_BG_RIGHT_BOTTOM_PADDING_INC 1 1 +#define GENGRID_GRID_TEXT_ITEM_REAL_BG_RIGHT_PADDING_INC 0 0 +#define GENGRID_GRID_TEXT_LEFT_TOP_FOCUS_PADDING_INC 2 2 +#define GENGRID_GRID_TEXT_RIGHT_BOTTOM_FOCUS_PADDING_INC 2 62 + +#define GENGRID_GRID_TEXT2_LEFT_TOP_PADDING_INC 2 62 +#define GENGRID_GRID_TEXT2_RIGHT_BOTTOM_PADDING_INC 2 2 +#define GENGRID_GRID_TEXT2_ITEM_BG_LEFT_TOP_PADDING_INC 1 1 +#define GENGRID_GRID_TEXT2_ITEM_BG_RIGHT_BOTTOM_PADDING_INC 1 1 +#define GENGRID_GRID_TEXT2_ITEM_REAL_BG_RIGHT_PADDING_INC 0 0 +#define GENGRID_GRID_TEXT2_LEFT_TOP_FOCUS_PADDING_INC 2 62 +#define GENGRID_GRID_TEXT2_RIGHT_BOTTOM_FOCUS_PADDING_INC 2 2 + +// Please do not use these !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +#define GENLIST_PADDING_5_INC 5 +#define GENLIST_PADDING_24_INC 24 +#define GENLIST_PADDING_64_INC 64 +#define GENLIST_PADDING_88_INC 88 +#define GENLIST_PADDING_34_INC 34 +#define GENLIST_PADDING_32_INC 32 +#define GENLIST_PADDING_16_INC 16 +#define GENLIST_SIZE_80_INC 80 + +#define BUBBLE_DISCLIP_COLOR 255 255 255 102 // opacity 40% + +// List bg color +#define GENLIST_LIST_BG_COLOR 248 246 239 255 +#define GENLIST_DIALOGUE_BG_COLOR 248 246 239 255 +#define GENLIST_LIST_PRESS_COLOR 87 135 194 255 +#define GENLIST_LIST_DIM_COLOR 219 217 212 255 +#define GENLIST_LIST_LINE1_COLOR 211 209 203 255 +#define GENLIST_LIST_LINE2_COLOR 255 255 255 255 +#define GENLIST_LIST_DIVIDER1_COLOR 185 184 178 255 +#define GENLIST_LIST_DIVIDER2_COLOR 255 255 255 255 +#define GENLIST_LIST_CENTERLINE1_COLOR 206 205 202 255 +#define GENLIST_SELECT_ALL_BG_COLOR 220 218 211 255 + +// Group Index +#define GENLIST_GROUPINDEX_LIST_SIZE 32 +#define GENLIST_GROUPINDEX_LIST_COLOR 59 115 182 255 +#define GENLIST_GROUPINDEX_LIST_FOCUS_COLOR 255 255 255 255 + +#define GENLIST_GROUPINDEX_LIST_BG_COLOR 248 246 239 255 +#define GENLIST_GROUPINDEX_LIST_PRESS_COLOR 132 162 198 255 +#define GENLIST_GROUPINDEX_LINE_COLOR 59 115 182 255 +#define GENLIST_GROUPINDEX_LINE_FOCUS_COLOR 255 255 255 255 + +// Genlist Text +#define GENLIST_LIST_MAIN_TEXT_SIZE 44 +#define GENLIST_LIST_MAIN_TEXT_UNREAD_COLOR 0 0 0 255 +#define GENLIST_LIST_MAIN_TEXT_UNREAD_COLOR_STYLE "#000000FF" +#define GENLIST_LIST_MAIN_TEXT_UNREAD_DIM_COLOR 0 0 0 102 +#define GENLIST_LIST_MAIN_TEXT_UNREAD_DIM_COLOR_STYLE "#00000066" +#define GENLIST_LIST_MAIN_TEXT_READ_COLOR 128 128 128 255 +#define GENLIST_LIST_MAIN_TEXT_READ_DIM_COLOR 128 128 128 204 +#define GENLIST_LIST_TEXT_FOCUS_COLOR 255 255 255 255 +#define GENLIST_LIST_TEXT_FOCUS_COLOR_STYLE "#FFFFFFFF" + +#define GENLIST_LIST_SUB_TEXT_SIZE 32 +#define GENLIST_LIST_SUB_TEXT_DEFAULT_COLOR 128 128 128 255 +#define GENLIST_LIST_SUB_TEXT_DEFAULT_COLOR_STYLE "#808080FF" +#define GENLIST_LIST_SUB_TEXT_DEFAULT_DIM_COLOR 128 128 128 204 +#define GENLIST_LIST_SUB_TEXT_DEFAULT_DIM_COLOR_STYLE "#808080CC" +#define GENLIST_LIST_SUB_TEXT_SETTINGS_COLOR 59 115 182 255 +#define GENLIST_LIST_SUB_TEXT_SETTINGS_COLOR_STYLE "#3B73B6FF" +#define GENLIST_LIST_SUB_TEXT_SETTINGS_DIM_COLOR 59 115 182 76 +#define GENLIST_LIST_SUB_TEXT_SETTINGS_DIM_COLOR_STYLE "#3B73B64C" + +#define GENLIST_CONTENTS_TEXT_SIZE 28 +#define GENLIST_CONTENTS_TEXT_COLOR 128 128 128 255 +#define GENLIST_CONTENTS_TEXT_COLOR_STYLE "#808080FF" + +#define GENLIST_LIST_BUBBLE_TEXT_SIZE 32 +#define GENLIST_LIST_BUBBLE_TEXT_COLOR 249 249 249 255 + +// Dialogue group +#define GENLIST_DIALOGUE_GROUP_TITLE_SIZE 32 +#define GENLIST_DIALOGUE_GROUP_TITLE_COLOR 59 115 182 255 + +#define GENLIST_APPS_NAME_SIZE 30 +#define GENLIST_APPS_NAME_COLOR 128 128 128 255 +#define GENLIST_APPS_INC_SIZE 30 +#define GENLIST_APPS_INC_COLOR 0 0 0 255 +#define GENLIST_APPS_RATING_SIZE 24 +#define GENLIST_APPS_RATING_COLOR 128 128 128 255 +#define GENLIST_APPS_PRICE_SIZE 24 +#define GENLIST_APPS_PRICE_ORIGINAL_COLOR 59 115 182 255 +#define GENLIST_APPS_PRICE_SALE_COLOR 229 33 52 255 +#define GENLIST_APPS_PRICE_FREE_COLOR 59 115 182 255 + +#define DIALOGUE_PASSWORD_TITLE_SIZE 32 +#define DIALOGUE_PASSWORD_TITLE_COLOR 128 128 128 255 + +#define GENLIST_DIALOGUE_GROUP_HELP_TEXT_SIZE 32 +#define GENLIST_DIALOGUE_GROUP_HELP_TEXT_COLOR_STYLE "#808080FF" +#define GENLIST_PART_MATCH_TAG_COLOR "+ color=#3F8DAD" + +#define BUTTON_TEXT_SHADOW_NORMAL_COLOR_INC 255 255 255 255 +#define BUTTON_TEXT_SHADOW_DIM_COLOR_INC 255 255 255 255 +#define BUTTON_TEXT_SHADOW_PRESSED_COLOR_INC 0 0 0 255 + +#define BUTTON_NAVIFRAME_TEXT_SHADOW_NORMAL_COLOR_INC 255 255 255 255 +#define BUTTON_NAVIFRAME_TEXT_SHADOW_DIM_COLOR_INC 0 0 0 163 + +#define BUTTON_TICKER_TEXT_SHADOW_NORMAL_COLOR_INC 0 0 0 127 +#define BUTTON_TICKER_TEXT_SHADOW_NORMAL_COLOR_INC 0 0 0 127 + +#define BUTTON_NUMBER_TEXT_NORMAL_COLOR_INC 50 50 50 255 +#define BUTTON_NUMBER_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_NUMBER_TEXT_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_NUMBER_TEXT_DISABLE_VISIBLE_COLOR_INC 50 50 50 76 + +#define BUTTON_SEARCH_BUTTON_TEXT_NORMAL_COLOR_INC 58 58 58 255 +#define BUTTON_SEARCH_BUTTON_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_SEARCH_BUTTON_TEXT_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_SEARCH_BUTTON_TEXT_DISABLED_COLOR_INC 58 58 58 76 +#define BUTTON_SEARCH_BUTTON_TEXT_SHADOW_PRESSED_COLOR_INC 0 0 0 163 + +#define BUTTON_SEARCH_BUTTON_SEND_NORMAL_COLOR_INC 248 246 239 255 +#define BUTTON_SEARCH_BUTTON_SEND_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_SEARCH_BUTTON_SEND_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_SEARCH_BUTTON_SEND_DISABLED_COLOR_INC 248 246 239 76 +#define BUTTON_SEARCH_BUTTON_SEND_SHADOW_NORMAL_COLOR_INC 0 0 0 163 + +#define BUTTON_SEARCH_BUTTON_CANCEL_NORMAL_COLOR_INC 248 246 239 255 +#define BUTTON_SEARCH_BUTTON_CANCEL_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_SEARCH_BUTTON_CANCEL_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_SEARCH_BUTTON_CANCEL_DISABLED_COLOR_INC 248 246 239 76 +#define BUTTON_SEARCH_BUTTON_CANCEL_SHADOW_NORMAL_COLOR_INC 0 0 0 163 + +#define BUTTON_SEND_BUBBLE_TEXT_NORMAL_COLOR_INC 58 58 58 255 +#define BUTTON_SEND_BUBBLE_TEXT_PRESSED_COLOR_INC 58 58 58 255 +#define BUTTON_SEND_BUBBLE_TEXT_FOCUSED_COLOR_INC 58 58 58 255 +#define BUTTON_SEND_BUBBLE_TEXT_DISABLED_COLOR_INC 58 58 58 76 +#define BUTTON_SEND_BUBBLE_TEXT_SHADOW_NORMAL_COLOR_INC 255 255 255 153 + +#define BUTTON_RECEIVE_BUBBLE_TEXT_NORMAL_COLOR_INC 248 246 239 255 +#define BUTTON_RECEIVE_BUBBLE_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_RECEIVE_BUBBLE_TEXT_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_RECEIVE_BUBBLE_TEXT_DISABLED_COLOR_INC 248 246 239 76 +#define BUTTON_RECEIVE_BUBBLE_TEXT_SHADOW_NORMAL_COLOR_INC 0 0 0 153 + +#define BUTTON_TEXT_STYLE1_NORMAL_COLOR_INC 58 58 58 255 +#define BUTTON_TEXT_STYLE1_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_TEXT_STYLE1_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_TEXT_STYLE1_DISABLED_COLOR_INC 58 58 58 76 + +#define BUTTON_POPUP_BUTTON_TEXT_NORMAL_COLOR_INC 58 58 58 255 +#define BUTTON_POPUP_BUTTON_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_POPUP_BUTTON_TEXT_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_POPUP_BUTTON_TEXT_DISABLED_COLOR_INC 58 58 58 76 + +#define BUTTON_EXPAND_BUTTON_NORMAL_COLOR_INC 249 249 249 255 +#define BUTTON_EXPAND_BUTTON_PRESSED_COLOR_INC 249 249 249 255 +#define BUTTON_EXPAND_BUTTON_FOCUSED_COLOR_INC 249 249 249 255 +#define BUTTON_EXPAND_BUTTON_DISABLED_COLOR_INC 48 49 50 255 + +#define BUTTON_DELETE_BUTTON_TEXT_NORMAL_COLOR_INC 248 246 239 255 +#define BUTTON_DELETE_BUTTON_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_DELETE_BUTTON_TEXT_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_DELETE_BUTTON_TEXT_DISABLED_COLOR_INC 248 246 239 76 + +#define BUTTON_SWEEP_BUTTON_TEXT_NORMAL_COLOR_INC 58 58 58 255 +#define BUTTON_SWEEP_BUTTON_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_SWEEP_BUTTON_TEXT_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_SWEEP_BUTTON_TEXT_DISABLED_COLOR_INC 58 58 58 76 + +#define BUTTON_DEFAULT_STYLE_BUTTON_TEXT_NORMAL_COLOR_INC 50 50 50 255 +#define BUTTON_DEFAULT_STYLE_BUTTON_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_DEFAULT_STYLE_BUTTON_TEXT_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_DEFAULT_STYLE_BUTTON_TEXT_DISABLED_COLOR_INC 50 50 50 255 + +#define BUTTON_CONTACT_BUTTON_TEXT_NORMAL_COLOR_INC 255 255 255 255 +#define BUTTON_CONTACT_BUTTON_TEXT_PRESSED_COLOR_INC 255 255 255 255 +#define BUTTON_CONTACT_BUTTON_TEXT_FOCUSED_COLOR_INC 255 255 255 255 +#define BUTTON_CONTACT_BUTTON_TEXT_DISABLED_COLOR_INC 255 255 255 76 + +#define BUTTON_NAVIFRAME_TITLE_ICON_CLIPPER_NORMAL_COLOR_INC 255 255 255 255 +#define BUTTON_NAVIFRAME_TITLE_ICON_CLIPPER_DEFAULT_COLOR_INC 101 101 101 255 +#define BUTTON_NAVIFRAME_TITLE_ICON_CLIPPER_PRESSED_COLOR_INC 64 147 247 255 +#define BUTTON_NAVIFRAME_TITLE_ICON_CLIPPER_DISABLED_COLOR_INC 101 101 101 76 + +#define BUTTON_NAVIFRAME_TITLE_TEXT_NORMAL_COLOR_INC 77 77 77 255 +#define BUTTON_NAVIFRAME_TITLE_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_NAVIFRAME_TITLE_TEXT_FOCUSED_COLOR_INC 248 246 239 255 +#define BUTTON_NAVIFRAME_TITLE_TEXT_DISABLED_COLOR_INC 58 58 58 76 + +#define BUTTON_DATETIME_AMPM_BG_MIN_INC 106 56 + +#define BUTTON_SEARCH_BUTTON_BG_BORDER_INC 12 12 12 12 +#define BUTTON_SEARCH_BUTTON_BG_MIN_INC 100 66 +#define BUTTON_SEARCH_BUTTON_VISIBLE_BG_MIN_INC 148 66 +#define BUTTON_SEARCH_BUTTON_ICONONLY_BG_MIN_INC 66 66 +#define BUTTON_SEARCH_BUTTON_TEXT_FONT_SIZE_INC 30 + +#define BUTTON_BUBBLE_CIRCLE_BG_MIN_MAX_INC 74 74 +#define BUTTON_BUBBLE_CIRCLE_IMAGE_MIN_MAX_INC 74 74 +#define BUTTON_BUBBLE_CIRCLE_MIN_WIDTH_INC 74 +#define BUTTON_BUBBLE_CIRCLE_MIN_HEIGHT_INC 74 + +#define BUTTON_SENT_BUBBLE_BG_BORDER_INC 12 12 12 12 +#define BUTTON_SENT_BUBBLE_TEXT_FONT_SIZE_INC 36 +#define BUTTON_SENT_BUBBLE_TEXT_MULTILINE_FONT_SIZE_INC 28 + +#define BUTTON_RECEIVE_BUBBLE_BG_BORDER_INC 12 12 12 12 +#define BUTTON_RECEIVE_BUBBLE_TEXT_FONT_SIZE_INC 36 +#define BUTTON_RECEIVE_BUBBLE_TEXT_MULTILINE_FONT_SIZE_INC 28 + +#define BUTTON_TEXT_STYLE1_BG_MIN_INC 150 50 +#define BUTTON_TEXT_STYLE1_VISIBLE_BG_MIN_INC 150 50 +#define BUTTON_TEXT_STYLE1_ICONONLY_BG_MIN_INC 74 74 +#define BUTTON_TEXT_STYLE1_BG_BORDER_INC 12 12 12 12 +#define BUTTON_TEXT_STYLE1_PADDING_MIN_INC 12 0 +#define BUTTON_TEXT_STYLE1_VISIBLE_ICON_RECT_MIN_MAX_INC 44 44 +#define BUTTON_TEXT_STYLE1_VISIBLE_PADDING_ICON_TEXT_MIN_INC 4 0 +#define BUTTON_TEXT_STYLE1_VISIBLE_ICON_MIN_MAX_INC 44 44 +#define BUTTON_TEXT_STYLE1_ICONONLY_ICON_MIN_MAX_INC 44 44 +#define BUTTON_TEXT_STYLE1_FONT_SIZE_INC 36 + +#define BUTTON_TEXT_STYLE2_BG_MIN_INC 100 66 +#define BUTTON_TEXT_STYLE2_VISIBLE_BG_MIN_INC 148 66 +#define BUTTON_TEXT_STYLE2_ICONONLY_BG_MIN_INC 74 66 +#define BUTTON_TEXT_STYLE2_BG_BORDER_INC 12 12 12 12 +#define BUTTON_TEXT_STYLE2_PADDING_MIN_INC 12 0 +#define BUTTON_TEXT_STYLE2_VISIBLE_ICON_RECT_MIN_MAX_INC 44 44 +#define BUTTON_TEXT_STYLE2_VISIBLE_PADDING_ICON_TEXT_MIN_INC 4 0 +#define BUTTON_TEXT_STYLE2_VISIBLE_ICON_MIN_MAX_INC 44 44 +#define BUTTON_TEXT_STYLE2_ICONONLY_ICON_MIN_MAX_INC 44 44 +#define BUTTON_TEXT_STYLE2_FONT_SIZE_INC 36 + +#define BUTTON_CIRCLE_STYLE_BG_MIN_MAX_INC 74 74 +#define BUTTON_CIRCLE_STYLE_IMAGE_MIN_MAX_INC 74 74 +#define BUTTON_CIRCLE_STYLE_CONTENT_MIN_MAX_INC 44 44 + +#define BUTTON_CIRCLE_NORMAL_MIN_WIDTH_INC 74 +#define BUTTON_CIRCLE_NORMAL_MIN_HEIGHT_INC 74 +#define BUTTON_CIRCLE_EXTENEDED_MIN_WIDTH_INC 110 +#define BUTTON_CIRCLE_EXTENEDED_MIN_HEIGHT_INC 110 + +#define BUTTON_POPUP_BG_NORMAL_MIN_INC 30 74 +#define BUTTON_POPUP_BG_BORDER_INC 12 12 12 12 +#define BUTTON_POPUP_PADDING_MIN_INC 12 3 +#define BUTTON_POPUP_PADDING_ICON_TEXT_VISIBLE_MIN_INC 8 0 +#define BUTTON_POPUP_ICON_ICONONLY_MIN_INC 44 44 +#define BUTTON_POPUP_TEXT_MIN_INC 64 20 +#define BUTTON_POPUP_TEXT_FONT_SIZE_INC 36 + +#define BUTTON_EDIT_STYLE_BG_NORMAL_MIN_MAX_INC 74 74 +#define BUTTON_EDIT_STYLE_IMAGE_NORMAL_MIN_MAX_INC 74 74 + +#define BUTTON_EDIT_NORMAL_MIN_WIDTH_INC 74 +#define BUTTON_EDIT_NORMAL_MIN_HEIGHT_INC 74 +#define BUTTON_EDIT_EXTENDED_MIN_WIDTH_INC 90 +#define BUTTON_EDIT_EXTENDED_MIN_HEIGHT_INC 90 + +#define BUTTON_SWEEP_BG_NORMAL_MIN_INC 74 74 +#define BUTTON_SWEEP_BG_BORDER_INC 12 12 12 12 +#define BUTTON_SWEEP_PADDING_MIN_INC 12 0 +#define BUTTON_SWEEP_ICON_RECT_MIN_INC 0 44 +#define BUTTON_SWEEP_PADDING_ICON_TEXT_VISIBLE_MIN_INC 8 0 +#define BUTTON_SWEEP_ICONONLY_ICON_MIN_INC 44 44 +#define BUTTON_SWEEP_TEXT_MIN_INC 50 26 +#define BUTTON_SWEEP_FONT_SIZE_INC 26 + +#define BUTTON_EXPAND_BUTTON_TEXT_SIZE_INC 30 + +#define BUTTON_EXPANDABLE_NUMBER_BG_NORMAL_MIN_MAX_INC 98 46 +#define BUTTON_EXPANDABLE_NUMBER_BG_BORDER_INC 12 12 12 12 +#define BUTTON_EXPANDABLE_NUMBER_PADDING_MIN_INC 12 1 +#define BUTTON_EXPANDABLE_NUMBER_ICON_RECT_EXPAND_MIN_MAX_INC 24 46 +#define BUTTON_EXPANDABLE_NUMBER_TEXT_MIN_MAX_INC 50 46 +#define BUTTON_EXPANDABLE_NUMBER_FONT_SIZE_INC 28 + +#if 0 +#define BUTTON_CONTACT_DELETE_BG_NORMAL_MIN_INC 50 74 +#define BUTTON_CONTACT_DELETE_BG_BORDER_INC 8 0 5 5 +#define BUTTON_CONTACT_DELETE_PADDING_LEFT_TOP_MIN_INC 36 2 +#define BUTTON_CONTACT_DELETE_PADDING_RIGHT_BOTTOM_MIN_INC 14 2 +#define BUTTON_CONTACT_DELETE_PADDING_ICON_TEXT_VISIBLE_MIN_INC 5 0 +#define BUTTON_CONTACT_DELETE_ICON_ICONONLY_MIN_INC 42 42 +#define BUTTON_CONTACT_DELETE_FONT_SIZE_INC 32 + +#define BUTTON_CONTACT_STYLE_BG_MIN_MAX_INC 74 74 +#define BUTTON_CONTACT_STYLE_IMAGE_MIN_MAX_INC 74 74 + +#define BUTTON_TEXT_CONTACTS_DELETE_NORMAL_COLOR_INC 249 249 249 255 +#define BUTTON_TEXT_CONTACTS_DELETE_PRESSED_COLOR_INC 249 249 249 255 +#define BUTTON_TEXT_CONTACTS_DELETE_DISABLED_COLOR_INC 0 0 0 128 +#endif + +#define BUTTON_CONTACT_BG_MIN_INC 12 66 +#define BUTTON_CONTACT_BG_BORDER_INC 6 6 6 6 +#define BUTTON_CONTACT_LEFT_PADDING_MIN_INC 12 0 +#define BUTTON_CONTACT_RIGHT_PADDING_MIN_INC 12 0 +#define BUTTON_CONTACT_FONT_SIZE_INC 32 + +#define BUTTON_NAVIFRAME_BACK_BUTTON_BG_MIN_MAX_INC 86 98 +#define BUTTON_NAVIFRAME_BACK_BUTTON_MIN_MAX_INC 60 60 + +#define BUTTON_NAVIFRAME_DEFAULT_TEXT_COLOR_INC 249 249 249 255 +#define BUTTON_NAVIFRAME_FOCUSED_TEXT_COLOR_INC 249 249 249 255 + +#define BUTTON_NAVIFRAME_TITLE_ICON_BG_MIN_MAX_INC 86 111 +#define BUTTON_NAVIFRAME_TITLE_ICON_IMAGE_MIN_MAX_INC 68 68 +#define BUTTON_NAVIFRAME_TITLE_ICON_TOP_PADDING_INC 0 32 + +#define BUTTON_NAVIFRAME_TITLE_TEXT_BG_NORMAL_MIN_INC 182 70 +#define BUTTON_NAVIFRAME_TITLE_TEXT_BG_NORMAL_MAX_INC 9999 70 +#define BUTTON_NAVIFRAME_TITLE_TEXTBLOCK_MIN_INC 126 70 +#define BUTTON_NAVIFRAME_TITLE_TEXT_BG_PRESSED_BORDER_INC 36 36 0 0 +#define BUTTON_NAVIFRAME_TITLE_TEXT_PADDING_MIN_INC 28 5 +#define BUTTON_NAVIFRAME_TITLE_TEXT_FONT_SIZE_INC 32 +#define BUTTON_NAVIFRAME_TITLE_VISIBLE_ICON_RECT_MIN_MAX_INC 44 44 +#define BUTTON_NAVIFRAME_TITLE_ICONONLY_ICON_MIN_MAX_INC 44 44 +#define BUTTON_NAVIFRAME_TITLE_VISIBLE_PADDING_ICON_TEXT_MIN_INC 8 0 +#define BUTTON_NAVIFRAME_TITLE_TEXT_BG_NORMAL_COLOR_INC 249 249 249 255 + +#define BUTTON_NAVIFRAME_MORE_BG_MIN_MAX_INC 82 82 +#define BUTTON_NAVIFRAME_MORE_DEFAULT_IMAGE_MIN_MAX_INC 60 60 + +#define BUTTON_TICKERNOTI_BG_MIN_MAX_INC 154 74 +#define BUTTON_TICKERNOTI_BG_BORDER_INC 12 12 12 12 +#define BUTTON_TICKERNOTI_PADDING_MIN_INC 12 0 +#define BUTTON_TICKERNOTI_VISIBLE_ICON_RECT_MIN_MAX_INC 44 44 +#define BUTTON_TICKERNOTI_VISIBLE_PADDING_ICON_TEXT_MIN_INC 4 0 +#define BUTTON_TICKERNOTI_VISIBLE_ICON_MIN_MAX_INC 44 44 +#define BUTTON_TICKERNOTI_ICONONLY_ICON_MIN_MAX_INC 44 44 +#define BUTTON_TICKERNOTI_FONT_SIZE_INC 36 + +#define BUTTON_COLORSELECTOR_BG_DEFAULT_MIN_INC 74 74 +#define BUTTON_COLORSELECTOR_BG_BORDER_INC 12 12 12 12 +#define BUTTON_COLORSELECTOR_IMAGE_MIN_MAX_INC 74 74 + +#define BUTTON_DEFAULT_STYLE_BG_MIN_INC 100 74 +#define BUTTON_DEFAULT_STYLE_BG_BORDER_INC 12 12 12 12 +#define BUTTON_DEFAULT_STYLE_PADDING_MIN_INC 12 5 +#define BUTTON_DEFAULT_STYLE_PADDING_ICON_TEXT_VISIBLE_MIN_INC 8 0 +#define BUTTON_DEFAULT_STYLE_ICONONLY_ICON_MIN_INC 44 44 +#define BUTTON_DEFAULT_STYLE_TEXT_MIN_INC 144 36 +#define BUTTON_DEFAULT_STYLE_FONT_SIZE_INC 36 + +#define BUTTON_DEFAULT_STYLE_MULTILINE_BG_MIN_INC 100 80 +#define BUTTON_DEFAULT_STYLE_MULTILINE_PADDING_MIN_INC 12 0 + +#define BUTTON_THUMBNAIL_STYLE_APPS_BG_MIN_INC 160 160 +#define BUTTON_THUMBNAIL_STYLE_APPS_BG_COLOR_INC 255 255 255 38 +#define BUTTON_THUMBNAIL_STYLE_APPS_BG_LEFT_TOP_PADDING_INC 18 32 +#define BUTTON_THUMBNAIL_STYLE_APPS_BG_RIGHT_BOTTOM_PADDING_INC 18 58 +#define BUTTON_THUMBNAIL_STYLE_APPS_BG_ICONONLY_RIGHT_BOTTOM_PADDING_INC 18 32 + +#define CHECK_DELETE_TEXT_DELETE_NORMAL_COLOR_INC 249 249 249 255 +#define CHECK_DELETE_TEXT_DELETE_PRESS_COLOR_INC 249 249 249 255 + +#define CHECK_DEFAULT_TEXT_FONT_SIZE_INC 36 + +#define CHECK_ONOFF_BG_NORMAL_MIN_MAX_INC 132 70 +#define CHECK_ONOFF_ON_FONT_SIZE_INC 24 +#define CHECK_ONOFF_OFF_FONT_SIZE_INC 24 +#define CHECK_ONOFF_HANDLER_MIN_MAX_INC 64 64 + +#define CHECK_STYLE_FAVORITE_DEFAULT_BG_IMAGE_MIN_WIDTH_INC 74 +#define CHECK_STYLE_FAVORITE_DEFAULT_BG_IMAGE_MIN_HEIGHT_INC 74 +#define CHECK_STYLE_FAVORITE_EXTENDED_BG_IMAGE_MIN_WIDTH_INC 100 +#define CHECK_STYLE_FAVORITE_EXTENDED_BG_IMAGE_MIN_HEIGHT_INC 100 +#define CHECK_STYLE_FAVORITE_BG_NORMAL_MIN_MAX_INC 74 74 + +#define CHECK_STYLE_DEFAULT_DEFAULT_BG_IMAGE_MIN_WIDTH_INC 64 +#define CHECK_STYLE_DEFAULT_DEFAULT_BG_IMAGE_MIN_HEIGHT_INC 64 +#define CHECK_STYLE_DEFAULT_EXTENDED_BG_IMAGE_MIN_WIDTH_INC 75 +#define CHECK_STYLE_DEFAULT_EXTENDED_BG_IMAGE_MIN_HEIGHT_INC 91 +#define CHECK_STYLE_DEFAULT_BG_NORMAL_MIN_MAX_INC 64 64 + +#define CHECK_STYLE_DELETE_BUTTON_BG_IMAGE_MIN_MAX_WIDTH_INC 74 74 +#define CHECK_STYLE_DELETE_BUTTON_BG_EXPAND_IMAGE_MIN_MAX_WIDTH_INC 124 74 +#define CHECK_STYLE_DELETE_BUTTON_BG_EXPAND_BORDER_INC 8 0 5 5 +#define CHECK_STYLE_DELETE_BUTTON_TEXT_FONT_SIZE_INC 32 + +#define INDEX_BG_NINEPATCH_INC 8 8 8 8 +#define INDEX_ITEM_WIDTH_INC 49 +#define INDEX_ITEM_HEIGHT_INC 33 +#define INDEX_LEVEL_PADDING_INC 70 +#define INDEX_1ST_LEVEL_POPUP_WIDTH_INC 188 +#define INDEX_2ND_LEVEL_POPUP_WIDTH_INC 188 +#define INDEX_POPUP_HEIGHT_INC 180 +#define INDEX_ROLLOVER_TEXT_SIZE_INC 26 +#define INDEX_POPUP_BG_NINEPATCH_INC 20 20 20 20 +#define INDEX_POPUP_TEXT_SIZE_INC 136 +#define INDEX_ROLLOVER_TEXT_COLOR_INC 160 159 154 255 +#define INDEX_ROLLOVER_ACTIVE_TEXT_COLOR_INC 59 115 182 255 +#define INDEX_POPUP_TEXT_COLOR_INC 255 255 255 255 +#define INDEX_SCROLL_BG_COLOR_INC 230 227 216 255 +#define INDEX_BOTTOM_LINE_COLOR_INC 197 194 183 255 +#define INDEX_LEFT_LINE_COLOR_INC 65 119 184 255 + +#define INDEX_PAGECONTROL_IND_INC 10 9 +#define INDEX_PAGECONTROL_IND_MIN_INC 10 9 +#define INDEX_PAGECONTROL_FONT_SIZE_INC 28 +#define INDEX_PAGECONTROL_FONT_COLOR_INC 120 120 120 + +#define RADIO_STYLE_DEFAULT_BG_IMAGE_MIN_WIDTH_INC 64 +#define RADIO_STYLE_DEFAULT_BG_IMAGE_MIN_HEIGHT_INC 64 +#define RADIO_STYLE_DEFAULT_EXTENDED_BG_IMAGE_MIN_WIDTH_INC 76 +#define RADIO_STYLE_DEFAULT_EXTENDED_BG_IMAGE_MIN_WIDTH_INC 76 +#define RADIO_STYLE_DEFAULT_BG_MIN_MAX_INC 64 64 +#define RADIO_STYLE_DEFAULT_FONT_SIZE_INC 36 + +#define PANES_STYLE_DEFAULT_MOVABLE_SIZE_INC 60 +#define PANES_STYLE_DEFAULT_PADDING_LEFT_SIZE_INC 25 +#define PANES_STYLE_DEFAULT_PADDING_RIGHT_SIZE_INC 22 +#define PANES_STYLE_DEFAULT_MIDDLE_SIZE_INC 26 +#define PANES_STYLE_DEFAULT_FIXED_SIZE_INC 52 + +#define SEGMENT_CONTROL_DEFAULT_ITEM_TEXT_COLOR_NORMAL_INC 153 153 153 255 +#define SEGMENT_CONTROL_ITEM_TITLE_TEXT_COLOR_PRESSED_INC 59 115 182 255 +#define SEGMENT_CONTROL_ITEM_TITLE_TEXT_COLOR_SELECTED_INC 59 115 182 255 +#define SEGMENT_CONTROL_ITEM_TITLE_TEXT_COLOR_DISABLED_INC 153 153 153 255 + +#define SEGMENT_CONTROL_MULTILINE_TEXT_SIZE_INC 30 +#define SEGMENT_CONTROL_TEXT_SIZE_RANGE_MIN_INC 12 +#define SEGMENT_CONTROL_TEXT_SIZE_RANGE_MAX_INC 28 +#define SEGMENT_CONTROL_DIVIDER_LINE_MIN_SIZE_INC 2 32 +#define SEGMENT_CONTROL_TEXT_PADDING_MIN_SIZE_INC 18 0 +#define SEGMENT_CONTROL_VISIBLE_ICON_RECT_MIN_MAX_INC 40 40 +#define SEGMENT_CONTROL_BADGE_TEXT_LEFT_PADDING_MIN_INC 22 45 +#define SEGMENT_CONTROL_BADGE_TEXT_RIGHT_PADDING_MIN_INC 18 47 +#define SEGMENT_CONTROL_BADGE_TEXT_COLOR_INC 10 100 208 255; +#define SEGMENT_CONTROL_BADGE_TEXT_FONT_SIZE_INC 26; + +#define EDITFIELD_TITLE_SIZE_INC 32 +#define EDITFIELD_TITLE_COLOR_INC 59 115 182 255 +#define EDITFIELD_GUIDE_TEXT_COLOR_INC 121 131 138 255 +#define EDITFIELD_DEFAULT_ERASER_MINW_INC 48 +#define EDITFIELD_DEFAULT_ERASER_MINH_INC 48 +#define EDITFIELD_DEFAULT_ERASER_EVENT_MINW_INC 48 +#define EDITFIELD_DEFAULT_ERASER_EVENT_MINH_INC 70 +#define EDITFIELD_SEARCHBAR_ERASER_MINW_INC 38 +#define EDITFIELD_SEARCHBAR_ERASER_MINH_INC 38 +#define EDITFIELD_SEARCHBAR_ERASER_EVENT_MINW_INC 38 +#define EDITFIELD_SEARCHBAR_ERASER_EVENT_MINH_INC 50 +#define EDITFIELD_DEFAULT_MINH_INC 112 +#define EDITFIELD_TITLE_MINH_INC 128 +#define EDITFIELD_SEARCHBAR_MINH_INC 50 +#define EDITFIELD_DEFAULT_TOP1_SINGLE_INC 27 +#define EDITFIELD_DEFAULT_TOP1_MULTI_INC 56 +#define EDITFIELD_DEFAULT_TOP2_INC 8 +#define EDITFIELD_DEFAULT_LEFT1_INC 0 +#define EDITFIELD_DEFAULT_LEFT2_INC 0 +#define EDITFIELD_DEFAULT_LEFT3_INC 1 +#define EDITFIELD_DEFAULT_RIGHT1_ERASER_SHOW_INC 56 +#define EDITFIELD_DEFAULT_RIGHT2_INC 0 +#define EDITFIELD_DEFAULT_BOTTOM1_SINGLE_INC 25 +#define EDITFIELD_DEFAULT_BOTTOM1_MULTI_INC 8 +#define EDITFIELD_DEFAULT_BOTTOM2_SINGLE_INC 32 +#define EDITFIELD_DEFAULT_BOTTOM2_MULTI_INC 12 +#define EDITFIELD_DEFAULT_BOTTOM3_SINGLE_INC 85 +#define EDITFIELD_DEFAULT_BOTTOM3_MULTI_INC 60 +#define EDITFIELD_SEARCHBAR_TOP1_SINGLE_INC 6 +#define EDITFIELD_SEARCHBAR_TOP1_MULTI_INC 10 +#define EDITFIELD_SEARCHBAR_TOP2_INC 10 +#define EDITFIELD_SEARCHBAR_LEFT1_INC 0 +#define EDITFIELD_SEARCHBAR_LEFT2_INC 0 +#define EDITFIELD_SEARCHBAR_LEFT3_INC 1 +#define EDITFIELD_SEARCHBAR_RIGHT1_ERASER_SHOW_INC 56 +#define EDITFIELD_SEARCHBAR_RIGHT2_INC 5 +#define EDITFIELD_SEARCHBAR_BOTTOM1_SINGLE_INC 8 +#define EDITFIELD_SEARCHBAR_BOTTOM1_MULTI_INC 2 +#define EDITFIELD_SEARCHBAR_BOTTOM2_SINGLE_INC 16 +#define EDITFIELD_SEARCHBAR_BOTTOM2_MULTI_INC 2 +#define EDITFIELD_SEARCHBAR_BOTTOM3_SINGLE_INC 50 +#define EDITFIELD_SEARCHBAR_BOTTOM3_MULTI_INC 50 + +#define BUTTON_TICKERNOTI_NORMAL_COLOR_INC 225 215 215 255 +#define BUTTON_TICKERNOTI_PRESSED_COLOR_INC 248 246 239 255 +#define BUTTON_TICKERNOTI_DISABLED_COLOR_INC 225 215 215 76 + +#define BUTTON_DISCLIP_NORMAL_COLOR_INC 255 255 255 255 +#define BUTTON_DISCLIP_DISABLED_COLOR_INC 255 255 255 76 + +#define CHECK_DEFAULT_TEXT_NORMAL_COLOR_INC 50 50 50 255 +#define CHECK_DEFAULT_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define CHECK_DEFAULT_TEXT_DISABLED_COLOR_INC 50 50 50 76 +#define CHECK_DISCLIP_NORMAL_COLOR_INC 255 255 255 255 +#define CHECK_DISCLIP_DISABLED_COLOR_INC 255 255 255 76 + +#define RADIO_DEFAULT_TEXT_NORMAL_COLOR_INC 50 50 50 255 +#define RADIO_DEFAULT_TEXT_PRESSED_COLOR_INC 248 246 239 255 +#define RADIO_DEFAULT_TEXT_DISABLED_COLOR_INC 50 50 50 76 +#define RADIO_DISCLIP_NORMAL_COLOR_INC 255 255 255 255 +#define RADIO_DISCLIP_DISABLED_COLOR_INC 255 255 255 76 + +#define CONTROLBAR_LARGE_HEIGHT_INC 122 +#define CONTROLBAR_SMALL_HEIGHT_INC 114 +#define CONTROLBAR_WIDTH_INC 122 +#define CONTROLBAR_SEPARATEBAR_DARK_COLOR_INC 23 34 38 255 +#define CONTROLBAR_SEPARATEBAR_BRIGHT_COLOR_INC 58 68 74 255 + +#define MULTIBUTTONENTRY_WIDTH_PAD_INC 26 +#define MULTIBUTTONENTRY_HEIGHT_PAD_INC 16 +#define MULTIBUTTONENTRY_BOX_HORIZONTAL_PAD_INC 8 +#define MULTIBUTTONENTRY_BOX_VERTICAL_PAD_INC 16 +#define MULTIBUTTONENTRY_LABEL_HEIGHT_INC 66 // same as button +#define MULTIBUTTONENTRY_LABEL_PAD_INC 8 +#define MULTIBUTTONENTRY_LABEL_TEXT_SIZE_INC 36 +#define MULTIBUTTONENTRY_LABEL_TEXT_COLOR_INC "#808080" +#define MULTIBUTTONENTRY_GUIDE_HEIGHT_INC 66 // same as button +#define MULTIBUTTONENTRY_GUIDE_TEXT_SIZE_INC 36 +#define MULTIBUTTONENTRY_GUIDE_TEXT_COLOR_INC "#79838A" //same as editfield +#define MULTIBUTTONENTRY_BUTTON_HEIGHT_INC 66 +#define MULTIBUTTONENTRY_BUTTON_PAD_INC 12 +#define MULTIBUTTONENTRY_BUTTON_MAX_INC 324 +#define MULTIBUTTONENTRY_BUTTON_NINEPATCH_INC 5 5 0 0 +#define MULTIBUTTONENTRY_BUTTON_TEXT_SIZE_INC 32 +#define MULTIBUTTONENTRY_BUTTON_TEXT_COLOR_INC 255 255 255 255 +#define MULTIBUTTONENTRY_BUTTON_TEXT_MAX_INC 300 +#define MULTIBUTTONENTRY_NUMBER_TEXT_COLOR_INC 128 128 128 255 // same as multibuttonentry label + +#define SEARCHBAR_CANCEL_BUTTON_W_INC 136 +#define SEARCHBAR_CANCEL_BUTTON_WITH_DOUBLE_PADDING_W_INC 166 +#define SEARCHBAR_CANCEL_BUTTON_LEFT_PADDING_INC 10 +#define SEARCHBAR_TOP_PADDING_INC 10 +#define SEARCHBAR_BOTTOM_PADDING_INC 10 +#define SEARCHBAR_HEIGHT_INC 66 +#define SEARCHBAR_LEFT_PADDING_INC 26 +#define SEARCHBAR_RIGHT_PADDING_INC 26 +#define SEARCHBAR_INPUTFIELD_BORDER_INC 9 9 9 9 +#define SEARCHBAR_LEFT_ICON_PADDING_INC 16 +#define SEARCHBAR_ICON_MIN_W_INC 44 +#define SEARCHBAR_ICON_MIN_H_INC 44 +#define SEARCHBAR_LEFT_PADDING_SEARCHFIELD_INC 16 +#define SEARCHBAR_RIGHT_PADDING_SEARCHFIELD_INC 8 +#define SEARCHBAR_SEARCH_TEXTFIELD_H_INC 60 +#define SEARCHBAR_H_INC 86 + +#define SELECTION_INFO_BACKGROUND_COLOR_INC 68 68 68 255 +#define SELECTION_INFO_TEXT_COLOR_INC 255 255 255 255 +#define SELECTION_INFO_MIN_VER_W_INC 720 +#define SELECTION_INFO_MIN_HORZ_W_INC 1280 +#define SELECTION_INFO_VER_PADDING_INC 48 +#define SELECTION_INFO_LEFT_PADDING_INC 16 +#define SELECTION_INFO_TEXT_FONT_SIZE_INC 32 +#define SELECTION_INFO_SHADOW_VER_W_INC 720 +#define SELECTION_INFO_SHADOW_VER_H_INC 10 +#define SELECTION_INFO_SHADOW_HORZ_W_INC 1280 +#define SELECTION_INFO_SHADOW_HORZ_H_INC 10 +#define SELECTION_INFO_MIN_VER_BOTTOM_64_H_INC 150 +#define SELECTION_INFO_MIN_VER_BOTTOM_86_H_INC 186 + +#define POPUP_DESCRIPTION_DEFAULT_TEXT_MIN_INC 648 300 +#define POPUP_DESCRIPTION_DEFAULT_TEXT_FONT_SIZE_INC 42 + +#define POPUP_BASE_DEFAULT_BASE_DEFAULT_MIN_INC 720 0 +#define POPUP_BASE_DEFAULT_BASE_DEFAULT_MAX_INC 720 1120 +#define POPUP_BASE_DEFAULT_BG_DEFAULT_IMAGE_BORDER_INC 18 18 32 52 +#define POPUP_BASE_DEFAULT_TITLE_DEFAULT_MIN_INC 648 80 +#define POPUP_BASE_DEFAULT_TITLE_VOLUMEBAR_MIN_INC 720 68 +#define POPUP_BASE_DEFAULT_PADDING_MIN_MAX_INC 16 0 +#define POPUP_BASE_DEFAULT_TITLE_ICON_DEFAULT_MIN_MAX_INC 64 64 +#define POPUP_BASE_DEFAULT_CONTENT_DEFAULT_MIN_MAX_INC 648 300 +#define POPUP_BASE_DEFAULT_BUTTON_BG_DEFAULT_MIN_INC 648 114 +#define POPUP_BASE_DEFAULT_TEXT_FONT_SIZE_INC 50 + +#define POPUP_DESC_LEFT_PADDING 0 +#define POPUP_DESC_RIGHT_PADDING 0 +#define POPUP_DESC_TOP_PADDING 14 +#define POPUP_DESC_BOTTOM_PADDING 34 +#define POPUP_LABEL_DESC_TOP_PADDING 39 +#define POPUP_LABEL_DESC_BOTTOM_PADDING 39 +#define POPUP_TITLE_TOP_PADDING 18 +#define POPUP_TITLE_BOTTOM_PADDING 0 +#define POPUP_TITLE_ICON_TEXT_PADDING_INC 16 0 + +#define POPUP_CONTENT_DEFAULT_PADDING_TOP_MIN_INC 20 +#define POPUP_CONTENT_DEFAULT_PADDING_LEFT_MIN_INC 36 +#define POPUP_CONTENT_DEFAULT_PADDING_RIGHT_MIN_INC 36 +#define POPUP_CONTENT_DEFAULT_PADDING_BOTTOM_MIN_INC 20 +#define POPUP_CONTENT_DEFAULT_CONTENT_DEFAULT_MIN_INC 648 0 + +#define POPUP_BASE_CONTENT_EXPAND_BG_DEFAULT_MIN_INC 0 114 +#define POPUP_BASE_CONTENT_EXPAND_TITLE_DEFAULT_MIN_INC 0 80 + +#define POPUP_BASE_VERTICAL_BUTTON_BUTTONAREA_DEFAULT_MIN_INC 648 294 + +#define POPUP_BUTTON3_VERTICAL_BUTTON_PADDING_TOP_MIN_INC 0 20 +#define POPUP_BUTTON_VERTICAL_ACTION_AREA_HEIGHT "294" +#define POPUP_BUTTON3_VERTICAL_BUTTON_BUTTON_MIN_MAX_INC 394 74 +#define POPUP_BUTTON3_VERTICAL_BUTTON_PADDING_BUTTON_MIN_INC 0 16 +#define POPUP_BUTTON3_VERTICAL_BUTTON_PADDING_BUTTON_MAX_INC 9999 16 + +#define POPUP_CONTENT_LISTSTYLE_PADDING_TOP_MIN_MAX_INC 3 3 +#define POPUP_CONTENT_LISTSTYLE_CONTENT_DEFAULT_MIN_INC 614 300 +#define POPUP_CONTENT_LISTSTYLE_PADDING_RIGHT_MIN_INC 0 0 + +#define POPUP_CONTENT_MINSTYLE_CONTENT_DEFAULT_MIN_INC 720 0 +#define POPUP_CONTENT_VOLUMEBAR_STYLE_CONTENT_DEFAULT_MIN_INC 668 300 +#define POPUP_CONTENT_VOLUMEBAR_TEXT_STYLE_CONTENT_DEFAULT_MIN_INC 668 250 +#define POPUP_BASE_VOLUMEBAR_STYLE_BUTTONAREA_BG_DEFAULT_MIN_INC 668 134 + +#define POPUP_BUTTON_DEFAULT_ACTION_AREA_HEIGHT "114" +#define POPUP_BUTTON1_DEFAULT_BUTTON1_DEFAULT_MIN_INC 394 74 +#define POPUP_BUTTON1_DEFAULT_BUTTON1_DEFAULT_MAX_INC 648 74 +#define POPUP_BUTTON2_DEFAULT_HEIGHT_INC 74 +#define POPUP_BUTTON2_DEFAULT_BUTTON_DEFAULT_MIN_MAX_INC 270 74 +#define POPUP_BUTTON2_DEFAULT_PADDING_BUTTON_MIN_MAX_INC 20 74 +#define POPUP_BUTTON2_DEFAULT_PADDING_LEFT_RIGHT_WIDTH_INC 36 +#define POPUP_BUTTON3_DEFAULT_HEIGHT_INC 74 +#define POPUP_BUTTON3_DEFAULT_BUTTON_DEFAULT_MIN_MAX_INC 202 74 +#define POPUP_BUTTON3_DEFAULT_PADDING_BUTTON_MIN_MAX_INC 20 74 +#define POPUP_BUTTON3_DEFAULT_PADDING_LEFT_RIGHT_WIDTH_INC 36 + +#define PROGRESSBAR_DEFAULT_STYLE_TEXT_COLOR_INC 128 128 128 255 +#define PROGRESSBAR_DEFAULT_STYLE_STATUS_TEXT_COLOR_INC 128 128 128 255 +#define PROGRESSBAR_LIST_PROGRESS_STYLE_TEXT_COLOR_INC 128 128 128 255 +#define PROGRESSBAR_LIST_PROGRESS_STYLE_STATUS_TEXT_COLOR_INC 128 128 128 255 +#define PROGRESSBAR_LIST_TITLE_PROGRESS_STYLE_STATUS_TEXT_COLOR_INC 128 128 128 255 +#define PROGRESSBAR_LIST_PROCESS_WIDTH_INC 66 +#define PROGRESSBAR_LIST_PROCESS_HEIGHT_INC 66 +#define PROGRESSBAR_LIST_PROCESS_SMALL_INC 35 +#define PROGRESSBAR_LIST_PROCESS_SMALL_IMAGE "32x32" +#define PROGRESSBAR_LIST_PROGRESS_HEIGHT_INC 36 +#define PROGRESSBAR_LIST_PENDING_HEIGHT_INC 34 +#define PROGRESSBAR_PROGRESS_CIRCLE_BG_SIZE_INC 128 128 + +#define NOCONTENT_TEXT_BLOCK_STYLE_COLOR_INC 128 128 128 255 +#define NOCONTENT_TEXT_BLOCK_TEXT_SIZE_INC 32 +#define NOCONTENT_MIDDLE_PADDING_INC 38 +#define NOCONTENT_BASE_SEARCH_PADDING_INC 40 +#define NOCONTENT_IMAGE_WIDTH_HEIGHT_INC 280 280 +#define NOCONTENT_BG_COLOR_INC 0 0 0 0 +#define NOCONTENT_TEXT_STYLE_BG_MIN_INC 0 76 +#define NOCONTENT_IMAGE_BG_COLOR_INC 128 128 128 255 + +#define ENTRY_TEXT_SIZE_INC 44 +#define ENTRY_TEXT_COLOR_INC "#000000" +#define ENTRY_CURSOR_COLOR_INC 59 115 182 255 +#define ENTRY_PREEDIT_BACKGROUND_COLOR_INC "#000000" +#define ENTRY_PREEDIT_TEXT_COLOR_INC "#FFFFFF" +#define ENTRY_PREEDIT_UNDERLINE_COLOR_INC "#000000" +#define ENTRY_PREEDIT_SUB1_COLOR_INC "#2EA8E1" +#define ENTRY_PREEDIT_SUB2_COLOR_INC "#9962C3" +#define ENTRY_PREEDIT_SUB3_COLOR_INC "#76DE37" +#define ENTRY_PREEDIT_SUB4_COLOR_INC "#999999" +#define ENTRY_SELECTION_BG_COLOR 90 123 138 127 +#define ENTRY_SELECTION_BLOCK_HANDLE_MIN_SIZE 48 67 +#define MAGNIFIER_HEIGHT_FILL 182 +#define MAGNIFIER_HEIGHT_FIXED 108 +#define MAGNIFIER_WIDTH_FIXED 358 + +#define ENTRY_BUBBLE_EX_PAD 58 +#define ENTRY_BUBBLE_EX_CALLERID_PAD 178 +#define ENTRY_BUBBLE_IX_PAD 20 +#define ENTRY_BUBBLE_Y_PAD 15 +#define ENTRY_BUBBLE_BOTTOM_PAD 24 +#define ENTRY_BUBBLE_CALLERID_PAD 16 +#define ENTRY_BUBBLE_CALLERID_WIDTH 104 +#define ENTRY_BUBBLE_CALLERID_HEIGHT 104 +#define ENTRY_BUBBLE_DATE_AREA_TEXT_SIZE_INC 26 +#define ENTRY_BUBBLE_TEXT_SIZE 38 + +#define ENTRY_BUBBLE_SENT_TEXT_COLOR "#000000" +#define ENTRY_BUBBLE_SENT_TEXT_SHADOW_STYLE "far_shadow,bottom" +#define ENTRY_BUBBLE_SENT_TEXT_SHADOW_COLOR "#ffffff7f" +#define ENTRY_BUBBLE_RECEV_TEXT_COLOR "#FFFFFF" +#define ENTRY_BUBBLE_RECEV_TEXT_SHADOW_STYLE "far_shadow,top" +#define ENTRY_BUBBLE_RECEV_TEXT_SHADOW_COLOR "#0000009f" +#define ENTRY_BUBBLE_RECEV_BG_BORDER_INC 58 24 62 20 +#define ENTRY_BUBBLE_SENT_BG_BORDER_INC 24 58 62 20 +#define ENTRY_BUBBLE_CALLERID_RELATIVE_INC 0.0 0.0 +#define ENTRY_BUBBLE_RECEV_CALLERID_REL_INC 1.0 0.0 +#define ENTRY_BUBBLE_BOTTOMRIGHT_PAD 120 +#define ENTRY_BUBBLE_TEXT_CALLID_REL2_X_INC "elm.rect.right.pad" +#define ENTRY_BUBBLE_READ_TEXT_CALLID_REL1_X_INC "elm.rect.left.pad" +#define ENTRY_BUBBLE_TEXT_CALLID_REL2_Y_INC "elm.rect.groupchat.text.pad" +#define ENTRY_BUBBLE_STATUS_TIME_PAD_MIN_H_INC 14 +#define ENTRY_BUBBLE_STATUS_TIME_PAD_REL_INC 0.0 1.0 +#define ENTRY_BUBBLE_READ_STATUS_TIME_PAD_REL_INC 1.0 1.0 +#define ENTRY_BUBBLE_STATUS_TIME_SIZE_INC 22 +#define ENTRY_BUBBLE_SENT_STATUS_TIME_COLOR_INC 139 139 139 255 +#define ENTRY_BUBBLE_READ_STATUS_TIME_COLOR_INC 139 139 139 255 +#define ENTRY_BUBBLE_GROUPCHAT_SIZE_INC 24 +#define ENTRY_BUBBLE_GROUPCHAT_COLOR_INC 139 139 139 255 +#define ENTRY_BUBBLE_GROUPCHART_ENABLE_INC 1 +#define ENTRY_BUBBLE_GROUPCHART_PAD 36 30 +#define ENTRY_BUBBLE_GROUPCHART_WITH_CALLERID_PAD 158 30 +#define ENTRY_BUBBLE_READ_STATUS_REL_INC 1.0 0.0 +#define ENTRY_BUBBLE_READ_TIME_REL_INC 1.0 1.0 + +#define PANES_DEFAULT_FIXED_SEPERATOR_NORMAL_COLOR_INC 118 118 118 255 + +#define DAYSELECTOR_BACKGROUND_COLOR_INC 82 84 87 255 +#define DAYSELECTOR_WEEKDAY_COLOR_INC 249 249 249 255 +#define DAYSELECTOR_SATURDAY_COLOR_INC 0 168 231 255 +#define DAYSELECTOR_SUNDAY_COLOR_INC 7 180 211 255 +#define DAYSELECTOR_DAY_PRESSED_COLOR_INC 249 249 249 255 +#define DAYSELECTOR_DAY_FONT_SIZE_INC 32 +#define DAYSELECTOR_CHECK_WIDTH_INC 94 +#define DAYSELECTOR_CHECK_HEIGHT_INC 90 + +#define SLIDER_INDICATOR_TEXT_COLOR_INC 59 115 182 255 +#define SLIDER_INDICATOR_TEXT_PRESSED_COLOR_INC 255 255 255 255 +#define SLIDER_UNITS_TEXT_COLOR_INC 0 0 0 255 +#define SLIDER_UNITS_TEXT_SIZE_INC 30 +#define SLIDER_INDICATOR_TEXT_SIZE_INC 40 +#define SLIDER_BASE_HEIGHT_INC 34 +#define SLIDER_BASE_MIN_WIDTH_INC 375 +#define SLIDER_SWALLOW_BAR_MIN_WIDTH_INC 72 +#define SLIDER_SWALLOW_BAR_HEIGHT_INC 74 +#define SLIDER_INDICATOR_MAX_WIDTH_INC 90 +#define SLIDER_INDICATOR_WIDTH_INC 72 +#define SLIDER_INDICATOR_HEIGHT_INC 72 +#define SLIDER_EBOOK_HEIGHT_INC 23 +#define SLIDER_EBOOK_UNITS_TEXT_COLOR_INC 164 160 149 255 +#define SLIDER_EBOOK_UNITS_TEXT_SIZE_INC 48 +#define SLIDER_EBOOK_INDICATOR_TEXT_COLOR_INC 7 180 211 255 +#define SLIDER_EBOOK_INDICATOR_DEFAULT_TEXT_SIZE_INC 36 +#define SLIDER_EBOOK_INDICATOR_DRAG_TEXT_SIZE_INC 48 +#define SLIDER_EBOOK_INDICATOR_WIDTH_INC 54 +#define SLIDER_EBOOK_INDICATOR_HEIGHT_INC 54 + +#define TICKER_NOTI_DEFAULT_TEXT_COLOR_INC "#ffffff" +#define TICKER_NOTI_DEFAULT_TEXT2_COLOR_INC "#ffffff" + +#define DATETIME_FIELD_MIN_SIZE_INC 48 112 +#define DATETIME_SEPARATOR_MIN_SIZE_INC 18 112 +#define DATETIME_TEXT_FONT_SIZE_INC 36 +#define DATETIME_TEXT_NORMAL_COLOR_INC 0 0 0 255 +#define DATETIME_SEPARATOR_TEXT_COLOR_INC 150 150 150 255 +#define DATETIME_TEXT_SELECTED_COLOR_INC 255 255 255 255 +#define DATETIME_LABEL_TEXT_BLOCK_STYLE_COLOR_INC 0 0 0 255 +#define DATETIME_LABEL_TEXT_BLOCK_STYLE_SELECTED_COLOR_INC 59 115 182 255 + +#define COLORSELECTOR_MIN_W_INC 688 +#define COLORSELECTOR_MIN_H_INC 336 +#define COLORSELECTOR_MAX_W_INC 1014 +#define COLORSELECTOR_COLORBAR_HEIGHT 112 +#define COLORSELECTOR_COLORBAR_LEFT_PADDING 122 +#define COLORSELECTOR_COLORBAR_RIGHT_PADDING 122 +#define COLORSELECTOR_BUTTON_TOP_PADDING 19 +#define COLORSELECTOR_ARROW_BG_LEFT_PADDING 120 +#define COLORSELECTOR_ARROW_BG_RIGHT_PADDING 120 +#define COLORSELECTOR_ARROW_MIN_WIDTH 22 +#define COLORSELECTOR_ARROW_MIN_HEIGHT 70 +#define COLORSELECTOR_ARROW_REL1_OFFSET 0 5 +#define COLORSELECTOR_ARROW_REL2_OFFSET 0 5 +#define COLORSELECTOR_DRAGGABLE_EVENT_AREA 80 80 +#define COLORSELECTOR_BUTTON_LEFT_PADDING 32 +#define COLORSELECTOR_BUTTON_RIGHT_PADDING 32 +#define COLORSELECTOR_BUTTON_WIDTH 74 +#define COLORSELECTOR_BUTTON_HEIGHT 74 +#define COLORSELECTOR_BUTTON_BORDER 6 6 6 6 +#define COLORSELECTOR_PADDING_COLOR_INC 225 223 218 255 + +#define COLORSELECTOR_PALETTE_COLORBG_MIN_WIDTH_INC 86 +#define COLORSELECTOR_PALETTE_COLORBG_MIN_HEIGHT_INC 86 +#define COLORSELECTOR_PALETTE_COLORBG_FOCUS_MIN_WIDTH_INC 84 +#define COLORSELECTOR_PALETTE_COLORBG_FOCUS_MIN_HEIGHT_INC 84 +#define COLORSELECTOR_PORTRAIT_HOR_PAD_INC "50" +#define COLORSELECTOR_PORTRAIT_VER_PAD_INC "20" +#define COLORSELECTOR_LANDSCAPE_HOR_PAD_INC "36" +#define COLORSELECTOR_LANDSCAPE_VER_PAD_INC "0" +#define COLORSELECTOR_PALETTE_BORDER_INC 11 11 11 11 + +#define CALENDAR_DAY_FONT_SIZE_INC 24 +#define CALENDAR_DATE_FONT_SIZE_INC 32 +#define CALENDAR_MONTH_FONT_SIZE_INC 38 +#define CALENDAR_MONTH_FONT_COLOR_INC 249 249 249 255 +#define CALENDAR_SATURDAY_FONT_COLOR_INC 47 120 220 255 +#define CALENDAR_SUNDAY_FONT_COLOR_INC 226 20 20 255 +#define CALENDAR_WEEKDAY_FONT_COLOR_INC 249 249 249 255 +#define CALENDAR_SELECTED_DATE_FONT_COLOR_INC 255 255 255 255 +#define CALENDAR_SEPERATOR_FONT_COLOR_INC 68 68 68 255 +#define CALENDAR_BACKGROUND_COLOR_INC 89 89 89 255 +#define CALENDAR_BUTTON_HEIGHT_INC 66 +#define CALENDAR_BUTTON_WIDTH_INC 74 +#define CALENDAR_ARROW_WIDTH_INC 30 +#define CALENDAR_ARROW_HEIGHT_INC 36 +#define CALENDAR_BASE_MIN_WIDTH_INC 692 +#define CALENDAR_BASE_MIN_HEIGHT_INC 420 +#define CALENDAR_HEADER_MIN_WIDTH_INC 98 +#define CALENDAR_HEADER_MIN_HEIGHT_INC 90 + +#define CTXPOPUP_ENTRY_CENTER_IMAGE_BORDER 12 12 9 9 +#define CTXPOPUP_ENTRY_IMAGE_BORDER_WIDTH 12 +#define CTXPOPUP_ENTRY_ITEM_TEXT_COLOR 249 249 249 255 +#define CTXPOPUP_ENTRY_ITEM_LEFT_SEPARATOR_COLOR 68 68 68 255 +#define CTXPOPUP_ENTRY_ITEM_RIGHT_SEPARATOR_COLOR 0 0 0 255 +#define CTXPOPUP_ENTRY_SEPARATOR_WIDTH 1 +#define CTXPOPUP_ENTRY_SEPARATOR_HEIGHT 50 +#define CTXPOPUP_ENTRY_ITEM_HEIGHT 74 +#define CTXPOPUP_ENTRY_ITEM_PADDING_WIDTH 14 +#define CTXPOPUP_ENTRY_ITEM_FONT_SIZE 28 +#define CTXPOPUP_ENTRY_ICON_SIZE 58 +#define CTXPOPUP_ENTRY_ITEM_WIDTH_MAX 240 +#define CTXPOPUP_ENTRY_LIST_SHADOW_PADDING 3 +#define CTXPOPUP_ENTRY_ITEM_DISABLED_COLOR 200 200 200 127 +#define CTXPOPUP_ENTRY_ARROW_SIZE_HEIGHT 18 +#define CTXPOPUP_ENTRY_ARROW_SIZE_WIDTH 29 + +#define TICKERNOTI_DEFAULT_BG_MIN_HEIGHT_INC 100 +#define TICKERNOTI_DEFAULT_BG_TOTAL_MIN_HEIGHT_INC 112 +#define TICKERNOTI_DEFAULT_BG_BORDER_INC 2 2 2 14 +#define TICKERNOTI_DEFAULT_BG_PADDING_LEFT_TOP_INC 16 18 +#define TICKERNOTI_DEFAULT_BG_PADDING_RIGHT_BOTTOM_INC 16 18 +#define TICKERNOTI_DEFAULT_PADDING_AFTER_ICON_INC 16 0 +#define TICKERNOTI_DEFAULT_TEXT_MIN_INC 0 60 +#define TICKERNOTI_DEFAULT_BUTTON_MIN_INC 154 74 +#define TICKERNOTI_DEFAULT_BUTTON_MAX_INC 154 74 +#define TICKERNOTI_DEFAULT_ICON_MIN_INC 64 64 +#define TICKERNOTI_DEFAULT_PADDING_BEFORE_BUTTON_INC 16 0 +#define TICKERNOTI_DEFAULT_TEXT_FONT_SIZE_INC 30 +#define TICKERNOTI_DEFAULT_TEXT2_FONT_SIZE_INC 24 +#define TICKERNOTI_INFO_BG_MIN_HEIGHT_INC 60 +#define TICKERNOTI_INFO_BG_PADDING_LEFT_TOP_INC 8 5 +#define TICKERNOTI_INFO_BG_PADDING_RIGHT_BOTTOM_INC 8 5 +#define TICKERNOTI_BG_PADDING_AFTER_ICON_INC 15 0 +#define TICKERNOTI_INFO_TEXT_FONT_SIZE_INC 28 +#define TICKERNOTI_TEXT_ONLY_TEXT_MIN_INC 0 64 + +#define SCROLLER_DEFAULT_SCROLLBAR_VBAR_IMAGE "00_scroll_bar.png" +#define SCROLLER_DEFAULT_SCROLLBAR_HBAR_IMAGE "00_scroll_bar.png" +#define SCROLLER_DEFAULT_SCROLLBAR_VBAR_IMAGE_BORDER 5 10 5 10 +#define SCROLLER_DEFAULT_SCROLLBAR_HBAR_IMAGE_BORDER 5 10 5 10 +#define SCROLLER_DEFAULT_SCROLLBAR_VBAR_MIN_SIZE_INC 16 238 +#define SCROLLER_DEFAULT_SCROLLBAR_VBAR_MAX_SIZE_INC 16 99999 +#define SCROLLER_DEFAULT_SCROLLBAR_HBAR_MIN_SIZE_INC 208 16 +#define SCROLLER_DEFAULT_SCROLLBAR_HBAR_MAX_SIZE_INC 99999 16 +#define SCROLLER_DEFAULT_SCROLLBAR_VBAR_PADDING_SIZE 6 +#define SCROLLER_DEFAULT_SCROLLBAR_HBAR_PADDING_SIZE 6 +#define SCROLLER_MATCHLIST_SCROLLBAR_VBAR_IMAGE "00_scroll_bar.png" +#define SCROLLER_MATCHLIST_SCROLLBAR_HBAR_IMAGE "00_scroll_bar.png" +#define SCROLLER_MATCHLIST_SCROLLBAR_BG_IMAGE_BORDER 13 13 10 15 +#define SCROLLER_MATCHLIST_SCROLLBAR_VBAR_PADDING_SIZE 6 +#define SCROLLER_MATCHLIST_SCROLLBAR_HBAR_PADDING_SIZE 16 +#define SCROLLER_MATCHLIST_SCROLLBAR_VBAR_MIN_SIZE_INC 16 238 +#define SCROLLER_MATCHLIST_SCROLLBAR_VBAR_MAX_SIZE_INC 16 99999 +#define SCROLLER_MATCHLIST_SCROLLBAR_HBAR_MIN_SIZE_INC 180 16 +#define SCROLLER_MATCHLIST_SCROLLBAR_HBAR_MAX_SIZE_INC 99999 16 +#define SCROLLER_MATCHLIST_SCROLLBAR_VBAR_RUNNER_BORDER 0 0 4 4 +#define SCROLLER_MATCHLIST_SCROLLBAR_HBAR_RUNNER_BORDER 4 4 0 0 +#define SCROLLER_MATCHLIST_SCROLLBAR_VBAR_IMAGE_BORDER 5 10 5 10 +#define SCROLLER_MATCHLIST_SCROLLBAR_HBAR_IMAGE_BORDER 5 10 5 10 +#define SCROLLER_MATCHLIST_SCROLLBAR_VBAR_OVER1 6 6 6 0 +#define SCROLLER_MATCHLIST_SCROLLBAR_VBAR_OVER2 6 6 6 0 +#define SCROLLER_MATCHLIST_SCROLLBAR_HBAR_OVER1 6 6 6 0 +#define SCROLLER_MATCHLIST_SCROLLBAR_HBAR_OVER2 6 6 6 0 +#define SCROLLER_PHOTOCAM_SCROLLBAR_VBAR_IMAGE "00_scroll_bar.png" +#define SCROLLER_PHOTOCAM_SCROLLBAR_HBAR_IMAGE "00_scroll_bar.png" +#define SCROLLER_PHOTOCAM_SCROLLBAR_VBAR_PADDING_SIZE 6 +#define SCROLLER_PHOTOCAM_SCROLLBAR_HBAR_PADDING_SIZE 16 +#define SCROLLER_PHOTOCAM_SCROLLBAR_VBAR_MIN_SIZE_INC 16 238 +#define SCROLLER_PHOTOCAM_SCROLLBAR_VBAR_MAX_SIZE_INC 16 99999 +#define SCROLLER_PHOTOCAM_SCROLLBAR_HBAR_MIN_SIZE_INC 180 16 +#define SCROLLER_PHOTOCAM_SCROLLBAR_HBAR_MAX_SIZE_INC 99999 16 +#define SCROLLER_PHOTOCAM_SCROLLBAR_VBAR_RUNNER_BORDER 0 0 4 4 +#define SCROLLER_PHOTOCAM_SCROLLBAR_HBAR_RUNNER_BORDER 4 4 0 0 +#define SCROLLER_PHOTOCAM_SCROLLBAR_VBAR_IMAGE_BORDER 5 10 5 10 +#define SCROLLER_PHOTOCAM_SCROLLBAR_HBAR_IMAGE_BORDER 5 10 5 10 +#define SCROLLER_PHOTOCAM_SCROLLBAR_VBAR_OVER1 6 6 6 0 +#define SCROLLER_PHOTOCAM_SCROLLBAR_VBAR_OVER2 6 6 6 0 +#define SCROLLER_PHOTOCAM_SCROLLBAR_HBAR_OVER1 6 6 6 0 +#define SCROLLER_PHOTOCAM_SCROLLBAR_HBAR_OVER2 6 6 6 0 +#define SCROLLER_HANDLER_SCROLLBAR_VBAR_MIN_SIZE_INC 54 220 +#define SCROLLER_HANDLER_SCROLLBAR_HBAR_MIN_SIZE_INC 220 54 +#define SCROLLER_HANDLER_SCROLLBAR_VBAR_MIDDLE_MIN_SIZE_INC 54 26 +#define SCROLLER_HANDLER_SCROLLBAR_HBAR_MIDDLE_MIN_SIZE_INC 26 54 +#define SCROLLER_HANDLER_SCROLLBAR_PADDING_INC 4 +#define SCROLLER_HANDLER_SCROLLBAR_VBAR_BOTTOM_BORDER 10 10 0 10 +#define SCROLLER_HANDLER_SCROLLBAR_VBAR_RIGHT_BORDER 0 10 10 10 + +#define TOOLBAR_ITEM_SEPARATOR_LEFT_COLOR_INC 53 53 53 255 +#define TOOLBAR_ITEM_SEPARATOR_MIDDLE_COLOR_INC 0 0 0 255 +#define TOOLBAR_ITEM_SEPARATOR_RIGHT_COLOR_INC 25 25 25 255 +#define TOOLBAR_ITEM_BG_REL1_OFFSET_INC 4 4 +#define TOOLBAR_ITEM_BG_REL2_OFFSET_INC -5 -5 +#define TOOLBAR_ITEM_BG_SELECTED_BORDER_INC 3 3 3 3 +#define TABBAR_ITEM_TEXTBLOCK_COLOR_INC "#999999" +#define TABBAR_ITEM_SELECTED_TEXTBLOCK_COLOR_INC "#3b73b6" +#define TABBAR_ITEM_BG_DEFAULT_BORDER_INC 9 9 9 9 +#define TABBAR_ITEM_BG_DEFAULT_VISIBLE_INC 0 +#define TABBAR_ITEM_BG_DEFAULT_COLOR_INC 255 255 255 0 +#define TABBAR_DEFAULT_HEIGHT_INC 111 +#define TABBAR_ICON_TEXT_HEIGHT_INC 111 +#define TABBAR_HORIZONTAL_HEIGHT_INC 91 +#define TABBAR_HORIZONTAL_ICON_TEXT_HEIGHT_INC 91 +#define TABBAR_ITEM_ICON_SIZE_INC 68 68 +#define TABBAR_ITEM_SMALL_ICON_SIZE_INC 44 44 + +#define CONFORMANT_INDICATOR_BG_DEFAULT_COLOR_INC 52 52 50 255 +#define CONFORMANT_INDICATOR_BG_TRANSLUCENT_COLOR_INC 0 0 0 125 +#define CONFORMANT_INDICATOR_BG_TRANSPARENT_COLOR_INC 0 0 0 0 + +#endif /* __TIZEN_HD_INC__ */ + diff --git a/ug/channel/edje/ug_auto_program.edc b/ug/channel/edje/ug_auto_program.edc new file mode 100644 index 0000000..8dd12fb --- /dev/null +++ b/ug/channel/edje/ug_auto_program.edc @@ -0,0 +1,735 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/defs.h" + +collections { + group { + name: GRP_SCAN_START; + styles { + style { name: "title_text_style"; + base: "font=TizenSans font_size=24 align=left color=#ffffff wrap=word"; + tag: "br" "\n"; + tag: "tab" "\t"; + } + } + parts { + part { + name: padding_left_top; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: (434+102.5*2) (208+43*2); + visible: 0; + } + } + part { + name: bg_effect_area; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_left_top; + relative: 1.0 1.0; + } + rel2 { + to: padding_left_top; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 1076 698; + fixed: 1 1; + visible: 0; + } + } + part { + name: padding_text; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg_effect_area; + relative: 0.0 0.0; + } + rel2 { + to: bg_effect_area; + relative: 0.0 0.0; + } + min: 70 50; + max: 70 50; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name, PART_STAR_MAIN_TITLE_BLOCK; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_text; + relative: 1.0 1.0; + } + rel2 { + to: padding_text; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 936 60; + fixed: 1 1; + text { + style: "title_text_style"; + align: 0.0 0.0; + } + color: 255 255 255 165.75; + visible: 1; + } + } + part { + name: padding_list; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 70 (50+60+39+40); + rel1 { + to: bg_effect_area; + relative: 0.0 0.0; + } + rel2 { + to: bg_effect_area; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: PART_ANTENNA_LIST; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_list; + relative: 1.0 1.0; + } + rel2 { + to: padding_list; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 680 82*3; + fixed: 1 1; + } + } + part { + name: padding_start_btn; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg_effect_area; + relative: 0.0 0.0; + } + rel2 { + to: bg_effect_area; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: (70+680+40) (50+60+39+40); + visible: 0; + } + } + part { + name: PART_START_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_start_btn; + relative: 1.0 1.0; + } + rel2 { + to: padding_start_btn; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 216 70; + max: 216 70; + } + } + part { + name: padding_cancel_btn; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_START_BTN; + relative: 0.0 1.0; + } + rel2 { + to: PART_START_BTN; + relative: 0.0 1.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 216 10; + max: 216 10; + visible: 0; + } + } + part { + name: PART_CANCEL_BTN; + type: SWALLOW; + scale: 1; + description { + state, "default" 0.0; + rel1 { + to: padding_cancel_btn; + relative: 0.0 1.0; + } + rel2 { + to: padding_cancel_btn; + relative: 0.0 1.0; + } + align: 0.0 0.0; + min: 216 70; + max: 216 70; + } + } + } + } + + group { + name: GROUP_SRCH; + styles { + style { name: "search_textblock_style"; + base: "font=TizenSans font_size=24 align=left color=#ffffff wrap=word"; + tag: "br" "\n"; + tag: "tab" "\t"; + } + } + parts { + part { + name: padding_left_top; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: (434+102.5*2) (208+43*2); + visible: 0; + } + } + part { + name: bg_effect_area; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_left_top; + relative: 1.0 1.0; + } + rel2 { + to: padding_left_top; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 1076 698; + fixed: 1 1; + visible: 0; + } + } + part { + name: padding_text; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg_effect_area; + relative: 0.0 0.0; + } + rel2 { + to: bg_effect_area; + relative: 0.0 0.0; + } + min: 70 50; + max: 70 50; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: PART_SRCH_MAIN_TITLE; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_text; + relative: 1.0 1.0; + } + rel2 { + to: padding_text; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 936 60; + fixed: 1 1; + text { + style: "search_textblock_style"; + align: 0.0 0.0; + } + color: 255 255 255 165.75; + visible: 1; + } + } + part { + name: padding_progressbar; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg_effect_area; + relative: 0.0 0.0; + } + rel2 { + to: bg_effect_area; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 70 (50+60+115+60); + visible: 0; + } + } + part { + name: PART_PROGRESSBAR; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_progressbar; + relative: 1.0 1.0; + } + rel2 { + to: padding_progressbar; + relative: 1.0 1.0; + } + align: 0.0 0.5; + fixed: 1 1; + min: 936 8; + visible: 1; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: PART_CH_NAME; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + color: 211 211 211 204; + text { + font: TizenSans; + size: 30; + align: 0.0 0.5; + } + rel1 { + to: PART_PROGRESSBAR; + relative, 0.0 0.0; + } + rel2 { + to: PART_PROGRESSBAR; + relative, 0.0 0.0; + } + align: 0.0 1.0; + min: 160 60; + fixed: 1 1; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 253 217 16 255; + } + } + part { + name: PART_PGBAR_NUM; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + color: 211 211 211 204; + text { + font: TizenSans; + size: 30; + align: 1.0 0.5; + } + rel1 { + relative: 1.0 0.0; + to: PART_PROGRESSBAR; + } + rel2 { + relative: 1.0 0.0; + to: PART_PROGRESSBAR; + } + align: 1.0 1.0; + min: 100 60; + fixed: 1 1; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 253 217 16 255; + } + } + part { + name: PART_SRCH_SEARCH_RESULT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + color: 211 211 211 204; + text { + font: TizenSans; + size: 30; + align: 0.0 0.5; + } + rel1 { + to: PART_PROGRESSBAR; + relative: 0.0 1.0; + } + rel2 { + to: PART_PROGRESSBAR; + relative: 0.0 1.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 300 90; + } + } + part { + name: padding_stop_btn; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg_effect_area; + relative: 0.0 0.0; + } + rel2 { + to: bg_effect_area; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 70 (50+60+115+60+8+90+105); + visible: 0; + } + } + part { + name: PART_STOP_BTN; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_stop_btn; + relative: 1.0 1.0; + } + rel2 { + to: padding_stop_btn; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 216 70; + max: 216 70; + fixed: 1 1; + } + } + part { + name: PART_EXIT_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_stop_btn; + relative: 1.0 1.0; + } + rel2 { + to: padding_stop_btn; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 216 70; + max: 216 70; + fixed: 1 1; + } + } + part { + name: padding_cancel_btn; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_EXIT_BTN; + relative: 1.0 0.0; + } + rel2 { + to: PART_EXIT_BTN; + relative: 1.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 20 70; + max: 20 70; + visible: 0; + } + } + part { + name: cancel_btn_bg; + type: RECT; + scale: 1; + description { + state, "default" 0.0; + rel1 { + to: padding_cancel_btn; + relative: 1.0 0.0; + } + rel2 { + to: padding_cancel_btn; + relative: 1.0 0.0; + } + align: 0.0 0.0; + min: 216 70; + max: 216 70; + visible: 0; + } + } + part { + name: PART_SRCH_CANCEL_BTN; + type: SWALLOW; + repeat_events: 1; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: cancel_btn_bg; + relative: 0.0 0.0; + } + rel2 { + to: cancel_btn_bg; + relative: 1.0 1.0; + } + align: 0.5 0.5; + min: 216 70; + max: 216 70; + fixed: 1 1; + } + } + } + programs { + program { + name: "searchchannel"; + signal: SEARCHCHANNEL; + source: SUBTEXT_SOURCE; + action: STATE_SET "default" 0.0; + target: PART_CH_NAME; + } + program { + name: "channelfound"; + signal: CHANNELFOUND; + source: SUBTEXT_SOURCE; + action: STATE_SET "highlight" 0.0; + target: PART_CH_NAME; + } + } + } + + group { + name: GROUP_RES; + styles { + style { name: "result_textblock_style"; + base: "font=TizenSans font_size=24 align=left color=#ffffff wrap=word"; + tag: "br" "\n"; + tag: "tab" "\t"; + } + } + parts { + part { + name: padding_left_top; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: (434+102.5*2) (208+43*2); + visible: 0; + } + } + part { + name: bg_effect_area; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_left_top; + relative: 1.0 1.0; + } + rel2 { + to: padding_left_top; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 1076 698; + fixed: 1 1; + visible: 0; + } + } + part { + name: padding_text; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg_effect_area; + relative: 0.0 0.0; + } + rel2 { + to: bg_effect_area; + relative: 0.0 0.0; + } + min: 70 50; + max: 70 50; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: PART_RES_MAIN_TITLE; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_text; + relative: 1.0 1.0; + } + rel2 { + to: padding_text; + relative: 1.0 1.0; + } + align: 0.0 0.0; + text { + style: "result_textblock_style"; + align: 0.0 0.0; + } + min: 936 60; + color: 255 255 255 165.75; + } + } + part { + name: padding_ok_btn; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg_effect_area; + relative: 0.0 0.0; + } + rel2 { + to: bg_effect_area; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 70 (50+60+378); + visible: 0; + } + } + part { + name: PART_OK_BTN; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { + state, "default" 0.0; + rel1 { + to: padding_ok_btn; + relative: 1.0 1.0; + } + rel2 { + to: padding_ok_btn; + relative: 1.0 1.0; + } + align: 0.0 0.0; + min: 216 70; + max: 216 70; + } + } + } + } +} diff --git a/ug/channel/edje/ug_auto_program_theme.edc b/ug/channel/edje/ug_auto_program_theme.edc new file mode 100644 index 0000000..45e76ce --- /dev/null +++ b/ug/channel/edje/ug_auto_program_theme.edc @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tizen-hd-inc.edc" +#include "../include/defs.h" + +collections { + + #include "widgets/button.edc" + #include "widgets/progressbar.edc" + +} diff --git a/ug/channel/edje/widgets/button.edc b/ug/channel/edje/widgets/button.edc new file mode 100644 index 0000000..959ccee --- /dev/null +++ b/ug/channel/edje/widgets/button.edc @@ -0,0 +1,510 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "elm/button/base/basic_btn_style"; + images { + image: IMAGE_ROUND_RECT COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 216 70; + image { + normal: IMAGE_ROUND_RECT; + border: 4 4 4 4; + border_scale: 1; + } + color: 204 204 204 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 204 204 204 102; + } + } + part { + name: "bg_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 176 70; + rel1 { + to: "bg_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "bg_text_padding"; + relative: 1.0 1.0; + } + text { + size: 28; + align: 0.5 0.5; + } + color: 89 89 89 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 102; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + } +} + +group { + name: "elm/button/base/listitem"; + images { + image: IMAGE_RADIO_DARK_OFF COMP; + image: IMAGE_RADIO_DARK_ON COMP; + image: IMAGE_RADIO_BRIGHT_OFF COMP; + image: IMAGE_RADIO_BRIGHT_ON COMP; + } + parts { + part { + name: "bg_withline"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 680 82; + color: 221 224 228 255; + } + } + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 680 80; + rel1 { + to: "bg_withline"; + relative: 0.0 0.0; + } + rel2 { + to: "bg_withline"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + color: 221 224 228 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "pad_line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 80; + rel1 { + to: "bg_withline"; + relative: 0.0 0.0; + } + rel2 { + to: "bg_withline"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: "line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 680 2; + rel1 { + to: "pad_line"; + relative: 1.0 1.0; + } + rel2 { + to: "pad_line"; + relative: 1.0 1.0; + } + fixed: 1 1; + align: 0.0 0.0; + color: 89 89 89 51; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + color: 221 224 228 255; + } + } + part { + name: "pad_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + min: 41 0; + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 545 80; + rel1 { + to: "pad_text"; + relative: 1.0 1.0; + } + rel2 { + to: "pad_text"; + relative: 1.0 1.0; + } + text { + font: FONT_STYLE_REGULAR; + size: 30; + align: 0.0 0.5; + } + color: 89 89 89 255; + fixed: 1 1; + align: 0.0 0.0; + visible: 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "pad_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + min: 545+41+20 21; + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: "elm.icon"; + scale: 1; + description { + state: "default" 0.0; + min: 38 38; + rel1 { + to: "pad_icon"; + relative: 1.0 1.0; + } + rel2 { + to: "pad_icon"; + relative: 1.0 1.0; + } + image.normal: IMAGE_RADIO_BRIGHT_OFF; + fixed: 1 1; + align: 0.0 0.0; + aspect: 1.0 1.0; + visible: 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_RADIO_DARK_OFF; + visible: 1; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + image.normal: IMAGE_RADIO_BRIGHT_ON; + visible: 1; + } + description { + state: "highlight" 0.1; + inherit: "default" 0.0; + image.normal: IMAGE_RADIO_DARK_ON; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "bg"; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.icon", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,press", ""); + } + } + } + program { + name: "button_mouseup"; + signal: "mouse,up,1"; + source: "bg"; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.icon", st, 30, vl); + if (strcmp(st, "disabled")) { + emit("elm,action,unpress", ""); + } + } + } + program { + name: "button_clicked"; + signal: "mouse,clicked,1"; + source: "bg"; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.icon", st, 30, vl); + if (strcmp(st, "highlight") && strcmp(st, "disabled")) { + emit("elm,action,click", ""); + } + } + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script{ + new st[31]; + new Float: vl; + get_state(PART:"elm.icon", st, 30, vl); + + set_state(PART:"bg", "focused", 0.0); + set_state(PART:"elm.text", "focused", 0.0); + set_state(PART:"line", "focused", 0.0); + if (!strcmp(st, "highlight")) { + set_state(PART:"elm.icon", "highlight", 0.1); + } else { + set_state(PART:"elm.icon", "focused", 0.0); + } + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script{ + new st[31]; + new Float: vl; + get_state(PART:"elm.icon", st, 30, vl); + set_state(PART:"bg", "default", 0.0); + set_state(PART:"line", "default", 0.0); + if (!strcmp(st, "highlight")) { + set_state(PART:"elm.text", "highlight", 0.0); + set_state(PART:"elm.icon", "highlight", 0.0); + } else { + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"elm.icon", "default", 0.0); + } + } + } + program { + name: "select"; + signal: SIGNAL_SELECTED; + source: CHANNEL_SOURCE; + action: STATE_SET "highlight" 0.1; + target: "elm.icon"; + } + program { + name: "unselect"; + signal: SIGNAL_UNSELECTED; + source: CHANNEL_SOURCE; + action: STATE_SET "default" 0.0; + target: "elm.icon"; + target: "elm.text"; + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "elm.icon"; + target: "elm.text"; + } + program { + name: "hideline"; + signal: SIGNAL_HIDELINE; + source: CHANNEL_SOURCE; + action: STATE_SET "hide" 0.0; + target: "line"; + } + program { + name: "showline"; + signal: SIGNAL_SHOWLINE; + source: CHANNEL_SOURCE; + action: STATE_SET "default" 0.0; + target: "line"; + } + } +} \ No newline at end of file diff --git a/ug/channel/edje/widgets/progressbar.edc b/ug/channel/edje/widgets/progressbar.edc new file mode 100644 index 0000000..51b0c83 --- /dev/null +++ b/ug/channel/edje/widgets/progressbar.edc @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "elm/progressbar/horizontal/scan_progress"; + parts { + part { + name: "elm.background.progressbar"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + part { + name: "elm.swallow.bar"; + mouse_events: 0; + scale: 1; + type: SWALLOW; + description { + min: 0 16; + max: 99999 16; + state: "default" 0.0; + rel1 { + to_y: "elm.background.progressbar"; + } + rel2 { + to: "elm.background.progressbar"; + } + } + } + part { + name: "background"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "elm.background.progressbar"; + description { + state: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.swallow.bar"; + relative: 1.0 1.0; + } + color: 255 255 255 25.5; + } + } + part { + name: "elm.progress.progressbar"; + type: RECT; + mouse_events: 0; + scale: 1; + clip_to: "elm.background.progressbar"; + description { + state: "default" 0.0; + min: 0 0; + fixed: 1 0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.0 0.0; + } + rel2 { + to_y: "elm.swallow.bar"; + to_x: "elm.cur.progressbar"; + offset: -1 -1; + } + color: 255 255 255 178.5; + } + description { + state: "invert" 0.0; + inherit: "default" 0.0; + rel1 { + to_y: "elm.swallow.bar"; + to_x: "elm.cur.progressbar"; + } + rel2 { + to: "elm.swallow.bar"; + relative: 1.0 1.0; + } + } + description { + state: "state_begin" 0.0; + inherit: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.swallow.bar"; + relative: 0.1 1.0; + } + } + description { + state: "state_end" 0.0; + inherit: "default" 0.0; + rel1 { + to: "elm.swallow.bar"; + relative: 0.9 0.0; + } + rel2 { + to: "elm.swallow.bar"; + relative: 1.0 1.0; + } + } + } + part { + name: "elm.cur.progressbar"; + mouse_events: 0; + scale: 1; + dragable { + confine: "background"; + x: 1 1 1; + y: 0 0 0; + } + description { + state: "default" 0.0; + min: 0 18; + fixed: 1 1; + visible: 0; + rel1 { + to: "background"; + relative: 0.0 0.0; + } + rel2 { + to: "background"; + relative: 1.0 1.0; + } + } + } + part { + name: "textpadding"; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + visible: 0; + rel1 { + to: "background"; + relative: 1.0 0.0; + } + rel2 { + to: "background"; + relative: 1.0 0.0; + } + align: 0.0 0.0; + min: 32 32; + fixed: 1 1; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + effect: SHADOW BOTTOM; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.5; + to: "textpadding"; + } + rel2 { + relative:1.0 0.5; + to: "textpadding"; + } + align: 0.0 0.0; + color: 255 255 255 255; + text { + font: APP_TEXT_FONT; + size: 18*2; + min: 1 0; + text_class: "tizen"; + } + fixed: 1 1; + } + } + } +} diff --git a/ug/channel/include/dbg.h b/ug/channel/include/dbg.h new file mode 100644 index 0000000..6e6cd9d --- /dev/null +++ b/ug/channel/include/dbg.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DBG_H__ + + +#include + + +#ifndef _ERR +#define _ERR(fmt, args...) LOGE("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#ifndef _DBG +#define _DBG(fmt, args...) LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#ifndef _INFO +#define _INFO(fmt, args...) LOGI("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + + +#endif /* __DBG_H__ */ diff --git a/ug/channel/include/defs.h b/ug/channel/include/defs.h new file mode 100644 index 0000000..3962ad3 --- /dev/null +++ b/ug/channel/include/defs.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DEFS_H__ +#define __DEFS_H__ + +#define VIEW_START "scanstart" +#define VIEW_SEARCH "searchpage" +#define VIEW_RESULT "resultpage" +#define BTN_STYLE "basic_btn_style" +#define ITEM_STYLE "listitem" +#define PRGBAR_STYLE "scan_progress" +#define INVISIBLE "invisible" + +#define START_MAIN_TITLE _("Connect TV cable to antennal/cable "\ + "input socket behind the TV to start tuning.
"\ + "You can search all available channels. Press Start to "\ + "search and store channels") +#define SEARCH_MAIN_TITLE _("Auto Program is finding channels for "\ + "you ...
To skip current step, press \"Stop\" button") +#define PAUSE_MAIN_TITLE _("Stop Auto Program ?") +#define COMPLETE_MAIN_TITLE _("Auto Program complete.") +#define TEXT_CH_MEMORIZED _("channels are memorized") +#define SCAN_CH_NAME _("Channel name") +#define TEXT_CH_FOUND _("found channel") + +/* define for scan view */ +#define GRP_SCAN_START "group_scanstart" +#define PART_STAR_MAIN_TITLE_BLOCK "text_block" +#define PART_STAR_SUB_TITLE "star_sub_title" +#define PART_ANTENNA_LIST "antenna_list" +#define PART_START_BTN "start_btn" +#define PART_CANCEL_BTN "cancel_btn" + +#define IMAGE_ROUND_RECT "round_rectangle_4X4.png" +#define IMAGE_RADIO_DARK_OFF "radiobtn_off_dark.png" +#define IMAGE_RADIO_DARK_ON "radiobtn_on_dark.png" +#define IMAGE_RADIO_BRIGHT_OFF "radiobtn_off_br.png" +#define IMAGE_RADIO_BRIGHT_ON "radiobtn_on_br.png" + +#define SIGNAL_CLICKED "clicked" +#define SIGNAL_FOCUSED "elm,action,focus" +#define SIGNAL_UNFOCUSED "elm,action,unfocus" +#define SIGNAL_SELECTED "SIGNAL_SELECTED" +#define SIGNAL_UNSELECTED "SIGNAL_UNSELECTED" +#define SIGNAL_HIDELINE "SIGNAL_HIDELINE" +#define SIGNAL_SHOWLINE "SIGNAL_SHOWLINE" +#define CHANNEL_SOURCE "CHANNEL_SOURCE" +#define ELM_SOURCE "elm" + +/* define for search view */ +#define GROUP_SRCH "group_search" +#define PART_SRCH_MAIN_TITLE "text" +#define PART_SRCH_SUB_TITLE "srch_sub_title" +#define PART_PROGRESSBAR "part_progressbar" +#define PART_CH_NAME "channel_name" +#define PART_PGBAR_NUM "pgbar_percent" +#define PART_SRCH_SEARCH_RESULT "search_channels_num" +#define PART_STOP_BTN "stop_btn" +#define PART_EXIT_BTN "stop2_btn" +#define PART_SRCH_CANCEL_BTN "srch_cancel_btn" + +/* result view */ +#define GROUP_RES "group_result" +#define PART_OK_BTN "ok_btn" +#define PART_RES_MAIN_TITLE "res_main_title" +#define PART_RES_SUB_TITLE "res_sub_title" + +#define TEXT_BTN_START "Start" +#define TEXT_BTN_CANCEL "Cancel" +#define TEXT_BTN_STOP "Stop" +#define CONFIRM_BTN_TEXT "confirm" +#define TEXT_BUTTON_OK "OK" + +#define SEARCHCHANNEL "searchchannel" +#define CHANNELFOUND "channelfound" +#define SUBTEXT_SOURCE "prgbar_ch_num" + +#define PROGRESSBAR_BG "wi_progress_bg.png" +#define PROGRESSBAR_FG "wi_progress_bar.png" +#define BORDER_H1 14 +#define BORDER_H2 14 + +#endif /* __DEFS_H__ */ diff --git a/ug/channel/include/tv_scan.h b/ug/channel/include/tv_scan.h new file mode 100644 index 0000000..ddbf461 --- /dev/null +++ b/ug/channel/include/tv_scan.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TV_SCAN_H__ +#define __TV_SCAN_H__ + +struct tv_scan; + +enum local_mode { + INVALID_LOCAL = -1, + KR_MODE, + US_MODE, + MAX_LOCAL +}; + +enum antenna_mode { + SCAN_TYPE_INVALID = -1, + SCAN_TYPE_ALL, + SCAN_TYPE_CABLE, + SCAN_TYPE_AIR +}; + +struct tv_scan_result { + unsigned int air_dtv; + unsigned int cable_dtv; + unsigned int air_atv; + unsigned int cable_atv; +}; + +struct tv_scan_cbs { + void (*progress_cb)(struct tv_scan *tvs, enum antenna_mode mode, + int count, int num, void *arg); + void (*found_cb)(struct tv_scan *tvs, int count, int num, + const struct tv_scan_result *result, void *arg); + void (*done_cb)(struct tv_scan *tvs, + const struct tv_scan_result *result, void *arg); + + void *data; +}; + +struct tv_scan *tv_scan_init(enum antenna_mode scan_mode); +int tv_scan_fini(struct tv_scan *tvs); +int tv_scan_set_callbacks(struct tv_scan *tvs, struct tv_scan_cbs *cbs); +int tv_scan_start(struct tv_scan *tvs); +int tv_scan_pause(struct tv_scan *tvs); +int tv_scan_resume(struct tv_scan *tvs); +int tv_scan_stop(struct tv_scan *tvs); +int tv_scan_get_total_channel(struct tv_scan *tvs); +struct tv_scan_result *tv_scan_get_result(struct tv_scan *tvs); +int tv_scan_is_stopped(struct tv_scan *tvs); + +#endif /* __TV_SCAN_H__ */ diff --git a/ug/channel/include/ug_auto_program.h b/ug/channel/include/ug_auto_program.h new file mode 100644 index 0000000..c1c4240 --- /dev/null +++ b/ug/channel/include/ug_auto_program.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UG_CHANNEL_SEARCH_VIEW_H_ +#define __UG_CHANNEL_SEARCH_VIEW_H_ + +#include +#include "tv_scan.h" + +struct _ugdata { + Evas_Object *win; + Evas_Object *ugd_base; + ui_gadget_h ug; + struct viewmgr *vmgr; + enum antenna_mode scan_type; + int find_chs; +}; + +#endif/*__UG_CHANNEL_SEARCH_VIEW_H_*/ diff --git a/ug/channel/include/util.h b/ug/channel/include/util.h new file mode 100644 index 0000000..6630dcf --- /dev/null +++ b/ug/channel/include/util.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UTIL_H__ +#define __UTIL_H__ + +Evas_Object *util_add_layout(Evas_Object *parent, const char *file, + const char *group); +Evas_Object *util_add_scroller(Evas_Object *parent, Eina_Bool h_bounce, + Eina_Bool v_bounce); +Evas_Object *util_add_box(Evas_Object *parent, double h, double v); +Evas_Object *util_add_button(Evas_Object *parent, const char *btnstyle, + const char *btnpart, const char *btntext, Eina_Bool flag); +void util_focus_next_set(Evas_Object *obj); + +#endif /* __UTIL_H__ */ diff --git a/ug/channel/include/view_result_page.h b/ug/channel/include/view_result_page.h new file mode 100644 index 0000000..19a49b2 --- /dev/null +++ b/ug/channel/include/view_result_page.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __VIEW_RESULT_PAGE_H__ +#define __VIEW_RESULT_PAGE_H__ + +#include "ug_auto_program.h" +#include "viewmgr_auto_program.h" + +struct view_class *view_resultpage_get_vclass(void); + +#endif /* __VIEW_RESULT_PAGE_H__ */ diff --git a/ug/channel/include/view_scan_start.h b/ug/channel/include/view_scan_start.h new file mode 100644 index 0000000..2625744 --- /dev/null +++ b/ug/channel/include/view_scan_start.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_SCAN_START_H__ +#define __VIEW_SCAN_START_H__ + +#include "ug_auto_program.h" +#include "viewmgr_auto_program.h" + +struct view_class *view_scanstart_get_vclass(void); + +#endif /* __VIEW_SCAN_START_H__ */ diff --git a/ug/channel/include/view_search_page.h b/ug/channel/include/view_search_page.h new file mode 100644 index 0000000..4b9cf21 --- /dev/null +++ b/ug/channel/include/view_search_page.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEW_SEARCHPAGE_H__ +#define __VIEW_SEARCHPAGE_H__ + +#include "ug_auto_program.h" +#include "viewmgr_auto_program.h" + +struct view_class *view_searchpage_get_vclass(void); + +#endif /* __VIEW_SEARCHPAGE_H__ */ diff --git a/ug/channel/include/viewmgr_auto_program.h b/ug/channel/include/viewmgr_auto_program.h new file mode 100644 index 0000000..3815a4d --- /dev/null +++ b/ug/channel/include/viewmgr_auto_program.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VIEWMGR_AUTO_PROGRAM_H__ +#define __VIEWMGR_AUTO_PROGRAM_H__ + +#include +#include + +struct viewmgr { + Eina_List *vlist; + Evas_Object *win; + int count; +}; + +struct view_class { + char *title; + Evas_Object* (*create)(struct viewmgr *vmgr, void *data); + void (*update)(Evas_Object *base); + void (*resume)(Evas_Object *base); + void (*pause)(Evas_Object *base); + void (*terminate)(Evas_Object *base); +}; + +struct viewmgr *viewmgr_init(Evas_Object *win); +void viewmgr_fini(struct viewmgr *vmgr); +int viewmgr_push(struct viewmgr *vmgr, struct view_class *vclass, void *data); +int viewmgr_pop(struct viewmgr *vmgr); +int viewmgr_resume(struct viewmgr *vmgr); +int viewmgr_pause(struct viewmgr *vmgr); +Evas_Object *viewmgr_get_win(struct viewmgr *vmgr); + +#endif /* __VIEWMGR_AUTO_PROGRAM_H__ */ diff --git a/ug/channel/src/tv_scan.c b/ug/channel/src/tv_scan.c new file mode 100644 index 0000000..7d105b2 --- /dev/null +++ b/ug/channel/src/tv_scan.c @@ -0,0 +1,669 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include "dbg.h" +//#include "tv_service_proxy.h" +#include "tv_scan.h" + +#define SIGNAL_HANDLER_INTERVAL 0.1 + +enum tv_scan_state { + SCAN_STATE_READY, + SCAN_STATE_SEARCHING, + SCAN_STATE_PAUSED, + SCAN_STATE_STOPPING, + SCAN_STATE_MAX +}; + +struct tv_scan { + struct tv_scan_cbs cbs; + enum tv_scan_state state; + enum antenna_mode set_mode; +#if 0 + TvServiceScan service_scan; + TvServiceScanType scan_type; +#endif + int ch_count; + int ch_num; + int total_ch; + struct tv_scan_result res; + int is_stopped; + Eina_List *signal_queue; + Ecore_Timer *signal_timer; +}; + +struct _signal_info { +#if 0 + TvServiceScanType scan_type; + TvServiceScanEvent signal; + TvServiceScanEventData signal_data; +#endif +}; + +/** + * Get the scan type according to the setting of scanning mode in the beginning + * + * In this function, it will find the scan state the tv service provided + * accordding to the setting of scanning mode by user + * + * @param[in] mode: The setting of scanning mode in view_scan_start + * @param[out] type: The corresponding scan type provided by tv service + * @return 0 on success otherwise -1 + */ +#if 0 +static int _get_scan_mode(enum antenna_mode mode, TvServiceScanType *type) +{ + switch (mode) { + case SCAN_TYPE_ALL: + *type = TVS_SCAN_ALL_ANALOG_DIGITAL; + break; + case SCAN_TYPE_CABLE: + *type = TVS_SCAN_CABLE_ANALOG_DIGITAL; + break; + case SCAN_TYPE_AIR: + *type = TVS_SCAN_AIR_ANALOG_DIGITAL; + break; + default: + _ERR("Invalid scan mode: %d", mode); + return -1; + } + + return 0; +} +#endif + +/** + * Handling the beginning signal. + * + * When user press the button "start", it will begin scanning, and the tv + * service will return the total number of channels in the first for + * calculating the progress of the progressbar + * + * In this function, it will find the total number of channel signal according + * to the scanning type. + * + * @param[in] tvs: Data handler for tv scan manager. + * @param[in] sinfo: The channel signal information. + */ +static void _handle_begin_signal(struct tv_scan *tvs, + struct _signal_info *sinfo) +{ +#if 0 + if (!tvs || !sinfo) { + _ERR("Invalid argument"); + return; + } + + switch (sinfo->scan_type) { + case TVS_SCAN_ALL_ANALOG_DIGITAL: + tvs->total_ch = sinfo->signal_data.data.l[0] + + sinfo->signal_data.data.l[1]; + break; + case TVS_SCAN_AIR_ANALOG_DIGITAL: + tvs->total_ch = sinfo->signal_data.data.l[0]; + break; + case TVS_SCAN_CABLE_ANALOG_DIGITAL: + tvs->total_ch = sinfo->signal_data.data.l[1]; + break; + default: + _ERR("Invalid scan type"); + break; + } +#endif +} + +/** + * Handle the receiving channel signal. + * + * @param[in] tvs: Data handler for tv scan manager. + * @param[in] sinfo: The channel signal information. + */ +static void _handle_progress_signal(struct tv_scan *tvs, + struct _signal_info *sinfo) +{ +#if 0 + if (!tvs || !sinfo) { + _ERR("Invalid argument"); + return; + } + + tvs->ch_count++; + tvs->ch_num = sinfo->signal_data.data.l[0]; + + if (tvs->cbs.progress_cb) + tvs->cbs.progress_cb(tvs, tvs->set_mode, tvs->ch_count, + tvs->ch_num, tvs->cbs.data); +#endif +} + +/** + * Calculating the number of ATV channle signal or DTV channel signal. + * + * @param[in] atv: A pointer for saving the number of ATV channel signal. + * @param[in] dtv: A pointer for saving the number of DTV channel signal. + * @param[in] sinfo: The channel signal information. + */ +static void _channel_count(unsigned int *atv, unsigned int *dtv, + struct _signal_info *sinfo) +{ +#if 0 + if (!sinfo || !atv || !dtv) { + _ERR("Invalid argument"); + return; + } + + switch (sinfo->signal_data.data.s[1]) { + case TVS_CHANNEL_TYPE_ATV: + *atv += sinfo->signal_data.data.s[2]; + break; + case TVS_CHANNEL_TYPE_DTV: + *dtv += sinfo->signal_data.data.s[3]; + break; + default: + _ERR("Invalid TVS_CHANNEL_TYPE"); + break; + } +#endif +} + +/** + * Handle the found channel signal when tune lock success. + * + * @param[in] tvs: Data handler for tv scan manager. + * @param[in] sinfo: The channel signal information. + */ +static void _handle_found_signal(struct tv_scan *tvs, + struct _signal_info *sinfo) +{ +#if 0 + if (!tvs || !sinfo) { + _ERR("Invalid argument"); + return; + } + + /* judge *param.s[0]: antenna type */ + switch (sinfo->signal_data.data.s[0]) { + case TV_SERVICE_ANTENNA_TYPE_AIR: + _channel_count(&tvs->res.air_atv, + &tvs->res.air_dtv, sinfo); + break; + case TV_SERVICE_ANTENNA_TYPE_CABLE: + _channel_count(&tvs->res.cable_atv, + &tvs->res.cable_dtv, sinfo); + break; + default: + _ERR("Invalid channel type"); + return; + } + + if ((sinfo->signal_data.data.s[2] > 0 || + sinfo->signal_data.data.s[3] > 0) && tvs->cbs.found_cb) + tvs->cbs.found_cb(tvs, tvs->ch_count, tvs->ch_num, &tvs->res, + tvs->cbs.data); +#endif +} + +/** + * Handle the result when scanning is finished. + * + * @param[in] tvs: Data handler for tv scan manager. + * @param[in] sinfo: The channel signal information. + */ +static void _handle_done_signal(struct tv_scan *tvs, + struct _signal_info *sinfo) +{ +#if 0 + if (!tvs || !sinfo) { + _ERR("Invalid argument"); + return; + } + + if (sinfo->signal_data.data.l[0] == TVS_SCAN_SEARCH_FINISH_COMPLETE) { + tvs->state = SCAN_STATE_READY; + + if (tvs->cbs.done_cb) + tvs->cbs.done_cb(tvs, &tvs->res, tvs->cbs.data); + } +#endif +} + +/** + * Handle the receiving signal saved in tvs->signal_queue. + * + * @param[in] data: Data handler for tv scan manager. + */ +static Eina_Bool _handle_signal(void *data) +{ +#if 0 + struct tv_scan *tvs; + struct _signal_info *sinfo; + + if (!data) + return ECORE_CALLBACK_CANCEL; + + tvs = data; + + if (!tvs->signal_queue) + goto stop; + + sinfo = eina_list_data_get(tvs->signal_queue); + if (!sinfo) + goto stop; + + tvs->signal_queue = eina_list_remove_list( + tvs->signal_queue, tvs->signal_queue); + + switch (sinfo->signal) { + case TVS_SCAN_EVENT_SEARCH_BEGIN: + _handle_begin_signal(tvs, sinfo); + break; + case TVS_SCAN_EVENT_SEARCH_CHANNEL: + _handle_progress_signal(tvs, sinfo); + break; + case TVS_SCAN_EVENT_CHANNEL_FOUND: + _handle_found_signal(tvs, sinfo); + break; + case TVS_SCAN_EVENT_SEARCH_FINISH: + _handle_done_signal(tvs, sinfo); + break; + default: + _ERR("Invalid signal"); + break; + } + + free(sinfo); + + if (!tvs->signal_queue) + goto stop; + + return ECORE_CALLBACK_RENEW; + +stop: + tvs->signal_timer = NULL; + return ECORE_CALLBACK_CANCEL; +#endif +} + +/** + * Handle the receiving signal from tv service. + * + * Tv service will send the signal one by one, and the variable Ecore_Timer: + * signal_timer is set for setting the time for dealing with the signal in + * signal_queue at regular intervals. + * + * @param[in] signal: Signal from Tv service. + * @param[in] signal_data: Data handler for tv service sacn event. + * @param[in] data: Data handler for tv scan manager. + */ +#if 0 +static void _signal_received(TvServiceScanEvent signal, + TvServiceScanEventData *signal_data, gpointer data) +{ + struct tv_scan *tvs; + struct _signal_info *sinfo; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + tvs = data; + + sinfo = calloc(1, sizeof(*sinfo)); + if (!sinfo) { + _ERR("calloc failed"); + return; + } + + sinfo->signal = signal; + sinfo->signal_data = *signal_data; + sinfo->scan_type = tvs->scan_type; + + tvs->signal_queue = eina_list_append( + tvs->signal_queue, sinfo); + + if (!tvs->signal_timer) { + tvs->signal_timer = ecore_timer_add(SIGNAL_HANDLER_INTERVAL, + _handle_signal, tvs); + if (!tvs->signal_timer) { + _ERR("add timer failed."); + tvs->signal_queue = eina_list_remove(tvs->signal_queue, + sinfo); + free(sinfo); + return; + } + } +} +#endif + +/** + * Initialize the tv scan manager object + * + * In this function, it will create tv_scan struct object, and get the related + * scan mode (one of TVS_SCAN_ALL_ANALOG_DIGITAL / + * TVS_SCAN_CABLE_ANALOG_DIGITAL / TVS_SCAN_AIR_ANALOG_DIGITAL) + * fron tv service according to the optional setting mode + * (one of AIR / CABLE / ALL) in scan_start view, + * and register TvServiceScan object and set it for variable service_scan, + * and set the initial scan state SCAN_STATE_READY. + * + * @param[in] mode: the setting mode (one of AIR / CABLE / ALL) in + * view_scan_start + * @return The struct tvs or NULL if initialize failed + */ +struct tv_scan *tv_scan_init(enum antenna_mode mode) +{ +#if 0 + struct tv_scan *tvs; + TvServiceScan scan; + TvServiceScanType type; + gint result; + int r; + + tvs = calloc(1, sizeof(*tvs)); + if (!tvs) { + _ERR("calloc failed"); + return NULL; + } + + r = _get_scan_mode(mode, &type); + if (r == -1) { + _ERR("Get scan mode failed"); + free(tvs); + return NULL; + } + + result = tv_service_scan_create(&scan, type); + if (result != TVS_ERROR_OK) { + _ERR("Create Scan failed"); + free(tvs); + return NULL; + } + + tvs->service_scan = scan; + tvs->scan_type = type; + tvs->set_mode = mode; + tvs->state = SCAN_STATE_READY; + + return tvs; +#endif + return NULL; +} + +/** + * Release tv_scan struct resource + * + * In this function, it will release the object in tv_scan struct object, + * include channel information saved in signal_queue and the Ecore_Timer object + * and so on. + * + * @param[in] tvs: Data handler for tv scan manager. + * @return 0 on success otherwise -1 + */ +int tv_scan_fini(struct tv_scan *tvs) +{ +#if 0 + struct _signal_info *sinfo; + + if (!tvs) { + _ERR("Invalid argument"); + return -1; + } + + if (tvs->state != SCAN_STATE_READY) + tv_scan_stop(tvs); + + if (tvs->signal_timer) + ecore_timer_del(tvs->signal_timer); + + EINA_LIST_FREE(tvs->signal_queue, sinfo) + free(sinfo); + + tv_service_scan_destroy(tvs->service_scan); + free(tvs); + +#endif + return 0; +} + +/** + * Register callbacks for tvs struct + * + * @param[in] tvs: Data handler for tv scan manager. + * @param[in] cbs: The registered callbacks for control the scan state + * @return 0 on success otherwise -1 + */ +int tv_scan_set_callbacks(struct tv_scan *tvs, struct tv_scan_cbs *cbs) +{ + if (!tvs || !cbs) { + _ERR("Invalid argument"); + return -1; + } + + tvs->cbs = *cbs; + + return 0; +} + +/** + * Start scanning channels + * + * @param[in] tvs: Data handler for tv scan manager. + * @return 0 on success otherwise -1 + */ +int tv_scan_start(struct tv_scan *tvs) +{ +#if 0 + gint result; + + if (!tvs || !tvs->service_scan) { + _ERR("Invalid argument"); + return -1; + } + + if (tvs->state != SCAN_STATE_READY) { + _ERR("unable state to start scan"); + return -1; + } + + result = tv_service_scan_register_callback(tvs->service_scan, + _signal_received, (gpointer)tvs); + if (result != TVS_ERROR_OK) { + _ERR("register callback failed"); + return -1; + } + + result = tv_service_scan_start(tvs->service_scan); + if (result != TVS_ERROR_OK) { + _ERR("scan start failed"); + return -1; + } + + tvs->state = SCAN_STATE_SEARCHING; + tvs->is_stopped = 0; + tvs->ch_count = 0; + memset(&tvs->res, 0x00, sizeof(tvs->res)); + + return 0; +#endif + return -1; +} + +/** + * Pause the scanning of channels + * + * In this function, it will invoke the pausing function from tv service + * for pausing the scaning and stop sending channel signals. + * + * @param[in] tvs: Data handler for tv scan manager. + * @return 0 on success otherwise -1 + */ +int tv_scan_pause(struct tv_scan *tvs) +{ +#if 0 + gint result; + + if (!tvs || !tvs->service_scan) { + _ERR("Invalid argument"); + return -1; + } + + if (tvs->state != SCAN_STATE_SEARCHING) { + _ERR("unable state to pause scan"); + return -1; + } + + result = tv_service_scan_pause(tvs->service_scan); + if (result != TVS_ERROR_OK) { + _ERR("Pause Scan failed"); + return -1; + } + + tvs->state = SCAN_STATE_PAUSED; + + return 0; +#endif +} + + +/** + * Resume the paused scanning of channels + * + * @param[in] tvs: Data handler for tv scan manager. + * @return 0 on success otherwise -1 + */ +int tv_scan_resume(struct tv_scan *tvs) +{ +#if 0 + gint result; + + if (!tvs || !tvs->service_scan) { + _ERR("Invalid argument"); + return -1; + } + + if (tvs->state != SCAN_STATE_PAUSED) { + _ERR("unable state to resume scan"); + return -1; + } + + result = tv_service_scan_resume(tvs->service_scan); + if (result != TVS_ERROR_OK) { + _ERR("resume Scan failed"); + return -1; + } + + tvs->state = SCAN_STATE_SEARCHING; + + return 0; +#endif + return -1; +} + +/** + * Stop the scanning of channels + * + * Stop the scanning and stop receiving channel signal + * + * @param[in] tvs: Data handler for tv scan manager. + * @return 0 on success otherwise -1 + */ +int tv_scan_stop(struct tv_scan *tvs) +{ +#if 0 + gint result; + + if (!tvs) { + _ERR("Invalid argument"); + return -1; + } + + if (tvs->state == SCAN_STATE_READY) { + _ERR("unable state to stop scan"); + return -1; + } + + result = tv_service_scan_stop(tvs->service_scan); + if (result != TVS_ERROR_OK) { + _ERR("Create Scan failed"); + return -1; + } + + tvs->state = SCAN_STATE_STOPPING; + tvs->is_stopped = 1; + + return 0; +#endif + return -1; +} + +/** + * Get the total number of channel signals saved in + * data handler for tv scan manager + * + * @param[in] tvs: Data handler for tv scan manager. + * @return 0 on success otherwise -1 + */ +int tv_scan_get_total_channel(struct tv_scan *tvs) +{ + if (!tvs) { + _ERR("Invalid argument"); + return -1; + } + + return tvs->total_ch; +} + +/** + * Get the scanning result of channel signals + * + * There are four kinds of channel signals: ATV air, ATV cable, DTV air and + * DTV cable, and the numner of the channel signal is saved in variable + * tvs->res. + * + * @param[in] tvs: Data handler for tv scan manager. + * @return The tv_scan_result struct + */ +struct tv_scan_result *tv_scan_get_result(struct tv_scan *tvs) +{ + if (!tvs) { + _ERR("Invalid argument"); + return NULL; + } + + return &tvs->res; +} + +/** + * Get the state of scanning of channels + * + * Get the state of scanning of channels to judge whether the scanning + * is stopped. + * + * @param[in] tvs: Data handler for tv scan manager. + * @return 0 on success otherwise -1 + */ +int tv_scan_is_stopped(struct tv_scan *tvs) +{ + if (!tvs) { + _ERR("Invalid argument"); + return -1; + } + + return tvs->is_stopped; +} diff --git a/ug/channel/src/ug_auto_program.c b/ug/channel/src/ug_auto_program.c new file mode 100644 index 0000000..14d10eb --- /dev/null +++ b/ug/channel/src/ug_auto_program.c @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UG_MODULE_API +#define UG_MODULE_API __attribute__ ((visibility("default"))) +#endif + +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "viewmgr_auto_program.h" +#include "ug_auto_program.h" +#include "view_scan_start.h" +#include "view_search_page.h" +#include "view_result_page.h" +#include "util.h" + +/** +* Creates the base layout for channel UI gadget +* +* This function supposed to be called after successful initialization +* with ug_init(), When channel UG is created, the create operation is invoked, +* the implementation of create operation is _on_create. +* In this function a base layout will be created for the UI gadget instance. +* (see struct ug_cbs) +* +* @param[in] ug: The channel ui gadget object being created +* @param[in] mode: Mode of UI gadget (UG_MODE_FULLVIEW | UG_MODE_FRAMEVIEW) +* @param[in] service: The handler to the service. +* Each operation will receive this service type data, and the argument service +* is automatically released by UI gadget manager after the UI gadget +* is destroyed. +* @priv[in] priv: The user data passed from the callback registration function. +* +* @return the base layout +*/ +static void *_on_create(ui_gadget_h ug, enum ug_mode mode, + service_h service, void *priv) +{ + Evas_Object *win; + struct _ugdata *ugd; + struct viewmgr *vmgr; + + if (!ug || !priv) { + _ERR("ug: %p , priv: %p ", ug, priv); + return NULL; + } + + ugd = priv; + + elm_theme_extension_add(NULL, AUTO_PRGM_EDJ_THEME); + + win = ug_get_window(); + if (!win) { + _ERR("window get failed"); + return NULL; + } + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_style_set(win, INVISIBLE); + + vmgr = viewmgr_init(win); + if (!vmgr) { + _ERR("viewmgr init failed"); + return NULL; + } + + ugd->ug = ug; + ugd->win = win; + ugd->vmgr = vmgr; + + if (viewmgr_push(vmgr, view_scanstart_get_vclass(), ugd) == -1) { + _ERR("scan view push failed"); + viewmgr_fini(vmgr); + return NULL; + } + + return ugd->ugd_base; +} + +/** +* When channel UG starts, the start operation is invoked, the implementation of +* start operation is on_start(), +* usually every job would be completed before this operation, +* so just describe additional job you need to do in this operation. +* +* @param[in] ug: The channel ui gadget object being created +* @param[in] service: The handler to the service. +* Each operation will receive this service type data, and the argument service +* is automatically released by UI gadget manager after the UI gadget +* is destroyed. +* @priv[in] priv: The user data passed from the callback registration function. +* +* There is no action in this function. +*/ +static void _on_start(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Pause channel ug. +* +* @param[in] ug: The channel ui gadget object being created +* @param[in] service: The handler to the service. +* @priv[in] priv: The user data passed from the callback registration function. +* +* There is no action in this function. +*/ +static void _on_pause(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Resume channel ug. +* +* @param[in] ug: The channel ui gadget object being created +* @param[in] service: The handler to the service. +* @priv[in] priv: The user data passed from the callback registration function. +* +* There is no action in this function. +*/ +static void _on_resume(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Destroy the ug and release resources that have been used. +* +* When channel UG is destroyed, the destroy operation is invoked. +* UI gadget cannot destroy itself, so it must be destroyed by using +* ug_destroy(), and then _on_destroy will be invoked, in this function, +* the viewmgr will be released. +* +* @param[in] ug: The channel ui gadget object +* @param[in] service: The handler to the service. +* @priv[in] priv: The user data passed from the callback registration function. +*/ +static void _on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ + struct _ugdata *ugd; + + if (!ug || !priv) { + _ERR("Invalid parameter."); + return; + } + + ugd = priv; + + viewmgr_fini(ugd->vmgr); + + return; +} + +/** +* when an UI gadget receives message from its caller using ug_send_message(), +* the message operation on_message is invoked. +* +* @param[in] ug: The channel ui gadget object +* @param[in] msg: The handler to the service data. +* Each operation will receive this service type data, +* And the argument service is automatically released by UI gadget manager +* after the UI gadget is destroyed +* @param[in] service: The handler to the service. +* @priv[in] priv: The user data passed from the callback registration function. +* +* There is no action in this function. +*/ +static void _on_message(ui_gadget_h ug, service_h msg, + service_h service, void *priv) +{ +} + +/** +* when a system event is generated and UI gadget receives event from caller +* using ug_send_event(), the event operation on_event is invoked. +* +* @param[in] ug: The channel ui gadget object +* @param[in] event: The event for channel ui gadget +* @param[in] service: The handler to the service. +* @priv[in] priv: The user data passed from the callback registration function. +*/ +static void _on_event(ui_gadget_h ug, enum ug_event event, + service_h service, void *priv) +{ + if (!ug || !priv) + return; + + switch (event) { + case UG_EVENT_LOW_MEMORY: + break; + case UG_EVENT_LOW_BATTERY: + break; + case UG_EVENT_LANG_CHANGE: + break; + case UG_EVENT_ROTATE_PORTRAIT: + break; + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + break; + case UG_EVENT_ROTATE_LANDSCAPE: + break; + case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN: + break; + default: + break; + } +} + +/** +* Invoked when the UI gadget is loading, and it sets operations, private data, +* and the option. +* +* @param[in] ops: Ops is a data structure describing operations, private data, +* and the option of UI gadget +* +* @return 0 on success and -1 on fail +*/ +UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + struct _ugdata *ugd; + + if (!ops) + return -1; + + ugd = calloc(1, sizeof(*ugd)); + if (!ugd) + return -1; + + ops->create = _on_create; + ops->start = _on_start; + ops->pause = _on_pause; + ops->resume = _on_resume; + ops->destroy = _on_destroy; + ops->message = _on_message; + ops->event = _on_event; + ops->priv = ugd; + ops->opt = UG_OPT_INDICATOR_ENABLE; + + return 0; +} + +/** +* Invoked when the UI gadget is unloading, and it clears private data. +* +* Release data used in the module +* +* @param[in] ops: A data structure describing operations, private data, +* and the option of UI gadget +*/ +UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops) +{ + struct _ugdata *ugd; + + if (!ops) + return; + + ugd = ops->priv; + free(ugd); +} diff --git a/ug/channel/src/util.c b/ug/channel/src/util.c new file mode 100644 index 0000000..e1f3402 --- /dev/null +++ b/ug/channel/src/util.c @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "util.h" + +/** + * @EVAS_CALLBACK_MOUSE_IN type callback for handling mouse in event + * + * When mouse in, set the object in focus + * + * @param[in] data: the user data + * @param[in] e: evas handler. + * @param[in] obj: the corresponding object which the mouse in event occurred + * @param[in] ei: event information + */ +static void _btn_mouse_in_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) { + _ERR("Invalid argument"); + return; + } + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** + * @EVAS_CALLBACK_MOUSE_OUT type callback for handling mouse out event + * + * When mouse out, do nothing + * + * @param[in] data: the user data + * @param[in] e: evas handler. + * @param[in] obj: the corresponding object which the mouse out event occurred + * @param[in] ei: event information + */ +static void _btn_mouse_out_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ +} + +/** + * Create a new layout to the parent, and set the file that will be used + * as layout + * + * @param[in] parent: the parent object + * @param[in] file: the path to file (edj) that will be used as layout + * @param[in] group: the group that the layout belongs to in edje file + * @return The new object or NULL if it cannot be created + * + * @ingroup Layout + */ +Evas_Object *util_add_layout(Evas_Object *parent, const char *file, + const char *group) +{ + Evas_Object *ly; + + if (!parent) + return NULL; + + ly = elm_layout_add(parent); + if (!ly) { + _ERR("add layout failed"); + return NULL; + } + + elm_layout_file_set(ly, file, group); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_show(ly); + + return ly; +} + +/** + * Create a new scroller to the parent, and set bouncing behavior. + * + * When scrolling, the scroller may "bounce" when reaching an edge of the + * content object. This is a visual way to indicate the end has been reached. + * This is enabled by default for both axis. This API will set if it is enabled + * for the given axis with the boolean parameters for each axis. + * + * @param[in] parent: the parent object + * @param[in] h_bounce: for setting if allow bounce horizontally + * @param[in] v_bounce: for setting if allow bounce vertically + * @return The new object or NULL if it cannot be created + * + * @ingroup Scroller + */ +Evas_Object *util_add_scroller(Evas_Object *parent, + Eina_Bool h_bounce, Eina_Bool v_bounce) +{ + Evas_Object *scr; + + if (!parent) { + _ERR("the parent or part is NULL."); + return NULL; + } + + scr = elm_scroller_add(parent); + if (!scr) { + _ERR("add scroller failed."); + return NULL; + } + + elm_scroller_bounce_set(scr, h_bounce, v_bounce); + + evas_object_show(scr); + + return scr; +} + +/** + * Create a new box to the parent, and set the alignment of the whole + * bounding box of contents + * + * @param[in] parent: the parent object + * @param[in] h: the horizontal alignment of elements + * @param[in] v: the vertical alignment of elements + * @return The new object or NULL if it cannot be created + * + * @ingroup Box + */ +Evas_Object *util_add_box(Evas_Object *parent, double h, double v) +{ + Evas_Object *box; + + if (!parent) { + _ERR("the parent or part is NULL."); + return NULL; + } + + box = elm_box_add(parent); + if (!box) { + _ERR("add box failed."); + return NULL; + } + + elm_box_align_set(box, h, v); + + evas_object_show(box); + + return box; +} + +/** + * Create a new button to the parent's canvas. + * + * In this function, it creats a button, and set the style of the button, + * set it in content part, and set the button text + * + * @param[in] parent: the parent object + * @param[in] btnstyle: the style of the button + * @param[in] btnpart: the content part that the button will be set in + * @param[in] btntext: the text that button will show + * @param[in] flag: a flag for setting the mouse in or mouse out event + * @return The new object or NULL if it cannot be created + * + * @ingroup Button + */ +Evas_Object *util_add_button(Evas_Object *parent, const char *btnstyle, + const char *btnpart, const char *btntext, Eina_Bool flag) +{ + Evas_Object *btn; + + if (!parent || !btnstyle) { + _ERR("parameter is NULL"); + return NULL; + } + + btn = elm_button_add(parent); + if (!btn) { + _ERR("add button failed"); + return NULL; + } + + elm_object_style_set(btn, btnstyle); + + if (btntext) + elm_object_text_set(btn, btntext); + + if (btnpart) + elm_object_part_content_set(parent, btnpart, btn); + + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + + if (flag == EINA_TRUE) { + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _btn_mouse_in_cb, NULL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_OUT, + _btn_mouse_out_cb, NULL); + } + + evas_object_show(btn); + + return btn; +} + +/** + * Set next object with specific focus direction. + * + * When focus next object is set with specific focus direction, this object + * will be the first candidate when finding next focusable object. + * Focus next object can be registered with six directions that are previous, + * next, up, down, right, and left + * + * @param obj: The evas object + */ +void util_focus_next_set(Evas_Object *obj) +{ + if (!obj) { + _ERR("obj is NULL"); + return; + } + + elm_object_focus_next_object_set(obj, obj, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(obj, obj, ELM_FOCUS_UP); +} diff --git a/ug/channel/src/view_result_page.c b/ug/channel/src/view_result_page.c new file mode 100644 index 0000000..7bdf3ad --- /dev/null +++ b/ug/channel/src/view_result_page.c @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "dbg.h" +#include "defs.h" +#include "util.h" +#include "viewmgr_auto_program.h" +#include "ug_auto_program.h" +#include "view_search_page.h" +#include "view_result_page.h" + +#define RESULT_MSG_SIZE 60 + +#define _GET_PRIV(o) evas_object_data_get(o, "RESDATA") +#define _SET_PRIV(o, data) evas_object_data_set(o, "RESDATA", data) + +struct _data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *ok_btn; + struct viewmgr *vmgr; + struct _ugdata *ugd; +}; + +/** + * @Evas_Smart_Cb type callback for handling the click callback event for + * "OK" button. + * + * When "OK" button is clicked, channel ug will exit. + * + * @param[in] data: the user data related to current view + * @param[in] obj: the corresponding object on which the button click event + * occurred + * + * @param[in] ev: event information + */ +static void _ok_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _ugdata *ugd; + struct _data *priv; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + priv = data; + ugd = priv->ugd; + + if (!ugd || !ugd->ug) { + _ERR("ugd->ug is NULL"); + return; + } + + ug_destroy_me(ugd->ug); +} + +/** + * Initializes the base layout for scanning result view. + * + * Create the layout of scanning result view. + * + * @param[in] vmgr: the handler to the struct object for managing the view + * @param[in] data: the user data related to current view + * @return The base or NULL if creatting failed + */ +static Evas_Object *_create(struct viewmgr *vmgr, void *data) +{ + Evas_Object *base; + Evas_Object *win; + struct _data *priv; + struct _ugdata *ugd; + + if (!vmgr || !data) { + _ERR("Invalid argument"); + return NULL; + } + + ugd = data; + + win = viewmgr_get_win(vmgr); + if (!win) + return NULL; + + priv = calloc(1, sizeof(*priv)); + if (!priv) + return NULL; + + base = util_add_layout(win, AUTO_PRGM_EDJ_FILE, GROUP_RES); + if (!base) { + free(priv); + return NULL; + } + + elm_win_resize_object_add(win, base); + + priv->win = win; + priv->base = base; + priv->ugd = ugd; + priv->vmgr = vmgr; + + _SET_PRIV(base, priv); + + return base; +} + +/** + * Invoked after _create() function as defined in viewmgr_push(). + * + * Create the button in result view, and show the information about the + * number of found channels. + * + * @param[in] base: the layout of the view + */ +static void _update(Evas_Object *base) +{ + Evas_Object *ok_btn; + struct _data *priv; + char msg[RESULT_MSG_SIZE]; + int chs; + + if (!base) { + _ERR("Invalid argument"); + return; + } + + priv = _GET_PRIV(base); + if (!priv) { + _ERR("Data get failed"); + return; + } + + chs = priv->ugd->find_chs; + + snprintf(msg, sizeof(msg), "%s
%d %s", COMPLETE_MAIN_TITLE, + chs, TEXT_CH_MEMORIZED); + elm_object_part_text_set(priv->base, PART_RES_MAIN_TITLE, msg); + + ok_btn = util_add_button(priv->base, BTN_STYLE, + PART_OK_BTN, TEXT_BUTTON_OK, EINA_TRUE); + if (!ok_btn) { + _ERR("ok_btn is NULL"); + return; + } + + priv->ok_btn = ok_btn; + elm_object_focus_set(ok_btn, EINA_TRUE); + evas_object_smart_callback_add(ok_btn, SIGNAL_CLICKED, + _ok_btn_clicked_cb, priv); + + util_focus_next_set(ok_btn); +} + +/** + * Resume the application. + * + * @param[in] base: the layout of the view + */ +static void _resume(Evas_Object *base) +{ + evas_object_show(base); +} + +/** + * Pause the application. + * + * Hide the layout + * + * @param[in] base: the layout of the view + */ +static void _pause(Evas_Object *base) +{ + evas_object_hide(base); +} + +/** + * Called after the main loop of the view exits. + * + * Delete the layout and release the resourse + * + * @param[in] base: the layout of the view + */ +static void _terminate(Evas_Object *base) +{ + struct _data *priv; + + if (!base) { + _ERR("Invalid argument"); + return; + } + + priv = _GET_PRIV(base); + if (!priv) { + _ERR("Data get failed"); + return; + } + + if (priv->base) + evas_object_del(priv->base); + + free(priv); +} + +/** + * This struct is for registering the callbacks for the view + */ +static struct view_class _vclass = { + .title = VIEW_RESULT, + .create = _create, + .update = _update, + .resume = _resume, + .pause = _pause, + .terminate = _terminate, +}; + + /** + * Returns current view_class which implements the result view's life cycle + * + * @return view_class + */ +struct view_class *view_resultpage_get_vclass(void) +{ + return &_vclass; +} diff --git a/ug/channel/src/view_scan_start.c b/ug/channel/src/view_scan_start.c new file mode 100644 index 0000000..98825ea --- /dev/null +++ b/ug/channel/src/view_scan_start.c @@ -0,0 +1,696 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co. Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include "ug_auto_program.h" +#include "view_scan_start.h" +#include "view_search_page.h" +#include "view_result_page.h" +#include "viewmgr_auto_program.h" +#include "dbg.h" +#include "defs.h" +#include "tv_scan.h" +#include "util.h" + +#define HORIZONTAL_ALIGN 0.5 +#define VERTICAL_ALIGN 0.0 +#define MAX_ITEMS 3 +#define ALL "All" +#define CABLE "Cable" +#define AIR "Air" + +#define _GET_PRIV(o) evas_object_data_get(o, "SCANSTARTDATA") +#define _SET_PRIV(o, data) evas_object_data_set(o, "SCANSTARTDATA", data) + +enum antenna_type { + ALL_ITEM, + CABLE_ITEM, + AIR_ITEM +}; + +struct _data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *start_btn; + Evas_Object *cancel_btn; + Evas_Object *box; + Evas_Object *last_focus_item; + Evas_Object *selected_item; + Evas_Object *atn_btn[MAX_ITEMS]; + struct viewmgr *vmgr; + struct _ugdata *ugd; + enum antenna_mode scan_type; +}; + +struct _antenna_info { + char *style; + Evas_Smart_Cb cb; + char *text; +}; + +/** + * @EVAS_CALLBACK_KEY_DOWN type callback for handling key pressed callback + * event + * + * @param[in] data: user data related to current view + * @param[in] e: evas handler + * @param[in] obj: the corresponding object on which the key pressed event + * occurred + * @param[in] ei: event information + */ +static void _key_pressed_cb(void *data, Evas *e, Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _data *priv; + struct _ugdata *ugd; + + if (!data || !ei) { + _ERR("Parameter error!"); + return; + } + + priv = data; + ev = ei; + + if (!priv->ugd) { + _ERR("priv->ugd is NULL"); + return; + } + + ugd = priv->ugd; + + if (!ugd->ug) { + _ERR("ugd->ug is NULL"); + return; + } + + if (!ev->keyname) { + _ERR("ev->keyname NULL!"); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) + ug_destroy_me(ugd->ug); +} + +/** + * @Evas_Smart_Cb type callback for handling the click callback event for + * "start" button. + * + * @param[in] data: user data related to current view + * @param[in] obj: the corresponding object on which the button click event + * occurred + * @param[in] ev: event information + */ +static void _start_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _data *priv; + Eina_Bool tuner_exist; + + if (!data) { + _ERR("data is NULL"); + return; + } + + priv = data; + + if (!priv->ugd || !priv->vmgr) { + _ERR("parameter is NULL"); + return; + } + + /* + * TODO: add the interface when TV service provider the related API. + * Here is a pseudo-data. + */ + tuner_exist = EINA_TRUE; + if (!tuner_exist) { + /* + * TODO: popup the notification iniformation: + * there is no tuner + */ + return; + } + + if (viewmgr_push(priv->vmgr, view_searchpage_get_vclass(), + priv->ugd) == -1) { + _ERR("search view push failed"); + return; + } +} + + /** + * @Evas_Smart_Cb type callback for handling the click callback event for + * "cancel" button. + * + * @param[in] data: user data related to current view + * @param[in] obj: the corresponding object on which the button click event + * occurred + * @param[in] ev: event information + */ +static void _cancel_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _data *priv; + struct _ugdata *ugd; + + if (!data) { + _ERR("data is NULL"); + return; + } + + priv = data; + + if (!priv->ugd) { + _ERR("priv->ugd is NULL"); + return; + } + + ugd = priv->ugd; + + if (!ugd->ug) { + _ERR("ugd->ug is NULL"); + return; + } + + ug_destroy_me(ugd->ug); +} + +/** + * Callback function for button focus event. + * + * @param[in] data: user data related to current view + * @param[in] obj: the corresponding object on which the button focus event + * occurred + * @param[in] emission: the signal's name. + * @param[in] source: the signal's source. + */ +static void _btn_focused_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + struct _data *priv; + + if (!obj || !data) { + _ERR("Invalid parameter"); + return; + } + + priv = data; + + if (priv->last_focus_item) { + elm_object_signal_emit(priv->last_focus_item, + SIGNAL_SHOWLINE, CHANNEL_SOURCE); + elm_object_signal_emit(obj, SIGNAL_HIDELINE, CHANNEL_SOURCE); + } else { + elm_object_signal_emit(obj, SIGNAL_SHOWLINE, CHANNEL_SOURCE); + } + + priv->last_focus_item = obj; +} + +/** + * Callback function for button unfocus event. + * + * @param[in] data: user data related to current view + * @param[in] obj: the corresponding object on which the button focus event + * occurred + * @param[in] emission: the signal's name. + * @param[in] source: the signal's source. + */ +static void _btn_unfocused_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + struct _data *priv; + + if (!obj || !data) { + _ERR("Invalid parameter"); + return; + } + + priv = data; + elm_object_signal_emit(priv->last_focus_item, + SIGNAL_SHOWLINE, CHANNEL_SOURCE); +} + +/** + * Set the focus sequence for the objects in the layout. + * + * @param[in] data: user data related to current view + */ +static void _update_focus_sequence(struct _data *priv) +{ + if (!priv) { + _ERR("Invalid parameter"); + return; + } + + elm_object_focus_next_object_set(priv->atn_btn[ALL_ITEM], + priv->start_btn, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(priv->atn_btn[CABLE_ITEM], + priv->start_btn, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(priv->atn_btn[AIR_ITEM], + priv->start_btn, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(priv->atn_btn[ALL_ITEM], + priv->atn_btn[ALL_ITEM], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->atn_btn[CABLE_ITEM], + priv->atn_btn[CABLE_ITEM], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->atn_btn[AIR_ITEM], + priv->atn_btn[AIR_ITEM], ELM_FOCUS_LEFT); + + if (priv->selected_item) { + elm_object_focus_next_object_set(priv->start_btn, + priv->selected_item, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->cancel_btn, + priv->selected_item, ELM_FOCUS_LEFT); + } else { + elm_object_focus_next_object_set(priv->start_btn, + priv->atn_btn[ALL_ITEM], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(priv->cancel_btn, + priv->atn_btn[ALL_ITEM], ELM_FOCUS_LEFT); + } + + elm_object_focus_next_object_set(priv->start_btn, + priv->cancel_btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(priv->cancel_btn, + priv->start_btn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(priv->cancel_btn, + priv->start_btn, ELM_FOCUS_UP); +} + +/** + * @Evas_Smart_Cb type callback for handling the click callback event. + * + * @param[in] data: user data related to current view + * @param[in] obj: the corresponding object on which the button click event + * occurred + * @param[in] ev: event information + */ +static void _item_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _data *priv; + const char *text; + + if (!data || !obj) { + _ERR("Invalid parameter"); + return; + } + + priv = data; + + if (!priv->selected_item) { + elm_object_focus_set(obj, EINA_TRUE); + elm_object_signal_emit(obj, SIGNAL_SELECTED, CHANNEL_SOURCE); + priv->selected_item = obj; + } else { + if (priv->selected_item != obj) { + elm_object_signal_emit(priv->selected_item, + SIGNAL_UNSELECTED, CHANNEL_SOURCE); + elm_object_signal_emit(obj, SIGNAL_SELECTED, + CHANNEL_SOURCE); + priv->selected_item = obj; + } + } + + text = elm_object_text_get(priv->selected_item); + if (text && !strcmp(text, ALL)) + priv->scan_type = SCAN_TYPE_ALL; + else if (text && !strcmp(text, CABLE)) + priv->scan_type = SCAN_TYPE_CABLE; + else if (text && !strcmp(text, AIR)) + priv->scan_type = SCAN_TYPE_AIR; + else + priv->scan_type = SCAN_TYPE_INVALID; + + priv->ugd->scan_type = priv->scan_type; + + _update_focus_sequence(priv); +} + +/** + * Clear the content of the box. + * + * @param[in] data: user data related to current view + */ +static void _clear_box(struct _data *data) +{ + if (!data) { + _ERR("Invalid parameter."); + return; + } + + if (!data->box) { + _ERR("data->box is NULL"); + return; + } + + elm_box_clear(data->box); + + data->last_focus_item = NULL; + data->selected_item = NULL; +} + +/** + * Add items in the box of the layout. + * + * @param[in] parent: the box created in the layout. + * @param[in] btnstyle: the style of the button + * @param[in] btntext: the text shown in button + * @param[in] fun_cb: the click callback function for the button + * @param[in] data: user data related to current view + * @return Button or NULL if creatting failed + */ +static Evas_Object *_add_exit_item(Evas_Object *parent, const char *btnstyle, + const char *btntext, Evas_Smart_Cb fun_cb, struct _data *data) +{ + Evas_Object *btn; + + if (!data) { + _ERR("Invalid parameter."); + return NULL; + } + + if (!parent || !btnstyle || !btntext || !fun_cb) { + _ERR("Invalid parameter."); + return NULL; + } + + btn = util_add_button(parent, btnstyle, NULL, btntext, EINA_TRUE); + if (!btn) { + _ERR("add item failed"); + return NULL; + } + + elm_box_pack_end(parent, btn); + evas_object_smart_callback_add(btn, SIGNAL_CLICKED, + fun_cb, data); + elm_object_signal_callback_add(btn, SIGNAL_FOCUSED, + ELM_SOURCE, _btn_focused_cb, data); + elm_object_signal_callback_add(btn, SIGNAL_UNFOCUSED, + ELM_SOURCE, _btn_unfocused_cb, data); + + return btn; +} + +/** + * Create the item list of antenna type . + * + * @param[in] data: user data related to current view + */ +static void _update_antenna_list(struct _data *data) +{ + Evas_Object *btn; + int i; + struct _antenna_info atninfo[] = { + [ALL_ITEM] = { + .style = ITEM_STYLE, + .cb = _item_clicked_cb, + .text = ALL + }, + [CABLE_ITEM] = { + .style = ITEM_STYLE, + .cb = _item_clicked_cb, + .text = CABLE + }, + [AIR_ITEM] = { + .style = ITEM_STYLE, + .cb = _item_clicked_cb, + .text = AIR + } + }; + + if (!data) { + _ERR("Invalid parameter."); + return; + } + + if (!data->base || !data->box) { + _ERR("Invalid parameter."); + return; + } + + _clear_box(data); + + for (i = 0; i < MAX_ITEMS; i++) { + btn = _add_exit_item(data->box, atninfo[i].style, + atninfo[i].text, atninfo[i].cb, data); + if (!btn) { + _ERR("add exist item failed."); + return; + } + + data->atn_btn[i] = btn; + + if (i == 0) { + elm_object_focus_set(btn, EINA_TRUE); + elm_object_signal_emit(btn, + SIGNAL_SELECTED, CHANNEL_SOURCE); + data->selected_item = btn; + } + } + + _update_focus_sequence(data); +} + +/** + * Create box in the layout for adding item in it. + * + * @param[in] base: the layout created in _creat() of current view + * @return The box or NULL if creatting failed + */ +static Evas_Object *_create_box(Evas_Object *base) +{ + Evas_Object *box; + struct _data *priv; + + if (!base) { + _ERR("base is NULL"); + return NULL; + } + + priv = _GET_PRIV(base); + if (!priv) { + _ERR("Data get failed"); + return NULL; + } + + box = util_add_box(base, HORIZONTAL_ALIGN, VERTICAL_ALIGN); + if (!box) { + _ERR("box add failed"); + return NULL; + } + + elm_object_part_content_set(base, PART_ANTENNA_LIST, box); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + + return box; +} + +/** + * Initializes the base layout for scanning start view. + * + * Create the beginning view layout based on window + * + * @param[in] vmgr: the handler to the struct object for managing the view + * @param[in] data: the user data related to current view + * @return The base or NULL if creatting failed + */ +static Evas_Object *_create(struct viewmgr *vmgr, void *data) +{ + Evas_Object *base; + Evas_Object *win; + Evas_Object *start_btn; + Evas_Object *cancel_btn; + Evas_Object *box; + struct _data *priv; + struct _ugdata *ugd; + + if (!vmgr || !data) { + _ERR("Invalid argument"); + return NULL; + } + + ugd = (struct _ugdata *)data; + + win = viewmgr_get_win(vmgr); + if (!win) { + _ERR("get win failed."); + return NULL; + } + + priv = calloc(1, sizeof(*priv)); + if (!priv) { + _ERR("calloc memory failed."); + return NULL; + } + + base = util_add_layout(win, AUTO_PRGM_EDJ_FILE, GRP_SCAN_START); + if (!base) { + _ERR("scan start layout creat failed!"); + free(priv); + return NULL; + } + + elm_win_resize_object_add(win, base); + evas_object_event_callback_add(base, EVAS_CALLBACK_KEY_DOWN, + _key_pressed_cb, priv); + elm_object_part_text_set(base, PART_STAR_MAIN_TITLE_BLOCK, + START_MAIN_TITLE); + + start_btn = util_add_button(base, BTN_STYLE, + PART_START_BTN, TEXT_BTN_START, EINA_TRUE); + if (!start_btn) { + _ERR("create start_btn failed"); + goto aborting; + } + + cancel_btn = util_add_button(base, BTN_STYLE, + PART_CANCEL_BTN, TEXT_BTN_CANCEL, EINA_TRUE); + if (!cancel_btn) { + _ERR("create cancel_btn failed"); + goto aborting; + } + + priv->base = base; + priv->start_btn = start_btn; + priv->cancel_btn = cancel_btn; + priv->ugd = ugd; + priv->ugd->ugd_base = base; + priv->vmgr = vmgr; + priv->win = win; + + _SET_PRIV(base, priv); + + evas_object_smart_callback_add(start_btn, SIGNAL_CLICKED, + _start_btn_clicked_cb, priv); + evas_object_smart_callback_add(cancel_btn, SIGNAL_CLICKED, + _cancel_btn_clicked_cb, priv); + + evas_object_raise(base); + + box = _create_box(base); + if (!box) { + _ERR("create box failed."); + goto aborting; + } + + priv->box = box; + + _update_antenna_list(priv); + + return base; + +aborting: + evas_object_del(base); + free(priv); + return NULL; +} + +/** + * Invoked when refresh the window of application. + * + * @param[in] base: the layout of the view + * + * There is no action in this application. + */ +static void _update(Evas_Object *base) +{ +} + +/** + * Resume the application. + * + * @param[in] base: the layout of the view + */ +static void _resume(Evas_Object *base) +{ + if (!base) { + _ERR("Invalid argument"); + return; + } + + evas_object_show(base); +} + +/** + * Pause the view. + * + * Hide the layout + * + * @param[in] base: the layout of the view + */ +static void _pause(Evas_Object *base) +{ + if (!base) { + _ERR("Invalid argument"); + return; + } + + evas_object_hide(base); +} + +/** + * Called after the main loop of the view exits. + * + * Delete the layout and release the resourse + * + * @param[in] base: the layout of the view + */ +static void _terminate(Evas_Object *base) +{ + struct _data *priv; + + if (!base) { + _ERR("Invalid argument"); + return; + } + + priv = _GET_PRIV(base); + if (!priv) { + _ERR("Data get failed"); + return; + } + + if (priv->base) + evas_object_del(priv->base); + + free(priv); +} + +/** + * This struct is for registering the callbacks for the view + */ +static struct view_class _vclass = { + .title = VIEW_START, + .create = _create, + .update = _update, + .resume = _resume, + .pause = _pause, + .terminate = _terminate, +}; + + /** + * Returns current view_class which implements the scan start view's life cycle + * + * @return view_class + */ +struct view_class *view_scanstart_get_vclass(void) +{ + return &_vclass; +} diff --git a/ug/channel/src/view_search_page.c b/ug/channel/src/view_search_page.c new file mode 100644 index 0000000..5a7fdb3 --- /dev/null +++ b/ug/channel/src/view_search_page.c @@ -0,0 +1,616 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include "ug_auto_program.h" +#include "view_search_page.h" +#include "view_result_page.h" +#include "viewmgr_auto_program.h" +#include "dbg.h" +#include "defs.h" +#include "tv_scan.h" +#include "util.h" + +#define _GET_PRIV(o) evas_object_data_get(o, "SRCHDATA") +#define _SET_PRIV(o, data) evas_object_data_set(o, "SRCHDATA", data) +#define MAX_BUF_SIZE 30 +#define CH_NAME_SIZE 30 +#define INITIAL_CH_NUMS 0 +#define PERCENT 100 +#define INITIAL_TEXT "0%" +#define INITIAL_VALUE 0.0 + +struct _data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *pb; + Evas_Object *stop_btn; + Evas_Object *exit_btn; + Evas_Object *cancel_btn; + struct viewmgr *vmgr; + struct tv_scan *tvs; + struct _ugdata *ugd; +}; + +/** + * The statement for "stop" button for clicking callback event, for + * there are two buttons with the same text "stop". + */ +static void _stop_btn_clicked_cb(void *data, Evas_Object *obj, void *ev); + +/** + * The click callback event for the "cancel" button. + * + * When "cancel" button is clicked, the scanning will be resumed. + * + * @param[in] data: user data related to current view + * @param[in] obj: a pointer to the object on which click event occurred + * @param[in] ev: event information + */ +static void _cancel_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _data *priv; + int r; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + if (!priv->cancel_btn || !priv->exit_btn) { + _ERR("priv->cancel_btn or priv->exit_btn is NULL"); + return; + } + + elm_object_part_text_set(priv->base, PART_SRCH_MAIN_TITLE, + SEARCH_MAIN_TITLE); + + r = tv_scan_resume(priv->tvs); + if (r != 0) { + _ERR("resume tv scan failed."); + return; + } + + priv->stop_btn = util_add_button(priv->base, BTN_STYLE, + PART_STOP_BTN, TEXT_BTN_STOP, EINA_TRUE); + if (!priv->stop_btn) { + _ERR("stop_btn is NULL"); + return; + } + + elm_object_focus_allow_set(priv->stop_btn, EINA_TRUE); + elm_object_focus_set(priv->stop_btn, EINA_TRUE); + evas_object_smart_callback_add(priv->stop_btn, SIGNAL_CLICKED, + _stop_btn_clicked_cb, priv); + + util_focus_next_set(priv->stop_btn); + + evas_object_del(priv->exit_btn); + evas_object_del(priv->cancel_btn); + priv->exit_btn = NULL; + priv->cancel_btn = NULL; +} + +/** + * @Evas_Smart_Cb type callback for handling the click callback event for + * "stop" button. + * + * The click callback event for the "stop" button in paused view. + * When the "stop" button in paused view is clicked, the scanning will + * be stopped, and channel ug will be exited. + * + * @param[in] data: user data related to current view + * @param[in] obj: a pointer to the object on which click event occurred + * @param[in] ev: event information + */ +static void _destroy_search_page_cb(void *data, Evas_Object *obj, + void *ev) +{ + struct _ugdata *ugd; + struct _data *priv; + int r; + + if (!data) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + if (!priv->ugd || !priv->tvs) { + _ERR("priv->ugd or priv->tvs is NULL"); + return; + } + + ugd = priv->ugd; + + r = tv_scan_stop(priv->tvs); + if (r != 0) { + _ERR("tv_scan_stop failed"); + return; + } + + if (!ugd->ug) { + _ERR("ugd->ug is NULL"); + return; + } + + ug_destroy_me(ugd->ug); +} + +/** + * @Evas_Smart_Cb type callback for handling the click callback event for + * "stop" button. + * + * When the "stop" button is clicked, the scanning will be paused, the view + * will be changed into paused state. + * + * @param[in] data: user data related to current view + * @param[in] obj: a pointer to the object on which click event occurred + * @param[in] ev: event information + */ +static void _stop_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _data *priv; + int r; + + if (!data || !obj) { + _ERR("Invalid argument"); + return; + } + + priv = data; + + if (!priv->base || !priv->tvs) { + _ERR("priv->base or priv->tvs is NULL"); + return; + } + + r = tv_scan_pause(priv->tvs); + if (r != 0) { + _ERR("tv_scan_pause failed"); + return; + } + + elm_object_part_text_set(priv->base, PART_SRCH_MAIN_TITLE, + PAUSE_MAIN_TITLE); + + priv->exit_btn = util_add_button(priv->base, BTN_STYLE, + PART_EXIT_BTN, TEXT_BTN_STOP, EINA_TRUE); + if (!priv->exit_btn) { + _ERR("exit_btn is NULL"); + return; + } + + evas_object_smart_callback_add(priv->exit_btn, SIGNAL_CLICKED, + _destroy_search_page_cb, priv); + + priv->cancel_btn = util_add_button(priv->base, BTN_STYLE, + PART_SRCH_CANCEL_BTN, TEXT_BTN_CANCEL, EINA_TRUE); + if (!priv->cancel_btn) { + _ERR("cancel_btn is NULL"); + evas_object_del(priv->exit_btn); + priv->exit_btn = NULL; + return; + } + + evas_object_smart_callback_add(priv->cancel_btn, SIGNAL_CLICKED, + _cancel_btn_clicked_cb, priv); + + elm_object_focus_allow_set(priv->exit_btn, EINA_TRUE); + elm_object_focus_set(priv->exit_btn, EINA_TRUE); + util_focus_next_set(priv->exit_btn); + + evas_object_del(priv->stop_btn); + priv->stop_btn = NULL; +} + +/** + * Dealing with the receving signal. + * + * When receiving a channel signal, update the progress of the progressbar + * and the number of channel signal. + * + * @param[in] tvs: The tv service data structure + * @param[in] mode: The setting scan mode in view_scan_start.c + * @param[in] count: The number of channel signal received up to now + * @param[in] num: The physical channel number of current channel + * @param[in] arg: A pointer to current data structure. + */ +static void _progress_cb(struct tv_scan *tvs, enum antenna_mode mode, + int count, int num, void *arg) +{ + struct _data *priv; + char buf[CH_NAME_SIZE]; + int total; + int ratio; + + if (!tvs || !arg) { + _ERR("Invalid argument"); + return; + } + + priv = arg; + + snprintf(buf, sizeof(buf), "CH. %d", count); + elm_object_part_text_set(priv->base, PART_CH_NAME, buf); + elm_object_signal_emit(priv->base, SEARCHCHANNEL, SUBTEXT_SOURCE); + + total = tv_scan_get_total_channel(tvs); + if (total <= 0) { + _ERR("Invalid Total value"); + return; + } + + ratio = count * PERCENT / total; + snprintf(buf, sizeof(buf), "%d%%", ratio); + elm_object_part_text_set(priv->base, PART_PGBAR_NUM, buf); + elm_progressbar_value_set(priv->pb, (float)ratio / PERCENT); +} + +/** + * Dealing with the scanning result. + * + * When finishing scanning, the total found channels will be calculated and the + * scan result view will be invoked in this function. + * + * @param[in] tvs: The tv service structure for managering the scanning + * @param[in] res: The structure for saving the number of ATV air, DTV air, + * ATV cable and DTV cable channel. + * @param[in] arg: A pointer to current data structure. + */ +static void _done_cb(struct tv_scan *tvs, + const struct tv_scan_result *res, void *arg) +{ + struct _data *priv; + struct _ugdata *ugd; + struct viewmgr *vmgr; + + if (!arg) { + _ERR("Invalid argument"); + return; + } + + priv = arg; + + if (!priv->tvs || !priv->vmgr || !priv->ugd) { + _ERR("Invalid argument"); + return; + } + + vmgr = priv->vmgr; + ugd = priv->ugd; + + ugd->find_chs = res->air_dtv + res->cable_dtv + + res->air_atv + res->cable_atv; + + if (viewmgr_push(vmgr, view_resultpage_get_vclass(), ugd) == -1) + _ERR("result view push failed"); +} + +/** + * Deal with the found channel signal. + * + * @param[in] tvs: The tv service structure for managering the scanning + * @param[in] count: The number of channel signal received up to now + * @param[in] num: The physical channel number + * @param[in] res: The structure for saving the number of ATV air, DTV air, + * ATV cable and DTV cable channel. + * @param[in] arg: A pointer to the current data structure. + * @return 0 on success, and -1 on fail + */ +static void _found_cb(struct tv_scan *tvs, int count, int num, + const struct tv_scan_result *res, void *arg) +{ + struct _data *priv; + char buf[CH_NAME_SIZE]; + int found; + + if (!arg) { + _ERR("Invalid argument"); + return; + } + + priv = arg; + snprintf(buf, sizeof(buf), "CH. %d", count); + + elm_object_part_text_set(priv->base, PART_CH_NAME, buf); + elm_object_signal_emit(priv->base, CHANNELFOUND, SUBTEXT_SOURCE); + + found = res->air_dtv + res->cable_dtv + res->air_atv + res->cable_atv; + snprintf(buf, sizeof(buf), "%d %s", found, TEXT_CH_FOUND); + elm_object_part_text_set(priv->base, PART_SRCH_SEARCH_RESULT, buf); + + priv->ugd->find_chs = found; +} + +/** + * Register callback functions for tvs scan manager and begin scanning. + * + * It registers the callback functions and private data. + * _progress_cb When receiving a channle signal, _progress_cb will be invoked; + * _found_cb When finding a channel, _found_cb will be invoked. + * _done_cb When finishing scanning, _done_cb will be invoked. + * + * @param[in] data: user data related to current view + * @return 0 on success, and -1 on fail + */ +static int _start_scan(struct _data *data) +{ + struct tv_scan_cbs cbs; + int r; + + if (!data) { + _ERR("Invalid argument data: %p", data); + return -1; + } + + if (!data->tvs) { + _ERR("Invalid argumentdata->tvs: %p", data->tvs); + return -1; + } + + cbs.data = data; + cbs.progress_cb = _progress_cb; + cbs.found_cb = _found_cb; + cbs.done_cb = _done_cb; + + r = tv_scan_set_callbacks(data->tvs, &cbs); + if (r != 0) { + _ERR("tv_scan_set_callbacks failed"); + return -1; + } + + r = tv_scan_start(data->tvs); + if (r != 0) { + _ERR("tv_scan_start failed."); + return -1; + } + + return 0; +} + +/** + * Initializes the base layout for searching view. + * + * Invoked as soon as "start" button is clicked in view_scan_start + * + * @param[in] vmgr: the handler to the struct object for managing the view + * @param[in] data: user data related to current view + * @return The base or NULL if creatting failed + */ +static Evas_Object *_create(struct viewmgr *vmgr, void *data) +{ + Evas_Object *base; + Evas_Object *win; + struct _data *priv; + struct _ugdata *ugd; + struct tv_scan *tvs; + char buf[MAX_BUF_SIZE]; + + if (!vmgr) { + _ERR("Invalid argument"); + return NULL; + } + + if (!data) { + _ERR("Invalid argument."); + return NULL; + } + + ugd = data; + + win = viewmgr_get_win(vmgr); + if (!win) { + _ERR("get win failed."); + return NULL; + } + + priv = calloc(1, sizeof(*priv)); + if (!priv) { + _ERR("calloc memory failed"); + return NULL; + } + + tvs = tv_scan_init(ugd->scan_type); + if (!tvs) { + _ERR("tvs init failed, set scan_type: %d", ugd->scan_type); + free(priv); + return NULL; + } + + base = util_add_layout(win, AUTO_PRGM_EDJ_FILE, GROUP_SRCH); + if (!base) { + _ERR("base is NULL"); + tv_scan_fini(tvs); + free(priv); + return NULL; + } + + elm_win_resize_object_add(win, base); + elm_object_part_text_set(base, PART_SRCH_MAIN_TITLE, + SEARCH_MAIN_TITLE); + elm_object_part_text_set(base, PART_CH_NAME, SCAN_CH_NAME); + + snprintf(buf, sizeof(buf), "%d %s", INITIAL_CH_NUMS, TEXT_CH_FOUND); + elm_object_part_text_set(base, PART_SRCH_SEARCH_RESULT, buf); + + priv->vmgr = vmgr; + priv->win = win; + priv->ugd = ugd; + priv->tvs = tvs; + priv->base = base; + + _SET_PRIV(base, priv); + + return base; +} + +/** + * Invoked when refresh the window of application. + * + * @param[in] base: the layout of the view + * + * There is no action in this application. + */ +static void _update(Evas_Object *base) +{ + Evas_Object *stop_btn; + Evas_Object *pb; + struct _data *priv; + int r; + + if (!base) { + _ERR("Invalid argument"); + return; + } + + priv = _GET_PRIV(base); + if (!priv) { + _ERR("Data get failed"); + return; + } + + stop_btn = util_add_button(base, BTN_STYLE, + PART_STOP_BTN, TEXT_BTN_STOP, EINA_TRUE); + if (!stop_btn) { + _ERR("stop_btn is NULL"); + evas_object_del(base); + free(priv); + return; + } + + priv->stop_btn = stop_btn; + elm_object_focus_set(stop_btn, EINA_TRUE); + evas_object_smart_callback_add(stop_btn, SIGNAL_CLICKED, + _stop_btn_clicked_cb, priv); + util_focus_next_set(stop_btn); + + pb = elm_progressbar_add(base); + if (!pb) { + _ERR("pb is NULL"); + evas_object_del(base); + free(priv); + return; + } + + priv->pb = pb; + elm_object_style_set(pb, PRGBAR_STYLE); + elm_object_part_text_set(base, PART_PGBAR_NUM, INITIAL_TEXT); + elm_progressbar_value_set(pb, INITIAL_VALUE); + elm_object_part_content_set(base, PART_PROGRESSBAR, pb); + evas_object_show(pb); + + r = _start_scan(priv); + if (r != 0) { + _ERR("start scan failed"); + return; + } +} + +/** + * Resume the application. + * + * @param[in] base: the layout of the view + */ +static void _resume(Evas_Object *base) +{ + if (!base) { + _ERR("Invalid argument"); + return; + } + + evas_object_show(base); +} + +/** + * Pause the view. + * + * Hide the layout + * + * @param[in] base: the layout of the view + */ +static void _pause(Evas_Object *base) +{ + if (!base) { + _ERR("Invalid argument"); + return; + } + + evas_object_hide(base); +} + +/** + * Called after the main loop of the view exits. + * + * Delete the layout and release the resourse + * + * @param[in] base: the layout of the view + */ +static void _terminate(Evas_Object *base) +{ + struct _data *priv; + int r; + + if (!base) { + _ERR("Invalid argument"); + return; + } + + priv = _GET_PRIV(base); + if (!priv) { + _ERR("Data get failed"); + return; + } + + r = tv_scan_fini(priv->tvs); + if (r != 0) + _ERR("tv_scan_fini failed"); + + if (priv->base) + evas_object_del(priv->base); + + free(priv); +} + +/** + * This struct is for registering the callbacks for the view + */ +static struct view_class _vclass = { + .title = VIEW_SEARCH, + .create = _create, + .update = _update, + .resume = _resume, + .pause = _pause, + .terminate = _terminate, +}; + + /** + * Returns current view_class which implements the search view's life cycle + * + * @return view_class + */ +struct view_class *view_searchpage_get_vclass(void) +{ + return &_vclass; +} diff --git a/ug/channel/src/viewmgr_auto_program.c b/ug/channel/src/viewmgr_auto_program.c new file mode 100644 index 0000000..de2c12f --- /dev/null +++ b/ug/channel/src/viewmgr_auto_program.c @@ -0,0 +1,280 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "ug_auto_program.h" +#include "viewmgr_auto_program.h" +#include "dbg.h" +#include "defs.h" + +struct _viewinfo { + struct view_class *vclass; + Evas_Object *base; +}; + +/** + * Initialize the data handler view manager + * + * Viewmgr struct will be created. + * + * @param[in] win: window object + * @return The handler to the struct object of managing the view. + */ +struct viewmgr *viewmgr_init(Evas_Object *win) +{ + struct viewmgr *vmgr; + + if (!win) { + _ERR("Invalid argument"); + return NULL; + } + + vmgr = calloc(1, sizeof(*vmgr)); + if (!vmgr) { + _ERR("calloc vmgr failed."); + return NULL; + } + + vmgr->win = win; + + return vmgr; +} + +/** + * Invoked before channel ug is terminated + * Each view will be poped, and the related info about each view will be + * released in this function, and the viewmgr struct will be released. + * + * @param[in] vmgr: the handler to the struct object of managing the view + */ +void viewmgr_fini(struct viewmgr *vmgr) +{ + int i; + int count; + + if (!vmgr) { + _ERR("Invalid argument"); + return; + } + + count = eina_list_count(vmgr->vlist); + for (i = count; i > 0; i--) + viewmgr_pop(vmgr); + + free(vmgr); +} + +/** + * Evas_Object_Event_Cb type callback for handling deletion event + * + * Delete the layout and release the resouse + * + * @param[in] data: the data handler for view + * @param[in] e: evas handler + * @param[in] obj: the corresponding object which the deletion event occurred + * @param[in] ev : event information + */ +static void _view_deleted(void *data, Evas *e, Evas_Object *obj, void *ev) +{ + struct view_class *vclass; + + if (!data || !obj) { + _ERR("Invalid argument"); + return; + } + + vclass = data; + + if (vclass->terminate) + vclass->terminate(obj); +} + +/** + * Push the view in the top + * + * In push function, layout of current view will be deleted, + * and the related info will be released in this channel ug, + * and a new view will be created. + * + * @param[in] vmgr: the handler to the struct object of managing the view + * @param[in] vclass: the basic struct for managing each view, it contains both + * functions and variables requried in each view. It has basic functions like + * create/show/hide/terminate + * @param[in] data: data handler of each view + * @return 0 on success otherwise -1 + */ +int viewmgr_push(struct viewmgr *vmgr, struct view_class *vclass, void *data) +{ + Evas_Object *base; + struct _viewinfo *vinfo; + + if (!vmgr || !vmgr->win || + !vclass || !vclass->create || !data) { + _ERR("Invalid argument"); + return -1; + } + + base = vclass->create(vmgr, data); + if (!base) { + _ERR("create base failed"); + return -1; + } + + evas_object_event_callback_add(base, EVAS_CALLBACK_DEL, + _view_deleted, vclass); + + if (vclass->update) + vclass->update(base); + + vinfo = eina_list_data_get(vmgr->vlist); + if (vinfo && vinfo->base) + vinfo->vclass->pause(vinfo->base); + + vinfo = calloc(1, sizeof(*vinfo)); + if (!vinfo) { + _ERR("calloc failed."); + return -1; + } + + vinfo->base = base; + vinfo->vclass = vclass; + + vmgr->vlist = eina_list_prepend(vmgr->vlist, vinfo); + + return 0; +} + +/** + * Pop the view and remove the view information of the popped item in Eina_List + * + * In pop function, current view layout will be deleted, + * and the related resource will be released in this channel ug. + * + * @param[in] vmgr: the handler to the struct object of managing the view + * @return 0 on success otherwise -1 + */ +int viewmgr_pop(struct viewmgr *vmgr) +{ + struct _viewinfo *vinfo; + + if (!vmgr || !vmgr->vlist) { + _ERR("Invalid argument"); + return -1; + } + + vinfo = eina_list_data_get(vmgr->vlist); + if (!vinfo || !vinfo->base) + return -1; + + evas_object_del(vinfo->base); + vinfo->base = NULL; + + vmgr->vlist = eina_list_remove_list(vmgr->vlist, vmgr->vlist); + free(vinfo); + + viewmgr_resume(vmgr); + + return 0; +} + +/** + * Resume the paused view + * + * @param[in] vmgr: the handler to the struct object of managing the view + * @return 0 on success otherwise -1 + */ +int viewmgr_resume(struct viewmgr *vmgr) +{ + struct _viewinfo *vinfo; + struct view_class *vclass; + + if (!vmgr || !vmgr->vlist) { + _ERR("Invalid argument"); + return -1; + } + + vinfo = eina_list_data_get(vmgr->vlist); + if (!vinfo || !vinfo->vclass || !vinfo->base) + return -1; + + vclass = vinfo->vclass; + if (vclass->resume) + vclass->resume(vinfo->base); + + return 0; +} + +/** + * Pause the view + * + * @param[in] vmgr: the handler to the struct object of managing the view + * @return 0 on success otherwise -1 + */ +int viewmgr_pause(struct viewmgr *vmgr) +{ + struct _viewinfo *vinfo; + struct view_class *vclass; + + if (!vmgr || !vmgr->vlist) { + _ERR("Invalid argument"); + return -1; + } + + vinfo = eina_list_data_get(vmgr->vlist); + + if (!vinfo || !vinfo->vclass || !vinfo->base) + return -1; + + vclass = vinfo->vclass; + if (vclass->pause) + vclass->pause(vinfo->base); + + return 0; +} + +/** + * Get the eina list from viewmgr + * + * @param[in] vmgr: the handler to the struct object of managing the view + * @return The eina list in viewmgr + */ +Eina_List *viewmgr_get_list(struct viewmgr *vmgr) +{ + if (!vmgr) { + _ERR("Invalid argument"); + return NULL; + } + + return vmgr->vlist; +} + +/** + * Get the window object from viewmgr struct + * + * @param[in] vmgr: the handler to the struct object of managing the view + * @return The window object on success otherwise NULL + */ +Evas_Object *viewmgr_get_win(struct viewmgr *vmgr) +{ + if (!vmgr) { + _ERR("Invalid argument"); + return NULL; + } + + return vmgr->win; +} diff --git a/ug/network/CMakeLists.txt b/ug/network/CMakeLists.txt new file mode 100644 index 0000000..0665a95 --- /dev/null +++ b/ug/network/CMakeLists.txt @@ -0,0 +1,75 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(ug-network-settings C) +SET(PROJECT_NAME ug-network-settings) + +SET(PREFIX "/usr/ug") + +IF(NOT DEFINED UGLIBDIR) + SET(UGLIBDIR "/usr/ug/lib") +ENDIF(NOT DEFINED UGLIBDIR) + +IF(NOT DEFINED UG_NETWORK_EDJE_DIR) + SET(UG_NETWORK_EDJE_DIR "${PREFIX}/res/edje/${PROJECT_NAME}") +ENDIF(NOT DEFINED UG_NETWORK_EDJE_DIR) + +IF(NOT DEFINED VERSION) + SET(VERSION 0.1) +ENDIF(NOT DEFINED VERSION) + +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_C_FLAGS_RELEASE "-O2") + +SET(UG_NETWORK_EDJ_FILE "ug-network-settings.edj") +SET(UG_NETWORK_EDJ_THEME "ug-network-settings-theme.edj") + +INCLUDE(FindPkgConfig) +pkg_check_modules(UG_NETWORK_PKGS REQUIRED + dlog + eina + edje + ecore-x + evas + elementary + utilX x11 + aul + x11 + glib-2.0 + ui-gadget-1 + vconf + capi-appfw-application + capi-network-wifi + capi-network-connection +) +SET(PKGS_LDFLAGS "${PKGS_LDFLAGS} ${UG_NETWORK_PKGS_LDFLAGS}") + +FOREACH(FLAG ${UG_NETWORK_PKGS_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${FLAG}") +ENDFOREACH(FLAG) +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fvisibility=hidden -Wall -Werror") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}") + +SET(SRCS + src/ug_network_settings.c + src/main_view.c + src/network_viewmgr.c + src/ip_setting_view.c + src/vconf_mgr.c + src/wifi_mgr.c + src/connection_mgr.c + src/util.c + src/wifi_passcode_view.c +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) +ADD_DEFINITIONS("-DPKGNAME=\"${PROJECT_NAME}\"") + +ADD_DEFINITIONS("-DUG_NETWORK_EDJ_FILE=\"${UG_NETWORK_EDJE_DIR}/${UG_NETWORK_EDJ_FILE}\"") +ADD_DEFINITIONS("-DUG_NETWORK_EDJ_THEME=\"${UG_NETWORK_EDJE_DIR}/${UG_NETWORK_EDJ_THEME}\"") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${UG_NETWORK_PKGS_LDFLAGS}) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${UGLIBDIR}) + +ADD_SUBDIRECTORY(edje) diff --git a/ug/network/edje/CMakeLists.txt b/ug/network/edje/CMakeLists.txt new file mode 100644 index 0000000..aa61dc2 --- /dev/null +++ b/ug/network/edje/CMakeLists.txt @@ -0,0 +1,14 @@ +ADD_CUSTOM_TARGET(${UG_NETWORK_EDJ_FILE} COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.edc + ${CMAKE_CURRENT_BINARY_DIR}/${UG_NETWORK_EDJ_FILE} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.edc ) + ADD_DEPENDENCIES(${PROJECT_NAME} ${UG_NETWORK_EDJ_FILE}) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${UG_NETWORK_EDJ_FILE} DESTINATION ${UG_NETWORK_EDJE_DIR}) + +ADD_CUSTOM_TARGET(${UG_NETWORK_EDJ_THEME} COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-theme.edc + ${CMAKE_CURRENT_BINARY_DIR}/${UG_NETWORK_EDJ_THEME} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-theme.edc ) + ADD_DEPENDENCIES(${PROJECT_NAME} ${UG_NETWORK_EDJ_THEME}) + +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${UG_NETWORK_EDJ_THEME} DESTINATION ${UG_NETWORK_EDJE_DIR}) diff --git a/ug/network/edje/images/btn_down.png b/ug/network/edje/images/btn_down.png new file mode 100644 index 0000000000000000000000000000000000000000..91946d8bec021761021295553480dc7962fa50d0 GIT binary patch literal 17853 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/btn_focused.png b/ug/network/edje/images/btn_focused.png new file mode 100644 index 0000000000000000000000000000000000000000..23bf3110e10797618b2b3ec49c3678405a8c9bd9 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp@KrF$*1|$_fl!pK*#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPShY%-^*%Wq0U7(O;iEBiObAE1a zYF-J0b5UwyNotBhd1gt5g1e`0KzJjcI8afZr;B5V#p$P$47m;{2(XyuO2wx?4PL`k zxuDKPkzYcZyZC{l0!tIOn6<&3!i+QfnPl!1Go{r8bsS)Ax##>oaP}ky{Tb|&)KU*{ zK5MYq literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/btn_normal.png b/ug/network/edje/images/btn_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..a8895237211db43d95579fc903263a34c4ea1bb6 GIT binary patch literal 4033 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/btn_up.png b/ug/network/edje/images/btn_up.png new file mode 100644 index 0000000000000000000000000000000000000000..4609691a1fc2707bbb3f36278900da023b8e57a3 GIT binary patch literal 17851 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/check_foc.png b/ug/network/edje/images/check_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..95b02f083fecb74be384e9e7b71e5425a36498a9 GIT binary patch literal 18316 zcmeI3dpy(a|HnUzoRuPn#65J7>}aFS%wdF_!eml1+sty;1m2>v_Ge>vL_7$7jnj zS9@iJ*$MyvC_6gXdWhaRV=p-w(f|5~Z=6JL@*D>r9sodV#$J$9k+fm}P;g_BNXwQ5 zvH5IX5Ss&aB$1#TE<2DF!T&G{>U<+T zd6lI}dVBB9az8)A&Q4nUQht)u_U$p-X1N}=9V|h3gwj29ZcM@F-nJQbZ0!=bg{1fQ5W1QR$(p&P?0OA>+yySAi(=* z0%4K9Q1&bU5!_Ie1B5O)Lgbvp(do}@vQ|Q3HbaE`)WuG6F=~KS)OMQ#fYlO6Om60U zPat0!@Nb|6bOOs@fd7JxPi_D)x$m>qLjd1hdb1$;sQ^@!kz@-5nFEKLmv6NLC`dpp z(5Vgw+=T&1NAExf;OI#}*rcLZ2FNJ^NcW`pg@E*W!2gngfdJT?1*k0<@Fu)oRI1Wr zBqEhnMyQ;Nvy1hWgN4g_d&6}Nn;bP3shLuzP_wPzHIZ3b=vd73hl5uEAU}1MXtaaF zf~IMuO--iTE2gc6Jv%2esvi*0Inv!+%&`K1NBroP5o1L8>=<*In9z}Z^ZKNN{1o%o z4kZVcO}9D$dGB6#SJ&O8bvC}#E8ZJMm^G_~-oqguq6wde-ab70 zcy26uRjj@A`-e4G-#8b{Y2GQnIiUSXiv8!4ild)(Zs^xJ22@gv)H>Z~hHtmc-ZqFX z(BERSbK!+~*GK7(JB&X`5j(KJ(KSTK`c&A#RWzx0P772heBt9E02ruZpTB7+ClwR4 z=}~jUXusvKef~TkCeU$bH~{$B&V`e&lv`eu0|49nSfiuX+HcNl8VhCSoS)i$Uh%WP z>1La`bu~6BHVX8ZIb8pRhvRGv6B>`|82KY^TIpbf?m-D@oN4eHuT#@3IMY8;#UqTVIk>rRudNK?1f?47ST@WW~SNJMSPpGkGrba*~?6zEdjJ0p+ok4E1u*8L;3^ z!6mL-ayr%g5`d2ToKS6#+7(;oZgErT1gY|%+3d|r_9iId>xW{K(Y%|^4 zbFDaNdTR=ibP*|hswrzy7lMS>*V-IgY%HHfYdEHVSgE*v_R-~srK+~Pr8OUmke(T9 zCzLmpjG=H9Gd|R52B1-i6bEC2 z+cQ&C5i0AGNOfj&XKo>(7gX+;;&|*I^7Wb5ms}6?Fz7Wtl!I}YZIE`kl^$Fsi`!)k zU34kFE4Qn*%cM)YOK-qeAveG({Ga!pj}1MptXZnnt`5ystO(+CR;B zD)lBpNjYKGri)2TL#-T5Sxu%^gyxY<=L1?dlC>_9k!GmpnLSz4v)En~qY9%xXQf_I z*u8Z3{N36{2=bw#14R#t6ukz$8ptV!{5&_5F7Yz)>^vlYGricWD0kUΠ@;A@hTY zMa+Y2vgJR~KEqpNd}^I*-AMnq=O0_$SzQlRq-m84jP-(*ixbwyV(aD~YrOa8I-{!0 zVV$aEi=sn&aU_$aCf?;9gS!GPWjiy&-|ykO%J&!+W(-DeeW2FA@bNFJCnBI^oGBNEo7Aw?@cS#S)minJI+a*QB#TwP9f$E7vpUhCNe*S;^Zpn3TN5DXsyYL4@aM*WbT%rfVtxZTPB3 zQPX@ zcCOdRL|j_MiQL;%^CrGf{SbVnF+SbOImvbLu2GH z-4Sk6r00@W!FHmB5<;%qvf6hYKU7>-NpB9k9@zWj0W8mVT6$5& zlZJ#jQ5q>Y-uc<+E*G5HFWofwvf+96yy0S(a`o>V2R7DRfndYiRh( zi&EF6hGh+=Rotn(c}wTI1=%Cz_M+$Z(=PsTb|kky0;X)L?Df~4`o{(w+sLloA^DCW zU1fahx^3$ZKa#!i$2uLR4q}Z>_CWTM9M9}ez5%|c-L4W_Za;ev_1V7dkLi0b1fR&I zgXGJs*50@qY0QDY*+=lJL!a@V5k}H(xLvH;QxiYx2FY3&R^?^gZ+IeP8_urg}e62ou z`&J&#;{KVzDE82Wp|>6C_oKNBhMO9y?nNxwzS(1$;5AJ9!Y(hGMzLvB`c*NK{?@h-eMvS_t=s<-21tZ)J$)lpQkahZ=|7A zLmd(Q{?_w5O)Z%%douEGWm z-L30S=tjfQpby91dR{C1l%|!IHYzQZIry1o0&4>RyatO*;Zt0k@icZQoJwa0FyMmF zu~R7k5G(~8DlM47hXyd1tS}4x{;G5OP!`=n-y7?Kbm5Q~K`e(TF2gg*l}w8Yrs3%N zmP7@D051v<%HUI>g3ypK9$sLfKOPq^`aD*Q(1(s!;RjpjTaPserMN7ElGt1Z6br|~ zXh<{)YKDWOuoxT)Wei0lQ6>l!5`o6SP$)dc439E}e!29C3ZhR0EdBXp{jxzGIg-ObcrbYEwOks*ZXF|xZ}6*5&}rY|aMp4|#`(}`2u27aROG@FbsqK0 zE^xkn1Nr9uLpQ$3za2fF75IH}e()Vre(S~%uzuq*H@hI#f zBo2>6P6{$n6BNTml=gHgpZag2{7@GhhfQY%M*gcP-)sID!^H*f7{=pM!)OdgTcT*} za2AV>$1O(UP&676M#Gu~z;HCoVi*-|hJ;a3i>ZM)Is=WR;>HL0qx(;xZP~Q7V>$FC zG+h)r5W~QlU}!X$DHdl6!=f=L7%mWrg<%(Ca5Pf}HV}mg_!@eW`%j_WxGd2oL=Bl# zXRP=C-6nn!=BK6{SUgecL{3U6QDTj6GoFm_A4|UqA*}K3fWzY$TA4

>zn5nH`dP+`0prB#GmB;`!*ti7-8ZPej?O( zt=|XXu><)LR4&7sDawieunZ>x{^$XYOhAn7$sw%&gE`<)*Zt3C;NLBw|L-&KJ$GqA z)G#K4PDFf7+ph)xZqg>E^2hb`bsPA3{SoLid?1?}O63z-p;RUV!3kp$5Z?>Gw@LVR z7s8X+A#AP-o6aDb5D>pA{-u}b$F*e>zpW8@9`-g+M>~=!3TJ8xL&H&%!%V6-DbCn^ z3@_SaMEOn~U)v&|pUS}XDPwy@$lCGxXp{+3bcs$pqU($AWF745^B;UC>tNsSu3lj* zJ`w$;IZ*K=ud&$-jv`H&j+MRaDjk`Hzl~l^8u+6Tp%FgO$jdXd_bxM7YK-WQ-Vu8 zACM}+1p*@8l;9H22c$}Hfq;lNCAh@%0jUyPARyvR2`=$`K&k{62#9!7f=fIfkSf6i z0wUg&;1bUVq)KpsfQUCGxWw}TsS;cuAmU94F7bRosstAZh#g#O#tv=RP^2p z0Bex|@XTNI2x%q&Xs~y#zOV!UrtEUGwI&N%U$j{ytGa7iJxap{>BZ&ermJsFx|@`n zpMUTKrHHb1=O0kY2lo%LA$q6cPpn&4234$5P)}dpniN1?C>MuTcl7s3$6mhL-frHH zbAj>}?1&U3W-0Z0dByK;i%Yb!QoSavc1;=saj_Epi7}Rqi5SS#v6?yiqI3R;e&XJ< z{niYBjaORlE22A}$Es!qTRfcqO6NUr7+4+4c$i;!t-4Ld7?KiuM!O^*T9Gz1+FXfg*04PKlRU+H;wFhJhVQSd%%@kSo33~Oe7$6x2y?w!aHQH~D@W71P&PJ)D3+v7bYM;Ed ziU@!6k)Gfi58@_76Gnb>@$keKZ4LODohad6sM) Qd#Ksb&egWm#y{@A0MFV|1poj5 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/check_nor.png b/ug/network/edje/images/check_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..2a3e5d9e284741d04dd7a24fccd75c7d70f997e0 GIT binary patch literal 18363 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 Yy=rbEByQ(SJ_BuIX=jmR?!M>00N)aK8UO$Q literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/ico_dropdown_menu_check.png b/ug/network/edje/images/ico_dropdown_menu_check.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7d114640bde4abbaac4165a1829ca15854f039 GIT binary patch literal 17850 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/ico_spincontrol_check.png b/ug/network/edje/images/ico_spincontrol_check.png new file mode 100644 index 0000000000000000000000000000000000000000..3b57522f783466425759203110f54effb8fe7690 GIT binary patch literal 18264 zcmeI43piBU-^aH@uDMjAlFqm!$=qFZgJ@5 z7G0DQ3W=^nca$R}b?ARm=~Vb{6x!9i=Y8MvKJW8?p4rbc_Wagw{l06h&szJp*PiFu z;@y`yC@aoU1OPzU$tU^2!05U#R&odAhbEdi%s?F(XbeJ^2WwFE^?nU&vT|c!qa9)q9RDrrFuaXkE>Ulis~Ma_3AB(>;rQ5@&1hB2DwW4sRtbK9;T5~^K9l#`#rj@rnbEkWfi5U&j-}xizy4!eT&Fd~r#3Sl8dbW2md4fNuo=?ZSx0A!Bs$oX91zk-Famf zrtR#<9o3Du*}L${{H9^%(>CLe(&RQ%;N&{8)TTsa?rMhgJLd&zG-2h_0RVVi#;dw( zC@&ou5Z&G&8h&Lt=#VuZh-5kKT@L_jZ1qvp>&2FJ@&I6)6=ihNTI)^KEaOVqxm8nI ztCT+ZnQgVvuc@|Cvr%M5&JFQfczlbEVeGAw+D3lpyH?sJl^y}HNqiMlwfA`y3%=?H zx_oApVR@8-jP+Id8FZcII4S?_G`-#OnyE4Gb*da?rti>4T#Hlp&~;8Ub;NpZry{%^ zwO?C={6yHc%Kk#)lB)o2%ct0K2kgG6(;gOgr=F#h=9S&1?C#qI0jkXjWJ(>T^7$+|d`%DrReRay)M8_WB*u+Xy2qy$)Xq7%{J3;k{98uD zDUr)~M_RujGF<0MYTC;+=g7j98>IJ$EYW|lt= zyN%{(tapEU!VI+9rZ`HCx&HKc3T{E^o}Zjf9icW&Z?bRVdg}EU=cSuC&e2P{*31k% zEl1dAj97FvrZc1Sawoo1t5fIoO2rI+tMy0Tdp$MuyuNPf>@Kw~lP*~>1!wJjIL-5M zZZ>tAX~GJd!t4^y6CT@gXP9hABixGCaB@CccxeBfIRTmh1Dq4jg%_qh-al_y@@=1{ z8$Axslb=h!5lvN&of%yh$2OduK1*&Ed$wrSi4>P(v+wMfT}Q>3V_&9pr>ds%ylF-y zM!(EVyso%^>3)O#T1IGUUjDKCC;3X={oXgI33+S0HW%4@$;^2RxNN~C)7{L==OT#^*Bc{ zN5j>E__hd@A9z$NyUbQ}iJQ}xl6i4WWTp!*=Sf&a_lLQg(Sy{%;14-(9j4M`i>K<# zwoI*`MY>|To=4I~*R}lVL0Ns-igJ{`pPt;lHLCToZ3|#`W?Zw!L^4C zWDRr-oLyhI_N95cmL6MpY>CSfm%3XwZymaIKh-qd0{Z~ho!*`PAieFJ--^%`#wEEW z=Rv2_ohy#{_LY=#V^$D+kJ7wXtS+`M%qX0HzpStO;Pwf=U~VlYUF+Q=DyZLdnIgQw4Q&D3p zMbKvZ!S;adlXN!Ljc@|F)YOQak6K4+HostU!Lk;`^1XSFmO*n0a-K^-85NmvgD$px z>h0h5G~=mK$0p4b^wrh;uSv ztJbb&>!KUY8si>PRvFD(_S(_NHGJF38(c?xO7SIGvcOk+u;L zjI$tCV59dY?pbe>uj86j!hXSi#@cw}I2dz!=n8koIrO~!a@PWj_Z*+%i&QMJIrf~o z!tjBS+-WxG!@6`U{yO16LFS@cy*G=mx9l-L`0BUe-s#oT+xM0njdk`xYSW%o9A8H` zO&CnvxjNe|Q-lCa2^Vf%lt)X37+j!S6rMB)nlUGnv%4}dYv3j08 zL1wO0Igp?HELnxC{HXbia@+DVy>H*ywV;!48Mc%~mrzO%Um~3^2Xn5~-&$fxJwkm$ z{XjMAYkGW^{@^{gu}^DL`8$(8?zOBe9~dNGyV&9_L?>bofRF7{P z*4Z=ceQBa(8~-sLj?!ud_*eoo1izmG*I^|H=z)H_46nUpxu_Om8dZ`jg)>NQSt&z3t$?AHxDGxld}jzIm@>eq6pWK%bzzHOZ<@6`o0VSAI^@Q&^! zUy*@8|eY&MmZcSyt_m#e3$Hl4i8aupm1$o8 z_)SIFpBlsW?`0A!9#`~-^9HUAylvBX91*f$u>MBbBhiAs!g9CrwQsC?tshYyZ@Xu? za;Wv;tJYuFRf@9u8(SR)WMiTmh7#WmRgQg`xtL5KJhcoN?D>>KX<#-O zWNHo_8oE)Wsez7ofA8gk`o@&T?Bv(UNtc3uIXd{F^5yIkEw$CP^DbTs#bejJS^lxN zO4KUSes#D_)vfav#IJ_K0e_u(>vcQlW76!Tq+uE9l>Sc)JhBAD}-B)FobP*h;g|3gOE5?;i0RuRW;US<` z_%bRZJdi

ROT&NufkYAQ%+V5uw3BTmdoELU&Y`2z?(ZM(ZL*s|W)vbgf4kM9^H_ z5foksh%iN&A{iJQ7GX|6VNFd4SgbJuhr!~}SPU9RKw_~(6LTWg4DtEUB`ZSTNFhuX z(bLxcb90bop&K9+@`-4)NF+ju@F-pg8;vCp2xtrrjl&_K8c0DHS4a;;I#!xwURT*Qbj-JiEXXrZe+($M(vd0fH#@rJm9&+H(I=ukQzjYVP5KL~Pl6(1HH z{M|@_&~78tlg}gjZi5197#~D?f&$)#5C&+s5#$Q>zSjvRV_b*7AtY#&50ilggTP=Y zL;!Uj``s?^zdV7AhkwO9hq;Ma^wi0r4u%3NkI#1G|hN{>%T7j;t1l5rVBnj zL;#Llg%-MBF2nKsGM+w0Vn(lKBAqdkXvmC_wF)vx=&wpAx-}m8IgIn|1pYnBWBQZA zf82&B0OX2W@MBV=wSFuj;IV`vdI)IEhStP?aT$&YejNc&37~W|I20bk4@Ux_4joW{F1xBO`0SogUI5A1k;6NPB5JfqWN4l z2|ZCbu~10kTL&VA7sLy3zm^+&;jjIq2qJtWH&t2SA6JX zH#~GA(woZ>l5w9~gB4GT8rdO@LG^+*^B@@-8oUTz+no~%2GMLe(2ZO$a(lu-V;YTt zJH8v}`=h`~j?aN(%W2Yz`PP%Fd*Vh2`=$`U|tC>7!dKM1ebU|Fs}p`42XDBf=fIf zm{)=e21L9m!6lv#%qzhK10vp(;1bUV=9S=r0TFLXaEa#w^Ga~RfQUCGxWw~;c_p}D zK*XC8T;ln_yb@e6AmU94F7bR|UI{K35b>r2mv}xfuLKtih>{{VUbh-pn4-GEa3M`zB|Dm?8IbLfG9@;^t>5iq6%xax!jAg7L+X(GrHWRZjQ-exWqU9zjYh0~%6{Uni z(uyc;NQESqzSnYfD||ne(5IT;{XKr)-yh${V?K|^n0cS~dA-j$&+|U#b7mfokNvKz z?c`+^$^ZZ$?_h834!&!Hues8a;9oC)l~M3*HrL*V2LQ54V=plv`NRSMka1xWiLS1G z96pEV$Kk>ph(s7Sh(l)v&;TI#MXCpbR`BX>{30= z*>hG!Yo2_r;#M)&#zsQ@PI|QX;ltsFRNVCC4#+%{YS%nD^ja;fWpSnwlRX`tLWr5v>=YE<#PRnmH~@V#Q?{8&>*>2PJhBJ{A;Il#hJEIc)F zsRxiQ0c^fc@ofWK;lSo)yWTzm!c#vcZ5IR99n(}1OOFL$O0;Nez;7jxTes$b4d9Ie zlq(bf(I_9g+!wtZgsKUd_> z>C^*BB^BU{b+9%O>!jgk{SA-}fP_;8WJCiwdslA~I_zHK8NbvaxM0C>$0s~^!v7A_25DH+ZhIklu$!f&H& z`qrU?^a4eT%RqY93$K3e7#o|DM~a_6?`Us-wyMf%9r>Qu&JjlCrgE?0fWO1=Uxo%> zU4Nq!f!PpYC-L!B<%0pIvy1AE&fe?W{5Hn!%N5ztFB*@usvLZaz4esa+~x%ywoX3O zk2$Ng-|Fb{TT2>7sc%~KKZ_GujerYV2x8k~;h7sK;(s|Vo8!$de=`ICeI=ZV$GXzu z;eLBw*9k^Hm=D{fF9E{o4o3q4V57ATf^@IY{I)azSf@wmU9eOis92z1F1e`Um*xuD zFPn|`TIp0(TFtSNp@uIC+Ppk>x0UX`nhP3wn~{$#Gz`n#{Px9h6%du4R~5{-il4~R zX%)Jq5wj&M??@|=HD5%F`5y4rJ}j-86!}rJ!d_zDK^@rLXk|Ao$5c%pS{KCKhL!EZl2*O7Pw`G-D$D9ts4oO-f#?te2vU^MB zNzz=Sn6*}UCyU(AyG3Ox8E#F+*6f+@;CMFg)bU3P{Z##inCIW|ugz^azIb)QL$8MW zU3Tvh-iZ$gzFbM|eGFsfR5vF7=X zZF(h%!x|+A&9bvjVu=Q;47>{6`;XDhrP>k$Kc3*Pp53XNkOAc}t#@l^73FGF4Ka1`bWnEFb z(D6*NDZhwSw3E#6Rb^bcm4CB0t}JfnwVl5Wn@Pz>Jy*!lSgR4nyA-61TZ4OeVfG%Gy`) z2Lm^}4s94rO({&N?8$68-)r2uhdL8$V{4fTk*;Cyo;;Kyza<~M878+ZGAhz*pZQ^KwD-b#bb^tfzM05t zwf3hp#fyBV;4C;9rghlA(8?ythw|?pA zk9w2(Mz(FcY9jK^25!j7+RA~*jQLrJdHT3`3#aJSrpNweIY%#Z{-Gs(N`fVaWkM=7 zDj8bHdgJ=&XTp6!W{Uf&2C`9L$!CC!|;=RkVj+8pdJGG?X(&i^`gRwAX zxH9yfqp?QPZzaXkPRiHT&;j<8#th)buG4X)4=Y<5>g*q}vEttDipygD-LjrC9g#b`o1gY< zaPda^v|c8E+Lx+MP}zSVU%5#&L1ou7-R9s9^(fB08%fQ_E@kCZ6;tcz4fL+JFX3tH z6ymcJ-XL%}OKBN*Yim}Tlg^L^NS{c? zy$vmw$xlDB>wDF=m;Pn=M`P2v(xG9(-Rn)BVxG>8^hVlehtGvW=K1@xyFSK$W^Kq@ z%?j+fE#4qLETyeb^tAYKqeg=n$vx)Dif%iF+rM5PN&O&z%Nxsk{&u4JjW*Xhq`hls zcI(h$dEAR_hqmXwmU{H-HVuXba*I`RU$SkANAl-&zU!{JJRsCRdH*u>i(S*NiYE;5 zJ|V06Nq3nqx^_Q`WAxP>NC9kVq$>(vKSnv7o@gs4MTyB?~C`ryQUhiMr8(MaGJAJ52J_CdhU@{kpMxc;C5ji^xm$6tsRPy*X z+rXYoj_ijG@<<_E8q%G{<7^G0&}_ER*nI6Db%IKnio@L+6fn+*NBXe>~|13QoY zVHdbxzky82zv;%5`=_JlGwIWl^Nn`Q^HUiunE4agm}f#Zo(dB)ga`8vM+~Bo`J5mU zhZ8`U$g=70PvF-lT`wk^$`SCEH&3Oz&qU1*meCb$Wa17_42 z>;3<>i64adt|@ya4@{kq87T!O*7!E#K@0r0^s6I)Ilf(R$w55Y*eW#B`nn9K_Lr&c zV@xx?nsH>x*hWL3jO8kgibsA^I^C@)<)n=H{RI9q$`kQt$ba63z>mfjmhcmy#%ujN z2#-VO3&=q7i68X1oq+mi#B{||G(BX9e^&A>lfLjUbEFrB*;KQfy^ zqY{u`)Ann@Kby3Psr+_5ecfTcUw?Qi1xM!uvB-P^lSO9GkX$wckDM-?ZWBLs7s3%a z0h}Ob4wXhQz$1TD{6iJ^sz#u^*LF$na`Ff;1Sh%%D}&be9@{GdwvN{~!JxnkJn(?mq;#emD)kXAo#}>3riD71XIh9hnJJv%m=sQ= z(~Q&G_!coy3Z4zYV<~d#T>9PaF}1(`CqGP&=sy`15=+zw1c-1`giAOdh*yLQ0z|ke z!X=y!#4ExD0V3QK;S$aV;uYb701Ai_-%F5!G2UJ)(`5aFf>mvBB1uLu_eh;UPcOE@2hSA+`!M7Sx!C7ch$E5Zc< zBHR?=63z$W72$#a5pIfb3Fiaxif}=I2scHzg!6%TMYte9gqtE3+EsqB3<%g16jYZXOF(>z7}>PDkYw)QZok(!Pj_{N?7cS`-1@Xkc;#yU1Qp1K;N zcIH2QS*qTs|EiI#>T0{ei|h&Y{V7n~!PAXZ|U zc1f@{akCWidd_bxOx)-!rGQsi5)D;vFYUanhL`epV8`VyE!H1d;gMCeBPAYnP_7>f Z?A^PZanHR#792U?V6)mf-)i&je*=kyrUd{1 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/ico_spincontrol_up.png b/ug/network/edje/images/ico_spincontrol_up.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b25873540507e3accfe8b0a377d73872511cb0 GIT binary patch literal 17871 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/modal_dialogs_bg.png b/ug/network/edje/images/modal_dialogs_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae9c5875e9e2e4afddd42325caa8d72a01a0e46 GIT binary patch literal 18657 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 B5M%%V literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/radiobtn_off_nor.png b/ug/network/edje/images/radiobtn_off_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c3522d9cfe6eaef506f127b95ecb786abf1174 GIT binary patch literal 18295 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 z zocmm`W%&*TssenQNz!nVd9qW|*hcq_*X-|Nn;!H(4f<-)zFho-4#qWb?Fjx3t*tM- zC5}4WcrfKy%B~RD=MJ~_Q$@kOq=wFI;*6nd60GOVW|Iec*Oabl*fe~VHC)i%Bkgk4 zCFwkRE4`o9kC}*Tv9B&UQIeEjyveJ0FsSTuu*Ybhe5!uKllNtT?-ouzXiY^KJSiIq zVvOD%{m{AaNeEMQyrHh-FwBXCCpsPtb?n|&&Q2R?>aZ9U zh}hFO5&I!V95*i}F{Un3Eb?{gYAg!%!jL)M_casONN!X~m76#%yLUo%t4(@- zzWBlEUglWb;<&iUx%>$uUrE}~b^t(2)9?fq!PW*%V$fkkGQ*t$3!wXQ4x#{nF%0k} zlDsG^h&zQ!^D$5wD!HKqp^*)gTy$-Ag zQ&>bu0NvZiA01$zG_8x~e4Z+XD?z5Ku)GYEjHeoe5Ny{$a115|q6^c7lC+Qrh&~F2 z(A7a95SkFA7D5}2(1IgTPy_<4qmM@DLB3r|SYgg543q4Eb~H8r)*Qz&Q1WE4e9>?? zo6Ux?wP6e<6^=lmP;f0I9EpT-YC!!1eOSZ*sE@z$jL3H#Q;I){N%LjV7(S3GU7|Z< zJIg>xX{wI9keL&tYJ(|ei^nFObJQ|O!!e@^ESf9!(q_irFS z!hh+;5BFb3&!Tz!oSa``r#ycRqXf|Y5;onh%-5_E*Qi!L@%*^-m#+DUn6Na#B$Ts-*)(BJo-Xw5~2%OLvtP3azCz zOJt@dNW+$s_GBW9_-|BxsSDO&kZB%)|4QX&&0jTaZP8Xf{w$&oiDG4n<%}Ihqmj`h zqz*!h;_eRhAnB}z>LPSVP!x)Yf)a^jZ4VTQtWP1%4D#3T-=s|$r0r8V^i7(~k=Ak7 zrJz=mbfDU+QAj9JM+eD~Mz}+DDM+L~Szil<(AJ&i$B~{D{+qNtlg8PEh~Bg6O!fYM z+Qc7Zerw8-=Fdr;z*#B9Nv!E@#);zhYw34~H*I>m@Fg<+DO0P^Kqq3bFxu}E`0pss=+6rOdmC&|iVwGhpOKob^>-0} zh6jsHWKxW&oSgV?mf?)xuMuEn418)&_NM(G%z-~~$Nz2y{@oJ#|2_jhbC={v^r2G7 zSors}{a*0zCT(Uae_c=Cw}Ic+ABIdqdoY-EA`45S6R8xquMZUi|5^C6P0WwG5E{qu zW-x6TWC~Ur1OHR;AEP)wuC1H-Z4K-1Xkh}eGQ;U1P&pfI#c&CG-r?D za(o z;o{B*3MW z;coJ9apwc_@^FEGa5s6lxbp#ddALA8xSKp&-1&gKJX|0k+)W-X?tDOA9xf0N?j{cx zcRnC54;Kgscaw*UJ0FmjhYJLRyUD}Foe#*%!vzAu-Q?lo&Ijb>;Q|5SZt`$(=L7Qc zaDjkuH@V^x{`sUQ#fS5FC!6ye=MG^O=f6V$5R#>%EdT_q1c1;z0PuN|^WFyl+qD3o z-;MM5XaWGpF^+7#Z4Ll)c37Dj;{)2>B-naMJIF+yME9@tyku3_B6SIBvRP)+RcD)p z8r$STzV5AZER>yR9PZQN-g457C8<#rAvq>!8oNVUy|TX`@xIKpwPJn zO>lI|Jf#W=mX_Ka8|O#OXt))3#cfEw!o9%b&U=lxs*#%TH+j3$(Z`}I4z%0lnyA+= zOV%yklpJPyzqBn8p}IcZRqRp5ou1)KA?#J8Mq0VKEsSc={kk$i!&~QYh)p6rOn-my zS*!N#<8utRUkqMy0UB2qWF}rTv01k04BwbLGw{ZIL+{%yZ4u3p!f$c}a=n=-&x$VH ztOr5Wc(1ovuPQb050+X{(iU8O8CNDQGVdz3YpIpA>!@2%!%uoMHWt_Lt>J$K+g5P=+5oLaOw}9u@fxaF_R&M;fUxx{qx85#VKj!I>E_;66PT&Vi9#QUhcek8S)Zcpn^ zNM7RDSXBtDGdt6K I6SwgH0!iFsiU0rr literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/radiobtn_on_nor.png b/ug/network/edje/images/radiobtn_on_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e9dffb7556cac41bb15d120d4ae7a82b0ba7e7 GIT binary patch literal 18195 zcmeI3c{o(<|HqHW8fih18cRZEwKdZi%UDCg2(89!Cd+7MvObAqX?c>AHKN5DDW!xO zDasm3g;FTtq31!-g5O9*r<&jMyMEu_AHVCGb6vB1?$7=H+~JcV zipz@w03c~)Y3jiJRGWT@3UlAH4f+bWA7Z|it}FnMSTg+*0FqBF0|0S5Iv&4ilLv#% zV0kcnAy#-i#FxpS(!D4E5YU$DNFzA*$r_A3A2qR#4n1MbaF7v&IG7v`T^g&VsU#-7 zAzCTpsf>NaA~Q1~g?s7If=7>r9+9!vT5w4GiAayqnWN!nqYu@5dKrAyv$bsOb^YYk z$GF}LBdJA=A{@~L@s`^5x}ghlOja&>5ng?#>SYhiC`??{7myY$A}g^bR0M$W5G;1B zGDqYlAP~?ZAqsG8Q#gnfQBw>1O_H_=gdPy!uw&O*i-s-*jDn7uWCBL!0->piYK}m< z5a3oza_@cl`(C#Ip{e6Z!2-b66G}1y>9GK02_@PT@K_IAXxx0r3~)gJOR3g( z(7+QYfUt6=S^|aF08WFn#AQHq0f4ZNj?e&vf&sUCDk=fMfh1t5`LHwgpS1ysd^Qx_=Qg%b#lg=TLj3BI>pBkjWGbd3SPa4DnWp}MGGs7LtA zM*pd|h7%U)tAS9e)$!c`u)|apMyM$=tQG|T)ATUSLSu!|ie*|H;T0A0J1QhTyXhS; zQN459MA}509J+$(rg34viF#yxp`xZ6{GpMe4#(ajGR{{DcH8N?l!5QUk3`Y53iYxu zF(Ko7qDzQMZP5bmhg?*SipnKLj4M@G3N1dY3b`M>)Lz*-R@V~gaEJhLvQ!*4V9rBF zZ8N_SyZ#=4+W$GS%mR5L?6SSV!v$CICE5D&2h7h%JRq}?$uY9&DG!)eAVuAB%+L+&L%rN%g!Jy(v8_- zlAlrRaM3<0dx_4TWORMFtd;fo{4*z8y$ga^*ewS5+E65a@o z`Y(`-lnJknrl~JaSthcKw%mW&#YCITMoR}&EW$brP(q=iWgCl}3P%|B#fYs61( zIH`70K@(2M$<54to-5%r;#5nB$=Tt!x4_&<+p#-G>|uPKQ*P>}0Y?Q#TF(0Hs9ah$ zgJ5_r#C77Juxq7Fr5*m9efp)H-DOn}3DWYS04*g?$-KxtVY+wJF4aH%!%wp`aYC{5 zut9E41{$xuLEE{=VdMnWP^3F?_xLIHMzLP?tb~z}L(iAK)#%bt$keeZK~lDP=Ef() zyX0Bs+2>gdlR+oFWWV#L& zm-$3&LA#!JaoV!I$UHwae|2kVereXCtdfm!8}rgyX_bZl6yGn-xwgFU)f3_Nf@1ID zy+oS39PQfOg36(|^0>V>_Wn6xAR-y{R4Pw#i(&}t3UeuDGv;}6!>J*|y?00B``|Q} zM(M^U+TF!VYBlcAQyo)UENF7H5?1&~^x=cn`)gqdI9Q58)w6r$Jsa5Xc5ia5Mqb73!`1_Re_V> zvCjFA3$LB`&mAMamBYQqF;92ny0QAtQO{j>*6DMu-Mdz6SIJ1*8PSQ~r!qyJ3YuyH zvO-r2&;$>L8Ha71_h~%n52ag24KeMM_m`gz8Xrk7F_tlo*`L4vRYks%$GyLfEF<~VORyDy4F2%Np-REvR;9PX%^`Dc-`#$JU9~7mD(lI9W0j! zzqj2tFr(r2XhfE54s5X&Cf>*P4}w))m#XAJaee_Vm=?;@gW~9xpy0Y3&SEba`EVVHf%`c6VUAc(=^_wUL{J zFJP}9D%SLVWS2MSoKO%_t`=nL8MdRMW`D(10nY&mC-GMidj~om4{o<}fxC8IC4P)d zRlvy{JXEl>T`oap-xKwYfL97pjG9|X9Vf2j*=O(;Pkn)jy z+IB^!}?u-D5dS@#?2*BcVf5k?6g33@}#&#n?5kNY$Y zDFm0j*ZJ#F`_{6t3Ecgg?M?ztwvVWfD4(o86^$7d9L((-kN@PoJ%6M3?!juoX2A&& z6{+IKB@Z7dHX9HeVp`V@SV&c`x;dHp)*mXVC+YO(sj4m&U(>*zzA>@Rv6YgTHoqgm z7ha0AtnyQ&DZ+P|Bo8N>r#L2m+UmabhFu-5skQ%k&}WPGRSQq)U|j<@j1cbA+xqsm z#L-{0Y4*!zv#G&w3-R+~l45EjB_jvY*5T0TE<@%--{&lRBe_v6O>XkcWNm?*EIefV(ZJ(| zro^U&OxN=Ptq7Gdj)r+CmUgP0V@pp67lkS7UERyM?mV*@bU z0NxZf5fb3-<-@`R7$|>YL07KussWz!ixkmvqEG|`5~Hh&LFlhVpfL!< zoFFqjK{0H(X-_7yiT@_b4}HOL7-Tv%@Lxrl?fGL2TU(5k4~tFoAyKSMaooAX=yWm$ zh0;T#wDt6%WD1%L)mx{7fD%z;T_{x_K|<-E(MWfF!PUZsN{7}B$bSSx>Izh&~^H{I#4Ro9j&9QyAFk>Qon_sBmXJ19h1&2LPW1QeWuU; ze>%i3!u&LpC7s1hoxnLM#Z9a)WyX=R`^VOA4lnwba^Xv4vMAHL&_MayHvC>+zL$?_ z&6nMbA(EyG4UROOs}wR8{zL2RX?<6ImC=7*z<)=1CjK1x@5k`>p!o1g_?b{&di_2K zi$P`k6PXla8aF5Yn{7A~@J9tWG8R5vlfCHw2W!A0`u*=#;NNYb|L-d>o4X_rq7RKi z#=*a(?YD-1w`em<`Qv{2RtA3Fe^@dJLuD|%iEJF*n@FR;eSK(H_-y0snAq=EAq<}3 z#bDYp$P}D57XGW|U#hr&u5Ft6Zw<$CurPsGnc?-2XgxhB3dSvgvtj1+n-gdHI)>ra z7;e53zwB+U=BGArf0yZ6;kD;We|;2!dvI@fxW`xNTsK(i%3C_u4VKO-oqXtQ9O~<6 zpyoNM>5J_QR7dW8AqB^s8n_AEdlNl?;^ksW=Ux+7)0Iwp-B%6R@k^oW?}T$4UxhR2 zH0SQ^ONp3i<=z`|Z%g6d?@NEG9^dQhfAY)hjQ*2RL9zIQfPnBe`M7xV0eShjKtOn# zd|bTwfV_NMARxR=J}%yTKwdsB5D?xb9~W;vATJ*m2ncVJkBc`Ske81O1cbNA$Hkiu z$jiqC0>azm!ynI|B zAiPaJF5Y}VUOp}m5Z)#q7jHfwFCP~O2yc^*i#H#TmyZhsgty7Z#hVYv%f|%*!rSEI z;>`!-<>LYY;cfD9@#X{a@^OKH@HY9lc=G{y`M5wpc$<7&y!n836;|(CI8@7sbRv;@+9zkEz@N6jzR+{^1GaMSZ&p@l ze7?yH2}aF_zg8*|y_79pAcYlf(<{^|q>Z$Wi+tFg-5Pu`>-gUtjp)mA#n)DOUnN zxVD6+ZqKb#6U?bTF;&cwxEt@?Qg;Q%aZL5L7TkO(&^76Ccz#_@ou+&tDJ8*K0+F(* zEMLPCp3AvO=hU>`z=)?XPO0{15*8Of#}td7yz1P%lM{sTxly>UYnv5K?P9&^skIvA z4?0iwY#v@p4$wSs>93rW0|l_)WFtROie0hXiOjugBQIT%+M~U=?fqa#WpI2-t)fidDpxCYt5|1?BDZye&1(5pXaxK``NSB zKCsTtLRM<26aWCSR+grY(D$6NKS^=u|MM7exiN!h>Ba{D>4jr|VnE`_#Q-2>&!JM+ zt@GdtxO@*T4`D^6B6z-B7RL(&0RN}SPHdV}_acMA)&Udi$dF^!Tt@{-grmu!5cwDl zEtNTPYa>-oJyCEdpKoS1Tj^$MWFHt5bbHWnupc^8SX|jC&^RSw#>K7d-qfjYz9v~-Kz*ON6tBCttCU`0i(bule2)4xmZYY zyoM8yIvdz_hvD81tV06ZR{s3zJ`j>Tln^8aY&@o-AeI^fAQpm=rhvy9Ag6x)K{LP= z1IV+itBAm3B!IDUVOav_F9T(Da?<&Lqzr&@hzwr^%nky!-BeTa2lgcZ^5%UmG zNT==`JjBYMXLJcj?SAUg&l_W7cIrsclP8@W9go*mnQWxrcG)w+uGm`UGVJwNF!|Hq z`{&nQs)yn>hg!@YdR}pNz$R^3{n0u5+*@8nTYS1KJ^D%czG{_~dy%V_e7nPf9Z{x< zhx>79ss~JtuDY?Jag_P8P5a|4N}Dclemg}hCy>h@g0h!`0MJ*=Eq|aX zIV;2?>_xrb=sUw;ptkz(!#UDcu_6%)dTRLU)9FF2%*xD_eyplThXYl(F{NJBVV zD)$-q{y^Nn$^2@}nwtP_@27|o3+%Dbd&zV(x;60=M zg5T@~p=M=s2($f65cK87maaCgc8@JH5X;nc=0BaIH)qy9hl-V|u^HAEHLlM8t7@@3 z4!hsgQd{leg6M^4xu8gDm7e;71616~q9Z?8UHFaGxS-Lz(Z^A(TRSsJ$8xD!?5(Fv z&wL5uF>S=^o8cYF9hDvU4y6v2zKv4J?nXO)8*+N7>3Dnl+9jQGojRT3U_8#)`AnkY zvy4-;`MS{?Oma^ZI-YabpRrJ9XCkpSY>}09TJGuN_m_GodJJ;Ty%t=Z|Lpj3ySRHU zjd!{&UdO$jHQ*;B8=(+Z6Uo+GlC)T2F?)&M;&bsfXP4YRw4{cH(Zjxt?@E}Lz;$-j zD%9Go5OZ7V_}b$d$Cb3uw9KrtS*=;p&i&4JXwjKloc83IJL8?&Gv_=wk?ow7yzZ@& zk`p^~O~(E#b_SPb_*<~s@BwkRN}Ec1>TeFI7q+&SR3oGrOA7q8RXk<0BX)-BR%u+Q zeX@I(R&o5Wa`7R9tjtqHDt;~ArNFWO7|T$iJ$}c~NrBy*F3t3~{@{bH^6yr?T%~kY z$EFAiZt~1J5qH8h+cMiB+v060A+IMr`E03KvD?ScxyChXS8iHq!H%x`F}cg>iPN)m zsq{s*2Bi0Ss4UMkrBlVGe%F1{d*f5CZ3#)S;ik6+ly-eswg){-8}|N?{@y~yRlGn( zUA$SQZZY|W?hYq_cMdX&_5dD{m64cdhn zg;zkU{EiK0-Fgd4e8M*n-O^m0H*792&rQx<@vu0zIDLM4kzK4^cFIF`<@rAfZxv=< zUUI(kv3PS{p?BdPI@?{5efdUSWp8Y0?4GN8ei=59klp`eZnp9UU@NkV_+kB#hYncpy@QIQppulTpWQ6& zSSxtHWAlr^#`nod1xXb>8O`T<3B8=&{Vl)V)%kT*iW{DPukt4KxkG1zq4clEF`jKX z!S+=9Q1+!RH8cYqxaMarKP-(TA)?PR@HT&vsGyLx4pZ(hD*U&&3` z8s0|zS#6X#8aUbjq=&2!W6wGeY8<-phmS*nyH&178Iqd8Kl7jT7#~h8GFC8--kZC( zvpiSDqO>^JOJtX+3w4{h+r$&uDXVLH?iSo`KB9N>-LIoP3n~`8I9iw%VeNucc70Wvvz?ev z-Vx9&)voa4>WKB?Ipiw`3$?tP?6Z4Z;_`w^H3DrtL${RQ-dlc2%=4|Zvs7pJp0_QJ zdN$j;qTSjq(LY2aD^U~<9L$q%R*X~l`LSk;f2Y!Z?(ORdEypfqW>*z4>sgJg?pLkI zl#O#wWW~LTo9iR{iiR3kD7I4rFx?o%raz zIoHm6M^DYH##zG>YI6%86+LKDZZx1dMn7Er)?#kWPuE70-}xbB39`<=oUDGS#xo7* z=pLNYHn?1t^mNzZpqv*H_kY@@%vMHkH%aVEG*5C${J7D5<5l~+l!k|IS_3~>H2*a3 zqz>6FU~NC`7UyaA-utoazWT$-$CLL2qyB2y)_l4!sEbk8wtXJ=-Bmfki$=52LtSf1 z*3@n4yCUezZ|+>^a>XU_9BHff8^Ig$NbG(4n&OkiiFrkvJd1h*OD_en2D_C~^y;1s zlm`5I5Z`brt}ib3y7%t1;WuS(mz-;^uBcvq?Up|tyJcYg$DVS( z7C+^8XWHi3ckD*|tU2oO*M;{^_tHPcE{TmDojohQ{}Tg`YzBZe)f}3uz}41<#Nc|P z=uECVi1PR5K^sv3ARGGg=nPL#fN%%d93KPKcg5FL5gew0s*A2I#+F9~Jvf$uzMxZ} z9gPv_$sjUS4JlG&e-b3%4GQQ8e{U}zKFQxebzGMO9gj7mRT1M|1fB+}#$y8_Ty57O zs9awVp^MT*GB7wSLXU{T>go`&SZxFjgTLC#DNNBX5pC8H(kK+2W(O4pph{oX1I2;n{f#e7H2ha(f)KE8jHf9zY}C@D?H5G z`-66gq^VLw696ppf0n<_nO04lR;{@)Q+4{xd#ThRbJi0F* z9J>k)RKHw?ll5h?e2m46U(F;sW313n7-P8#LKJ4SPMy|dJ#%w4j{)@|SLU3jTT$zj>tI1xR|ARH)(|7&vRzMfT z5r|{i&Cti_Bi)(M5uJe5Lt>#ueGres6ZG}Jtnh#C3QXlL!-MX_2ALG}mq~qT_)l82 zzgPGE$Cu6575@L_viZjrZQ}ZySp>h-?yrj`naLorxW3+W0fpmDXM<>-51WjhYMe?G z^5oWmMCE#MeQmi+kb)mvBBXuLu_m zh;UPcOE@2xSA+`&M7Sx!C7ch;E5Zc>BHR?=63z$a72$#b5pIfb3Fiazig3Yz2scHz zg!6%UMYv!g8O}2YMsd4|?@>T}H!c=(Sx0!_v_f00LJ4Ku8z>{51-FcLTsq z3;?{@1^}dZ08r!}-Fm|u>buFx)R^Y~bl<%TvSCK@Vf0GCD>SOp4RPDrFWoBoZXR>YYzX58y;w}IH literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/round_rectangle_4X4_bottom.png b/ug/network/edje/images/round_rectangle_4X4_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..8037cb805363d16151f034fb8867d1ac82c62062 GIT binary patch literal 17711 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/round_rectangle_4X4_top.png b/ug/network/edje/images/round_rectangle_4X4_top.png new file mode 100644 index 0000000000000000000000000000000000000000..de8b5caa07c8a4112478e6ba80cda060a446dc4a GIT binary patch literal 17710 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 Mjf-`WmG92~0w%OV literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/second_depth_bg.png b/ug/network/edje/images/second_depth_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3c6243cce9d58310769c773fdbee3cb6b9b926 GIT binary patch literal 22286 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/setting_ico_no_network.png b/ug/network/edje/images/setting_ico_no_network.png new file mode 100644 index 0000000000000000000000000000000000000000..a0de3732842238489e781794c1bd6c3c5762fce0 GIT binary patch literal 20127 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/setting_ico_no_network.png.png b/ug/network/edje/images/setting_ico_no_network.png.png new file mode 100644 index 0000000000000000000000000000000000000000..a0de3732842238489e781794c1bd6c3c5762fce0 GIT binary patch literal 20127 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/images/setting_ico_plug_network_Cable.png b/ug/network/edje/images/setting_ico_plug_network_Cable.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4081474bc06fc8018d2732bd02552eb3101767 GIT binary patch literal 19103 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 literal 0 HcmV?d00001 diff --git a/ug/network/edje/ug-network-settings-theme.edc b/ug/network/edje/ug-network-settings-theme.edc new file mode 100644 index 0000000..fc15138 --- /dev/null +++ b/ug/network/edje/ug-network-settings-theme.edc @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/defs.h" + +collections { + #include "widgets/button.edc" + #include "widgets/genlist.edc" +} diff --git a/ug/network/edje/ug-network-settings.edc b/ug/network/edje/ug-network-settings.edc new file mode 100644 index 0000000..63969de --- /dev/null +++ b/ug/network/edje/ug-network-settings.edc @@ -0,0 +1,1809 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/defs.h" + +collections { + group { + name: GRP_MAIN; + styles { + style { + name: "textblock_style"; + base: "font=Tizen Sans font_size=30 align=left color=#ffffff wrap=word"; + tag: "br" "\n"; + } + } + parts { + part { + name: "padding_left_top"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: (434+102.5*2+19) (208+43*2); + } + } + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_left_top"; + relative: 1.0 1.0; + } + rel2.to: "padding_left_top"; + align: 0.0 0.0; + min: 1076 700; + fixed: 1 1; + color: 255 0 0 120; + visible: 0; + } + } + part { + name: "lefttop"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + min: 70 40; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_SELECT_TEXT; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + min: 936 78; + color: 255 255 255 166; + fixed: 1 1; + align: 0.0 0.0; + text { + style: textblock_style; + } + rel1 { + to: "lefttop"; + relative: 1.0 1.0; + } + rel2.to: "lefttop"; + } + } + part { + name: "padding1"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_SELECT_TEXT; + relative: 0.0 1.0; + } + rel2 { + to: PART_SELECT_TEXT; + relative: 0.0 1.0; + } + min: 680 10; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_NETWORK_TYPE; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding1"; + relative: 0.0 1.0; + } + rel2 { + to: "padding1"; + relative: 0.0 1.0; + } + align: 0.0 0.0; + min: 680 82; + fixed: 1 1; + } + } + part { + name: "padding2"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_NETWORK_TYPE; + relative: 0.0 1.0; + } + rel2 { + to: PART_NETWORK_TYPE; + relative: 0.0 1.0; + } + fixed: 1 1; + min: 680 44; + align: 0.0 0.0; + } + } + part { + name: PART_CUR_TYPE_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding2"; + relative: 0.0 1.0; + } + rel2 { + to: "padding2"; + relative: 0.0 1.0; + } + min: 680 45; + fixed: 1 1; + align: 0.0 0.0; + text { + style: Regular; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 166; + } + } + part { + name: "padding3"; + scale: 1; + type: SPACER; + description { + state: "default" 0.0; + rel1 { + to: PART_CUR_TYPE_TEXT; + relative: 0.0 1.0; + } + rel2 { + to: PART_CUR_TYPE_TEXT; + relative: 0.0 1.0; + } + fixed: 1 1; + min: 680 10; + align: 0.0 0.0; + } + } + part{ + name: "genlist_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to:"padding3"; + relative: 0.0 1.0; + } + rel2 { + to:"padding3"; + relative: 0.0 1.0; + } + min: 680 82*4; + fixed: 1 1; + align: 0.0 0.0; + color: 204 204 204 255; + } + } + part{ + name: PART_NETLIST_PANNEL; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1.to:"genlist_bg"; + rel2.to:"genlist_bg"; + align: 0.0 0.0; + } + } + part { + name: "button_action_space"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_NETWORK_TYPE; + relative: 1.0 0.0; + } + rel2 { + to: PART_NETWORK_TYPE; + relative: 1.0 0.0; + } + min: 40 60; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: PART_CONNECT_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "button_action_space"; + relative: 1.0 0.0; + } + rel2 { + to: "button_action_space"; + relative: 1.0 0.0; + } + min: 216 70; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: "btn1_btn2"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_CONNECT_BTN; + relative: 0.0 1.0; + } + rel2 { + to: PART_CONNECT_BTN; + relative: 0.0 1.0; + } + min: 216 10; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: PART_REFRESH_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "btn1_btn2"; + relative: 0.0 1.0; + } + rel2 { + to: "btn1_btn2"; + relative: 0.0 1.0; + } + min: 216 70; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: "btn2_btn3"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_REFRESH_BTN; + relative: 0.0 1.0; + } + rel2 { + to: PART_REFRESH_BTN; + relative: 0.0 1.0; + } + min: 216 10; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: PART_OTHER_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "btn2_btn3"; + relative: 0.0 1.0; + } + rel2 { + to: "btn2_btn3"; + relative: 0.0 1.0; + } + min: 216 70; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: "btn3_btn4"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_OTHER_BTN; + relative: 0.0 1.0; + } + rel2 { + to: PART_OTHER_BTN; + relative: 0.0 1.0; + } + min: 216 10; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_CLOSE_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "btn3_btn4"; + relative: 0.0 1.0; + } + rel2 { + to: "btn3_btn4"; + relative: 0.0 1.0; + } + min: 216 70; + align: 0.0 0.0; + fixed: 1 1; + } + } + } + } + + group { + name: GRP_NETWORK_TYPE_SELECT; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 310 164; + color: 0 0 0 127; + } + } + part { + name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2.to: "bg"; + align: 0.5 0.5; + fixed: 1 1; + } + } + } + } + + group { + name: GRP_NETWORK_MODE_SETTING; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 382 164; + color: 0 0 0 127; + } + } + part { + name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + } + fixed: 1 1; + } + } + } + } + + group { + name: GRP_NETWORK_VALUE_SETTING; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 478 122; + visible: 0; + } + } + part { + name: "ip1.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + to: bg; + } + rel2 { + relative: 0.0 0.0; + to: bg; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_IP_FIRST; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "ip1.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "ip1.pad"; + } + fixed: 1 1; + min: 118 122; + align: 0.0 0.0; + } + } + part { + name: "seperator1"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to: PART_IP_FIRST; + } + rel2 { + relative: 1.0 0.0; + to: PART_IP_FIRST; + } + align: 0.0 0.0; + fixed: 1 1; + min: 2 122; + color: 128 128 128 38; + } + } + part { + name: PART_IP_SECOND; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "seperator1"; + relative: 1.0 0.0; + } + rel2 { + to: "seperator1"; + relative: 1.0 0.0; + } + fixed: 1 1; + min: 118 122; + align: 0.0 0.0; + } + } + part { + name: "seperator2"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to: PART_IP_SECOND; + } + rel2 { + relative: 1.0 0.0; + to: PART_IP_SECOND; + } + align: 0.0 0.0; + fixed: 1 1; + min: 2 122; + color: 128 128 128 38; + } + } + part { + name: PART_IP_THIRD; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "seperator2"; + relative: 1.0 0.0; + } + rel2 { + to: "seperator2"; + relative: 1.0 0.0; + } + fixed: 1 1; + min: 118 122; + align: 0.0 0.0; + } + } + part { + name: "seperator3"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to: PART_IP_THIRD; + } + rel2 { + relative: 1.0 0.0; + to: PART_IP_THIRD; + } + align: 0.0 0.0; + fixed: 1 1; + min: 2 122; + color: 128 128 128 38; + } + } + part { + name: PART_IP_FORTH; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "seperator3"; + relative: 1.0 0.0; + } + rel2 { + to: "seperator3"; + relative: 1.0 0.0; + } + fixed: 1 1; + min: 118 122; + align: 0.0 0.0; + } + } + } + } + + group { + name: GRP_DIM_LY; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.0; + min: 1920 1080; + color: 0 0 0 122; + } + } + } + } + + group { + name: GRP_WIRELESS_DISCONNECT_LY; + styles { + style { + name: "wireless_disconnected_text_style"; + base: "font=Tizen Sans style=Regular font_size=20 align=center color=#929fB5 wrap=word"; + tag: "br" "\n"; + tag: "tab" "\t"; + } + } + images{ + image: "setting_ico_no_network.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2 { + relative: 1.0 1.0; + } + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: "disconnect.image.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + min: 240 60; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "disconnect.image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "setting_ico_no_network.png"; + } + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 1.0 300/470; + } + max: 200 130; + fixed: 1 1; + } + } + part { + name: "disconnect.text.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 40/680 190/318; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_DISCONNECT_TEXT; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + fixed: 1 1; + rel1 { + to: "disconnect.text.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "disconnect.text.pad"; + relative: 1.0 1.0; + } + color: 146 159 181 153; + min: 600 54; + text { + style: "wireless_disconnected_text_style"; + } + } + } + } + programs { + program { + name: "show.disconnect"; + signal: "show.disconnect.view"; + source: "src"; + action: STATE_SET "visible" 0.0; + target: "disconnect.image"; + target: "disconnect.text"; + } + program { + name: "hide.disconnect"; + signal: "hide.disconnect.view"; + source: "src"; + action: STATE_SET "default" 0.0; + target: "disconnect.image"; + target: "disconnect.text"; + } + } + } + + group { + name: GRP_WIRED_DISCONNECTED_LY; + styles { + style { + name: "wired_disconnected_text_style"; + base: "font=Tizen Sans style=Regular font_size=20 align=center color=#929fB5 wrap=word"; + tag: "br" "\n"; + tag: "tab" "\t"; + } + } + images{ + image: "setting_ico_plug_network_Cable.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + fixed: 1 1; + color: 30 32 46 64; + } + } + part { + name: "disconnect.image.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + min: 240 60; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "disconnect.image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "setting_ico_plug_network_Cable.png"; + } + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 1.0 300/470; + } + max: 200 130; + fixed: 1 1; + } + } + part { + name: "disconnect.text.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 210/318; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_DISCONNECT_TEXT; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + fixed: 1 1; + rel1 { + to: "disconnect.text.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "disconnect.text.pad"; + } + color: 146 159 181 153; + text { + style: "wired_disconnected_text_style"; + } + min: 618 36; + } + } + } + programs { + program { + name: "show.disconnect"; + signal: "show.disconnect.view"; + source: "src"; + action: STATE_SET "visible" 0.0; + target: "disconnect.image"; + target: "disconnect.text"; + } + program { + name: "hide.disconnect"; + signal: "hide.disconnect.view"; + source: "src"; + action: STATE_SET "default" 0.0; + target: "disconnect.image"; + target: "disconnect.text"; + } + } + } + + group { + name: GRP_WIFI_PASSCODE_BASE; + images{ + image: "ico_wifi_lock.png" COMP; + } + parts{ + part { + name: padding_left_top; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2.relative: 0.0 0.0; + fixed: 1 1; + align: 0.0 0.0; + min: (434+102.5*2) (208+43*2); + visible: 0; + } + } + part { + name: "bg.passwd"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_left_top; + relative: 1.0 1.0; + } + rel2 { + to: padding_left_top; + } + align: 0.0 0.0; + min: 1076 700; + fixed: 1 1; + visible: 0; + } + } + part { + name: "lefttop"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg.passwd"; + relative: 0.0 0.0; + } + rel2 { + to: "bg.passwd"; + relative: 0.0 0.0; + } + min: 70 20; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: PART_WIFI_PASSCODE_TITLE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "lefttop"; + relative: 1.0 1.0; + } + rel2 { + to: "lefttop"; + } + min: 600 60; + align: 0.0 0.0; + fixed: 1 1; + text { + style: Regular; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + } + part { + name: "passwd.text_line"; + scale: 1; + type: RECT; + description { + state: "default" 0.0; + rel1 { + to: "passwd.title"; + relative: 0.0 1.0; + offset: -70 0; + } + rel2 { + to: "passwd.title"; + relative: 0.0 1.0; + offset: -70 0; + } + fixed: 1 1; + min: 1076 2; + align: 0.0 0.0; + color: 255 255 255 25; + } + } + part { + name: "passwd.text.pad"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "passwd.text_line"; + relative: 0.0 0.0; + } + rel2 { + to: "passwd.text_line"; + relative: 0.0 0.0; + } + fixed: 1 1; + min: 70 20; + align: 0.0 0.0; + visible: 0; + } + } + part { + name: PART_WIFI_PASSCODE_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "passwd.text.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "passwd.text.pad"; + relative: 1.0 1.0; + } + min: 600 60; + align: 0.0 0.0; + fixed: 1 1; + text { + style: Regular; + size: 24; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + } + part { + name: "network.name.img"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_WIFI_PASSCODE_TEXT; + relative: 0.25 1.0; + } + rel2 { + to: PART_WIFI_PASSCODE_TEXT; + relative: 0.25 1.0; + } + image { + normal: "ico_wifi_lock.png"; + } + min: 40 40; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_WIFI_PASSCODE_AP_NAME; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "network.name.img"; + relative: 1.0 0.0; + } + rel2 { + to: "network.name.img"; + relative: 1.0 0.0; + } + min: 400 40; + align: 0.0 0.0; + fixed: 1 1; + text { + style: Regular; + size: 24; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + } + part { + name: PART_WIFI_PASSCODE_ENTRY; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "network.name.img"; + relative: 0.0 1.0; + } + rel2 { + to: "network.name.img"; + relative: 0.0 1.0; + } + min: 600 80; + align: 0.0 0.0; + fixed: 1 1; + color: 255 255 255 255; + } + } + } + } + + group { + name: GRP_CONFIRM_LAYOUT; + images{ + image: "modal_dialogs_bg.png" COMP; + image: "round_rectangle_8X8_top.png" COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 688 411; + image { + normal: "modal_dialogs_bg.png"; + border: 80 80 40 40; + } + } + } + part { + name: "title_bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + offset: 7 2; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + offset: 7 2; + } + min: 674 84; + image { + normal: "round_rectangle_8X8_top.png"; + border: 8 8 8 8; + } + color: 42 76 130 255; + } + } + part { + name: "title_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + visible: 0; + } + } + part { + name: PART_TEXT_TITLE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 688 84; + fixed: 1 1; + rel1 { + to: "title_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "title_padding"; + } + color: 255 255 255 255; + align: 0.0 0.0; + text { + font: "Tizen Sans:style=Medium"; + size: 30; + } + } + } + part { + name: "content_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + min: 73 181; + visible: 0; + } + } + part { + name: PART_TEXT_CONTENT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 542 33; + fixed: 1 1; + rel1 { + to: "content_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "content_padding"; + } + color: 61 61 61 255; + align: 0.0 0.0; + text { + font: "Tizen Sans:style=Medium"; + size: 28; + } + } + } + part { + name: "retry_btn_padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + min: 118 303; + fixed: 1 1; + } + } + part { + name: PART_RETRY_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "retry_btn_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "retry_btn_padding"; + } + align: 0.0 0.0; + min: 216 70; + fixed: 1 1; + } + } + part { + name: "cancel_btn_padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_RETRY_BTN; + relative: 1.0 0.0; + } + rel2 { + to: PART_RETRY_BTN; + relative: 1.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: 20 0; + } + } + part { + name: PART_CANCEL_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 216 70; + fixed: 1 1; + rel1 { + to: "cancel_btn_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "cancel_btn_padding"; + } + align: 0.0 0.0; + } + } + part { + name: "ok_btn_padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + min: 236 303; + fixed: 1 1; + } + } + part { + name: PART_OK_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "ok_btn_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "ok_btn_padding"; + } + align: 0.0 0.0; + min: 216 70; + fixed: 1 1; + } + } + } + } + + group { + name: GRP_PROCESSING_LAYOUT; + images{ + image: "modal_dialogs_bg.png" COMP; + image: "round_rectangle_8X8_top.png" COMP; + image: "progress_wheel.png" COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 688 378; + fixed: 1 1; + image { + normal: "modal_dialogs_bg.png"; + border: 80 80 40 40; + } + } + } + part { + name: "title_bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { + to: "bg"; + offset: 7 2; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + offset: 7 2; + } + min: 674 84; + fixed: 1 1; + image { + normal: "round_rectangle_8X8_top.png"; + border: 8 8 8 8; + } + color: 42 76 130 255; + } + } + part { + name: "title_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + visible: 0; + } + } + part { + name: PART_TEXT_TITLE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 688 84; + fixed: 1 1; + rel1 { + to: "title_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "title_padding"; + } + color: 255 255 255 255; + align: 0.0 0.0; + text { + font: "Tizen Sans:style=Medium"; + size: 30; + } + } + } + part { + name: "progress_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + min: 150 156; + visible: 0; + } + } + part { + name: "progress_wheel"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { + to: "progress_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "progress_padding"; + } + min: 50 50; + image { + normal: "progress_wheel.png"; + } + color: 69 143 255 255; + } + } + part { + name: "content_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "progress_wheel"; + relative: 1.0 0.0; + offset: 20 0; + } + rel2 { + to: "progress_wheel"; + relative: 1.0 0.0; + offset: 20 0; + } + align: 0.0 0.0; + visible: 0; + } + } + part { + name: PART_TEXT_CONTENT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 395 50; + fixed: 1 1; + rel1 { + to: "content_padding"; + relative: 1.0 1.0; + } + rel2.to: "content_padding"; + color: 61 61 61 255; + align: 0.0 0.0; + text { + font: "Tizen Sans:style=Medium"; + size: 28; + align: 0.0 0.5; + } + } + } + part { + name: "cancel_btn_padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: 236 270; + } + } + part { + name: PART_CANCEL_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 216 70; + fixed: 1 1; + rel1 { + to: "cancel_btn_padding"; + relative: 1.0 1.0; + } + rel2.to: "cancel_btn_padding"; + align: 0.0 0.0; + } + } + } + } + + group { + name: GRP_CONNECTION_SETTING; + styles { + style { + name: "textblock_style_1"; + base: "font=Tizen Sans font_size=24 align=left color=#ffffff wrap=word"; + tag: "br" "\n"; + } + } + parts { + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2.relative: 0 0; + fixed: 1 1; + align: 0.0 0.0; + min: (434+102.5*2+19) (208+43*2); + visible: 0; + } + } + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_left_top"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_left_top"; + } + align: 0.0 0.0; + min: 1076 698; + fixed: 1 1; + visible: 0; + } + } + part { + name: "title.description.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 70 50; + } + } + part { + name: PART_CONNECTION_DESCRITION; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + fixed: 1 1; + rel1 { + to: "title.description.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "title.description.pad"; + offset: 936 60; + } + color: 255 255 255 166; + text { + style: "textblock_style_1"; + } + } + } + part { + name: "ip.setting.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 70 160; + } + } + part { + name: "ip_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: PART_CONNECTION_IP_SETTING; + rel2.to: PART_CONNECTION_IP_SETTING; + color: 222 222 222 255; + } + } + part { + name: PART_CONNECTION_IP_SETTING; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "ip.setting.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "ip.setting.pad"; + offset: 680 266; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "dns.setting.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_CONNECTION_IP_SETTING; + relative: 0.0 1.0; + } + rel2 { + to: PART_CONNECTION_IP_SETTING; + relative: 0.0 1.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 0 40; + } + } + part { + name: "dns_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: PART_CONNECTION_DNS_SETTING; + rel2.to: PART_CONNECTION_DNS_SETTING; + color: 222 222 222 255; + } + } + part { + name: PART_CONNECTION_DNS_SETTING; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "dns.setting.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "dns.setting.pad"; + relative: 1.0 1.0; + offset: 680 160; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "ok.btn.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_CONNECTION_IP_SETTING; + relative: 1.0 0.0; + } + rel2 { + to: PART_CONNECTION_IP_SETTING; + relative: 1.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 40 0; + } + } + part { + name: PART_CONNECTION_OK_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "ok.btn.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "ok.btn.pad"; + relative: 1.0 1.0; + offset: 216 70; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "cancel.btn.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_CONNECTION_OK_BTN; + relative: 0.0 1.0; + } + rel2 { + to: PART_CONNECTION_OK_BTN; + relative: 0.0 1.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 0 10; + } + } + part { + name: PART_CONNECTION_CANCEL_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "cancel.btn.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "cancel.btn.pad"; + relative: 1.0 1.0; + offset: 216 70; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + } + } +} diff --git a/ug/network/edje/widgets/button.edc b/ug/network/edje/widgets/button.edc new file mode 100644 index 0000000..203f5eb --- /dev/null +++ b/ug/network/edje/widgets/button.edc @@ -0,0 +1,2023 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../include/defs.h" + +group { + name: "elm/button/base/basic_btn_style"; + images { + image: "round_rectangle_4X4.png" COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 216 70; + image { + normal: "round_rectangle_4X4.png"; + border: 4 4 4 4; + border_scale: 1; + } + color: 204 204 204 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 204 204 204 102; + } + } + part { + name: "bg_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 176 70; + rel1 { + to: "bg_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "bg_text_padding"; + relative: 1.0 1.0; + } + text { + size: 28; + align: 0.5 0.5; + } + color: 89 89 89 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 102; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "dim" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + } +} + +group { + name: "elm/button/base/type_button"; + parts { + part { + name: "button_image"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 680 82; + fixed: 1 1; + color: 204 204 204 255; + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 680 82; + fixed: 1 1; + rel1 { + to: "button_image"; + } + rel2 { + to: "button_image"; + } + color: 89 89 89 255; + align: 0.0 0.0; + text { + size: 30; + align: 0.1 0.5; + } + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "padding_text"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + rel1 { + to: "button_image"; + } + rel2 { + to: "button_image"; + relative: 0.0 0.0; + } + min: 414 0; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: PART_NETWORK_TYPE_SELECTED; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text"; + relative: 1.0 1.0; + } + rel2.to: "button_image"; + text { + size: 30; + } + color: 89 89 89 255; + align: 0.0 0.0; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + + programs { + program { + name: "button_clicked"; + signal: "mouse,down,1"; + source: "button_image"; + action: STATE_SET "focus" 0.0; + target: "button_image"; + target: PART_NETWORK_TYPE_SELECTED; + after: "button_press"; + } + program { + name: "focused1"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "button_image"; + target: "elm.text"; + target: PART_NETWORK_TYPE_SELECTED; + } + program { + name: "unfocused1"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "elm.text"; + target: PART_NETWORK_TYPE_SELECTED; + } + program { + name: "button_press"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } +} + +group { + name: "elm/button/base/popup_button"; + images { + image: "ico_dropdown_menu_check.png" COMP; + } + parts { + part { + name: "popupbtn_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 310 82; + color: 204 204 204 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "disable" 0.0; + inherit: "default" 0.0; + color: 100 100 100 255; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "popupbtn_bg"; + } + rel2 { + to : "popupbtn_bg"; + relative: 32/310 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text"; + relative: 1.0 1.0; + } + rel2 { + to: "popupbtn_bg"; + relative: 240/310 1.0; + } + color: 89 89 89 255; + text { + style: "Tizen:style=Regular"; + size: 30; + align: 0.0 0.5; + } + align: 0.0 0.0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Medium"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "focused_selected" 0.0; + inherit: "focused" 0.0; + } + } + part { + name: "padding_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "elm.text"; + relative: 1.0 0.0; + } + rel2 { + to : "elm.text"; + relative: 1.0 0.0; + } + fixed: 1 1; + visible: 0; + min: 20 28; + align: 0.0 0.0; + } + } + part { + name: "icon.selected"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_dropdown_menu_check.png"; + } + rel1 { + to: "padding_icon"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_icon"; + relative: 1.0 1.0; + } + min: 26 26; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + visible: 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + visible: 1; + } + description { + state: "focused_selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "button_clicked"; + signal: "mouse,down,1"; + source: "popupbtn_bg"; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + new st1[31]; + new st2[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + set_state(PART:"popupbtn_bg", "focused", 0.0); + if (!strcmp(st1, "default")) + { + set_state(PART:"elm.text", "focused", 0.0); + } else if(!strcmp(st1, "selected")) + { + set_state(PART:"elm.text", "focused_selected", 0.0); + } + + get_state(PART:"icon.selected", st2, 30, vl); + if(!strcmp(st2, "selected")) + { + set_state(PART:"icon.selected", "focused_selected", 0.0); + } else if(!strcmp(st2, "default")) + { + set_state(PART:"icon.selected", "focused", 0.0); + } + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + script { + new st1[31]; + new st2[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + set_state(PART:"popupbtn_bg", "default", 0.0); + if (!strcmp(st1, "focused")) + { + set_state(PART:"elm.text", "default", 0.0); + } else if(!strcmp(st1, "focused_selected")) + { + set_state(PART:"elm.text", "selected", 0.0); + } + get_state(PART:"icon.selected", st2, 30, vl); + if (!strcmp(st2, "focused_selected")) + { + set_state(PART:"icon.selected", "selected", 0.0); + } else if (!strcmp(st2, "focused")) + { + set_state(PART:"icon.selected", "default", 0.0); + } + } + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "click_state_set"; + signal: SIG_BTN_SELECTED; + source: PROG; + script { + new st1[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + if (!strcmp(st1, "default")) + { + set_state(PART:"elm.text", "selected", 0.0); + set_state(PART:"icon.selected", "selected", 0.0); + } else if(!strcmp(st1, "focused")) + { + set_state(PART:"elm.text", "focused_selected", 0.0); + set_state(PART:"icon.selected", "focused_selected", 0.0); + } + } + } + } +} + +group { + name: "elm/button/base/action_button"; + + images { + image: IMAGE_ACTION_RECT_4X4 COMP; + } + + parts { + part { + name: "popupbtn_bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: IMAGE_ACTION_RECT_4X4; + image.border: 4 4 4 4; + min: 216 70; + fixed: 1 1; + color: 204 204 204 255; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "disable" 0.0; + inherit: "default" 0.0; + color: 100 100 100 255; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "popupbtn_bg"; + } + rel2 { + to: "popupbtn_bg"; + } + color: 89 89 89 255; + text { + style: Regular; + size: 30; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "disable" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused1"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "popupbtn_bg"; + target: "elm.text"; + } + program { + name: "unfocused1"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "popupbtn_bg"; + target: "elm.text"; + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "disable" 0.0; + target: "elm.text"; + target: "popupbtn_bg"; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "popupbtn_bg"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } +} + +group { + name: "elm/button/base/key_value_btn"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + min: 680 80; + visible: 0; + } + } + part { + name: "shine"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2.to: "bg"; + color: 255 255 255 255; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: PART_KEY; + type: TEXT; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 40/680 0.0; + } + rel2 { + to: "bg"; + relative: 290/680 1.0; + } + color: 89 89 89 255; + text { + font: "Tizen:style=Medium"; + size: 30; + align: 0.0 0.5; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Bold"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 76; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Bold"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + } + part { + name: PART_VALUE; + type: TEXT; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 640/680 1.0; + } + color: 89 89 89 255; + text { + font: "Tizen:style=Regular"; + size: 30; + align: 1.0 0.5; + } + align: 1.0 1.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Bold"; + size: 30; + align: 1.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Regular"; + size: 30; + align: 1.0 0.5; + } + color: 89 89 89 76; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Regular"; + size: 30; + align: 1.0 0.5; + } + color: 89 89 89 76; + } + } + part { + name: "line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 1.0; + } + rel2 { + to: "bg"; + relative: 0.0 1.0; + } + visible: 1; + min: 680 2; + align: 0.0 0.0; + fixed: 1 1; + color: 0 0 0 252/10; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + max: 0 0; + visible: 0; + } + } + part { + name: "over2"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "clipper"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "dim" 0.0; + target: PART_KEY; + target: PART_VALUE; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: PART_KEY; + target: PART_VALUE; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: PART_KEY; + target: PART_VALUE; + target: "shine"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:PART_KEY, st, 30, vl); + if(!strcmp(st, "selected")) + { + } else + { + set_state(PART:PART_KEY, "default", 0.0); + set_state(PART:PART_VALUE, "default", 0.0); + set_state(PART:"shine", "default", 0.0); + } + } + } + program { + name: "button_selected"; + signal: SIG_BTN_SELECTED; + source: PROG; + action: STATE_SET "selected" 0.0; + target: PART_KEY; + target: PART_VALUE; + target: "shine"; + } + program { + name: "hide_bottom_line"; + signal: SIG_HIDE_BOTTOME_LINE; + source: PROG; + action: STATE_SET "hide" 0.0; + target: "line"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: PART_KEY; + target: PART_VALUE; + target: "shine"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focus" 0.0; + target: PART_KEY; + target: PART_VALUE; + target: "shine"; + } + } +} + +group { + name: "elm/button/base/mode_select"; + images { + image: "ico_dropdown_menu_check.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + color: 255 255 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to : "bg"; + relative: 32/382 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text"; + relative: 1.0 1.0; + } + rel2 { + to: "bg"; + relative: 312/382 1.0; + } + color: 89 89 89 255; + text { + font: "Tizen:style=Regular"; + size: 30; + align: 0.0 0.5; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Medium"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "focused_selected" 0.0; + inherit: "focused" 0.0; + } + } + part { + name: "padding_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "elm.text"; + relative: 1.0 0.0; + } + rel2 { + to : "elm.text"; + relative: 1.0 0.0; + } + fixed: 1 1; + visible: 0; + min: 20 28; + align: 0.0 0.0; + } + } + part { + name: "icon.selected"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_dropdown_menu_check.png"; + } + rel1 { + to: "padding_icon"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_icon"; + relative: 1.0 1.0; + } + min: 26 26; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + visible: 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + visible: 1; + } + description { + state: "focused_selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + } + part { + name: "over2"; + type: RECT; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1.to: bg; + rel2.to: bg; + color: 0 0 0 0; + } + } + part { + name: "clipper"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "Mouse_In"; + signal: "mouse,in"; + source: "over2"; + } + program { + name: "Mouse_Out"; + signal: "mouse,out"; + source: "over2"; + } + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + + program { + name: "key_press"; + signal: "elm,action,pressed"; source: "elm"; + } + + program { + name: "key_unpress"; + signal: "elm,action,unpressed"; source: "elm"; + } + + program { + name: "button_click1"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "click_state_set"; + signal: SIG_BTN_SELECTED; + source: PROG; + script { + new st1[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + if (!strcmp(st1, "default")) + { + set_state(PART:"elm.text", "selected", 0.0); + set_state(PART:"icon.selected", "selected", 0.0); + } else if(!strcmp(st1, "focused")) + { + set_state(PART:"elm.text", "focused_selected", 0.0); + set_state(PART:"icon.selected", "focused_selected", 0.0); + } + } + } + program { + name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + new st1[31]; + new st2[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + set_state(PART:"bg", "focused", 0.0); + if (!strcmp(st1, "default")) + { + set_state(PART:"elm.text", "focused", 0.0); + } else if(!strcmp(st1, "selected")) + { + set_state(PART:"elm.text", "focused_selected", 0.0); + } + + get_state(PART:"icon.selected", st2, 30, vl); + if(!strcmp(st2, "selected")) + { + set_state(PART:"icon.selected", "focused_selected", 0.0); + } else if(!strcmp(st2, "default")) + { + set_state(PART:"icon.selected", "focused", 0.0); + } + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + script { + new st1[31]; + new st2[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + set_state(PART:"bg", "default", 0.0); + if (!strcmp(st1, "focused")) + { + set_state(PART:"elm.text", "default", 0.0); + } else if(!strcmp(st1, "focused_selected")) + { + set_state(PART:"elm.text", "selected", 0.0); + } + + get_state(PART:"icon.selected", st2, 30, vl); + if(!strcmp(st2, "focused_selected")) + { + set_state(PART:"icon.selected", "selected", 0.0); + } else if(!strcmp(st2, "focused")) + { + set_state(PART:"icon.selected", "default", 0.0); + } + } + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "icon.selected"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + target: "icon.selected"; + } + } +} + +group { + name: "elm/button/base/value_set_btn"; + images { + image: "ico_spincontrol_down.png" COMP; + image: "ico_spincontrol_up.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 118 122; + color: 255 255 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "padding_up_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg; + relative: 0.0 0.0; + } + rel2 { + to: bg; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + min: 42 0; + } + } + part { + name: "up_icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_spincontrol_up.png"; + } + rel1 { + to: "padding_up_icon"; + relative: 1.0 0.0; + } + rel2 { + to: "padding_up_icon"; + relative: 1.0 0.0; + } + min: 35 17; + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg; + relative: 0.0 0.0; + } + rel2 { + to: bg; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + min: 0 17; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + effect: SHADOW BOTTOM; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_text"; + relative: 1.0 1.0; + } + min: 118 88; + color: 69 143 255 255; + text { + font: "Tizen:style=Bold"; + size: 30; + align: 0.5 0.5; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "padding_down_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg; + relative: 0.0 0.0; + } + rel2 { + to: bg; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + min: 42 105; + } + } + part { + name: "down_icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_spincontrol_down.png"; + } + rel1 { + to: "padding_down_icon"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_down_icon"; + relative: 1.0 1.0; + } + min: 35 17; + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "over2"; + type: RECT; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1.to: bg; + rel2.to: bg; + color: 0 0 0 0; + } + } + part { + name: "clipper"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "Mouse_In"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "focused" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "Mouse_Out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_click1"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focus" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + } +} + +group { + name: "elm/button/base/wired_list_button"; + images { + image: "check_nor.png" COMP; + image: "check_foc.png" COMP; + } + parts { + part { + name: "base"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 680 82; + color: 204 204 204 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "pad.text"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 40 0; + rel1 { + relative: 0.0 0.0; + to: "base"; + } + rel2 { + relative: 0.0 0.0; + to: "base"; + } + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 526 82; + fixed: 1 1; + rel1 { + relative: 1.0 1.0; + to: "pad.text"; + } + rel2 { + to: "pad.text"; + } + color:89 89 89 255; + text { + font: FONT_L; + size: 30; + align: 0.0 0.5; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight_focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "pad.icon.check"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 607 22; + rel1 { + relative: 0.0 0.0; + to: "base"; + } + rel2 { + relative: 0.0 0.0; + to: "base"; + } + align: 0.0 0.0; + } + } + part { + name: "icon.check"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "check_nor.png"; + } + fixed: 1 1; + min: 38 38; + align: 0.0 0.0; + rel1 { + to: "pad.icon.check"; + relative: 1.0 1.0; + } + rel2 { + to: "pad.icon.check"; + } + visible: 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "highlight_focused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + visible: 1; + image { + normal: "check_foc.png"; + } + } + } + part { + name: "line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "base"; + relative: 1.0 1.0; + } + rel2 { + to: "base"; + relative: 1.0 1.0; + } + min: 680 2; + align: 1.0 1.0; + fixed: 1 1; + color: 0 0 0 252/10; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "base_focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "base"; + after: "text_focused"; + } + program { + name: "text_focused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "highlight") || !strcmp(st, "highlight_focused")) { + set_state(PART:"elm.text", "highlight_focused", 0.0); + } else { + set_state(PART:"elm.text", "focused", 0.0); + } + } + after: "check_focused"; + } + program { + name: "check_focused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "highlight") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.check", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.check", "focused", 0.0); + } + } + } + program { + name: "base_unfocused"; + signal: "elm,action,unfocus"; source: "elm"; + action: STATE_SET "default" 0.0; + target: "base"; + after: "text_unfocused"; + } + program { + name: "text_unfocused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "highlight")) { + set_state(PART:"elm.text", "highlight", 0.0); + } else { + set_state(PART:"elm.text", "default", 0.0); + } + } + after: "check_unfocused"; + } + program { + name: "check_unfocused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "highlight")) { + set_state(PART:"icon.check", "highlight", 0.0); + } else { + set_state(PART:"icon.check", "default", 0.0); + } + } + } + program { + name: "text_highlight"; + signal: SIG_STATE_SELECTED; source: ELM; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "focused") || !strcmp(st, "highlight_focused")) { + set_state(PART:"elm.text", "highlight_focused", 0.0); + } else { + set_state(PART:"elm.text", "highlight", 0.0); + } + } + after: "check_highlight"; + } + program { + name: "check_highlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "focused") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.check", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.check", "highlight", 0.0); + } + } + } + program { + name: "text_unhighlight"; + signal: SIG_STATE_UNSELECTED; source: ELM; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "focused")) { + set_state(PART:"elm.text", "focused", 0.0); + } else { + set_state(PART:"elm.text", "default", 0.0); + } + } + after: "check_unhighlight"; + } + program { + name: "check_unhighlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "focused")) { + set_state(PART:"icon.check", "focused", 0.0); + } else { + set_state(PART:"icon.check", "default", 0.0); + } + } + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } +} diff --git a/ug/network/edje/widgets/genlist.edc b/ug/network/edje/widgets/genlist.edc new file mode 100644 index 0000000..5398dc1 --- /dev/null +++ b/ug/network/edje/widgets/genlist.edc @@ -0,0 +1,825 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../include/defs.h" + +group { + name: "elm/genlist/item/lock.1text.2icon/default"; + data.item: "texts" "elm.text"; + images { + image: "check_nor.png" COMP; + image: "check_foc.png" COMP; + image: "ico_wifi_lock.png" COMP; + } + parts { + part { + name: "base"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 82; + color: 0 0 0 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "pad.icon.wifi"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 35 20; + rel1 { + relative: 0.0 0.0; + to: "base"; + } + rel2 { + relative: 0.0 0.0; + to: "base"; + } + align: 0.0 0.0; + } + } + part { + name: "icon.wifi"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_wifi_lock.png"; + } + color:89 89 89 255; + fixed: 1 1; + min: 40 40; + align: 0.0 0.0; + rel1 { + to: "pad.icon.wifi"; + relative: 1.0 1.0; + } + rel2 { + to: "pad.icon.wifi"; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight_focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "pad.text"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 87 0; + rel1 { + relative: 0.0 0.0; + to: "base"; + } + rel2 { + relative: 0.0 0.0; + to: "base"; + } + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 525 82; + fixed: 1 1; + rel1 { + relative: 1.0 1.0; + to: "pad.text"; + } + rel2 { + to: "pad.text"; + } + color:89 89 89 255; + text { + font: FONT_L; + size: 30; + align: 0.0 0.5; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight_focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "pad.icon.check"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 627 21; + rel1 { + relative: 0.0 0.0; + to: "base"; + } + rel2 { + relative: 0.0 0.0; + to: "base"; + } + align: 0.0 0.0; + } + } + part { + name: "icon.check"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "check_nor.png"; + } + fixed: 1 1; + min: 38 38; + align: 0.0 0.0; + rel1 { + to: "pad.icon.check"; + relative: 1.0 1.0; + } + rel2 { + to: "pad.icon.check"; + } + visible: 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + } + description { + state: "highlight_focused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + visible: 1; + image { + normal: "check_foc.png"; + } + } + } + part { + name: "line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "base"; + relative: 1.0 1.0; + } + rel2 { + to: "base"; + } + min: 680 2; + align: 1.0 1.0; + fixed: 1 1; + color: 0 0 0 252/10; + } + } + } + programs { + program { + name: "base_focused"; + signal: "elm,state,focused"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "base"; + after: "text_focused"; + } + program { + name: "text_focused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "highlight") || !strcmp(st, "highlight_focused")) { + set_state(PART:"elm.text", "highlight_focused", 0.0); + } else { + set_state(PART:"elm.text", "focused", 0.0); + } + } + after: "wifi_focused"; + } + program { + name: "wifi_focused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.wifi", st, 30, vl); + if (!strcmp(st, "highlight") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.wifi", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.wifi", "focused", 0.0); + } + } + after: "check_focused"; + } + program { + name: "check_focused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "highlight") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.check", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.check", "focused", 0.0); + } + } + } + program { + name: "base_unfocused"; + signal: "elm,state,unfocused"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "base"; + after: "text_unfocused"; + } + program { + name: "text_unfocused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "highlight")) { + set_state(PART:"elm.text", "highlight", 0.0); + } else { + set_state(PART:"elm.text", "default", 0.0); + } + } + after: "wifi_unfocused"; + } + program { + name: "wifi_unfocused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.wifi", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "highlight")) { + set_state(PART:"icon.wifi", "highlight", 0.0); + } else { + set_state(PART:"icon.wifi", "default", 0.0); + } + } + after: "check_unfocused"; + } + program { + name: "check_unfocused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "highlight")) { + set_state(PART:"icon.check", "highlight", 0.0); + } else { + set_state(PART:"icon.check", "default", 0.0); + } + } + } + program { + name: "text_highlight"; + signal: SIG_STATE_SELECTED; + source: ELM; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "focused") || !strcmp(st, "highlight_focused")) { + set_state(PART:"elm.text", "highlight_focused", 0.0); + } else { + set_state(PART:"elm.text", "highlight", 0.0); + } + } + after: "wifi_highlight"; + } + program { + name: "wifi_highlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.wifi", st, 30, vl); + if (!strcmp(st, "focused") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.wifi", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.wifi", "highlight", 0.0); + } + } + after: "check_highlight"; + } + program { + name: "check_highlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "focused") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.check", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.check", "highlight", 0.0); + } + } + } + program { + name: "text_unhighlight"; + signal: SIG_STATE_UNSELECTED; + source: ELM; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "focused")) { + set_state(PART:"elm.text", "focused", 0.0); + } else { + set_state(PART:"elm.text", "default", 0.0); + } + } + after: "wifi_unhighlight"; + } + program { + name: "wifi_unhighlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.wifi", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "focused")) { + set_state(PART:"icon.wifi", "focused", 0.0); + } else { + set_state(PART:"icon.wifi", "default", 0.0); + } + } + after: "check_unhighlight"; + } + program { + name: "check_unhighlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "focused")) { + set_state(PART:"icon.check", "focused", 0.0); + } else { + set_state(PART:"icon.check", "default", 0.0); + } + } + } + } +} + +group { + name: "elm/genlist/item/nolock.1text.2icon/default"; + data.item: "texts" "elm.text"; + images { + image: "check_nor.png" COMP; + image: "check_foc.png" COMP; + image: "ico_wifi.png" COMP; + } + parts { + part { + name: "base"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 82; + color: 0 0 0 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "pad.icon.wifi"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 35 20; + rel1 { + relative: 0.0 0.0; + to: "base"; + } + rel2 { + relative: 0.0 0.0; + to: "base"; + } + align: 0.0 0.0; + } + } + part { + name: "icon.wifi"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_wifi.png"; + } + color:89 89 89 255; + fixed: 1 1; + min: 40 40; + align: 0.0 0.0; + rel1 { + to: "pad.icon.wifi"; + relative: 1.0 1.0; + } + rel2 { + to: "pad.icon.wifi"; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight_focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "pad.text"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 87 0; + rel1 { + relative: 0.0 0.0; + to: "base"; + } + rel2 { + relative: 0.0 0.0; + to: "base"; + } + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 525 82; + fixed: 1 1; + rel1 { + relative: 1.0 1.0; + to: "pad.text"; + } + rel2 { + to: "pad.text"; + } + color:89 89 89 255; + text { + font: FONT_L; + size: 30; + align: 0.0 0.5; + } + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight_focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "pad.icon.check"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 627 21; + rel1 { + relative: 0.0 0.0; + to: "base"; + } + rel2 { + relative: 0.0 0.0; + to: "base"; + } + align: 0.0 0.0; + } + } + part { + name: "icon.check"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "check_nor.png"; + } + fixed: 1 1; + min: 38 38; + align: 0.0 0.0; + rel1 { + to: "pad.icon.check"; + relative: 1.0 1.0; + } + rel2 { + to: "pad.icon.check"; + } + visible: 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + } + description { + state: "highlight_focused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + visible: 1; + image { + normal: "check_foc.png"; + } + } + } + part { + name: "line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "base"; + relative: 1.0 1.0; + } + rel2 { + to: "base"; + } + min: 680 2; + align: 1.0 1.0; + fixed: 1 1; + color: 0 0 0 252/10; + } + } + } + programs { + program { + name: "base_focused"; + signal: "elm,state,focused"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "base"; + after: "text_focused"; + } + program { + name: "text_focused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "highlight") || !strcmp(st, "highlight_focused")) { + set_state(PART:"elm.text", "highlight_focused", 0.0); + } else { + set_state(PART:"elm.text", "focused", 0.0); + } + } + after: "wifi_focused"; + } + program { + name: "wifi_focused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.wifi", st, 30, vl); + if (!strcmp(st, "highlight") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.wifi", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.wifi", "focused", 0.0); + } + } + after: "check_focused"; + } + program { + name: "check_focused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "highlight") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.check", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.check", "focused", 0.0); + } + } + } + program { + name: "base_unfocused"; + signal: "elm,state,unfocused"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "base"; + after: "text_unfocused"; + } + program { + name: "text_unfocused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "highlight")) { + set_state(PART:"elm.text", "highlight", 0.0); + } else { + set_state(PART:"elm.text", "default", 0.0); + } + } + after: "wifi_unfocused"; + } + program { + name: "wifi_unfocused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.wifi", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "highlight")) { + set_state(PART:"icon.wifi", "highlight", 0.0); + } else { + set_state(PART:"icon.wifi", "default", 0.0); + } + } + after: "check_unfocused"; + } + program { + name: "check_unfocused"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "highlight")) { + set_state(PART:"icon.check", "highlight", 0.0); + } else { + set_state(PART:"icon.check", "default", 0.0); + } + } + } + program { + name: "text_highlight"; + signal: SIG_STATE_SELECTED; + source: ELM; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "focused") || !strcmp(st, "highlight_focused")) { + set_state(PART:"elm.text", "highlight_focused", 0.0); + } else { + set_state(PART:"elm.text", "highlight", 0.0); + } + } + after: "wifi_highlight"; + } + program { + name: "wifi_highlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.wifi", st, 30, vl); + if (!strcmp(st, "focused") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.wifi", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.wifi", "highlight", 0.0); + } + } + after: "check_highlight"; + } + program { + name: "check_highlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "focused") || !strcmp(st, "highlight_focused")) { + set_state(PART:"icon.check", "highlight_focused", 0.0); + } else { + set_state(PART:"icon.check", "highlight", 0.0); + } + } + } + program { + name: "text_unhighlight"; + signal: SIG_STATE_UNSELECTED; + source: ELM; + script { + new st[31]; + new Float: vl; + get_state(PART:"elm.text", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "focused")) { + set_state(PART:"elm.text", "focused", 0.0); + } else { + set_state(PART:"elm.text", "default", 0.0); + } + } + after: "wifi_unhighlight"; + } + program { + name: "wifi_unhighlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.wifi", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "focused")) { + set_state(PART:"icon.wifi", "focused", 0.0); + } else { + set_state(PART:"icon.wifi", "default", 0.0); + } + } + after: "check_unhighlight"; + } + program { + name: "check_unhighlight"; + script { + new st[31]; + new Float: vl; + get_state(PART:"icon.check", st, 30, vl); + if (!strcmp(st, "highlight_focused") || !strcmp(st, "focused")) { + set_state(PART:"icon.check", "focused", 0.0); + } else { + set_state(PART:"icon.check", "default", 0.0); + } + } + } + } +} \ No newline at end of file diff --git a/ug/network/include/common.h b/ug/network/include/common.h new file mode 100644 index 0000000..1f158ee --- /dev/null +++ b/ug/network/include/common.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NETWORK_COMMON_H__ +#define __NETWORK_COMMON_H__ + +#include +#include + +#define IP_STRING_MAX_SIZE 20 +#define MAX_NAME_SIZE 256 +#define CONTENT_TXT_SIZE 500 + +enum network_type_enum { + TYPE_WIRELESS = 0, + TYPE_WIRED +}; + +enum setting_mode { + MODE_INVALID = 0, + MODE_AUTO, + MODE_MAN +}; + +struct connection_info { + enum network_type_enum cur_type; + connection_h connection; + connection_profile_h profile; + char name[MAX_NAME_SIZE]; + wifi_ap_h ap; +}; + +struct network_info { + char ip_addr[IP_STRING_MAX_SIZE + 1]; + char submask[IP_STRING_MAX_SIZE + 1]; + char gateway[IP_STRING_MAX_SIZE + 1]; + char dns[IP_STRING_MAX_SIZE + 1]; +}; + +#endif /* __NETWORK_COMMON_H__ */ diff --git a/ug/network/include/connection_mgr.h b/ug/network/include/connection_mgr.h new file mode 100644 index 0000000..8967901 --- /dev/null +++ b/ug/network/include/connection_mgr.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONNECTION_MGR_H__ +#define __CONNECTION_MGR_H__ + +#include +#include +#include "common.h" + +int connection_mgr_set_profile( + connection_h connection, + connection_profile_h profile, + struct network_info *info); +connection_h connection_mgr_create(void); +int connection_mgr_destroy(connection_h connection); +int connection_mgr_uninit(connection_h connection); +int connection_mgr_get_profile_info( + connection_h connection, struct connection_info *info); +Eina_Bool connection_mgr_is_connected(connection_h connection); +int connection_mgr_ip_dynamic_config(connection_h connection, + connection_profile_h profile); +int connection_mgr_get_ethernet_state( + connection_h connection, + Eina_Bool *plugin); +int connection_mgr_get_ip_info( + connection_profile_h profile, + struct network_info *info); +#if 0 +int connection_mgr_register_ethernet_state_cb( + connection_h connection, + connection_ethernet_state_chaged_cb cb, void *data); +int connection_mgr_set_profile_state_changed_cb( + connection_profile_h profile, + connection_profile_state_changed_cb cb, void *data); +int connection_mgr_get_is_online_async( + connection_h connection, + connection_is_online_async_cb cb, void *data); +int connection_mgr_check_gateway_async( + connection_profile_h profile, + connection_profile_check_gateway_async_cb cb, void *data); +#endif + +#endif /* __CONNECTION_MGR_H__ */ diff --git a/ug/network/include/dbg.h b/ug/network/include/dbg.h new file mode 100644 index 0000000..faf282c --- /dev/null +++ b/ug/network/include/dbg.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DBG_H__ +#define __DBG_H__ + +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "ug-network-settings" + +#ifndef _ERR +#define _ERR(fmt, args...) (LOGE("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#endif + +#ifndef _DBG +#define _DBG(fmt, args...) (LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#endif + +#ifndef _INFO +#define _INFO(fmt, args...) \ + (LOGI("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#endif + +#endif /* __DBG_H__ */ diff --git a/ug/network/include/defs.h b/ug/network/include/defs.h new file mode 100644 index 0000000..4b73c97 --- /dev/null +++ b/ug/network/include/defs.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DEFS_H__ +#define __DEFS_H__ + +#define ELM_SCALE elm_config_scale_get() + +#define RET_SUCCESS 0 +#define RET_FAILED -1 +#define RET_IP_INVALID -2 + +/*GROUP*/ +#define GRP_MAIN "main" +#define GRP_NETWORK_TYPE_SELECT "popup_select" +#define GRP_CONNECTION_SETTING "manual_network_setting" +#define GRP_NETWORK_MODE_SETTING "mode_set_ly" +#define GRP_NETWORK_VALUE_SETTING "value_set_layout" +#define GRP_DIM_LY "dim_layout" +#define GRP_WIRELESS_DISCONNECT_LY "wireless_network_disconnect" +#define GRP_WIRED_DISCONNECTED_LY "wired_network_disconnect" +#define GRP_WIFI_PASSCODE_BASE "entry_view" +#define GRP_CONFIRM_LAYOUT "confirm_popup" +#define GRP_PROCESSING_LAYOUT "processing_popup" + +/*STYLE*/ +#define STYLE_TYPE_BTN "type_button" +#define STYLE_ACTION_BTN "basic_btn_style" +#define STYLE_POPUP_BTN "popup_button" +#define STYLE_WIRED_LIST_BTN "wired_list_button" +#define STYLE_SETTING_BTN "basic_btn_style" +#define STYLE_KEY_VALUE_BTN "key_value_btn" +#define STYLE_MODE_SELECT_BTN "mode_select" +#define STYLE_VALUE_BTN "value_set_btn" +#define STYLE_ITEM_LOCK "lock.1text.2icon" +#define STYLE_ITEM_NOLOCK "nolock.1text.2icon" + +/*PART*/ +#define PART_SELECT_TEXT "select_text" +#define PART_NETWORK_TYPE "button_nettype" +#define PART_CUR_TYPE_TEXT "network-type" +#define PART_NETWORK_TYPE_SELECTED "button_select" +#define PART_NETLIST_PANNEL "network_list_pannel" +#define PART_SWALLOW_CONTENT "elm.swallow.content" +#define PART_CONNECT_BTN "swallow_connect_btn" +#define PART_REFRESH_BTN "swallow_refresh_btn" +#define PART_OTHER_BTN "swallow_other_btn" +#define PART_CLOSE_BTN "swallow_close_btn" +#define PART_CONNECTION_DESCRITION "description_network" +#define PART_CONNECTION_IP_SETTING "ip_setting" +#define PART_CONNECTION_DNS_SETTING "dns_setting" +#define PART_CONNECTION_OK_BTN "ok_btn" +#define PART_CONNECTION_CANCEL_BTN "cancel_btn" +#define PART_DISCONNECT_TEXT "disconnect.text" +#define PART_TEXT_TITLE "title.txt" +#define PART_TEXT_CONTENT "content.txt" +#define PART_RETRY_BTN "retry_btn" +#define PART_CANCEL_BTN "cancel_btn" +#define PART_OK_BTN "ok_btn" +#define PART_KEY "part.key" +#define PART_VALUE "part.value" +#define PART_IP_FIRST "ip.1" +#define PART_IP_SECOND "ip.2" +#define PART_IP_THIRD "ip.3" +#define PART_IP_FORTH "ip.4" +#define PART_WIFI_PASSCODE_TITLE "passwd.title" +#define PART_WIFI_PASSCODE_TEXT "passwd.text" +#define PART_WIFI_PASSCODE_ENTRY "entry" +#define PART_WIFI_PASSCODE_AP_NAME "network.name" +#define PART_ELM_TEXT "elm.text" + +/*IMAGE*/ +#define IMAGE_ACTION_RECT_4X4 "round_rectangle_4X4.png" + +/*SIGNAL*/ +#define PROG "prog" +#define ELM "elm" +#define SIG_CLICKED "clicked" +#define SIG_UNFOCUSED "unfocused" +#define SIG_BTN_SELECTED "btn,selected" +#define SIG_STATE_SELECTED "elm,state,selected" +#define SIG_STATE_UNSELECTED "elm,state,unselected" +#define SIG_HIDE_BOTTOME_LINE "btn,hide,line" +#define SIG_DISMISSED "dismissed" + +/*TXT*/ +#define TXT_NO_NETWORK "No network connection.
"\ + "Please check your network." +#define TXT_NETWORK_DISC "You can select network to use service.
"\ + "If you want to select another network, select other !" +#define TXT_TYPE_BTN "Network type" +#define TXT_WIRED_NETWORK "Wired network" +#define TXT_WIRELESS_NETWORK "Wireless network" +#define TXT_CONNECT_BTN "Connect" +#define TXT_REFRESH_BTN "Refresh" +#define TXT_OTHER_BTN "Other" +#define TXT_CLOSE_BTN "Close" +#define TXT_WIRELESS "Wireless" +#define TXT_WIRED "Wired" +#define TXT_PLUG_CABLE "Plug a network cable into the back of your TV" +#define TXT_WIRED_LY "Wired Network" +#define TXT_WIRELESS_LY "Wireless Network" +#define TXT_CONNECTTING "Connectting to" +#define TXT_FAILED_CONNECT "Failed to connect to" +#define TXT_CANCEL "Cancel" +#define TXT_RETRY "Retry" +#define TXT_OBTAIN_AUTO "Obtain automatically" +#define TXT_ENTER_MAN "Enter manually" +#define TXT_IP_SETTING "IP Setting" +#define TXT_DNS_SETING "DNS Setting" +#define TXT_DNS_SERVER "DNS Server:" +#define TXT_IP_ADDR "IP Address:" +#define TXT_SUBNET_MASK "Subnet Mask:" +#define TXT_GATEWAY "Gateway:" +#define TXT_INVALID_IP "Invalid IP address." +#define TXT_INVALID_PWD "Invalid passcode." +#define TXT_ZERO "0" +#define TXT_OK "OK" + +#define ZERO_IP "0.0.0.0" +#define NULL_STRING "NULL" + +#define CENTER_ALIGN 0.5 +#define POPUP_WIDTH 688 +#define POPUP_HEIGHT 411 + +/* Key defines */ +#define KEY_UP "Up" +#define KEY_DOWN "Down" +#define KEY_LEFT "Left" +#define KEY_RIGHT "Right" +#define KEY_ENTER "Return" +#define KEY_EXIT "XF86Close" + +#define KEY_0 "0" +#define KEY_1 "1" +#define KEY_2 "2" +#define KEY_3 "3" +#define KEY_4 "4" +#define KEY_5 "5" +#define KEY_6 "6" +#define KEY_7 "7" +#define KEY_8 "8" +#define KEY_9 "9" + +#endif /* __DEFS_H__ */ diff --git a/ug/network/include/i18n.h b/ug/network/include/i18n.h new file mode 100644 index 0000000..3e9e19f --- /dev/null +++ b/ug/network/include/i18n.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __I18N_H__ +#define __I18N_H__ + +#include + +#define i18n_init() bindtextdomain(PKGNAME, LOCALEDIR) + +#ifdef _ +#undef _ +#endif +#define _(s) gettext(s) +#define dgettext_noop(s) (s) + +#ifdef N_ +#undef N_ +#endif +#define N_(s) dgettext_noop(s) + +#endif /* __I18N_H__ */ diff --git a/ug/network/include/ip_setting_view.h b/ug/network/include/ip_setting_view.h new file mode 100644 index 0000000..0e85c27 --- /dev/null +++ b/ug/network/include/ip_setting_view.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONNECTION_VIEW_H__ +#define __CONNECTION_VIEW_H__ + +#include +#include "network_viewmgr.h" + +struct view_class *ip_setting_view_vclass_get(void); + +#endif /* __CONNECTION_VIEW_H__ */ diff --git a/ug/network/include/main_view.h b/ug/network/include/main_view.h new file mode 100644 index 0000000..018af4b --- /dev/null +++ b/ug/network/include/main_view.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MAIN_VIEW_H__ +#define __MAIN_VIEW_H__ + +#include +#include +#include +#include +#include "network_viewmgr.h" + +struct view_class *main_view_vclass_get(void); + +#endif /* __MAIN_VIEW_H__ */ diff --git a/ug/network/include/network_viewmgr.h b/ug/network/include/network_viewmgr.h new file mode 100644 index 0000000..fd5d0f4 --- /dev/null +++ b/ug/network/include/network_viewmgr.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NETVIEWMGR_H__ +#define __NETVIEWMGR_H__ + +#include +#include + +enum view_type { + NETWORK_MAIN_VIEW = 0, + NETWORK_WIFI_PASSCODE_VIEW, + NETWORK_IP_SETTING_VIEW +}; + +enum message_id { + PASSCODE_DEVIVER = 0 +}; + +struct viewmgr { + Eina_List *vlist; + Evas_Object *win; + ui_gadget_h ug; +}; + +struct view_class { + Evas_Object * (*create)(struct viewmgr *vmgr, void *data); + void (*pause)(Evas_Object *base); + void (*resume)(Evas_Object *base); + void (*terminate)(Evas_Object *base); + void (*message_handler)(Evas_Object *base, + enum message_id msg_id, void *data); + enum view_type (*get_view_type)(void); +}; + +struct viewmgr *viewmgr_init(); +void viewmgr_fini(struct viewmgr *vmgr); +Evas_Object *viewmgr_push(struct viewmgr *vmgr, + struct view_class *vclass, void *data); +int viewmgr_send_message(struct viewmgr *vmgr, + enum view_type view_type, + enum message_id msg_id, void *data); +int viewmgr_pop(struct viewmgr *vmgr); +int viewmgr_resume(struct viewmgr *vmgr); +Evas_Object *viewmgr_win_get(struct viewmgr *vmgr); + +#endif /* __VIEWMGR_H__ */ + diff --git a/ug/network/include/util.h b/ug/network/include/util.h new file mode 100644 index 0000000..8e21037 --- /dev/null +++ b/ug/network/include/util.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UTIL_H__ +#define __UTIL_H__ + +Evas_Object *util_add_layout(Evas_Object *parent, const char *file, + const char *group); +Evas_Object *util_add_button(Evas_Object *parent, const char *style, + const char *part, const char *text); +Evas_Object *util_add_key_value_button(Evas_Object *parent, + const char *part, const char *text_key, const char *text_value); +Evas_Object *util_add_scroll(Evas_Object *parent, const char *part); +Evas_Object *util_add_box(Evas_Object *parent, const char *part); +Evas_Object *util_add_image(Evas_Object *parent, + const char *file, const char *part); +Evas_Object *util_add_entry(Evas_Object *parent, + const char *style, const char *part); +Evas_Object *util_add_genlist(Evas_Object *parent); +void util_focus_next_set(Evas_Object *obj); + +#endif /* __UTIL_H__ */ diff --git a/ug/network/include/vconf_mgr.h b/ug/network/include/vconf_mgr.h new file mode 100644 index 0000000..e3335c2 --- /dev/null +++ b/ug/network/include/vconf_mgr.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VCONF_MGR_H__ +#define __VCONF_MGR_H__ + +#include +#include "connection_mgr.h" +#include "common.h" + +int vconf_mgr_get_network_type(enum network_type_enum *network_type); +int vconf_mgr_set_network_type(enum network_type_enum network_type); +int vconf_mgr_get_wired_network_info(struct network_info *info); +int vconf_mgr_get_wireless_network_info(struct network_info *info); +int vconf_mgr_save_wired_config_info(struct network_info *info); +int vconf_mgr_save_wireless_config_info(struct network_info *info); +int vconf_mgr_get_wired_ip_mode(enum setting_mode *mode); +int vconf_mgr_set_wired_ip_mode(enum setting_mode mode); +int vconf_mgr_get_wired_dns_mode(enum setting_mode *mode); +int vconf_mgr_set_wired_dns_mode(enum setting_mode mode); +int vconf_mgr_get_wireless_ip_mode(enum setting_mode *mode); +int vconf_mgr_set_wireless_ip_mode(enum setting_mode mode); +int vconf_mgr_get_wireless_dns_mode(enum setting_mode *mode); +int vconf_mgr_set_wireless_dns_mode(enum setting_mode mode); + +#endif /* __VCONF_MGR_H__ */ diff --git a/ug/network/include/wifi_mgr.h b/ug/network/include/wifi_mgr.h new file mode 100644 index 0000000..d9048cf --- /dev/null +++ b/ug/network/include/wifi_mgr.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __WIFI_MGR_H__ +#define __WIFI_MGR_H__ + +#include +#include "common.h" + +#define SSID_MAX_LENTH 256 +#define PWD_MAX_LENTH 256 + +struct wifi_ap_info { + char essid[SSID_MAX_LENTH]; + char bssid[SSID_MAX_LENTH]; + int rssi; + int frequency; + int max_speed; + wifi_security_type_e secure_type; + wifi_encryption_type_e encryption_type; + bool passphrase_required; + int wps_supported; + wifi_connection_state_e state; + + wifi_ip_config_type_e ip_type; + wifi_proxy_type_e proxy_type; + wifi_encryption_type_e enc_type; + wifi_eap_type_e eap_type; + wifi_eap_auth_type_e eap_auth_type; + + wifi_ap_h ap; + void *user_data; +}; + +const char *wifi_mgr_error_dbg(wifi_error_e err_type); +int wifi_mgr_init(void); +int wifi_mgr_deinit(void); +int wifi_mgr_ap_destroy(wifi_ap_h ap); +int wifi_mgr_ap_clone(wifi_ap_h *cloned_ap, wifi_ap_h origin); +int wifi_mgr_is_activated(bool *activated); +int wifi_mgr_scan_request(wifi_scan_finished_cb cb, void *data); +int wifi_mgr_foreach_found_aps(wifi_found_ap_cb cb, void *data); +int wifi_mgr_activate(wifi_activated_cb cb, void *data); +int wifi_mgr_get_ap_info(wifi_ap_h ap, struct wifi_ap_info *ap_info); +int wifi_mgr_get_connected_ap(wifi_ap_h *ap); +int wifi_mgr_forget_last_ap(void); +int wifi_mgr_connect(wifi_ap_h ap, wifi_connected_cb cb, void *data); +int wifi_mgr_set_passphrase(wifi_ap_h ap, const char *passcode); +int wifi_mgr_get_ip_info(wifi_ap_h ap, struct network_info *info); +int wifi_mgr_ap_set_ip_config_type(wifi_ap_h ap, + wifi_ip_config_type_e type); +int wifi_mgr_set_ip_config(wifi_ap_h ap, struct network_info *info); +int wifi_mgr_set_dns_config(wifi_ap_h ap, struct network_info *info); +//int wifi_mgr_get_is_online_async(wifi_get_is_online_async_cb cb, void *data); + +#endif /* __WIFI_MGR_H__ */ diff --git a/ug/network/include/wifi_passcode_view.h b/ug/network/include/wifi_passcode_view.h new file mode 100644 index 0000000..5805235 --- /dev/null +++ b/ug/network/include/wifi_passcode_view.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __WIFI_PASSWORD_VIEW_H__ +#define __WIFI_PASSWORD_VIEW_H__ + +#include +#include +#include +#include +#include "network_viewmgr.h" + +struct view_class *wifi_passcode_view_vclass_get(void); + +#endif /* __WIFI_PASSWORD_VIEW_H__ */ diff --git a/ug/network/src/connection_mgr.c b/ug/network/src/connection_mgr.c new file mode 100644 index 0000000..1a50aac --- /dev/null +++ b/ug/network/src/connection_mgr.c @@ -0,0 +1,651 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "connection_mgr.h" + +/** + * Converts the error type to string information. + * + * @param[in] err_type Error type + * @return error string information; + */ +static const char *_convert_error_to_string(connection_error_e err_type) +{ + _DBG("Not Yet"); +#if 0 + switch (err_type) { + case CONNECTION_ERROR_NONE: + return "NONE"; + case CONNECTION_ERROR_INVALID_PARAMETER: + return "INVALID_PARAMETER"; + case CONNECTION_ERROR_OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case CONNECTION_ERROR_INVALID_OPERATION: + return "INVALID_OPERATION"; + case CONNECTION_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED: + return "ADDRESS_FAMILY_NOT_SUPPORTED"; + case CONNECTION_ERROR_OPERATION_FAILED: + return "OPERATION_FAILED"; + case CONNECTION_ERROR_ITERATOR_END: + return "ITERATOR_END"; + case CONNECTION_ERROR_NO_CONNECTION: + return "NO_CONNECTION"; + case CONNECTION_ERROR_NOW_IN_PROGRESS: + return "NOW_IN_PROGRESS"; + case CONNECTION_ERROR_ALREADY_EXISTS: + return "ALREADY_EXISTS"; + case CONNECTION_ERROR_OPERATION_ABORTED: + return "OPERATION_ABORTED"; + case CONNECTION_ERROR_DHCP_FAILED: + return "DHCP_FAILED"; + case CONNECTION_ERROR_INVALID_KEY: + return "INVALID_KEY"; + case CONNECTION_ERROR_NO_REPLY: + return "NO_REPLY"; + case CONNECTION_ERROR_NO_KEYWORD: + return "NO_KEYWORD"; + case CONNECTION_ERROR_TCP_RST: + return "RST_IN_TCP_RESPONSE"; + case CONNECTION_ERROR_TCP_SYN_TIMEOUT: + return "TCP_SYN_TIMEOUT"; + case CONNECTION_ERROR_OFFLINE: + return "CONNECTION_OFFLINE"; + case CONNECTION_ERROR_NETWORK_MONITOR_FAILURE: + return "monitor failer"; + case CONNECTION_ERROR_INVALID_GATEWAY: + return "invalid gateway"; + case CONNECTION_ERROR_INVALID_MACADDRESS: + return "invalid mac addr"; + default: + break; + } +#endif + + return "Unknown"; +} + +/** + * Creates a handle for managing data connections. + * + * The handle must be released with connection_destroy(). + * + * @return connetcion if the operation is successful; NULL if failed; + */ +connection_h connection_mgr_create(void) +{ + int ret; + connection_h connection; + + connection = NULL; + ret = connection_create(&connection); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_create failed"); + connection = NULL; + } + + return connection; +} + +/** + * Destroys the connection handle. + * + * @param[in] connection The handle of the connection + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_destroy(connection_h connection) +{ + int ret; + + if (!connection) { + _ERR("connection is NULL."); + return RET_FAILED; + } + + ret = connection_destroy(connection); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_destroy() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the ethernet profile information. + * + * Iterates all the profile in the connection, and gets the ethernet one. + * + * @param[in] connection The handle of the connection + * @param[out] info The structure to store profile information + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_get_profile_info( + connection_h connection, struct connection_info *info) +{ + connection_profile_iterator_h iter; + connection_profile_h profile; + connection_profile_type_e type; + char *name; + int ret; + + if (!info || !connection) { + _ERR("param is NULL."); + return RET_FAILED; + } + + ret = connection_get_profile_iterator(connection, + CONNECTION_ITERATOR_TYPE_REGISTERED, &iter); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("Fail to get profile iterator [%d]\n", ret); + return RET_FAILED; + } + + while (connection_profile_iterator_has_next(iter)) { + profile = NULL; + if (connection_profile_iterator_next(iter, + &profile) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get profile handle\n"); + return RET_FAILED; + } + + if (!profile) { + _ERR("get profile failed."); + return RET_FAILED; + } + + if (connection_profile_get_type(profile, + &type) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get profile type\n"); + return RET_FAILED; + } + + name = NULL; + if (connection_profile_get_name(profile, + &name) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get profile name\n"); + return RET_FAILED; + } + + if (!name) { + _ERR("get name failed."); + return RET_FAILED; + } + + if (type == CONNECTION_PROFILE_TYPE_ETHERNET) { + strncpy(info->name, name, MAX_NAME_SIZE - 1); + info->profile = profile; + } + + free(name); + } + + return RET_SUCCESS; +} + +/** + * Registers the callback called when the state of profile is changed. + * + * If the state of profile is changed, the registered callback will be called. + * + * @param[in] profile The handle of the profile + * @param[in] cb The callback function to be called + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +#if 0 +int connection_mgr_set_profile_state_changed_cb( + connection_profile_h profile, + connection_profile_state_changed_cb cb, void *data) +{ + int ret; + + if (!profile || !cb || !data) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_profile_set_state_changed_cb(profile, + cb, data); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_profile_set_state_changed_cb() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} +#endif + +/** + * Gets the state of the connection. + * + * @param[in] connection The handle of the connection + * @return EINA_TRUE if the connection is OK; EINA_FALSE otherwise; + */ +Eina_Bool connection_mgr_is_connected(connection_h connection) +{ + int ret; + connection_ethernet_state_e state; + + if (!connection) { + _ERR("the connection is NULL."); + return EINA_FALSE; + } + + ret = connection_get_ethernet_state(connection, &state); + if (ret == CONNECTION_ERROR_NONE && + state == CONNECTION_ETHERNET_STATE_CONNECTED) + return EINA_TRUE; + + return EINA_FALSE; +} + +/** + * Sets the profile information. + * + * Sets the network information to profile. + * + * @param[in] connection The handle of the connection + * @param[in] profile The handle of the profile + * @param[in] info Network information + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_set_profile(connection_h connection, + connection_profile_h profile, + struct network_info *info) +{ + int ret; + + if (!connection || !profile || !info) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_update_profile(connection, profile); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_update_profile failed.\n"); + return RET_FAILED; + } + + ret = connection_profile_set_ip_config_type(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + CONNECTION_IP_CONFIG_TYPE_STATIC); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_profile_set_ip_config_type() failed."); + return RET_FAILED; + } + + ret = connection_profile_set_ip_address(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + info->ip_addr); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_profile_set_ip_address() failed."); + return RET_FAILED; + } + + ret = connection_profile_set_subnet_mask(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + info->submask); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("fail to set_subnet_mask %d\n" , ret); + return RET_FAILED; + } + + ret = connection_profile_set_gateway_address(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + info->gateway); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("fail to set_gateway_address %d\n" , ret); + return RET_FAILED; + } + + ret = connection_profile_set_dns_address(profile, 1, + CONNECTION_ADDRESS_FAMILY_IPV4, + info->dns); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("fail to set_dns_address %d\n" , ret); + return RET_FAILED; + } + + ret = connection_update_profile(connection, profile); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_update_profile failed.\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets whether the profile can access to the internet asynchronously. + * + * The result will return in the registered callback. + * + * @param[in] connection The handle of the connection + * @param[in] cb The callback function to be called + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +#if 0 +int connection_mgr_get_is_online_async( + connection_h connection, + connection_is_online_async_cb cb, void *data) +{ + int ret; + + if (!connection || !cb || !data) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_get_is_online_async(connection, cb, data); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_get_is_online_async() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} +#endif + +/** + * Validates gateway address set for Ethernet Asynchronusly. + * + * The result will return in the registered callback. + * + * @param[in] profile The handle of the profile + * @param[in] cb The callback function to be called + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +#if 0 +int connection_mgr_check_gateway_async( + connection_profile_h profile, + connection_profile_check_gateway_async_cb cb, void *data) +{ + int ret; + + if (!profile || !cb || !data) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_profile_check_gateway_async(profile, cb, data); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_get_is_online_async() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} +#endif + +/** + * Sets the IP config type into dynamic. + * + * Called when the profile need getting IP dynamically. + * + * @param[in] connection The handle of the connection + * @param[in] profile The handle of the profile + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_ip_dynamic_config( + connection_h connection, + connection_profile_h profile) +{ + int ret; + + if (!connection || !profile) { + _ERR("The param is invalid.\n"); + return RET_FAILED; + } + + ret = connection_update_profile(connection, profile); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_update_profile failed, ret: %s.\n", + _convert_error_to_string(ret)); + return RET_FAILED; + } + + ret = connection_profile_set_ip_config_type(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + CONNECTION_IP_CONFIG_TYPE_DYNAMIC); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("Fail to set ip method type[%s]\n", + _convert_error_to_string(ret)); + return RET_FAILED; + } + + ret = connection_update_profile(connection, profile); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_update_profile failed, ret: %s.\n", + _convert_error_to_string(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Registers callback for ethernet cable. + * + * Including cable plugged [in/out] event. + * + * @param[in] connection The handle of the connection + * @param[in] cb The callback function to be called + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +#if 0 +int connection_mgr_register_ethernet_state_cb( + connection_h connection, + connection_ethernet_state_chaged_cb cb, void *data) +{ + int ret; + + if (!connection || !cb || !data) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_set_ethernet_state_chaged_cb(connection, cb, data); + if (ret != RET_SUCCESS) { + _ERR("connection_set_ethernet_state_chaged_cb() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} +#endif + +/** + * Gets the state of ethernet. + * + * The returned state is for the ethernet connection state. + * + * @param[in] connection The handle of the connection + * @param[out] plugin The cable plugged state + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_get_ethernet_state( + connection_h connection, Eina_Bool *plugin) +{ + int ret; + connection_ethernet_state_e state; + + if (!connection || !plugin) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_get_ethernet_state(connection, &state); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_get_ethernet_state() failed."); + return RET_FAILED; + } + + if (state == CONNECTION_ETHERNET_STATE_DEACTIVATED) + *plugin = EINA_FALSE; + else + *plugin = EINA_TRUE; + + return RET_SUCCESS; +} + +/** + * Sets the network information. + * + * Including IP, submask and gateway. + * + * @param[in] profile The handle of the profile + * @param[in] info The structure of network + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_set_ip_config( + connection_profile_h profile, + struct network_info *info) +{ + int ret; + + if (!profile || !info) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_profile_set_ip_address(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + info->ip_addr); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("set ip address fail, ret: %s\n", + _convert_error_to_string(ret)); + return RET_FAILED; + } + + ret = connection_profile_set_subnet_mask(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + info->submask); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("set subnet mask fail. %s\n", + _convert_error_to_string(ret)); + return RET_FAILED; + } + + ret = connection_profile_set_gateway_address(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + info->gateway); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("set gateway address fail %s\n", + _convert_error_to_string(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Sets the DNS. + * + * @param[in] profile The handle of the profile + * @param[in] info The structure of network + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_set_dns_config( + connection_profile_h profile, + struct network_info *info) +{ + int ret; + + if (!profile || !info) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_profile_set_dns_address(profile, 1, + CONNECTION_ADDRESS_FAMILY_IPV4, + info->dns); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("set dns address fail %d\n", + _convert_error_to_string(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the network information. + * + * @param[in] profile The handle of the profile + * @param[out] info The structure of network + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_get_ip_info( + connection_profile_h profile, + struct network_info *info) +{ + char *str_value; + + if (!profile || !info) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + if (connection_profile_get_ip_address(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + &str_value) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get IP address!\n"); + strncpy(info->ip_addr, ZERO_IP, IP_STRING_MAX_SIZE); + } else { + strncpy(info->ip_addr, str_value, IP_STRING_MAX_SIZE); + free(str_value); + } + + if (connection_profile_get_subnet_mask(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + &str_value) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get subnet mask!\n"); + strncpy(info->submask, ZERO_IP, IP_STRING_MAX_SIZE); + } else { + strncpy(info->submask, str_value, IP_STRING_MAX_SIZE); + free(str_value); + } + + if (connection_profile_get_gateway_address(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, + &str_value) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get gateway!\n"); + strncpy(info->gateway, ZERO_IP, IP_STRING_MAX_SIZE); + } else { + strncpy(info->gateway, str_value, IP_STRING_MAX_SIZE); + free(str_value); + } + + if (connection_profile_get_dns_address(profile, 1, + CONNECTION_ADDRESS_FAMILY_IPV4, + &str_value) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get DNS1!\n"); + strncpy(info->dns, ZERO_IP, IP_STRING_MAX_SIZE); + } else { + strncpy(info->dns, str_value, IP_STRING_MAX_SIZE); + free(str_value); + } + + return RET_SUCCESS; +} diff --git a/ug/network/src/ip_setting_view.c b/ug/network/src/ip_setting_view.c new file mode 100644 index 0000000..a894510 --- /dev/null +++ b/ug/network/src/ip_setting_view.c @@ -0,0 +1,2640 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "ip_setting_view.h" +#include "vconf_mgr.h" +#include "i18n.h" +#include "util.h" +#include "common.h" +#include "util.h" +#include "wifi_mgr.h" + +#define KEY_PRIV "priv" + +#define MODE_BTN_NUM 2 +#define MAX_IP_NUM 255 +#define IP_SET_MAX_NUM 4 +#define STRING_MAX_SIZE 50 +#define SETTING_MODE_OFFSET_X 448 +#define SETTING_MODE_OFFSET_Y 0 +#define SETTING_VALUE_OFFSET_X 162 +#define SETTING_VALUE_OFFSET_Y 20 +#define CENTER_ALIGN 0.5 +#define BOX_PAD_X 0 +#define BOX_PAD_Y 2 +#define RATIO 10 + +#define IP_VALUE1 "value1" +#define IP_VALUE2 "value2" +#define IP_VALUE3 "value3" +#define IP_VALUE4 "value4" + +#define TXT_MAKE_OTHER_NETWORK _("You can make other network"\ + "
Enter the IP address to use.") + +enum connection_setting_enum { + SETTING_INVALID, + SETTING_IP, + SETTING_IP_ADDRESS, + SETTING_SUBNET_MASK, + SETTING_GATEWAY, + SETTING_DNS, + SETTING_DNS_SERVER +}; + +struct _priv { + Evas_Object *win; + ui_gadget_h ug; + struct viewmgr *vmgr; + + Evas_Object *base; + Evas_Object *dim_ly; + Evas_Object *ip_mode_btn; + Evas_Object *ip_addr_btn; + Evas_Object *subnet_mask_btn; + Evas_Object *gateway_btn; + Evas_Object *dns_mode_btn; + Evas_Object *dns_server_btn; + Evas_Object *ip_mode_ly; + Evas_Object *dns_mode_ly; + Evas_Object *config_popup; + Evas_Object *cur_ip_btn[IP_SET_MAX_NUM]; + Evas_Object *confirm_popup; + Evas_Object *ok_btn; + Evas_Object *cancel_btn; + + struct network_info info; + enum setting_mode ip_mode; + enum setting_mode dns_mode; + + enum connection_setting_enum cur_type; + enum network_type_enum network_type; + + connection_h connection; + connection_profile_h profile; + + wifi_ap_h ap; + + char name[MAX_NAME_SIZE]; +}; + +static void _show_confirm_popup(struct _priv *priv); +static void _popup_dismissed_cb(void *data, Evas_Object *obj, void *ev); + +/** + * Initializes the private data. + * + * Called when the view is loaded. + * + * @return the handler of the private data; + */ +static struct _priv *_init_priv() +{ + struct _priv *priv; + + priv = calloc(1, sizeof(*priv)); + + return priv; +} + +/** + * Deinitializes the private data. + * + * Called when the view is deleted. + * + * @param[in] priv The handler of the private data + */ +static void _fini_priv(struct _priv *priv) +{ + if (!priv) + return; + + if (priv->dim_ly) + evas_object_del(priv->dim_ly); + + free(priv); +} + +/** + * Sets the cycle focus in the direction of up and down. + * + * Sets the cycle focus for an array of objects. + * + * @param[in] obj The handler of objects + * @param[in] count The count of objects + */ +static void _set_up_down_cycle_focus(Evas_Object **obj, + int count) +{ + int i; + + if (!*obj || !obj) + return; + + for (i = 0; i < count; i++) { + if (i == count - 1) + elm_object_focus_next_object_set(obj[i], obj[0], + ELM_FOCUS_DOWN); + else + elm_object_focus_next_object_set(obj[i], obj[i + 1], + ELM_FOCUS_DOWN); + + if (i == 0) + elm_object_focus_next_object_set(obj[i], obj[count - 1], + ELM_FOCUS_UP); + else + elm_object_focus_next_object_set(obj[i], obj[i - 1], + ELM_FOCUS_UP); + } +} + +/** + * Creates the basic layout of the view. + * + * @param[in] parent The parent object + * @return layout if the operation is successful; NULL if failed; + */ +static Evas_Object *_create_basic_layout(Evas_Object *parent) +{ + Evas_Object *base; + + if (!parent) { + _ERR("parent is NULL."); + return NULL; + } + + base = elm_layout_add(parent); + if (!base) { + _ERR("elm_layout_add() failed."); + return NULL; + } + + elm_layout_file_set(base, UG_NETWORK_EDJ_FILE, + GRP_CONNECTION_SETTING); + + evas_object_show(base); + + return base; +} + +/** + * Sets the description. + * + * Sets the description for the IP setting view. + * + * @param[in] priv The handler of the private data + */ +static void _set_description(struct _priv *priv) +{ + if (!priv || !priv->base) { + _ERR("priv is invalid."); + return; + } + + elm_object_part_text_set(priv->base, + PART_CONNECTION_DESCRITION, + TXT_MAKE_OTHER_NETWORK); +} + +/** + * Gets the network type. + * + * For either wired or wireless. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _get_cur_mode(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("The param is invalid.\n"); + return RET_FAILED; + } + + if (priv->network_type == TYPE_WIRED) { + ret = vconf_mgr_get_wired_ip_mode(&priv->ip_mode); + if (ret != RET_SUCCESS) + _ERR("get wired ip mode from vconf failed."); + + ret = vconf_mgr_get_wired_dns_mode(&priv->dns_mode); + if (ret != RET_SUCCESS) + _ERR("get wired dns mode from vconf failed."); + } else if (priv->network_type == TYPE_WIRELESS) { + ret = vconf_mgr_get_wireless_ip_mode(&priv->ip_mode); + if (ret != RET_SUCCESS) + _ERR("get wireless ip mode from vconf failed."); + + ret = vconf_mgr_get_wireless_dns_mode(&priv->dns_mode); + if (ret != RET_SUCCESS) + _ERR("get wireless dns mode from vconf failed."); + } else { + _ERR("the network type is invalid."); + ret = RET_FAILED; + } + + return ret; +} + +/** + * Gets the network information for the profile. + * + * For wired network. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _get_connection_profile_info(struct _priv *priv) +{ + struct connection_info info; + int ret; + + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_mgr_get_profile_info(priv->connection, &info); + if (ret != RET_SUCCESS) { + _ERR("connection_mgr_get_profile_info() failed."); + return RET_FAILED; + } + + priv->profile = info.profile; + + return RET_SUCCESS; +} + +/** + * Gets the network information for the profile. + * + * For either wired network or wireless network. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _get_cur_ip_info(struct _priv *priv) +{ + struct network_info info; + int ret; + + if (!priv) { + _ERR("The param is invalid.\n"); + return RET_FAILED; + } + + ret = _get_connection_profile_info(priv); + if (ret != RET_SUCCESS) { + _ERR("get profile failed."); + return RET_FAILED; + } + + if (priv->network_type == TYPE_WIRED) { + if (priv->ip_mode == MODE_AUTO) { + ret = connection_mgr_get_ip_info(priv->profile, &info); + if (ret != RET_SUCCESS) { + _ERR("connection_mgr_get_ip_info() failed."); + return ret; + } + } else if (priv->ip_mode == MODE_MAN) { + ret = vconf_mgr_get_wired_network_info(&info); + if (ret != RET_SUCCESS) { + _ERR("get wired network info failed."); + return ret; + } + } else { + _ERR("ip mode is invalid."); + return RET_FAILED; + } + } else if (priv->network_type == TYPE_WIRELESS) { + if (priv->ip_mode == MODE_AUTO) { + ret = wifi_mgr_get_ip_info(priv->ap, &info); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_get_ip_info() failed."); + return ret; + } + } else if (priv->ip_mode == MODE_MAN) { + ret = vconf_mgr_get_wireless_network_info(&info); + if (ret != RET_SUCCESS) { + _ERR("get wireless network info failed."); + return ret; + } + } else { + _ERR("ip mode is invalid."); + return RET_FAILED; + } + } else { + _ERR("network type is invalid."); + return RET_FAILED; + } + + strncpy(priv->info.ip_addr, info.ip_addr, IP_STRING_MAX_SIZE); + strncpy(priv->info.submask, info.submask, IP_STRING_MAX_SIZE); + strncpy(priv->info.gateway, info.gateway, IP_STRING_MAX_SIZE); + strncpy(priv->info.dns, info.dns, IP_STRING_MAX_SIZE); + + return RET_SUCCESS; +} + +/** + * Shows the dim layout. + * + * Called when there is a ctxpopup. + * + * @param[in] priv The handler of the private data + */ +static void _set_layout_dim(struct _priv *priv) +{ + if (!priv || !priv->dim_ly) { + _ERR("The param is invalid.\n"); + return; + } + + evas_object_show(priv->dim_ly); +} + +/** + * Hides the dim layout. + * + * Called when the existing ctxpopup is deleted. + * + * @param[in] priv The handler of the private data + */ +static void _unset_layout_dim(struct _priv *priv) +{ + if (!priv || !priv->dim_ly) { + _ERR("The param is invalid.\n"); + return; + } + + evas_object_hide(priv->dim_ly); +} + +/** + * Deletes the confirm popup. + * + * @param[in] priv The handler of the private data + */ +static void _del_confirm_popup(struct _priv *priv) +{ + if (!priv || !priv->confirm_popup) { + _ERR("The param is invalid.\n"); + return; + } + + evas_object_del(priv->confirm_popup); + priv->confirm_popup = NULL; + + _unset_layout_dim(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* When the 'OK' or 'Cancel' button is clicked, delete the popup, +* and set the default focus. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] event Event information +*/ +static void _popup_ok_cancel_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _del_confirm_popup(priv); + + elm_object_focus_set(priv->ok_btn, EINA_TRUE); +} + +/** + * Keeps the focused layout for the specific button. + * + * Emits a signal to edc to keep the focused state. + * + * @param[in] priv The handler of the private data + */ +static void _keep_button_focused(struct _priv *priv) +{ + Evas_Object *obj; + + if (!priv) { + _ERR("the param is invalid."); + return; + } + + switch (priv->cur_type) { + case SETTING_IP: + obj = priv->ip_mode_btn; + break; + case SETTING_IP_ADDRESS: + obj = priv->ip_addr_btn; + break; + case SETTING_SUBNET_MASK: + obj = priv->subnet_mask_btn; + break; + case SETTING_GATEWAY: + obj = priv->gateway_btn; + break; + case SETTING_DNS: + obj = priv->dns_mode_btn; + break; + case SETTING_DNS_SERVER: + obj = priv->dns_server_btn; + break; + default: + return; + } + + elm_object_signal_emit(obj, SIG_BTN_SELECTED, PROG); +} + +/** + * Disables the IP buttons. + * + * If the mode is automatic, the IP buttons will be disabled. + * + * @param[in] priv The handler of the private data + */ +static void _disable_ip_btns(struct _priv *priv) +{ + if (!priv) { + _ERR("the param is invalid."); + return; + } + + elm_object_disabled_set(priv->ip_addr_btn, EINA_TRUE); + elm_object_disabled_set(priv->subnet_mask_btn, EINA_TRUE); + elm_object_disabled_set(priv->gateway_btn, EINA_TRUE); +} + +/** + * Eables the IP buttons. + * + * If the mode is manual, the IP buttons will be eabled. + * + * @param[in] priv The handler of the private data + */ +static void _enable_ip_btns(struct _priv *priv) +{ + if (!priv) { + _ERR("the param is invalid."); + return; + } + + elm_object_disabled_set(priv->ip_addr_btn, EINA_FALSE); + elm_object_disabled_set(priv->subnet_mask_btn, EINA_FALSE); + elm_object_disabled_set(priv->gateway_btn, EINA_FALSE); +} + +/** +* @Evas_Smart_Cb type callback for handling dismissed event. +* +* When the ctxpopup is dismissed, delete the ctxpopup, +* and set the default focus. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _popup_dismissed_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _unset_layout_dim(priv); + + if (priv->confirm_popup) + evas_object_del(priv->confirm_popup); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* When the 'automatical' button is clicked, delete the popup, +* and disable the IP buttons. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _ip_auto_mode_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _disable_ip_btns(priv); + + if (priv->ip_mode_btn) + elm_object_part_text_set(priv->ip_mode_btn, + PART_VALUE, _(TXT_OBTAIN_AUTO)); + + evas_object_del(priv->ip_mode_ly); + priv->ip_mode_ly = NULL; + priv->ip_mode = MODE_AUTO; + + _unset_layout_dim(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling dismissed event. +* +* When the ctxpopup is dismissed, delete the ctxpopup. +* +* @param[in] data User data +* @param[in] o The corresponding object which the focus event occurred +* @param[in] ei Event information +*/ +static void _mode_sub_popup_dismissed_cb(void *data, + Evas_Object *o, void *ei) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _unset_layout_dim(priv); + + if (priv->cur_type == SETTING_IP) { + evas_object_del(priv->ip_mode_ly); + priv->ip_mode_ly = NULL; + } else if (priv->cur_type == SETTING_DNS) { + evas_object_del(priv->dns_mode_ly); + priv->dns_mode_ly = NULL; + } +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, delete the mode ctxpopup. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] o The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _mode_sub_popup_key_pressed_cb(void *data, Evas *evas, + Evas_Object *o, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_LEFT) || !strcmp(ev->keyname, KEY_RIGHT)) { + _unset_layout_dim(priv); + + if (priv->cur_type == SETTING_IP) { + evas_object_del(priv->ip_mode_ly); + priv->ip_mode_ly = NULL; + } else if (priv->cur_type == SETTING_DNS) { + evas_object_del(priv->dns_mode_ly); + priv->dns_mode_ly = NULL; + } + } +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* When the manual mode button is clicked, delete the popup, +* and enable the IP buttons. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _ip_manual_mode_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _enable_ip_btns(priv); + + elm_object_part_text_set(priv->ip_mode_btn, + PART_VALUE, _(TXT_ENTER_MAN)); + + evas_object_del(priv->ip_mode_ly); + priv->ip_mode_ly = NULL; + priv->ip_mode = MODE_MAN; + + _unset_layout_dim(priv); +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, delete the IP value ctxpopup. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] o The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _ip_ctxpopup_key_pressed_cb(void *data, Evas *evas, + Evas_Object *o, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + _unset_layout_dim(priv); + + evas_object_del(priv->ip_mode_ly); + priv->ip_mode_ly = NULL; + } +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, delete the ctxpopup. + * + * @param[in] data User data + * @param[in] e Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _ctxpopup_pressed_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!data || !ei) { + _ERR("Parameter error!"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + _unset_layout_dim(priv); + evas_object_del(obj); + } +} + +/** +* @Evas_Smart_Cb type callback for handling unfocused event. +* +* When the ctxpopup is unfocused, hide the dim layout, +* and delete the ctxpopup. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] source Event information +*/ +static void _ctxpopup_unfocused_cb(void *data, + Evas_Object *obj, void *source) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("data is NULL.\n"); + return; + } + + priv = data; + + _unset_layout_dim(priv); + evas_object_del(obj); +} + +/** + * Creates the mode button. + * + * Uses the style of 'mode_select'. + * + * @param[in] base The parent object + * @param[in] txt The text in button + * @param[in] cb The callback for clicked event + * @param[in] data User data + * @return button if the operation is successful; NULL if failed; + */ +static Evas_Object *_create_mode_setting_btn(Evas_Object *base, + char *txt, Evas_Smart_Cb cb, void *data) +{ + Evas_Object *btn; + + if (!base || !txt || !cb || !data) { + _ERR("The param is invalid.\n"); + return NULL; + } + + btn = util_add_button(base, STYLE_MODE_SELECT_BTN, NULL, txt); + if (!btn) { + _ERR("Add btn failed.\n"); + return NULL; + } + + evas_object_smart_callback_add(btn, SIG_DISMISSED, + _mode_sub_popup_dismissed_cb, data); + evas_object_smart_callback_add(btn, SIG_CLICKED, cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _mode_sub_popup_key_pressed_cb, data); + + return btn; +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* Creates the IP value ctxpopup. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _ip_setting_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + Evas_Object *base; + Evas_Object *ctxpopup; + Evas_Object *box; + Evas_Object *auto_btn; + Evas_Object *man_btn; + Evas_Coord x; + Evas_Coord y; + Evas_Coord w; + Evas_Coord h; + Evas_Object *btn[MODE_BTN_NUM]; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + priv->cur_type = SETTING_IP; + base = priv->base; + + if (priv->ip_mode == MODE_INVALID) + priv->ip_mode = MODE_MAN; + + ctxpopup = util_add_layout(base, UG_NETWORK_EDJ_FILE, + GRP_NETWORK_MODE_SETTING); + if (!ctxpopup) { + _ERR("elm_layout_add() failed.\n"); + return; + } + + _set_layout_dim(priv); + _keep_button_focused(priv); + + box = util_add_box(ctxpopup, PART_SWALLOW_CONTENT); + if (!box) { + _ERR("create box failed."); + evas_object_del(ctxpopup); + return; + } + + elm_box_horizontal_set(box, EINA_FALSE); + + auto_btn = _create_mode_setting_btn(ctxpopup, _(TXT_OBTAIN_AUTO), + _ip_auto_mode_btn_clicked_cb, (void *)priv); + if (!auto_btn) { + _ERR("Add btn failed.\n"); + evas_object_del(ctxpopup); + return; + } + + elm_box_pack_end(box, auto_btn); + elm_object_focus_set(auto_btn, EINA_TRUE); + btn[0] = auto_btn; + + man_btn = _create_mode_setting_btn(ctxpopup, _(TXT_ENTER_MAN), + _ip_manual_mode_btn_clicked_cb, (void *)priv); + if (!man_btn) { + _ERR("Add btn failed.\n"); + evas_object_del(ctxpopup); + return; + } + + elm_box_pack_end(box, man_btn); + btn[1] = man_btn; + + _set_up_down_cycle_focus(btn, 2); + + evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_KEY_DOWN, + _ip_ctxpopup_key_pressed_cb, priv); + evas_object_smart_callback_add(ctxpopup, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + + priv->ip_mode_ly = ctxpopup; + + if (priv->ip_mode == MODE_AUTO) + elm_object_signal_emit(auto_btn, SIG_BTN_SELECTED, PROG); + else if (priv->ip_mode == MODE_MAN) + elm_object_signal_emit(man_btn, SIG_BTN_SELECTED, PROG); + + evas_object_geometry_get(priv->ip_mode_btn, &x, &y, &w, &h); + evas_object_move(ctxpopup, (x + SETTING_MODE_OFFSET_X) * ELM_SCALE, + (y + h) * ELM_SCALE); +} + +/** + * Gets the position of IP value ctxpopup. + * + * Gets the specific position by the current type. + * + * @param[in] priv The handler of the private data + * @param[out] pos_x X position + * @param[out] pos_y Y position + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _get_value_popup_pos(struct _priv *priv, + Evas_Coord *pos_x, Evas_Coord *pos_y) +{ + Evas_Coord x; + Evas_Coord y; + Evas_Coord w; + Evas_Coord h; + + if (!priv || !pos_x || !pos_y) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + switch (priv->cur_type) { + case SETTING_IP_ADDRESS: + evas_object_geometry_get(priv->ip_addr_btn, &x, &y, &w, &h); + *pos_x = x + SETTING_VALUE_OFFSET_X; + *pos_y = y - SETTING_VALUE_OFFSET_Y; + break; + case SETTING_SUBNET_MASK: + evas_object_geometry_get(priv->subnet_mask_btn, &x, &y, &w, &h); + *pos_x = x + SETTING_VALUE_OFFSET_X; + *pos_y = y - SETTING_VALUE_OFFSET_Y; + break; + case SETTING_GATEWAY: + evas_object_geometry_get(priv->gateway_btn, &x, &y, &w, &h); + *pos_x = x + SETTING_VALUE_OFFSET_X; + *pos_y = y - SETTING_VALUE_OFFSET_Y; + break; + case SETTING_DNS_SERVER: + evas_object_geometry_get(priv->dns_server_btn, &x, &y, &w, &h); + *pos_x = x + SETTING_VALUE_OFFSET_X; + *pos_y = y - 2 * SETTING_VALUE_OFFSET_Y; + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Sets the number to the object text. + * + * @param[in] obj The handler of the object + * @param[in] num The number + */ +static void _set_text_num(Evas_Object *obj, int num) +{ + char value[IP_STRING_MAX_SIZE]; + + if (!obj) { + _ERR("The param is invalid."); + return; + } + + memset(value, 0, IP_STRING_MAX_SIZE); + snprintf(value, IP_STRING_MAX_SIZE - 1, "%d", num); + elm_object_text_set(obj, value); +} + +/** + * Callback for key pressed event. + * + * The button responds the key, and sets the number for the button. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _ip_btn_key_pressed_cb(void *data, Evas *evas, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + const char *value; + int num, new_num; + + if (!ei || !data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_UP)) { + value = elm_object_text_get(obj); + num = atoi(value); + num++; + if (num > MAX_IP_NUM) + num = 0; + } else if (!strcmp(ev->keyname, KEY_DOWN)) { + value = elm_object_text_get(obj); + num = atoi(value); + num--; + if (num < 0) + num = MAX_IP_NUM; + } else if (!strcmp(ev->keyname, KEY_0) || + !strcmp(ev->keyname, KEY_1) || + !strcmp(ev->keyname, KEY_2) || + !strcmp(ev->keyname, KEY_3) || + !strcmp(ev->keyname, KEY_4) || + !strcmp(ev->keyname, KEY_5) || + !strcmp(ev->keyname, KEY_6) || + !strcmp(ev->keyname, KEY_7) || + !strcmp(ev->keyname, KEY_8) || + !strcmp(ev->keyname, KEY_9)) { + value = elm_object_text_get(obj); + if (!value) + elm_object_text_set(obj, ev->keyname); + + new_num = atoi(ev->keyname); + + num = atoi(value); + if (!num || (num * RATIO + new_num) > MAX_IP_NUM) { + elm_object_text_set(obj, ev->keyname); + return; + } + + num = num * RATIO + new_num; + } else { + return; + } + + _set_text_num(obj, num); +} + +/** + * Sets the value to the object text. + * + * @param[in] priv The handler of the private data + */ +static void _set_the_value(struct _priv *priv) +{ + Evas_Object *btn; + const char *value1; + const char *value2; + const char *value3; + const char *value4; + char value[IP_STRING_MAX_SIZE]; + + if (!priv || !priv->config_popup) { + _ERR("The param is invalid.\n"); + return; + } + + value1 = NULL; + btn = evas_object_data_get(priv->config_popup, IP_VALUE1); + if (btn) + value1 = elm_object_text_get(btn); + + value2 = NULL; + btn = evas_object_data_get(priv->config_popup, IP_VALUE2); + if (btn) + value2 = elm_object_text_get(btn); + + value3 = NULL; + btn = evas_object_data_get(priv->config_popup, IP_VALUE3); + if (btn) + value3 = elm_object_text_get(btn); + + value4 = NULL; + btn = evas_object_data_get(priv->config_popup, IP_VALUE4); + if (btn) + value4 = elm_object_text_get(btn); + + memset(value, 0, IP_STRING_MAX_SIZE); + snprintf(value, IP_STRING_MAX_SIZE, "%s.%s.%s.%s", + value1 ? value1 : "\\0", value2 ? value2 : "\\0", + value3 ? value3 : "\\0", value4 ? value4 : "\\0"); + + switch (priv->cur_type) { + case SETTING_IP_ADDRESS: + elm_object_part_text_set(priv->ip_addr_btn, + PART_VALUE, value); + strncpy(priv->info.ip_addr, value, IP_STRING_MAX_SIZE); + break; + case SETTING_SUBNET_MASK: + elm_object_part_text_set(priv->subnet_mask_btn, + PART_VALUE, value); + strncpy(priv->info.submask, value, IP_STRING_MAX_SIZE); + break; + case SETTING_GATEWAY: + elm_object_part_text_set(priv->gateway_btn, + PART_VALUE, value); + strncpy(priv->info.gateway, value, IP_STRING_MAX_SIZE); + break; + case SETTING_DNS_SERVER: + elm_object_part_text_set(priv->dns_server_btn, + PART_VALUE, value); + strncpy(priv->info.dns, value, IP_STRING_MAX_SIZE); + break; + default: + return; + } + + evas_object_del(priv->config_popup); + priv->config_popup = NULL; +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, delete the IP value ctxpopup. + * If the key is KEY_ENTER, set the value into the button. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _value_ctxpopup_key_pressed_cb(void *data, Evas *evas, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("The param is invalid.\n"); + return; + } + + ev = ei; + priv = data; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_ENTER)) { + _unset_layout_dim(priv); + _set_the_value(priv); + evas_object_del(obj); + } else if (!strcmp(ev->keyname, KEY_BACK)) { + _unset_layout_dim(priv); + evas_object_del(obj); + } +} + +/** + * Sets the cycle focus in the direction of left and right. + * + * Sets the cycle focus for an array of objects. + * + * @param[in] obj The handler of objects + * @param[in] count The count of objects + */ +static void _set_left_right_cycle_focus(Evas_Object **obj, int count) +{ + int i; + + if (!obj || !*obj) { + _ERR("the param is invalid."); + return; + } + + for (i = 0; i < count; i++) { + if (i == count - 1) + elm_object_focus_next_object_set(obj[i], + obj[0], ELM_FOCUS_RIGHT); + else + elm_object_focus_next_object_set(obj[i], + obj[i + 1], ELM_FOCUS_RIGHT); + + if (i == 0) + elm_object_focus_next_object_set(obj[i], + obj[count - 1], ELM_FOCUS_LEFT); + else + elm_object_focus_next_object_set(obj[i], + obj[i - 1], ELM_FOCUS_LEFT); + } +} + +/** + * Creates the value button for IP setting. + * + * @param[in] base The parent object + * @param[in] num The sequence number of the button + * @param[in] txt The text in the button + * @param[in] data User data + * @return button if the operation is successful; NULL if failed; + */ +static Evas_Object *_create_value_btn(Evas_Object *base, int num, + char *txt, void *data) +{ + Evas_Object *btn; + + if (!base || !txt || !data) { + _ERR("The param is invalid.\n"); + return NULL; + } + + btn = util_add_button(base, STYLE_VALUE_BTN, NULL, txt); + if (!btn) { + _ERR("add button failed.\n"); + return NULL; + } + + switch (num) { + case 0: + elm_object_part_content_set(base, PART_IP_FIRST, btn); + evas_object_data_set(base, IP_VALUE1, btn); + elm_object_focus_set(btn, EINA_TRUE); + break; + case 1: + elm_object_part_content_set(base, PART_IP_SECOND, btn); + evas_object_data_set(base, IP_VALUE2, btn); + break; + case 2: + elm_object_part_content_set(base, PART_IP_THIRD, btn); + evas_object_data_set(base, IP_VALUE3, btn); + break; + case 3: + elm_object_part_content_set(base, PART_IP_FORTH, btn); + evas_object_data_set(base, IP_VALUE4, btn); + break; + default: + break; + } + + evas_object_smart_callback_add(btn, SIG_CLICKED, + _popup_dismissed_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _ip_btn_key_pressed_cb, data); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN); + + return btn; +} + +/** + * Creates value ctxpopup. + * + * User can set number in the ctxpopup. + * + * @param[in] priv The handler of the private data + */ +static void _create_value_popup(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *ctxpopup; + Evas_Object *btn; + Evas_Coord pos_x; + Evas_Coord pos_y; + int i; + + if (!priv || !priv->base) { + _ERR("The param is invalid.\n"); + return; + } + + base = priv->base; + + ctxpopup = util_add_layout(base, UG_NETWORK_EDJ_FILE, + GRP_NETWORK_VALUE_SETTING); + if (!ctxpopup) { + _ERR("elm_ctxpopup_add() failed.\n"); + return; + } + + elm_object_focus_allow_set(ctxpopup, EINA_TRUE); + evas_object_smart_callback_add(ctxpopup, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + priv->config_popup = ctxpopup; + + _set_layout_dim(priv); + + for (i = 0; i < IP_SET_MAX_NUM; i++) { + btn = _create_value_btn(ctxpopup, i, _(TXT_ZERO), (void *)priv); + if (!btn) { + _ERR("_create_value_btn() failed.\n"); + evas_object_del(ctxpopup); + priv->config_popup = NULL; + return; + } + + priv->cur_ip_btn[i] = btn; + } + + evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_KEY_DOWN, + _value_ctxpopup_key_pressed_cb, priv); + _set_left_right_cycle_focus(priv->cur_ip_btn, IP_SET_MAX_NUM); + + _keep_button_focused(priv); + + pos_x = 0; + pos_y = 0; + _get_value_popup_pos(priv, &pos_x, &pos_y); + evas_object_move(ctxpopup, pos_x * ELM_SCALE, pos_y * ELM_SCALE); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* After the IP button is clicked, the value ctxpopup +* will be created to set the value. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _ip_address_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + priv->cur_type = SETTING_IP_ADDRESS; + _create_value_popup(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* After the submask button is clicked, the value ctxpopup +* will be created to set the value. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _sub_mask_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + priv->cur_type = SETTING_SUBNET_MASK; + _create_value_popup(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* After the gateway button is clicked, the value ctxpopup +* will be created to set the value. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _gateway_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + priv->cur_type = SETTING_GATEWAY; + _create_value_popup(priv); +} + +/** + * Creates setting button. + * + * @param[in] base The parent object + * @param[in] key The key value + * @param[in] txt The text in the button + * @param[in] cb The callback for clicked event + * @param[in] data User data + * @return button if the operation is successful; NULL if failed; + */ +static Evas_Object *_create_setting_btn(Evas_Object *base, + char *key, char *txt, Evas_Smart_Cb cb, void *data) +{ + Evas_Object *btn; + + if (!base || !key || !txt || !cb || !data) { + _ERR("The param is invalid.\n"); + return NULL; + } + + btn = util_add_key_value_button(base, NULL, key, txt); + if (!btn) { + _ERR("Add button failed.\n"); + return NULL; + } + + evas_object_smart_callback_add(btn, SIG_CLICKED, cb, data); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + + return btn; +} + +/** + * Creates IP setting layout. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_ip_setting(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *scroll; + Evas_Object *box; + Evas_Object *btn; + char mode[STRING_MAX_SIZE]; + + if (!priv || !priv->base) { + _ERR("The param is invalid.\n"); + return RET_FAILED; + } + + base = priv->base; + + scroll = util_add_scroll(base, PART_CONNECTION_IP_SETTING); + if (!scroll) { + _ERR("add scroll failed."); + return RET_FAILED; + } + + box = util_add_box(scroll, NULL); + if (!box) { + _ERR("add box failed."); + evas_object_del(scroll); + return RET_FAILED; + } + + elm_box_horizontal_set(box, EINA_FALSE); + elm_box_padding_set(box, BOX_PAD_X, BOX_PAD_Y); + + memset(mode, 0, STRING_MAX_SIZE); + if (priv->ip_mode == MODE_AUTO) + snprintf(mode, STRING_MAX_SIZE - 1, + "%s", _(TXT_OBTAIN_AUTO)); + else + snprintf(mode, STRING_MAX_SIZE - 1, + "%s", _(TXT_ENTER_MAN)); + + btn = _create_setting_btn(base, _(TXT_IP_SETTING), mode, + _ip_setting_btn_clicked_cb, (void *)priv); + if (!btn) { + _ERR("Add button failed.\n"); + evas_object_del(scroll); + return RET_FAILED; + } + + elm_box_pack_end(box, btn); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); + elm_object_focus_set(btn, EINA_TRUE); + priv->ip_mode_btn = btn; + + btn = _create_setting_btn(base, _(TXT_IP_ADDR), priv->info.ip_addr, + _ip_address_btn_clicked_cb, (void *)priv); + if (!btn) { + _ERR("Add btn failed.\n"); + evas_object_del(scroll); + return RET_FAILED; + } + + elm_box_pack_end(box, btn); + priv->ip_addr_btn = btn; + + btn = _create_setting_btn(base, _(TXT_SUBNET_MASK), priv->info.submask, + _sub_mask_btn_clicked_cb, (void *)priv); + if (!btn) { + _ERR("Add btn failed.\n"); + evas_object_del(scroll); + return RET_FAILED; + } + + elm_box_pack_end(box, btn); + priv->subnet_mask_btn = btn; + + btn = _create_setting_btn(base, _(TXT_GATEWAY), priv->info.gateway, + _gateway_btn_clicked_cb, (void *)priv); + if (!btn) { + _ERR("Add btn failed.\n"); + evas_object_del(scroll); + return RET_FAILED; + } + + elm_object_signal_emit(btn, SIG_HIDE_BOTTOME_LINE, PROG); + + elm_box_pack_end(box, btn); + priv->gateway_btn = btn; + + elm_object_content_set(scroll, box); + + if (priv->ip_mode == MODE_AUTO) + _disable_ip_btns(priv); + + return RET_SUCCESS; +} + +/** + * Disables DNS setting button. + * + * @param[in] priv The handler of the private data + */ +static void _disable_dns_btns(struct _priv *priv) +{ + if (!priv || !priv->dns_server_btn) { + _ERR("The param is invalid.\n"); + return; + } + + elm_object_disabled_set(priv->dns_server_btn, EINA_TRUE); +} + +/** + * Enables DNS setting button. + * + * @param[in] priv The handler of the private data + */ +static void _enable_dns_btns(struct _priv *priv) +{ + if (!priv || !priv->dns_server_btn) { + _ERR("The param is invalid.\n"); + return; + } + + elm_object_disabled_set(priv->dns_server_btn, EINA_FALSE); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* When the 'automatical' button is clicked, delete the popup, +* and disable the DNS buttons. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _dns_auto_mode_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _disable_dns_btns(priv); + + elm_object_part_text_set(priv->dns_mode_btn, + PART_VALUE, _(TXT_OBTAIN_AUTO)); + + evas_object_del(priv->dns_mode_ly); + priv->dns_mode_ly = NULL; + priv->dns_mode = MODE_AUTO; + + _unset_layout_dim(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* When the manual mode button is clicked, delete the popup, +* and enable the DNS buttons. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _dns_manual_mode_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _enable_dns_btns(priv); + + elm_object_part_text_set(priv->dns_mode_btn, + PART_VALUE, _(TXT_ENTER_MAN)); + + evas_object_del(priv->dns_mode_ly); + priv->dns_mode_ly = NULL; + priv->dns_mode = MODE_MAN; + + _unset_layout_dim(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling dismissed event. +* +* When the ctxpopup is dismissed, delete the ctxpopup. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _dns_ctxpopup_dismissed_cb(void *data, + Evas_Object *obj, void *source) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _unset_layout_dim(priv); + + evas_object_del(priv->dns_mode_ly); + priv->dns_mode_ly = NULL; +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, delete the DNS ctxpopup. + * If the key is KEY_EXIT, destroy the ug. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] o The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _dns_ctxpopup_key_pressed_cb(void *data, Evas *evas, + Evas_Object *o, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + _unset_layout_dim(priv); + evas_object_del(priv->dns_mode_ly); + priv->dns_mode_ly = NULL; + } else if (!strcmp(ev->keyname, KEY_EXIT)) { + ug_destroy_me(priv->ug); + } +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* Creates the DNS mode ctxpopup. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _dns_setting_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + struct _priv *priv; + Evas_Object *base; + Evas_Object *ctxpopup, *box; + Evas_Object *btn_auto, *btn_man; + Evas_Coord x, y, w, h; + Evas_Object *btn[2]; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + priv->cur_type = SETTING_DNS; + + base = priv->base; + + if (priv->dns_mode == MODE_INVALID) + priv->dns_mode = MODE_MAN; + + ctxpopup = util_add_layout(base, UG_NETWORK_EDJ_FILE, + GRP_NETWORK_MODE_SETTING); + if (!ctxpopup) { + _ERR("elm_layout_add() failed.\n"); + return; + } + + box = util_add_box(ctxpopup, PART_SWALLOW_CONTENT); + if (!box) { + _ERR("add box failed."); + evas_object_del(ctxpopup); + return; + } + + elm_box_horizontal_set(box, EINA_FALSE); + + btn_auto = _create_mode_setting_btn(ctxpopup, _(TXT_OBTAIN_AUTO), + _dns_auto_mode_btn_clicked_cb, priv); + if (!btn_auto) { + _ERR("Add btn failed.\n"); + evas_object_del(ctxpopup); + return; + } + + elm_box_pack_end(box, btn_auto); + elm_object_focus_set(btn_auto, EINA_TRUE); + btn[0] = btn_auto; + + btn_man = _create_mode_setting_btn(ctxpopup, _(TXT_ENTER_MAN), + _dns_manual_mode_btn_clicked_cb, priv); + if (!btn_man) { + _ERR("Add btn failed.\n"); + evas_object_del(ctxpopup); + return; + } + + elm_box_pack_end(box, btn_man); + btn[1] = btn_man; + + _set_up_down_cycle_focus(btn, 2); + + evas_object_event_callback_add(ctxpopup, + EVAS_CALLBACK_KEY_DOWN, + _dns_ctxpopup_key_pressed_cb, priv); + evas_object_smart_callback_add(ctxpopup, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_smart_callback_add(ctxpopup, SIG_DISMISSED, + _dns_ctxpopup_dismissed_cb, priv); + + evas_object_geometry_get(priv->dns_mode_btn, &x, &y, &w, &h); + priv->dns_mode_ly = ctxpopup; + + evas_object_move(ctxpopup, (x + SETTING_MODE_OFFSET_X) * ELM_SCALE, + (y + h) * ELM_SCALE); + + if (priv->dns_mode == MODE_AUTO) + elm_object_signal_emit(btn_auto, SIG_BTN_SELECTED, PROG); + else if (priv->dns_mode == MODE_MAN) + elm_object_signal_emit(btn_man, SIG_BTN_SELECTED, PROG); + + _set_layout_dim(priv); + + _keep_button_focused(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* After the DNS button is clicked, the value ctxpopup +* will be created to set the value. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _dns_server_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + priv->cur_type = SETTING_DNS_SERVER; + _create_value_popup(priv); +} + +/** + * Creates DNS setting layout. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_dns_setting(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *btn; + Evas_Object *box; + char mode[STRING_MAX_SIZE]; + + if (!priv || !priv->base) { + _ERR("The param is invalid.\n"); + return RET_FAILED; + } + + base = priv->base; + + box = util_add_box(base, PART_CONNECTION_DNS_SETTING); + if (!box) { + _ERR("add box failed."); + return RET_FAILED; + } + + elm_box_horizontal_set(box, EINA_FALSE); + elm_box_padding_set(box, BOX_PAD_X, BOX_PAD_Y); + + memset(mode, 0, STRING_MAX_SIZE); + if (priv->dns_mode == MODE_AUTO) + snprintf(mode, STRING_MAX_SIZE - 1, + "%s", _(TXT_OBTAIN_AUTO)); + else + snprintf(mode, STRING_MAX_SIZE - 1, + "%s", _(TXT_ENTER_MAN)); + + btn = util_add_key_value_button(base, NULL, + _(TXT_DNS_SETING), mode); + if (!btn) { + _ERR("Add button failed.\n"); + evas_object_del(box); + return RET_FAILED; + } + + evas_object_smart_callback_add(btn, + SIG_CLICKED, _dns_setting_btn_clicked_cb, priv); + elm_box_pack_end(box, btn); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + + priv->dns_mode_btn = btn; + + btn = util_add_key_value_button(base, NULL, + _(TXT_DNS_SERVER), priv->info.dns); + if (!btn) { + _ERR("Add btn failed.\n"); + evas_object_del(box); + return RET_FAILED; + } + + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + evas_object_smart_callback_add(btn, SIG_CLICKED, + _dns_server_btn_clicked_cb, priv); + elm_object_signal_emit(btn, SIG_HIDE_BOTTOME_LINE, PROG); + elm_box_pack_end(box, btn); + + priv->dns_server_btn = btn; + + if (priv->dns_mode == MODE_AUTO) + _disable_dns_btns(priv); + + return RET_SUCCESS; +} + +/** + * Checks if IP is valid. + * + * Now only check if IP is '0.0.0.0'. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; + * RET_IP_INVALID if the IP is '0.0.0.0'; RET_FAILED if failed; + */ +static int _check_is_ip_valid(struct _priv *priv) +{ + if (!priv) { + _ERR("The param is NULL.\n"); + return RET_FAILED; + } + + if (!strncmp(priv->info.ip_addr, ZERO_IP, + IP_STRING_MAX_SIZE)) { + _ERR("IP addr is invalid."); + return RET_IP_INVALID; + } + + if (!strncmp(priv->info.submask, ZERO_IP, + IP_STRING_MAX_SIZE)) { + _ERR("submask addr is invalid."); + return RET_IP_INVALID; + } + + if (!strncmp(priv->info.gateway, ZERO_IP, + IP_STRING_MAX_SIZE)) { + _ERR("gateway addr is invalid."); + return RET_IP_INVALID; + } + + if (!strncmp(priv->info.dns, ZERO_IP, + IP_STRING_MAX_SIZE)) { + _ERR("dns addr is invalid."); + return RET_IP_INVALID; + } + + return RET_SUCCESS; +} + +/** + * Shows the invalid IP ctxpopup. + * + * @param[in] priv The handler of the private data + */ +static void _show_invalid_ip_popup(struct _priv *priv) +{ + Evas_Object *layout; + Evas_Object *ok_btn; + Evas_Coord w; + Evas_Coord h; + char content[CONTENT_TXT_SIZE]; + + if (!priv) { + _ERR("The param is NULL.\n"); + return; + } + + if (priv->confirm_popup) + _del_confirm_popup(priv); + + _set_layout_dim(priv); + + layout = util_add_layout(priv->base, UG_NETWORK_EDJ_FILE, + GRP_CONFIRM_LAYOUT); + if (!layout) { + _ERR("add layout failed."); + _unset_layout_dim(priv); + return; + } + + evas_object_show(layout); + + if (priv->network_type == TYPE_WIRED) + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRED_LY)); + else + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRELESS_LY)); + + memset(content, 0, CONTENT_TXT_SIZE); + snprintf(content, CONTENT_TXT_SIZE - 1, "%s", + _(TXT_INVALID_IP)); + elm_object_part_text_set(layout, + PART_TEXT_CONTENT, content); + + ok_btn = util_add_button(layout, + STYLE_SETTING_BTN, PART_OK_BTN, _(TXT_OK)); + if (!ok_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + elm_object_focus_next_object_set(ok_btn, ok_btn, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(ok_btn, ok_btn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(ok_btn, ok_btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(ok_btn, ok_btn, ELM_FOCUS_DOWN); + evas_object_smart_callback_add(ok_btn, SIG_CLICKED, + _popup_ok_cancel_btn_clicked_cb, priv); + + elm_object_focus_set(ok_btn, EINA_TRUE); + + elm_object_focus_allow_set(layout, EINA_TRUE); + evas_object_smart_callback_add(layout, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _ctxpopup_pressed_cb, priv); + + w = 0; + h = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_move(layout, CENTER_ALIGN * (w - POPUP_WIDTH) * ELM_SCALE, + CENTER_ALIGN * (h - POPUP_HEIGHT) * ELM_SCALE); + + priv->confirm_popup = layout; +} + +/** + * Sets the mode as 'manually'. + * + * Depends on the network type. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _config_network_manually(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("The param is NULL.\n"); + return RET_FAILED; + } + + ret = _check_is_ip_valid(priv); + if (ret != RET_SUCCESS) { + _ERR("the ip is invalid."); + _show_invalid_ip_popup(priv); + return ret; + } + + _get_connection_profile_info(priv); + + switch (priv->network_type) { + case TYPE_WIRED: + ret = connection_mgr_set_profile(priv->connection, + priv->profile, &priv->info); + if (ret != RET_SUCCESS) { + _ERR("set profile failed."); + return ret; + } + + ret = vconf_mgr_save_wired_config_info(&priv->info); + if (ret != RET_SUCCESS) { + _ERR("saved wired ip info to vconf failed."); + return ret; + } + + break; + case TYPE_WIRELESS: + ret = wifi_mgr_set_ip_config(priv->ap, &priv->info); + if (ret != RET_SUCCESS) { + _ERR("set wifi ip config failed."); + return ret; + } + + ret = wifi_mgr_set_dns_config(priv->ap, &priv->info); + if (ret != RET_SUCCESS) { + _ERR("set wifi dns config failed."); + return ret; + } + + ret = vconf_mgr_save_wireless_config_info(&priv->info); + if (ret != RET_SUCCESS) { + _ERR("saved wireless ip info to vconf failed."); + return ret; + } + + break; + default: + break; + } + + return RET_SUCCESS; +} + +/** + * Sets the mode as 'dynamic'. + * + * Depends on the network type. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _config_network_dynamic(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("The param is NULL.\n"); + return RET_FAILED; + } + + _get_connection_profile_info(priv); + + switch (priv->network_type) { + case TYPE_WIRED: + ret = connection_mgr_ip_dynamic_config(priv->connection, + priv->profile); + if (ret != RET_SUCCESS) { + _ERR("connection_mgr_ip_dynamic_config() failed."); + return RET_FAILED; + } + + break; + case TYPE_WIRELESS: + ret = wifi_mgr_ap_set_ip_config_type(priv->ap, + WIFI_IP_CONFIG_TYPE_DYNAMIC); + if (ret != RET_SUCCESS) { + _ERR("connection_mgr_ip_dynamic_config() failed."); + return RET_FAILED; + } + + break; + default: + break; + } + + return RET_SUCCESS; +} + +/** + * Saves the mode to vconf. + * + * @param[in] priv The handler of the private data + */ +static void _save_mode(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("The param is NULL.\n"); + return; + } + + switch (priv->network_type) { + case TYPE_WIRED: + ret = vconf_mgr_set_wired_ip_mode(priv->ip_mode); + if (ret != RET_SUCCESS) + _ERR("vconf_mgr_set_wired_ip_mode() failed."); + + ret = vconf_mgr_set_wired_dns_mode(priv->dns_mode); + if (ret != RET_SUCCESS) + _ERR("vconf_mgr_set_wired_dns_mode() failed."); + + break; + case TYPE_WIRELESS: + ret = vconf_mgr_set_wireless_ip_mode(priv->ip_mode); + if (ret != RET_SUCCESS) + _ERR("vconf_mgr_set_wireless_ip_mode() failed."); + + ret = vconf_mgr_set_wireless_dns_mode(priv->dns_mode); + if (ret != RET_SUCCESS) + _ERR("vconf_mgr_set_wireless_dns_mode() failed."); + + break; + default: + break; + } +} + +/** + * Configs the network mode. + * + * @param[in] priv The handler of the private data + */ +static void _config_network(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("Parameter error!"); + return; + } + + switch (priv->ip_mode) { + case MODE_AUTO: + ret = _config_network_dynamic(priv); + if (ret != RET_SUCCESS) { + _ERR("config network automatically failed."); + goto error; + } + + break; + case MODE_MAN: + ret = _config_network_manually(priv); + if (ret == RET_IP_INVALID) { + _ERR("invalid IP."); + return; + } else if (ret != RET_SUCCESS) { + _ERR("config network manually failed."); + goto error; + } + + break; + default: + goto error; + } + + _save_mode(priv); + + viewmgr_pop(priv->vmgr); + + return; + +error: + _show_confirm_popup(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* When the 'Retry' button is clicked, retry to connect to the network. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] event Event information +*/ +static void _retry_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _del_confirm_popup(priv); + + elm_object_focus_set(priv->ok_btn, EINA_TRUE); + + _config_network(priv); +} + +/** + * Shows the confirm ctxpopup. + * + * Decides to connect the network again or cancel it. + * + * @param[in] priv The handler of the private data + */ +static void _show_confirm_popup(struct _priv *priv) +{ + Evas_Object *layout; + Evas_Object *retry_btn, *cancel_btn; + Evas_Coord w; + Evas_Coord h; + char content[CONTENT_TXT_SIZE]; + + if (!priv) { + _ERR("the param is NULL."); + return; + } + + _set_layout_dim(priv); + + layout = util_add_layout(priv->base, UG_NETWORK_EDJ_FILE, + GRP_CONFIRM_LAYOUT); + if (!layout) { + _ERR("add layout failed."); + _unset_layout_dim(priv); + return; + } + + priv->confirm_popup = layout; + + if (priv->network_type == TYPE_WIRED) + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRED_LY)); + else + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRELESS_LY)); + + memset(content, 0, CONTENT_TXT_SIZE); + snprintf(content, CONTENT_TXT_SIZE - 1, "%s %s", + _(TXT_FAILED_CONNECT), priv->name); + elm_object_part_text_set(layout, + PART_TEXT_CONTENT, content); + + retry_btn = util_add_button(layout, + STYLE_SETTING_BTN, PART_RETRY_BTN, _(TXT_RETRY)); + if (!retry_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + cancel_btn = util_add_button(layout, + STYLE_SETTING_BTN, PART_CANCEL_BTN, _(TXT_CANCEL)); + if (!cancel_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + elm_object_focus_next_object_set(retry_btn, cancel_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(cancel_btn, retry_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(retry_btn, retry_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(retry_btn, retry_btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(retry_btn, retry_btn, + ELM_FOCUS_DOWN); + + evas_object_smart_callback_add(retry_btn, SIG_CLICKED, + _retry_btn_clicked_cb, priv); + evas_object_smart_callback_add(cancel_btn, SIG_CLICKED, + _popup_ok_cancel_btn_clicked_cb, priv); + + elm_object_focus_set(retry_btn, EINA_TRUE); + + elm_object_focus_allow_set(layout, EINA_TRUE); + evas_object_smart_callback_add(layout, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _ctxpopup_pressed_cb, priv); + + w = 0; + h = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_move(layout, CENTER_ALIGN * (w - POPUP_WIDTH) * ELM_SCALE, + CENTER_ALIGN * (h - POPUP_HEIGHT) * ELM_SCALE); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* Configs the network. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _ok_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _config_network(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* Cancels to config the network, and pops the view. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _cancel_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + if (priv && priv->vmgr) + viewmgr_pop(priv->vmgr); +} + +/** + * Creates the action buttons. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_btns(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *ok_btn; + Evas_Object *cancel_btn; + + if (!priv) { + _ERR("The param is invalid.\n"); + return RET_FAILED; + } + + base = priv->base; + + ok_btn = util_add_button(base, STYLE_SETTING_BTN, NULL, _(TXT_OK)); + if (!ok_btn) { + _ERR("Add button failed.\n"); + return RET_FAILED; + } + + elm_object_part_content_set(base, PART_CONNECTION_OK_BTN, ok_btn); + priv->ok_btn = ok_btn; + evas_object_smart_callback_add(ok_btn, SIG_CLICKED, + _ok_btn_clicked_cb, priv); + + cancel_btn = util_add_button(base, STYLE_SETTING_BTN, + PART_CONNECTION_CANCEL_BTN, _(TXT_CANCEL)); + if (!cancel_btn) { + _ERR("Add button failed.\n"); + evas_object_del(ok_btn); + return RET_FAILED; + } + + evas_object_smart_callback_add(cancel_btn, SIG_CLICKED, + _cancel_btn_clicked_cb, priv); + + priv->cancel_btn = cancel_btn; + + return RET_SUCCESS; +} + +/** + * Creates the dim layout. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_dim_layout(struct _priv *priv) +{ + Evas_Object *dim_ly; + + if (!priv || !priv->win) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + dim_ly = util_add_layout(priv->win, UG_NETWORK_EDJ_FILE, + GRP_DIM_LY); + if (!dim_ly) { + _ERR("elm_layout_add() failed.\n"); + return RET_FAILED; + } + + priv->dim_ly = dim_ly; + _unset_layout_dim(priv); + + return RET_SUCCESS; +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, pops the view. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _base_key_pressed_cb(void *data, Evas *evas, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("The param is invalid.\n"); + return; + } + + ev = ei; + priv = data; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + viewmgr_pop(priv->vmgr); + return; + } +} + +/** + * Creates the layout of the view. + * + * Called when the view is pushed. + * + * @param[in] vmgr The handler of view manager + * @param[in] data The passed data from main view + * @return layout if the operation is successful; NULL if failed; + */ +static Evas_Object *_create(struct viewmgr *vmgr, void *data) +{ + struct _priv *priv; + Evas_Object *base; + struct connection_info *info; + int ret; + + if (!vmgr || !vmgr->win || !vmgr->ug || !data) { + _ERR("Parameter error!"); + return NULL; + } + + priv = _init_priv(); + if (!priv) { + _ERR("init priv failed."); + return NULL; + } + + priv->win = vmgr->win; + priv->ug = vmgr->ug; + priv->vmgr = vmgr; + + info = data; + priv->connection = info->connection; + priv->network_type = info->cur_type; + priv->ap = info->ap; + strncpy(priv->name, info->name, MAX_NAME_SIZE - 1); + + base = _create_basic_layout(priv->win); + if (!base) { + _ERR("Add main view failed.\n"); + _fini_priv(priv); + return NULL; + } + + evas_object_event_callback_add(base, EVAS_CALLBACK_KEY_DOWN, + _base_key_pressed_cb, priv); + + priv->base = base; + + evas_object_data_set(base, KEY_PRIV, priv); + + _set_description(priv); + + ret = _get_cur_mode(priv); + if (ret != RET_SUCCESS) + goto error; + + ret = _get_cur_ip_info(priv); + if (ret != RET_SUCCESS) + goto error; + + ret = _create_dns_setting(priv); + if (ret != RET_SUCCESS) + goto error; + + ret = _create_btns(priv); + if (ret != RET_SUCCESS) + goto error; + + ret = _create_ip_setting(priv); + if (ret != RET_SUCCESS) + goto error; + + ret = _create_dim_layout(priv); + if (ret != RET_SUCCESS) + goto error; + + return base; + +error: + evas_object_del(base); + _fini_priv(priv); + + return NULL; +} + +/** + * Destroies the layout of the view. + * + * Called when the view is popped. + * + * @param[in] base The base layout + */ +static void _destroy(Evas_Object *base) +{ + struct _priv *priv; + + if (!base) { + _ERR("Parameter error!"); + return; + } + + priv = evas_object_data_get(base, KEY_PRIV); + if (!priv) + return; + + _fini_priv(priv); +} + +/** + * Gets the current view type. + * + * @return view type; + */ +static enum view_type _get_view_type(void) +{ + return NETWORK_IP_SETTING_VIEW; +} + +static struct view_class _vclass = { + .create = _create, + .resume = NULL, + .pause = NULL, + .terminate = _destroy, + .message_handler = NULL, + .get_view_type = _get_view_type, +}; + +/** + * Gets the current view class. + * + * @return view class; + */ +struct view_class *ip_setting_view_vclass_get(void) +{ + return &_vclass; +} diff --git a/ug/network/src/main_view.c b/ug/network/src/main_view.c new file mode 100644 index 0000000..6d05b9e --- /dev/null +++ b/ug/network/src/main_view.c @@ -0,0 +1,2552 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "main_view.h" +#include "vconf_mgr.h" +#include "ip_setting_view.h" +#include "connection_mgr.h" +#include "i18n.h" +#include "wifi_mgr.h" +#include "common.h" +#include "wifi_passcode_view.h" +#include "util.h" + +#define BTN_ACT 4 +#define BTN_TYPE 2 +#define TIMER_INTERNAL 0.1 + +#define KEY_PRIV "priv" + +#define TYPE_POPUP_X_OFFSET 190 + +enum action_btn_enum { + CONNECT, + REFRESH, + OTHER, + CLOSE +}; + +static char *action_button[] = { + [CONNECT] = TXT_CONNECT_BTN, + [REFRESH] = TXT_REFRESH_BTN, + [OTHER] = TXT_OTHER_BTN, + [CLOSE] = TXT_CLOSE_BTN +}; + +static char *button_swallow[] = { + [CONNECT] = PART_CONNECT_BTN, + [REFRESH] = PART_REFRESH_BTN, + [OTHER] = PART_OTHER_BTN, + [CLOSE] = PART_CLOSE_BTN +}; + +static char *popup_button[] = { + [TYPE_WIRELESS] = TXT_WIRELESS, + [TYPE_WIRED] = TXT_WIRED +}; + +struct _priv { + ui_gadget_h ug; + struct viewmgr *vmgr; + + Evas_Object *win; + Evas_Object *base; + Evas_Object *type_btn; + Evas_Object *network_ctxpopup; + Evas_Object *dim_ly; + Evas_Object *connect_btn; + Evas_Object *refresh_btn; + Evas_Object *other_btn; + Evas_Object *close_btn; + Evas_Object *genlist; + Evas_Object *wired_con_box; + Evas_Object *wireless_discon_ly; + Evas_Object *wired_discon_ly; + Evas_Object *status_popup; + + Elm_Genlist_Item_Class *lock_ic; + Elm_Genlist_Item_Class *nolock_ic; + Elm_Object_Item *last_item; + + Eina_List *ap_list; + Ecore_Timer *timer; + + enum network_type_enum network_type; + enum view_type cur_view; + + int wifi_init; + Eina_Bool wifi_conn; + Eina_Bool wired_conn; + + connection_h connection; + connection_profile_h profile; + char profile_name[MAX_NAME_SIZE]; + + wifi_ap_h ap; + char *ap_name; + char *ap_pwd; +}; + +static void _show_confirm_popup(struct _priv *priv); +static void _show_progress_popup(struct _priv *priv); + +/** +* Initialize the priv +* +* Called when initialize the network +* +* @return the _priv object initialized +*/ +static struct _priv *_init_priv() +{ + struct _priv *priv; + + priv = calloc(1, sizeof(*priv)); + if (!priv) { + _ERR("calloc priv failed."); + return NULL; + } + + return priv; +} + +/** +* Finalize the priv +* +* Called when app is destroyed +* +* @param[in] priv the _priv object +*/ +static void _fini_priv(struct _priv *priv) +{ + void *data; + + if (!priv) + return; + + if (priv->lock_ic) + elm_genlist_item_class_free(priv->lock_ic); + + if (priv->nolock_ic) + elm_genlist_item_class_free(priv->nolock_ic); + + if (priv->ap_list) + EINA_LIST_FREE(priv->ap_list, data) + free(data); + + if (priv->dim_ly) + evas_object_del(priv->dim_ly); + + if (priv->timer) + ecore_timer_del(priv->timer); + + connection_mgr_destroy(priv->connection); + + if (priv->ap) + wifi_mgr_ap_destroy(priv->ap); + + free(priv->ap_name); + free(priv->ap_pwd); + + wifi_mgr_deinit(); + + free(priv); +} + +/** +* Eable the "Connect" button +* +* @param[in] priv _priv object bypassed +*/ +static void _enable_connect_btn(struct _priv *priv) +{ + if (!priv || !priv->connect_btn) { + _ERR("The param is invalid."); + return; + } + + elm_object_disabled_set(priv->connect_btn, EINA_FALSE); +} + +/** +* Disable the "Connect" button +* +* @param[in] priv _priv object bypassed +*/ +static void _disable_connect_btn(struct _priv *priv) +{ + if (!priv || !priv->connect_btn) { + _ERR("The param is invalid."); + return; + } + + elm_object_disabled_set(priv->connect_btn, EINA_TRUE); +} + +/** +* Enable the "Other" button +* +* @param[in] priv _priv object bypassed +*/ +static void _enable_other_btn(struct _priv *priv) +{ + if (!priv || !priv->other_btn) { + _ERR("The param is invalid."); + return; + } + + elm_object_disabled_set(priv->other_btn, EINA_FALSE); +} + +/** +* Disable the "Other" button +* +* @param[in] priv _priv object bypassed +*/ +static void _disable_other_btn(struct _priv *priv) +{ + if (!priv || !priv->other_btn) { + _ERR("The param is invalid."); + return; + } + + elm_object_disabled_set(priv->other_btn, EINA_TRUE); +} + +/** +* Enable the dim effect +* +* Called when popup is displayed +* +* @param[in] priv _priv object bypassed +*/ +static void _set_layout_dim(struct _priv *priv) +{ + if (!priv || !priv->dim_ly) { + _ERR("The param is invalid.\n"); + return; + } + + evas_object_show(priv->dim_ly); +} + +/** +* Disable the dim effect +* +* This function is the opposite action of the set_layout_dim +* +* @param[in] priv _priv object bypassed +*/ +static void _unset_layout_dim(struct _priv *priv) +{ + if (!priv || !priv->dim_ly) { + _ERR("The param is invalid.\n"); + return; + } + + evas_object_hide(priv->dim_ly); +} + +/** +* Evas_object_Event_Cb type callback for handling delection event +* +* @param[in] data the user data +* @param[in] e evas handler +* @param[in] obj the corresponding object which clicked event occurred +* @param[in] ei event information +*/ +static void _ctxpopup_pressed_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!data || !ei || !obj) { + _ERR("Parameter error!"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + _unset_layout_dim(priv); + evas_object_del(obj); + } +} + +/** +* Delete the connection progress popup when connection successed or failed +* +* @param[in] priv _priv object bypassed +*/ +static void _del_status_popup(struct _priv *priv) +{ + if (!priv) { + _ERR("priv is NULL."); + return; + } + + _unset_layout_dim(priv); + + if (priv->status_popup) + evas_object_del(priv->status_popup); + + priv->status_popup = NULL; +} + +/** +* Evas_Object_Event_Cb type callback for handling back event +* +* This function delete the ug when EVAS_CALLBACK_KEY_DOWN happens +* +* @param[in] data the user data +* @param[in] e evas handler +* @param[in] obj the corresponding object which clicked event occurred +* @param[in] ei event information +*/ +static void _main_ly_key_pressed_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!data || !ei) { + _ERR("Parameter error!"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!priv->ug) + return; + + if (!strcmp(ev->keyname, KEY_BACK)) + ug_destroy_me(priv->ug); +} + +/** +* Create the base layout +* +* Called by _create when network is invoked +* +* @param[in] priv _priv object bypassed +*/ +static Evas_Object *_create_main_layout(struct _priv *priv) +{ + Evas_Object *base; + + if (!priv) { + _ERR("Parameter error!"); + return NULL; + } + + base = util_add_layout(priv->win, UG_NETWORK_EDJ_FILE, GRP_MAIN); + if (!base) { + _ERR("Add pannel view failed.\n"); + return NULL; + } + + evas_object_event_callback_add(base, EVAS_CALLBACK_KEY_DOWN, + _main_ly_key_pressed_cb, priv); + + evas_object_show(base); + + return base; +} + +/** +* Refresh the object of the defined part +* +* @param[in] priv _priv object bypassed +* @param[in] obj the Evas_Object to be setted to the part +*/ +static void _fill_content_part(struct _priv *priv, Evas_Object *obj) +{ + Evas_Object *old_obj; + + if (!priv || !obj || !priv->base) { + _ERR("The param is invalid.\n"); + return; + } + + old_obj = elm_object_part_content_get(priv->base, PART_NETLIST_PANNEL); + if (old_obj == obj) { + _ERR("PART_NETLIST_PANNEL already filled with this object."); + return; + } + + if (old_obj) { + elm_object_part_content_unset(priv->base, PART_NETLIST_PANNEL); + evas_object_hide(old_obj); + } + + elm_object_part_content_set(priv->base, PART_NETLIST_PANNEL, obj); + + evas_object_show(obj); +} + +/** +* Refresh the buttons of the correct position +* +* Called when the view type is changed +* +* @param[in] priv _priv object bypassed +*/ +static void _set_action_btn_pos(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *btn; + + if (!priv || !priv->base) { + _ERR("Parameter error!"); + return; + } + + base = priv->base; + + btn = elm_object_part_content_get(base, button_swallow[CONNECT]); + if (!btn) { + elm_object_part_content_set(base, button_swallow[CONNECT], + priv->connect_btn); + evas_object_show(priv->connect_btn); + } + + btn = elm_object_part_content_get(base, button_swallow[REFRESH]); + if (btn) { + elm_object_part_content_unset(base, button_swallow[REFRESH]); + evas_object_hide(btn); + } + + btn = elm_object_part_content_get(base, button_swallow[OTHER]); + if (btn) { + elm_object_part_content_unset(base, button_swallow[OTHER]); + evas_object_hide(btn); + } + + btn = elm_object_part_content_get(base, button_swallow[CLOSE]); + if (btn) { + elm_object_part_content_unset(base, button_swallow[CLOSE]); + evas_object_hide(btn); + } + + if (priv->network_type == TYPE_WIRELESS) { + if (!priv->wifi_conn) { + elm_object_part_content_set(base, + button_swallow[REFRESH], + priv->other_btn); + evas_object_show(priv->other_btn); + + elm_object_part_content_set(base, button_swallow[OTHER], + priv->close_btn); + evas_object_show(priv->close_btn); + } else { + elm_object_part_content_set(base, + button_swallow[REFRESH], + priv->refresh_btn); + evas_object_show(priv->refresh_btn); + + elm_object_part_content_set(base, button_swallow[OTHER], + priv->other_btn); + evas_object_show(priv->other_btn); + + elm_object_part_content_set(base, button_swallow[CLOSE], + priv->close_btn); + evas_object_show(priv->close_btn); + } + + if (priv->ap) { + elm_object_disabled_set(priv->other_btn, EINA_FALSE); + elm_object_disabled_set(priv->connect_btn, EINA_FALSE); + } else { + elm_object_disabled_set(priv->connect_btn, EINA_TRUE); + elm_object_disabled_set(priv->other_btn, EINA_TRUE); + } + } else if (priv->network_type == TYPE_WIRED) { + if (!priv->wired_conn) { + elm_object_disabled_set(priv->connect_btn, EINA_TRUE); + elm_object_disabled_set(priv->other_btn, EINA_TRUE); + } else { + elm_object_disabled_set(priv->connect_btn, EINA_FALSE); + elm_object_disabled_set(priv->other_btn, EINA_FALSE); + } + + elm_object_part_content_set(base, button_swallow[REFRESH], + priv->other_btn); + evas_object_show(priv->other_btn); + + elm_object_part_content_set(base, button_swallow[OTHER], + priv->close_btn); + evas_object_show(priv->close_btn); + } +} + +/** +* Get the connection profile infomation +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static int _get_connection_profile_info(struct _priv *priv) +{ + struct connection_info info; + int ret; + + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = connection_mgr_get_profile_info(priv->connection, &info); + if (ret != RET_SUCCESS) { + _ERR("connection_mgr_get_profile_info() failed."); + return RET_FAILED; + } + + priv->profile = info.profile; + strncpy(priv->profile_name, info.name, MAX_NAME_SIZE - 1); + + return RET_SUCCESS; +} + +/** +* Callback function to set content to list panel +* +* Depending on different ethernet, set corresponding connection state +* view to the list panel +* +* @param[in] priv _priv object bypassed +*/ +#if 0 +static void _connection_ethernet_state_callback( + connection_ethernet_cable_state_e state, void *data) +{ + struct _priv *priv; + + if (!data) { + _ERR("data is NULL."); + return; + } + + priv = data; + + if (priv->network_type != TYPE_WIRED) { + _ERR("cur network type is wireless, return."); + return; + } + + if (state == CONNECTION_ETHERNET_CABLE_ATTACHED) { + _fill_content_part(priv, priv->wired_con_box); + } else if (state == CONNECTION_ETHERNET_CABLE_DETACHED) { + _fill_content_part(priv, priv->wired_discon_ly); + + priv->wired_conn = EINA_FALSE; + } + + _set_action_btn_pos(priv); +} +#endif + +/** +* Initialize the connection information +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static int _init_connection(struct _priv *priv) +{ + int ret = RET_FAILED; + + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + priv->connection = connection_mgr_create(); + if (!priv->connection) { + _ERR("connection_mgr_create() failed."); + return RET_FAILED; + } + +#if 0 + ret = connection_mgr_register_ethernet_state_cb + (priv->connection, + _connection_ethernet_state_callback, + priv); +#endif + if (ret != RET_SUCCESS) { + _ERR("register_ethernet_state_cb() failed."); + return RET_FAILED; + } + + ret = _get_connection_profile_info(priv); + if (ret != RET_SUCCESS) { + _ERR("_get_connection_profile_info() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Create the layout when no network cable plugin +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static int _create_wired_disconnect_part(struct _priv *priv) +{ + Evas_Object *disconnect_ly; + + if (!priv || !priv->base) { + _ERR("the param is NULL.\n"); + return RET_FAILED; + } + + disconnect_ly = util_add_layout(priv->base, + UG_NETWORK_EDJ_FILE, GRP_WIRED_DISCONNECTED_LY); + if (!disconnect_ly) { + _ERR("call elm_layout_add() failed.\n"); + return RET_FAILED; + } + + elm_object_part_text_set(disconnect_ly, PART_DISCONNECT_TEXT, + _(TXT_PLUG_CABLE)); + + evas_object_hide(disconnect_ly); + + priv->wired_discon_ly = disconnect_ly; + + return RET_SUCCESS; +} + +/** +* Callback function when profile button is clicked +* +* This function disable/enable the relating buttons according to the connection state +* +* @param[in] data the user data +* @param[in] obj the corresponding object which clicked event occurred +* @param[in] event_inf event information +*/ +static void _profie_btn_clicked_cb(void *data, + Evas_Object *obj, void *event_inf) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + if (priv->wired_conn) { + elm_object_signal_emit(obj, SIG_STATE_UNSELECTED, ELM); + priv->wired_conn = EINA_FALSE; + _disable_connect_btn(priv); + _disable_other_btn(priv); + } else { + elm_object_signal_emit(obj, SIG_STATE_SELECTED, ELM); + priv->wired_conn = EINA_TRUE; + _enable_connect_btn(priv); + _enable_other_btn(priv); + } +} + +/** +* Create the layout when wired connect successful +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static int _create_wired_connect_part(struct _priv *priv) +{ + Evas_Object *box; + Evas_Object *btn; + + if (!priv || !priv->base) { + _ERR("the param is NULL.\n"); + return RET_FAILED; + } + + box = util_add_box(priv->base, NULL); + if (!box) { + _ERR("add wired connect box failed."); + return RET_FAILED; + } + + elm_box_horizontal_set(box, EINA_FALSE); + + btn = util_add_button(box, STYLE_WIRED_LIST_BTN, NULL, + _(priv->profile_name)); + if (!btn) { + _ERR("elm_button_add failed.\n"); + evas_object_del(box); + return RET_FAILED; + } + + evas_object_size_hint_align_set(btn, 0, 0); + evas_object_smart_callback_add(btn, SIG_CLICKED, + _profie_btn_clicked_cb, priv); + if (priv->wired_conn) + elm_object_signal_emit(btn, SIG_STATE_SELECTED, ELM); + elm_box_pack_end(box, btn); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + evas_object_hide(box); + + priv->wired_con_box = box; + + return RET_SUCCESS; +} + +/** +* Display the wired view when select the wired network type +* +* This fuction is called when the wired of the network type popup is clicked +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static int _display_wired_setting(struct _priv *priv) +{ + Eina_Bool plugin; + int ret; + + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + _create_wired_connect_part(priv); + + _create_wired_disconnect_part(priv); + + ret = connection_mgr_get_ethernet_state(priv->connection, + &plugin); + if (ret != RET_SUCCESS) { + _ERR("connection_mgr_get_ethernet_state() failed."); + plugin = EINA_FALSE; + } + + if (plugin) { + _fill_content_part(priv, priv->wired_con_box); + } else { + priv->wired_conn = EINA_FALSE; + _fill_content_part(priv, priv->wired_discon_ly); + } + + _set_action_btn_pos(priv); + + return RET_SUCCESS; +} + +/** +* Create the layout when wireless connect successful +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static void _create_wireless_disconnect_part(struct _priv *priv) +{ + Evas_Object *disconnect_ly; + + if (!priv) { + _ERR("the param is invalid."); + return; + } + + if (priv->wireless_discon_ly) + return; + + disconnect_ly = util_add_layout(priv->base, + UG_NETWORK_EDJ_FILE, GRP_WIRELESS_DISCONNECT_LY); + if (!disconnect_ly) { + _ERR("call elm_layout_add() failed.\n"); + return; + } + + elm_object_part_text_set(disconnect_ly, PART_DISCONNECT_TEXT, + TXT_NO_NETWORK); + + evas_object_hide(disconnect_ly); + + priv->wireless_discon_ly = disconnect_ly; +} + +/** +* Callback funcion called to get the text name of the added item +* +* This function return the strdup'()ed string of the added genlist item +* +* @param[in] data the user data +* @param[in] obj the genlist object +* @param[in] part the part text +* @return strdup'()ed string on success ,NULL otherwise +*/ +static char *_item_ap_name_get(void *data, Evas_Object *obj, const char *part) +{ + struct wifi_ap_info *ap_info; + + if (!data || !obj || !part) { + _ERR("Parameter error!"); + return NULL; + } + + ap_info = data; + + if (!strcmp(part, PART_ELM_TEXT)) + return strdup(ap_info->essid); + + return NULL; +} + +/** +* Create a new genlist item class in a given genlist widget +* +* @param[in] style the genlist style set to the item +* @return new allocated genlist item class +*/ +static Elm_Genlist_Item_Class *_create_item_class(char *style) +{ + Elm_Genlist_Item_Class *ic; + + if (!style) { + _ERR("the param is invalid."); + return NULL; + } + + ic = elm_genlist_item_class_new(); + if (!ic) { + _ERR("elm_genlist_item_class_new() failed."); + return NULL; + } + + ic->item_style = style; + ic->func.text_get = _item_ap_name_get; + ic->func.content_get = NULL; + ic->func.state_get = NULL; + ic->func.del = NULL; + + return ic; +} + +/** +* Create the genlist item class for both locked and unlocked +* +* @param[in] priv the data _priv structure bypassed +*/ +static void _create_genlist_item_class(struct _priv *priv) +{ + Elm_Genlist_Item_Class *ic; + + if (!priv) { + _ERR("the param is invalid."); + return; + } + + ic = _create_item_class(STYLE_ITEM_LOCK); + if (!ic) { + _ERR("get item class failed."); + return; + } + + priv->lock_ic = ic; + + ic = _create_item_class(STYLE_ITEM_NOLOCK); + if (!ic) { + _ERR("get item class failed."); + return; + } + + priv->nolock_ic = ic; +} + +/** +* Create the genlist view +* +* This function create the genlist item class and genlist widget +* +* @param[in] priv _priv object bypassed +* @return the genlist object in success,NULL otherwise +*/ +static Evas_Object *_create_genlist_view(struct _priv *priv) +{ + Evas_Object *genlist; + + if (!priv) { + _ERR("Parameter error!"); + return NULL; + } + + _create_genlist_item_class(priv); + + genlist = util_add_genlist(priv->base); + if (!genlist) { + _ERR("util_add_genlist() failed.\n"); + return NULL; + } + + priv->genlist = genlist; + + elm_object_focus_next_object_set(genlist, genlist, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(genlist, priv->close_btn, + ELM_FOCUS_RIGHT); + + return genlist; +} + +/** +* Callback function called when a certain genlist item is clicked +* +* @param[in] data the user data +* @param[in] obj the corresponding item which clicked event occurred +* @param[in] event_inf event information +*/ +static void _item_select_cb(void *data, Evas_Object *obj, void *ei) +{ + struct _priv *priv; + Elm_Object_Item *gen_item; + struct wifi_ap_info *ap_info; + int index; + + if (!data || !ei) { + _ERR("Parameter error!"); + return; + } + + priv = data; + gen_item = ei; + + if (priv->last_item == gen_item) { + elm_object_item_signal_emit(gen_item, SIG_STATE_UNSELECTED, ELM); + + _disable_connect_btn(priv); + _disable_other_btn(priv); + + priv->last_item = NULL; + + return; + } + + elm_object_item_signal_emit(gen_item, SIG_STATE_SELECTED, ELM); + if (priv->last_item) + elm_object_item_signal_emit(priv->last_item, + SIG_STATE_UNSELECTED, ELM); + priv->last_item = gen_item; + + _enable_connect_btn(priv); + _enable_other_btn(priv); + + index = elm_genlist_item_index_get(priv->last_item); + if (index < 0) { + _ERR("the index of item is invalid."); + return; + } + + ap_info = eina_list_nth(priv->ap_list, index); + if (!ap_info) { + _ERR("ap info is NULL."); + return; + } + + if (priv->ap_name) { + free(priv->ap_name); + priv->ap_name = NULL; + } + + priv->ap_name = strdup(ap_info->essid); + if (!priv->ap_name) { + _ERR("ap name gets failed."); + return; + } + + if (priv->ap) { + wifi_mgr_ap_destroy(priv->ap); + priv->ap = NULL; + } + + wifi_mgr_ap_clone(&priv->ap, ap_info->ap); + if (!priv->ap) { + _ERR("ap clone failed."); + return; + } + + if (ap_info->secure_type == WIFI_SECURITY_TYPE_NONE) { + if (priv->ap_pwd) { + free(priv->ap_pwd); + priv->ap_pwd = NULL; + } + } +} + +/** +* Effect the connected state when timer is empired +* +* @param[in]data the user data +* @return ECORE_CALLBACK_CANCEL returns to finish time +*/ +static Eina_Bool _select_connected_cb(void *data) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return ECORE_CALLBACK_CANCEL; + } + + priv = data; + + elm_object_item_signal_emit(priv->last_item, SIG_STATE_SELECTED, ELM); + _enable_connect_btn(priv); + _enable_other_btn(priv); + + priv->timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +/** +*This is a callback function called when you get the found access point repeatedly +* +* The ap valid only here. if use outside the function, must wifi_mgr_ap_clone() to clone it +* +* @param[in] ap the access point +* @param[in] data the user data +* @return 0 to continue with the next iterator of the loop,-1 to break +*/ +static bool _wifi_found_ap_cb(wifi_ap_h ap, void *data) +{ + int ret; + bool state; + struct _priv *priv; + struct wifi_ap_info *ap_info; + Elm_Object_Item *item; + + if (!ap || !data) { + _ERR("Parameter error!"); + return EINA_FALSE; + } + + priv = data; + + ret = wifi_mgr_is_activated(&state); + if (ret != WIFI_ERROR_NONE || state == 0) { + _ERR("failt to wifi_is_activated"); + return EINA_FALSE; + } + + ap_info = calloc(1, sizeof(*ap_info)); + if (!ap_info) { + _ERR("calloc failed"); + return EINA_FALSE; + } + + wifi_mgr_get_ap_info(ap, ap_info); + + ap_info->ap = ap; + ap_info->user_data = priv; + priv->ap_list = eina_list_append(priv->ap_list, ap_info); + + _fill_content_part(priv, priv->genlist); + + if (ap_info->secure_type == WIFI_SECURITY_TYPE_NONE) + item = elm_genlist_item_append(priv->genlist, priv->nolock_ic, + ap_info, NULL, ELM_GENLIST_ITEM_NONE, + _item_select_cb, priv); + else + item = elm_genlist_item_append(priv->genlist, priv->lock_ic, + ap_info, NULL, ELM_GENLIST_ITEM_NONE, + _item_select_cb, priv); + if (!item) { + _ERR("genlist append item failed."); + return EINA_FALSE; + } + + if (ap_info->state == WIFI_CONNECTION_STATE_CONNECTED) { + priv->last_item = item; + if (priv->ap) { + wifi_mgr_ap_destroy(priv->ap); + priv->ap = NULL; + } + + wifi_mgr_ap_clone(&priv->ap, ap); + + priv->timer = ecore_timer_add(TIMER_INTERNAL, + _select_connected_cb, priv); + if (!priv->timer) { + _ERR("add timer failed."); + return EINA_FALSE; + } + } + + return EINA_TRUE; +} + +/** +* Scan the wifi access point +* +* @param[in] error_code the wifi error type +* @param[in] data the user data +*/ +static void _wifi_scan_request_cb(wifi_error_e error_code, void *data) +{ + int ret; + + if (!data) { + _ERR("data is NULL."); + return; + } + + ret = wifi_mgr_foreach_found_aps(_wifi_found_ap_cb, data); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_foreach_found_aps() failed."); + return; + } +} + +/** +* Callback function briefly called after wifi activated successfully +* +* @param[in] error_code the wifi activation error type +* @param[in] data the user data +*/ +static void _wifi_activated_cb(wifi_error_e result, void *data) +{ + struct _priv *priv; + int ret; + + if (result != WIFI_ERROR_NONE) { + _ERR("Wi-Fi Activation Failed! error ==%s.\n", + wifi_mgr_error_dbg(result)); + return; + } + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + ret = wifi_mgr_scan_request(_wifi_scan_request_cb, data); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_scan_request() failed."); + _fill_content_part(priv, priv->wireless_discon_ly); + _set_action_btn_pos(priv); + return; + } + + priv->wifi_conn = EINA_TRUE; + + _set_action_btn_pos(priv); + + _fill_content_part(priv, priv->genlist); +} + +/** +* Clear the genlist item list. +* +* Called when need clear the ap list,eg.refrsh button is clicked +* +* @param[in] priv _priv object bypassed +*/ +static void _clear_genlist_item_list(struct _priv *priv) +{ + void *temp; + + if (!priv || !priv->genlist) { + _ERR("Parameter error!"); + return; + } + + elm_genlist_clear(priv->genlist); + + if (priv->ap_list) + EINA_LIST_FREE(priv->ap_list, temp) + free(temp); +} + +/** +* Display the wireless view when select the wireless network type +* +* Called when the wireless of the network type popup is clicked +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static int _display_wireless_setting(struct _priv *priv) +{ + Evas_Object *obj; + bool activated; + int ret; + + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + _create_wireless_disconnect_part(priv); + + if (!priv->wifi_init) { + obj = _create_genlist_view(priv); + if (!obj) { + _ERR("fail to create genlist"); + return RET_FAILED; + } + + ret = wifi_mgr_init(); + if (ret != RET_SUCCESS) { + _ERR("fail to init wifi network"); + return RET_FAILED; + } + + priv->wifi_init = 1; + } + + _clear_genlist_item_list(priv); + + activated = EINA_FALSE; + ret = wifi_mgr_is_activated(&activated); + if (ret != RET_SUCCESS) { + _ERR("the wifi is not activated."); + return RET_FAILED; + } + + if (activated) { + if (priv->ap) { + wifi_mgr_ap_destroy(priv->ap); + priv->ap = NULL; + } + + ret = wifi_mgr_scan_request(_wifi_scan_request_cb, + (void *)priv); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_scan_request() failed."); + goto _wireless_finish; + } + + priv->wifi_conn = EINA_TRUE; + } else { + priv->wifi_conn = EINA_FALSE; + + ret = wifi_mgr_activate(_wifi_activated_cb, (void *)priv); + if (ret != RET_SUCCESS) + _ERR("wifi_mgr_activate() failed."); + } + +_wireless_finish: + _fill_content_part(priv, priv->wireless_discon_ly); + _set_action_btn_pos(priv); + + return RET_SUCCESS; +} + +/** +* Refresh the text content below the network type button +* +* Called to set the network type name according to the network type currently +* +* @param[in] priv _priv object bypassed +*/ +static void _refresh_network_type_text(struct _priv *priv) +{ + if (!priv) { + _ERR("the param is invalid."); + return; + } + + switch (priv->network_type) { + case TYPE_WIRELESS: + elm_object_part_text_set(priv->base, + PART_CUR_TYPE_TEXT, + _(TXT_WIRELESS_NETWORK)); + elm_object_part_text_set(priv->type_btn, + PART_NETWORK_TYPE_SELECTED, + _(TXT_WIRELESS)); + break; + case TYPE_WIRED: + elm_object_part_text_set(priv->base, + PART_CUR_TYPE_TEXT, _(TXT_WIRED_NETWORK)); + elm_object_part_text_set(priv->type_btn, + PART_NETWORK_TYPE_SELECTED, _(TXT_WIRED)); + break; + default: + break; + } +} + +/** +* Callback function when popup type button is clicked +* +* This fuction set the current network type according to the clicked button text +* +* @param[in] priv _priv object bypassed +*/ +static void _type_select_btn_cb(void *data, + Evas_Object *obj, void *event_inf) +{ + struct _priv *priv; + const char *value; + + if (!data || !obj) { + _ERR("the param is invalid."); + return; + } + + priv = data; + + value = elm_object_text_get(obj); + if (!value) { + _ERR("get text from network type btn is NULL."); + return; + } + + if ((!strcmp(value, _(popup_button[TYPE_WIRELESS]))) + && priv->network_type == TYPE_WIRED) { + priv->network_type = TYPE_WIRELESS; + + _display_wireless_setting(priv); + vconf_mgr_set_network_type(TYPE_WIRELESS); + } else if ((!strcmp(value, _(popup_button[TYPE_WIRED]))) + && priv->network_type == TYPE_WIRELESS) { + priv->network_type = TYPE_WIRED; + + _display_wired_setting(priv); + vconf_mgr_set_network_type(TYPE_WIRED); + } + + _refresh_network_type_text(priv); + + if (priv->network_ctxpopup) { + evas_object_del(priv->network_ctxpopup); + priv->network_ctxpopup = NULL; + } + + _unset_layout_dim(priv); +} + +/** +* Evas_Object_Event_Cb type callback for handling back event +* +* @param[in] data the user data +* @param[in] e evas handler +* @param[in] o the corresponding object which clicked event occurred +* @param[in] ei event information +*/ +static void _type_key_pressed_cb(void *data, + Evas *evas, Evas_Object *o, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + _unset_layout_dim(priv); + + if (priv->network_ctxpopup) { + evas_object_del(priv->network_ctxpopup); + priv->network_ctxpopup = NULL; + } + + return; + } +} + +/** +* Evas_Smart_Cb type callback for handling clicked event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which clicked event occurred +* @param[in] event_inf event information +*/ +static void _network_type_btn_clicked_cb(void *data, + Evas_Object *obj, void *event_inf) +{ + struct _priv *priv; + Evas_Object *base; + Evas_Object *layout, *box; + Evas_Object *btn[BTN_TYPE]; + Evas_Coord x; + Evas_Coord y; + Evas_Coord w; + Evas_Coord h; + int i; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + base = priv->base; + + _set_layout_dim(priv); + + layout = util_add_layout(base, UG_NETWORK_EDJ_FILE, + GRP_NETWORK_TYPE_SELECT); + if (!layout) { + _ERR("util_add_layout() failed.\n"); + return; + } + + box = util_add_box(layout, PART_SWALLOW_CONTENT); + if (!box) { + evas_object_del(layout); + return; + } + + evas_object_size_hint_weight_set(box, + EVAS_HINT_EXPAND, 0); + + for (i = 0; i < BTN_TYPE; i++) { + btn[i] = util_add_button(box, STYLE_POPUP_BTN, NULL, + _(popup_button[i])); + if (!btn[i]) { + evas_object_del(layout); + return; + } + + elm_box_pack_end(box, btn[i]); + + evas_object_smart_callback_add(btn[i], SIG_CLICKED, + _type_select_btn_cb, priv); + } + + if (priv->network_type == TYPE_WIRELESS) + elm_object_signal_emit(btn[TYPE_WIRELESS], + SIG_BTN_SELECTED, PROG); + else + elm_object_signal_emit(btn[TYPE_WIRED], + SIG_BTN_SELECTED, PROG); + + elm_object_part_content_set(layout, PART_SWALLOW_CONTENT, box); + + elm_object_focus_next_object_set(btn[1], btn[0], ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(btn[0], btn[1], ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn[1], btn[0], ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn[0], btn[1], ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(btn[0], btn[0], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(btn[0], btn[0], ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(btn[1], btn[1], ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(btn[1], btn[1], ELM_FOCUS_RIGHT); + + x = 0; + y = 0; + w = 0; + h = 0; + evas_object_geometry_get(priv->type_btn, &x, &y, &w, &h); + evas_object_move(layout, (x + w - TYPE_POPUP_X_OFFSET) * ELM_SCALE, + (y + h) * ELM_SCALE); + + priv->network_ctxpopup = layout; + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _type_key_pressed_cb, priv); + + elm_object_focus_set(btn[0], EINA_TRUE); + evas_object_show(layout); +} + +/** +* Create the upper part for the base view +* +* @param[in] priv _priv object bypassed +* @return 0 on success,-1 otherwise +*/ +static int _create_upper_layout(struct _priv *priv) +{ + Evas_Object *type_btn; + Evas_Object *base; + + if (!priv || !priv->base) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + base = priv->base; + + elm_object_part_text_set(base, PART_SELECT_TEXT, _(TXT_NETWORK_DISC)); + + type_btn = util_add_button(base, STYLE_TYPE_BTN, PART_NETWORK_TYPE, + _(TXT_TYPE_BTN)); + if (!type_btn) + return RET_FAILED; + + evas_object_smart_callback_add(type_btn, SIG_CLICKED, + _network_type_btn_clicked_cb, priv); + + elm_object_focus_next_object_set(type_btn, type_btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(type_btn, type_btn, ELM_FOCUS_LEFT); + + priv->type_btn = type_btn; + + elm_object_focus_set(type_btn, EINA_TRUE); + + _refresh_network_type_text(priv); + + return RET_SUCCESS; +} + +/** +* Callback function briefly called after wifi connected successfully +* +* @param[in] error_code the wifi activation error type +* @param[in] user_data the user data +*/ +static void _wifi_connected_cb(wifi_error_e error_code, void *user_data) +{ + struct _priv *priv; + + if (!user_data) { + _ERR("Parameter error!"); + return; + } + + priv = user_data; + + if (!priv->status_popup) + return; + + if (error_code != WIFI_ERROR_NONE) { + _ERR("connect AP failed."); + _show_confirm_popup(priv); + return; + } + + ug_destroy_me(priv->ug); +} + +/** +* Connect to the selected wifi access point +* +* @param[in] priv _priv object bypassed +* @param[in] index the index of the access point +* @return 0 on success, otherwise -1 +*/ +static int _wifi_connect_ap(struct _priv *priv, int index) +{ + struct wifi_ap_info *ap_info; + int ret; + + if (!priv || index < 0) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + _show_progress_popup(priv); + + ap_info = eina_list_nth(priv->ap_list, index); + if (!ap_info) { + _ERR("ap info is NULL."); + return RET_FAILED; + } + + if (priv->ap_name) { + free(priv->ap_name); + priv->ap_name = NULL; + } + + priv->ap_name = strdup(ap_info->essid); + if (!priv->ap_name) { + _ERR("ap name gets failed."); + return RET_FAILED; + } + + if (ap_info->secure_type == WIFI_SECURITY_TYPE_NONE) { + if (priv->ap_pwd) { + free(priv->ap_pwd); + priv->ap_pwd = NULL; + } + } else { + priv->cur_view = NETWORK_WIFI_PASSCODE_VIEW; + viewmgr_push(priv->vmgr, + wifi_passcode_view_vclass_get(), + ap_info); + + return RET_SUCCESS; + } + + ret = wifi_mgr_forget_last_ap(); + if (ret != RET_SUCCESS) { + _ERR("forget last ap failed."); + return RET_FAILED; + } + + if (priv->ap_pwd) { + ret = wifi_mgr_set_passphrase(priv->ap, + priv->ap_pwd); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_set_passphrase() failed."); + return RET_FAILED; + } + } + + ret = wifi_mgr_connect(priv->ap, _wifi_connected_cb, priv); + if (ret != RET_SUCCESS) { + _ERR("Fail to connection request.\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Convert connection error type code to the corresponding string +* +* @param[in] err_code the connection error type +* @return the error description string +*/ +#if 0 +static const char *_convert_error_to_string(connection_error_e err_type) +{ + switch (err_type) { + case CONNECTION_ERROR_NONE: + return "NONE"; + case CONNECTION_ERROR_INVALID_PARAMETER: + return "INVALID_PARAMETER"; + case CONNECTION_ERROR_OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case CONNECTION_ERROR_INVALID_OPERATION: + return "INVALID_OPERATION"; + case CONNECTION_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED: + return "ADDRESS_FAMILY_NOT_SUPPORTED"; + case CONNECTION_ERROR_OPERATION_FAILED: + return "OPERATION_FAILED"; + case CONNECTION_ERROR_ITERATOR_END: + return "ITERATOR_END"; + case CONNECTION_ERROR_NO_CONNECTION: + return "NO_CONNECTION"; + case CONNECTION_ERROR_NOW_IN_PROGRESS: + return "NOW_IN_PROGRESS"; + case CONNECTION_ERROR_ALREADY_EXISTS: + return "ALREADY_EXISTS"; + case CONNECTION_ERROR_OPERATION_ABORTED: + return "OPERATION_ABORTED"; + case CONNECTION_ERROR_DHCP_FAILED: + return "DHCP_FAILED"; + case CONNECTION_ERROR_INVALID_KEY: + return "INVALID_KEY"; + case CONNECTION_ERROR_NO_REPLY: + return "NO_REPLY"; + case CONNECTION_ERROR_NO_KEYWORD: + return "NO_KEYWORD"; + case CONNECTION_ERROR_TCP_RST: + return "RST_IN_TCP_RESPONSE"; + case CONNECTION_ERROR_TCP_SYN_TIMEOUT: + return "TCP_SYN_TIMEOUT"; + case CONNECTION_ERROR_OFFLINE: + return "CONNECTION_OFFLINE"; + case CONNECTION_ERROR_NETWORK_MONITOR_FAILURE: + return "monitor failer"; + case CONNECTION_ERROR_INVALID_GATEWAY: + return "invalid gateway"; + case CONNECTION_ERROR_INVALID_MACADDRESS: + return "invalid mac addr"; + default: + break; + } + + return "Unknown"; +} +#endif + +/** +* Callback function called by _connection_check_gateway_async_cb() +* +* Called after checking whether the profile can access to the internet asynchronously +* +* @param[in] result the connection error type +* @param[in] data the user data +*/ +#if 0 +static void _connection_get_is_online_async_cb( + connection_error_e result, void *data) +{ + struct _priv *priv; + + if (!data) { + _ERR("the param is invalid."); + return; + } + + priv = data; + + if (result != CONNECTION_ERROR_NONE) { + _ERR("connection result: %s.", + _convert_error_to_string(result)); + _show_confirm_popup(priv); + } else { + ug_destroy_me(priv->ug); + } +} + +/** +* Check whether the profile can access to the internet asynchronously +* +* @param[in] result the connection error type +* @param[in] data the user data +*/ +static void _connection_check_gateway_async_cb( + connection_error_e result, void *data) +{ + struct _priv *priv; + int ret; + + if (!data) { + _ERR("the param is invalid."); + return; + } + + priv = data; + + if (result != CONNECTION_ERROR_NONE) { + _ERR("connection result: %s.", + _convert_error_to_string(result)); + _show_confirm_popup(priv); + } else { + ret = connection_mgr_get_is_online_async(priv->connection, + _connection_get_is_online_async_cb, + (void *)priv); + if (ret != RET_SUCCESS) { + _ERR("connection_mgr_get_is_online_async() failed."); + return; + } + } +} +#endif + +/** +* Write the connection information saved last time to the profile +* +* @param[in] priv _priv object bypassed +* @return 0 on success, otherwize -1 +*/ +static int _connection_set_last_network(struct _priv *priv) +{ + int ret; + enum setting_mode ip_mode; + struct network_info info; + + if (!priv) { + _ERR("the param is NULL."); + return RET_FAILED; + } + + ret = vconf_mgr_get_wired_ip_mode(&ip_mode); + if (ret != RET_SUCCESS) { + _ERR("get wired ip mode from vconf failed."); + return ret; + } + + if (ip_mode == MODE_AUTO) { + ret = connection_mgr_ip_dynamic_config(priv->connection, + priv->profile); + if (ret != RET_SUCCESS) { + _ERR("connection_mgr_ip_dynamic_config() failed."); + return ret; + } + } else { + ret = vconf_mgr_get_wired_network_info(&info); + if (ret != RET_SUCCESS) { + _ERR("vconf_mgr_get_wired_network_info() failed."); + return ret; + } + + ret = connection_mgr_set_profile(priv->connection, + priv->profile, &info); + if (ret != RET_SUCCESS) { + _ERR("set profile failed."); + return ret; + } + } + + return RET_SUCCESS; +} + +/** +* Proccess the wired network connection +* +* @param[in] priv _priv object bypassed +* @return 0 on success, otherwise -1 +*/ +static int _wired_connect_proc(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("the param is NULL."); + return RET_FAILED; + } + + _show_progress_popup(priv); + + _get_connection_profile_info(priv); + + ret = _connection_set_last_network(priv); + if (ret != RET_SUCCESS) { + _ERR("_connection_set_last_network() failed."); + return ret; + } + + _DBG("Not Yet"); +#if 0 + ret = connection_mgr_check_gateway_async(priv->profile, + _connection_check_gateway_async_cb, (void *)priv); + if (ret != RET_SUCCESS) { + _ERR("connection_mgr_get_is_online_async() failed."); + return ret; + } +#endif + + return RET_SUCCESS; +} + +/** +* Process the network connection +* +* @param[in] priv _priv object bypassed +*/ +static void _connect_network(struct _priv *priv) +{ + int index; + int ret; + + if (!priv) { + _ERR("the param is NULL."); + return; + } + + if (priv->network_type == TYPE_WIRELESS) { + if (priv->last_item) { + index = elm_genlist_item_index_get(priv->last_item); + + ret = _wifi_connect_ap(priv, index); + if (ret != RET_SUCCESS) { + _ERR("connect ap"); + _show_confirm_popup(priv); + return; + } + } + } else { + ret = _wired_connect_proc(priv); + if (ret != RET_SUCCESS) { + _ERR("connect ap"); + _show_confirm_popup(priv); + return; + } + } +} + +/** +* @Evas_Smart_Cb type callback for handling click event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event event information +*/ +static void _retry_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _del_status_popup(priv); + + _connect_network(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling click event. +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event event information +*/ +static void _cancel_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _del_status_popup(priv); + + elm_object_focus_set(priv->connect_btn, EINA_TRUE); +} + +/** +* @Evas_Smart_Cb type callback for handling unfocus event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the unfocus event occurred +* @param[in] source event information +*/ +static void _ctxpopup_unfocused_cb(void *data, + Evas_Object *obj, void *source) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("data is NULL.\n"); + return; + } + + priv = data; + + _unset_layout_dim(priv); + + evas_object_del(obj); +} + +/** +* Called when confirm information popup is shown +* +* @param[in] priv _priv object bypassed +*/ +static void _show_confirm_popup(struct _priv *priv) +{ + Evas_Object *layout; + Evas_Object *retry_btn; + Evas_Object *cancel_btn; + Evas_Coord w; + Evas_Coord h; + char content[CONTENT_TXT_SIZE]; + + if (!priv) { + _ERR("the param is NULL."); + return; + } + + if (priv->status_popup) + _del_status_popup(priv); + + _set_layout_dim(priv); + + layout = util_add_layout(priv->base, UG_NETWORK_EDJ_FILE, + GRP_CONFIRM_LAYOUT); + if (!layout) { + _ERR("add layout failed."); + _unset_layout_dim(priv); + return; + } + + evas_object_show(layout); + + memset(content, 0, CONTENT_TXT_SIZE); + if (priv->network_type == TYPE_WIRED) { + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRED_LY)); + snprintf(content, CONTENT_TXT_SIZE - 1, "%s %s", + _(TXT_FAILED_CONNECT), _(priv->profile_name)); + } else { + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRELESS_LY)); + snprintf(content, CONTENT_TXT_SIZE - 1, "%s %s", + _(TXT_FAILED_CONNECT), priv->ap_name); + } + + elm_object_part_text_set(layout, + PART_TEXT_CONTENT, content); + + retry_btn = util_add_button(layout, STYLE_SETTING_BTN, + PART_RETRY_BTN, _(TXT_RETRY)); + if (!retry_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + cancel_btn = util_add_button(layout, STYLE_SETTING_BTN, + PART_CANCEL_BTN, _(TXT_CANCEL)); + if (!cancel_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + elm_object_focus_next_object_set(retry_btn, cancel_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(cancel_btn, retry_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(retry_btn, retry_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(retry_btn, retry_btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(retry_btn, retry_btn, + ELM_FOCUS_DOWN); + + evas_object_smart_callback_add(retry_btn, SIG_CLICKED, + _retry_btn_clicked_cb, priv); + evas_object_smart_callback_add(cancel_btn, SIG_CLICKED, + _cancel_btn_clicked_cb, priv); + + elm_object_focus_set(retry_btn, EINA_TRUE); + + elm_object_focus_allow_set(layout, EINA_TRUE); + evas_object_smart_callback_add(layout, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _ctxpopup_pressed_cb, priv); + + w = 0; + h = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_move(layout, CENTER_ALIGN * (w - POPUP_WIDTH) * ELM_SCALE, + CENTER_ALIGN * (h - POPUP_HEIGHT) * ELM_SCALE); + + priv->status_popup = layout; +} + +/** +* Called when connect a wifi device and show connection progress +* +* @param[in] priv _priv object to be finalized +*/ +static void _show_progress_popup(struct _priv *priv) +{ + Evas_Object *layout; + Evas_Object *cancel_btn; + Evas_Coord w; + Evas_Coord h; + char content[CONTENT_TXT_SIZE]; + + if (!priv) { + _ERR("the param is NULL."); + return; + } + + if (priv->status_popup) + _del_status_popup(priv); + + _set_layout_dim(priv); + + layout = util_add_layout(priv->base, UG_NETWORK_EDJ_FILE, + GRP_PROCESSING_LAYOUT); + if (!layout) { + _ERR("add layout failed."); + _unset_layout_dim(priv); + return; + } + + evas_object_show(layout); + + priv->status_popup = layout; + + memset(content, 0, CONTENT_TXT_SIZE); + if (priv->network_type == TYPE_WIRED) { + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRED_LY)); + snprintf(content, CONTENT_TXT_SIZE - 1, "%s %s", + _(TXT_CONNECTTING), _(priv->profile_name)); + } else { + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRELESS_LY)); + snprintf(content, CONTENT_TXT_SIZE - 1, "%s %s", + _(TXT_CONNECTTING), priv->ap_name); + } + + elm_object_part_text_set(layout, PART_TEXT_CONTENT, content); + + cancel_btn = util_add_button(layout, STYLE_SETTING_BTN, + PART_CANCEL_BTN, _(TXT_CANCEL)); + if (!cancel_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + evas_object_show(cancel_btn); + + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_DOWN); + + evas_object_smart_callback_add(cancel_btn, SIG_CLICKED, + _cancel_btn_clicked_cb, priv); + + elm_object_focus_set(cancel_btn, EINA_TRUE); + + elm_object_focus_allow_set(layout, EINA_TRUE); + evas_object_smart_callback_add(layout, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _ctxpopup_pressed_cb, priv); + + w = 0; + h = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_move(layout, CENTER_ALIGN * (w - POPUP_WIDTH) * ELM_SCALE, + CENTER_ALIGN * (h - POPUP_HEIGHT) * ELM_SCALE); +} + +/** +* @Evas_Smart_Cb type callback for handling click event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event event information +*/ +static void _connect_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _connect_network(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling click event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event event information +*/ +static void _refresh_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _clear_genlist_item_list(priv); + + _display_wireless_setting(priv); +} + +/** +* @Evas_Smart_Cb type callback for handling click event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event event information +*/ +static void _other_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + Evas_Object *base; + struct connection_info info; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + priv->cur_view = NETWORK_IP_SETTING_VIEW; + + info.cur_type = priv->network_type; + info.connection = priv->connection; + + if (priv->network_type == TYPE_WIRED) { + strncpy(info.name, priv->profile_name, + MAX_NAME_SIZE - 1); + } else { + if (!priv->ap) { + _ERR("selected ap is NULL."); + return; + } + + info.ap = priv->ap; + + if (priv->ap_name) + strncpy(info.name, priv->ap_name, + MAX_NAME_SIZE - 1); + } + + base = viewmgr_push(priv->vmgr, + ip_setting_view_vclass_get(), &info); + if (!base) + _ERR("add connection layout failed."); +} + +/** +* @Evas_Smart_Cb type callback for handling click event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event event information +*/ +static void _close_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + if (!priv->ug) + return; + + ug_destroy_me(priv->ug); +} + +/** +* Create the action buttons such as "Connect" button and set to defined part +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static int _create_action_btns(struct _priv *priv) +{ + Evas_Object *bt[BTN_ACT]; + Evas_Object *base; + int i; + + if (!priv || !priv->base) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + base = priv->base; + + for (i = 0; i < BTN_ACT; i++) { + bt[i] = util_add_button(base, STYLE_ACTION_BTN, + button_swallow[i], _(action_button[i])); + if (!bt[i]) + return RET_FAILED; + } + + priv->connect_btn = bt[CONNECT]; + priv->refresh_btn = bt[REFRESH]; + priv->other_btn = bt[OTHER]; + priv->close_btn = bt[CLOSE]; + + evas_object_hide(priv->refresh_btn); + + evas_object_smart_callback_add(bt[CONNECT], SIG_CLICKED, + _connect_btn_clicked_cb, priv); + evas_object_smart_callback_add(bt[REFRESH], SIG_CLICKED, + _refresh_btn_clicked_cb, priv); + evas_object_smart_callback_add(bt[OTHER], SIG_CLICKED, + _other_btn_clicked_cb, priv); + evas_object_smart_callback_add(bt[CLOSE], SIG_CLICKED, + _close_btn_clicked_cb, priv); + + _set_action_btn_pos(priv); + + return RET_SUCCESS; +} + +/** +* Create the dim layout but didn't show it +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static int _create_dim_layout(struct _priv *priv) +{ + Evas_Object *dim_ly; + + if (!priv || !priv->win) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + dim_ly = util_add_layout(priv->win, UG_NETWORK_EDJ_FILE, GRP_DIM_LY); + if (!dim_ly) { + _ERR("elm_layout_add() failed.\n"); + return RET_FAILED; + } + + priv->dim_ly = dim_ly; + + _unset_layout_dim(priv); + + return RET_SUCCESS; +} + +/** +* Create the base layout and initialize the network +* +* Called at the start of the application for initializing before the main loop start up +* +* @param[in] vmgr view manager object +* @param[in] data the user data passed from the callback registration function +* @return the base layout of network setting +*/ +static Evas_Object *_create(struct viewmgr *vmgr, void *data) +{ + struct _priv *priv; + Evas_Object *base; + int ret; + + if (!vmgr || !vmgr->win || !vmgr->ug) { + _ERR("Parameter error!"); + return NULL; + } + + priv = _init_priv(); + if (!priv) { + _ERR("init priv failed."); + return NULL; + } + + priv->win = vmgr->win; + priv->ug = vmgr->ug; + priv->vmgr = vmgr; + + ret = _init_connection(priv); + if (ret != RET_SUCCESS) { + _ERR("create connection failed."); + _fini_priv(priv); + return NULL; + } + + base = _create_main_layout(priv); + if (!base) { + _ERR("Add main view failed.\n"); + _fini_priv(priv); + return NULL; + } + + priv->base = base; + + evas_object_data_set(base, KEY_PRIV, priv); + + vconf_mgr_get_network_type(&priv->network_type); + + ret = _create_upper_layout(priv); + if (ret != RET_SUCCESS) { + _ERR("create network type button failed."); + goto error; + } + + if (priv->network_type == TYPE_WIRELESS) + ret = _display_wireless_setting(priv); + else if (priv->network_type == TYPE_WIRED) + ret = _display_wired_setting(priv); + else + ret = RET_FAILED; + if (ret != RET_SUCCESS) + goto error; + + ret = _create_action_btns(priv); + if (ret != RET_SUCCESS) + goto error; + + ret = _create_dim_layout(priv); + if (ret != RET_SUCCESS) + goto error; + + return base; + +error: + evas_object_del(priv->base); + _fini_priv(priv); + + return NULL; +} + +/** +* Resume the network ug +* +* @param[in] base the base layout which was initilized in the _create() +*/ +static void _resume(Evas_Object *base) +{ + struct _priv *priv; + + if (!base) { + _ERR("Parameter error!"); + return; + } + + priv = evas_object_data_get(base, KEY_PRIV); + if (!priv) { + _ERR("priv got from base is NULL."); + return; + } + + evas_object_show(base); + + switch (priv->cur_view) { + case NETWORK_IP_SETTING_VIEW: + elm_object_focus_set(priv->other_btn, EINA_TRUE); + break; + case NETWORK_WIFI_PASSCODE_VIEW: + elm_object_focus_set(priv->connect_btn, EINA_TRUE); + break; + default: + break; + } +} + +/** +* Handle the message sended +* +* @param[in] base the base layout which was initilized in the _create() +* @param[in] message_id the id of the message sended +* @param[in] data the user data +*/ +static void _message_handler(Evas_Object *base, + enum message_id msg_id, void *data) +{ + struct _priv *priv; + + if (!base) { + _ERR("Parameter error!"); + return; + } + + priv = evas_object_data_get(base, KEY_PRIV); + if (!priv) { + _ERR("priv got from base is NULL."); + return; + } + + if (msg_id == PASSCODE_DEVIVER) { + if (priv->ap_pwd) + free(priv->ap_pwd); + priv->ap_pwd = strdup((char *)data); + } +} + +/** +* Pause the network ug +* +* @param[in] base the base layout which was initilized in the _create() +*/ +static void _pause(Evas_Object *base) +{ + if (!base) { + _ERR("Parameter error!"); + return; + } + + evas_object_hide(base); +} + +/** +* Destroy the network ug and release the resource +* +* @param[in] base the base layout which was initilized in the _create() +*/ +static void _destroy(Evas_Object *base) +{ + struct _priv *priv; + + if (!base) { + _ERR("Parameter error!"); + return; + } + + priv = evas_object_data_get(base, KEY_PRIV); + + _fini_priv(priv); +} + +/** +* Get the view type +* +* @return the view type +*/ +static enum view_type _get_view_type(void) +{ + return NETWORK_MAIN_VIEW; +} + +static struct view_class _vclass = { + .create = _create, + .pause = _pause, + .resume = _resume, + .terminate = _destroy, + .message_handler = _message_handler, + .get_view_type = _get_view_type, +}; + +/** +* Get the network view class +* +* @return the view class +*/ +struct view_class *main_view_vclass_get(void) +{ + return &_vclass; +} diff --git a/ug/network/src/network_viewmgr.c b/ug/network/src/network_viewmgr.c new file mode 100644 index 0000000..9e0fa24 --- /dev/null +++ b/ug/network/src/network_viewmgr.c @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "network_viewmgr.h" +#include "defs.h" +#include "dbg.h" + +struct _viewinfo { + struct view_class *vclass; + Evas_Object *base; + enum view_type view_type; +}; + +/** + * Create and initialize the view manager. + * + * Called when app is created. + * + * @return View manager object + */ +struct viewmgr *viewmgr_init() +{ + struct viewmgr *vmgr; + + vmgr = calloc(1, sizeof(*vmgr)); + if (!vmgr) { + _ERR("calloc vmgr failed."); + return NULL; + } + + return vmgr; +} + +/** + * Finalize the view manager. + * + * Called when app is about to destroyed. + * + * @param[in] vmgr View manager object + */ +void viewmgr_fini(struct viewmgr *vmgr) +{ + int i; + + if (!vmgr) + return; + + for (i = eina_list_count(vmgr->vlist); i > 0; i--) + viewmgr_pop(vmgr); + + free(vmgr); +} + +/** + * Callback function for the view deleted event. + * + * Called when the view is deleted. + * + * @param[in] data The pointer to view class object + * @param[in] e The pointer of the evas canvas + * @param[in] obj The object that is deleted + * @param[in] ev The pointer of event info + */ +static void _view_deleted(void *data, Evas *e, Evas_Object *obj, void *ev) +{ + struct view_class *vclass; + + if (!data || !obj) + return; + + vclass = data; + if (vclass->terminate) + vclass->terminate(obj); +} + +/** + * Push a view to the view manager. + * + * Called when one new view is to be pushed. + * + * @param[in] vmgr View manager object + * @param[in] vclass The specific view class for the view to be pushed + * @param[in] data User data + * @return base if the view is created successfully; NULL if failed; + */ +Evas_Object *viewmgr_push(struct viewmgr *vmgr, + struct view_class *vclass, void *data) +{ + struct _viewinfo *vinfo, *vinfo_pre; + Evas_Object *base; + + if (!vmgr || !vmgr->win || !vclass || !vclass->create) + return NULL; + + vinfo = calloc(1, sizeof(*vinfo)); + if (!vinfo) + return NULL; + + base = vclass->create(vmgr, data); + if (!base) { + free(vinfo); + return NULL; + } + evas_object_event_callback_add(base, EVAS_CALLBACK_DEL, + _view_deleted, vclass); + + vinfo->base = base; + vinfo->vclass = vclass; + vinfo->view_type = vclass->get_view_type(); + + vinfo_pre = eina_list_data_get(vmgr->vlist); + if (vinfo_pre && vinfo_pre->base + && vinfo_pre->vclass->pause) + vinfo_pre->vclass->pause(vinfo_pre->base); + + vmgr->vlist = eina_list_prepend(vmgr->vlist, vinfo); + + return base; +} + +/** + * Send a message between the views. + * + * Called when there is the information to pass. + * + * @param[in] vmgr View manager object + * @param[in] view_type The view type + * @param[in] msg_id Message ID + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int viewmgr_send_message(struct viewmgr *vmgr, + enum view_type view_type, + enum message_id msg_id, void *data) +{ + struct _viewinfo *vinfo; + struct view_class *vclass; + Eina_List *list, *list_next; + + if (!vmgr) { + _ERR("vmgr is NULL."); + return RET_FAILED; + } + + EINA_LIST_FOREACH_SAFE(vmgr->vlist, list, list_next, vinfo) { + if (!vinfo) { + _ERR("vinfo is NULL."); + continue; + } + + vclass = vinfo->vclass; + + if (vinfo->view_type == view_type) { + if (vclass && vclass->message_handler) + vclass->message_handler(vinfo->base, + msg_id, data); + + /*only support single message now, so break.*/ + break; + } + } + + return RET_SUCCESS; +} + +/** + * Pop a view from the view manager. + * + * Called when the top view is to be poped. + * + * @param[in] vmgr View manager object + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int viewmgr_pop(struct viewmgr *vmgr) +{ + struct _viewinfo *vinfo; + + if (!vmgr || !vmgr->vlist) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + vinfo = eina_list_data_get(vmgr->vlist); + if (!vinfo) { + _ERR("eina_list_data_get() failed."); + return RET_FAILED; + } + + vmgr->vlist = eina_list_remove_list(vmgr->vlist, vmgr->vlist); + viewmgr_resume(vmgr); + + evas_object_del(vinfo->base); + + free(vinfo); + + return RET_SUCCESS; +} + +/** + * Resume a view with the view manager. + * + * When the top view is poped, and the next view has some + * specific state to be show, the function is called. + * + * @param[in] vmgr View manager object + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int viewmgr_resume(struct viewmgr *vmgr) +{ + struct _viewinfo *vinfo; + struct view_class *vclass; + + if (!vmgr || !vmgr->vlist) { + _ERR("param is invalid."); + return RET_FAILED; + } + + vinfo = eina_list_data_get(vmgr->vlist); + if (!vinfo || !vinfo->vclass || !vinfo->base) { + _ERR("vinfo, vinfo->vclass, or vinfo->base is NULL."); + return RET_FAILED; + } + + vclass = vinfo->vclass; + if (vclass->resume) + vclass->resume(vinfo->base); + + return RET_SUCCESS; +} + +/** + * Get the pointer of window. + * + * @param[in] vmgr View manager object + * @return win if the operation is successful; NULL if failed; + */ +Evas_Object *viewmgr_win_get(struct viewmgr *vmgr) +{ + if (!vmgr) + return NULL; + + return vmgr->win; +} diff --git a/ug/network/src/ug_network_settings.c b/ug/network/src/ug_network_settings.c new file mode 100644 index 0000000..dcc13dd --- /dev/null +++ b/ug/network/src/ug_network_settings.c @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UG_MODULE_API +#define UG_MODULE_API __attribute__ ((visibility("default"))) +#endif + +#include +#include +#include + +#include "i18n.h" +#include "defs.h" +#include "dbg.h" +#include "main_view.h" +#include "network_viewmgr.h" + +struct _ug_data { + Evas_Object *win; + Evas_Object *base; + ui_gadget_h ug; + struct viewmgr *vmgr; +}; + +/** +* Creates the base layout for network UI gadget +* +* This function supposed to be called after successful initialization +* with ug_init(), When network UG is created, the create operation is invoked, +* the implementation of create operation is _on_create. +* In this function a base layout will be created for the UI gadget instance. +* (see struct ug_cbs) +* +* @param[in] ug The network ui gadget object being created +* @param[in] mode Mode of UI gadget (UG_MODE_FULLVIEW | UG_MODE_FRAMEVIEW) +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* @return the base layout +*/ +static void *_on_create(ui_gadget_h ug, enum ug_mode mode, + service_h service, void *priv) +{ + struct _ug_data *ugd; + Evas_Object *base; + Evas_Object *win; + struct viewmgr *vmgr; + + if (!ug || !priv) { + _ERR("Parameter error!"); + return NULL; + } + + ugd = priv; + ugd->ug = ug; + + elm_theme_extension_add(NULL, UG_NETWORK_EDJ_THEME); + + win = ug_get_window(); + if (!win) { + _ERR("window get failed"); + return NULL; + } + ugd->win = win; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_style_set(win, "invisible"); + + vmgr = viewmgr_init(); + if (!vmgr) { + _ERR("init view mgr failed.\n"); + return NULL; + } + ugd->vmgr = vmgr; + + vmgr->ug = ug; + vmgr->win = win; + + base = viewmgr_push(vmgr, main_view_vclass_get(), NULL); + if (!base) { + _ERR("add base layout failed."); + viewmgr_fini(vmgr); + return NULL; + } + + ugd->base = base; + evas_object_raise(base); + + return base; +} + +/** +* When network UG starts, the start operation is invoked, the implementation of +* start operation is on_start(), +* usually every job would be completed before this operation, +* so just describe additional job you need to do in this operation. +* +* @param[in] ug The network ui gadget object being created +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* There is no action in this function. +*/ +static void _on_start(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Pause network ug. +* +* @param[in] ug The network ui gadget object being created +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* There is no action in this function. +*/ +static void _on_pause(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Resume network ug. +* +* @param[in] ug The network ui gadget object being created +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* There is no action in this function. +*/ +static void _on_resume(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Destroy the ug and release resources that have been used. +* +* When network UG is destroyed, the destroy operation is invoked. +* UI gadget cannot destroy itself, so it must be destroyed by using +* ug_destroy(), and then _on_destroy will be invoked, in this function, +* the viewmgr will be released. +* +* @param[in] ug the network ui gadget object +* @param[in] service each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv the data structure +*/ +static void _on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ + struct _ug_data *ugd = priv; + + if (!ug || !priv) { + _ERR("Parameter error!"); + return; + } + + if (!ugd || !ugd->base) + return; + + viewmgr_fini(ugd->vmgr); +} + +/** +* when an UI gadget receives message from its caller using ug_send_message(), +* the message operation on_message is invoked. +* +* @param[in] ug The network ui gadget object being created +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* There is no action in this function. +*/ +static void _on_message(ui_gadget_h ug, + service_h msg, service_h service, void *priv) +{ +} + +/** +* when a system event is generated and UI gadget receives event from caller +* using ug_send_event(), the event operation on_event is invoked. +* +* @param[in] ug the network ui gadget object +* @param[in] event the network ui gadget object +* @param[in] service each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv the data structure +*/ +static void _on_event(ui_gadget_h ug, + enum ug_event event, service_h service, void *priv) +{ + if (!ug || !priv) { + _ERR("Parameter error!"); + return; + } + + switch (event) { + case UG_EVENT_LOW_MEMORY: + break; + case UG_EVENT_LOW_BATTERY: + break; + case UG_EVENT_LANG_CHANGE: + break; + case UG_EVENT_ROTATE_PORTRAIT: + break; + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + break; + case UG_EVENT_ROTATE_LANDSCAPE: + break; + case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN: + break; + default: + break; + } +} + +/** +* Invoked when the UI gadget is loading, and it sets operations, private data, +* and the option. +* +* @param[in] ops Ops is a data structure describing operations, private data, +* and the option of UI gadget. +* +* @return 0 on success and -1 on fail +*/ +UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + struct _ug_data *ugd; + + if (!ops) + return -1; + + ugd = calloc(1, sizeof(*ugd)); + if (!ugd) + return -1; + + i18n_init(); + + ops->create = _on_create; + ops->start = _on_start; + ops->pause = _on_pause; + ops->resume = _on_resume; + ops->destroy = _on_destroy; + ops->message = _on_message; + ops->event = _on_event; + ops->priv = ugd; + ops->opt = UG_OPT_INDICATOR_ENABLE; + + return 0; +} + +/** +* Invoked when the UI gadget is loading, and it sets operations, private data, +* and the option. +* +* @param[in] ops Ops is a data structure describing operations, private data, +* and the option of UI gadget +* +* @return 0 on success and -1 on fail +*/ +UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops) +{ + struct _ug_data *ugd; + + if (!ops) + return; + + ugd = ops->priv; + + free(ugd); +} diff --git a/ug/network/src/util.c b/ug/network/src/util.c new file mode 100644 index 0000000..b240a61 --- /dev/null +++ b/ug/network/src/util.c @@ -0,0 +1,360 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "i18n.h" +#include "defs.h" +#include "dbg.h" +#include "util.h" + +/** + * Creates one layout. + * + * @param[in] parent The parent object + * @param[in] file The path of edc file + * @param[in] group Group name in edc + * @return layout if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_layout(Evas_Object *parent, + const char *file, const char *group) +{ + Evas_Object *ly; + + if (!parent || !file || !group) + return NULL; + + ly = elm_layout_add(parent); + if (!ly) { + _ERR("add layout failed"); + return NULL; + } + + elm_layout_file_set(ly, file, group); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, + EVAS_HINT_FILL); + + evas_object_show(ly); + + return ly; +} + +/** + * Callback for mouse-in event. + * + * Sets the object focused when the mouse is the the area of the object. + * + * @param[in] dt User data + * @param[in] e The evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _mainitem_btn_mousein_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) { + _ERR("Invalid argument obj"); + return; + } + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** + * Creates one button. + * + * @param[in] parent The parent object + * @param[in] style The style of the button + * @param[in] part The part name where the button is located + * @param[in] text The text of the button + * @return button if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_button(Evas_Object *parent, const char *style, + const char *part, const char *text) +{ + Evas_Object *btn; + + if (!parent || !style || !text) { + _ERR("the parameter is NULL."); + return NULL; + } + + btn = elm_button_add(parent); + if (!btn) { + _ERR("add button failed"); + return NULL; + } + + elm_object_style_set(btn, style); + elm_object_text_set(btn, text); + + if (part) + elm_object_part_content_set(parent, part, btn); + + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _mainitem_btn_mousein_cb, NULL); + + evas_object_show(btn); + + return btn; +} + +/** + * Creates one scroll container. + * + * @param[in] parent The parent object + * @param[in] part The part name where the scroll container is located + * @return scroll if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_scroll(Evas_Object *parent, const char *part) +{ + Evas_Object *scroll; + + if (!parent) { + _ERR("the parent is NULL."); + return NULL; + } + + scroll = elm_scroller_add(parent); + if (!scroll) { + _ERR("elm_scroller_add() failed."); + return NULL; + } + + if (part) + elm_object_part_content_set(parent, part, scroll); + + elm_object_focus_allow_set(scroll, EINA_FALSE); + elm_scroller_bounce_set(scroll, EINA_FALSE, EINA_FALSE); + + evas_object_show(scroll); + + return scroll; +} + +/** + * Creates one box container. + * + * @param[in] parent The parent object + * @param[in] part The part name where the box container is located + * @return box if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_box(Evas_Object *parent, const char *part) +{ + Evas_Object *box; + + if (!parent) { + _ERR("the parent is NULL."); + return NULL; + } + + box = elm_box_add(parent); + if (!box) { + _ERR("elm_box_add() failed."); + return NULL; + } + + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, + EVAS_HINT_FILL); + + if (part) + elm_object_part_content_set(parent, part, box); + + evas_object_show(box); + + return box; +} + +/** + * Creates one button with the specific style. + * + * The specific style is 'key_value_btn'. + * + * @param[in] parent The parent object + * @param[in] part The part name where the button is located + * @param[in] text_key The key + * @param[in] text_value The value + * @return button if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_key_value_button(Evas_Object *parent, + const char *part, const char *text_key, const char *text_value) +{ + Evas_Object *btn; + + if (!parent) { + _ERR("the parent is NULL."); + return NULL; + } + + if (!text_key || !text_value) { + _ERR("style or part or text is NULL"); + return NULL; + } + + btn = elm_button_add(parent); + if (!btn) { + _ERR("add button failed"); + return NULL; + } + + elm_object_style_set(btn, STYLE_KEY_VALUE_BTN); + elm_object_part_text_set(btn, PART_KEY, text_key); + elm_object_part_text_set(btn, PART_VALUE, text_value); + + if (part) + elm_object_part_content_set(parent, part, btn); + + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _mainitem_btn_mousein_cb, NULL); + + evas_object_show(btn); + + return btn; +} + +/** + * Creates one image. + * + * @param[in] parent The parent object + * @param[in] file The path name of image file + * @param[in] part The part name where the image is located + * @return image if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_image(Evas_Object *parent, + const char *file, const char *part) +{ + Evas_Object *image; + + if (!parent || !file) { + _ERR("the param is NULL."); + return NULL; + } + + image = elm_image_add(parent); + if (!image) { + _ERR("elm_image_add() failed."); + return NULL; + } + + elm_image_file_set(image, file, NULL); + + if (part) + elm_object_part_content_set(parent, part, image); + + evas_object_show(image); + + return image; +} + +/** + * Creates one entry. + * + * @param[in] parent The parent object + * @param[in] style The style of the entry + * @param[in] part The part name where the entry is located + * @return entry if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_entry(Evas_Object *parent, + const char *style, const char *part) +{ + Evas_Object *entry; + + if (!parent) { + _ERR("the param is NULL."); + return NULL; + } + + entry = elm_entry_add(parent); + if (!entry) { + _ERR("elm_entry_add() failed."); + return NULL; + } + + elm_entry_input_panel_language_set(entry, + ELM_INPUT_PANEL_LANG_ALPHABET); + evas_object_size_hint_weight_set(entry, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, + EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_cursor_end_set(entry); + + if (style) + elm_object_style_set(entry, style); + + if (part) + elm_object_part_content_set(parent, part, entry); + + evas_object_show(entry); + + return entry; +} + +/** + * Creates one genlist. + * + * @param[in] parent The parent object + * @return genlist if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_genlist(Evas_Object *parent) +{ + Evas_Object *genlist; + + if (!parent) { + _ERR("the param is NULL."); + return NULL; + } + + genlist = elm_genlist_add(parent); + if (!genlist) { + _ERR("elm_genlist_add() failed."); + return NULL; + } + + return genlist; +} + +/** + * Sets focus cycle. + * + * Sets the next focus to the object itself in the direction of + * ELM_FOCUS_LEFT and ELM_FOCUS_UP + * + * @param[in] obj The object + */ +void util_focus_next_set(Evas_Object *obj) +{ + if (!obj) { + _ERR("the param is NULL."); + return; + } + + elm_object_focus_next_object_set(obj, obj, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(obj, obj, ELM_FOCUS_UP); +} diff --git a/ug/network/src/vconf_mgr.c b/ug/network/src/vconf_mgr.c new file mode 100644 index 0000000..b4c72c8 --- /dev/null +++ b/ug/network/src/vconf_mgr.c @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "defs.h" +#include "dbg.h" +#include "vconf_mgr.h" +#include "i18n.h" + +static const char *WIRED_DNS_LAST_MODE = "db/menu/network/wired_dns_mode"; +static const char *WIRED_IP_LAST_MODE = "db/menu/network/wired_ip_mode"; +static const char *WIRED_IP_KEY = "db/menu/network/wired_ip"; +static const char *WIRED_SUBMASK_KEY = "db/menu/network/wired_subnet"; +static const char *WIRED_GATEWAY_KEY = "db/menu/network/wired_gateway"; +static const char *WIRED_DNS_KEY = "db/menu/network/wired_dns"; + +static const char *WIRELESS_IP_LAST_MODE = "db/menu/network/wireless_ip_mode"; +static const char *WIRELESS_DNS_LAST_MODE = "db/menu/network/wireless_dns_mode"; +static const char *WIRELESS_IP_KEY = "db/menu/network/wireless_ip"; +static const char *WIRELESS_SUBMASK_KEY = "db/menu/network/wireless_subnet"; +static const char *WIRELESS_GATEWAY_KEY = "db/menu/network/wireless_gateway"; +static const char *WIRELESS_DNS_KEY = "db/menu/network/wireless_dns"; + +static const char *SELECTED_NETWORK_TYPE_KEY = "db/menu/network/network_type"; + +/** + * Gets the network type. + * + * Gets the last network type from vconf. + * + * @param[out] network_type Network type + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_get_network_type(enum network_type_enum *network_type) +{ + const char *str; + + if (!network_type) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + str = vconf_get_str(SELECTED_NETWORK_TYPE_KEY); + if (str && !strcmp(str, TXT_WIRED)) + *network_type = TYPE_WIRED; + else + *network_type = TYPE_WIRELESS; + + return RET_SUCCESS; +} + +/** + * Sets the network type. + * + * Sets the network type into vconf, so it can be used + * next time by calling vconf_mgr_get_network_type. + * + * @param[in] network_type Network type + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_set_network_type(enum network_type_enum network_type) +{ + switch (network_type) { + case TYPE_WIRED: + vconf_set_str(SELECTED_NETWORK_TYPE_KEY, TXT_WIRED); + break; + case TYPE_WIRELESS: + vconf_set_str(SELECTED_NETWORK_TYPE_KEY, TXT_WIRELESS); + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the string value from the vconf. + * + * @param[out] des The string value + * @param[in] key Vconf key + */ +static void _get_info(char *des, const char *key) +{ + const char *str; + + if (!des || !key) + return; + + str = vconf_get_str(key); + if (!str) + return; + + if (str == '\0' || !strncmp(str, NULL_STRING, IP_STRING_MAX_SIZE)) + strncpy(des, _(ZERO_IP), IP_STRING_MAX_SIZE); + else + strncpy(des, str, IP_STRING_MAX_SIZE); +} + +/** + * Gets wired network information. + * + * Including IP, submask, gateway and DNS. + * + * @param[out] info The structure of network information + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_get_wired_network_info(struct network_info *info) +{ + if (!info) { + _ERR("the param is NULL."); + return RET_FAILED; + } + + _get_info(info->ip_addr, WIRED_IP_KEY); + _get_info(info->submask, WIRED_SUBMASK_KEY); + _get_info(info->gateway, WIRED_GATEWAY_KEY); + _get_info(info->dns, WIRED_DNS_KEY); + + return RET_SUCCESS; +} + +/** + * Gets wireless network information. + * + * Including IP, submask, gateway and DNS. + * + * @param[out] info The structure of network information + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_get_wireless_network_info(struct network_info *info) +{ + if (!info) { + _ERR("the param is NULL."); + return RET_FAILED; + } + + _get_info(info->ip_addr, WIRELESS_IP_KEY); + _get_info(info->submask, WIRELESS_SUBMASK_KEY); + _get_info(info->gateway, WIRELESS_GATEWAY_KEY); + _get_info(info->dns, WIRELESS_DNS_KEY); + + return RET_SUCCESS; +} + +/** + * Saves wired network information into vconf. + * + * Including IP, submask, gateway and DNS. + * + * @param[in] info The structure of network information + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_save_wired_config_info(struct network_info *info) +{ + if (!info) { + _ERR("the param is NULL."); + return RET_FAILED; + } + + vconf_set_str(WIRED_IP_KEY, info->ip_addr); + vconf_set_str(WIRED_SUBMASK_KEY, info->submask); + vconf_set_str(WIRED_GATEWAY_KEY, info->gateway); + vconf_set_str(WIRED_DNS_KEY, info->dns); + + return RET_SUCCESS; +} + +/** + * Saves wireless network information into vconf. + * + * Including IP, submask, gateway and DNS. + * + * @param[in] info The structure of network information + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_save_wireless_config_info(struct network_info *info) +{ + if (!info) { + _ERR("the param is NULL."); + return RET_FAILED; + } + + vconf_set_str(WIRELESS_IP_KEY, info->ip_addr); + vconf_set_str(WIRELESS_SUBMASK_KEY, info->submask); + vconf_set_str(WIRELESS_GATEWAY_KEY, info->gateway); + vconf_set_str(WIRELESS_DNS_KEY, info->dns); + + return RET_SUCCESS; +} + +/** + * Gets the wired IP mode from vconf. + * + * The mode includes automatical and manual. + * + * @param[out] mode The enum of setting mode + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_get_wired_ip_mode(enum setting_mode *mode) +{ + const char *str; + + if (!mode) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + str = vconf_get_str(WIRED_IP_LAST_MODE); + if (str && !strcmp(str, _(TXT_OBTAIN_AUTO))) + *mode = MODE_AUTO; + else + *mode = MODE_MAN; + + return RET_SUCCESS; +} + +/** + * Sets the wired IP mode into vconf. + * + * The mode includes automatical and manual. + * + * @param[in] mode The enum of setting mode + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_set_wired_ip_mode(enum setting_mode mode) +{ + switch (mode) { + case MODE_AUTO: + vconf_set_str(WIRED_IP_LAST_MODE, _(TXT_OBTAIN_AUTO)); + break; + case MODE_MAN: + vconf_set_str(WIRED_IP_LAST_MODE, _(TXT_ENTER_MAN)); + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the wired DNS mode from vconf. + * + * The mode includes automatical and manual. + * + * @param[out] mode The enum of setting mode + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_get_wired_dns_mode(enum setting_mode *mode) +{ + char *str; + + if (!mode) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + str = vconf_get_str(WIRED_DNS_LAST_MODE); + if (str && !strcmp(str, _(TXT_OBTAIN_AUTO))) + *mode = MODE_AUTO; + else + *mode = MODE_MAN; + + return RET_SUCCESS; +} + +/** + * Sets the wired DNS mode into vconf. + * + * The mode includes automatical and manual. + * + * @param[in] mode The enum of setting mode + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_set_wired_dns_mode(enum setting_mode mode) +{ + switch (mode) { + case MODE_AUTO: + vconf_set_str(WIRED_DNS_LAST_MODE, _(TXT_OBTAIN_AUTO)); + break; + case MODE_MAN: + vconf_set_str(WIRED_DNS_LAST_MODE, _(TXT_ENTER_MAN)); + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the wireless IP mode from vconf. + * + * The mode includes automatical and manual. + * + * @param[out] mode The enum of setting mode + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_get_wireless_ip_mode(enum setting_mode *mode) +{ + char *str; + + if (!mode) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + str = vconf_get_str(WIRELESS_IP_LAST_MODE); + if (str && !strcmp(str, _(TXT_OBTAIN_AUTO))) + *mode = MODE_AUTO; + else + *mode = MODE_MAN; + + return RET_SUCCESS; +} + +/** + * Sets the wireless IP mode into vconf. + * + * The mode includes automatical and manual. + * + * @param[in] mode The enum of setting mode + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_set_wireless_ip_mode(enum setting_mode mode) +{ + switch (mode) { + case MODE_AUTO: + vconf_set_str(WIRELESS_IP_LAST_MODE, _(TXT_OBTAIN_AUTO)); + break; + case MODE_MAN: + vconf_set_str(WIRELESS_IP_LAST_MODE, _(TXT_ENTER_MAN)); + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the wireless DNS mode from vconf. + * + * The mode includes automatical and manual. + * + * @param[out] mode The enum of setting mode + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_get_wireless_dns_mode(enum setting_mode *mode) +{ + char *str; + + if (!mode) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + str = vconf_get_str(WIRELESS_DNS_LAST_MODE); + if (str && !strcmp(str, _(TXT_OBTAIN_AUTO))) + *mode = MODE_AUTO; + else + *mode = MODE_MAN; + + return RET_SUCCESS; +} + +/** + * Sets the wireless DNS mode into vconf. + * + * The mode includes automatical and manual. + * + * @param[in] mode The enum of setting mode + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_set_wireless_dns_mode(enum setting_mode mode) +{ + switch (mode) { + case MODE_AUTO: + vconf_set_str(WIRELESS_DNS_LAST_MODE, + _(TXT_OBTAIN_AUTO)); + break; + case MODE_MAN: + vconf_set_str(WIRELESS_DNS_LAST_MODE, + _(TXT_ENTER_MAN)); + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} diff --git a/ug/network/src/wifi_mgr.c b/ug/network/src/wifi_mgr.c new file mode 100644 index 0000000..7555aeb --- /dev/null +++ b/ug/network/src/wifi_mgr.c @@ -0,0 +1,615 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "defs.h" +#include "dbg.h" +#include "wifi_mgr.h" + +/** + * Converts the error type to string information. + * + * @param[in] err_type Error type + * @return error string information; + */ +const char *wifi_mgr_error_dbg(wifi_error_e err_type) +{ + switch (err_type) { + case WIFI_ERROR_NONE: + return "NONE"; + case WIFI_ERROR_INVALID_PARAMETER: + return "INVALID_PARAMETER"; + case WIFI_ERROR_OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case WIFI_ERROR_INVALID_OPERATION: + return "INVALID_OPERATION"; + case WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED: + return "ADDRESS_FAMILY_NOT_SUPPORTED"; + case WIFI_ERROR_OPERATION_FAILED: + return "OPERATION_FAILED"; + case WIFI_ERROR_NO_CONNECTION: + return "NO_CONNECTION"; + case WIFI_ERROR_NOW_IN_PROGRESS: + return "NOW_IN_PROGRESS"; + case WIFI_ERROR_ALREADY_EXISTS: + return "ALREADY_EXISTS"; + case WIFI_ERROR_OPERATION_ABORTED: + return "OPERATION_ABORTED"; + case WIFI_ERROR_DHCP_FAILED: + return "DHCP_FAILED"; + case WIFI_ERROR_INVALID_KEY: + return "INVALID_KEY"; + case WIFI_ERROR_NO_REPLY: + return "NO_REPLY"; + case WIFI_ERROR_SECURITY_RESTRICTED: + return "SECURITY_RESTRICTED"; + default: + break; + } + + return "UNKNOWN"; +} + +/** + * Initializes Wi-Fi. + * + * Called before using wifi APIs. + * + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_init(void) +{ + int ret; + + ret = wifi_initialize(); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to wifi_initialize.\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Deinitializes Wi-Fi. + * + * Called when network setting is destroyed. + * + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_deinit(void) +{ + int ret; + + ret = wifi_deinitialize(); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to wifi_deinitialize.\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Checks whether Wi-Fi is activated. + * + * @param[out] activated The activated value of wifi + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_is_activated(bool *activated) +{ + int ret; + + ret = wifi_is_activated(activated); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to wifi_is_activated %s\n", + wifi_mgr_error_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Starts scan, asynchronously. + * + * Called if you want to get the ap list. + * + * @param[in] cb The callback function to be called + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_scan_request(wifi_scan_finished_cb cb, void *data) +{ + int ret; + + if (!cb || !data) { + _ERR("null pointer"); + return RET_FAILED; + } + + ret = wifi_scan(cb, data); + if (ret != WIFI_ERROR_NONE) { + _ERR("Scan request failed [%s]\n", + wifi_mgr_error_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the result of scan. + * + * Called in the callback of wifi_scan(). + * + * @param[in] cb The callback function to be called + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_foreach_found_aps(wifi_found_ap_cb cb, void *data) +{ + int ret; + + if (!cb || !data) { + _ERR("null pointer"); + return RET_FAILED; + } + + ret = wifi_foreach_found_aps(cb, data); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to get AP list %s.\n", wifi_mgr_error_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Activates Wi-Fi, asynchronously. + * + * If the wireless adaptor is not activated, you should activate it first. + * + * @param[in] cb The callback function to be called + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_activate(wifi_activated_cb cb, void *data) +{ + int ret; + + if (!cb || !data) { + _ERR("null pointer"); + return RET_FAILED; + } + + ret = wifi_activate(cb, data); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to wifi_activate %s\n", + wifi_mgr_error_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the handle of connected access point. + * + * You can get the connected access point and its configuration. + * + * @param[out] ap The handle of access point + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_get_connected_ap(wifi_ap_h *ap) +{ + int ret; + + if (!ap) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = wifi_get_connected_ap(ap); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_get_connected_ap() failed."); + return ret; + } + + return RET_SUCCESS; +} + +/** + * Destroys the handle of access point. + * + * when you cloned an ap and don't use it later, you should destroy it. + * + * @param[in] ap The handle of access point + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_ap_destroy(wifi_ap_h ap) +{ + int ret; + + if (!ap) { + _ERR("the ap is already NULL."); + return RET_SUCCESS; + } + + ret = wifi_ap_destroy(ap); + if (ret != WIFI_ERROR_NONE) + ret = RET_FAILED; + else + ret = RET_SUCCESS; + + return ret; +} + +/** + * Clones the handle of access point. + * + * Copy the data of an ap. + * + * @param[out] cloned_ap The handle of access point to clone + * @param[in] origin The handle of access point to be cloned + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_ap_clone(wifi_ap_h *cloned_ap, wifi_ap_h origin) +{ + int ret; + + if (!cloned_ap || !origin) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = wifi_ap_clone(cloned_ap, origin); + if (ret != WIFI_ERROR_NONE) + ret = RET_FAILED; + else + ret = RET_SUCCESS; + + return ret; +} + +/** + * Gets the data of access point. + * + * @param[in] ap The handle of access point + * @param[out] ap_info The structue to store the data of access point + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_get_ap_info(wifi_ap_h ap, struct wifi_ap_info *ap_info) +{ + char *str; + + if (!ap || !ap_info) { + _ERR("null pointer"); + return RET_FAILED; + } + + str = NULL; + if (wifi_ap_get_essid(ap, &str) == WIFI_ERROR_NONE) { + _ERR("ESSID : %s\n", str); + strncpy(ap_info->essid, str, SSID_MAX_LENTH - 1); + free(str); + } else { + _ERR("Fail to get ESSID\n"); + return RET_FAILED; + } + + if (wifi_ap_get_connection_state(ap, + &ap_info->state) != WIFI_ERROR_NONE) { + _ERR("Fail to get Connection State\n"); + return RET_FAILED; + } + + if (wifi_ap_get_security_type(ap, + &ap_info->secure_type) != WIFI_ERROR_NONE) { + _ERR("Fail to get Security type\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Deletes the information of stored access point and disconnects it when it is connected. + * + * If an AP is connected, then connection information will be stored. + * This information is used when a connection to that AP is established automatically. + * If you want to connect another access point, you should desconnect the connected one. + * + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_forget_last_ap(void) +{ + int ret; + wifi_ap_h ap; + char *name; + + ret = wifi_get_connected_ap(&ap); + if (ret == WIFI_ERROR_NO_CONNECTION) { + return RET_SUCCESS; + } else if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to get connected AP [%s]\n", + wifi_mgr_error_dbg(ret)); + return RET_FAILED; + } + + ret = wifi_ap_get_essid(ap, &name); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to wifi_ap_get_essid AP [%s]\n", + wifi_mgr_error_dbg(ret)); + wifi_ap_destroy(ap); + return RET_FAILED; + } + + ret = wifi_forget_ap(ap); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to forget [%s],[%s].\n", name, + wifi_mgr_error_dbg(ret)); + wifi_ap_destroy(ap); + free(name); + return RET_FAILED; + } + + free(name); + + return RET_SUCCESS; +} + +/** + * Sets the passphrase. + * + * When the access point is locked, you should set passphrase first. + * + * @param[in] ap The handle of access point + * @param[in] passcode The passcode + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_set_passphrase(wifi_ap_h ap, const char *passcode) +{ + int ret; + + if (!ap || !passcode) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = wifi_ap_set_passphrase(ap, passcode); + if (ret != WIFI_ERROR_NONE) { + _ERR("failed to set passcode. ret: %s.", + wifi_mgr_error_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Connects the access point, asynchronously. + * + * After you make the preprarion, such as setting passphrase, + * forgetting the connected ap, then you can connect the ap. + * + * @param[in] ap The handle of access point + * @param[in] cb The callback function to be called + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_connect(wifi_ap_h ap, wifi_connected_cb cb, void *data) +{ + int ret; + + if (!cb || !ap || !data) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = wifi_connect(ap, cb, data); + if (ret != WIFI_ERROR_NONE) { + _ERR("failed to connect ap. ret: %s.", + wifi_mgr_error_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Sets the config type of IP. + * + * Only support IPV4 now. + * + * @param[in] ap The handle of access point + * @param[in] type The type of IP config + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_ap_set_ip_config_type(wifi_ap_h ap, + wifi_ip_config_type_e type) +{ + int ret; + + if (!ap) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = wifi_ap_set_ip_config_type(ap, WIFI_ADDRESS_FAMILY_IPV4, type); + if (ret != WIFI_ERROR_NONE) { + _ERR("failed to connect ap. ret: %s.", + wifi_mgr_error_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the data of access point. + * + * Get ip, dns, submask, and gateway info. + * + * @param[in] ap The handle of access point + * @param[out] info The structure to store ip info + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_get_ip_info(wifi_ap_h ap, struct network_info *info) +{ + char *str_value; + + if (!info || !ap) { + _ERR("null pointer"); + return RET_FAILED; + } + + str_value = NULL; + if (wifi_ap_get_ip_address(ap, WIFI_ADDRESS_FAMILY_IPV4, + &str_value) == WIFI_ERROR_NONE) { + strncpy(info->ip_addr, str_value, IP_STRING_MAX_SIZE); + free(str_value); + } else { + strncpy(info->ip_addr, ZERO_IP, IP_STRING_MAX_SIZE); + _ERR("Fail to get Gateway\n"); + } + + str_value = NULL; + if (wifi_ap_get_subnet_mask(ap, WIFI_ADDRESS_FAMILY_IPV4, + &str_value) == WIFI_ERROR_NONE) { + strncpy(info->submask, str_value, IP_STRING_MAX_SIZE); + free(str_value); + } else { + strncpy(info->submask, ZERO_IP, IP_STRING_MAX_SIZE); + _ERR("Fail to get Gateway\n"); + } + + str_value = NULL; + if (wifi_ap_get_gateway_address(ap, WIFI_ADDRESS_FAMILY_IPV4, + &str_value) == WIFI_ERROR_NONE) { + strncpy(info->gateway, str_value, IP_STRING_MAX_SIZE); + free(str_value); + } else { + strncpy(info->gateway, ZERO_IP, IP_STRING_MAX_SIZE); + _ERR("Fail to get Gateway\n"); + } + + str_value = NULL; + if (wifi_ap_get_dns_address(ap, 1, WIFI_ADDRESS_FAMILY_IPV4, + &str_value) == WIFI_ERROR_NONE) { + strncpy(info->dns, str_value, IP_STRING_MAX_SIZE); + free(str_value); + } else { + strncpy(info->dns, ZERO_IP, IP_STRING_MAX_SIZE); + _ERR("Fail to get DNS1\n"); + } + + return RET_SUCCESS; +} + +/** + * Sets the data of access point. + * + * Set ip, submask, and gateway info. + * + * @param[in] ap The handle of access point + * @param[in] info The structure of ip info + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_set_ip_config(wifi_ap_h ap, struct network_info *info) +{ + int ret; + + if (!info || !ap) { + _ERR("null pointer"); + return RET_FAILED; + } + + ret = wifi_ap_set_ip_address(ap, WIFI_ADDRESS_FAMILY_IPV4, + info->ip_addr); + if (ret != WIFI_ERROR_NONE) + _ERR("Fail to set ip address[%s]\n", + wifi_mgr_error_dbg(ret)); + + ret = wifi_ap_set_subnet_mask(ap, WIFI_ADDRESS_FAMILY_IPV4, + info->submask); + if (ret != WIFI_ERROR_NONE) + _ERR("Fail to set subnet mask[%s]\n", + wifi_mgr_error_dbg(ret)); + + ret = wifi_ap_set_gateway_address(ap, WIFI_ADDRESS_FAMILY_IPV4, + info->gateway); + if (ret != WIFI_ERROR_NONE) + _ERR("Fail to set gateway address[%s]\n", + wifi_mgr_error_dbg(ret)); + + return RET_SUCCESS; +} + +/** + * Sets dns of access point. + * + * @param[in] ap The handle of access point + * @param[in] info The structure of ip info + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_set_dns_config(wifi_ap_h ap, struct network_info *info) +{ + int ret; + + if (!info || !ap) { + _ERR("null pointer"); + return RET_FAILED; + } + + ret = wifi_ap_set_dns_address(ap, 1, WIFI_ADDRESS_FAMILY_IPV4, + info->dns); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to set dns address[%s]\n", + wifi_mgr_error_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets whether Wi-Fi can access to the internet asynchronously. + * + * @param[in] cb The callback function to be called + * @param[in] data User data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +#if 0 +int wifi_mgr_get_is_online_async(wifi_get_is_online_async_cb cb, + void *data) +{ + int ret; + + if (!cb || !data) { + _ERR("the param is NULL."); + return RET_FAILED; + } + + ret = wifi_get_is_online_async(cb, data); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_get_is_online_async() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} +#endif diff --git a/ug/network/src/wifi_passcode_view.c b/ug/network/src/wifi_passcode_view.c new file mode 100644 index 0000000..c19dd16 --- /dev/null +++ b/ug/network/src/wifi_passcode_view.c @@ -0,0 +1,973 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "i18n.h" +#include "util.h" +#include "common.h" +#include "wifi_passcode_view.h" +#include "util.h" +#include "wifi_mgr.h" + +#define KEY_PRIV "priv" +#define KEY_NETWORK_ENTER "Select" + +#define AP_NAME_LENTH 256 + +#define TXT_PASSCODE "Network passcode" +#define TXT_ENTER_PASSCODE "Enter the network password" + +#define STYLE_ENTRY_FOCUS "focus" +#define STYLE_ENTRY_TXT "DEFAULT='font_size=30 linesize=40'" + +struct _priv { + Evas_Object *win; + ui_gadget_h ug; + struct viewmgr *vmgr; + Evas_Object *base; + Evas_Object *entry; + Evas_Object *dim_ly; + Evas_Object *ctxpopup; + char ap_name[AP_NAME_LENTH + 1]; + char *ap_pwd; +}; + +static int _wifi_connect_ap(struct _priv *priv); +static void _show_confirm_popup(struct _priv *priv); +static void _show_progress_popup(struct _priv *priv); + +/** + * Initializes the private data. + * + * Called when the view is loaded. + * + * @return the handler of the private data; + */ +static struct _priv *_init_priv(void) +{ + struct _priv *priv; + + priv = calloc(1, sizeof(*priv)); + + return priv; +} + +/** + * Deinitializes the private data. + * + * Called when the view is deleted. + * + * @param[in] priv The handler of the private data + */ +static void _fini_priv(struct _priv *priv) +{ + if (!priv) { + _ERR("priv is already NULL."); + return; + } + + if (priv->dim_ly) + evas_object_del(priv->dim_ly); + + free(priv->ap_pwd); + free(priv); +} + +/** + * Shows the dim layout. + * + * Called when there is a ctxpopup. + * + * @param[in] priv The handler of the private data + */ +static void _set_layout_dim(struct _priv *priv) +{ + if (!priv || !priv->dim_ly) { + _ERR("The param is invalid.\n"); + return; + } + + evas_object_show(priv->dim_ly); +} + +/** + * Hides the dim layout. + * + * Called when the existing ctxpopup is deleted. + * + * @param[in] priv The handler of the private data + */ +static void _unset_layout_dim(struct _priv *priv) +{ + if (!priv || !priv->dim_ly) { + _ERR("The param is invalid.\n"); + return; + } + + evas_object_hide(priv->dim_ly); +} + +/** + * Creates the dim layout. + * + * Called when the view is created. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_dim_layout(struct _priv *priv) +{ + Evas_Object *dim_ly; + + if (!priv || !priv->win) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + dim_ly = util_add_layout(priv->win, UG_NETWORK_EDJ_FILE, GRP_DIM_LY); + if (!dim_ly) { + _ERR("elm_layout_add() failed.\n"); + return RET_FAILED; + } + + priv->dim_ly = dim_ly; + + _unset_layout_dim(priv); + + return RET_SUCCESS; +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, delete this view. + * + * @param[in] data User data + * @param[in] e Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _base_key_press_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("ei or data is NULL"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) + viewmgr_pop(priv->vmgr); +} + +/** + * Sets the description. + * + * Sets the description for the passcode view. + * + * @param[in] priv The handler of the private data + */ +static void _set_description(struct _priv *priv) +{ + if (!priv || !priv->base) { + _ERR("priv is invalid."); + return; + } + + elm_object_part_text_set(priv->base, PART_WIFI_PASSCODE_TITLE, + _(TXT_PASSCODE)); + elm_object_part_text_set(priv->base, PART_WIFI_PASSCODE_TEXT, + _(TXT_ENTER_PASSCODE)); + elm_object_part_text_set(priv->base, PART_WIFI_PASSCODE_AP_NAME, + priv->ap_name); +} + +/** +* @Evas_Smart_Cb type callback for handling click event. +* +* When the 'OK' button is clicked, delete the popup, +* and set the default focus. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] event Event information +*/ +static void _popup_ok_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + elm_object_focus_set(priv->entry, EINA_TRUE); +} + +/** +* @Evas_Smart_Cb type callback for handling unfocused event. +* +* When the ctxpopup is unfocused, hide the dim layout, +* and delete the ctxpopup. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] source Event information +*/ +static void _ctxpopup_unfocused_cb(void *data, + Evas_Object *obj, void *source) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("data is NULL.\n"); + return; + } + + priv = data; + + _unset_layout_dim(priv); + + evas_object_del(obj); +} + +/** +* @Evas_Object_Event_Cb type callback for handling pressed event. +* +* When KEY_BACK is pressed in the ctxpopup, delete the ctxpopup. +* +* @param[in] data User data +* @param[in] e Evas handler +* @param[in] obj The corresponding object which the deletion event occurred +* @param[in] ei Event information +*/ +static void _ctxpopup_pressed_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!data || !ei || !obj) { + _ERR("Parameter error!"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + _unset_layout_dim(priv); + evas_object_del(obj); + + elm_object_focus_set(priv->entry, EINA_TRUE); + } +} + +/** + * Shows the invalid ctxpopup. + * + * The ctxpopup will show the invalid passcode information. + * + * @param[in] priv The handler of the private data + */ +static void _show_invalid_pwd_popup(struct _priv *priv) +{ + Evas_Object *layout; + Evas_Object *ok_btn; + Evas_Coord w; + Evas_Coord h; + char content[CONTENT_TXT_SIZE]; + + if (!priv) { + _ERR("The param is NULL.\n"); + return; + } + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + _set_layout_dim(priv); + + layout = util_add_layout(priv->base, UG_NETWORK_EDJ_FILE, + GRP_CONFIRM_LAYOUT); + if (!layout) { + _ERR("add layout failed."); + _unset_layout_dim(priv); + return; + } + + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRELESS_LY)); + + memset(content, 0, CONTENT_TXT_SIZE); + snprintf(content, CONTENT_TXT_SIZE - 1, "%s", + _(TXT_INVALID_PWD)); + elm_object_part_text_set(layout, + PART_TEXT_CONTENT, content); + + ok_btn = util_add_button(layout, STYLE_SETTING_BTN, + PART_OK_BTN, _(TXT_OK)); + if (!ok_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + elm_object_focus_next_object_set(ok_btn, ok_btn, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(ok_btn, ok_btn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(ok_btn, ok_btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(ok_btn, ok_btn, ELM_FOCUS_DOWN); + evas_object_smart_callback_add(ok_btn, SIG_CLICKED, + _popup_ok_btn_clicked_cb, priv); + + elm_object_focus_set(ok_btn, EINA_TRUE); + + elm_object_focus_allow_set(layout, EINA_TRUE); + evas_object_smart_callback_add(layout, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _ctxpopup_pressed_cb, priv); + + w = 0; + h = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_move(layout, CENTER_ALIGN * (w - POPUP_WIDTH) * ELM_SCALE, + CENTER_ALIGN * (h - POPUP_HEIGHT) * ELM_SCALE); + + priv->ctxpopup = layout; +} + +/** +* @Evas_Smart_Cb type callback for handling clicking event. +* +* When the 'Retry' button is clicked, retry to connect the ap. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] event Event information +*/ +static void _retry_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + int ret; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + _unset_layout_dim(priv); + + ret = _wifi_connect_ap(priv); + if (ret != RET_SUCCESS) { + _ERR("connect ap"); + _show_confirm_popup(priv); + return; + } +} + +/** +* @Evas_Smart_Cb type callback for handling clicking event. +* +* When the 'Cancel' button is clicked, delete the ctxpopup +* where the button is located. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] event Event information +*/ +static void _cancel_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + _unset_layout_dim(priv); + + elm_object_focus_set(priv->entry, EINA_TRUE); +} + +/** + * Shows the confirm ctxpopup. + * + * The ctxpopup will show the result of connectting the ap. + * + * @param[in] priv The handler of the private data + */ +static void _show_confirm_popup(struct _priv *priv) +{ + Evas_Object *layout; + Evas_Object *retry_btn; + Evas_Object *cancel_btn; + Evas_Coord w; + Evas_Coord h; + char content[CONTENT_TXT_SIZE]; + + if (!priv) { + _ERR("the param is NULL."); + return; + } + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + _set_layout_dim(priv); + + layout = util_add_layout(priv->base, UG_NETWORK_EDJ_FILE, + GRP_CONFIRM_LAYOUT); + if (!layout) { + _ERR("add layout failed."); + _unset_layout_dim(priv); + return; + } + + memset(content, 0, CONTENT_TXT_SIZE); + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRELESS_LY)); + snprintf(content, CONTENT_TXT_SIZE - 1, "%s %s", + _(TXT_FAILED_CONNECT), priv->ap_name); + + elm_object_part_text_set(layout, + PART_TEXT_CONTENT, content); + + retry_btn = util_add_button(layout, STYLE_SETTING_BTN, + PART_RETRY_BTN, _(TXT_RETRY)); + if (!retry_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + cancel_btn = util_add_button(layout, STYLE_SETTING_BTN, + PART_CANCEL_BTN, _(TXT_CANCEL)); + if (!cancel_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + elm_object_focus_next_object_set(retry_btn, cancel_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(cancel_btn, retry_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(retry_btn, retry_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(retry_btn, retry_btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(retry_btn, retry_btn, + ELM_FOCUS_DOWN); + + evas_object_smart_callback_add(retry_btn, SIG_CLICKED, + _retry_btn_clicked_cb, priv); + evas_object_smart_callback_add(cancel_btn, SIG_CLICKED, + _cancel_btn_clicked_cb, priv); + + elm_object_focus_set(retry_btn, EINA_TRUE); + + elm_object_focus_allow_set(layout, EINA_TRUE); + evas_object_smart_callback_add(layout, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _ctxpopup_pressed_cb, priv); + + w = 0; + h = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_move(layout, CENTER_ALIGN * (w - POPUP_WIDTH) * ELM_SCALE, + CENTER_ALIGN * (h - POPUP_HEIGHT) * ELM_SCALE); + + priv->ctxpopup = layout; +} + +/** + * Shows the progress ctxpopup. + * + * The ctxpopup will show the progress of connectting the ap. + * + * @param[in] priv The handler of the private data + */ +static void _show_progress_popup(struct _priv *priv) +{ + Evas_Object *layout; + Evas_Object *cancel_btn; + Evas_Coord w; + Evas_Coord h; + char content[CONTENT_TXT_SIZE]; + + if (!priv) { + _ERR("the param is NULL."); + return; + } + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + _set_layout_dim(priv); + + layout = util_add_layout(priv->base, UG_NETWORK_EDJ_FILE, + GRP_PROCESSING_LAYOUT); + if (!layout) { + _ERR("add layout failed."); + _unset_layout_dim(priv); + return; + } + + memset(content, 0, CONTENT_TXT_SIZE); + elm_object_part_text_set(layout, + PART_TEXT_TITLE, _(TXT_WIRELESS_LY)); + snprintf(content, CONTENT_TXT_SIZE - 1, "%s %s", + _(TXT_CONNECTTING), priv->ap_name); + elm_object_part_text_set(layout, PART_TEXT_CONTENT, content); + + cancel_btn = util_add_button(layout, STYLE_SETTING_BTN, + PART_CANCEL_BTN, _(TXT_CANCEL)); + if (!cancel_btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_UP); + elm_object_focus_next_object_set(cancel_btn, cancel_btn, + ELM_FOCUS_DOWN); + + evas_object_smart_callback_add(cancel_btn, SIG_CLICKED, + _cancel_btn_clicked_cb, priv); + + elm_object_focus_set(cancel_btn, EINA_TRUE); + + elm_object_focus_allow_set(layout, EINA_TRUE); + evas_object_smart_callback_add(layout, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _ctxpopup_pressed_cb, priv); + + w = 0; + h = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_move(layout, CENTER_ALIGN * (w - POPUP_WIDTH) * ELM_SCALE, + CENTER_ALIGN * (h - POPUP_HEIGHT) * ELM_SCALE); + + priv->ctxpopup = layout; +} + +/** + * The callback of wifi connection. + * + * The result is in the error code. + * + * @param[in] error_code Error code + * @param[in] user_data User data + */ +static void _wifi_connected_cb(wifi_error_e error_code, void *user_data) +{ + struct _priv *priv; + + if (!user_data) { + _ERR("Parameter error!"); + return; + } + + priv = user_data; + + if (!priv->ctxpopup) + return; + + if (error_code != WIFI_ERROR_NONE) { + _ERR("connect AP failed, ret: %s.", + wifi_mgr_error_dbg(error_code)); + _show_confirm_popup(priv); + return; + } + + ug_destroy_me(priv->ug); +} + +/** + * The callback of finding ap. + * + * The callback will be called the same times as the ap count. + * + * @param[in] ap The hander of ap + * @param[in] data User data + */ +static bool _wifi_found_ap_cb(wifi_ap_h ap, void *data) +{ + int ret; + struct _priv *priv; + struct wifi_ap_info ap_info; + + if (!ap || !data) { + _ERR("Parameter error!"); + return false; + } + + priv = data; + + wifi_mgr_get_ap_info(ap, &ap_info); + + if (!strncmp(priv->ap_name, ap_info.essid, AP_NAME_LENTH)) { + ret = wifi_mgr_set_passphrase(ap, priv->ap_pwd); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_set_passphrase() failed."); + _show_confirm_popup(priv); + return false; + } + + ret = wifi_mgr_connect(ap, _wifi_connected_cb, priv); + if (ret != RET_SUCCESS) { + _ERR("Fail to connection request.\n"); + _show_confirm_popup(priv); + return false; + } + + return false; + } + + return true; +} + +/** + * The callback of ap scanning request. + * + * The callback will be called the same times as the ap count. + * + * @param[in] error_code Error code + * @param[in] data User data + */ +static void _wifi_scan_request_cb(wifi_error_e error_code, void *data) +{ + int ret; + + if (!data) { + _ERR("data is NULL."); + return; + } + + ret = wifi_mgr_foreach_found_aps(_wifi_found_ap_cb, data); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_foreach_found_aps() failed."); + _show_confirm_popup(data); + return; + } +} + +/** + * Connects the ap. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _wifi_connect_ap(struct _priv *priv) +{ + int ret; + + if (!priv || !priv->ap_pwd) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + _show_progress_popup(priv); + + ret = wifi_mgr_forget_last_ap(); + if (ret != RET_SUCCESS) { + _ERR("forget last ap failed."); + return false; + } + + ret = wifi_mgr_scan_request(_wifi_scan_request_cb, priv); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_scan_request() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Callback for key pressed event. + * + * If the key is 'Select', connect the ap. + * + * @param[in] data User data + * @param[in] e Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _entry_key_press_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + int ret; + + if (!ei || !data) { + _ERR("ei or data is NULL"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_NETWORK_ENTER)) { + if (priv->ap_pwd) { + free(priv->ap_pwd); + priv->ap_pwd = NULL; + } + + priv->ap_pwd = strdup(elm_entry_entry_get(obj)); + if (!priv->ap_pwd) { + _ERR("the passcode in entry is NULL."); + _show_invalid_pwd_popup(priv); + return; + } + + ret = _wifi_connect_ap(priv); + if (ret != RET_SUCCESS) { + _ERR("connect ap"); + _show_confirm_popup(priv); + return; + } + } +} + +/** + * Creates the entry. + * + * @param[in] priv The handler of the private data + */ +static void _add_entry(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *entry; + + if (!priv || !priv->base) { + _ERR("the param is invalid."); + return; + } + + base = priv->base; + + entry = util_add_entry(base, STYLE_ENTRY_FOCUS, + PART_WIFI_PASSCODE_ENTRY); + if (!entry) { + _ERR("util_add_entry failed."); + evas_object_del(base); + _fini_priv(priv); + return; + } + + elm_entry_password_set(entry, EINA_TRUE); + elm_entry_text_style_user_push(entry, STYLE_ENTRY_TXT); + evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN, + _entry_key_press_cb, priv); + + elm_entry_input_panel_enabled_set(entry, EINA_TRUE); + + elm_object_focus_next_object_set(entry, entry, ELM_FOCUS_UP); + elm_object_focus_next_object_set(entry, entry, ELM_FOCUS_LEFT); + + elm_object_focus_set(entry, EINA_TRUE); + + priv->entry = entry; +} + +/** + * Creates the layout of the view. + * + * Called when the view is pushed. + * + * @param[in] vmgr View manager + * @param[in] data User data + * @return layout if the operation is successful; NULL if failed; + */ +static Evas_Object *_create(struct viewmgr *vmgr, void *data) +{ + struct _priv *priv; + struct wifi_ap_info *ap_info; + Evas_Object *base; + + if (!vmgr || !vmgr->win || !vmgr->ug || !data) { + _ERR("Parameter error!"); + return NULL; + } + + priv = _init_priv(); + if (!priv) { + _ERR("init priv failed."); + return NULL; + } + + priv->win = vmgr->win; + priv->ug = vmgr->ug; + priv->vmgr = vmgr; + + ap_info = data; + strncpy(priv->ap_name, ap_info->essid, AP_NAME_LENTH); + + base = util_add_layout(priv->win, UG_NETWORK_EDJ_FILE, + GRP_WIFI_PASSCODE_BASE); + if (!base) { + _ERR("util_add_layout failed."); + _fini_priv(priv); + return NULL; + } + + evas_object_data_set(base, KEY_PRIV, priv); + + evas_object_event_callback_add(base, EVAS_CALLBACK_KEY_DOWN, + _base_key_press_cb, priv); + + priv->base = base; + + _set_description(priv); + + _add_entry(priv); + + _create_dim_layout(priv); + + return base; +} + +/** + * Destroies the layout of the view. + * + * Called when the view is popped. + * + * @param[in] base The base layout + */ +static void _destroy(Evas_Object *base) +{ + struct _priv *priv; + + if (!base) { + _ERR("Parameter error!"); + return; + } + + priv = evas_object_data_get(base, KEY_PRIV); + if (!priv) + return; + + _fini_priv(priv); +} + +/** + * Gets the current view type. + * + * @return view type; + */ +static enum view_type _get_view_type(void) +{ + return NETWORK_WIFI_PASSCODE_VIEW; +} + + +static struct view_class _vclass = { + .create = _create, + .resume = NULL, + .terminate = _destroy, + .message_handler = NULL, + .get_view_type = _get_view_type, +}; + +/** + * Gets the current view class. + * + * @return view class; + */ +struct view_class *wifi_passcode_view_vclass_get(void) +{ + return &_vclass; +} diff --git a/ug/proxy/CMakeLists.txt b/ug/proxy/CMakeLists.txt new file mode 100644 index 0000000..65d0441 --- /dev/null +++ b/ug/proxy/CMakeLists.txt @@ -0,0 +1,72 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(ug-proxy-settings C) +SET(PROJECT_NAME ug-proxy-settings) + +SET(PREFIX "/usr/ug") + +IF(NOT DEFINED UGLIBDIR) + SET(UGLIBDIR "/usr/ug/lib") +ENDIF(NOT DEFINED UGLIBDIR) + +IF(NOT DEFINED UG_PROXY_EDJE_DIR) + SET(UG_PROXY_EDJE_DIR "${PREFIX}/res/edje/${PROJECT_NAME}") +ENDIF(NOT DEFINED UG_PROXY_EDJE_DIR) + +IF(NOT DEFINED VERSION) + SET(VERSION 0.1) +ENDIF(NOT DEFINED VERSION) + +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_C_FLAGS_RELEASE "-O2") + +SET(UG_PROXY_EDJ_FILE "ug-proxy-settings.edj") +SET(UG_PROXY_EDJ_THEME "ug-proxy-settings-theme.edj") + +INCLUDE(FindPkgConfig) +pkg_check_modules(UG_PROXY_PKGS REQUIRED + dlog + eina + edje + ecore-x + evas + elementary + utilX x11 + aul + x11 + glib-2.0 + ui-gadget-1 + vconf + capi-appfw-application + capi-network-wifi + capi-network-connection +) +SET(PKGS_LDFLAGS "${PKGS_LDFLAGS} ${UG_PROXY_PKGS_LDFLAGS}") + +FOREACH(FLAG ${UG_PROXY_PKGS_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${FLAG}") +ENDFOREACH(FLAG) +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fvisibility=hidden -Wall -Werror") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}") + +SET(SRCS + src/ug_proxy_settings.c + src/main_view.c + src/vconf_mgr.c + src/connection_mgr.c + src/wifi_mgr.c + src/util.c +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) +ADD_DEFINITIONS("-DPKGNAME=\"${PROJECT_NAME}\"") + +ADD_DEFINITIONS("-DUG_PROXY_EDJ_FILE=\"${UG_PROXY_EDJE_DIR}/${UG_PROXY_EDJ_FILE}\"") +ADD_DEFINITIONS("-DUG_PROXY_EDJ_THEME=\"${UG_PROXY_EDJE_DIR}/${UG_PROXY_EDJ_THEME}\"") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${UG_PROXY_PKGS_LDFLAGS}) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${UGLIBDIR}) + +ADD_SUBDIRECTORY(edje) diff --git a/ug/proxy/edje/CMakeLists.txt b/ug/proxy/edje/CMakeLists.txt new file mode 100644 index 0000000..ca3a0e1 --- /dev/null +++ b/ug/proxy/edje/CMakeLists.txt @@ -0,0 +1,14 @@ +ADD_CUSTOM_TARGET(${UG_PROXY_EDJ_FILE} COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.edc + ${CMAKE_CURRENT_BINARY_DIR}/${UG_PROXY_EDJ_FILE} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.edc ) + ADD_DEPENDENCIES(${PROJECT_NAME} ${UG_PROXY_EDJ_FILE}) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${UG_PROXY_EDJ_FILE} DESTINATION ${UG_PROXY_EDJE_DIR}) + +ADD_CUSTOM_TARGET(${UG_PROXY_EDJ_THEME} COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-theme.edc + ${CMAKE_CURRENT_BINARY_DIR}/${UG_PROXY_EDJ_THEME} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-theme.edc ) + ADD_DEPENDENCIES(${PROJECT_NAME} ${UG_PROXY_EDJ_THEME}) + +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${UG_PROXY_EDJ_THEME} DESTINATION ${UG_PROXY_EDJE_DIR}) diff --git a/ug/proxy/edje/images/ico_dropdown_menu_check.png b/ug/proxy/edje/images/ico_dropdown_menu_check.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7d114640bde4abbaac4165a1829ca15854f039 GIT binary patch literal 17850 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 literal 0 HcmV?d00001 diff --git a/ug/proxy/edje/images/ico_spincontrol_down.png b/ug/proxy/edje/images/ico_spincontrol_down.png new file mode 100644 index 0000000000000000000000000000000000000000..fbeb94b1ec136d4734be1fcae979b1f27d822deb GIT binary patch literal 17890 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 Z?A^PZanHR#792U?V6)mf-)i&je*=kyrUd{1 literal 0 HcmV?d00001 diff --git a/ug/proxy/edje/images/ico_spincontrol_up.png b/ug/proxy/edje/images/ico_spincontrol_up.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b25873540507e3accfe8b0a377d73872511cb0 GIT binary patch literal 17871 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
ttCU`0i(bule2)4xmZYY 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 literal 0 HcmV?d00001 diff --git a/ug/proxy/edje/images/round_rectangle_8X8_top.png b/ug/proxy/edje/images/round_rectangle_8X8_top.png new file mode 100644 index 0000000000000000000000000000000000000000..dc618e3e557c474f8d3650f87230b2b2c31e2df5 GIT binary patch literal 17774 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 Mjf-`WmG92~0w%OV literal 0 HcmV?d00001 diff --git a/ug/proxy/edje/ug-proxy-settings-theme.edc b/ug/proxy/edje/ug-proxy-settings-theme.edc new file mode 100644 index 0000000..9a5cd8b --- /dev/null +++ b/ug/proxy/edje/ug-proxy-settings-theme.edc @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/defs.h" + +collections { + #include "widgets/button.edc" +} diff --git a/ug/proxy/edje/ug-proxy-settings.edc b/ug/proxy/edje/ug-proxy-settings.edc new file mode 100644 index 0000000..c42628e --- /dev/null +++ b/ug/proxy/edje/ug-proxy-settings.edc @@ -0,0 +1,711 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/defs.h" + +collections { + group { + name: GRP_MAIN_VIEW; + styles { + style { + name: "textblock_style"; + base: "font=Tizen Sans font_size=24 align=left color=#ffffff wrap=word"; + tag: "br" "\n"; + } + } + parts { + part { + name: "padding_left_top"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2.relative: 0 0; + fixed: 1 1; + align: 0.0 0.0; + min: (434+102.5*2+19) (208+43*2); + visible: 0; + } + } + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_left_top"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_left_top"; + } + align: 0.0 0.0; + min: 1076 698; + fixed: 1 1; + visible: 0; + } + } + part { + name: "title.description.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 70 50; + } + } + part { + name: PART_PROXY_DESCRITION; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + fixed: 1 1; + rel1 { + to: "title.description.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "title.description.pad"; + offset: 936 60; + } + color: 255 255 255 166; + text { + style: "textblock_style"; + } + } + } + part { + name: "proxy.setting.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 70 160; + } + } + + part { + name: "proxy_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: PART_PROXY_SETTING; + rel2.to: PART_PROXY_SETTING; + color: 222 222 222 255; + } + } + + part { + name: PART_PROXY_SETTING; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "proxy.setting.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "proxy.setting.pad"; + offset: 680 0; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "ok.btn.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_PROXY_SETTING; + relative: 1.0 0.0; + } + rel2 { + to: PART_PROXY_SETTING; + relative: 1.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 40 0; + } + } + part { + name: PART_OK_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "ok.btn.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "ok.btn.pad"; + relative: 1.0 1.0; + offset: 216 70; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "cancel.btn.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_OK_BTN; + relative: 0.0 1.0; + } + rel2 { + to: PART_OK_BTN; + relative: 0.0 1.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 0 10; + } + } + part { + name: PART_CANCEL_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "cancel.btn.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "cancel.btn.pad"; + relative: 1.0 1.0; + offset: 216 70; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + } + } + + group { + name: GRP_METHOD_SETTING; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 382 244; + color: 0 0 0 127; + } + } + part { + name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + } + fixed: 1 1; + } + } + } + } + + group { + name: GRP_DIM_LY; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.0; + min: 1920 1080; + color: 0 0 0 122; + } + } + } + } + + group { + name: GRP_PROXY_VALUE_SETTING; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 478 122; + color: 222 222 222 255; + } + } + part { + name: "ip1.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 0.0 0.0; + to: bg; + } + rel2 { + relative: 0.0 0.0; + to: bg; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_IP_FIRST; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "ip1.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "ip1.pad"; + } + fixed: 1 1; + min: 118 122; + align: 0.0 0.0; + } + } + part { + name: "seperator1"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to: PART_IP_FIRST; + } + rel2 { + relative: 1.0 0.0; + to: PART_IP_FIRST; + } + align: 0.0 0.0; + fixed: 1 1; + min: 2 122; + color: 128 128 128 38; + } + } + part { + name: PART_IP_SECOND; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "seperator1"; + relative: 1.0 0.0; + } + rel2 { + to: "seperator1"; + relative: 1.0 0.0; + } + fixed: 1 1; + min: 118 122; + align: 0.0 0.0; + } + } + part { + name: "seperator2"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to: PART_IP_SECOND; + } + rel2 { + relative: 1.0 0.0; + to: PART_IP_SECOND; + } + align: 0.0 0.0; + fixed: 1 1; + min: 2 122; + color: 128 128 128 38; + } + } + part { + name: PART_IP_THIRD; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "seperator2"; + relative: 1.0 0.0; + } + rel2 { + to: "seperator2"; + relative: 1.0 0.0; + } + fixed: 1 1; + min: 118 122; + align: 0.0 0.0; + } + } + part { + name: "seperator3"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + relative: 1.0 0.0; + to: PART_IP_THIRD; + } + rel2 { + relative: 1.0 0.0; + to: PART_IP_THIRD; + } + align: 0.0 0.0; + fixed: 1 1; + min: 2 122; + color: 128 128 128 38; + } + } + part { + name: PART_IP_FORTH; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "seperator3"; + relative: 1.0 0.0; + } + rel2 { + to: "seperator3"; + relative: 1.0 0.0; + } + fixed: 1 1; + min: 118 122; + align: 0.0 0.0; + } + } + } + } + + group { + name: GRP_CONFIRM_LAYOUT; + images{ + image: "modal_dialogs_bg.png" COMP; + image: "round_rectangle_8X8_top.png" COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 688 411; + image { + normal: "modal_dialogs_bg.png"; + border: 80 80 40 40; + } + } + } + part { + name: "title_bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + offset: 7 2; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + offset: 7 2; + } + min: 674 84; + image { + normal: "round_rectangle_8X8_top.png"; + border: 8 8 8 8; + } + color: 42 76 130 255; + } + } + part { + name: "title_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + visible: 0; + } + } + part { + name: PART_TEXT_TITLE; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 688 84; + fixed: 1 1; + rel1 { + to: "title_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "title_padding"; + } + color: 255 255 255 255; + align: 0.0 0.0; + text { + font: "Tizen Sans:style=Medium"; + size: 30; + } + } + } + part { + name: "content_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + min: 73 181; + visible: 0; + } + } + part { + name: PART_TEXT_CONTENT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 542 33; + fixed: 1 1; + rel1 { + to: "content_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "content_padding"; + } + color: 61 61 61 255; + align: 0.0 0.0; + text { + font: "Tizen Sans:style=Medium"; + size: 28; + } + } + } + part { + name: "ok_btn_padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + min: 236 303; + fixed: 1 1; + } + } + part { + name: PART_OK_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "ok_btn_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "ok_btn_padding"; + } + align: 0.0 0.0; + min: 216 70; + fixed: 1 1; + } + } + } + } + + group { + name: GRP_ENTRY_POPUP; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 204; + } + } + part { + name: "entrybg_pad"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 376; + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + } + } + part { + name: "entrybg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1920 1080-376; + fixed: 1 1; + align: 0.0 0.0; + rel1 { + to: "entrybg_pad"; + relative: 1.0 1.0; + } + rel2 { + to: "bg"; + } + color: 42 50 64 255; + } + } + part { + name: "entry_pad"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 160 90; + fixed: 1 1; + align: 0.0 0.0; + visible: 0; + rel1 { + to: "entrybg"; + } + rel2{ + to: "entrybg"; + relative: 0.0 0.0; + } + } + } + part { + name: PART_ENTRY; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 1600 100; + fixed: 1 1; + align: 0.0 0.0; + rel1 { + to: "entry_pad"; + relative: 1.0 1.0; + } + rel2 { + to: "entry_pad"; + } + } + } + } + } +} diff --git a/ug/proxy/edje/widgets/button.edc b/ug/proxy/edje/widgets/button.edc new file mode 100644 index 0000000..1ebc19d --- /dev/null +++ b/ug/proxy/edje/widgets/button.edc @@ -0,0 +1,1407 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../include/defs.h" + +group { + name: "elm/button/base/basic_btn_style"; + images { + image: "round_rectangle_4X4.png" COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 216 70; + image { + normal: "round_rectangle_4X4.png"; + border: 4 4 4 4; + border_scale: 1; + } + color: 204 204 204 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 204 204 204 102; + } + } + part { + name: "bg_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 176 70; + rel1 { + to: "bg_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "bg_text_padding"; + relative: 1.0 1.0; + } + text { + size: 28; + align: 0.5 0.5; + } + color: 89 89 89 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 102; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "dim" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + } +} + +group { + name: "elm/button/base/key_value_btn"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + min: 680 80; + visible: 0; + } + } + part { + name: "shine"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2.to: "bg"; + color: 255 255 255 255; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: PART_KEY; + type: TEXT; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 40/680 0.0; + } + rel2 { + to: "bg"; + relative: 290/680 1.0; + } + color: 89 89 89 255; + text { + font: "Tizen:style=Medium"; + size: 30; + align: 0.0 0.5; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Bold"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 76; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Bold"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + } + part { + name: PART_VALUE; + type: TEXT; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "bg"; + rel2 { + to: "bg"; + relative: 640/680 1.0; + } + color: 89 89 89 255; + text { + font: "Tizen:style=Regular"; + size: 30; + align: 1.0 0.5; + } + align: 1.0 1.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Bold"; + size: 30; + align: 1.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Regular"; + size: 30; + align: 1.0 0.5; + } + color: 89 89 89 76; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Regular"; + size: 30; + align: 1.0 0.5; + } + color: 89 89 89 76; + } + } + part { + name: "line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 1.0; + } + rel2 { + to: "bg"; + relative: 0.0 1.0; + } + visible: 1; + min: 680 2; + align: 0.0 0.0; + fixed: 1 1; + color: 0 0 0 252/10; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + max: 0 0; + visible: 0; + } + } + part { + name: "over2"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "clipper"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "dim" 0.0; + target: PART_KEY; + target: PART_VALUE; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: PART_KEY; + target: PART_VALUE; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: PART_KEY; + target: PART_VALUE; + target: "shine"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:PART_KEY, st, 30, vl); + if(!strcmp(st, "selected")) + { + } else + { + set_state(PART:PART_KEY, "default", 0.0); + set_state(PART:PART_VALUE, "default", 0.0); + set_state(PART:"shine", "default", 0.0); + } + } + } + program { + name: "button_selected"; + signal: SIG_BTN_SELECTED; + source: PROG; + action: STATE_SET "selected" 0.0; + target: PART_KEY; + target: PART_VALUE; + target: "shine"; + } + program { + name: "hide_bottom_line"; + signal: SIG_HIDE_BOTTOME_LINE; + source: PROG; + action: STATE_SET "hide" 0.0; + target: "line"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: PART_KEY; + target: PART_VALUE; + target: "shine"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focus" 0.0; + target: PART_KEY; + target: PART_VALUE; + target: "shine"; + } + } +} + +group { + name: "elm/button/base/key_value_two_lines"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + min: 680 160; + visible: 0; + } + } + part { + name: "shine"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.5; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + rel1.to: "bg"; + rel2.to: "bg"; + color: 255 255 255 255; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: PART_KEY; + type: TEXT; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 40/680 0.0; + } + rel2 { + to: "bg"; + relative: 1.0 0.5; + } + color: 89 89 89 255; + text { + font: "Tizen Sans:style=Medium"; + size: 30; + align: 0.0 0.5; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen Sans:style=Bold"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 76; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen Sans:style=Bold"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + } + part { + name: PART_VALUE; + type: TEXT; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 40/680 0.5; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + color: 89 89 89 255; + text { + font: "Tizen Sans:style=Regular"; + size: 30; + align: 0.0 0.5; + } + align: 1.0 1.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen Sans:style=Bold"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen Sans:style=Regular"; + size: 30; + align: 1.0 0.5; + } + color: 89 89 89 76; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen Sans:style=Regular"; + size: 30; + align: 1.0 0.5; + } + color: 89 89 89 76; + } + } + part { + name: "over2"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + } + part { + name: "clipper"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "dim" 0.0; + target: PART_VALUE; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: PART_VALUE; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: PART_VALUE; + target: "shine"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + new st[31]; + new Float:vl; + get_state(PART:PART_VALUE, st, 30, vl); + if(strcmp(st, "selected") != 0) + { + set_state(PART:PART_VALUE, "default", 0.0); + set_state(PART:"shine", "default", 0.0); + } + } + } + program { + name: "button_selected"; + signal: SIG_BTN_SELECTED; + source: PROG; + action: STATE_SET "selected" 0.0; + target: PART_VALUE; + target: "shine"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: PART_VALUE; + target: "shine"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focus" 0.0; + target: PART_VALUE; + target: "shine"; + } + } +} + +group { + name: "elm/button/base/method_select"; + images { + image: "ico_dropdown_menu_check.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + color: 255 255 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to : "bg"; + relative: 32/382 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text"; + relative: 1.0 1.0; + } + rel2 { + to: "bg"; + relative: 312/382 1.0; + } + color: 89 89 89 255; + text { + font: "Tizen:style=Regular"; + size: 30; + align: 0.0 0.5; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Medium"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "focused_selected" 0.0; + inherit: "focused" 0.0; + } + } + part { + name: "padding_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "elm.text"; + relative: 1.0 0.0; + } + rel2 { + to : "elm.text"; + relative: 1.0 0.0; + } + fixed: 1 1; + visible: 0; + min: 20 28; + align: 0.0 0.0; + } + } + part { + name: "icon.selected"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_dropdown_menu_check.png"; + } + rel1 { + to: "padding_icon"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_icon"; + relative: 1.0 1.0; + } + min: 26 26; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + visible: 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + visible: 1; + } + description { + state: "focused_selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + } + part { + name: "over2"; + type: RECT; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1.to: bg; + rel2.to: bg; + color: 0 0 0 0; + } + } + part { + name: "clipper"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "Mouse_In"; + signal: "mouse,in"; + source: "over2"; + } + program { + name: "Mouse_Out"; + signal: "mouse,out"; + source: "over2"; + } + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + + program { + name: "key_press"; + signal: "elm,action,pressed"; source: "elm"; + } + + program { + name: "key_unpress"; + signal: "elm,action,unpressed"; source: "elm"; + } + + program { + name: "button_click1"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "click_state_set"; + signal: SIG_BTN_SELECTED; + source: PROG; + script { + new st1[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + if (!strcmp(st1, "default")) + { + set_state(PART:"elm.text", "selected", 0.0); + set_state(PART:"icon.selected", "selected", 0.0); + } else if(!strcmp(st1, "focused")) + { + set_state(PART:"elm.text", "focused_selected", 0.0); + set_state(PART:"icon.selected", "focused_selected", 0.0); + } + } + } + program { + name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + new st1[31]; + new st2[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + set_state(PART:"bg", "focused", 0.0); + if (!strcmp(st1, "default")) + { + set_state(PART:"elm.text", "focused", 0.0); + } else if(!strcmp(st1, "selected")) + { + set_state(PART:"elm.text", "focused_selected", 0.0); + } + + get_state(PART:"icon.selected", st2, 30, vl); + if(!strcmp(st2, "selected")) + { + set_state(PART:"icon.selected", "focused_selected", 0.0); + } else if(!strcmp(st2, "default")) + { + set_state(PART:"icon.selected", "focused", 0.0); + } + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + script { + new st1[31]; + new st2[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + set_state(PART:"bg", "default", 0.0); + if (!strcmp(st1, "focused")) + { + set_state(PART:"elm.text", "default", 0.0); + } else if(!strcmp(st1, "focused_selected")) + { + set_state(PART:"elm.text", "selected", 0.0); + } + + get_state(PART:"icon.selected", st2, 30, vl); + if(!strcmp(st2, "focused_selected")) + { + set_state(PART:"icon.selected", "selected", 0.0); + } else if(!strcmp(st2, "focused")) + { + set_state(PART:"icon.selected", "default", 0.0); + } + } + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "icon.selected"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + target: "icon.selected"; + } + } +} + +group { + name: "elm/button/base/value_set_btn"; + images { + image: "ico_spincontrol_down.png" COMP; + image: "ico_spincontrol_up.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 118 122; + color: 255 255 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "padding_up_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg; + relative: 0.0 0.0; + } + rel2 { + to: bg; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + min: 42 0; + } + } + part { + name: "up_icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_spincontrol_up.png"; + } + rel1 { + to: "padding_up_icon"; + relative: 1.0 0.0; + } + rel2 { + to: "padding_up_icon"; + relative: 1.0 0.0; + } + min: 35 17; + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg; + relative: 0.0 0.0; + } + rel2 { + to: bg; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + min: 0 17; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + effect: SHADOW BOTTOM; + clip_to: clipper; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_text"; + relative: 1.0 1.0; + } + min: 118 88; + color: 69 143 255 255; + text { + font: "Tizen:style=Bold"; + size: 30; + align: 0.5 0.5; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "padding_down_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: bg; + relative: 0.0 0.0; + } + rel2 { + to: bg; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + min: 42 105; + } + } + part { + name: "down_icon"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_spincontrol_down.png"; + } + rel1 { + to: "padding_down_icon"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_down_icon"; + relative: 1.0 1.0; + } + min: 35 17; + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "over2"; + type: RECT; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + rel1.to: bg; + rel2.to: bg; + color: 0 0 0 0; + } + } + part { + name: "clipper"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "Mouse_In"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "focused" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "Mouse_Out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "button_down"; + signal: "mouse,down,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_click1"; + signal: "mouse,clicked,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_mouseout_clicked"; + signal: "mouse,up,1"; + source: "over2"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focus" 0.0; + target: "elm.text"; + target: "bg"; + target: "up_icon"; + target: "down_icon"; + } + } +} \ No newline at end of file diff --git a/ug/proxy/include/common.h b/ug/proxy/include/common.h new file mode 100644 index 0000000..3f18331 --- /dev/null +++ b/ug/proxy/include/common.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __PROXY_COMMON_H__ +#define __PROXY_COMMON_H__ + +#define MOTHED_STRING_LEN 15 +#define IP_STRING_LEN 15 +#define MOTHED_URL_LEN 100 +#define STRING_MAX_LEN 100 +#define METHOD_NUM 3 + +#define IP_ZERO "0.0.0.0" +#define URL_BLANK "" + +enum method_enum { + METHOD_NONE = 0, + METHOD_MAN, + METHOD_AUTO +}; + +#endif /* __PROXY_COMMON_H__ */ diff --git a/ug/proxy/include/connection_mgr.h b/ug/proxy/include/connection_mgr.h new file mode 100644 index 0000000..acd36a3 --- /dev/null +++ b/ug/proxy/include/connection_mgr.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONNECTION_MGR_H__ +#define __CONNECTION_MGR_H__ + +#include +#include +#include "common.h" + +connection_h connection_mgr_create(void); +int connection_mgr_destroy(connection_h connection); +int connection_mgr_get_profile_info(connection_h connection, + connection_profile_h *out_proflie); +int connection_mgr_set_proxy_type(connection_h connection, + enum method_enum method); +int connection_mgr_get_proxy_type(connection_h connection, + enum method_enum *method); +int connection_mgr_set_proxy_address(connection_h connection, + const char *ip); +int connection_mgr_get_proxy_address(connection_h connection, + char **ip); + +#endif /* __CONNECTION_MGR_H__ */ diff --git a/ug/proxy/include/dbg.h b/ug/proxy/include/dbg.h new file mode 100644 index 0000000..faf282c --- /dev/null +++ b/ug/proxy/include/dbg.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DBG_H__ +#define __DBG_H__ + +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "ug-network-settings" + +#ifndef _ERR +#define _ERR(fmt, args...) (LOGE("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#endif + +#ifndef _DBG +#define _DBG(fmt, args...) (LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#endif + +#ifndef _INFO +#define _INFO(fmt, args...) \ + (LOGI("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#endif + +#endif /* __DBG_H__ */ diff --git a/ug/proxy/include/defs.h b/ug/proxy/include/defs.h new file mode 100644 index 0000000..ea17ad2 --- /dev/null +++ b/ug/proxy/include/defs.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DEFS_H__ +#define __DEFS_H__ + +#define ELM_SCALE elm_config_scale_get() + +#define RET_SUCCESS 0 +#define RET_FAILED -1 +#define RET_IP_INVALID -2 +#define RET_PORT_INVALID -3 +#define RET_VCONF_FAILED -4 +#define RET_WIRED_PROXY_FAILED -5 +#define RET_WIRELESS_PROXY_FAILED -6 + +/*SIGNAL*/ +#define PROG "prog" +#define ELM "elm" +#define SIG_CLICKED "clicked" +#define SIG_UNFOCUSED "unfocused" +#define SIG_BTN_SELECTED "btn,selected" +#define SIG_STATE_SELECTED "elm,state,selected" +#define SIG_STATE_UNSELECTED "elm,state,unselected" +#define SIG_HIDE_BOTTOME_LINE "btn,hide,line" +#define SIG_DISMISSED "dismissed" + +/*TXT*/ +#define TXT_PROXY_DESCRIPTION "You can set the proxy.
"\ + "Enter the proxy method to use." +#define TXT_OK "OK" +#define TXT_CANCEL "Cancel" +#define TXT_MOTHED "Method" +#define TXT_MOTHED_NONE "None" +#define TXT_MOTHED_MAN "Manual" +#define TXT_MOTHED_AUTO "Automatic" +#define TXT_PROXY_IP "Proxy IP:" +#define TXT_CONFIG_URL "Configuration URL:" +#define TXT_ZERO "0" +#define TXT_COLON ":" +#define TXT_MANUAL_TITLE "Manaul method" +#define TXT_AUTO_TITLE "Auto method" +#define TXT_IP_INVALID "IP is invalid." +#define TXT_PORT_INVALID "Port is invalid." +#define TXT_VCONF_FAILED "Set proxy into proxy failed." +#define TXT_WIRED_FAILED "Set proxy with connection failed." +#define TXT_WIRELESS_FAILED "Set proxy with wifi failed." +#define TXT_WIRED "Wired" + +/*STYLE*/ +#define STYLE_ACTION_BTN "basic_btn_style" +#define STYLE_KEY_VALUE_BTN "key_value_btn" +#define STYLE_KEY_VALUE_TWO_LINES "key_value_two_lines" +#define STYLE_METHOD_SET "method_select" +#define STYLE_VALUE_BTN "value_set_btn" +#define STYLE_ENTRY "focus" + +/*GROUP*/ +#define GRP_MAIN_VIEW "main_view" +#define GRP_METHOD_SETTING "method_setting" +#define GRP_DIM_LY "dim_layout" +#define GRP_PROXY_VALUE_SETTING "proxy_value_setting" +#define GRP_CONFIRM_LAYOUT "confirm_ctxpopup" +#define GRP_ENTRY_POPUP "entry_popup" + +/*PART*/ +#define PART_PROXY_DESCRITION "proxy_description" +#define PART_PROXY_SETTING "proxy_setting_swallow" +#define PART_TXT_SEPERATOR "part_seperator" +#define PART_OK_BTN "ok_btn" +#define PART_CANCEL_BTN "cancel_btn" +#define PART_KEY "part.key" +#define PART_VALUE "part.value" +#define PART_SWALLOW_CONTENT "elm.swallow.content" +#define PART_IP_FIRST "ip.1" +#define PART_IP_SECOND "ip.2" +#define PART_IP_THIRD "ip.3" +#define PART_IP_FORTH "ip.4" +#define PART_PORT "part.port" +#define PART_TEXT_TITLE "title.txt" +#define PART_TEXT_CONTENT "content.txt" +#define PART_ENTRY "part.entry" + +/* Key defines */ +#define KEY_UP "Up" +#define KEY_DOWN "Down" +#define KEY_LEFT "Left" +#define KEY_RIGHT "Right" +#define KEY_ENTER "Return" +#define KEY_EXIT "XF86Close" + +#define KEY_0 "0" +#define KEY_1 "1" +#define KEY_2 "2" +#define KEY_3 "3" +#define KEY_4 "4" +#define KEY_5 "5" +#define KEY_6 "6" +#define KEY_7 "7" +#define KEY_8 "8" +#define KEY_9 "9" + +#endif /* __DEFS_H__ */ diff --git a/ug/proxy/include/i18n.h b/ug/proxy/include/i18n.h new file mode 100644 index 0000000..3e9e19f --- /dev/null +++ b/ug/proxy/include/i18n.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __I18N_H__ +#define __I18N_H__ + +#include + +#define i18n_init() bindtextdomain(PKGNAME, LOCALEDIR) + +#ifdef _ +#undef _ +#endif +#define _(s) gettext(s) +#define dgettext_noop(s) (s) + +#ifdef N_ +#undef N_ +#endif +#define N_(s) dgettext_noop(s) + +#endif /* __I18N_H__ */ diff --git a/ug/proxy/include/main_view.h b/ug/proxy/include/main_view.h new file mode 100644 index 0000000..8f7a1f4 --- /dev/null +++ b/ug/proxy/include/main_view.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MAIN_VIEW_H__ +#define __MAIN_VIEW_H__ + +#include + +Evas_Object *create_main_view(Evas_Object *win, ui_gadget_h ug); +void destroy_main_view(Evas_Object *base); + +#endif /* __MAIN_VIEW_H__ */ diff --git a/ug/proxy/include/util.h b/ug/proxy/include/util.h new file mode 100644 index 0000000..16b0647 --- /dev/null +++ b/ug/proxy/include/util.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UTIL_H__ +#define __UTIL_H__ + +Evas_Object *util_add_layout(Evas_Object *parent, const char *file, + const char *group); +Evas_Object *util_add_button(Evas_Object *parent, const char *style, + const char *part, const char *text); +Evas_Object *util_add_key_value_button(Evas_Object *parent, + const char *style, const char *part, + const char *text_key, const char *text_value); +Evas_Object *util_add_box(Evas_Object *parent, const char *part); +Evas_Object *util_add_entry(Evas_Object *parent, + const char *style, const char *part); +void util_set_focus_next_self(Evas_Object *obj); + +#endif /* __UTIL_H__ */ diff --git a/ug/proxy/include/vconf_mgr.h b/ug/proxy/include/vconf_mgr.h new file mode 100644 index 0000000..363a73a --- /dev/null +++ b/ug/proxy/include/vconf_mgr.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __VCONF_MGR_H__ +#define __VCONF_MGR_H__ + +#include +#include "common.h" + +char *vconf_mgr_get_string_value(const char *key); +int vconf_mgr_set_string_value(const char *key, const char *value); +int vconf_mgr_get_int_value(const char *key, int *value); +int vconf_mgr_set_int_value(const char *key, const int value); + +#endif /* __VCONF_MGR_H__ */ diff --git a/ug/proxy/include/wifi_mgr.h b/ug/proxy/include/wifi_mgr.h new file mode 100644 index 0000000..43482a4 --- /dev/null +++ b/ug/proxy/include/wifi_mgr.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __WIFI_MGR_H__ +#define __WIFI_MGR_H__ + +#include +#include "common.h" + +int wifi_mgr_init(void); +int wifi_mgr_deinit(void); +int wifi_mgr_get_connected_ap(wifi_ap_h *ap); +int wifi_mgr_set_proxy_type(enum method_enum method); +int wifi_mgr_get_proxy_type(enum method_enum *method); +int wifi_mgr_set_proxy_address(const char *ip); +int wifi_mgr_get_proxy_address(char **ip); + +#endif /* __WIFI_MGR_H__ */ diff --git a/ug/proxy/src/connection_mgr.c b/ug/proxy/src/connection_mgr.c new file mode 100644 index 0000000..bf64626 --- /dev/null +++ b/ug/proxy/src/connection_mgr.c @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "connection_mgr.h" + +/** + * Converts the error type to string information. + * + * @param[in] err_type Error type + * @return error string information; + */ +static const char *_convert_error_to_string(connection_error_e err_type) +{ + _DBG("Not Yet"); +#if 0 + switch (err_type) { + case CONNECTION_ERROR_NONE: + return "NONE"; + case CONNECTION_ERROR_INVALID_PARAMETER: + return "INVALID_PARAMETER"; + case CONNECTION_ERROR_OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case CONNECTION_ERROR_INVALID_OPERATION: + return "INVALID_OPERATION"; + case CONNECTION_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED: + return "ADDRESS_FAMILY_NOT_SUPPORTED"; + case CONNECTION_ERROR_OPERATION_FAILED: + return "OPERATION_FAILED"; + case CONNECTION_ERROR_ITERATOR_END: + return "ITERATOR_END"; + case CONNECTION_ERROR_NO_CONNECTION: + return "NO_CONNECTION"; + case CONNECTION_ERROR_NOW_IN_PROGRESS: + return "NOW_IN_PROGRESS"; + case CONNECTION_ERROR_ALREADY_EXISTS: + return "ALREADY_EXISTS"; + case CONNECTION_ERROR_OPERATION_ABORTED: + return "OPERATION_ABORTED"; + case CONNECTION_ERROR_DHCP_FAILED: + return "DHCP_FAILED"; + case CONNECTION_ERROR_INVALID_KEY: + return "INVALID_KEY"; + case CONNECTION_ERROR_NO_REPLY: + return "NO_REPLY"; + case CONNECTION_ERROR_NO_KEYWORD: + return "NO_KEYWORD"; + case CONNECTION_ERROR_TCP_RST: + return "RST_IN_TCP_RESPONSE"; + case CONNECTION_ERROR_TCP_SYN_TIMEOUT: + return "TCP_SYN_TIMEOUT"; + case CONNECTION_ERROR_OFFLINE: + return "CONNECTION_OFFLINE"; + case CONNECTION_ERROR_NETWORK_MONITOR_FAILURE: + return "monitor failer"; + case CONNECTION_ERROR_INVALID_GATEWAY: + return "invalid gateway"; + case CONNECTION_ERROR_INVALID_MACADDRESS: + return "invalid mac addr"; + default: + break; + } + +#endif + return "Unknown"; +} + +/** + * Creates a handle for managing data connections. + * + * The handle must be released with connection_destroy(). + * + * @return connetcion if the operation is successful; NULL if failed; + */ +connection_h connection_mgr_create(void) +{ + int ret; + connection_h connection; + + connection = NULL; + ret = connection_create(&connection); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_create failed"); + connection = NULL; + } + + return connection; +} + +/** + * Destroys the connection handle. + * + * @param[in] connection The handle of the connection + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_destroy(connection_h connection) +{ + int ret; + + if (!connection) { + _ERR("connection is NULL."); + return RET_FAILED; + } + + ret = connection_destroy(connection); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_destroy() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the ethernet profile information. + * + * Iterates all the profile in the connection, and gets the ethernet one. + * + * @param[in] connection The handle of the connection + * @param[out] info The structure to store profile information + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_get_profile_info(connection_h connection, + connection_profile_h *out_profile) +{ + connection_profile_iterator_h iter; + connection_profile_h profile; + connection_profile_type_e type; + char *name; + int ret; + + if (!connection || !out_profile) { + _ERR("param is NULL."); + return RET_FAILED; + } + + ret = connection_get_profile_iterator(connection, + CONNECTION_ITERATOR_TYPE_REGISTERED, &iter); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("Fail to get profile iterator: %s.\n", + _convert_error_to_string(ret)); + return RET_FAILED; + } + + while (connection_profile_iterator_has_next(iter)) { + profile = NULL; + if (connection_profile_iterator_next(iter, + &profile) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get profile handle\n"); + return RET_FAILED; + } + + if (!profile) { + _ERR("get profile failed."); + return RET_FAILED; + } + + if (connection_profile_get_type(profile, + &type) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get profile type\n"); + return RET_FAILED; + } + + name = NULL; + if (connection_profile_get_name(profile, + &name) != CONNECTION_ERROR_NONE) { + _ERR("Fail to get profile name\n"); + return RET_FAILED; + } + + if (!name) { + _ERR("get name failed."); + return RET_FAILED; + } + + if (type == CONNECTION_PROFILE_TYPE_ETHERNET) + *out_profile = profile; + + free(name); + } + + return RET_SUCCESS; +} + +/** + * Sets the Proxy type. + * + * If you set Proxy type to #WIFI_PROXY_TYPE_AUTO or + * #WIFI_PROXY_TYPE_MANUAL, then Proxy will be restored. + * + * @param[in] connection The handle of the connection + * @param[in] method The proxy type + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_set_proxy_type(connection_h connection, + enum method_enum method) +{ + connection_profile_h profile; + connection_proxy_type_e type; + int ret; + + if (!connection) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + profile = NULL; + ret = connection_mgr_get_profile_info(connection, &profile); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_mgr_get_profile_info() failed.\n"); + return RET_FAILED; + } + + switch (method) { + case METHOD_NONE: + type = CONNECTION_PROXY_TYPE_DIRECT; + break; + case METHOD_MAN: + type = CONNECTION_PROXY_TYPE_MANUAL; + break; + case METHOD_AUTO: + type = CONNECTION_PROXY_TYPE_AUTO; + break; + default: + return RET_FAILED; + } + + ret = connection_profile_set_proxy_type(profile, type); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_profile_set_proxy_type() failed.\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the Proxy type. + * + * @param[in] connection The handle of the connection + * @param[out] method The proxy type + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_get_proxy_type(connection_h connection, + enum method_enum *method) +{ + connection_profile_h profile; + connection_proxy_type_e type; + int ret; + + if (!connection || !method) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + profile = NULL; + ret = connection_mgr_get_profile_info(connection, &profile); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_mgr_get_profile_info() failed.\n"); + return RET_FAILED; + } + + ret = connection_profile_get_proxy_type(profile, &type); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_profile_get_proxy_type() failed.\n"); + return RET_FAILED; + } + + switch (type) { + case CONNECTION_PROXY_TYPE_DIRECT: + *method = METHOD_NONE; + break; + case CONNECTION_PROXY_TYPE_MANUAL: + *method = METHOD_MAN; + break; + case CONNECTION_PROXY_TYPE_AUTO: + *method = METHOD_AUTO; + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Sets the Proxy address. + * + * @param[in] connection The handle of the connection + * @param[in] ip IP address + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_set_proxy_address(connection_h connection, + const char *ip) +{ + connection_profile_h profile; + int ret; + + if (!connection) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + profile = NULL; + ret = connection_mgr_get_profile_info(connection, &profile); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_mgr_get_profile_info() failed.\n"); + return RET_FAILED; + } + + ret = connection_profile_set_proxy_address(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, ip); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_profile_set_proxy_address() failed.\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the Proxy address. + * + * @param[in] connection The handle of the connection + * @param[out] ip IP address + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int connection_mgr_get_proxy_address(connection_h connection, char **ip) +{ + connection_profile_h profile; + int ret; + + if (!connection || !ip || !*ip) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + profile = NULL; + ret = connection_mgr_get_profile_info(connection, &profile); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_mgr_get_profile_info() failed.\n"); + return RET_FAILED; + } + + ret = connection_profile_get_proxy_address(profile, + CONNECTION_ADDRESS_FAMILY_IPV4, ip); + if (ret != CONNECTION_ERROR_NONE) { + _ERR("connection_profile_get_proxy_address() failed.\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} diff --git a/ug/proxy/src/main_view.c b/ug/proxy/src/main_view.c new file mode 100644 index 0000000..269a600 --- /dev/null +++ b/ug/proxy/src/main_view.c @@ -0,0 +1,2069 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "main_view.h" +#include "vconf_mgr.h" +#include "wifi_mgr.h" +#include "connection_mgr.h" +#include "i18n.h" +#include "util.h" +#include "common.h" + +#define KEY_PRIV "priv" +#define KEY_PROXY_ENTER "Select" +#define IP_VALUE1 "value1" +#define IP_VALUE2 "value2" +#define IP_VALUE3 "value3" +#define IP_VALUE4 "value4" + +static const char *VCONF_NETWORK_TYPE = "db/menu/network/network_type"; +static const char *VCONF_PROXY_METHOD = "db/menu/proxy/method"; +static const char *VCONF_PROXY_IP = "db/menu/proxy/ip"; +static const char *VCONF_PROXY_URL = "db/menu/proxy/url"; + +#define METHOD_CTXPOPUP_OFFSET_X 448 +#define VALUE_CTXPOPUP_OFFSET_X 162 +#define VALUE_CTXPOPUP_OFFSET_Y 20 +#define PROXY_CONFIG_MAX_NUM 4 +#define IP_MAX_NUM 255 +#define IP_RATIO 10 +#define PORT_MAX_NUM 65535 +#define PORT_INVALID_NUM 65536 +#define PORT_NO_NEED 65537 +#define CENTER_ALIGN 0.5 +#define CTXPOPUP_WIDTH 688 +#define CTXPOPUP_HEIGHT 411 +#define BTN_ONE_LINE 1 +#define BTN_TWO_LINE 2 +#define LINE_PAD 2 +#define ALIGH_RATIO 1.5 + +enum network_type_enum { + TYPE_WIRELESS = 0, + TYPE_WIRED +}; + +struct _priv { + Evas_Object *win; + ui_gadget_h ug; + + Evas_Object *base; + Evas_Object *dim_ly; + Evas_Object *box; + Evas_Object *method_btn; + Evas_Object *proxy_btn; + Evas_Object *url_btn; + Evas_Object *ok_btn; + Evas_Object *cancel_btn; + Evas_Object *ctxpopup; + Evas_Object *vaule_btns[PROXY_CONFIG_MAX_NUM]; + + enum method_enum method; + enum network_type_enum net_type; + + connection_h connection; + + char ip[IP_STRING_LEN + 1]; + char url[MOTHED_URL_LEN + 1]; +}; + +static int _create_method_none_btn(struct _priv *priv); +static int _create_method_manual_btns(struct _priv *priv); +static int _create_method_auto_btns(struct _priv *priv); + +/** + * Initializes WI-FI for wireless network. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _init_wifi(struct _priv *priv) +{ + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + wifi_mgr_init(); + + return RET_SUCCESS; +} + +/** + * Initializes connection for wired network. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _init_connection(struct _priv *priv) +{ + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + priv->connection = connection_mgr_create(); + if (!priv->connection) { + _ERR("connection_mgr_create() failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Deinitializes WI-FI for wireless network. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _fini_wifi(struct _priv *priv) +{ + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + wifi_mgr_deinit(); + + return RET_SUCCESS; +} + +/** + * Deinitializes connection for wired network. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _fini_connection(struct _priv *priv) +{ + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + if (priv->connection) + connection_mgr_destroy(priv->connection); + + return RET_SUCCESS; +} + +/** + * Initializes the private data. + * + * Called when the view is loaded. + * + * @return the handler of the private data; + */ +static struct _priv *_init_priv() +{ + struct _priv *priv; + + priv = calloc(1, sizeof(*priv)); + if (!priv) { + _ERR("calloc priv failed."); + return NULL; + } + + _init_wifi(priv); + _init_connection(priv); + + return priv; +} + +/** + * Deinitializes the private data. + * + * Called when the view is deleted. + * + * @param[in] priv The handler of the private data + */ +static void _fini_priv(struct _priv *priv) +{ + if (!priv) + return; + + _fini_wifi(priv); + _fini_connection(priv); + + if (priv->base) + evas_object_del(priv->base); + + free(priv); +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, destroies the ug. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _base_key_pressed_cb(void *data, Evas *evas, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("The param is invalid.\n"); + return; + } + + ev = ei; + priv = data; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + ug_destroy_me(priv->ug); + return; + } +} + +/** + * Shows the dim layout. + * + * Called when there is a ctxpopup. + * + * @param[in] priv The handler of the private data + */ +static void _set_layout_dim(struct _priv *priv) +{ + if (!priv || !priv->dim_ly) { + _ERR("The param is invalid.\n"); + return; + } + + evas_object_show(priv->dim_ly); +} + +/** + * Hides the dim layout. + * + * Called when the existing ctxpopup is deleted. + * + * @param[in] priv The handler of the private data + */ +static void _unset_layout_dim(struct _priv *priv) +{ + if (!priv || !priv->dim_ly) { + _ERR("The param is invalid.\n"); + return; + } + + evas_object_hide(priv->dim_ly); +} + +/** + * Sets the cycle focus in the direction of up and down. + * + * Sets the cycle focus for an array of objects. + * + * @param[in] obj The handler of objects + * @param[in] count The count of objects + */ +static void _set_up_down_cycle_focus(Evas_Object **obj, + int count) +{ + int i; + + if (!*obj || !obj) + return; + + for (i = 0; i < count; i++) { + if (i == count - 1) + elm_object_focus_next_object_set(obj[i], obj[0], + ELM_FOCUS_DOWN); + else + elm_object_focus_next_object_set(obj[i], obj[i + 1], + ELM_FOCUS_DOWN); + + if (i == 0) + elm_object_focus_next_object_set(obj[i], obj[count - 1], + ELM_FOCUS_UP); + else + elm_object_focus_next_object_set(obj[i], obj[i - 1], + ELM_FOCUS_UP); + } +} + +/** + * Sets the cycle focus in the direction of left and right. + * + * Sets the cycle focus for an array of objects. + * + * @param[in] obj The handler of objects + * @param[in] count The count of objects + */ +static void _set_left_right_cycle_focus(Evas_Object **obj, int count) +{ + int i; + + if (!obj || !*obj) { + _ERR("the param is invalid."); + return; + } + + for (i = 0; i < count; i++) { + if (i == count - 1) + elm_object_focus_next_object_set(obj[i], + obj[0], ELM_FOCUS_RIGHT); + else + elm_object_focus_next_object_set(obj[i], + obj[i + 1], ELM_FOCUS_RIGHT); + + if (i == 0) + elm_object_focus_next_object_set(obj[i], + obj[count - 1], ELM_FOCUS_LEFT); + else + elm_object_focus_next_object_set(obj[i], + obj[i - 1], ELM_FOCUS_LEFT); + } +} + +/** + * Creates the basic layout of the view. + * + * @param[in] parent The parent object + * @return layout if the operation is successful; NULL if failed; + */ +static Evas_Object *_create_basic_layout(struct _priv *priv) +{ + Evas_Object *base; + + if (!priv || !priv->win) { + _ERR("priv is NULL."); + return NULL; + } + + base = util_add_layout(priv->win, UG_PROXY_EDJ_FILE, GRP_MAIN_VIEW); + if (!base) { + _ERR("elm_layout_add() failed."); + return NULL; + } + + evas_object_event_callback_add(base, EVAS_CALLBACK_KEY_DOWN, + _base_key_pressed_cb, priv); + + evas_object_show(base); + + return base; +} + +/** + * Sets the description. + * + * Sets the description for the proxy setting view. + * + * @param[in] priv The handler of the private data + */ +static void _set_description(struct _priv *priv) +{ + if (!priv || !priv->base) { + _ERR("Parameter error!"); + return; + } + + elm_object_part_text_set(priv->base, PART_PROXY_DESCRITION, + _(TXT_PROXY_DESCRIPTION)); +} + +/** + * Gets proxy IP from vconf. + * + * @param[out] des_ip Destination IP + * @param[in] key_ip The vconf key + */ +static void _get_man_saved_value(char *des_ip, + const char *key_ip) +{ + char *ip; + + if (!des_ip || !key_ip) { + _ERR("Parameter error!"); + return; + } + + ip = vconf_mgr_get_string_value(key_ip); + if (!ip) + snprintf(des_ip, IP_STRING_LEN, "%s", IP_ZERO); + else + snprintf(des_ip, IP_STRING_LEN, "%s", ip); +} + +/** + * Gets the proxy method from vconf. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _get_proxy_method(struct _priv *priv) +{ + int value; + int ret; + char *str; + + if (!priv) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + str = vconf_mgr_get_string_value(VCONF_NETWORK_TYPE); + if (str && !strcmp(str, TXT_WIRED)) + priv->net_type = TYPE_WIRED; + else + priv->net_type = TYPE_WIRELESS; + + value = 0; + ret = vconf_mgr_get_int_value(VCONF_PROXY_METHOD, &value); + if (ret != RET_SUCCESS) { + _ERR("vconf_mgr_get_int_value() failed."); + return RET_FAILED; + } + + switch (value) { + case 0: + priv->method = METHOD_NONE; + break; + case 1: + priv->method = METHOD_MAN; + break; + case 2: + priv->method = METHOD_AUTO; + break; + default: + return RET_FAILED; + } + + _get_man_saved_value(priv->ip, VCONF_PROXY_IP); + + str = vconf_mgr_get_string_value(VCONF_PROXY_URL); + if (!str) + snprintf(priv->url, MOTHED_URL_LEN, "%s", URL_BLANK); + else + snprintf(priv->url, MOTHED_URL_LEN, "%s", str); + + return RET_SUCCESS; +} + +/** + * Keeps the focused state for the button. + * + * @param[in] btn The object button + */ +static void _keep_btn_dim_focused(Evas_Object *btn) +{ + if (!btn) { + _ERR("the param is invalid."); + return; + } + + elm_object_signal_emit(btn, SIG_BTN_SELECTED, PROG); +} + +/** +* @Evas_Smart_Cb type callback for handling unfocused event. +* +* When the ctxpopup is unfocused, hide the dim layout, +* and delete the ctxpopup. +* +* @param[in] data User data +* @param[in] o The corresponding object which the focus event occurred +* @param[in] ei Event information +*/ +static void _ctxpopup_unfocused_cb(void *data, + Evas_Object *o, void *ei) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + _unset_layout_dim(priv); + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } +} + +/** + * Clears the buttons in the box. + * + * When the method is changed, clear the box firstly. + * + * @param[in] priv The handler of the private data + */ +static void _clear_method_btns(struct _priv *priv) +{ + if (!priv) { + _ERR("Parameter error!"); + return; + } + + elm_box_clear(priv->box); + + priv->method_btn = NULL; + priv->proxy_btn= NULL; + priv->url_btn = NULL; +} + +/** + * Creates the method select button. + * + * Uses the style of 'method_select'. + * + * @param[in] base The parent object + * @param[in] txt The text in button + * @param[in] cb The callback for clicked event + * @param[in] data User data + * @return button if the operation is successful; NULL if failed; + */ +static Evas_Object *_create_method_select_btn(Evas_Object *base, + char *txt, Evas_Smart_Cb cb, void *data) +{ + Evas_Object *btn; + + if (!base || !txt || !cb || !data) { + _ERR("The param is invalid.\n"); + return NULL; + } + + btn = util_add_button(base, STYLE_METHOD_SET, NULL, txt); + if (!btn) { + _ERR("Add btn failed.\n"); + return NULL; + } + + evas_object_smart_callback_add(btn, SIG_CLICKED, cb, data); + + return btn; +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, delete the ctxpopup. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] o The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _ctxpopup_key_pressed_cb(void *data, Evas *evas, + Evas_Object *o, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + _unset_layout_dim(priv); + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + } +} + +/** + * Handles the process of clicked event. + * + * According to the method. + * + * @param[in] priv The handler of the private data + * @param[in] method The proxy method + */ +static void _method_btn_click_proc(struct _priv *priv, + enum method_enum method) +{ + if (!priv) { + _ERR("The param is invalid.\n"); + return; + } + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + priv->method = method; + + _clear_method_btns(priv); + + switch (priv->method) { + case METHOD_NONE: + _create_method_none_btn(priv); + break; + case METHOD_MAN: + _create_method_manual_btns(priv); + break; + case METHOD_AUTO: + _create_method_auto_btns(priv); + break; + default: + break; + } + + elm_object_focus_set(priv->method_btn, EINA_TRUE); + +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* For the 'METHOD_NONE' button. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _method_none_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _method_btn_click_proc(priv, METHOD_NONE); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* For the 'METHOD_MAN' button. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _method_man_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _method_btn_click_proc(priv, METHOD_MAN); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* For the 'METHOD_AUTO' button. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _method_auto_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _method_btn_click_proc(priv, METHOD_AUTO); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* For the method select button. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _method_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + Evas_Object *base; + Evas_Object *ctxpopup; + Evas_Object *box; + Evas_Object *none_btn; + Evas_Object *man_btn; + Evas_Object *auto_btn; + Evas_Object *btn[METHOD_NUM]; + Evas_Coord x; + Evas_Coord y; + Evas_Coord w; + Evas_Coord h; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + base = priv->base; + + ctxpopup = util_add_layout(base, UG_PROXY_EDJ_FILE, + GRP_METHOD_SETTING); + if (!ctxpopup) { + _ERR("add method ctxpopup failed.\n"); + return; + } + + evas_object_smart_callback_add(ctxpopup, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_KEY_DOWN, + _ctxpopup_key_pressed_cb, priv); + + priv->ctxpopup = ctxpopup; + + _keep_btn_dim_focused(priv->method_btn); + _set_layout_dim(priv); + + box = util_add_box(ctxpopup, PART_SWALLOW_CONTENT); + if (!box) { + _ERR("create box failed."); + evas_object_del(ctxpopup); + return; + } + + none_btn = _create_method_select_btn(ctxpopup, _(TXT_MOTHED_NONE), + _method_none_btn_clicked_cb, priv); + if (!none_btn) { + _ERR("Add btn failed.\n"); + evas_object_del(ctxpopup); + return; + } + + elm_box_pack_end(box, none_btn); + elm_object_focus_set(none_btn, EINA_TRUE); + btn[METHOD_NONE] = none_btn; + + man_btn = _create_method_select_btn(ctxpopup, _(TXT_MOTHED_MAN), + _method_man_btn_clicked_cb, priv); + if (!man_btn) { + _ERR("Add btn failed.\n"); + evas_object_del(ctxpopup); + return; + } + + elm_box_pack_end(box, man_btn); + btn[METHOD_MAN] = man_btn; + + auto_btn = _create_method_select_btn(ctxpopup, _(TXT_MOTHED_AUTO), + _method_auto_btn_clicked_cb, priv); + if (!auto_btn) { + _ERR("Add btn failed.\n"); + evas_object_del(ctxpopup); + return; + } + + elm_box_pack_end(box, auto_btn); + btn[METHOD_AUTO] = auto_btn; + + _set_up_down_cycle_focus(btn, METHOD_NUM); + _set_left_right_cycle_focus(btn, METHOD_NUM); + + switch (priv->method) { + case METHOD_NONE: + elm_object_signal_emit(none_btn, SIG_BTN_SELECTED, PROG); + break; + case METHOD_MAN: + elm_object_signal_emit(man_btn, SIG_BTN_SELECTED, PROG); + break; + case METHOD_AUTO: + elm_object_signal_emit(auto_btn, SIG_BTN_SELECTED, PROG); + break; + default: + break; + } + + evas_object_geometry_get(priv->method_btn, &x, &y, &w, &h); + evas_object_move(ctxpopup, (x + METHOD_CTXPOPUP_OFFSET_X) * ELM_SCALE, + (y + ALIGH_RATIO * h + LINE_PAD) * ELM_SCALE); +} + +/** + * Gets the position of IP value ctxpopup. + * + * @param[in] priv The handler of the private data + * @param[out] pos_x X position + * @param[out] pos_y Y position + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _get_value_popup_pos(struct _priv *priv, + Evas_Coord *pos_x, Evas_Coord *pos_y) +{ + Evas_Coord x; + Evas_Coord y; + + if (!priv || !pos_x || !pos_y) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + evas_object_geometry_get(priv->proxy_btn, &x, &y, NULL, NULL); + *pos_x = x + VALUE_CTXPOPUP_OFFSET_X; + *pos_y = y - VALUE_CTXPOPUP_OFFSET_Y; + + return RET_SUCCESS; +} + +/** + * Sets the number to the object text. + * + * @param[in] obj The handler of the object + * @param[in] num The number + */ +static void _set_btn_vaule(Evas_Object *obj, int num) +{ + char value[MOTHED_STRING_LEN]; + + if (!obj) { + _ERR("The param is invalid."); + return; + } + + memset(value, 0, MOTHED_STRING_LEN); + snprintf(value, MOTHED_STRING_LEN - 1, "%d", num); + elm_object_text_set(obj, value); +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_UP, increase the value. + * If the key is KEY_DOWN, decrease the value. + * If the key is a number, append the number. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _value_key_pressed_cb(void *data, Evas *evas, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + const char *value; + int num, new_num, max_num; + + if (!ei || !data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + max_num = IP_MAX_NUM; + + if (!strcmp(ev->keyname, KEY_UP)) { + value = elm_object_text_get(obj); + num = atoi(value); + num++; + if (num > max_num) + num = 0; + } else if (!strcmp(ev->keyname, KEY_DOWN)) { + value = elm_object_text_get(obj); + num = atoi(value); + num--; + if (num < 0) + num = max_num; + } else if (!strcmp(ev->keyname, KEY_0) || + !strcmp(ev->keyname, KEY_1) || + !strcmp(ev->keyname, KEY_2) || + !strcmp(ev->keyname, KEY_3) || + !strcmp(ev->keyname, KEY_4) || + !strcmp(ev->keyname, KEY_5) || + !strcmp(ev->keyname, KEY_6) || + !strcmp(ev->keyname, KEY_7) || + !strcmp(ev->keyname, KEY_8) || + !strcmp(ev->keyname, KEY_9)) { + value = elm_object_text_get(obj); + if (!value) + elm_object_text_set(obj, ev->keyname); + + new_num = atoi(ev->keyname); + + num = atoi(value); + if (!num || (num * IP_RATIO + new_num) > max_num) { + elm_object_text_set(obj, ev->keyname); + return; + } + + num = num * IP_RATIO + new_num; + } else { + return; + } + + _set_btn_vaule(obj, num); +} + +/** + * Creates the value button for IP setting. + * + * @param[in] parent The parent object + * @param[in] num The sequence number of the button + * @param[in] txt The text in the button + * @param[in] data User data + * @return button if the operation is successful; NULL if failed; + */ +static Evas_Object *_create_value_btn(Evas_Object *parent, int num, + char *txt, void *data) +{ + Evas_Object *btn; + + if (!parent || !txt || !data) { + _ERR("The param is invalid.\n"); + return NULL; + } + + btn = util_add_button(parent, STYLE_VALUE_BTN, NULL, txt); + if (!btn) { + _ERR("add button failed.\n"); + return NULL; + } + + switch (num) { + case 0: + elm_object_part_content_set(parent, PART_IP_FIRST, btn); + evas_object_data_set(parent, IP_VALUE1, btn); + elm_object_focus_set(btn, EINA_TRUE); + break; + case 1: + elm_object_part_content_set(parent, PART_IP_SECOND, btn); + evas_object_data_set(parent, IP_VALUE2, btn); + break; + case 2: + elm_object_part_content_set(parent, PART_IP_THIRD, btn); + evas_object_data_set(parent, IP_VALUE3, btn); + break; + case 3: + elm_object_part_content_set(parent, PART_IP_FORTH, btn); + evas_object_data_set(parent, IP_VALUE4, btn); + break; + default: + break; + } + + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _value_key_pressed_cb, data); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN); + + return btn; +} + +/** + * Sets the value to the object text. + * + * @param[in] priv The handler of the private data + */ +static void _set_the_value(struct _priv *priv) +{ + Evas_Object *btn; + const char *value1; + const char *value2; + const char *value3; + const char *value4; + char ip[IP_STRING_LEN + 1]; + + if (!priv || !priv->ctxpopup) { + _ERR("The param is invalid.\n"); + return; + } + + value1 = NULL; + btn = evas_object_data_get(priv->ctxpopup, IP_VALUE1); + if (btn) + value1 = elm_object_text_get(btn); + + value2 = NULL; + btn = evas_object_data_get(priv->ctxpopup, IP_VALUE2); + if (btn) + value2 = elm_object_text_get(btn); + + value3 = NULL; + btn = evas_object_data_get(priv->ctxpopup, IP_VALUE3); + if (btn) + value3 = elm_object_text_get(btn); + + value4 = NULL; + btn = evas_object_data_get(priv->ctxpopup, IP_VALUE4); + if (btn) + value4 = elm_object_text_get(btn); + + memset(ip, 0, IP_STRING_LEN + 1); + snprintf(ip, IP_STRING_LEN, "%s.%s.%s.%s", + value1 ? value1 : "\\0", value2 ? value2 : "\\0", + value3 ? value3 : "\\0", value4 ? value4 : "\\0"); + + strncpy(priv->ip, ip, IP_STRING_LEN); + elm_object_part_text_set(priv->proxy_btn, PART_VALUE, ip); + + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; +} + +/** + * Callback for key pressed event. + * + * If the key is KEY_BACK, delete the IP value ctxpopup. + * If the key is KEY_ENTER, set the value into the button. + * + * @param[in] data User data + * @param[in] evas Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _value_ctxpopup_key_pressed_cb(void *data, Evas *evas, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!ei || !data) { + _ERR("The param is invalid.\n"); + return; + } + + ev = ei; + priv = data; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_ENTER)) { + _unset_layout_dim(priv); + _set_the_value(priv); + evas_object_del(obj); + } else if (!strcmp(ev->keyname, KEY_BACK)) { + _unset_layout_dim(priv); + evas_object_del(obj); + } +} + +/** + * Creates value ctxpopup. + * + * User can set number in the ctxpopup. + * + * @param[in] priv The handler of the private data + */ +static void _create_value_popup(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *ctxpopup; + Evas_Object *btn; + Evas_Coord pos_x; + Evas_Coord pos_y; + int i; + + if (!priv || !priv->base) { + _ERR("The param is invalid.\n"); + return; + } + + base = priv->base; + + ctxpopup = util_add_layout(base, UG_PROXY_EDJ_FILE, + GRP_PROXY_VALUE_SETTING); + if (!ctxpopup) { + _ERR("elm_ctxpopup_add() failed.\n"); + return; + } + + priv->ctxpopup = ctxpopup; + + _set_layout_dim(priv); + + for (i = 0; i < PROXY_CONFIG_MAX_NUM; i++) { + btn = _create_value_btn(ctxpopup, i, _(TXT_ZERO), priv); + if (!btn) { + _ERR("_create_value_btn() failed.\n"); + evas_object_del(ctxpopup); + return; + } + + priv->vaule_btns[i] = btn; + } + + elm_object_part_text_set(ctxpopup, PART_TXT_SEPERATOR, _(TXT_COLON)); + evas_object_smart_callback_add(ctxpopup, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(ctxpopup, EVAS_CALLBACK_KEY_DOWN, + _value_ctxpopup_key_pressed_cb, priv); + _set_left_right_cycle_focus(priv->vaule_btns, PROXY_CONFIG_MAX_NUM); + + pos_x = 0; + pos_y = 0; + _get_value_popup_pos(priv, &pos_x, &pos_y); + evas_object_move(ctxpopup, pos_x * ELM_SCALE, pos_y * ELM_SCALE); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* After the proxy button is clicked, the value ctxpopup +* will be created to set the value. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _proxy_ip_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _keep_btn_dim_focused(priv->proxy_btn); + + _create_value_popup(priv); +} + +/** + * Callback for key pressed event. + * + * If the key is 'Select', save the passcode. + * If the key is KEY_BACK, delete the layout. + * + * @param[in] data User data + * @param[in] e Evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _entry_key_pressed_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + const char *value; + + if (!data || !ei) { + _ERR("Parameter error!"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + elm_entry_input_panel_show(obj); + + if (!strcmp(ev->keyname, KEY_BACK)) { + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + _unset_layout_dim(priv); + } else if (!strcmp(ev->keyname, KEY_PROXY_ENTER)) { + value = elm_entry_entry_get(obj); + elm_object_part_text_set(priv->url_btn, PART_VALUE, value); + memset(priv->url, 0, MOTHED_URL_LEN + 1); + strncpy(priv->url, value, MOTHED_URL_LEN); + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + elm_object_focus_set(priv->url_btn, EINA_TRUE); + + _unset_layout_dim(priv); + } +} + +/** + * Creates the entry to input passcode. + * + * @param[in] priv The handler of the private data + */ +static void _create_input_entry(struct _priv *priv) +{ + Evas_Object *entry; + Evas_Object *layout; + + if (!priv || !priv->base) { + _ERR("the param is NULL."); + return; + } + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + layout = util_add_layout(priv->base, UG_PROXY_EDJ_FILE, + GRP_ENTRY_POPUP); + if (!layout) { + _ERR("create layout fail.\n"); + return; + } + + entry = util_add_entry(layout, STYLE_ENTRY, PART_ENTRY); + if (!entry) { + _ERR("add entry failed."); + evas_object_del(layout); + return; + } + + util_set_focus_next_self(entry); + evas_object_event_callback_add(entry, EVAS_CALLBACK_KEY_DOWN, + _entry_key_pressed_cb, priv); + elm_object_focus_set(entry, EINA_TRUE); + + _set_layout_dim(priv); + + priv->ctxpopup = layout; +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* After the URL button is clicked, the layout will be + * created to input the passcode. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _url_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + _create_input_entry(priv); +} + +/** + * Creates the method button. + * + * The common API for method button. + * + * @param[in] priv The handler of the private data + * @param[in] btn The handle of the button to be created + * @param[in] key The key value + * @param[in] value The value + * @param[in] line The number of lines + * @param[in] cb The callback for clicked event + * @return button if the operation is successful; NULL if failed; + */ +static Evas_Object *_create_method_box_btn(struct _priv *priv, Evas_Object *btn, + const char *key, char *value, int line, Evas_Smart_Cb cb) +{ + if (!priv || !priv->box || !key || !value || !cb) { + _ERR("Parameter error!"); + return NULL; + } + + if (btn) { + evas_object_show(btn); + elm_object_part_text_set(btn, PART_VALUE, value); + } else { + if (line == BTN_TWO_LINE) + btn = util_add_key_value_button(priv->box, + STYLE_KEY_VALUE_TWO_LINES, + NULL, key, value); + else + btn = util_add_key_value_button(priv->box, + STYLE_KEY_VALUE_BTN, NULL, key, value); + if (!btn) { + _ERR("add method btn failed."); + return NULL; + } + + evas_object_smart_callback_add(btn, SIG_CLICKED, cb, priv); + } + + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + + return btn; +} + +/** + * Creates method none button. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_method_none_btn(struct _priv *priv) +{ + Evas_Object *box; + Evas_Object *btn; + + if (!priv || !priv->box) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + box = priv->box; + + btn = _create_method_box_btn(priv, priv->method_btn, + _(TXT_MOTHED), _(TXT_MOTHED_NONE), + BTN_ONE_LINE, _method_btn_clicked_cb); + if (!btn) { + _ERR("add method btn failed."); + return RET_FAILED; + } + + elm_box_pack_end(box, btn); + + priv->method_btn = btn; + + return RET_SUCCESS; +} + +/** + * Creates method manual button. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_method_manual_btns(struct _priv *priv) +{ + Evas_Object *box; + Evas_Object *btn; + + if (!priv || !priv->box) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + box = priv->box; + + btn = _create_method_box_btn(priv, priv->method_btn, + _(TXT_MOTHED), _(TXT_MOTHED_MAN), + BTN_ONE_LINE, _method_btn_clicked_cb); + if (!btn) { + _ERR("add method btn failed."); + return RET_FAILED; + } + + elm_box_pack_end(box, btn); + priv->method_btn = btn; + + btn = _create_method_box_btn(priv, priv->proxy_btn, + _(TXT_PROXY_IP), _(priv->ip), + BTN_ONE_LINE, _proxy_ip_btn_clicked_cb); + if (!btn) { + _ERR("add http btn failed."); + return RET_FAILED; + } + + elm_box_pack_end(box, btn); + priv->proxy_btn = btn; + + return RET_SUCCESS; +} + +/** + * Creates method auto button. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_method_auto_btns(struct _priv *priv) +{ + Evas_Object *box; + Evas_Object *btn; + + if (!priv || !priv->box) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + box = priv->box; + + btn = _create_method_box_btn(priv, priv->method_btn, + _(TXT_MOTHED), _(TXT_MOTHED_AUTO), + BTN_ONE_LINE, _method_btn_clicked_cb); + if (!btn) { + _ERR("add method btn failed."); + return RET_FAILED; + } + + elm_box_pack_end(box, btn); + priv->method_btn = btn; + + btn = _create_method_box_btn(priv, priv->url_btn, + _(TXT_CONFIG_URL), _(priv->url), + BTN_TWO_LINE, _url_btn_clicked_cb); + if (!btn) { + _ERR("add url btn failed."); + return RET_FAILED; + } + + elm_box_pack_end(box, btn); + priv->url_btn = btn; + + return RET_SUCCESS; +} + +/** + * Creates the proxy layout. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_proxy_ly(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *box; + int ret; + + if (!priv || !priv->base) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + base = priv->base; + + box = util_add_box(base, PART_PROXY_SETTING); + if (!box) { + _ERR("add box failed."); + return RET_FAILED; + } + + priv->box = box; + + switch (priv->method) { + case METHOD_NONE: + ret = _create_method_none_btn(priv); + if (ret != RET_SUCCESS) { + _ERR("add method none failed."); + goto error; + } + + break; + case METHOD_MAN: + ret = _create_method_manual_btns(priv); + if (ret != RET_SUCCESS) { + _ERR("add method manual failed."); + goto error; + } + + break; + case METHOD_AUTO: + ret = _create_method_auto_btns(priv); + if (ret != RET_SUCCESS) { + _ERR("add method manual failed."); + goto error; + } + + break; + default: + break; + } + + return RET_SUCCESS; + +error: + evas_object_del(box); + + return RET_FAILED; +} + +/** + * Checks if IP is valid. + * + * Now only check if IP is '0.0.0.0'. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; + * RET_IP_INVALID if the IP is '0.0.0.0'; RET_FAILED if failed; + */ +static int _check_ip_is_valid(struct _priv *priv) +{ + if (!priv) { + _ERR("The param is NULL.\n"); + return RET_FAILED; + } + + if (!strncmp(priv->ip, IP_ZERO, IP_STRING_LEN)) { + _ERR("IP addr is invalid."); + return RET_IP_INVALID; + } + + return RET_SUCCESS; +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* When the 'OK' button is clicked, delete the popup, +* and set the default focus. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] event Event information +*/ +static void _ctxpopup_ok_btn_clicked_cb(void *data, + Evas_Object *obj, void *event) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + _unset_layout_dim(priv); + + elm_object_focus_set(priv->ok_btn, EINA_TRUE); +} + +/** + * Shows the invalid IP ctxpopup according to return value. + * + * @param[in] priv The handler of the private data + * @param[in] ret The return value from + */ +static void _show_invalid_info_ctxpopup(struct _priv *priv, int ret) +{ + Evas_Object *layout; + Evas_Object *btn; + Evas_Coord w; + Evas_Coord h; + + if (!priv) { + _ERR("The param is NULL.\n"); + return; + } + + if (priv->ctxpopup) { + evas_object_del(priv->ctxpopup); + priv->ctxpopup = NULL; + } + + _set_layout_dim(priv); + + layout = util_add_layout(priv->base, UG_PROXY_EDJ_FILE, + GRP_CONFIRM_LAYOUT); + if (!layout) { + _ERR("add layout failed."); + _unset_layout_dim(priv); + return; + } + + switch (priv->method) { + case METHOD_MAN: + elm_object_part_text_set(layout, PART_TEXT_TITLE, + _(TXT_MANUAL_TITLE)); + break; + case METHOD_AUTO: + elm_object_part_text_set(layout, PART_TEXT_TITLE, + _(TXT_AUTO_TITLE)); + break; + default: + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + elm_object_part_text_set(layout, PART_TEXT_TITLE, _(TXT_MANUAL_TITLE)); + + if (ret == RET_IP_INVALID) + elm_object_part_text_set(layout, + PART_TEXT_CONTENT, _(TXT_IP_INVALID)); + else if (ret == RET_VCONF_FAILED) + elm_object_part_text_set(layout, + PART_TEXT_CONTENT, _(TXT_VCONF_FAILED)); + else if (ret == RET_WIRED_PROXY_FAILED) + elm_object_part_text_set(layout, + PART_TEXT_CONTENT, _(TXT_WIRED_FAILED)); + else if (ret == RET_WIRELESS_PROXY_FAILED) + elm_object_part_text_set(layout, + PART_TEXT_CONTENT, _(TXT_WIRELESS_FAILED)); + + btn = util_add_button(layout, + STYLE_ACTION_BTN, PART_OK_BTN, _(TXT_OK)); + if (!btn) { + _ERR("util add button failed."); + evas_object_del(layout); + _unset_layout_dim(priv); + return; + } + + elm_object_focus_set(btn, EINA_TRUE); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN); + evas_object_smart_callback_add(btn, SIG_CLICKED, + _ctxpopup_ok_btn_clicked_cb, priv); + + evas_object_smart_callback_add(layout, SIG_UNFOCUSED, + _ctxpopup_unfocused_cb, priv); + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _ctxpopup_key_pressed_cb, priv); + + w = 0; + h = 0; + ecore_x_window_size_get(ecore_x_window_root_first_get(), + &w, &h); + evas_object_move(layout, + CENTER_ALIGN * (w - CTXPOPUP_WIDTH) * ELM_SCALE, + CENTER_ALIGN * (h - CTXPOPUP_HEIGHT) * ELM_SCALE); + + priv->ctxpopup = layout; +} + +/** + * Saves the proxy information to vconf. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _save_to_vconf(struct _priv *priv) +{ + if (!priv) { + _ERR("The param is invalid.\n"); + return RET_SUCCESS; + } + + vconf_mgr_set_int_value(VCONF_PROXY_METHOD, priv->method); + + switch (priv->method) { + case METHOD_NONE: + break; + case METHOD_MAN: + _check_ip_is_valid(priv); + + vconf_mgr_set_string_value(VCONF_PROXY_IP, priv->ip); + + break; + case METHOD_AUTO: + vconf_mgr_set_string_value(VCONF_PROXY_URL, priv->url); + + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Sets the proxy information with connection api. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _set_connection_proxy(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("The param is invalid.\n"); + return RET_FAILED; + } + + ret = connection_mgr_set_proxy_type(priv->connection, priv->method); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_get_proxy_type() failed."); + return ret; + } + + switch (priv->method) { + case METHOD_NONE: + connection_mgr_set_proxy_address(priv->connection, + NULL); + break; + case METHOD_MAN: + if (priv->ip) + connection_mgr_set_proxy_address(priv->connection, + priv->ip); + break; + case METHOD_AUTO: + if (priv->url) + connection_mgr_set_proxy_address(priv->connection, + priv->url); + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Sets the proxy information with wifi api. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _set_wifi_proxy(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("The param is invalid.\n"); + return RET_FAILED; + } + + ret = wifi_mgr_set_proxy_type(priv->method); + if (ret != RET_SUCCESS) { + _ERR("wifi_mgr_get_proxy_type() failed."); + return ret; + } + + switch (priv->method) { + case METHOD_NONE: + wifi_mgr_set_proxy_address(NULL); + break; + case METHOD_MAN: + if (priv->ip) + wifi_mgr_set_proxy_address(priv->ip); + break; + case METHOD_AUTO: + if (priv->url) + wifi_mgr_set_proxy_address(priv->url); + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Sets the proxy information. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _set_proxy(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("The param is invalid.\n"); + return RET_FAILED; + } + + if (priv->net_type == TYPE_WIRED) { + ret = _set_connection_proxy(priv); + if (ret != RET_SUCCESS) { + _ERR("the ip or port is invalid."); + return ret; + } + } else if (priv->net_type == TYPE_WIRELESS) { + ret = _set_wifi_proxy(priv); + if (ret != RET_SUCCESS) { + _ERR("the ip or port is invalid."); + return ret; + } + } + + return RET_SUCCESS; +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* When the 'OK' button is clicked, save the proxy information, +* and destroy the ug. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _ok_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + int ret; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + ret = _set_proxy(priv); + if (ret != RET_SUCCESS) { + _ERR("the ip or port is invalid."); + _show_invalid_info_ctxpopup(priv, ret); + return; + } + + ret = _save_to_vconf(priv); + if (ret != RET_SUCCESS) { + _ERR("the ip or port is invalid."); + _show_invalid_info_ctxpopup(priv, ret); + return; + } + + ug_destroy_me(priv->ug); +} + +/** +* @Evas_Smart_Cb type callback for handling clicked event. +* +* When the 'OK' button is clicked, don't save the proxy information, +* and destroy the ug. +* +* @param[in] data User data +* @param[in] obj The corresponding object which the focus event occurred +* @param[in] ev Event information +*/ +static void _cancel_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + ug_destroy_me(priv->ug); +} + +/** + * Creates the action buttons. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_action_btns(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *btn; + + if (!priv || !priv->base) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + base = priv->base; + + btn = util_add_button(base, STYLE_ACTION_BTN, PART_OK_BTN, _(TXT_OK)); + if (!btn) { + _ERR("add ok button failed."); + return RET_FAILED; + } + + evas_object_smart_callback_add(btn, SIG_CLICKED, + _ok_btn_clicked_cb, priv); + + elm_object_focus_set(btn, EINA_TRUE); + + btn = util_add_button(base, STYLE_ACTION_BTN, + PART_CANCEL_BTN, _(TXT_CANCEL)); + if (!btn) { + _ERR("add cancel button failed."); + return RET_FAILED; + } + + evas_object_smart_callback_add(btn, SIG_CLICKED, + _cancel_btn_clicked_cb, priv); + + return RET_SUCCESS; +} + +/** + * Creates the dim layout. + * + * @param[in] priv The handler of the private data + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +static int _create_dim_layout(struct _priv *priv) +{ + Evas_Object *dim_ly; + + if (!priv || !priv->base) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + dim_ly = util_add_layout(priv->base, UG_PROXY_EDJ_FILE, + GRP_DIM_LY); + if (!dim_ly) { + _ERR("elm_layout_add() failed.\n"); + return RET_FAILED; + } + + priv->dim_ly = dim_ly; + _unset_layout_dim(priv); + + return RET_SUCCESS; +} + +/** + * Creates the layout of the view. + * + * Called when the ug is launched. + * + * @param[in] win The handler of view manager + * @param[in] data The passed data from main view + * @return layout if the operation is successful; NULL if failed; + */ +Evas_Object *create_main_view(Evas_Object *win, ui_gadget_h ug) +{ + struct _priv *priv; + Evas_Object *base; + int ret; + + if (!win || !ug) { + _ERR("Parameter error!"); + return NULL; + } + + priv = _init_priv(); + if (!priv) { + _ERR("init priv failed."); + return NULL; + } + + priv->win = win; + priv->ug = ug; + + base = _create_basic_layout(priv); + if (!base) { + _ERR("Add main view failed.\n"); + _fini_priv(priv); + return NULL; + } + + priv->base = base; + + _set_description(priv); + + ret = _get_proxy_method(priv); + if (ret != RET_SUCCESS) { + _ERR("get proxy method failed.\n"); + goto error; + } + + ret = _create_proxy_ly(priv); + if (ret != RET_SUCCESS) { + _ERR("get proxy method failed.\n"); + goto error; + } + + ret = _create_action_btns(priv); + if (ret != RET_SUCCESS) { + _ERR("create action buttons failed.\n"); + goto error; + } + + ret = _create_dim_layout(priv); + if (ret != RET_SUCCESS) + goto error; + + elm_object_focus_set(priv->method_btn, EINA_TRUE); + evas_object_data_set(base, KEY_PRIV, priv); + + return base; + +error: + _fini_priv(priv); + return NULL; +} + +/** + * Destroies the layout of the view. + * + * Called when the ug is destroied. + * + * @param[in] base The base layout + */ +void destroy_main_view(Evas_Object *base) +{ + struct _priv *priv; + + if (!base) { + _ERR("Parameter error!"); + return; + } + + priv = evas_object_data_get(base, KEY_PRIV); + if (!priv) + return; + + _fini_priv(priv); +} diff --git a/ug/proxy/src/ug_proxy_settings.c b/ug/proxy/src/ug_proxy_settings.c new file mode 100644 index 0000000..88a2666 --- /dev/null +++ b/ug/proxy/src/ug_proxy_settings.c @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UG_MODULE_API +#define UG_MODULE_API __attribute__ ((visibility("default"))) +#endif + +#include +#include +#include +#include "main_view.h" +#include "i18n.h" +#include "defs.h" +#include "dbg.h" + +struct _ug_data { + Evas_Object *win; + Evas_Object *base; + ui_gadget_h ug; +}; + +/** +* Creates the base layout for proxy UI gadget +* +* This function supposed to be called after successful initialization +* with ug_init(), When proxy UG is created, the create operation is invoked, +* the implementation of create operation is _on_create. +* In this function a base layout will be created for the UI gadget instance. +* (see struct ug_cbs) +* +* @param[in] ug The proxy ui gadget object being created +* @param[in] mode Mode of UI gadget (UG_MODE_FULLVIEW | UG_MODE_FRAMEVIEW) +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* @return the base layout +*/ +static void *_on_create(ui_gadget_h ug, enum ug_mode mode, + service_h service, void *priv) +{ + struct _ug_data *ugd; + Evas_Object *base; + Evas_Object *win; + + if (!ug || !priv) { + _ERR("Parameter error!"); + return NULL; + } + + ugd = priv; + ugd->ug = ug; + + elm_theme_extension_add(NULL, UG_PROXY_EDJ_THEME); + + win = ug_get_window(); + if (!win) { + _ERR("window get failed"); + return NULL; + } + + ugd->win = win; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_style_set(win, "invisible"); + + base = create_main_view(win, ug); + if (!base) { + _ERR("add base layout failed."); + return NULL; + } + + ugd->base = base; + evas_object_raise(base); + + return base; +} + +/** +* When proxy UG starts, the start operation is invoked, the implementation of +* start operation is on_start(), +* usually every job would be completed before this operation, +* so just describe additional job you need to do in this operation. +* +* @param[in] ug The proxy ui gadget object being created +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* There is no action in this function. +*/ +static void _on_start(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Pause proxy ug. +* +* @param[in] ug The proxy ui gadget object being created +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* There is no action in this function. +*/ +static void _on_pause(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Resume proxy ug. +* +* @param[in] ug The proxy ui gadget object being created +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* There is no action in this function. +*/ +static void _on_resume(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Destroy the ug and release resources that have been used. +* +* When proxy UG is destroyed, the destroy operation is invoked. +* UI gadget cannot destroy itself, so it must be destroyed by using +* ug_destroy(), and then _on_destroy will be invoked, in this function, +* the viewmgr will be released. +* +* @param[in] ug the proxy ui gadget object +* @param[in] service each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv the data structure +*/ +static void _on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ + struct _ug_data *ugd = priv; + + if (!ug || !priv) { + _ERR("Parameter error!"); + return; + } + + if (!ugd || !ugd->base) + return; + + destroy_main_view(ugd->base); +} + +/** +* when an UI gadget receives message from its caller using ug_send_message(), +* the message operation on_message is invoked. +* +* @param[in] ug The proxy ui gadget object being created +* @param[in] service Each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv The data structure +* +* There is no action in this function. +*/ +static void _on_message(ui_gadget_h ug, + service_h msg, service_h service, void *priv) +{ +} + +/** +* when a system event is generated and UI gadget receives event from caller +* using ug_send_event(), the event operation on_event is invoked. +* +* @param[in] ug the proxy ui gadget object +* @param[in] event the proxy ui gadget object +* @param[in] service each operation will receive this service type data, +* (see \ref service_PG "Tizen Managed APi Reference Guide > +* Application Framework -> Application") And the argument service is +* automatically released by UI gadget manager after the UI gadget is destroyed. +* @priv[in] priv the data structure +*/ +static void _on_event(ui_gadget_h ug, + enum ug_event event, service_h service, void *priv) +{ + if (!ug || !priv) { + _ERR("Parameter error!"); + return; + } + + switch (event) { + case UG_EVENT_LOW_MEMORY: + break; + case UG_EVENT_LOW_BATTERY: + break; + case UG_EVENT_LANG_CHANGE: + break; + case UG_EVENT_ROTATE_PORTRAIT: + break; + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + break; + case UG_EVENT_ROTATE_LANDSCAPE: + break; + case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN: + break; + default: + break; + } +} + +/** +* Invoked when the UI gadget is loading, and it sets operations, private data, +* and the option. +* +* @param[in] ops Ops is a data structure describing operations, private data, +* and the option of UI gadget. +* +* @return 0 on success and -1 on fail +*/ +UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + struct _ug_data *ugd; + + if (!ops) + return -1; + + ugd = calloc(1, sizeof(*ugd)); + if (!ugd) + return -1; + + i18n_init(); + + ops->create = _on_create; + ops->start = _on_start; + ops->pause = _on_pause; + ops->resume = _on_resume; + ops->destroy = _on_destroy; + ops->message = _on_message; + ops->event = _on_event; + ops->priv = ugd; + ops->opt = UG_OPT_INDICATOR_ENABLE; + + return 0; +} + +/** +* Invoked when the UI gadget is loading, and it sets operations, private data, +* and the option. +* +* @param[in] ops Ops is a data structure describing operations, private data, +* and the option of UI gadget. +* +* @return 0 on success and -1 on fail +*/ +UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops) +{ + struct _ug_data *ugd; + + if (!ops) + return; + + ugd = ops->priv; + + free(ugd); +} diff --git a/ug/proxy/src/util.c b/ug/proxy/src/util.c new file mode 100644 index 0000000..746e83f --- /dev/null +++ b/ug/proxy/src/util.c @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "i18n.h" +#include "defs.h" +#include "dbg.h" +#include "util.h" + +#define ALIGN_CENTER 0.5 +#define ALIGN_LEFT 0.0 + +/** + * Creates one layout. + * + * @param[in] parent The parent object + * @param[in] file The path of edc file + * @param[in] group Group name in edc + * @return layout if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_layout(Evas_Object *parent, + const char *file, const char *group) +{ + Evas_Object *ly; + + if (!parent || !file || !group) + return NULL; + + ly = elm_layout_add(parent); + if (!ly) { + _ERR("add layout failed"); + return NULL; + } + + elm_layout_file_set(ly, file, group); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, + EVAS_HINT_FILL); + + evas_object_show(ly); + + return ly; +} + +/** + * Callback for mouse-in event. + * + * Sets the object focused when the mouse is the the area of the object. + * + * @param[in] dt User data + * @param[in] e The evas handler + * @param[in] obj The corresponding object which the deletion event occurred + * @param[in] ei Event information + */ +static void _obj_mousein_cb(void *dt, Evas *e, Evas_Object *obj, void *ei) +{ + if (!obj) { + _ERR("the parameter is NULL."); + return; + } + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** + * Creates one button. + * + * @param[in] parent The parent object + * @param[in] style The style of the button + * @param[in] part The part name where the button is located + * @param[in] text The text of the button + * @return button if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_button(Evas_Object *parent, const char *style, + const char *part, const char *text) +{ + Evas_Object *btn; + + if (!parent || !style || !text) { + _ERR("the parameter is NULL."); + return NULL; + } + + btn = elm_button_add(parent); + if (!btn) { + _ERR("add button failed"); + return NULL; + } + + elm_object_style_set(btn, style); + elm_object_text_set(btn, text); + + if (part) + elm_object_part_content_set(parent, part, btn); + + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _obj_mousein_cb, NULL); + + evas_object_show(btn); + + return btn; +} + +/** + * Creates one button with the specific style. + * + * The specific style is 'key_value_btn'. + * + * @param[in] parent The parent object + * @param[in] part The part name where the button is located + * @param[in] text_key The key + * @param[in] text_value The value + * @return button if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_key_value_button(Evas_Object *parent, + const char *style, const char *part, + const char *text_key, const char *text_value) +{ + Evas_Object *btn; + + if (!parent) { + _ERR("the parent is NULL."); + return NULL; + } + + if (!style || !text_key || !text_value) { + _ERR("style or part or text is NULL"); + return NULL; + } + + btn = elm_button_add(parent); + if (!btn) { + _ERR("add button failed"); + return NULL; + } + + elm_object_style_set(btn, style); + elm_object_part_text_set(btn, PART_KEY, text_key); + elm_object_part_text_set(btn, PART_VALUE, text_value); + + if (part) + elm_object_part_content_set(parent, part, btn); + + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _obj_mousein_cb, NULL); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT); + + evas_object_show(btn); + + return btn; +} + +/** + * Creates one box container. + * + * @param[in] parent The parent object + * @param[in] part The part name where the box container is located + * @return box if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_box(Evas_Object *parent, const char *part) +{ + Evas_Object *box; + + if (!parent) { + _ERR("the parent is NULL."); + return NULL; + } + + box = elm_box_add(parent); + if (!box) { + _ERR("elm_box_add() failed."); + return NULL; + } + + elm_box_align_set(box, ALIGN_CENTER, ALIGN_LEFT); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + + if (part) + elm_object_part_content_set(parent, part, box); + + evas_object_show(box); + + return box; +} + +/** + * Creates one entry. + * + * @param[in] parent The parent object + * @param[in] style The style of the entry + * @param[in] part The part name where the entry is located + * @return entry if the operation is successful; NULL if failed; + */ +Evas_Object *util_add_entry(Evas_Object *parent, + const char *style, const char *part) +{ + Evas_Object *entry; + + if (!parent) { + _ERR("the param is NULL."); + return NULL; + } + + entry = elm_entry_add(parent); + if (!entry) { + _ERR("elm_entry_add() failed."); + return NULL; + } + + if (style) + elm_object_style_set(entry, style); + + if (part) + elm_object_part_content_set(parent, part, entry); + + elm_entry_single_line_set(entry, EINA_TRUE); + elm_entry_input_panel_enabled_set(entry, EINA_TRUE); + elm_entry_input_panel_language_set(entry, + ELM_INPUT_PANEL_LANG_ALPHABET); + evas_object_size_hint_weight_set(entry, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(entry, + EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_cursor_end_set(entry); + evas_object_event_callback_add(entry, EVAS_CALLBACK_MOUSE_MOVE, + _obj_mousein_cb, NULL); + + evas_object_show(entry); + + return entry; +} + +/** + * Sets focus cycle. + * + * Sets the next focus to the object itself. + * + * @param[in] obj The object + */ +void util_set_focus_next_self(Evas_Object *obj) +{ + if (!obj) { + _ERR("the param is NULL."); + return; + } + + elm_object_focus_next_object_set(obj, obj, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(obj, obj, ELM_FOCUS_UP); + elm_object_focus_next_object_set(obj, obj, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(obj, obj, ELM_FOCUS_DOWN); +} diff --git a/ug/proxy/src/vconf_mgr.c b/ug/proxy/src/vconf_mgr.c new file mode 100644 index 0000000..d018549 --- /dev/null +++ b/ug/proxy/src/vconf_mgr.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "defs.h" +#include "dbg.h" +#include "vconf_mgr.h" +#include "i18n.h" + +/** + * Gets the string value from vconf. + * + * @param[in] key Vconf key + * @return the value in vconf; + */ +char *vconf_mgr_get_string_value(const char *key) +{ + if (!key) { + _ERR("the param is invalid."); + return NULL; + } + + return vconf_get_str(key); +} + +/** + * Sets the string value to vconf. + * + * @param[in] key Vconf key + * @param[in] value The value + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_set_string_value(const char *key, const char *value) +{ + int ret; + + if (!key || !value) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = vconf_set_str(key, value); + if (ret != 0) { + _ERR("vconf set str failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the integer value from vconf. + * + * @param[in] key Vconf key + * @param[out] value The value + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_get_int_value(const char *key, int *value) +{ + int ret; + + if (!key || !value) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = vconf_get_int(key, value); + if (ret != 0) { + _ERR("vconf get int failed"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Sets the integer value to vconf. + * + * @param[in] key Vconf key + * @param[in] value The value + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int vconf_mgr_set_int_value(const char *key, const int value) +{ + int ret; + + if (!key) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = vconf_set_int(key, value); + if (ret != 0) { + _ERR("vconf set int failed."); + return RET_FAILED; + } + + return RET_SUCCESS; +} diff --git a/ug/proxy/src/wifi_mgr.c b/ug/proxy/src/wifi_mgr.c new file mode 100644 index 0000000..88616a2 --- /dev/null +++ b/ug/proxy/src/wifi_mgr.c @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "defs.h" +#include "dbg.h" +#include "wifi_mgr.h" + +/** + * Converts the error type to string information. + * + * @param[in] err_type Error type + * @return error string information; + */ +const char *wifi_mgr_error_dbg(wifi_error_e err_type) +{ + switch (err_type) { + case WIFI_ERROR_NONE: + return "NONE"; + case WIFI_ERROR_INVALID_PARAMETER: + return "INVALID_PARAMETER"; + case WIFI_ERROR_OUT_OF_MEMORY: + return "OUT_OF_MEMORY"; + case WIFI_ERROR_INVALID_OPERATION: + return "INVALID_OPERATION"; + case WIFI_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED: + return "ADDRESS_FAMILY_NOT_SUPPORTED"; + case WIFI_ERROR_OPERATION_FAILED: + return "OPERATION_FAILED"; + case WIFI_ERROR_NO_CONNECTION: + return "NO_CONNECTION"; + case WIFI_ERROR_NOW_IN_PROGRESS: + return "NOW_IN_PROGRESS"; + case WIFI_ERROR_ALREADY_EXISTS: + return "ALREADY_EXISTS"; + case WIFI_ERROR_OPERATION_ABORTED: + return "OPERATION_ABORTED"; + case WIFI_ERROR_DHCP_FAILED: + return "DHCP_FAILED"; + case WIFI_ERROR_INVALID_KEY: + return "INVALID_KEY"; + case WIFI_ERROR_NO_REPLY: + return "NO_REPLY"; + case WIFI_ERROR_SECURITY_RESTRICTED: + return "SECURITY_RESTRICTED"; + default: + break; + } + + return "UNKNOWN"; +} + +/** + * Initializes Wi-Fi. + * + * Called before using wifi APIs. + * + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_init(void) +{ + int ret; + + ret = wifi_initialize(); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to wifi_initialize.\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Deinitializes Wi-Fi. + * + * Called when network setting is destroyed. + * + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_deinit(void) +{ + int ret; + + ret = wifi_deinitialize(); + if (ret != WIFI_ERROR_NONE) { + _ERR("Fail to wifi_deinitialize.\n"); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** + * Gets the handle of connected access point. + * + * You can get the connected access point and its configuration. + * + * @param[out] ap The handle of access point + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_get_connected_ap(wifi_ap_h *ap) +{ + int ret; + + if (!ap) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ret = wifi_get_connected_ap(ap); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_get_connected_ap() failed."); + return ret; + } + + return RET_SUCCESS; +} + +/** + * Sets the Proxy type. + * + * If you set Proxy type to #WIFI_PROXY_TYPE_AUTO or + * #WIFI_PROXY_TYPE_MANUAL, then Proxy will be restored. + * + * @param[in] method The proxy method + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_set_proxy_type(enum method_enum method) +{ + wifi_proxy_type_e type; + wifi_ap_h ap; + int ret; + + if (method < 0 || method >= METHOD_NUM) { + _ERR("method is invalid."); + return RET_FAILED; + } + + ap = NULL; + ret = wifi_get_connected_ap(ap); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_get_connected_ap() failed."); + return ret; + } + + switch (method) { + case METHOD_NONE: + type = WIFI_PROXY_TYPE_DIRECT; + break; + case METHOD_MAN: + type = WIFI_PROXY_TYPE_MANUAL; + break; + case METHOD_AUTO: + type = WIFI_PROXY_TYPE_AUTO; + break; + default: + return RET_FAILED; + } + + ret = wifi_ap_set_proxy_type(ap, type); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_ap_set_proxy_type() failed."); + return ret; + } + + return RET_SUCCESS; +} + +/** + * Gets the Proxy type. + * + * @param[out] method The proxy method + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_get_proxy_type(enum method_enum *method) +{ + wifi_proxy_type_e type; + wifi_ap_h ap; + int ret; + + if (!method) { + _ERR("method is invalid."); + return RET_FAILED; + } + + ap = NULL; + ret = wifi_get_connected_ap(ap); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_get_connected_ap() failed."); + return ret; + } + + ret = wifi_ap_get_proxy_type(ap, &type); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_ap_get_proxy_type() failed."); + return ret; + } + + switch (type) { + case WIFI_PROXY_TYPE_DIRECT: + *method = METHOD_NONE; + break; + case WIFI_PROXY_TYPE_MANUAL: + *method = METHOD_MAN; + break; + case WIFI_PROXY_TYPE_AUTO: + *method = METHOD_AUTO; + break; + default: + return RET_FAILED; + } + + return RET_SUCCESS; + +} + +/** + * Sets the proxy address. + * + * @param[in] ip The IP address + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_set_proxy_address(const char *ip) +{ + wifi_ap_h ap; + int ret; + + ap = NULL; + ret = wifi_get_connected_ap(ap); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_get_connected_ap() failed."); + return ret; + } + + ret = wifi_ap_set_proxy_address(ap, WIFI_ADDRESS_FAMILY_IPV4, ip); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_ap_set_proxy_address() failed."); + return ret; + } + + return RET_SUCCESS; +} + +/** + * Gets the proxy address. + * + * @param[out] ip The IP address + * @return RET_SUCCESS if the operation is successful; RET_FAILED if failed; + */ +int wifi_mgr_get_proxy_address(char **ip) +{ + wifi_ap_h ap; + int ret; + + if (!ip || !*ip) { + _ERR("ip is invalid."); + return RET_FAILED; + } + + ap = NULL; + ret = wifi_get_connected_ap(ap); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_get_connected_ap() failed."); + return ret; + } + + ret = wifi_ap_get_proxy_address(ap, WIFI_ADDRESS_FAMILY_IPV4, ip); + if (ret != WIFI_ERROR_NONE) { + _ERR("wifi_ap_get_proxy_address() failed."); + return ret; + } + + return RET_SUCCESS; +} diff --git a/ug/system/clock/CMakeLists.txt b/ug/system/clock/CMakeLists.txt new file mode 100755 index 0000000..9f5d324 --- /dev/null +++ b/ug/system/clock/CMakeLists.txt @@ -0,0 +1,66 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(ug-clock) + +SET(PROJECT_NAME ug-clock) +SET(PREFIX "/usr/ug") + +IF(NOT DEFINED UG_LIB_DIR) + SET(UG_LIB_DIR "/usr/ug/lib") +ENDIF(NOT DEFINED UG_LIB_DIR) +IF(NOT DEFINED UG_CLOCK_EDJE_DIR) + SET(UG_CLOCK_EDJE_DIR "${PREFIX}/res/edje/${PROJECT_NAME}") +ENDIF(NOT DEFINED UG_CLOCK_EDJE_DIR) +IF(NOT DEFINED VERSION) + SET(VERSION 0.1) +ENDIF(NOT DEFINED VERSION) + +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_C_FLAGS_RELEASE "-O2") +SET(UG_CLOCK_EDJ_FILE "ug_clock.edj") +SET(UG_CLOCK_EDJ_THEME "ug_clock_theme.edj") + +INCLUDE(FindPkgConfig) +pkg_check_modules(UG_CLOCK_PKGS REQUIRED + dlog + eina + edje + ecore-x + evas + elementary + utilX + x11 + aul + ui-gadget-1 + sysman +) + +SET(PKGS_LDFLAGS "${PKGS_LDFLAGS} ${UG_CLOCK_PKGS_LDFLAGS}") + +FOREACH(FLAG ${UG_CLOCK_PKGS_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${FLAG}") +ENDFOREACH(FLAG) + +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fvisibility=hidden -Wall") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}") +SET(SRCS + src/ug_clock.c + src/ug_clock_spin_control.c + src/ug_clock_sublist.c + src/ug_clock_utils.c + src/ug_clock_time_spin_control.c +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) + +ADD_DEFINITIONS("-DUG_CLOCK_EDJFILE=\"${UG_CLOCK_EDJE_DIR}/${UG_CLOCK_EDJ_FILE}\"") +ADD_DEFINITIONS("-DUG_CLOCK_EDJTHEME=\"${UG_CLOCK_EDJE_DIR}/${UG_CLOCK_EDJ_THEME}\"") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION}) + +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${UG_CLOCK_PKGS_LDFLAGS}) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${UG_LIB_DIR}) + +ADD_SUBDIRECTORY(edje) \ No newline at end of file diff --git a/ug/system/clock/edje/CMakeLists.txt b/ug/system/clock/edje/CMakeLists.txt new file mode 100755 index 0000000..1a1a551 --- /dev/null +++ b/ug/system/clock/edje/CMakeLists.txt @@ -0,0 +1,17 @@ +ADD_CUSTOM_TARGET(${UG_CLOCK_EDJ_FILE} + COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/ug_clock.edc + ${CMAKE_CURRENT_BINARY_DIR}/${UG_CLOCK_EDJ_FILE} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ug_clock.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} ${UG_CLOCK_EDJ_FILE}) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${UG_CLOCK_EDJ_FILE} DESTINATION ${UG_CLOCK_EDJE_DIR}) + +ADD_CUSTOM_TARGET(${UG_CLOCK_EDJ_THEME} + COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/ug_clock_theme.edc + ${CMAKE_CURRENT_BINARY_DIR}/${UG_CLOCK_EDJ_THEME} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/ug_clock_theme.edc +) +ADD_DEPENDENCIES(${PROJECT_NAME} ${UG_CLOCK_EDJ_THEME}) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${UG_CLOCK_EDJ_THEME} DESTINATION ${UG_CLOCK_EDJE_DIR}) diff --git a/ug/system/clock/edje/images/ico_dropdown_menu_check.png b/ug/system/clock/edje/images/ico_dropdown_menu_check.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7d114640bde4abbaac4165a1829ca15854f039 GIT binary patch literal 17850 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 literal 0 HcmV?d00001 diff --git a/ug/system/clock/edje/images/round_rectangle_4X4.png b/ug/system/clock/edje/images/round_rectangle_4X4.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1f51d38f87ccd9c29476b13310fb47e158e57c GIT binary patch literal 18179 zcmeI33p7;g-^aI82f37rRMHujB$+$IOk-TeHMcNA_c60)OfEB-DYtS+q{|_x+~TN? z+*Onk$}PGfN;jfHQiuKr9ZrS+M!D>2-t)fidDpxCYt5|1?BDZye&1(5pXaxK``NSB zKCsTtLRM<26aWCSR+grY(D$6NKS^=u|MM7exiN!h>Ba{D>4jr|VnE`_#Q-2>&!JM+ zt@GdtxO@*T4`D^6B6z-B7RL(&0RN}SPHdV}_acMA)&Udi$dF^!Tt@{-grmu!5cwDl zEtNTPYa>-oJyCEdpKoS1Tj^$MWFHt5bbHWnupc^8SX|jC&^RSw#>K7d-qfjYz9v~-Kz*ON6tBC
ttCU`0i(bule2)4xmZYY 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 literal 0 HcmV?d00001 diff --git a/ug/system/clock/edje/images/second_depth_bg.png b/ug/system/clock/edje/images/second_depth_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3c6243cce9d58310769c773fdbee3cb6b9b926 GIT binary patch literal 22286 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 literal 0 HcmV?d00001 diff --git a/ug/system/clock/edje/images/spincontrol_arrow_down.png b/ug/system/clock/edje/images/spincontrol_arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c0493e874ca95e6b85436a33600e0b28186851 GIT binary patch literal 17900 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 Li)@OlS4aLAn$DhT literal 0 HcmV?d00001 diff --git a/ug/system/clock/edje/ug_clock.edc b/ug/system/clock/edje/ug_clock.edc new file mode 100755 index 0000000..dd8e5e0 --- /dev/null +++ b/ug/system/clock/edje/ug_clock.edc @@ -0,0 +1,789 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/ug_clock_define.h" + +collections { + group { + name: UG_CLOCK_GRP; + images { + image: "second_depth_bg.png" COMP; + } + parts { + part { + name: "second_depth_bg_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 639 294; + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "second_depth_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1076 700; + rel1 { + relative: 1.0 1.0; + to: "second_depth_bg_padding"; + } + rel2 { + to: "second_depth_bg_padding"; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "second_depth_bg_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "second_depth_bg.png"; + } + rel1 { + to: "second_depth_bg"; + } + rel2 { + to: "second_depth_bg"; + } + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: "intro_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 70 50; + rel1 { + to: "second_depth_bg"; + } + rel2 { + to: "second_depth_bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: TEXT_INTRO; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 936 60; + text { + size: 24; + align: 0.0 0.0; + } + rel1 { + to: "intro_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "intro_text_padding"; + } + color: 255 255 255 166; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: "close_btn_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 790 160; + rel1 { + to: "second_depth_bg"; + } + rel2 { + to: "second_depth_bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: SWALLOW_CLOSE_BTN; + type: SWALLOW; + scale: 1; + description { + state, "default" 0.0; + min: 216 70; + rel1 { + to: "close_btn_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "close_btn_swallow_padding"; + } + align: 0.0 0.0; + } + } + part { + name: "clock_list_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 70 160; + rel1 { + to: "second_depth_bg"; + } + rel2 { + to: "second_depth_bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: SWALLOW_CLOCK_LIST; + type: SWALLOW; + scale: 1; + description { + state, "default" 0.0; + min: 680 410; + rel1 { + to: "clock_list_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "clock_list_swallow_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "clock_list_last_btn_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 410; + rel1 { + to: "clock_list_swallow"; + } + rel2 { + to: "clock_list_swallow"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: SWALLOW_CLOCK_LAST; + type: SWALLOW; + scale: 1; + description { + state, "default" 0.0; + min: 680 60; + rel1 { + to: "clock_list_last_btn_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "clock_list_last_btn_swallow_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + } + } + + group { + name: SPIN_CTRL_GRP; + parts { + part { + name: "bg_shadow"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1920 1080; + fixed: 1 1; + align: 0.0 0.0; + color: 0 0 0 127; + } + } + part { + name: "spin_ctrl_1_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1005 434; + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 344 122; + rel1 { + to: "spin_ctrl_1_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "spin_ctrl_1_swallow_padding"; + } + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: "spin_ctrl_1_swallow"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 101 122; + rel1 { + to: "spin_ctrl_1_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "spin_ctrl_1_swallow_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "separate_line_1_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 101 0; + rel1 { + to: "spin_ctrl_1_swallow"; + } + rel2 { + to: "spin_ctrl_1_swallow"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "separate_line_1"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 2 122; + rel1 { + to: "separate_line_1_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "separate_line_1_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + color: 128 128 128 38; + } + } + part { + name: "spin_ctrl_2_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 2 0; + rel1 { + to: "separate_line_1"; + } + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "spin_ctrl_2_swallow"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 101 122; + rel1 { + to: "spin_ctrl_2_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "spin_ctrl_2_swallow_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "separate_line_2_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 101 0; + rel1 { + to: "spin_ctrl_2_swallow"; + } + rel2 { + to: "spin_ctrl_2_swallow"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "separate_line_2"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 2 122; + rel1 { + to: "separate_line_2_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "separate_line_2_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + color: 128 128 128 38; + } + } + part { + name: "spin_ctrl_3_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 2 0; + rel1 { + to: "separate_line_2"; + } + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "spin_ctrl_3_swallow"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 138 122; + rel1 { + to: "spin_ctrl_3_swallow_padding"; + relative: 0.0 0.0; + } + rel2 { + to: "spin_ctrl_3_swallow_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + } + } + + group { + name: SUBLIST_GRP; + parts { + part { + name: "bg_shadow"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1920 1080; + fixed: 1 1; + align: 0.0 0.0; + color: 0 0 0 127; + } + } + part { + name: "sublist_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1039 536; + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "sublist_bg"; + type: RECT; + scale: 1; + description { + state, "default" 0.0; + min: 310 164; + rel1 { + to: "sublist_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "sublist_swallow_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: SWALLOW_SUBLIST; + type: SWALLOW; + scale: 1; + description { + state, "default" 0.0; + min: 310 164; + rel1 { + to: "sublist_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "sublist_swallow_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "separate_line_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 81; + rel1 { + to: "sublist_swallow"; + } + rel2 { + to: "sublist_swallow"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "separate_line"; + type: RECT; + scale: 1; + description { + state, "default" 0.0; + min: 310 2; + rel1 { + to: "separate_line_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "separate_line_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + color: 222 222 222 255; + } + } + } + } + + group { + name: TIME_SPIN_CTRL_GRP; + parts { + part { + name: "bg_shadow"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1920 1080; + fixed: 1 1; + align: 0.0 0.0; + color: 0 0 0 127; + } + } + part { + name: "time_spin_ctrl_1_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 1005 516+82; + rel2 { + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "time_spin_ctrl_1_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 310 122; + rel1 { + to: "time_spin_ctrl_1_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "time_spin_ctrl_1_swallow_padding"; + } + fixed: 1 1; + align: 0.0 0.0; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: SWALLOW_TIME_SPIN_1; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 310 122; + rel1 { + to: "time_spin_ctrl_1_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "time_spin_ctrl_1_swallow_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "separate_line_1_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 102 0; + rel1 { + to: SWALLOW_TIME_SPIN_1; + } + rel2 { + to: SWALLOW_TIME_SPIN_1; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "separate_line_1"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 2 122; + rel1 { + to: "separate_line_1_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "separate_line_1_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + color: 128 128 128 38; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "separate_line_2_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 206 0; + rel1 { + to: SWALLOW_TIME_SPIN_1; + } + rel2 { + to: SWALLOW_TIME_SPIN_1; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "separate_line_2"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 2 122; + rel1 { + to: "separate_line_2_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "separate_line_2_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + color: 128 128 128 38; + } + } + part { + name: "time_spin_ctrl_2_swallow_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 104 0; + rel1 { + to: SWALLOW_TIME_SPIN_1; + } + rel2 { + to: SWALLOW_TIME_SPIN_1; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "time_spin_ctrl_2_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 206 122; + rel1 { + to: "time_spin_ctrl_2_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "time_spin_ctrl_2_swallow_padding"; + } + fixed: 1 1; + align: 0.0 0.0; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: SWALLOW_TIME_SPIN_2; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 206 122; + rel1 { + to: "time_spin_ctrl_2_swallow_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "time_spin_ctrl_2_swallow_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + } + programs { + program { + name: "time_spin_ctrl_1"; + signal: SIGNAL_NAME_TIME_SPIN_1; + source: SIGNAL_SOURCE_TIME_SPIN; + action: STATE_SET "hide" 0.0; + target: "time_spin_ctrl_2_bg"; + } + program { + name: "time_spin_ctrl_2"; + signal: SIGNAL_NAME_TIME_SPIN_2; + source: SIGNAL_SOURCE_TIME_SPIN; + action: STATE_SET "hide" 0.0; + target: "time_spin_ctrl_1_bg"; + target: "separate_line_1"; + } + } + } +} diff --git a/ug/system/clock/edje/ug_clock_theme.edc b/ug/system/clock/edje/ug_clock_theme.edc new file mode 100755 index 0000000..627e454 --- /dev/null +++ b/ug/system/clock/edje/ug_clock_theme.edc @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/ug_clock_define.h" + +collections { + #include "widgets/button.edc" +} diff --git a/ug/system/clock/edje/widgets/button.edc b/ug/system/clock/edje/widgets/button.edc new file mode 100755 index 0000000..4d346e3 --- /dev/null +++ b/ug/system/clock/edje/widgets/button.edc @@ -0,0 +1,1550 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "elm/button/base/close_btn"; + images { + image: "round_rectangle_4X4.png" COMP; + } + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 216 70; + image { + normal: "round_rectangle_4X4.png"; + border: 4 4 4 4; + } + color: 204 204 204 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 204 204 204 102; + } + } + part { + name: "bg_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 176 70; + rel1 { + to: "bg_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "bg_text_padding"; + } + text { + size: 28; + align: 0.5 0.5; + } + color: 89 89 89 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 102; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + } + } +} + +group { + name: "elm/button/base/clock_sublist_btn"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 680 82; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "line_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 0 80; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "line"; + type: RECT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 680 2; + rel1 { + to: "line_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "line_padding"; + } + color: 222 222 222 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "elm_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 40 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 250 82; + rel1 { + to: "elm_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "elm_text_padding"; + } + text { + size: 30; + align: 0.0 0.5; + } + color: 89 89 89 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 76; + } + } + part { + name: "value_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 400 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: BTN_PART_VALUE; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 240 82; + rel1 { + to: "value_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "value_padding"; + } + text { + size: 30; + align: 1.0 0.5; + } + color: 89 89 89 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 76; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + target: "line"; + target: "value"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "line"; + target: "value"; + } + program { + name: "after_clicked"; + signal: SIGNAL_NAME_AFTER_CLICK; + source: SIGNAL_SOURCE_BTN; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + target: "line"; + target: "value"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "value"; + target: "line"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + target: "value"; + target: "line"; + } + } +} + +group { + name: "elm/button/base/clock_sublist_last_btn"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 680 60; + align: 0 0; + fixed: 1 1; + } + } + } +} + +group { + name: "elm/button/base/spin_ctrl_btn"; + images { + image: "spincontrol_arrow_up.png" COMP; + image: "spincontrol_arrow_down.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 101 122; + align: 0 0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "up_arrow_image_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 33 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "up_arrow_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 35 27; + image { + normal: "spincontrol_arrow_up.png"; + } + rel1 { + to: "up_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "up_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "up_btn_swallow"; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + min: 35 27; + rel1 { + to: "up_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "up_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "elm_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 33 27; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 35 68; + rel1 { + to: "elm_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "elm_text_padding"; + } + text { + size: 30; + align: 0.5 0.5; + } + color: 69 143 255 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "down_arrow_image_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 33 95; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "down_arrow_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 35 27; + image { + normal: "spincontrol_arrow_down.png"; + } + rel1 { + to: "down_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "down_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "down_btn_swallow"; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + min: 35 27; + rel1 { + to: "down_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "down_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + target: "up_arrow_image"; + target: "down_arrow_image"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "up_arrow_image"; + target: "down_arrow_image"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + } +} + +group { + name: "elm/button/base/spin_ctrl_year_btn"; + images { + image: "spincontrol_arrow_up.png" COMP; + image: "spincontrol_arrow_down.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 138 122; + align: 0 0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "up_arrow_image_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 103/2 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "up_arrow_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 35 27; + image { + normal: "spincontrol_arrow_up.png"; + } + rel1 { + to: "up_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "up_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "up_btn_swallow"; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + min: 35 27; + rel1 { + to: "up_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "up_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "elm_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 34 27; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 70 68; + rel1 { + to: "elm_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "elm_text_padding"; + } + text { + size: 30; + align: 0.5 0.5; + } + color: 69 143 255 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "down_arrow_image_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 103/2 95; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "down_arrow_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 35 27; + image { + normal: "spincontrol_arrow_down.png"; + } + rel1 { + to: "down_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "down_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "down_btn_swallow"; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + min: 35 27; + rel1 { + to: "down_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "down_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + target: "up_arrow_image"; + target: "down_arrow_image"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "up_arrow_image"; + target: "down_arrow_image"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + } +} + +group { + name: "elm/button/base/sublist_btn"; + images { + image: "ico_dropdown_menu_check.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 310 81; + align: 0 0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "elm_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 32 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 208 81; + rel1 { + to: "elm_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "elm_text_padding"; + } + text { + size: 30; + align: 0.0 0.5; + } + color: 69 143 255 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "icon_image_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 20 55/2; + rel1 { + to: "elm.text"; + relative: 1.0 0.0; + } + rel2 { + to: "elm.text"; + relative: 1.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "icon_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 26 26; + image { + normal: "ico_dropdown_menu_check.png"; + } + rel1 { + to: "icon_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "icon_image_padding"; + } + color: 69 143 255 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "hide" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + set_state(PART:"bg", "focus", 0.0); + set_state(PART:"elm.text", "focus", 0.0); + set_state(PART:"icon_image", "hide", 0.0); + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + script { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"icon_image", "hide", 0.0); + } + } + program { + name: "focus_show_icon"; + signal: "focus_show_icon"; + source: "sublist"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + target: "icon_image"; + } + program { + name: "focus_hide_icon"; + signal: "focus_hide_icon"; + source: "sublist"; + script { + set_state(PART:"bg", "focus", 0.0); + set_state(PART:"elm.text", "focus", 0.0); + set_state(PART:"icon_image", "hide", 0.0); + } + } + program { + name: "unfocus_show_icon"; + signal: "unfocus_show_icon"; + source: "sublist"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "icon_image"; + } + program { + name: "unfocus_hide_icon"; + signal: "unfocus_hide_icon"; + source: "sublist"; + script { + set_state(PART:"bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + set_state(PART:"icon_image", "hide", 0.0); + } + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "icon_image"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "icon_image"; + } + } +} + +group { + name: "elm/button/base/time_spin_ctrl_btn"; + images { + image: "spincontrol_arrow_up.png" COMP; + image: "spincontrol_arrow_down.png" COMP; + } + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 102 122; + align: 0 0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "up_arrow_image_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 33 0; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "up_arrow_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 35 27; + image { + normal: "spincontrol_arrow_up.png"; + } + rel1 { + to: "up_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "up_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "up_btn_swallow"; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + min: 35 27; + rel1 { + to: "up_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "up_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "elm_text_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 26 27; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 50 68; + rel1 { + to: "elm_text_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "elm_text_padding"; + } + text { + size: 30; + align: 0.5 0.5; + } + color: 69 143 255 255; + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "down_arrow_image_padding"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 33 95; + rel1 { + to: "bg"; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "down_arrow_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + min: 35 27; + image { + normal: "spincontrol_arrow_down.png"; + } + rel1 { + to: "down_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "down_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "down_btn_swallow"; + type: SWALLOW; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + min: 35 27; + rel1 { + to: "down_arrow_image_padding"; + relative: 1.0 1.0; + } + rel2 { + to: "down_arrow_image_padding"; + } + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "bg"; + target: "elm.text"; + target: "up_arrow_image"; + target: "down_arrow_image"; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + target: "up_arrow_image"; + target: "down_arrow_image"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program{ + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + target: "elm.text"; + } + } +} + +group { + name: "elm/button/base/spin_arrow_btn"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + mouse_events: 0; + repeat_events: 0; + description { + state: "default" 0.0; + min: 35 27; + align: 0 0; + fixed: 1 1; + color: 0 0 0 0; + } + } + part { + name: "event"; + type: RECT; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + after: "button_click_anim"; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + after: "button_unclick_anim"; + } + program { + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "button_click_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + } + program { + name: "button_unclick_anim"; + action: STATE_SET "default" 0.0; + target: "bg"; + } + } +} \ No newline at end of file diff --git a/ug/system/clock/include/dbg.h b/ug/system/clock/include/dbg.h new file mode 100755 index 0000000..a2ff87a --- /dev/null +++ b/ug/system/clock/include/dbg.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DBG_H__ + +#include + +#ifndef _ERR +#define _ERR(fmt, args...) LOGE("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#ifndef _DBG +#define _DBG(fmt, args...) LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#ifndef _INFO +#define _INFO(fmt, args...) LOGI("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#endif /* __DBG_H__ */ diff --git a/ug/system/clock/include/ug_clock.h b/ug/system/clock/include/ug_clock.h new file mode 100755 index 0000000..4c4e6b4 --- /dev/null +++ b/ug/system/clock/include/ug_clock.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UG_CLOCK_H__ +#define __UG_CLOCK_H__ + +#include + +void view_ug_clock_refresh(Evas_Object *base, unsigned int *date, int *time); + +#endif /* __UG_CLOCK_H__ */ diff --git a/ug/system/clock/include/ug_clock_define.h b/ug/system/clock/include/ug_clock_define.h new file mode 100755 index 0000000..6b0527f --- /dev/null +++ b/ug/system/clock/include/ug_clock_define.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UG_CLOCK_DEFINE_H__ +#define __UG_CLOCK_DEFINE_H__ + +#define ON "ON" +#define OFF "OFF" +#define AM "AM" +#define PM "PM" + +/* definitions for ug_clock.edc */ +/* UG_CLOCK_GRP */ +#define UG_CLOCK_GRP "main" +/* SWALLOW of UG_CLOCK_GRP */ +#define SWALLOW_CLOSE_BTN "close_btn_swallow" +#define SWALLOW_CLOCK_LIST "clock_list_swallow" +#define SWALLOW_CLOCK_LAST "clock_list_last_btn_swallow" +/* TEXT of UG_CLOCK_GRP */ +#define TEXT_INTRO "intro_text" +/* strings */ +#define STRINGS_INTRO "You can set date and time." + +/* SPIN_CTRL_GRP */ +#define SPIN_CTRL_GRP "spin_ctrl_grp" + +/* SUBLIST_GRP */ +#define SUBLIST_GRP "sublist_grp" +/* SWALLOW of SUBLIST_GRP */ +#define SWALLOW_SUBLIST "sublist_swallow" + +/* TIME_SPIN_CTRL_GRP */ +#define TIME_SPIN_CTRL_GRP "time_spin_ctrl_grp" +/* SWALLOW of TIME_SPIN_CTRL_GRP */ +#define SWALLOW_TIME_SPIN_1 "time_spin_1_swallow" +#define SWALLOW_TIME_SPIN_2 "time_spin_2_swallow" +/* SIGNAL of TIME_SPIN_CTRL_GRP */ +#define SIGNAL_SOURCE_TIME_SPIN "time_spin_ctrl" +#define SIGNAL_NAME_TIME_SPIN_1 "time_spin_ctrl_1" +#define SIGNAL_NAME_TIME_SPIN_2 "time_spin_ctrl_2" + +/* definitions for button.edc */ +#define BTN_STYLE_CLOSE_BTN "close_btn" +#define BTN_STYLE_LIST_BTN "clock_sublist_btn" +#define BTN_STYE_LAST_BTN "clock_sublist_last_btn" +#define BTN_STYLE_SPIN_CTRL_BTN "spin_ctrl_btn" +#define BTN_STYLE_SPIN_CTRL_YEAR_BTN "spin_ctrl_year_btn" +#define BTN_STYLE_ARROW_BTN "spin_arrow_btn" +#define BTN_STYLE_TIME_SPIN_BTN "time_spin_ctrl_btn" +#define BTN_STYLE_SUBLIST_BTN "sublist_btn" + +#define UP_ARROW_SWALLOW "up_btn_swallow" +#define DOWN_ARROW_SWALLOW "down_btn_swallow" + +#define BTN_TEXT_CLOSE "Close" +#define BTN_TEXT_DATE "Date" +#define BTN_TEXT_24HOUR_TIME "24-hour time" +#define BTN_TEXT_TIME "Time" + +#define BTN_PART_VALUE "value" + +#define SIGNAL_SOURCE_BTN "source_btn" +#define SIGNAL_NAME_AFTER_CLICK "after_clicked" + +#define SIG_SRC_FOC_SHOW_ICON "focus_show_icon" +#define SIG_SRC_UNFOC_HIDE_ICON "unfocus_hide_icon" +#define SIG_SRC_UNFOC_SHOW_ICON "unfocus_show_icon" +#define SIG_SRC_FOC_HIDE_ICON "focus_hide_icon" +#define SIG_NAME_SUBLIST "sublist" + +/* Key defines */ +#define KEY_UP "Up" +#define KEY_DOWN "Down" +#define KEY_LEFT "Left" +#define KEY_RIGHT "Right" + +#define KEY_0 "0" +#define KEY_1 "1" +#define KEY_2 "2" +#define KEY_3 "3" +#define KEY_4 "4" +#define KEY_5 "5" +#define KEY_6 "6" +#define KEY_7 "7" +#define KEY_8 "8" +#define KEY_9 "9" + +#endif /* __UG_CLOCK_DEFINE_H__ */ diff --git a/ug/system/clock/include/ug_clock_spin_control.h b/ug/system/clock/include/ug_clock_spin_control.h new file mode 100755 index 0000000..e8b7f9c --- /dev/null +++ b/ug/system/clock/include/ug_clock_spin_control.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef __UG_CLOCK_SPIN_CONTROL_H__ +#define __UG_CLOCK_SPIN_CONTROL_H__ + +#include + +void view_spin_control_create(Evas_Object *win, + Evas_Object *ug_base); + +#endif /* __UG_CLOCK_SPIN_CONTROL_H__ */ diff --git a/ug/system/clock/include/ug_clock_sublist.h b/ug/system/clock/include/ug_clock_sublist.h new file mode 100755 index 0000000..a71dea1 --- /dev/null +++ b/ug/system/clock/include/ug_clock_sublist.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UG_CLOCK_SUBLIST_H__ +#define __UG_CLOCK_SUBLIST_H__ + +#include + +void view_sublist_create(Evas_Object *win, Evas_Object *ug_base); + +#endif /* __UG_CLOCK_SUBLIST_H__ */ diff --git a/ug/system/clock/include/ug_clock_time_spin_control.h b/ug/system/clock/include/ug_clock_time_spin_control.h new file mode 100755 index 0000000..d9f920f --- /dev/null +++ b/ug/system/clock/include/ug_clock_time_spin_control.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UG_CLOCK_TIME_SPIN_CONTROL_H__ +#define __UG_CLOCK_TIME_SPIN_CONTROL_H__ + +#include + +void view_time_spin_ctrl_create(Evas_Object *win, + Evas_Object *ug_base); + +#endif /* __UG_CLOCK_TIME_SPIN_CONTROL_H__ */ diff --git a/ug/system/clock/include/ug_clock_utils.h b/ug/system/clock/include/ug_clock_utils.h new file mode 100755 index 0000000..bfd87d5 --- /dev/null +++ b/ug/system/clock/include/ug_clock_utils.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UG_CLOCK_UTILS_H__ +#define __UG_CLOCK_UTILS_H__ + +#include +#include + +#define BUF_SIZE 32 + +/* TODO: Add vconf definition for 24 hour mode. */ +#define VCONF_KEY_24HOUR_MODE "db/menu/system/clock/24hour_mode" + +/* Clock mode: 0 Auto, 1 Manual */ +enum { + CLOCK_MODE_AUTO = 0, + CLOCK_MODE_MANUAL +}; + +enum { + HOUR_MODE_AM = 0, + HOUR_MODE_PM +}; + +enum { + DATE_MONTH = 0, + DATE_DAY, + DATE_YEAR, + DATE_MAX +}; + +enum { + TIME_HOUR = 0, + TIME_MINUTE, + TIME_AMPM, + TIME_MAX +}; + +Evas_Object *utils_add_button(Evas_Object *parent); +Evas_Object *utils_add_layout(Evas_Object *parent); +Evas_Object *utils_add_box(Evas_Object *parent); + +void utils_get_date_value(unsigned int *date); +void utils_set_date_value(unsigned int *date); +void utils_get_time_value(int *time); +void utils_set_time_value(int *time); + +int utils_set_vconf_value(const char *key, int value); +int utils_get_vconf_value(const char *key, int *value); + +#endif /* __UG_CLOCK_UTILS_H__ */ diff --git a/ug/system/clock/src/ug_clock.c b/ug/system/clock/src/ug_clock.c new file mode 100755 index 0000000..207c8e2 --- /dev/null +++ b/ug/system/clock/src/ug_clock.c @@ -0,0 +1,1188 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UG_MODULE_API +#define UG_MODULE_API __attribute__ ((visibility("default"))) +#endif + +#include +#include +#include + +#include "ug_clock_utils.h" +#include "ug_clock.h" +#include "ug_clock_define.h" +#include "dbg.h" +#include "ug_clock_spin_control.h" +#include "ug_clock_sublist.h" +#include "ug_clock_time_spin_control.h" + +#define CLOCK_SUBLIST_NULL_BTNS 2 +#define UG_CLOCK_DATA_ID "ug_clock_data" + +struct _ug_data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *close_btn; + Evas_Object *date_btn; + Evas_Object *switch_btn; + Evas_Object *time_btn; + Evas_Object *sublist_box; + Evas_Object *cur_btn; + + unsigned int date[DATE_MAX]; + int mode; + int time[TIME_MAX]; + + ui_gadget_h ug; +}; + +/** +* Free allocated memory. +* +* This function frees allocated memory when needed. +* +* @param[in]: data : the user data of clock ug. +* +* @return: void. +*/ +static void _free_ug_data(struct _ug_data *data) +{ + if (!data) + return; + + if (data->base) { + evas_object_del(data->base); + data->base = NULL; + } + + free(data); +} + +/** +* This function will be invoked when the BACK key is pressed. +* When the BACK key is pressed, this UI gadget will be destroyed. +* +* @param[in]: keyname : the name of pressed key. +* @param[in]: data : the user data of clock ug. +* +* @return: void. +*/ +static void _key_down_cb(const char *keyname, struct _ug_data *data) +{ + if (!keyname || !data || !data->ug) + return; + + if (!strncmp(keyname, KEY_BACK, strlen(keyname))) + ug_destroy_me(data->ug); +} + +/** +* Callback function for button click event. +* +* This function will be invoked when the close button is clicked or +* the ENTER key is pressed. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the pointer of clicked evas object. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _close_btn_clicked_cb(void *priv, Evas_Object *obj, void *ei) +{ + struct _ug_data *data; + + if (!priv) { + _ERR("private data is null."); + return; + } + + data = priv; + ug_destroy_me(data->ug); +} + +/** +* Callback function for key pressed event. +* +* This function will be invoked when this the close button is focused +* and the BACK key is pressed. +* +* @param[in]: priv : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the current evas object. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _key_down_on_close_btn_cb(void *priv, Evas *e, + Evas_Object *obj, void *ei) +{ + struct _ug_data *data; + Evas_Event_Key_Down *event; + const char *keyname; + + if (!priv || !ei) { + _ERR("invalid argument."); + return; + } + + event = ei; + keyname = event->keyname; + + if (!keyname) + return; + + data = priv; + + _key_down_cb(keyname, data); +} + +/** +* Callback function for key pressed event. +* +* This function will be invoked when BACK key is pressed. +* When the BACK key is pressed, this UI gadget will be destroyed. +* +* @param[in]: priv : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the current evas object. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _key_down_on_btns_cb(void *priv, Evas *e, + Evas_Object *obj, void *ei) +{ + struct _ug_data *data; + Evas_Event_Key_Down *event; + const char *keyname; + + if (!priv || !ei) { + _ERR("invalid argument."); + return; + } + + event = ei; + keyname = event->keyname; + if (!keyname) + return; + + data = priv; + + _key_down_cb(keyname, data); +} + +/** +* Mouse in event callback. +* +* This function will be invoked when the mouse moves in the region of +* close button. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the current evas object. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _close_btn_mouse_in_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** +* Mouse out event callback. +* +* This function will be invoked when the mouse moves out the region of +* close button. +* +* @param[in]: dt The pointer of private data. +* @param[in]: e The evas canvas. +* @param[in]: obj The current evas object. +* @param[in]: ei The event info. +* +* @return: void. +*/ +static void _close_btn_mouse_out_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + /* TODO: Add necessary operation when needed. */ +} + +/** +* Add close button. +* +* This function adds close button for clock UI gadget. +* +* @param[in]: parent : the parent base layout of clock UI gadget. +* @param[in]: data : the user data. +* +* @return: The pointer of created evas object button or NULL. +*/ +static Evas_Object *_add_close_btn(Evas_Object *parent, + struct _ug_data *data) +{ + Evas_Object *btn; + + if (!parent || !data) { + _ERR("parent of close button is null."); + return NULL; + } + + btn = utils_add_button(parent); + if (!btn) { + _ERR("elm add button failed."); + return NULL; + } + + data->close_btn = btn; + + elm_object_style_set(btn, BTN_STYLE_CLOSE_BTN); + elm_object_text_set(btn, BTN_TEXT_CLOSE); + elm_object_part_content_set(parent, SWALLOW_CLOSE_BTN, btn); + + evas_object_smart_callback_add(data->close_btn, "clicked", + _close_btn_clicked_cb, data); + evas_object_event_callback_add(data->close_btn, EVAS_CALLBACK_KEY_DOWN, + _key_down_on_close_btn_cb, data); + evas_object_event_callback_add(data->close_btn, + EVAS_CALLBACK_MOUSE_IN, _close_btn_mouse_in_cb, data); + evas_object_event_callback_add(data->close_btn, + EVAS_CALLBACK_MOUSE_OUT, _close_btn_mouse_out_cb, data); + + return btn; +} + +/** +* CLICKED event callback. +* +* This is the CLICKED event callback function for 24 Hour mode button. +* When user clicks the 24 Hour mode button or the ENTER key is pressed +* on this button, this function will be triggered to show the sub UI of +* 24 Hour mode button. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the 24 Hour mode button. +* @param[in]: ei : the event info. +* +* @return: void. +*/ +static void _switch_btn_clicked_cb(void *priv, Evas_Object *obj, void *ei) +{ + struct _ug_data *data; + + if (!priv) + return; + + data = priv; + data->cur_btn = obj; + + view_sublist_create(data->win, data->base); + + elm_object_signal_emit(obj, SIGNAL_NAME_AFTER_CLICK, + SIGNAL_SOURCE_BTN); +} + +/** +* MOUSEIN event callback function. +* +* This is the MOUSEIN event callback function for 24 Hour mode +* button. When the mouse moves in the region of 24 Hour mode +* button, this function will be called. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the 24 Hour mode button. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _switch_btn_mouse_in_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** +* MOUSEOUT event callback function. +* +* This is the MOUSEOUT event callback function for 24 Hour mode +* button. When the mouse moves out of the region of 24 Hour mode +* button, this function will be called. Till now there is no operation +* in this function, and you can add operations here as needed. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the 24 Hour mode button. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _switch_btn_mouse_out_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + /* TODO: Add necessary operations when needed. */ +} + +/** +* This function creates the 24 Hour mode item button. +* +* @param[in]: data : the user data. +* +* @return: The created evas object 24 Hour mode button or NULL. +*/ +static Evas_Object *_add_clock_sublist_switch_btn( + struct _ug_data *data) +{ + Evas_Object *switch_btn; + const char *display; + int ret; + + if (!data) { + _ERR("data is null."); + return NULL; + } + + switch_btn = utils_add_button(data->base); + if (!switch_btn) { + _ERR("add button failed."); + return NULL; + } + + elm_object_style_set(switch_btn, BTN_STYLE_LIST_BTN); + elm_object_text_set(switch_btn, BTN_TEXT_24HOUR_TIME); + + elm_box_pack_end(data->sublist_box, switch_btn); + + /* Set ON/OFF for switch button. */ + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &data->mode); + if (ret != 0) { + _ERR("vconf get value failed."); + return NULL; + } + + if (!data->mode) + display = OFF; + else + display = ON; + + elm_object_part_text_set(switch_btn, BTN_PART_VALUE, display); + + evas_object_event_callback_add(switch_btn, + EVAS_CALLBACK_KEY_DOWN, _key_down_on_btns_cb, data); + evas_object_smart_callback_add(switch_btn, + "clicked", _switch_btn_clicked_cb, data); + evas_object_event_callback_add(switch_btn, + EVAS_CALLBACK_MOUSE_IN, _switch_btn_mouse_in_cb, NULL); + evas_object_event_callback_add(switch_btn, EVAS_CALLBACK_MOUSE_OUT, + _switch_btn_mouse_out_cb, NULL); + + return switch_btn; +} + +/** +* CLICKED event callback function. +* +* This is the clicked event callback function for Date button. +* When user clicks the Date button or ENTER key is pressed, +* this function will be called to show sub UI of Date button. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the Date button. +* @param[in]: ei : the event info. +* +* @return: void. +*/ +static void _date_btn_clicked_cb(void *priv, Evas_Object *obj, void *ei) +{ + struct _ug_data *data; + + if (!priv || !obj) { + _ERR("invalid argument."); + return; + } + + data = priv; + data->cur_btn = obj; + + view_spin_control_create(data->win, data->base); + + elm_object_signal_emit(obj, SIGNAL_NAME_AFTER_CLICK, + SIGNAL_SOURCE_BTN); +} + +/** +* MOUSEIN event callback function. +* +* This is the MOUSEIN event callback function for Date button. +* When the mouse moves in the region of Date button, this +* function will be called. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the Date button. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _date_btn_mouse_in_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** +* MOUSEOUT event callback function. +* +* This is the MOUSEOUT event callback function for Date button. +* When the mouse moves out of the region of Date button, this +* function will be called. Till now there is no operation in this +* function, and you can add operations here as needed. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the Date button. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _date_btn_mouse_out_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + /* TODO: Add necessary operations when needed. */ +} + +/** +* This function creates the Date item button. +* +* @param[in]: data : the user data. +* +* @return: The created evas object Date button or NULL. +*/ +static Evas_Object *_add_clock_sublist_date_btn(struct _ug_data *data) +{ + Evas_Object *date_btn; + char buf[BUF_SIZE]; + + if (!data) { + _ERR("data is null."); + return NULL; + } + + date_btn = utils_add_button(data->base); + if (!date_btn) { + _ERR("add button failed."); + return NULL; + } + + elm_object_style_set(date_btn, BTN_STYLE_LIST_BTN); + elm_object_text_set(date_btn, BTN_TEXT_DATE); + + elm_box_pack_end(data->sublist_box, date_btn); + + elm_object_focus_set(date_btn, EINA_TRUE); + + utils_get_date_value(data->date); + + snprintf(buf, sizeof(buf), + "%02d / %02d / %04d", data->date[DATE_MONTH], + data->date[DATE_DAY], data->date[DATE_YEAR]); + + elm_object_part_text_set(date_btn, BTN_PART_VALUE, (const char *)buf); + + evas_object_event_callback_add(date_btn, + EVAS_CALLBACK_KEY_DOWN, _key_down_on_btns_cb, data); + evas_object_smart_callback_add(date_btn, + "clicked", _date_btn_clicked_cb, data); + evas_object_event_callback_add(date_btn, + EVAS_CALLBACK_MOUSE_IN, _date_btn_mouse_in_cb, NULL); + evas_object_event_callback_add(date_btn, + EVAS_CALLBACK_MOUSE_OUT, _date_btn_mouse_out_cb, NULL); + + return date_btn; +} + +/** +* CLICKED event callback function. +* +* This is the clicked event callback function for Time button. +* When user clicks the Time button or ENTER key is pressed +* on this button, this function will be called to show sub UI +* of Time button. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the Time button. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _time_btn_clicked_cb(void *priv, Evas_Object *obj, void *ei) +{ + struct _ug_data *data; + + if (!priv) + return; + + data = priv; + data->cur_btn = obj; + + view_time_spin_ctrl_create(data->win, data->base); + + elm_object_signal_emit(obj, SIGNAL_NAME_AFTER_CLICK, + SIGNAL_SOURCE_BTN); +} + +/** +* Refresh text of Time button. +* +* @param[in]: btn : the Time button. +* @param[in]: time : the refreshed value of time. +* +* @return: void. +*/ +static void _refresh_time_btn_text(Evas_Object *btn, int *time) +{ + int mode; + char buf[BUF_SIZE]; + int ret; + + if (!btn || !time) + return; + + mode = 0; + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &mode); + if (ret != 0) { + _ERR("vconf get value failed."); + return; + } + + if (mode) { + snprintf(buf, sizeof(buf), "%02d : %02d", + time[TIME_HOUR], time[TIME_MINUTE]); + } else { + if (time[TIME_HOUR] >= 12) { + time[TIME_HOUR] -= 12; + time[TIME_AMPM] = 1; + } else { + time[TIME_AMPM] = 0; + } + + snprintf(buf, sizeof(buf), "%02d : %02d : %s", + time[TIME_HOUR], time[TIME_MINUTE], + time[TIME_AMPM] == 1 ? PM : AM); + } + + elm_object_part_text_set(btn, BTN_PART_VALUE, (const char *)buf); +} + +/** +* MOUSEIN event callback function. +* +* This is the MOUSEIN event callback function for Time button. +* When the mouse moves in the region of Time button, this +* function will be called. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the Time button. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _time_btn_mouse_in_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** +* MOUSEOUT event callback function. +* +* This is the MOUSEOUT event callback function for Time button. +* When the mouse moves out of the region of Time button, this +* function will be called. Till now there is no operation in this +* function, and you can add operations here as needed. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas canvas. +* @param[in]: obj : the Time button. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _time_btn_mouse_out_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + /* TODO: Add necessary operations when needed. */ +} + +/** +* This function creates the Time item button. +* +* @param[in]: data : the user data. +* +* @return: The created evas object Date button or NULL. +*/ +static Evas_Object *_add_clock_sublist_time_btn( + struct _ug_data *data) +{ + Evas_Object *time_btn; + + if (!data || !data->base) { + _ERR("invalid argument."); + return NULL; + } + + time_btn = utils_add_button(data->base); + if (!time_btn) { + _ERR("add time button failed."); + return NULL; + } + + elm_object_style_set(time_btn, BTN_STYLE_LIST_BTN); + elm_object_text_set(time_btn, BTN_TEXT_TIME); + + elm_box_pack_end(data->sublist_box, time_btn); + + /* Set hour : minute : AM/PM for time button. */ + utils_get_time_value(data->time); + + _refresh_time_btn_text(time_btn, data->time); + + evas_object_event_callback_add(time_btn, + EVAS_CALLBACK_KEY_DOWN, _key_down_on_btns_cb, data); + evas_object_smart_callback_add(time_btn, + "clicked", _time_btn_clicked_cb, data); + evas_object_event_callback_add(time_btn, + EVAS_CALLBACK_MOUSE_IN, _time_btn_mouse_in_cb, NULL); + evas_object_event_callback_add(time_btn, + EVAS_CALLBACK_MOUSE_OUT, _time_btn_mouse_out_cb, NULL); + + return time_btn; +} + +/** +* Create unused buttons. +* +* There is a unused region of clock UI gadget. We use blank +* buttons to implement this unused region. This function +* creates the unused region. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_clock_sublist_null_btn(struct _ug_data *data) +{ + Evas_Object *null_btn; + Evas_Object *last_btn; + int idx; + + if (!data || !data->base) { + _ERR("invalid argument."); + return -1; + } + + for (idx = 0; idx < CLOCK_SUBLIST_NULL_BTNS; idx++) { + null_btn = utils_add_button(data->base); + if (!null_btn) { + _ERR("add null button failed."); + return -1; + } + + elm_object_style_set(null_btn, BTN_STYLE_LIST_BTN); + elm_box_pack_end(data->sublist_box, null_btn); + } + + last_btn = utils_add_button(data->base); + if (!last_btn) { + _ERR("add last button failed."); + return -1; + } + + elm_object_style_set(last_btn, BTN_STYE_LAST_BTN); + elm_object_part_content_set( + data->base, SWALLOW_CLOCK_LAST, last_btn); + + return 0; +} + +/** +* Set moving directions of focus for created buttons. +* +* @param[in]: data : the user data. +* +* @return: void. +*/ +static void _set_btn_directions(struct _ug_data *data) +{ + Evas_Object *dbtn, *sbtn, *tbtn, *cbtn; + + if (!data || !data->date_btn || + !data->switch_btn || !data->time_btn) { + _ERR("all the sublist buttons may null."); + return; + } + + dbtn = data->date_btn; + sbtn = data->switch_btn; + tbtn = data->time_btn; + cbtn = data->close_btn; + + elm_object_focus_next_object_set(dbtn, dbtn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(dbtn, dbtn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(dbtn, sbtn, ELM_FOCUS_DOWN); + /* Maybe it's not necessary to set ELM_FOCUS_RIGHT for date_btn */ + elm_object_focus_next_object_set(dbtn, cbtn, ELM_FOCUS_RIGHT); + + elm_object_focus_next_object_set(sbtn, tbtn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(sbtn, dbtn, ELM_FOCUS_UP); + /* Maybe it's not necessary to set ELM_FOCUS_RIGHT for switch_btn */ + elm_object_focus_next_object_set(sbtn, cbtn, ELM_FOCUS_RIGHT); + + elm_object_focus_next_object_set(tbtn, tbtn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(tbtn, sbtn, ELM_FOCUS_UP); + /* Maybe it's not necessary to set ELM_FOCUS_RIGHT for time_btn */ + elm_object_focus_next_object_set(tbtn, cbtn, ELM_FOCUS_RIGHT); + + elm_object_focus_next_object_set(cbtn, cbtn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(cbtn, cbtn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(cbtn, dbtn, ELM_FOCUS_LEFT); +} + +/** +* Create buttons for clock UI gadget. +* +* The main UI of clock UI gadget contains three items which are Date, +* 24 Hour mode and Time. And they are implemented using buttons. +* This function is to create these three buttons. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_clock_sublist_btn(struct _ug_data *data) +{ + Evas_Object *date_btn; + Evas_Object *switch_btn; + Evas_Object *time_btn; + int ret; + + if (!data) + return -1; + + date_btn = _add_clock_sublist_date_btn(data); + if (!date_btn) { + _ERR("add date button failed."); + return -1; + } + + data->date_btn = date_btn; + + switch_btn = _add_clock_sublist_switch_btn(data); + if (!switch_btn) { + _ERR("add switch button failed."); + evas_object_del(data->date_btn); + return -1; + } + + data->switch_btn = switch_btn; + + time_btn = _add_clock_sublist_time_btn(data); + if (!time_btn) { + _ERR("add time button failed."); + evas_object_del(data->date_btn); + evas_object_del(data->switch_btn); + return -1; + } + + data->time_btn = time_btn; + + ret = _add_clock_sublist_null_btn(data); + if (ret != 0) { + _ERR("add null buttons failed."); + evas_object_del(data->date_btn); + evas_object_del(data->switch_btn); + evas_object_del(data->time_btn); + return -1; + } + + _set_btn_directions(data); + + return 0; +} + +/** +* Create UI components of clock UI gadget. +* +* This function creates the three UI components of clock UI gadget: +* Date, 24Hour mode and Time. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_clock_sublist(struct _ug_data *data) +{ + Evas_Object *box; + int ret; + + if (!data) + return -1; + + box = utils_add_box(data->base); + if (!box) { + _ERR("add clock sublist box failed."); + return -1; + } + + data->sublist_box = box; + + ret = _add_clock_sublist_btn(data); + if (ret != 0) { + _ERR("add clock sublist btn failed."); + evas_object_del(data->sublist_box); + return -1; + } + + elm_object_part_content_set( + data->base, SWALLOW_CLOCK_LIST, data->sublist_box); + + return 0; +} + +/** +* Create the UI of this ui gadget. +* +* This function creates all the UI components of this UI gadget. +* +* @param[in]: ug : the UI gadget created by ug_create(). +* @param[in]: mode : the mode of ug, fullview or frameview. +* @param[in]: service : argument for the UI gadget. +* @param[in]: priv : the user data. +* +* @return: The base layout of this UI gadget. +*/ +static void *_on_create(ui_gadget_h ug, + enum ug_mode mode, service_h service, void *priv) +{ + struct _ug_data *data; + Evas_Object *win; + Evas_Object *base; + Evas_Object *close_btn; + int ret; + + if (!ug || !priv) { + _ERR("ug or private data is null."); + return NULL; + } + + if ((mode == UG_MODE_INVALID) || + (mode >= UG_MODE_MAX) || (mode < UG_MODE_FULLVIEW)) { + _ERR("invalid ug mode."); + return NULL; + } + + elm_theme_overlay_add(NULL, UG_CLOCK_EDJTHEME); + + data = priv; + data->ug = ug; + + win = ug_get_window(); + if (!win) { + _ERR("ug get window failed."); + _free_ug_data(data); + return NULL; + } + + data->win = win; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + + base = utils_add_layout(win); + if (!base) { + _ERR("add base layout failed."); + _free_ug_data(data); + return NULL; + } + + elm_layout_file_set(base, UG_CLOCK_EDJFILE, UG_CLOCK_GRP); + elm_object_part_text_set( + base, TEXT_INTRO, STRINGS_INTRO); + data->base = base; + + close_btn = _add_close_btn(base, data); + if (!close_btn) { + _ERR("add close button for ug clock failed."); + _free_ug_data(data); + return NULL; + } + + ret = _add_clock_sublist(data); + if (ret == -1) { + _ERR("add clock sublist failed."); + evas_object_del(close_btn); + _free_ug_data(data); + return NULL; + } + + evas_object_data_set(data->base, UG_CLOCK_DATA_ID, data); + + return base; +} + +/** +* Destroy this UI gadget. +* +* This function destroyes all the UI components of this UI gadget. +* +* @param[in]: ug : UI gadget. +* @param[in]: service : argument of this UI gadget. +* @param[in]: priv : the user data. +* +* @return: void. +*/ +static void _on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ + struct _ug_data *data; + + if (!ug || !priv) { + _ERR("ug or private data is null."); + return; + } + + data = priv; + + _free_ug_data(data); +} + +/** +* Refresh text of Date button. +* +* @param[in]: btn : the Date button. +* @param[in]: date : the user data. +* +* @return: void. +*/ +static void _refresh_date_btn_text(Evas_Object *btn, unsigned int *date) +{ + char buf[BUF_SIZE]; + + if (!btn || !date) + return; + + snprintf(buf, sizeof(buf), "%02d / %02d / %04d", + date[DATE_MONTH], date[DATE_DAY], date[DATE_YEAR]); + elm_object_part_text_set(btn, BTN_PART_VALUE, (const char *)buf); +} + +/** +* Refresh text of 24 Hour mode button. +* +* @param[in]: btn : the 24 Hour mode button. +* @param[in]: mode : the refreshed value of mode. +* +* @return: void. +*/ +static void _refresh_switch_btn_text(Evas_Object *btn, int mode) +{ + if (!btn) + return; + + if (mode) + elm_object_part_text_set(btn, BTN_PART_VALUE, ON); + else + elm_object_part_text_set(btn, BTN_PART_VALUE, OFF); +} + +/** +* Change the way of displayed time. +* +* This function displays time as the 24 Hour mode changes. +* If 24 Hour mode is ON, we display the time using 24 hour mode. +* If 24 Hour mode is OFF, we display the time using 12 hour mode. +* +* @param[in]: btn : the Time button. +* @param[in]: time : the value of time. +* +* @return: void. +*/ +static void _refresh_time_btn_as_mode(Evas_Object *btn, int *time) +{ + int mode; + int ret; + char buf[BUF_SIZE]; + + if (!btn || !time) + return; + + mode = 0; + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &mode); + if (ret != 0) { + _ERR("vconf get value failed."); + return; + } + + if (mode) + snprintf(buf, sizeof(buf), "%02d : %02d", + time[TIME_HOUR], time[TIME_MINUTE]); + else + snprintf(buf, sizeof(buf), "%02d : %02d : %s", + time[TIME_HOUR], time[TIME_MINUTE], + time[TIME_AMPM] == 1 ? PM : AM); + + elm_object_part_text_set(btn, BTN_PART_VALUE, (const char *)buf); +} + +/** +* Refresh text of buttons. +* +* @param[in]: data : the user data. +* +* @return: void. +*/ +static void _refresh_btn_text(struct _ug_data *data) +{ + int ret; + + if (!data || !data->cur_btn) + return; + + if (data->date_btn == data->cur_btn) { + _refresh_date_btn_text(data->cur_btn, data->date); + } else if (data->switch_btn == data->cur_btn) { + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &data->mode); + if (ret != 0) { + _ERR("vconf get value failed."); + return; + } + + _refresh_switch_btn_text(data->cur_btn, data->mode); + + utils_get_time_value(data->time); + _refresh_time_btn_as_mode(data->time_btn, data->time); + } else { + _refresh_time_btn_text(data->cur_btn, data->time); + } +} + +/** +* Refresh the UI of clock UI gadget. +* +* This function refreshes the UI of clock UI gadget. For example, +* when the user sets a new date, this function will be called to refresh +* the date item of clock UI gadget. They are the same as mode item +* time item of clock UI gadget. +* +* @param[in]: base : the base layout of clock UI gadget. +* @param[in]: date : the user data. +* @param[in]: time : the new time need to be refreshed. +* +* @return: void. +*/ +void view_ug_clock_refresh(Evas_Object *base, unsigned int *date, int *time) +{ + struct _ug_data *data; + int idx; + + if (!base) { + _ERR("invalid argument."); + return; + } + + data = evas_object_data_get(base, UG_CLOCK_DATA_ID); + if (!data) { + _ERR("evas object data get failed. ID: %s", UG_CLOCK_DATA_ID); + return; + } + + elm_object_focus_set(data->cur_btn, EINA_TRUE); + + if (date) + for (idx = DATE_MONTH; idx < DATE_MAX; idx++) + data->date[idx] = date[idx]; + + if (time) + for (idx = TIME_HOUR; idx < TIME_MAX; idx++) + data->time[idx] = time[idx]; + + _refresh_btn_text(data); +} + +/** +* ug module init function. +* +* This function is the first function which is called by caller +* using dlopen() and dlsym(). +* +* @param[in]: ops : the struct ug_module_ops including +* callbacks which will be used in UI gadget module. +* +* @return: 0 - Success, -1 - Fail. +*/ +UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + struct _ug_data *priv; + + if (!ops) { + _ERR("invalid argument ops."); + return -1; + } + + priv = calloc(1, sizeof(*priv)); + if (!priv) { + _ERR("calloc memory for ug private data failed."); + return -1; + } + + ops->create = _on_create; + ops->destroy = _on_destroy; + ops->priv = priv; + ops->opt = UG_OPT_INDICATOR_ENABLE; + + return 0; +} + +/** +* ug module exit function. +* +* This function will be called by the caller when ug is unloaded. +* +* @param[in]: ops : the pointer of struct ug_module_ops. +* +* @return: void. +*/ +UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops) +{ + if (!ops) { + _ERR("invalid argument ops."); + return; + } +} diff --git a/ug/system/clock/src/ug_clock_spin_control.c b/ug/system/clock/src/ug_clock_spin_control.c new file mode 100644 index 0000000..5fe6a4c --- /dev/null +++ b/ug/system/clock/src/ug_clock_spin_control.c @@ -0,0 +1,797 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "dbg.h" +#include "ug_clock_define.h" +#include "ug_clock.h" +#include "ug_clock_spin_control.h" +#include "ug_clock_utils.h" + +#define ARROW_BTN_DATA_ID "arrow_btn_data_id" +#define DATE_SPIN_DATA_ID "spin_ctrl_data" +#define YEAR_BTN (2) + +#define UP_ARROW (1) +#define DOWN_ARROW (0) + +#define CLICKED "clicked" + +struct _date_spin_data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *ug_base; + + unsigned int date[DATE_MAX]; + int entry[DATE_MAX]; + + Eina_Array *spin_array; +}; + +static const int days[] = { + 31, + 28, + 31, + 30, + 31, + 30, + 31, + 31, + 30, + 31, + 30, + 31 +}; + +static void _destroy(Evas_Object *base); +static void _update_date_value(Evas_Object *spin, + unsigned int *date, int spin_idx); + +/** +* Free user data of date spin. +* +* @param[in]: data : the user data. +* +* @return: void. +*/ +static void _free_date_spin_data(struct _date_spin_data *data) +{ + if (!data) + return; + + if (data->base) { + evas_object_del(data->base); + data->base = NULL; + } + + if (data->spin_array) + eina_array_free(data->spin_array); + + free(data); +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +void _arrow_btn_clicked_cb(void *priv, Evas_Object *obj, void *ev) +{ + struct _date_spin_data *data; + Evas_Object *cur_btn; + Evas_Object *btn; + Evas_Object *up_btn; + int i; + int idx; + int flag; + + if (!priv || !obj) + return; + + data = priv; + cur_btn = evas_object_data_get(obj, ARROW_BTN_DATA_ID); + if (!cur_btn) { + _ERR("evas object data get failed. ID: %s", ARROW_BTN_DATA_ID); + return; + } + + up_btn = elm_object_part_content_get(cur_btn, UP_ARROW_SWALLOW); + if (!up_btn) { + _ERR("part %s content get failed.", UP_ARROW_SWALLOW); + return; + } + + if (obj == up_btn) + flag = 1; + else + flag = 0; + + idx = 0; + for (i = DATE_DAY; i < DATE_MAX; i++) { + btn = eina_array_data_get(data->spin_array, i); + if (!btn) { + _ERR("eina array data get failed. button index: %d", i); + return; + } + + if (cur_btn == btn) { + idx = i; + break; + } + } + + if (flag) + data->date[idx]++; + else + data->date[idx]--; + + _update_date_value(cur_btn, data->date, idx); + +} + +/** +* Create arrow buttons for date spin. +* +* @param[in]: data : the user data. +* @param[in]: obj : the corresponding object which the arrow created on. +* @param[in]: flag : 1 - up arrow button, 0 - down arrow button. +* +* @return: the created arrow button. +*/ +static Evas_Object *_add_arrow_btn(struct _date_spin_data *data, + Evas_Object *obj, int flag) +{ + Evas_Object *btn; + + if (!data || !data->base || !obj) + return NULL; + + btn = utils_add_button(data->base); + if (!btn) { + _ERR("utils add button failed."); + return NULL; + } + + elm_object_style_set(btn, BTN_STYLE_ARROW_BTN); + + if (flag == UP_ARROW) + elm_object_part_content_set(obj, UP_ARROW_SWALLOW, btn); + else + elm_object_part_content_set(obj, DOWN_ARROW_SWALLOW, btn); + + elm_object_focus_allow_set(btn, EINA_FALSE); + + evas_object_smart_callback_add(btn, "clicked", + _arrow_btn_clicked_cb, data); + + evas_object_data_set(btn, ARROW_BTN_DATA_ID, obj); + evas_object_raise(btn); + evas_object_repeat_events_set(btn, EINA_FALSE); + + return btn; +} + +/** +* Create date spin. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_date_spin(struct _date_spin_data *data) +{ + Evas_Object *btn, *uparrow, *downarrow; + Eina_Array *array; + char buf[BUF_SIZE]; + int idx; + + if (!data || !data->base) { + _ERR("invalid arguments."); + return -1; + } + + array = eina_array_new(1); + if (!array) { + _ERR("new eina array failed."); + return -1; + } + + for (idx = DATE_MONTH; idx < DATE_MAX; idx++) { + btn = utils_add_button(data->base); + if (!btn) { + _ERR("add spin control button failed."); + return -1; + } + + elm_object_style_set(btn, BTN_STYLE_SPIN_CTRL_BTN); + if (idx == YEAR_BTN) + elm_object_style_set(btn, BTN_STYLE_SPIN_CTRL_YEAR_BTN); + + snprintf(buf, sizeof(buf), "spin_ctrl_%d_swallow", idx + 1); + elm_object_part_content_set( + data->base, (const char *)buf, btn); + + eina_array_push(array, btn); + + uparrow = _add_arrow_btn(data, btn, UP_ARROW); + if (!uparrow) { + _ERR("add up arrow button failed."); + evas_object_del(btn); + return -1; + } + + downarrow = _add_arrow_btn(data, btn, DOWN_ARROW); + if (!downarrow) { + _ERR("add down arrow button failed."); + evas_object_del(btn); + evas_object_del(uparrow); + return -1; + } + } + + elm_object_focus_set( + eina_array_data_get(array, 0), EINA_TRUE); + + data->spin_array = array; + + return 0; +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _date_spin_clicked_cb(void *priv, Evas_Object *obj, void *ei) +{ + struct _date_spin_data *data; + + if (!priv) { + _ERR("invalid argument."); + return; + } + + data = priv; + + utils_set_date_value(data->date); + + view_ug_clock_refresh(data->ug_base, data->date, NULL); + + _destroy(data->base); +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse in event. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse in event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _date_spin_mousein_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse out event. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse out event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _date_spin_mouseout_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static int _add_date_spin_click_event(struct _date_spin_data *data) +{ + Evas_Object *spin; + Eina_Array *array; + int idx; + + if (!data || !data->spin_array) { + _ERR("no spin control buttons."); + return -1; + } + + array = data->spin_array; + + for (idx = DATE_MONTH; idx < DATE_MAX; idx++) { + spin = eina_array_data_get(array, idx); + if (!spin) { + _ERR("eina array data get failed. spin index: %d", idx); + return -1; + } + + evas_object_smart_callback_add(spin, CLICKED, + _date_spin_clicked_cb, data); + evas_object_event_callback_add(spin, EVAS_CALLBACK_MOUSE_IN, + _date_spin_mousein_cb, NULL); + evas_object_event_callback_add(spin, EVAS_CALLBACK_MOUSE_OUT, + _date_spin_mouseout_cb, NULL); + } + + return 0; +} + +/** +* Set focus move directions among buttons. +* +* @param[in]: array : the eina array including buttons. +* +* @return: void. +*/ +static void _set_date_spin_direction(Eina_Array *array) +{ + Evas_Object *spin; + int idx; + + if (!array) { + _ERR("spin control button array is null."); + return; + } + + for (idx = DATE_MONTH; idx < DATE_MAX; idx++) { + spin = eina_array_data_get(array, idx); + if (!spin) { + _ERR("there is no button. idx: %d", idx); + return; + } + + elm_object_focus_next_object_set(spin, spin, ELM_FOCUS_UP); + elm_object_focus_next_object_set(spin, spin, ELM_FOCUS_DOWN); + + if (idx == DATE_MONTH) { + elm_object_focus_next_object_set(spin, + eina_array_data_get(array, idx+1), + ELM_FOCUS_NEXT); + elm_object_focus_next_object_set(spin, spin, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(spin, + eina_array_data_get(array, idx + 1), + ELM_FOCUS_RIGHT); + } else if (idx == DATE_YEAR) { + elm_object_focus_next_object_set(spin, spin, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(spin, + eina_array_data_get(array, idx - 1), + ELM_FOCUS_LEFT); + } else { + elm_object_focus_next_object_set(spin, + eina_array_data_get(array, idx + 1), + ELM_FOCUS_NEXT); + elm_object_focus_next_object_set(spin, + eina_array_data_get(array, idx + 1), + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(spin, + eina_array_data_get(array, idx - 1), + ELM_FOCUS_LEFT); + } + } +} + +/** +* Initialize value of date spin. +* +* @param[in]: data : the user data. +* +* @return: void. +*/ +static void _init_date_spin(struct _date_spin_data *data) +{ + Evas_Object *spin; + Eina_Array *spin_array; + char buf[BUF_SIZE]; + + if (!data || !data->spin_array) + return; + + spin_array = data->spin_array; + + utils_get_date_value(data->date); + + spin = eina_array_data_get(spin_array, 0); + if (!spin) { + _ERR("month button is null."); + return; + } + + snprintf(buf, sizeof(buf), "%02d", data->date[DATE_MONTH]); + elm_object_text_set(spin, buf); + + spin = eina_array_data_get(spin_array, 1); + if (!spin) { + _ERR("month button is null."); + return; + } + + snprintf(buf, sizeof(buf), "%02d", data->date[DATE_DAY]); + elm_object_text_set(spin, buf); + + spin = eina_array_data_get(spin_array, 2); + if (!spin) { + _ERR("month button is null."); + return; + } + + data->date[DATE_YEAR] = data->date[DATE_YEAR] < 2000 ? + 2000 : data->date[DATE_YEAR]; + snprintf(buf, sizeof(buf), "%04d", data->date[DATE_YEAR]); + elm_object_text_set(spin, buf); +} + +/** +* Update value of date spin. +* +* @param[in]: spin : the corresponding date spin whose value need to update. +* @param[in]: date : the value to be updated. +* @param[in]: spin_idx : the index of corresponding date spin. +* +* @return: void. +*/ +static void _update_date_value(Evas_Object *spin, + unsigned int *date, int spin_idx) +{ + char buf[BUF_SIZE]; + + if (!spin || !date) + return; + if (spin_idx < DATE_MONTH || spin_idx >= DATE_MAX) + return; + + if (spin_idx == DATE_MONTH) { + if (date[spin_idx] > 12) + date[spin_idx] = 1; + if (date[spin_idx] <= 0) + date[spin_idx] = 12; + + snprintf(buf, sizeof(buf), "%02d", date[spin_idx]); + } else if (spin_idx == DATE_DAY) { + if (date[spin_idx] > days[date[DATE_MONTH] - 1]) + date[spin_idx] = 1; + if (date[spin_idx] <= 0) + date[spin_idx] = days[date[DATE_MONTH] - 1]; + + snprintf(buf, sizeof(buf), "%02d", date[spin_idx]); + } else { + if (date[spin_idx] > 2037) + date[spin_idx] = 2000; + if (date[spin_idx] < 2000) + date[spin_idx] = 2037; + + snprintf(buf, sizeof(buf), "%04d", date[spin_idx]); + } + + elm_object_text_set(spin, buf); +} + +/** +* Evas_Object_Event_Cb type callback for handling key press event. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the key press event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _date_spin_keydown_cb(void *priv, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *event; + struct _date_spin_data *data; + const char *keyname; + int i, idx; + Evas_Object *spin; + Eina_Array *spin_array; + char buf[BUF_SIZE]; + + if (!priv || !ei || !obj) { + _ERR("invalid argument."); + return; + } + + event = ei; + keyname = event->keyname; + if (!keyname) + return; + + data = priv; + + if (!data->spin_array) + return; + + spin_array = data->spin_array; + + idx = -1; + for (i = DATE_MONTH; i < DATE_MAX; i++) { + spin = eina_array_data_get(spin_array, i); + if (!spin) + return; + + if (obj == spin) { + idx = i; + break; + } + } + + if (idx == -1) { + _ERR("can't get the right spin."); + return; + } + + if (!strncmp(keyname, KEY_UP, strlen(keyname))) { + data->date[idx]++; + _update_date_value(obj, data->date, idx); + } else if (!strncmp(keyname, KEY_DOWN, strlen(keyname))) { + data->date[idx]--; + _update_date_value(obj, data->date, idx); + } else if (!strncmp(keyname, KEY_0, strlen(keyname)) || + !strncmp(keyname, KEY_1, strlen(keyname)) || + !strncmp(keyname, KEY_2, strlen(keyname)) || + !strncmp(keyname, KEY_3, strlen(keyname)) || + !strncmp(keyname, KEY_4, strlen(keyname)) || + !strncmp(keyname, KEY_5, strlen(keyname)) || + !strncmp(keyname, KEY_6, strlen(keyname)) || + !strncmp(keyname, KEY_7, strlen(keyname)) || + !strncmp(keyname, KEY_8, strlen(keyname)) || + !strncmp(keyname, KEY_9, strlen(keyname))) { + if (idx != DATE_YEAR) { + if (data->entry[idx] == 0) { + data->entry[idx]++; + + data->date[idx] = atoi(keyname); + } else { + data->entry[idx]++; + + data->date[idx] = data->date[idx] * 10 + + atoi(keyname); + data->entry[idx] = 0; + elm_object_focus_next(obj, ELM_FOCUS_NEXT); + } + } else { + if (data->entry[idx] == 0) { + data->entry[idx]++; + data->date[idx] = atoi(keyname); + + snprintf(buf, sizeof(buf), "%04d", + data->date[idx]); + elm_object_text_set(obj, buf); + return; + } else if (data->entry[idx] == 3) { + data->date[idx] = data->date[idx] * 10 + + atoi(keyname); + data->entry[idx] = 0; + } else { + data->entry[idx]++; + data->date[idx] = data->date[idx] * 10 + + atoi(keyname); + + snprintf(buf, sizeof(buf), "%04d", + data->date[idx]); + elm_object_text_set(obj, buf); + return; + } + } + + _update_date_value(obj, data->date, idx); + } else if (!strncmp(keyname, KEY_RIGHT, strlen(keyname)) || + !strncmp(keyname, KEY_LEFT, strlen(keyname))) { + data->entry[idx] = 0; + } else if (!strncmp(keyname, KEY_BACK, strlen(keyname))) { + _destroy(data->base); + } +} + +/** +* Add key event for date spin. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_date_spin_key_event(struct _date_spin_data *data) +{ + Evas_Object *spin; + int idx; + + if (!data || !data->spin_array) { + _ERR("invalid argument."); + return -1; + } + + for (idx = DATE_MONTH; idx < DATE_MAX; idx++) { + spin = eina_array_data_get(data->spin_array, idx); + if (!spin) { + _ERR("button is null."); + return -1; + } + + evas_object_event_callback_add(spin, EVAS_CALLBACK_KEY_DOWN, + _date_spin_keydown_cb, data); + } + + return 0; +} + +/** +* Create data spin. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_spin(struct _date_spin_data *data) +{ + int ret; + + if (!data || !data->base) { + _ERR("private data is null."); + return -1; + } + + ret = _add_date_spin(data); + if (ret != 0) { + _ERR("add spin control buttons failed."); + return -1; + } + + _init_date_spin(data); + + _set_date_spin_direction(data->spin_array); + + ret = _add_date_spin_click_event(data); + if (ret != 0) { + _ERR("add click event for spin control button failed."); + return -1; + } + + ret = _add_date_spin_key_event(data); + if (ret != 0) { + _ERR("add key event for spin control button failed."); + return -1; + } + + return 0; +} + +/** +* Create all UI components of date spin. +* +* @param[in]: data : the user data. +* +* @return: the base layout of date spin. +*/ +static Evas_Object *_create(struct _date_spin_data *data) +{ + Evas_Object *base; + int ret; + + if (!data || !data->win) { + _ERR("window for spin control base is null."); + return NULL; + } + + base = utils_add_layout(data->win); + if (!base) { + _ERR("add base layout for spin control failed."); + return NULL; + } + + data->base = base; + elm_layout_file_set(base, UG_CLOCK_EDJFILE, SPIN_CTRL_GRP); + + ret = _add_spin(data); + if (ret != 0) { + _ERR("add spin control failed."); + evas_object_del(data->base); + data->base = NULL; + return NULL; + } + + evas_object_data_set(data->base, DATE_SPIN_DATA_ID, data); + + return base; +} + +/** +* Destroy all the UI componets of date spin. +* +* @param[in]: base : the base layout of date spin. +* +* @return: void. +*/ +static void _destroy(Evas_Object *base) +{ + struct _date_spin_data *data; + + if (!base) { + _ERR("base is null."); + return; + } + + data = evas_object_data_get(base, DATE_SPIN_DATA_ID); + if (!data) { + _ERR("evas object get data failed. ID: %s", DATE_SPIN_DATA_ID); + return; + } + + _free_date_spin_data(data); +} + +/** +* Entry of creating date spin UI. +* +* @param[in]: win : window. +* @param[in]: ug_base : the base layout of clock UI gadget. +* +* @return: void. +*/ +void view_spin_control_create(Evas_Object *win, + Evas_Object *ug_base) +{ + Evas_Object *base; + struct _date_spin_data *data; + + if (!win || !ug_base) { + _ERR("the window of spin control is null."); + return; + } + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("calloc spin control data memory failed."); + return; + } + + data->win = win; + data->ug_base = ug_base; + + base = _create(data); + if (!base) { + _ERR("create spin control failed."); + _free_date_spin_data(data); + } +} diff --git a/ug/system/clock/src/ug_clock_sublist.c b/ug/system/clock/src/ug_clock_sublist.c new file mode 100644 index 0000000..72415a1 --- /dev/null +++ b/ug/system/clock/src/ug_clock_sublist.c @@ -0,0 +1,517 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include + +#include "dbg.h" +#include "ug_clock_define.h" +#include "ug_clock_sublist.h" +#include "ug_clock_utils.h" +#include "ug_clock.h" + +#define SUBLIST_BTN_NUM 2 +#define SUBLIST_DATA_ID "sublist_data" + +#define BOX_HPADDING 0 +#define BOX_VPADDING 2 + +#define CLICKED "clicked" + +struct _sublist_data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *ug_base; + Evas_Object *box; + + unsigned int mode; + + Eina_Array *array; +}; + +static void _destroy(Evas_Object *base); + +/** +* Free user data of mode sublist. +* +* @param[in]: data : the user data of mode sublist. +* +* @return: void. +*/ +static void _free_sublist_data(struct _sublist_data *data) +{ + if (!data) + return; + + if (data->base) { + evas_object_del(data->base); + data->base = NULL; + } + + if (data->array) + eina_array_free(data->array); + + free(data); +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _sublist_btn_clicked_cb(void *priv, Evas_Object *obj, void *ei) +{ + struct _sublist_data *data; + Eina_Array *array; + Evas_Object *on_btn, *off_btn; + int ret; + + if (!priv || !obj) { + _ERR("invalid argument."); + return; + } + + data = priv; + + if (!data->array) + return; + + array = data->array; + + on_btn = eina_array_data_get(array, 0); + off_btn = eina_array_data_get(array, 1); + if (!on_btn || !off_btn) { + _ERR("ON button or OFF button is null."); + return; + } + + if (obj == on_btn) + data->mode = 1; + else + data->mode = 0; + + ret = utils_set_vconf_value(VCONF_KEY_24HOUR_MODE, data->mode); + if (ret != 0) { + _ERR("set 24hour mode failed."); + return; + } + + view_ug_clock_refresh(data->ug_base, NULL, NULL); + + _destroy(data->base); +} + +/** +* Evas_Object_Event_Cb type callback for handling key press event. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the key press event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _key_down_on_sublist_btn_cb(void *priv, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Object *on_btn, *off_btn; + Eina_Array *array; + Evas_Event_Key_Down *event; + struct _sublist_data *data; + const char *keyname; + int mode; + int ret; + + if (!priv || !ei || !obj) + return; + + data = priv; + + if (!data->array || !data->base) + return; + + array = data->array; + + event = ei; + + if (!event->keyname) + return; + + keyname = event->keyname; + + on_btn = eina_array_data_get(array, 0); + off_btn = eina_array_data_get(array, 1); + if (!on_btn || !off_btn) { + _ERR("ON button or OFF button is null."); + return; + } + + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &mode); + if (ret != 0) { + _ERR("vconf get value failed."); + return; + } + + if (!strncmp(keyname, KEY_DOWN, strlen(keyname))) { + if (obj != on_btn) + return; + + elm_object_focus_set(off_btn, EINA_TRUE); + + if (mode) { + elm_object_signal_emit(obj, SIG_SRC_UNFOC_SHOW_ICON, + SIG_NAME_SUBLIST); + elm_object_signal_emit(off_btn, SIG_SRC_FOC_HIDE_ICON, + SIG_NAME_SUBLIST); + } else { + elm_object_signal_emit(obj, SIG_SRC_UNFOC_HIDE_ICON, + SIG_NAME_SUBLIST); + elm_object_signal_emit(off_btn, SIG_SRC_FOC_SHOW_ICON, + SIG_NAME_SUBLIST); + } + } else if (!strncmp(keyname, KEY_UP, strlen(keyname))) { + if (obj == on_btn) + return; + + elm_object_focus_set(on_btn, EINA_TRUE); + + if (mode) { + elm_object_signal_emit(on_btn, SIG_SRC_FOC_SHOW_ICON, + SIG_NAME_SUBLIST); + elm_object_signal_emit(obj, SIG_SRC_UNFOC_HIDE_ICON, + SIG_NAME_SUBLIST); + } else { + elm_object_signal_emit(obj, SIG_SRC_UNFOC_SHOW_ICON, + SIG_NAME_SUBLIST); + elm_object_signal_emit(on_btn, SIG_SRC_FOC_HIDE_ICON, + SIG_NAME_SUBLIST); + } + } else if (!strncmp(keyname, KEY_BACK, strlen(keyname))) { + _destroy(data->base); + } +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse in event. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse in event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _sublist_btn_mouse_in_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse out event. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse out event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _sublist_btn_mouse_out_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ +} + +/** +* Create mode sublist buttons. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_sublist_btns(struct _sublist_data *data) +{ + Eina_Array *array; + Evas_Object *btn; + Evas_Object *box; + int idx; + + if (!data || !data->base || !data->box) { + _ERR("invalid arguments."); + return -1; + } + + box = data->box; + elm_box_padding_set(box, BOX_HPADDING, BOX_VPADDING); + + array = eina_array_new(1); + if (!array) { + _ERR("new array for sublist buttons failed."); + return -1; + } + + for (idx = 0; idx < SUBLIST_BTN_NUM; idx++) { + btn = utils_add_button(data->base); + if (!btn) { + _ERR("add button failed."); + eina_array_free(array); + return -1; + } + + evas_object_smart_callback_add(btn, CLICKED, + _sublist_btn_clicked_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _key_down_on_sublist_btn_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _sublist_btn_mouse_in_cb, NULL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_OUT, + _sublist_btn_mouse_out_cb, NULL); + + elm_object_style_set(btn, BTN_STYLE_SUBLIST_BTN); + + elm_box_pack_end(box, btn); + eina_array_push(array, btn); + } + + data->array = array; + + elm_object_part_content_set(data->base, + SWALLOW_SUBLIST, data->box); + + return 0; +} + +/** +* Initialize value of mode sublist. +* +* @param[in]: array : eina array including mode sublist buttons. +* +* @return: void. +*/ +static void _set_sublist_init_value(Eina_Array *array) +{ + Evas_Object *on_btn, *off_btn; + int mode; + int ret; + + if (!array) + return; + + mode = 0; + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &mode); + if (ret != 0) { + _ERR("vconf get value failed."); + return; + } + + on_btn = eina_array_data_get(array, 0); + off_btn = eina_array_data_get(array, 1); + if (!on_btn || !off_btn) { + _ERR("there is no button in sublist array."); + return; + } + + elm_object_focus_set(on_btn, EINA_TRUE); + + elm_object_text_set(on_btn, ON); + elm_object_text_set(off_btn, OFF); + + if (mode) { + elm_object_signal_emit(on_btn, + SIG_SRC_FOC_SHOW_ICON, SIG_NAME_SUBLIST); + elm_object_signal_emit(off_btn, + SIG_SRC_UNFOC_HIDE_ICON, SIG_NAME_SUBLIST); + } else { + elm_object_signal_emit(off_btn, + SIG_SRC_UNFOC_SHOW_ICON, SIG_NAME_SUBLIST); + elm_object_signal_emit(on_btn, + SIG_SRC_FOC_HIDE_ICON, SIG_NAME_SUBLIST); + } +} + +/** +* Set focus move directions among mode sublist buttons. +* +* @param[in]: array : the eina array including mode sublist buttons. +* +* @return: void. +*/ +static void _set_sublist_btn_directions(Eina_Array *array) +{ + Evas_Object *on_btn, *off_btn; + + if (!array) + return; + + on_btn = eina_array_data_get(array, 0); + off_btn = eina_array_data_get(array, 1); + if (!on_btn || !off_btn) { + _ERR("get sublist button from array failed."); + return; + } + + elm_object_focus_next_object_set(on_btn, on_btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(on_btn, off_btn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(on_btn, on_btn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(on_btn, on_btn, ELM_FOCUS_RIGHT); + + elm_object_focus_next_object_set(off_btn, on_btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(off_btn, off_btn, ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(off_btn, off_btn, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(off_btn, off_btn, ELM_FOCUS_RIGHT); +} + +/** +* Create mode sublist. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_sublist(struct _sublist_data *data) +{ + int ret; + Evas_Object *box; + + if (!data || !data->base) { + _ERR("invalid argument."); + return -1; + } + + box = utils_add_box(data->base); + if (!box) { + _ERR("add sublist box failed."); + return -1; + } + + data->box = box; + + ret = _add_sublist_btns(data); + if (ret != 0) { + _ERR("add sublist buttons failed."); + evas_object_del(data->box); + data->box = NULL; + return -1; + } + + _set_sublist_init_value(data->array); + _set_sublist_btn_directions(data->array); + + return 0; +} + +/** +* Destroy all the UI componets of mode sublist. +* +* @param[in]: base : the base layout of mode sublist. +* +* @return: void. +*/ +static void _destroy(Evas_Object *base) +{ + struct _sublist_data *data; + + if (!base) + return; + + data = evas_object_data_get(base, SUBLIST_DATA_ID); + if (!data) { + _ERR("evas object get data failed. ID: %s", SUBLIST_DATA_ID); + return; + } + + _free_sublist_data(data); +} + +/** +* Create all the UI componets of mode sublist. +* +* @param[in]: data : the user data. +* +* @return: the base layout of mode sublist. +*/ +static Evas_Object *_create(struct _sublist_data *data) +{ + Evas_Object *base; + int ret; + + if (!data || !data->win) { + _ERR("invalid argument."); + return NULL; + } + + base = utils_add_layout(data->win); + if (!base) { + _ERR("add base layout for sublist failed."); + return NULL; + } + + data->base = base; + + elm_layout_file_set(base, UG_CLOCK_EDJFILE, SUBLIST_GRP); + + ret = _add_sublist(data); + if (ret != 0) { + _ERR("add sublist failed."); + evas_object_del(data->base); + data->base = NULL; + return NULL; + } + + evas_object_data_set(data->base, SUBLIST_DATA_ID, data); + + return base; +} + +/** +* Entry of creating mode sublist. +* +* @parma[in]: win : window. +* @param[in]: ug_base : the base layout of clock UI gadget. +* +* @return: void. +*/ +void view_sublist_create(Evas_Object *win, Evas_Object *ug_base) +{ + Evas_Object *base; + struct _sublist_data *data; + + if (!win || !ug_base) { + _ERR("the window or base layout is null."); + return; + } + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("calloc sublist data failed."); + return; + } + data->win = win; + data->ug_base = ug_base; + + base = _create(data); + if (!base) { + _ERR("create sublist failed."); + _free_sublist_data(data); + } +} diff --git a/ug/system/clock/src/ug_clock_time_spin_control.c b/ug/system/clock/src/ug_clock_time_spin_control.c new file mode 100644 index 0000000..cce33dc --- /dev/null +++ b/ug/system/clock/src/ug_clock_time_spin_control.c @@ -0,0 +1,842 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "dbg.h" +#include "ug_clock_define.h" +#include "ug_clock.h" +#include "ug_clock_time_spin_control.h" +#include "ug_clock_utils.h" + +#define ARROW_BTN_DATA_ID "arrow_btn_data_id" +#define TIME_SPIN_DATA_ID "time_spin_ctrl_data" + +#define BOX_HPADDING 2 +#define BOX_VPADDING 122 + +#define UP_ARROW (1) +#define DOWN_ARROW (0) + +struct _time_spin_data { + Evas_Object *win; + Evas_Object *base; + Evas_Object *ug_base; + Evas_Object *spin_box; + + int time[TIME_MAX]; + int entry[TIME_MAX]; + + Eina_Array *spin_array; +}; + +static void _destroy(Evas_Object *base); + +/** +* Free user data of time spin. +* +* @param[in]: data : the user data. +* +* @return: void. +*/ +static void _free_time_spin_data(struct _time_spin_data *data) +{ + if (!data) + return; + + if (data->base) { + evas_object_del(data->base); + data->base = NULL; + } + + if (data->spin_array) + eina_array_free(data->spin_array); + + free(data); +} + +/** +* Update value of time spin. +* +* @param[in]: spin : the corresponding date spin whose value need to update. +* @param[in]: date : the value to be updated. +* @param[in]: spin_idx : the index of corresponding time spin. +* +* @return: void. +*/ +static void _update_time_value(Evas_Object *btn, int *time, int btn_idx) +{ + int mode; + char buf[BUF_SIZE]; + int ret; + + if (!btn || !time) + return; + if (btn_idx < TIME_HOUR || btn_idx >= TIME_MAX) + return; + + mode = 0; + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &mode); + if (ret != 0) { + _ERR("vconf get value failed."); + return; + } + + if (btn_idx == TIME_HOUR) { + if (mode) { + if (time[btn_idx] > 23) + time[btn_idx] = 0; + if (time[btn_idx] < 0) + time[btn_idx] = 23; + } else { + if (time[btn_idx] > 11) + time[btn_idx] = 0; + if (time[btn_idx] < 0) + time[btn_idx] = 11; + } + + snprintf(buf, sizeof(buf), "%02d", time[btn_idx]); + } else if (btn_idx == TIME_MINUTE) { + if (time[btn_idx] > 59) + time[btn_idx] = 0; + if (time[btn_idx] < 0) + time[btn_idx] = 59; + + snprintf(buf, sizeof(buf), "%02d", time[btn_idx]); + } else { + if (time[btn_idx]) + snprintf(buf, sizeof(buf), "%s", PM); + else + snprintf(buf, sizeof(buf), "%s", AM); + } + + elm_object_text_set(btn, buf); +} + +/** +* Evas_Object_Event_Cb type callback for handling key press event. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the key press event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _time_spin_keydown_cb(void *priv, + Evas *e, Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *event; + struct _time_spin_data *data; + const char *keyname; + Eina_Array *array; + Evas_Object *hour_btn, *minute_btn; + + if (!priv || !ei || !obj) { + _ERR("invalid argument."); + return; + } + + data = priv; + + if (!data->spin_array) + return; + + array = data->spin_array; + + hour_btn = eina_array_data_get(array, TIME_HOUR); + minute_btn = eina_array_data_get(array, TIME_MINUTE); + if (!hour_btn || !minute_btn) { + _ERR("eina array data get failed."); + return; + } + + event = ei; + + if (!event->keyname) + return; + + keyname = event->keyname; + + if (!strncmp(keyname, KEY_UP, strlen(keyname))) { + if (obj == hour_btn) { + data->time[TIME_HOUR]++; + + _update_time_value(obj, data->time, TIME_HOUR); + } else if (obj == minute_btn) { + data->time[TIME_MINUTE]++; + + _update_time_value(obj, data->time, TIME_MINUTE); + } else { + if (data->time[TIME_AMPM] == 0) + data->time[TIME_AMPM] = 1; + else + data->time[TIME_AMPM] = 0; + + _update_time_value(obj, data->time, TIME_AMPM); + } + } else if (!strncmp(keyname, KEY_DOWN, strlen(keyname))) { + if (obj == hour_btn) { + data->time[TIME_HOUR]--; + _update_time_value(obj, data->time, TIME_HOUR); + } else if (obj == minute_btn) { + data->time[TIME_MINUTE]--; + _update_time_value(obj, data->time, TIME_MINUTE); + } else { + if (data->time[TIME_AMPM] == 0) + data->time[TIME_AMPM] = 1; + else + data->time[TIME_AMPM] = 0; + + _update_time_value(obj, data->time, TIME_AMPM); + } + } else if (!strncmp(keyname, KEY_0, strlen(keyname)) || + !strncmp(keyname, KEY_1, strlen(keyname)) || + !strncmp(keyname, KEY_2, strlen(keyname)) || + !strncmp(keyname, KEY_3, strlen(keyname)) || + !strncmp(keyname, KEY_4, strlen(keyname)) || + !strncmp(keyname, KEY_5, strlen(keyname)) || + !strncmp(keyname, KEY_6, strlen(keyname)) || + !strncmp(keyname, KEY_7, strlen(keyname)) || + !strncmp(keyname, KEY_8, strlen(keyname)) || + !strncmp(keyname, KEY_9, strlen(keyname))) { + if (obj == hour_btn) { + if (data->entry[TIME_HOUR] == 0) { + data->entry[TIME_HOUR]++; + data->time[TIME_HOUR] = atoi(keyname); + } else { + data->entry[TIME_HOUR]++; + data->time[TIME_HOUR] = + (data->time[TIME_HOUR] * 10) + + atoi(keyname); + data->entry[TIME_HOUR] = 0; + + elm_object_focus_next(obj, ELM_FOCUS_NEXT); + } + + _update_time_value(obj, data->time, TIME_HOUR); + } else if (obj == minute_btn) { + if (data->entry[TIME_MINUTE] == 0) { + data->entry[TIME_MINUTE]++; + data->time[TIME_MINUTE] = atoi(keyname); + } else { + data->entry[TIME_MINUTE]++; + data->time[TIME_MINUTE] = + (data->time[TIME_MINUTE] * 10) + + atoi(keyname); + data->entry[TIME_MINUTE] = 0; + + elm_object_focus_next(obj, ELM_FOCUS_NEXT); + } + + _update_time_value(obj, data->time, TIME_MINUTE); + } else { + return; + } + } else if (!strncmp(keyname, KEY_LEFT, strlen(keyname)) || + !strncmp(keyname, KEY_RIGHT, strlen(keyname))) { + if (obj == hour_btn) + data->entry[TIME_HOUR] = 0; + else if (obj == minute_btn) + data->entry[TIME_MINUTE] = 0; + else + return; + } else if (!strncmp(keyname, KEY_BACK, strlen(keyname))) { + _destroy(data->base); + } +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _time_spin_click_cb(void *priv, + Evas_Object *obj, void *ei) +{ + struct _time_spin_data *data; + + if (!priv) + return; + + data = priv; + + utils_set_time_value(data->time); + view_ug_clock_refresh(data->ug_base, NULL, data->time); + _destroy(data->base); +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse in event. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse in event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _time_spin_mousein_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) + return; + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** +* Evas_Object_Event_Cb type callback for handling mouse out event. +* +* @param[in]: dt : the user data. +* @param[in]: e : the evas. +* @param[in]: obj : the corresponding object which the mouse out event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _time_spin_mouseout_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + /* TODO: Add necessary operation when needed. */ +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in]: priv : the user data. +* @param[in]: obj : the corresponding object which the click event occurred. +* @param[in]: ei : event info. +* +* @return: void. +*/ +static void _arrowbtn_clicked_cb(void *priv, Evas_Object *obj, void *ev) +{ + struct _time_spin_data *data; + Evas_Object *cur_btn; + Evas_Object *btn; + Evas_Object *up; + int i; + int idx; + int flag; + + if (!priv || !obj) + return; + + data = priv; + cur_btn = evas_object_data_get(obj, ARROW_BTN_DATA_ID); + if (!cur_btn) + return; + + up = elm_object_part_content_get(cur_btn, UP_ARROW_SWALLOW); + if (!up) + return; + + if (obj == up) + flag = 1; + else + flag = 0; + + idx = 0; + for (i = TIME_HOUR; i < TIME_MAX; i++) { + btn = eina_array_data_get(data->spin_array, i); + + if (cur_btn == btn) { + idx = i; + break; + } + } + + if (idx != TIME_AMPM) { + if (flag) + data->time[idx]++; + else + data->time[idx]--; + } else { + if (data->time[idx] == 0) + data->time[idx] = 1; + else + data->time[idx] = 0; + } + + _update_time_value(cur_btn, data->time, idx); +} + +/** +* Create arrow buttons for time spin. +* +* @param[in]: data : the user data. +* @param[in]: obj : the corresponding object which the arrow created on. +* @param[in]: flag : 1 - up arrow button, 0 - down arrow button. +* +* @return: the created arrow button. +*/ +static Evas_Object *_add_arrow_btn(struct _time_spin_data *data, + Evas_Object *obj, int flag) +{ + Evas_Object *btn; + + if (!data || !data->base || !obj) + return NULL; + + btn = utils_add_button(data->base); + if (!btn) { + _ERR("utils add button failed."); + return NULL; + } + + elm_object_style_set(btn, BTN_STYLE_ARROW_BTN); + + if (flag == UP_ARROW) + elm_object_part_content_set(obj, UP_ARROW_SWALLOW, btn); + else + elm_object_part_content_set(obj, DOWN_ARROW_SWALLOW, btn); + + elm_object_focus_allow_set(btn, EINA_FALSE); + + evas_object_smart_callback_add(btn, "clicked", + _arrowbtn_clicked_cb, data); + + evas_object_data_set(btn, ARROW_BTN_DATA_ID, obj); + evas_object_raise(btn); + evas_object_repeat_events_set(btn, EINA_FALSE); + + return btn; +} + +/** +* Create time spin for 12 hour mode. +* +* @parma[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_time_spin_without_ampm(struct _time_spin_data *data) +{ + Evas_Object *box; + Evas_Object *btn; + Evas_Object *uparrow, *downarrow; + Eina_Array *array; + char buf[BUF_SIZE]; + int idx; + + if (!data || !data->base || !data->spin_box) { + _ERR("invalid argument."); + return -1; + } + + box = data->spin_box; + elm_box_horizontal_set(box, EINA_TRUE); + elm_box_padding_set(box, BOX_HPADDING, BOX_VPADDING); + + array = eina_array_new(1); + if (!array) { + _ERR("new eina array failed."); + return -1; + } + + for (idx = TIME_HOUR; idx < TIME_AMPM; idx++) { + btn = utils_add_button(data->base); + if (!btn) { + _ERR("add time spin control button failed."); + return -1; + } + + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _time_spin_keydown_cb, data); + evas_object_smart_callback_add( + btn, "clicked", _time_spin_click_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _time_spin_mousein_cb, NULL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_OUT, + _time_spin_mouseout_cb, NULL); + + elm_object_style_set(btn, BTN_STYLE_TIME_SPIN_BTN); + + snprintf(buf, sizeof(buf), "%02d", data->time[idx]); + elm_object_text_set(btn, buf); + + eina_array_push(array, btn); + + elm_box_pack_end(box, btn); + + uparrow = _add_arrow_btn(data, btn, UP_ARROW); + if (!uparrow) { + _ERR("add up arrow button failed."); + evas_object_del(btn); + return -1; + } + + downarrow = _add_arrow_btn(data, btn, DOWN_ARROW); + if (!downarrow) { + _ERR("add down arrow button failed."); + evas_object_del(btn); + evas_object_del(uparrow); + return -1; + } + } + + elm_object_focus_set(eina_array_data_get(array, TIME_HOUR), EINA_TRUE); + + data->spin_array = array; + + elm_object_part_content_set( + data->base, SWALLOW_TIME_SPIN_2, box); + + return 0; +} + +/** +* Create time spin for 24 hour mode. +* +* @parma[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_time_spin_with_ampm(struct _time_spin_data *data) +{ + Evas_Object *box; + Evas_Object *btn; + Evas_Object *uparrow, *downarrow; + Eina_Array *array; + char buf[BUF_SIZE]; + int idx; + + if (!data || !data->base || !data->spin_box) { + _ERR("invalid argument."); + return -1; + } + + box = data->spin_box; + elm_box_horizontal_set(box, EINA_TRUE); + elm_box_padding_set(box, BOX_HPADDING, BOX_VPADDING); + + array = eina_array_new(1); + if (!array) { + _ERR("new eina array failed."); + return -1; + } + + for (idx = TIME_HOUR; idx < TIME_MAX; idx++) { + btn = utils_add_button(data->base); + if (!btn) { + _ERR("add time spin control button failed."); + return -1; + } + + evas_object_event_callback_add(btn, EVAS_CALLBACK_KEY_DOWN, + _time_spin_keydown_cb, data); + evas_object_smart_callback_add( + btn, "clicked", _time_spin_click_cb, data); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_IN, + _time_spin_mousein_cb, NULL); + evas_object_event_callback_add(btn, EVAS_CALLBACK_MOUSE_OUT, + _time_spin_mouseout_cb, NULL); + + elm_object_style_set(btn, BTN_STYLE_TIME_SPIN_BTN); + + if (idx != TIME_AMPM) { + snprintf(buf, sizeof(buf), "%02d", data->time[idx]); + elm_object_text_set(btn, buf); + } else { + if (data->time[idx]) + elm_object_text_set(btn, PM); + else + elm_object_text_set(btn, AM); + } + + eina_array_push(array, btn); + + elm_box_pack_end(box, btn); + + uparrow = _add_arrow_btn(data, btn, UP_ARROW); + if (!uparrow) { + _ERR("add up arrow button failed."); + evas_object_del(btn); + return -1; + } + + downarrow = _add_arrow_btn(data, btn, DOWN_ARROW); + if (!downarrow) { + _ERR("add down arrow button failed."); + evas_object_del(btn); + evas_object_del(uparrow); + return -1; + } + } + + elm_object_focus_set(eina_array_data_get(array, TIME_HOUR), EINA_TRUE); + + data->spin_array = array; + + elm_object_part_content_set( + data->base, SWALLOW_TIME_SPIN_1, box); + + return 0; +} + +/** +* Create buttons for time spin. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_time_spin_btns(struct _time_spin_data *data) +{ + int mode; + int ret; + + if (!data || !data->base || + !data->spin_box) { + _ERR("invalid argument."); + return -1; + } + + utils_get_time_value(data->time); + + mode = 0; + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &mode); + if (ret != 0) { + _ERR("vconf get value failed."); + return -1; + } + + if (mode) { + ret = _add_time_spin_without_ampm(data); + if (ret != 0) { + _ERR("add buttons without ampm failed."); + return -1; + } + } else { + ret = _add_time_spin_with_ampm(data); + if (ret != 0) { + _ERR("add buttons with ampm failed."); + return -1; + } + } + + return 0; +} + +/** +* Set focus move directions among time spin buttons. +* +* @param[in]: btn_array : eina array of time spin buttons. +* +* @return: void. +*/ +static void _set_time_spin_btn_directions(Eina_Array *btn_array) +{ + Evas_Object *btn; + unsigned int count; + int idx; + + if (!btn_array) { + _ERR("time spin control button array is null."); + return; + } + + count = eina_array_count(btn_array); + + for (idx = TIME_HOUR; idx < count; idx++) { + btn = eina_array_data_get(btn_array, idx); + if (!btn) { + _ERR("there is no button. idx: %d", idx); + return; + } + + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN); + + if (idx == TIME_HOUR) { + elm_object_focus_next_object_set(btn, btn, + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(btn, + eina_array_data_get(btn_array, idx + 1), + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(btn, + eina_array_data_get(btn_array, idx + 1), + ELM_FOCUS_NEXT); + } else if (idx == count - 1) { + elm_object_focus_next_object_set(btn, btn, + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(btn, + eina_array_data_get(btn_array, idx - 1), + ELM_FOCUS_LEFT); + } else { + elm_object_focus_next_object_set(btn, + eina_array_data_get(btn_array, idx + 1), + ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(btn, + eina_array_data_get(btn_array, idx + 1), + ELM_FOCUS_NEXT); + elm_object_focus_next_object_set(btn, + eina_array_data_get(btn_array, idx - 1), + ELM_FOCUS_LEFT); + } + } +} + +/** +* Create time spin. +* +* @param[in]: data : the user data. +* +* @return: 0 - Success, -1 - Fail. +*/ +static int _add_time_spin(struct _time_spin_data *data) +{ + Evas_Object *box; + int ret; + + if (!data || !data->base) { + _ERR("private data is null."); + return -1; + } + + box = utils_add_box(data->base); + if (!box) { + _ERR("add time spin control box failed."); + return -1; + } + data->spin_box = box; + + ret = _add_time_spin_btns(data); + if (ret != 0) { + _ERR("add time spin control buttons failed."); + return -1; + } + + _set_time_spin_btn_directions(data->spin_array); + + return 0; +} + +/** +* Create all UI components of time spin. +* +* @param[in]: data : the user data. +* +* @return: the base layout of time spin. +*/ +static Evas_Object *_create(struct _time_spin_data *data) +{ + Evas_Object *base; + int onoff; + int ret; + + if (!data || !data->win) { + _ERR("window for time spin control base is null."); + return NULL; + } + + base = utils_add_layout(data->win); + if (!base) { + _ERR("add base layout for spin control failed."); + return NULL; + } + data->base = base; + elm_layout_file_set(base, UG_CLOCK_EDJFILE, TIME_SPIN_CTRL_GRP); + + onoff = 0; + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &onoff); + if (ret != 0) { + _ERR("vconf get value failed."); + return NULL; + } + + if (onoff) + elm_object_signal_emit(base, SIGNAL_NAME_TIME_SPIN_2, + SIGNAL_SOURCE_TIME_SPIN); + else + elm_object_signal_emit(base, SIGNAL_NAME_TIME_SPIN_1, + SIGNAL_SOURCE_TIME_SPIN); + + ret = _add_time_spin(data); + if (ret != 0) { + _ERR("add time spin control failed."); + return NULL; + } + + evas_object_data_set(data->base, TIME_SPIN_DATA_ID, data); + + return base; +} + +/** +* Destroy all the UI componets of time spin. +* +* @param[in]: base : the base layout of time spin. +* +* @return: void. +*/ +void _destroy(Evas_Object *base) +{ + struct _time_spin_data *data; + + if (!base) { + _ERR("invalid argument."); + return; + } + + data = evas_object_data_get(base, TIME_SPIN_DATA_ID); + if (!data) { + _ERR("evas object get data failed. ID: %s", TIME_SPIN_DATA_ID); + return; + } + + _free_time_spin_data(data); +} + +/** +* Entry of creating time spin UI. +* +* @param[in]: win : window. +* @param[in]: ug_base : the base layout of clock UI gadget. +* +* @return: void. +*/ +void view_time_spin_ctrl_create(Evas_Object *win, + Evas_Object *ug_base) +{ + Evas_Object *base; + struct _time_spin_data *data; + + if (!win || !ug_base) { + _ERR("the window of time spin control is null."); + return; + } + + data = calloc(1, sizeof(*data)); + if (!data) { + _ERR("calloc time spin control data memory failed."); + return; + } + + data->win = win; + data->ug_base = ug_base; + + base = _create(data); + if (!base) { + _ERR("create time spin control failed."); + _free_time_spin_data(data); + } +} diff --git a/ug/system/clock/src/ug_clock_utils.c b/ug/system/clock/src/ug_clock_utils.c new file mode 100755 index 0000000..4cb0969 --- /dev/null +++ b/ug/system/clock/src/ug_clock_utils.c @@ -0,0 +1,340 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "dbg.h" +#include "ug_clock_utils.h" + +static struct tm *_get_current_time(); +static void _set_datetime(struct tm *t); + +/** +* Add button for a given evas object. +* +* This function adds a button for a given parent evas object. +* +* @param[in]: parent : the given parent evas object. +* +* @return: The pointer of created evas object button or NULL. +*/ +Evas_Object *utils_add_button(Evas_Object *parent) +{ + Evas_Object *btn; + + if (!parent) { + _ERR("parent object of being created button is null."); + return NULL; + } + + btn = elm_button_add(parent); + if (!btn) { + _ERR("elm button add failed."); + return NULL; + } + + evas_object_size_hint_weight_set( + btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set( + btn, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_show(btn); + + return btn; +} + +/** +* Add a layout for a given evas object. +* +* This function adds a layout for a given parent evas object. +* +* @param[in]: parent : the given parent evas object. +* +* @ return: The pointer of created evas object layout or NULL. +*/ +Evas_Object *utils_add_layout(Evas_Object *parent) +{ + Evas_Object *ly; + + if (!parent) { + _ERR("parent object of being created layout is null."); + return NULL; + } + + ly = elm_layout_add(parent); + if (!ly) { + _ERR("elm layout add failed."); + return NULL; + } + + evas_object_size_hint_weight_set( + ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set( + ly, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_show(ly); + + return ly; +} + +/** +* Add box for a given evas object. +* +* This function adds a box for a given parent evas object. +* +* @param[in]: parent : the given parent evas object. +* +* @return: The pointer of created evas object box or NULL. +*/ +Evas_Object *utils_add_box(Evas_Object *parent) +{ + Evas_Object *box; + + if (!parent) { + _ERR("parent of being created box is null."); + return NULL; + } + + box = elm_box_add(parent); + if (!box) { + _ERR("elm box add failed."); + return NULL; + } + + evas_object_size_hint_weight_set( + box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set( + box, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_object_focus_allow_set(box, EINA_TRUE); + + evas_object_show(box); + + return box; +} + +/** +* Get current date. +* +* @param[out]: date : an array including value of year, month and day. +* +* @return: NULL. +*/ +void utils_get_date_value(unsigned int *date) +{ + struct tm *t; + + if (!date) + return; + + t = _get_current_time(); + + date[DATE_YEAR] = t->tm_year + 1900; + date[DATE_DAY] = t->tm_mday; + date[DATE_MONTH] = t->tm_mon + 1; +} + +/** +* Set the value of date. +* +* @param[in]: date : an array including value of year, month and day to be set. +* +* @return: NULL. +*/ +void utils_set_date_value(unsigned int *date) +{ + struct tm *t; + + if (!date) + return; + + t = _get_current_time(); + + t->tm_mday = date[DATE_DAY]; + t->tm_mon = date[DATE_MONTH] - 1; + t->tm_year = date[DATE_YEAR] - 1900; + + _set_datetime(t); +} + +/** +* Get current local time. +* +* @param[out]: time : an array including value of hour, minute and second. +* +* @return: NULL. +*/ +void utils_get_time_value(int *time) +{ + struct tm *t; + int v; + int ret; + + if (!time) + return; + + t = _get_current_time(); + + time[TIME_HOUR] = t->tm_hour; + time[TIME_MINUTE] = t->tm_min; + time[TIME_AMPM] = time[TIME_HOUR] >= 12 ? 1 : 0; + + v = 0; + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &v); + if (ret != 0) { + _ERR("get vconf key failed."); + return; + } + + if (!v) + if (time[TIME_HOUR] >= 12) + time[TIME_HOUR] -= 12; +} + +/** +* Set value of time. +* +* @param[in]: time : an array including value of hour, +* minute and second to be set. +* +* @return: NULL. +*/ +void utils_set_time_value(int *time) +{ + int ret; + struct tm *t; + int mode; + + if (!time) + return; + + mode = 0; + ret = utils_get_vconf_value(VCONF_KEY_24HOUR_MODE, &mode); + if (ret != 0) { + _ERR("vconf get key failed."); + return; + } + + if (!mode && time[TIME_AMPM] == 1) + time[TIME_HOUR] += 12; + + t = _get_current_time(); + + t->tm_hour = time[TIME_HOUR]; + t->tm_min = time[TIME_MINUTE]; + + _set_datetime(t); +} + +/** +* Set the value of vconf key. +* +* @param[in]: key : the vconf key which needs to be set. +* @param[in]: value : the value to be set to key. +* +* @return: 0 - Success, -1 - Fail. +*/ +int utils_set_vconf_value(const char *key, int value) +{ + int ret; + + if (!key) { + _ERR("the key of vconf is null."); + return -1; + } + + ret = vconf_set_int(key, value); + if (ret != 0) { + _ERR("vconf set int failed."); + return -1; + } + + return 0; +} + +/** +* Get the value of vconf key. +* +* @param[in]: key : the vconf key which to get value from. +* @param[out]: value : the pointer of value of key. +* +* @return: 0 - Success, -1 - Fail. +*/ +int utils_get_vconf_value(const char *key, int *value) +{ + int ret; + + if (!key || !value) { + _ERR("invalid argument."); + return -1; + } + + ret = vconf_get_int(key, value); + if (ret != 0) { + _ERR("vconf get int failed."); + return -1; + } + + return 0; +} + +/** +* Get current local time. +* +* @param: NULL. +* +* @return: A pointer with type struct tm. +*/ +static struct tm *_get_current_time() +{ + time_t tt; + struct tm *t; + + tt = 0; + time(&tt); + + t = localtime(&tt); + + return t; +} + +/** +* Set date and time of system. +* +* This function sets date and time of system using sysman interface +* sysman_set_datetime(). +* +* @param[in]: t : the pointer points to a struct tm. +* +* @return: NULL. +*/ +static void _set_datetime(struct tm *t) +{ + int r; + time_t tt; + + if (!t) { + _ERR("invalid struct tm pointer."); + return; + } + + tt = mktime(t); + + r = sysman_set_datetime(tt); + if (r == -1) + _ERR("sysman set date and time failed. r: %d", r); +} diff --git a/ug/wifi-direct/CMakeLists.txt b/ug/wifi-direct/CMakeLists.txt new file mode 100644 index 0000000..62baa24 --- /dev/null +++ b/ug/wifi-direct/CMakeLists.txt @@ -0,0 +1,72 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6) +PROJECT(ug-wifi-direct C) +SET(PROJECT_NAME ug-wifi-direct) + +#SET(PREFIX ${CMAKE_INSTALL_PREFIX}) +SET(PREFIX "/usr/ug") + +IF(NOT DEFINED UGLIBDIR) + SET(UGLIBDIR "/usr/ug/lib") +ENDIF(NOT DEFINED UGLIBDIR) + +IF(NOT DEFINED UG_WIFI_DIRECT_EDJE_DIR) + SET(UG_WIFI_DIRECT_EDJE_DIR "${PREFIX}/res/edje/${PROJECT_NAME}") +ENDIF(NOT DEFINED UG_WIFI_DIRECT_EDJE_DIR) + +IF(NOT DEFINED VERSION) + SET(VERSION 0.1) +ENDIF(NOT DEFINED VERSION) + +SET(CMAKE_C_FLAGS_DEBUG "-O0 -g") +SET(CMAKE_C_FLAGS_RELEASE "-O2") + +SET(UG_WIFI_DIRECT_EDJ_FILE "ug-wifi-direct.edj") +SET(UG_WIFI_DIRECT_EDJ_THEME "ug-wifi-direct-theme.edj") + +INCLUDE(FindPkgConfig) +pkg_check_modules(UG_WIFI_DIRECT_PKGS REQUIRED + dlog + eina + edje + ecore-x + evas + elementary + utilX + aul + x11 + glib-2.0 + ui-gadget-1 + vconf + capi-appfw-application + capi-network-wifi + capi-network-connection + wifi-direct +) +SET(PKGS_LDFLAGS "${PKGS_LDFLAGS} ${UG_WIFI_DIRECT_PKGS_LDFLAGS}") + +FOREACH(FLAG ${UG_WIFI_DIRECT_PKGS_CFLAGS}) + SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${FLAG}") +ENDFOREACH(FLAG) +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fvisibility=hidden -Wall -Werror") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}") + +SET(SRCS + src/ug_wifi_direct.c + src/wifi_direct_mgr.c + src/wifi_direct_view.c + src/util.c +) + +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include) +ADD_DEFINITIONS("-DPKGNAME=\"${PROJECT_NAME}\"") + +ADD_DEFINITIONS("-DUG_WIFI_DIRECT_EDJ_FILE=\"${UG_WIFI_DIRECT_EDJE_DIR}/${UG_WIFI_DIRECT_EDJ_FILE}\"") +ADD_DEFINITIONS("-DUG_WIFI_DIRECT_EDJ_THEME=\"${UG_WIFI_DIRECT_EDJE_DIR}/${UG_WIFI_DIRECT_EDJ_THEME}\"") + +ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS}) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION ${VERSION}) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${UG_WIFI_DIRECT_PKGS_LDFLAGS}) + +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${UGLIBDIR}) + +ADD_SUBDIRECTORY(edje) diff --git a/ug/wifi-direct/edje/CMakeLists.txt b/ug/wifi-direct/edje/CMakeLists.txt new file mode 100644 index 0000000..c891bf6 --- /dev/null +++ b/ug/wifi-direct/edje/CMakeLists.txt @@ -0,0 +1,14 @@ +ADD_CUSTOM_TARGET(${UG_WIFI_DIRECT_EDJ_FILE} COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.edc + ${CMAKE_CURRENT_BINARY_DIR}/${UG_WIFI_DIRECT_EDJ_FILE} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.edc ) + ADD_DEPENDENCIES(${PROJECT_NAME} ${UG_WIFI_DIRECT_EDJ_FILE}) +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${UG_WIFI_DIRECT_EDJ_FILE} DESTINATION ${UG_WIFI_DIRECT_EDJE_DIR}) + +ADD_CUSTOM_TARGET(${UG_WIFI_DIRECT_EDJ_THEME} COMMAND edje_cc -id images + ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-theme.edc + ${CMAKE_CURRENT_BINARY_DIR}/${UG_WIFI_DIRECT_EDJ_THEME} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}-theme.edc ) + ADD_DEPENDENCIES(${PROJECT_NAME} ${UG_WIFI_DIRECT_EDJ_THEME}) + +INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${UG_WIFI_DIRECT_EDJ_THEME} DESTINATION ${UG_WIFI_DIRECT_EDJE_DIR}) \ No newline at end of file diff --git a/ug/wifi-direct/edje/images/ico_dropdown_menu_check.png b/ug/wifi-direct/edje/images/ico_dropdown_menu_check.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7d114640bde4abbaac4165a1829ca15854f039 GIT binary patch literal 17850 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 literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/loading_96_01.png b/ug/wifi-direct/edje/images/loading_96_01.png new file mode 100644 index 0000000000000000000000000000000000000000..f8023c617eddae210faa2dc024b4d01b7568e7db GIT binary patch literal 14922 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 IM6N<$g1SQ_umAu6 literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/loading_96_02.png b/ug/wifi-direct/edje/images/loading_96_02.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c3cfa282c1c4c2fb8ba2b0cddea11e6ddb1370 GIT binary patch literal 14977 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 literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/loading_96_04.png b/ug/wifi-direct/edje/images/loading_96_04.png new file mode 100644 index 0000000000000000000000000000000000000000..66be9d652af4a60aab7b836773d9ea324a0aca79 GIT binary patch literal 15112 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 literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/loading_96_06.png b/ug/wifi-direct/edje/images/loading_96_06.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b7baa12cb2afaebe2e1e3e760b9eac648a95ec GIT binary patch literal 14824 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 literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/loading_96_10.png b/ug/wifi-direct/edje/images/loading_96_10.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5528c1fa164450d06c993959000822706ae4a2 GIT binary patch literal 14752 zcmV;RIbX(!P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z001t_Nkl;6O*yo&k?%8XNG3RLh<3Gk0GvlN6;Vt)(2tHE4M+*38eWZYo z6!6jdNC6)y;G^}C0zOi}N9!X6{0p_hd--J%`BA#}^P8~?U!Q;9tzri@{xkUaHTc&~ z;mR+=J>V|@4en#y0Q@@H4;*z}J9%;0$PiUjn`k{2#!70Q^q>uKy>XKmPF)1r;Hn4fuH_yV+_)Q{YM}(u+IY(@MYkey~xKv-YdiYd@JCh z&|QB|S%2j~=A0`;$W+Za=Q9!UYDyMD29lblP9kEe+VsYx0a}T5!{OtGSyP9*q;RsI z)Lo{W?o&O?I3C03_u%ZOf!m-1ke|owGFS!tQ-r?@ly5O>e~uL3F6{6C6#e67z%a}5 zQBf4ta5$QjWi^R0dgpwe6-8APMOGG75n~hQ^XV$7>S8vZ&Sukvna-1@DNR~9bdj@~ zZN`V|$?+ey8}|>=&fw=P>~C@W7|QE#U$HX6bO`xfWWB=fUx(!`BL6Pf8e{sz%>B7g z!1<0p-|6RqublH6!{KOaXLs*lJlWXKvtna39PNxYHny{n7kOR`vOKSx^AbW{2uez+ z6>)ZQc6_p0EvAe4?Bw+1`0nX!dS^O2yQ8UjVC&V~AD_%O9^G%QesZN-J6m?ThWRJ3 z>J5n3;rRm?9D~c?)!RrIz~dqI^$EhqG5!~X8jxqFi0~op`p{oxe@)7Au)Vppy}!4& ze|@sCeQiA6yt1{mb!9XfZ80`&X|%_wnuBy_-8bdp9;W zcdiVFqseGA9#(_lAcT-P=iK?>5fLZSIZF{I-Ig>e84SP>=WYMME?vHS_4&zUb8j#h z`o~9ysmemy$xJWlbaf@Go7Es#c8}o3==KWQh(27wohg(B9Ja7A#eN}!!v^`bhi?yn zPh$Kw!r+4|A^ebSeJ&yc=lmFKG9Hbuz4-E{KD)KGbMx}$s~?+eZXJwAla0Y(Gz?i5 zoO8}eCwNoUE-DmE1ScW}=9~o(L(T(62Zng>!+5f>@%)V!J`F6(Tdyr7_;h8n;>yJN zgWT5jz+$l_x^}2Gn3RZuH35r;g-uuq938@TfS(*8MTLEJf$$$<@)fZE2_eI%`xs1q z^c3JOIM`tb+1Ad^-qqoF^4#T1S3h~<#h1UZwY76~b8~AqWO)&szbJDxR58N@L_8um z!BkBI5zI^x69LRX#4s~7fzLd{(Ri}EfAGS5dG^A(S^rsC<+F_{*X>*~bHwq4cG}W< zCDsmIl-SNTx|*S^vAKuCh}1J|kl@-j)DPg+WvCB;zXSXMFahoY>-VOF@I!F6p^vi1 zS(a~Ix_tG<_3Jl3v$ucgQ+o%OU*6u{y*eC@hFQphshOFnrg(m|ofC&RCvST!0qNG; zGGRgbEWvQjQ53}>gnXFlRlrN`yp;i!(qY3A-N=chXLZ)nnh?V#X;mPL8M<1dO#`Vx z=86>pFH~4G@678)4Fov2tM=D`;aUPj^F|g z%RD0BGR6FWeAu$eTh^7MS$Oowq3TJQptA~FZ^BBU93eLiiV1e>5SEv4%zH&N7r=RS7xg_nQ)%C+aeu(`GK{BSrN1E^}!l)9{6dhvU4=Ry=g zI=@Tre8tI=<-W%g3W&pil;R4rWi=S2(Re~x44ij9nBkn@oghO`kvpo~vCLp`qSPrP zGQbrX$$66ISX^U1hhm8y+(4@DAb)xdi-X?Cei^8N*Xe-2?88w&=!HKSPbLS?UBCIs zmtOkBPhGzH+?Ph9$>pLb2Oy*r)0@Fezr_W?)C`AnUYrwg&WrcnpR3~B`Z)0-u8V*! zo&piT2^g&E50oDAOqeHFiqJYi zYJ)nGvKsL@dN@YH3T`a1`As;x0!Lqhv;gh{U+Iec68e&NNB z|J2p%&;R&%vU$xp=gl;=Q9;d|I47=mq1L%j#EEwzA$X67GlQgxnQBV0O);7o8bTI) z2$?uE%gRjX@&XYd#x}K0Qy-rke&^w%2Y-^3H@5dKtv0u}Q#lxj^DantuURh#2RJVj z<3Q;gc>-s`(j4t_jnzw7HR!s)Rf?*>Y7hI&K0LgG%&udr>j-0vfBeJu0dfH>t3t>( z_xCQ}c<#9uzHsT%wa*PllPk_SuV#vM5v3E?3B1QIMbIwt6laE{n5<2)UM&~Px?b0H zU9akTwTv-pY}?v-Cz>>5MIpoCXq;t5UR8tAhv3^-FIKC?!_$-Fudde1KiRu-<tUNm#55OD$qbT!D=fEK2l2iR5=+;;~7A z#Gl1t3HF;md$ytj97{pJfVefG-L=e{tSOs+fULX0tg??3`1ttn!D2o?n$FIS*X!ln%u;IGRg6*BO(R*zTvil=!EjiO zM;oJRILdwSOEr5SPHycU96Y%3;!E>u&pof3+gn!Tg%=ZNN)Sg-BXj3TV(0uNILZyd zCxhCsS`i$L&Y^9Hjp6hZ8*U@32*q>og%X7op<8=H~Xn%@=;` zQ`et=@k<+9+s}LNLW;39GdqtPO)(WUXPwOmAviO&)pEI>PN&nyk00JWJvq94`_>z; zK7MrnmI%w`axrb&b}3kjDYd2+)yM@WIB_nxBFhRHjVIY)vT5abw77iz+G6|qwRrXB zkLm8gWj`8?vMhLya-KT`2i_nP!6P^Uhv9>ePcqz|LSq~!gF1)Qz+ppd6}LZxSwPzb z?4QB>8`#}XLi2IpOThN`j)cN9jCwL)Pz{FL*RDT*^UBrhpV`{leyPmMVT^6mlu{q$ zAkJZ+h&lRDvTd7oIz2mm{OJCj`}gm@djH<-ub-VB-99@#JzB3GOOfkcq8F_Z)1!gsuM*h<~*&YyJRFz(ou{&+}|}aB%s` z)oV9CwYjzXB1l!&>&DEq4{thcsp6dL-~=;UuU4zoYJPn0{+(~$x%I{?4<6io{rLFt zoqD}GHe=Zf|2)}G7wT1p6Je`_q7s_S6@$VR)kwwd?#7s}oCRLogi7HvvalRl6LSf(>c##gFH3*`eFEH1csa)_whc*zGiDqrs zx)uU99hC%10B@#-Ia^P6A$%F)rI+ig=nR@Lc+T_1bFe|N5d9vSUl z75?G@)xknOwv(}5PmuA*ofWyO8??@#%}FWIs zu5E4Y+|06kQ`JOO6M#6^{j&90f z#}m(m|L!XR*;O!%yU0oAxN`+=Y;@-*uAwQgb%W8M<3vg|Ne0xKF?W%|IYxyr^j!!V z1Tus`mmi!9FJyuZ1FH>VzEa|>p)GU5qCq8~F(4M8K0{(aHs(;RVI?Td1r>bm*_j|O zLN*$Xhda9mS4NY`6%jv7DUwoB5it=#RmJrgs;aiD)#~Wz=@{ZzW=|0zmC27GR$tnZrw#H4T#imdInNrJ|pFklsW3GVU{`0 zwlYQzhE51#odTpcL;coK-}!^>p=Ubrv|~>_NW_^VS%YfAR-n|#@gu~az}7LWZXkRN zWAJuE8a`nI<(eRWrC4`a9=HDJ^Hy(>LzjyZz4}KDhf@ z-PDJ@@YfgY{r7(xyMF;Rbh~TORjMAn07v)X^Y>x%21LP1u;m<^JIo21L#m7vpdL78 zm1mxLHsqWnVBHDmPdQ>>U5O!9##ZH-4;=H#vo0bjBoczQb0jxp29g=JeGK;|2-`i) z?a(A7jcC@;jC^+rLZJ1&4=&EJ zqCS3b(uEM2uw4l|Tk(v=6# zF2TtP_U53QSTP|rhF>>`IShy9N*Xn!sb@V8%twJH?>Cp7=LMZf0_ol{2&r&vWR6Fr zQsjZ)3~w#2Nm$#0O|htO>C=$EguU`T%*gu{z7vs94F-eJc)absFEvF?nv$xjs#*7C zQm~{+7t6)s{?Xy%TeJDeMQGuDkpFhUe&tPfo!;WQSHSOs2~4+Oc?eFs?dEcbdH0TO zggT<@h|U|*ykWUcEEUv2a6NCyAQQ;N$Q|SedGL&!P-LF0^n_fyJYt<8rzJGoP))i5 z-xkPC=uYcD_+ScY;$va zoEP~35VbD)=?t-*SH{&jm)bTi=Cj%3+4StxjOK#V{r+};wh!S`(7X)g-|ou%-=iAI zE8R8w*Rj(A-Hsg?6+Es0l3>YT8DTBh+OSnZ*O7IrG=&H0i#0u;TKWy+rE>~ZCX6!I zLD>$RB%H5tx#1dzwf**67)F{IJ3EOnHBX_L-_QD&ehGg1SK&{A zf7sjjPxPS0^WWvK%rG(}-+-M@VOw{QlT+{sBld`hfN7_gmQD$ck&+S(T%QL7Ix{4I zT8EyB7Y1G!WJ2yBL-9^K)Wr+9ri-K2HI#Re-DBM266JHxCJY4;$%`_S<)AQARn>^$ z%`{nu(<4}-WBRPttL1Dqn=ZON_%7hu`5FwtmJmj7=E#S@j{*M(_#*Hdz1^30*eVHY zkC3z9L6!#j4p#b3IOZT_U9rI+RDJ=xK*a-CQ zC*Z&OoAArO0>9NISWm4*|N5^2f1{^JxBnnkYe4L2sMbY zI|(sjs;G9Qi*p6Iw-AoZz&jz&x+`QJ7d%cP_yEa4yQY)SOECKhsQ(oB^=Fp}TTzy% zYE;wK#8Pj9?0g21Ia44eO{-*DXL*5h9@Uh-FY|N$8}WNNXW%<@&2onq;<^>^8BG5& za{N4UbPcv2z%U@I0G1<7grI;!tgBXd5uA0PoOf@Mi8}^xM@x5oO{4Kp1V;gg3KA2T zN7@3Z7m#MK9&}0$0pnlpP3ALDfQfT591MN%PSn%{Q8SI5^v(6jV@j$mSgSF$nqu2= zYTu<)eeHjQ|M=gBUy7X|zaK@VzIyOx$wv4$A^UgW($`@-ho*$Kg3uzeMxx?0;>_V= z!mHuhgd{^;AN%*Gz+HfpQ(s2&24aGlAQ}-;`iBIc%DGvewlPmI*&$E-#n!I<~R)&P5Sv4QtJaW){^ns%mRVTQk!v z%R-SC=g#cApMbyh-@?!SV%MMhUfK73hRYQAw}GFBjU%M0k+Xo*4N^yBo{-iMNxfYc zocDy_2*HtO!q7w23qACw!O7D+q73j+G3|;mW;v!FB3L6Z&$~EkpnctQ^>()0`!+!a z+O{1*Dw*}oan_T=`&YA8vFM$5d0vFFs)F}HQi^<6C4Br-a1`E8j@+#Vs1b&pW8Sz8 z!v!+m=#WZvh$xZ_=K^F9f)KnTcp(pv2Phqsy$N!?2|9o7^Yi8m)C_wPQ_GvI)Vu^g z!P*4zK2#53C@}TU$_IdnNNQ8NicPZ!AshFEeLc?w6iud@#Cr=q_$8EmWhaZCQgsA82Yvwuk8rylGKWnZ_#CGm@q%-mv-P3BdPQWFW0VUUPN;fE z?2x`D0I6@r>7u_5PErFjVXQH0yB;&2_wj>baRXuo_37K6?fod=JbX-M)~M<_sjfUU z2;R)pRK*PQUXp5RRef^ag}f+>EM$K5CXwqYC_;Yem$8>W3%~mw?&cKXq|11DsUt(} z7+gwl2xRfD7fW&xU0;MHg2gw4#fZR*st&C)C_&2(j59^%j82vt%_+B&D| zLzWMR<3TkTWz*@|+x@^_{wv6@{52TtV$C}yRj@+(r!*?yI*xw>8~jYiM2lA;y8@TL z279+~HE4OQRu1{fF#^E0RvTW(^j0xa(XglCioXxldJe0Dag*XwDX73+&(oA$S%s!25^ z7eW|~#-q)Rt-;jC`zi>Cno=3j?wuS>9&y)A#UgIL%>vdh?H8`j@O*58JWe+ypx zPvP<<>>bnDiNj z=k3HQ1uPk>Wn{iqVq>J(ZF(i^{DSK|#| z{4u!xakw#pyI)0CkD&T2^09~KoHGpc0tQw^8u=Kd5!MhsoE4=e~w8M8C3p$VSbupjTtJU%}ra1G?m*?#hSQiH+OA&}pyang;@pxmjv9(=Jr)NvmraJ|n z_>3|tO*7yG;b$P9Bg5ZCHXg&y0Cskf-MssLa1#*+ckdy0j=)-Ew}HHb6cIlL5xkGM zBH)}5a9txtPr}VIqZkCLQO;nJG2Y18-V9tFc=o)bl#ZI%vuQfB-UlB^pb^jM0@Vs@?;`US>OG9??ScOXf+B#pS}#|pr$o327aoE2Qm8hc0-0>j~Cnu9-Tr07X?$PCUbjXR?{IwO4X& zGw1o-vm-{A#xwX5!yLV|mUoPv$Z~1Jz zXXF3vRW>j0*};{4*}Ul`Y$3}6dC>QV4FgORDS@~~>V$0VcKLT}I30i~E-7LeqKcP< zbDrRo;1rLLIituOMHLus1SY!~JNr3T_5wGDp36ZPVz|E5?%edaF6;(X+9q+lNE|LB zi)AD(TH;#K#-q+*Qeq41ggY2wZ|tGBZ}uL=o>3m~W;CQ}K08~@XS3tMV7#5@StcSS z(kCw+IM<>srW9ikaaA=K?;l*kv)=8e{L+8A65=E^uLqNn*iY>|1%w?h2+}Yi_yl&>qjx9*2 z+xRff>qFJk6N->aIV$lv&U;*DxE>Q0B4Qp%4zV@PC-91MIf6$*!a2iv!DBdu;60fa zid-lr8P!hCc&A`vCujGdA%omZPS=LPmYgfJ3D(v)nG8rvMh7SXFZ-^eI+TG zr6h`qdY9!zb?MTjEkah$$kfFezj~zk?6FmoilENkWIm8ro^tG{wsOYXIUD`%zp$&|MDLcy@SrsV9f#F8RXe(o5uVC+T$>qx>KQ_*I zu5e7=VxiyG`fbqGo#}aS(r`SBtd@y-)(~SPCBcI0I%!O>y2W&kJ-&`S*vI&7y28=` z_|<3IAJCnGx^7QTPG%dM+b3034YI6o-uqnDNzW5a2x>-(YKhpY&+@Dqjwar`to^{P zJxfcqwyPC!wHB#-APX)h1m~Pr!MV_#g4EfCjy$V~clf^25Ip$c2&E?<`p)K$J)@0` z$!@{Um5S#M3T{pUS4zj02%`1`_`W!c&RnmIXe<|z2d9w-XNl=7v6>~C;qcpNTye3QD?N&}BW zL^`}DK*&8I^JK$7ISLF$fx%{AV>f4izu?+_!HrSILFO0;1hXgB*)Hz>9tR>py;2U( z8g3ueJeao3r!DJ6qKT0t1?mh<4)qCZbKnwG3Soh9w}+wq+nG?$s!LMMEY0Wh=H9*A zXL*tPJTJ4sVCcN}RZ7}%4aBrF*Qg1}`XYDmKFhKoF89vF@*qtbgve&;^38!Os-T5; zDL3bQH1RRuYC}vr;tPWF4i_NHItAppBO3&&NycO=V`C@h(r(VRjf{g)U|WQ;i_xAy z%yLeYxB$9|L2Q-dSy$k1GvObQ0?t=7!=}?SyL;!BRD+=$99)$wFUF~_t|t+2UJ-BN zy{XT@2PDfvk(V;8ifm_C6#G>uE>*UDX~e-s>9&jDh6dRxv2Kl28`dOR-_0d)PVim` znUD`Wqbe{OdNzlFt->)3LgA!$(AIC5KGG3;Qscnni5Ze)tmcV3kJo(b!J0oiYB`=o z=5u4c?%;@)w(}hkv<8h6bbk}Q|3~ne_7HjK30dw3tALC1Xyf70qosSz5klq;E?*~P zd0{v)QOtQ$3E*!4>NZu^HKq>RhneP zTB)Pb^suo=AN2$w%Y`C1s!S+DHm(f-wA!lxmYId9@c#8{+ibx z)jT?jOsA3MBGR-*RF8T`ay8L1EDnJUC~A0k0*|*5ir%?zK3jVFyX6LwVvG+S++7ys z@F=gwRHN}m$n(OP`6v$YnGk|W$Z%O9AuruvP-PpVVYxRMO|EYaUU+V!`21EGUe1J# zz7E^9n{~X-wio6(S}9I&J+P>jZs^1S#0T)RkW@`5E!Tm)TjJfjs zjkLY7Gs=7zIGj@#B;^^F=i);lSw0AZ!7!VQs&aQ+?pzw@FK!k7rNXg$@$jC9D4{ba zZ`P>o33woVXQ=hcvGb7>_VzIIyxjHVXQ>0)9v(G(>;9T=K3sF>sO99eWj>FrRz{Pc zH6;R(8dZn6gxM0S4ZX8~$2Hwt>do&htRK|Gtn-t=s;=9+hldLr4NOAOPDWcX%Zozt zEF;TZ3c0wfaG@wD%hC_3ve+JEdz)prUU=F0KA0P3PuoDV3(Pya@DJyX_AS%D&;Ndk z9n5g|q~*2yHQ#(tbNg|_(NWFxG_qV8b?b9l3Jj5KSbZ5^#M zk~b0#Z6~BQp;553!0udy6Aujg(mfxZ0=fqtTvgfqlvr^XmszDJhMHR1^m#0^Y7ok* zaAhez&y&x53c=&LS!C}zdr)}Vo4!@ZPs*MBzsm)bvu|IHYBaTSIE&mls(Jlh&8v^s z+&io}I&3*TZJ94x*2_p8p)p6YM9N##_3*PMY&6F1O|jL3KI2`|%_(@;lkqRE=ijda zvd_FX=8)9T{6(_uPwVba{wABN%hsOJti)T8Dw-dpJPb512j;Re;IcLZZ#YQ_ImZv( zyD~KFyDI0+?6&81iaaT?G_5jQL>`_+ZXGtf_HfOe$2AX6YK~4@rYDK{tYx)|v?&pt z5kp2)BWZ(1Me$fzVs(Mtn!@_`dtU0GZ^-z^@358r*85e!FaGoQeg+np|I%xWf4)jv zU(cC8o+gP4Y66;cx{oSn5yXOY#~ST%_zC89tpo+O?W8dBYK6I0f^ zn7j_ZKZez;-!8-cUGsO&e&4?d`g`xs4%NpmGXKLD6sP5rx>J7Rkd1& zEG8y+M=d;LqWz*k4q5^!fn^>WPS7PNSFl(95UXGA z=z!?c&ga?s0DT|Qcc5$R_yo>YLz|2*YZ^>MoVq+0b>lpVX>2oBFC|}1HJcx|JgioH zBX}|qV&S+dLhj{BtB`cmmkvwnWBGGj=Si}atlRCaGG8etOXXbwZnjsIePG;1u;Ox*lNpE;@OH{l<5&)pHpCec!X--e zn*zT2K3%bg<`OJVy=~eyVKA|xib>4yRpUzUMMRt0yVYsyXVuze=Aad8*UH%>=SJmZ zKXXhx6y9~jSvAxNzMH?;;f%>>lToLxcrvS%=~_9RMUG~X<9X!ltmS0hGMlx`r-|7j zvRuKsHrB19Q6-6X)49wOTaQ{ovj#0dLxmllV6SXr>#qU7Nk3oZy^H3DHa)%0v9l7n zngo$dWt357CduVVyhBNTi8g0R7NHffC>GZi7s(dmTpm=Ot%&2 z)zpa5s2gS78ucnMT_vWCvRrg_eYR9qi^O~pSk*_K?AF)dbQ`lz1Hbjofxt6YfE<0Wq~L5DPVd3yHn>eJ^P>48sOE^6L~Tu0 ziaUvjHA17b^T>MG$XV_g1V@#1yFV)&B@kRU&&MZ731S;*TcuWrYh}HREL&q$E9*sM zwN%!t)C*l{Q>0Fz8{}k(h>#Q_iIfW|wrDG8u|vuhaC(frQDV0bApHUGi|;-e@tG;W zcKAT=RA<=q0qh%SHzC5Z0agdhC5h%l>V%{OTBEB-TYBn&W05&>FBCy2UDp(yi{Vr; z?>lo8JBnb6k=Pf|+qJQ7l(tPYYo%@zDJo4XovATLD|FFK5~3H9Q<4TWbEqh`h~4eZ zH?do{um`_^#VN4={&)WSGeP4I_D;z2uTc0+7Sc9 zlLRyfDWK*LW z8C?Dy9_Yf;RDU_HSBTbF9OU!|$(9d9SBnddDc<;bs*A|N4=uXTznXQ|I ztR0sJ!6K*{nn{P-M8R6aaCBo_mZ((NQcwl<4zTGf*y~@%PG5%U?;`e(Fdp|%>K3%$ z0zUa+DB!oAQB1lC?SGBE@+s^Sui&n{h*pZV4rvOkikNTErp2P~Xox-_mipPR9ScI7 z?I$tx{m$H4Et7&q!)m{ zgYiE+jq=42@R<)o0ne;*47`HbuOY9$jIKA4pIAfeX%caWW;ui<));7@`y`VHu`@rS zg5&{d9r&JWlMIXJpWC3AgeUDnS{qicuq0S4Kn=4s7FJlg-^H-UH_*e^;np#vFQQEN zfq%H?hogW7TNgh+`w z>lD!>EO{s$Ryd%7RYIE;#2ILd=?XIgJ%x3`j!)slV~>9i(r@&T%U=UN|AQCBhob=L z1Ve@K|04Bwus`@T3`)49*zOVu6L42hS9Z;A%>ro~B=3g5imYH-z*dQ^GVq2BrJD(N zD$oj6EWrlghiD$V&D@?rdkhQ1js;Ga*lZK*dJif5@4(OXqh;*Rs{$@6qQLwB>KRgh z4m&%A!#Ci$06QK#%V4#_ywmb_I66+1HC>zbX6=R|G#gA7|@2-el1WYI+9M2;=~4iMeBNJK#NR ztRX%J8;9@>2Pt9Ici`bCVR9YQhw$*v;AkIi2G|$uPw&F*Bhc$0BPia$*6G84>>s@k zbT)8XSpDlrF~|5KO#cYwWx5f#Q{-q2b`=|c1=>xhW{7KC!B1zp492Bc5J$uZd9 zhV)w?KLPG9VV3w2+IK&S%jl-eKFNJCGEDAb_TOOXw=h{_r+)*yVn@G*9sNDbDK`Bz uXupd20+WaZ!F-7^pc}1ZKU$Ca{|^92g;y-I0d%ea0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z001vdNklgcIWk5d+#&c@!dB^#EU5-hZ^j%sj|y5RtwtQHX!J>L8cpt z7LzPwVbKBvE%?GH@deZ$8mT3~v;?9Bf@TnWv0Ad5w!3Yx+b+9Y<;r=8$c*`ocRa)1 zYw_XS7x^+Pvxdybs!}^o=81dXyZ7B;t-aUqU;nj^m>HiQ-@n6sDuPcH@TmemJw8>y zrwaJ=_*4O(D&W)OQw4mgfKQK474RqO2;a?V}aQ~wpMFxY4eZGB%aJeDpfLEm@#sRF(OfnPiw;MZqZ-wF^!MAk^ITMPYMA?;e=3d9Sy z7nNe4D&WHfAI?t^$ween)!@A^y$^ZYHj?FenfV~g)l$o{m#d~W#v~yGjWO1Usj4-m zx>^grSt};4Z|!~OpGXCK&`QsMVtwXi*&F6XF=(1P9}Gqt8dhGP4S71ypN=#0%z1|D-A4T=3^Y4{M>9 zz#wE-T!S(vVD?_~3)Y*y3=huB+8*wOl1_ z7mNAqD0_-Kz(6nwBN6t5WY`>KVR`V&;xp9uQwj_ zhg;*x=Kl89?$ycW&ee^L$(4S8uv3)fMp^a-Wv|~ailQ_%%#19{^K&=soFk>Anv%x0 zUDfq!HG6)xn9Zh#v+3ER)8oVYM@NrtKYIM&_UXy-L*Nux081p)7%e6VEy29~!>EAw zo0?KY27|$HV>lY`Ztv_J?Ck8_+T7Z`F&<_kdC++TEzI1T)#%FHcdf~zAuf6yW-g*1>OK;zK^F@ozLutZ{#bRpi zrHa3^AIble@db=$*GbnOB2??->!*PK`v+eE^1hXS?qK_QQEp#7xc=;wgBvgG?Cn3l zv9bB=cs$u33bBHcQ7I1w>%Vum2*oD)M4#6-n}wVe`iJ_H{m z3q{c@N2AH+_U@%iTid(aH*Vhh%pd;2@9aK${OGHTs(L#%n(|ev;Tvz;>e-iKd-eU<1-?(|}i+h(2K0g=?5AwX& z40#^Z3{y>OwTa?P1aXLfL!6T*iZufhko9@~FE|iE3^OxKl7bWGoQT7FM?dSASFhf< zwX?f_X=8JH|BW|Z*?Il-mw)@g!v}58n-0TL%jy;7?29^obVCluShWjIK>rzpH!%JP zxQAdLPYL0BVDodJU-o*F?VbIr2Ul-=?)vpxU)`doi7-18ypVTQ(-Y>hWb_mA_= zM9g*RmLOsmlq*Q51psj$hDmfU1sG-+iU~>ZS?0$@IT{W}Ul1%N3h0ZUee;fFJfu9Bb9xy)#_STZM?~ej53csJ_`DAB%@7iE5a*ru&O0$R2|ff9>|DgM-Ztki z_O9?{{l8!+NsTNo%AK9v%a`^qT`Oj1w>S4Mom|`8SRRag@)M*sY&)RC3gR^w?_urN zklWX=#h(Ul0sjud3S$VowGMLq_g(?#HaY`(y|OpCd~p4lXP^7rm#$vB@e_l=@L8ZA zW1G(L?GEBLv$agj4C#dI*AI#l=M9slsUv2Zl4^=EhAazC#G9Fxy-St$F%!O$03@0nXS%g;Z1P+r>a>!MFvonX3zheLERz`o#+G{Ls+ z!dJ&o??U@8gB=0e!2b&T(K@aC9xCA6<_93pvTU%oe{lKctrvdy%E8qy4*G+eKrhB< zfOfJMXLwW;=bWM7oC$&xK$BWbv0CY(%W;>>MT)Umu9iznsR1OW81lRz%d%d-KOFV? z{XwtS9}b42QNKUzXIY*(FP+ae){dle+#=w_5mVdNZF8n()6wQ6UcP!cyLzzGn+!7z zK;ubSj%ba@99o#oGw)V9dXBfFpbYQBMx^#~YiwSFhjr?4?Tw zKicaJo>8+wY+F@T?QFM0L`*f|oWsn_IqyV7ETvR6&9bUii}~#A@!9Fgz0>K*2^Wo0X89r!ZtQL#ey<~bgo@~awy*;QY%z}e3Le}gV;wF?;S_ecTZJi{H0HYU&9df~aN*KU4c(C=TfqyBb_VD?k+r677R%M*WHz1Nd-(9~YmXk?zdfH#kC)5Ev~8PZ+tyW6*Hs9)#MqLO zrnA$NBF5HbMNtd}celOs!|`}>X?th?#-+&>r@g0(s>G zJMAItt~2N2d#8Z&c)t)Qy}e6UE?>EF?K7j{#!ct_IK}9bo`>Uzs#c!b?cJlV)$B*84{OHk}_wT*^*2&4?VNC7H)K((Wm{|hal&W*Hmzt&yfU8%ltX{1i z0O925aB}b7JFmR<>Wg20>&+X_zwo&q`Rw&;w_e!U*}1G(L@-UUIypUk{qX3)ANt^5 zI=K1F^wPEKy0N(_MUiKjmn?^3qrmSgNg9~fhzPb-Vy&XpHr9K9>`P$LZ;|Fcqo&u}&S82>FUa+qAz6EeGQv>B)ntS{|*1UtQS5`fUpCcHy>rZZ3)KVN08>WZtYoCUf!G(R8tR zXvas{?%s~u-8~35pLssrdhR(cUAbo4d;9eJ1LwVWfU^#La88gykdY%!9C0C}Bv1~p z9mP%?)R)+F1eYpg{s?<}8;j$0mMkBhl7*)b^FJvgZfRBxovpWy&z4NtKUw!ebj~+j`-L~y1W{V4}UO#fRN`4|S{6~%5Lk+99 zQtxEelsTaojL*ugjcnuKhTp&Sx%}p5KAYdTem&pX*~)tTfp^Y3K{5pI1TR8|g($ud zbh98W60vHihXJb!On0$Gfz2YaImOy9Kzt36KMnSmP~s=I0~`>%_vN+g&+J~geEnJ$ z@{QECF14+tlmJu^5GNSw#F1sWPG{5G@4WriS6+SP#jhS7K71#(&B?kz(p)e%9|7q4 zuYrFIRy|=eH~z^*>g&sP^X~7ZW-d-PNB(nH#_saX8`;&Z{jhU=uh`z(91qGY^SEFT zL9B?l7js@+$TX&OdU|sB^6lGieBjWr-VB%O!&yHVv=k43yc>M7G+ifTO`31A{5e5I(*OikWey?Y! zAkb%H?>aFeF+nvzPa7o9NXLoPt7&pa8w8wm3RowUnHg@4SRjHAz#wBaN-U-sF$?&7 zij690C#2ReB5a?*{T7>TB1}FUDg9Uq5RuRyjCz+Y9c&H9<6Uvm)0DbGikceMB8VF1 z5rX%rsjK_9-+KM4Z@l@+t5vmpzuEZ+VD5jl{6YncKH5!HJii4oH%pNH&wNIaD4RWt?Bgi@PhE;$KvILZ-Gr6BfJD> zcj5LU*a<+t`(#ywvkD7>of88h&EuGD7(P3z~qCM&_|7aT$bngWU@IN3)rir$; z4m^;~{^xSxbe&RiCzP3E)OYj?AaHXJhEYkDYCi(JDV^bt%d*U)ARu%_~6}O zG%E9=?5Qd#rDUejFw{^16A=@LZETKbv+4cW+1X)=@jS`;h%0{p{JHLK>%KKY+kliv zC?Kt%ClC|31Wf~Vz@oz{L#K&mJJE~+I3W{zVuCtOYL{=P0G0&?rP3b+W_?E;3Sx-F zehI1QR#i`7^a}2Dj!j>}_!Z!nKE48Ey+T}`6|UbKl-~Qol442K)RM}YG%KPalFY1b zo91jWpB_)Ar_-2Xb0Nw4Hmm;z{`%)}FVwUNc-+EE*CGDR?&0R!eA)=M05x#M1v>TG zpjT~Y1EWAAP-z#*_%0F4ZB3^UI$TJEgg`L*LFna<(97|K;zk>|vj(jbGEl_dL8d2A z4=@6-`^}u9kL&}SbAC7+6{FE;;C=8Wriqjk!;%^zPDDEADy}iL#d5Kn&Sq!J@7VN= za>)OE2EX`k(EpF%0l?n{{@Hcxv;iD_o5j*!Z?GR~4NWF`;&thBx?tgp}^n@0oW~eD< zA_$^t$<$giQ!~@9@@h$(B*7LJ8Ol6_dWld^Bh1Xot<|}&>1oqA(aOc9Qit{SDYqLMUW>P z*4(Y(h&ArL=FD_HB0!lz?mZ5VQ|lBfRkz#5g3Z?TdV7jcgqf+;b(PdoGPMX60VjwV z-G7KhTQ^0BlNds{2(o=M$@QZkKni?u?F;_fb*5QA`F6%TupN+_&qI70(i}>IqV2L) zTLUVsM^tes;S7S4ZiQQ?1b0ppz=(83r2@fwA$QLc#`83a)m@vWL`$Yo){eGwW6_;LnlJH573UOJuw+J2t~dMN0Y7aQw%JZejfB$5Vj4Yl2McY86dW5{RnS z($!uRkaaYa%(PXt|s#!7<4O#FZ%RR`s@P(p)fBl!? zC%#N}FLZIm3}K3`8zMd$E|dc&2tNh4$5`36P_pl)Ve!r9nC-+rHzUzSjr$5Bu|)nh&_l+m$TFca_QqM;K>e9wbV3q z+qUge%~sA!Poj8J^XsRXU&^_J}WrGDvXHm7hw22)CWj= z{^{y9Z1QR1WYT53FyE+pS zK`bEh4rT#Ti}ZgQn|v90bO&Z{AmI+!&q4cRSaAiaA6qA6Iq-E{_F1eb;npk2?xVH+ zkGL}88pVm>e1mg_7f;B9tPqOAQT9Fkfv}MYBN0mJs*CR31=X#71CmjbFOP+>6j5mEiy}1wFwgyU2DQ*}ez)i&)*j;Fn?N&mb?( zuy-b1_pf;5#{UKVi1g;jW{o%x1HpMZye2A6BECp?1Mf1tH?qu8l%8HcFzN@kbI+!9 z-J4HRJAq{9{trZr*ceS?Xxn0|7OQJ4MUa3WvLgFb>uz@C2rdGru=cVX`>SoN{(0ayX)KI|VLSq(*nv^k^#HxitdxCUIVIF|@G zyc0s<$@&@jAg4D9496KeJ!QId4Z&z*?hPG%S}5aoM0%167Nqw4R-? z1RKM0)U^uetgB1#*{75VckFSs`Fz^0mW%mlw6XBcWgy-}MAv4@ASSis%`6mowz0KU z#=iB^U_`Hv3|CW?YHVf5M1zuoI9BXQ6`_a@X;D&MREv38f<+c*=1`eZZRBqIS%+Z7R+%j#C#Nl|S)^S=+B%VNs3puhtd~Kk zV09m51K0w}r{@FS1svNpJ$`h*IyksK9c^q4@LrsHZ%&-zFz-x!rY>Y=Av4KKpZ5pF zpx+;~Mev418a1+3EI1YCMH6C*k}wxRb2Ndu8WmX+UIm)AQ-TD{S|nE_2ikzR43~Kv zu~UEuJ_L%)k@W-RcE)HcXS9>EvtM#!E9be~v9X38MBdGNRb}1sCsF)pqWVKqxqr;QMczbW&>koqWJ~wmD#0f4y z$c?N}%?i`JbW#*~S@s5Ho@Ekfa<7_66cw*NI8=ow-4{2-Xi?`e3uscz8|FQxEhb%r zZUW*xk{lv>PMg75$M5tWvfPsoGkTMZ{$|d2lC!;CaAhm!Rxfbb89n3zMkQeS!G|&UM|9YKSHz7$P2*tV1>nAq+xi^EXNcyMc|}oUJQ;u3s*B zZWOrbpfB=-NdEqbTUbXhi%aG4am#~~mc?ADE1_uuDK@BYusp-U2AVIilhz-DzLtIc<0}ZCNZ^nq^I_7Nl6BL9lF$YKiq~Y&ymsJ_oC#b)Direi}X?{*NCZ ze+Sq9XLIcxT{&$}601Hk9~HTi5K1HqlJ#BI8!;Gfxb3a2^3v|s@bb>)=H<=)?)I?U zALiMXbIvQSnJXtp4UY$&<3Yw^+EUFtt3{$}5^W19Dy?;?e>&%E5)khY?{Pu!Jt35V zeBj9^f#Fuc=1#%(ZqC7W&dou_<=n9$9W-s$Ejv;38hqk!oLE1-HO!wol(eAlvx;YPKo)~R*WMVV#g zpe#nCksA;D#r81Y-0WosnU@J4-ajY~LeH~ZI5tK~y{XI_Wzi^grOeETu_Mx|18;(6 zjy!`RIP%glC>+Bz)%<+ksICL1^Z5Rpp7EsCyOvW*%5)KV>#*jfhc#~>)tsF)ET;|i zD$=Idp`&KlDnY(PWQ6$@Jg#AS30SV@3KdVQMQQMX3b1}3X(Kpy2|p}wtPtNSlG=z? zl)fzc{W$LT!nn*Qz2LW9m$ZJn0+;hb?mN3)CSzh4og$)?Lo%{;@8%1@RJ|1a6gg)mLI49 zXwsYe6ky zu|=&!Pe*Xn@5o>L{@V8c`KP%9?tQSBhDBHP@9#i40oQmF?VC{;saBPg8VSwPSe!-o zc;3q0QO?c6(fd}?*NafVyYtB|u6oYR%DKQVm>DkEddItefBw63lambUI&m~>dE;@z z%MU8veAsY!)G|A2Se&+0E2U|mb&fVOG(wVywh5bgv*dp zLlDskj5a%G<60=RgOOY3O=DrLYOJ7MBwL;&|M;lkwSLCdW=`Q9WA{F1Z0~ZLzln}< zUJ|tLjKugJ@Jo0P#_tSLG!~WeVA}HL!xb+*Y`F8N;qb8L^t54q+Ok?i>SVMUh*?3h z*l}MAhfOOiE8&#|Ec?L!xwaG~pTM}9|KWohAnN}P<0i-};Ey|Aq${vYQB7V=d|ILP zsoJd9%2BVjH*pkolC)X!*+SUJ9K#FsSKbc`$OY4LZreXd1@E)(=L7#tE|{DItr|^K z&gPN3r!8+js(Afg&7I?hqm!1|NyB{JvTPhR1#OB%Y0SX*oG-nVmH(W(~{MXp*B%LUe(sMye93L$oNd`918^V}J1DSk;_!slPjV z@pq?yfBr*${}vqn7Swx?u0!TATvwn7f~hAqO1r3~ew>)4Tzo6oG_k6U)mGrqq~LJu zxmgagCCGcF-OX{m7#Vf3e;bu$RA!BGGL5`*+;C?ad3;p! z;52eJjhvme%;%A6kyurcT0M;hVuD0MO|X!oZGkldY;%ac@iNxl!}x2!UtRYCe_{&w zPd^MJ0{6=>-Gh;0ZPQhS%YceQU51Jf7m+3k5^JP3bm*yTB^`Ut1~qs0a;|UXTp8wE zE*u+K*Ml|mvM!K!CD-@NaQ*;A#5HkB6I97qHp*<7c)W}}o<|N(BKJ;f4yTE;)0Wdk zVsX~6oOh8<({`Mn))I+GGLO25W=g8I(YT9U%CM6^z}}i;={MH~@gsoy-`$_M4=u~s z>ZjrU6ne)H~2v?25+z}U%GziRxIn!lidDw7oBWG`%v0XaG zJk(ziLpgjEy)^E?=rf42HR|~*^Ah(y$bbD0Kfgw=jVQR zS5f-OZ;>_q4LJES9DWA7J_jdQ6CkcoiA13rpW3EwiM9!w3(Ydo_A;tLWVy&#mO?qo zI2`7T3s1l27!Ew6!qdwfy+SC1Pl`^lj!;Kb^*{Z{k=F3jt z%VlD<>R^q!GTJCK2_g;Ad6M@e3q(`Y6==JM>JGYFVfTIyUeB@F&j7Qo6_$#R)O0J~ z%@wufSH2Zgjqo}6{3YZIIZ`XKYH_^WTWLe(TXLC=mM23+$M_zQ;P1X(8A?)@ybkzwN{Zn@D-4jd=6sfcZhWhIteS4Nb8#z@kZwh^)_(d5F) zdlq>h%Y~v8^0I4$%Q7K&Aq0nH9nng(v;U^+`ao1-GTJ85)Ve;QZk4v_csxy$Xd5LZ zC7BT|5Mx5~&e0~#(7HlJQ5>3P=uqLiog!4eYf?*bhI#ZGp~rq1eEBU}Cte#ZtHW z)w^y|iWt$lMiP(Wyx`XqauLM^!>`A1yUaSeeE?_jWRSfj?bs7Z(AY64l6JIlb%rKS zQtb#-E}fH?z$z@&i00ia`9_eUKoOiqoM^}6RO#AA*VQSfhBHN+A!_)Y=IQ0aDv8r{`m@`ALASV(9Qv3bI(9jrLRXwZjCcx4X9k1$zu z9Mtb*AonMyfb<%4DLX)fo!Z0OIYSGs}T)Y0_QsRS;FDa zt|;yloI{est>=1+t|=b2?um6BO@$~ORmHlf$Xpj8X;e%E^;y?M5!aXNDW+&h7@JtR zja4-kH?etz9U9y}h52s)dzgKpD}g=japzBeeEk^sUqHSB_9D!F7GC=z7G6ij53#`z ze894%8{^j|92H8A^Eo12jv#7XAD1`K7Kws5*Kz)(YoqSQ+Z%YpoIq`uB@Dp`n3Ik! zPK##J^`4obxnL{BrV$&KSe;>qC3Xn*$YDn($ZQPBVZ4knNBBwX1L61|I0cM={~hfA zS^s<)+ONXmC2Y0}qY<{6!Cs5>CWtfaV2sQKT?E`lvo6Sj%hm!n!=)C%b);MX>l&-Y z3#MSnA<@7k%xOp1N)BtmvK-9~>IR7cD>gBIis=eFyoD`Z!frp0og5>p-vzsaa&;Z` zb+d=;le)^-Cw&zqYwrSI?c!v;hMkSD+1GKiAI18Yu}g14Jw~c2LW@a(xCT~+osTPt z9+!DY5vryeB47@4InpGsZlr-}S2D9Kf{We6$TmZrhb9A!XgkGbm$1bO+?(*)m$CU{ znEp8EDaNmZTQ_~!_uy(`;d}B9#o9SLkW@V8?;RND=*calw?yQu zD{o1Hl@IuiFF*1$j_>Uiwa=&Rl$blg(tier6?X3wyZf8iSMI_$CfKr%7Vluo zm$50BTq60L6pTb7#xqi!q17R&Jteh=Xq=(#l$2Jeo1pasT|PutFJrC3={EZNhJCHZ z{`mK?;{i7R1C0L=W4@je{e3vTKi85x$M82g1Tp@b$o*4{zX&UZ`I|650?puubNI3S z4$!|p1MVYjzcw*Y$q_{_J|b z|Ag=Bh24KJE@wN&SOI;g|0+@^;4fpc4==s~ul_M;3%m-|8H^^7Dwwsflfz8ASuLXx z_W%7}Hwi^IVfD{-QCagJ0RIKun7RLC4Ilh~Tv6EZgLK$B;t1WPHC>K1e}K*Y1z7w7 zET$lTp^NEfe;$)x#2je*3t027Ve%~I|Gn literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/loading_96_12.png b/ug/wifi-direct/edje/images/loading_96_12.png new file mode 100644 index 0000000000000000000000000000000000000000..30f29e021d0e618255c6c230d0eef1495bce7a94 GIT binary patch literal 14976 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 KMNUMnLSTa8#X05x literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/loading_96_13.png b/ug/wifi-direct/edje/images/loading_96_13.png new file mode 100644 index 0000000000000000000000000000000000000000..2e38a950a6f2c7332b71c9c946a7f49af6865163 GIT binary patch literal 15052 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 Z1^~pm;{}N@rK|t|002ovPDHLkV1iHHQ~3Y@ literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/loading_96_17.png b/ug/wifi-direct/edje/images/loading_96_17.png new file mode 100644 index 0000000000000000000000000000000000000000..5f93920d3f35654b3287a2e778fa0567f7a8098e GIT binary patch literal 15112 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 N002ovPDHLkV1iMOfO7x< literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/round_rectangle_4X4.png b/ug/wifi-direct/edje/images/round_rectangle_4X4.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1f51d38f87ccd9c29476b13310fb47e158e57c GIT binary patch literal 18179 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 literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/images/second_depth_bg.png b/ug/wifi-direct/edje/images/second_depth_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3c6243cce9d58310769c773fdbee3cb6b9b926 GIT binary patch literal 22286 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 literal 0 HcmV?d00001 diff --git a/ug/wifi-direct/edje/ug-wifi-direct-theme.edc b/ug/wifi-direct/edje/ug-wifi-direct-theme.edc new file mode 100644 index 0000000..4635bee --- /dev/null +++ b/ug/wifi-direct/edje/ug-wifi-direct-theme.edc @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/defs.h" + +collections { +#include "widgets/button.edc" +#include "widgets/genlist.edc" +#include "widgets/progressbar.edc" +} diff --git a/ug/wifi-direct/edje/ug-wifi-direct.edc b/ug/wifi-direct/edje/ug-wifi-direct.edc new file mode 100644 index 0000000..0bd7b5b --- /dev/null +++ b/ug/wifi-direct/edje/ug-wifi-direct.edc @@ -0,0 +1,629 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../include/defs.h" + +collections { + group { + name: GRP_MAIN; + styles { + style { + name: "descrip_text_style"; + base: "font=TizenSans style=regular font_size=24 align=left/top color=#ffffff wrap=word"; + tag: "br" "\n"; + tag: "tab" "\t"; + } + } + + images{ + image: "second_depth_bg.png" COMP; + } + + parts { + part { + name: "padding_zero"; + type: RECT; + scale: 1; + description { + state: "default"; + rel2.relative: 0.0 0.0; + fixed: 1 1; + align: 0.0 0.0; + min: (434+102.5*2) (208+43*2); + visible: 0; + } + } + part { + name: "disconnect.image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: "second_depth_bg.png"; + rel1 { + to: "padding_zero"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_zero"; + relative: 1.0 1.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: 1076 700; + } + } + part { + name: "padding_description"; + type: SPACER; + scale: 1; + description { + state: "default"; + rel1 { + to: "disconnect.image"; + relative: 0.0 0.0; + } + rel2 { + to: "disconnect.image"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: 70 50; + } + } + part { + name: PART_DESCRIPTION; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 936 60; + fixed: 1 1; + rel1{ + to: "padding_description"; + relative: 1.0 1.0; + } + rel2{ + to: "padding_description"; + relative: 1.0 1.0; + } + color: 255 255 255 166; + text { + style: "descrip_text_style"; + } + } + } + part { + name: "padding_wifi_direct"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_DESCRIPTION; + relative: 0.0 1.0; + } + rel2 { + to: PART_DESCRIPTION; + relative: 0.0 1.0; + } + min: 680 20; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_WIFI_DIRECT_ON; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_wifi_direct"; + relative: 0.0 1.0; + } + rel2 { + to: "padding_wifi_direct"; + relative: 0.0 1.0; + } + align: 0.0 0.0; + fixed: 1 1; + min: 680 82; + color: 255 255 255 255; + } + } + part { + name: padding_genlist; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_WIFI_DIRECT_ON; + relative: 0.0 1.0; + } + rel2 { + to: PART_WIFI_DIRECT_ON; + relative: 0.0 1.0; + } + fixed: 1 1; + min: 680 40; + align: 0.0 0.0; + } + } + + part { + name: genlist_bg; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_genlist; + relative: 0.0 1.0; + } + rel2 { + to: padding_genlist; + relative: 0.0 1.0; + } + min: 680 378; + align: 0.0 0.0; + fixed: 1 1; + color: 204 204 204 255; + } + } + part { + name: PART_GENLIST_ITEMS; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_genlist; + relative: 0.0 1.0; + } + rel2 { + to: padding_genlist; + relative: 0.0 1.0; + } + min: 680 378; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: padding_refresh_btn; + type: SPACER; + scale: 1; + description { + state: "default"; + rel1 { + to: PART_WIFI_DIRECT_ON; + relative: 1.0 0.0; + } + rel2 { + to: PART_WIFI_DIRECT_ON; + relative: 1.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: 40 0; + } + } + part { + name: PART_REFRESH_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_refresh_btn; + relative: 1.0 1.0; + } + rel2 { + to: padding_refresh_btn; + relative: 1.0 1.0; + } + min: 216 70; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: padding_close_btn; + type: SPACER; + scale: 1; + description { + state: "default"; + rel1 { + to: PART_REFRESH_BTN; + relative: 0.0 1.0; + } + rel2 { + to: PART_REFRESH_BTN; + relative: 0.0 1.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: 0 10; + } + } + part { + name: PART_CLOSE_BTN; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_close_btn; + relative: 1.0 1.0; + } + rel2 { + to: padding_close_btn; + relative: 1.0 1.0; + } + min: 216 70; + align: 0.0 0.0; + fixed: 1 1; + } + } + } + } + + group { + name: GRP_WIFI_DIRECT_SELECT; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 310 164; + color: 0 0 0 127; + } + } + part { + name: PART_SWALLOW_CONTENT; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 1.0 1.0; + } + align: 0.5 0.5; + fixed: 1 1; + } + } + } + } + + group { + name: GRP_DIM_LY; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + align: 0.0 0.0; + min: 1920 1080; + color: 0 0 0 122; + } + } + } + } + + group { + name: GRP_WIFIDIRECT_SCAN_LY; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + fixed: 1 1; + color: 30 32 46 64; + } + } + part { + name: "searching.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + min: 139 139; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_SEARCH_IMAGE; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "searching.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "searching.pad"; + relative: 1.0 1.0; + } + min:150 150; + fixed: 1 1; + align: 0.0 0.0; + } + } + } + } + + group { + name: GRP_WIFIDIRECT_DISCONNECT_LY; + styles { + style { + name: "off_wifi_direct_text_style"; + base: "font=TizenSans tyle=Regular font_size=20 align=center color=#929fB5 wrap=word"; + tag: "br" "\n"; + tag: "tab" "\t"; + } + } + + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + fixed: 1 1; + color: 30 32 46 64; + } + } + part { + name: "disconnect.pad"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + min: 40 139; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: "disconnect.text.image"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "disconnect.pad"; + relative: 1.0 1.0; + } + rel2 { + to: "disconnect.pad"; + relative: 1.0 1.0; + } + min: 600 50; + fixed: 1 1; + align: 0.0 0.0; + color: 30 32 46 64; + } + } + part { + name: PART_DISCONNECT_TEXT; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + fixed: 1 1; + color: 146 159 181 153; + min: 600 50; + rel1{ + to: "disconnect.text.image"; + relative: 0.0 0.0; + } + rel2{ + to: "disconnect.text.image"; + relative: 1.0 1.0; + } + text { + style: "off_wifi_direct_text_style"; + } + } + } + } + } + + group { + name: GRP_CONNECT_ACCEPT; + styles { + style { + name: "popup_text_style_accept"; + base: "font=TizenSans tyle=regular font_size=24 align=left/top color=#ffffff wrap=word"; + tag: "br" "\n"; + tag: "tab" "\t"; + } + } + + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + fixed: 1 1; + min: 480 280; + color: 255 255 255 255; + } + } + part { + name: padding_top_left; + type: SPACER; + scale: 1; + description { + state: "default"; + rel1 { + to: "bg"; + relative: 0.0 0.0; + } + rel2 { + to: "bg"; + relative: 0.0 0.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: 40 40; + } + } + part { + name: PART_TITLE; + type: TEXTBLOCK; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_top_left; + relative: 1.0 1.0; + } + rel2 { + to: padding_top_left; + relative, 1.0 1.0; + } + min: 480 100; + align: 0.0 0.0; + fixed: 1 1; + color: 69 143 255 255; + text { + style: "popup_text_style_accept"; + } + } + } + part { + name: padding_cotent; + type: SPACER; + scale: 1; + description { + state: "default"; + rel1 { + to: PART_TITLE; + relative: 0.0 1.0; + } + rel2 { + to: PART_TITLE; + relative: 0.0 1.0; + } + fixed: 1 1; + align: 0.0 0.0; + min: 480 30; + } + } + part { + name: PART_YES; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_cotent; + relative: 0.0 1.0; + } + rel2 { + to: padding_cotent; + relative: 0.0 1.0; + } + min: 82 82; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: padding_yes_no; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: PART_YES; + relative: 1.0 0.0; + } + rel2 { + to: PART_YES; + relative: 1.0 0.0; + } + min: 10 82; + align: 0.0 0.0; + fixed: 1 1; + } + } + part { + name: PART_NO; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: padding_yes_no; + relative: 1.0 0.0; + } + rel2 { + to: padding_yes_no; + relative: 1.0 0.0; + } + min: 82 82; + align: 0.0 0.0; + fixed: 1 1; + } + } + } + } +} diff --git a/ug/wifi-direct/edje/widgets/button.edc b/ug/wifi-direct/edje/widgets/button.edc new file mode 100644 index 0000000..82cd781 --- /dev/null +++ b/ug/wifi-direct/edje/widgets/button.edc @@ -0,0 +1,598 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +group { + name: "elm/button/base/wifi_direct_button"; + parts { + part { + name: "button_image"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 680 82; + fixed: 1 1; + color: 204 204 204 255; + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + } + part { + name: "elm.text"; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + min: 680 82; + fixed: 1 1; + align: 0.0 0.0; + rel1.to: "button_image"; + rel2.to: "button_image"; + color: 89 89 89 255; + text { + size: 30; + align: 0.1 0.5; + } + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "padding_text"; + type: SPACER; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + rel1{ + to: "button_image"; + relative: 0.0 0.0; + } + rel2{ + to: "button_image"; + relative: 0.0 0.0; + } + min: 414 0; + fixed: 1 1; + align: 0.0 0.0; + } + } + part { + name: PART_WIFI_DIRECT_SELECT; + type: TEXT; + mouse_events: 0; + scale: 1; + description { + state: "default" 0.0; + color: 89 89 89 255; + align: 0.0 0.0; + rel1{ + to: "padding_text"; + relative:1.0 1.0; + } + rel2{ + to: "button_image"; + relative: 1.0 1.0; + } + text { + size: 30; + } + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "image_rect"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "button_image"; + offset: -28 -10; + } + rel2 { + to: "button_image"; + offset: 28 10; + } + visible: 0; + } + description { + state: "pressed" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + + programs { + program { + name: "button_clicked"; + signal: "mouse,down,1"; + source: "button_image"; + action: STATE_SET "focus" 0.0; + target: "button_image"; + target: PART_WIFI_DIRECT_SELECT; + after: "button_press"; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "button_image"; + target: "elm.text"; + target: PART_WIFI_DIRECT_SELECT; + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "button_image"; + target: "elm.text"; + target: PART_WIFI_DIRECT_SELECT; + } + program { + name: "button_press"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "pressed"; + signal: "elm,action,press"; + source: "elm"; + action: STATE_SET "pressed" 0.0; + target: "image_rect"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } +} + +group { + name: "elm/button/base/action_button"; + images { + image: "round_rectangle_4X4.png" COMP; + } + + parts { + part { + name: "button_image"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image.normal: "round_rectangle_4X4.png"; + image.border: 4 4 4 4; + min: 216 70; + fixed: 1 1; + color: 204 204 204 255; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "disable" 0.0; + inherit: "default" 0.0; + color: 100 100 100 255; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1.to: "button_image"; + rel2.to: "button_image"; + color: 0 0 0 255; + align: 0.0 0.0; + text { + size: 30; + } + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + + programs { + program { + name: "button_clicked"; + signal: "mouse,down,1"; + source: "button_image"; + action: STATE_SET "focus" 0.0; + target: "button_image"; + target: "elm.text"; + after: "button_press"; + } + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "elm.text"; + target: "button_image"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "button_image"; + } + program { + name: "button_press"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } +} + +group { + name: "elm/button/base/popup_button"; + images { + image: "ico_dropdown_menu_check.png" COMP; + } + parts { + part { + name: "popupbtn_bg"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 310 82; + fixed: 1 1; + color: 204 204 204 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "disable" 0.0; + inherit: "default" 0.0; + color: 100 100 100 255; + } + } + part { + name: "padding_text"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "popupbtn_bg"; + } + rel2 { + to : "popupbtn_bg"; + relative: 32/310 0.0; + } + fixed: 1 1; + visible: 0; + align: 0.0 0.0; + } + } + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "padding_text"; + relative: 1.0 1.0; + } + rel2 { + to: "popupbtn_bg"; + relative: 240/310 1.0; + } + color:89 89 89 255; + text { + style: "Tizen:style=Regular"; + size: 30; + align: 0.0 0.5; + } + align: 0.0 0.0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + text { + font: "Tizen:style=Medium"; + size: 30; + align: 0.0 0.5; + } + color: 255 255 255 255; + } + description { + state: "focused_selected" 0.0; + inherit: "focused" 0.0; + } + } + part { + name: "padding_icon"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "elm.text"; + relative: 1.0 0.0; + } + rel2 { + to : "elm.text"; + relative: 1.0 0.0; + } + fixed: 1 1; + visible: 0; + min: 20 28; + align: 0.0 0.0; + } + } + part { + name: "icon.selected"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "ico_dropdown_menu_check.png"; + } + rel1 { + to: "padding_icon"; + relative: 1.0 1.0; + } + rel2 { + to: "padding_icon"; + relative: 1.0 1.0; + } + min: 26 26; + align: 0.0 0.0; + fixed: 1 1; + visible: 0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + visible: 1; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + visible: 1; + } + description { + state: "focused_selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + visible: 1; + } + } + part { + name: "event"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + } + description { + state: "disabled" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + } + programs { + program { + name: "button_clicked"; + signal: "mouse,down,1"; + source: "popupbtn_bg"; + } + program { + name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + script { + new st1[31]; + new st2[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + set_state(PART:"popupbtn_bg", "focused", 0.0); + if (!strcmp(st1, "default")) + { + set_state(PART:"elm.text", "focused", 0.0); + } else if(!strcmp(st1, "selected")) + { + set_state(PART:"elm.text", "focused_selected", 0.0); + } + + get_state(PART:"icon.selected", st2, 30, vl); + if(!strcmp(st2, "selected")) + { + set_state(PART:"icon.selected", "focused_selected", 0.0); + } else if(!strcmp(st2, "default")) + { + set_state(PART:"icon.selected", "focused", 0.0); + } + } + } + program { + name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + script { + new st1[31]; + new st2[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + set_state(PART:"popupbtn_bg", "default", 0.0); + if (!strcmp(st1, "focused")) + { + set_state(PART:"elm.text", "default", 0.0); + } else if(!strcmp(st1, "focused_selected")) + { + set_state(PART:"elm.text", "selected", 0.0); + } + get_state(PART:"icon.selected", st2, 30, vl); + if (!strcmp(st2, "focused_selected")) + { + set_state(PART:"icon.selected", "selected", 0.0); + } else if (!strcmp(st2, "focused")) + { + set_state(PART:"icon.selected", "default", 0.0); + } + } + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + } + program { + name: "button_click"; + signal: "mouse,down,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,press" ""; + } + program { + name: "button_unclick"; + signal: "mouse,up,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,unpress" ""; + } + program { + name: "mouse_unclick_after"; + signal: "mouse,clicked,1"; + source: "event"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { + name: "click_state_set"; + signal: SIG_BTN_SELECTED; + source: PROG; + script { + new st1[31]; + new Float:vl; + get_state(PART:"elm.text", st1, 30, vl); + if (!strcmp(st1, "default")) + { + set_state(PART:"elm.text", "selected", 0.0); + set_state(PART:"icon.selected", "selected", 0.0); + } else if(!strcmp(st1, "focused")) + { + set_state(PART:"elm.text", "focused_selected", 0.0); + set_state(PART:"icon.selected", "focused_selected", 0.0); + } + } + } + } +} \ No newline at end of file diff --git a/ug/wifi-direct/edje/widgets/genlist.edc b/ug/wifi-direct/edje/widgets/genlist.edc new file mode 100644 index 0000000..b986b81 --- /dev/null +++ b/ug/wifi-direct/edje/widgets/genlist.edc @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../include/defs.h" + +group { + name: "elm/genlist/item/text.icon/default"; + data.item: "texts" "elm.text"; + parts { + part { + name: "base"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + min: 680 82; + align: 0.0 0.0; + visible: 0; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 69 143 255 255; + visible: 1; + } + } + part { + name: "line"; + type: RECT; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "base"; + relative: 1.0 1.0; + } + rel2 { + to: "base"; + relative: 1.0 1.0; + } + min: 680 2; + align: 1.0 1.0; + fixed: 1 1; + color: 0 0 0 252/10; + } + } + part { + name: "left_text_padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + rel1 { + to: "base"; + relative: 0.0 0.0; + } + rel2 { + to: "base"; + relative: 0.0 0.0; + } + align: 0.0 0.0; + min: 40 82; + fixed: 1 1; + } + } + part { + name: "elm.text.bg"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.0; + min: 600 82; + fixed: 1 1; + rel1 { + to: "left_text_padding"; + relative: 1.0 0.0; + } + rel2 { + to: "left_text_padding"; + relative: 1.0 0.0; + } + } + } + part { + name: TXT_ELM_TEXT; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + align: 0.0 0.5; + min: 600 82; + fixed: 1 1; + rel1 { + to: "elm.text.bg"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.text.bg"; + relative: 1.0 1.0; + } + color:89 89 89 255; + text { + font: FONT_L; + size: 30; + align:0.0 0.5; + } + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + part { + name: "right_text_padding"; + type: SPACER; + scale: 1; + description { + state: "default" 0.0; + align: 1.0 1.0; + min: 40 82; + fixed: 1 1; + rel1 { + relative: 1.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + } + + programs { + program { + name: "focused"; + signal: "elm,state,focused"; + source: "elm"; + action: STATE_SET "focus" 0.0; + target: "base"; + target: TXT_ELM_TEXT; + } + program { + name: "unfocused"; + signal: "elm,state,unfocused"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "base"; + target: TXT_ELM_TEXT; + } + } +} diff --git a/ug/wifi-direct/edje/widgets/progressbar.edc b/ug/wifi-direct/edje/widgets/progressbar.edc new file mode 100644 index 0000000..c54cf42 --- /dev/null +++ b/ug/wifi-direct/edje/widgets/progressbar.edc @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../../include/defs.h" + +group{ + name: "elm/progressbar/horizontal/search_progress"; + images { + image: "loading_96_01.png" COMP; + image: "loading_96_02.png" COMP; + image: "loading_96_03.png" COMP; + image: "loading_96_04.png" COMP; + image: "loading_96_05.png" COMP; + image: "loading_96_06.png" COMP; + image: "loading_96_07.png" COMP; + image: "loading_96_08.png" COMP; + image: "loading_96_09.png" COMP; + image: "loading_96_10.png" COMP; + image: "loading_96_11.png" COMP; + image: "loading_96_12.png" COMP; + image: "loading_96_13.png" COMP; + image: "loading_96_14.png" COMP; + image: "loading_96_15.png" COMP; + image: "loading_96_16.png" COMP; + image: "loading_96_17.png" COMP; + image: "loading_96_18.png" COMP; + } + + parts { + part { + name: "bg"; + type: IMAGE; + scale: 1; + description { + state: "default" 0.0; + image { + normal: "loading_96_01.png"; + tween: "loading_96_02.png"; + tween: "loading_96_03.png"; + tween: "loading_96_04.png"; + tween: "loading_96_05.png"; + tween: "loading_96_06.png"; + tween: "loading_96_07.png"; + tween: "loading_96_08.png"; + tween: "loading_96_09.png"; + tween: "loading_96_10.png"; + tween: "loading_96_11.png"; + tween: "loading_96_12.png"; + tween: "loading_96_13.png"; + tween: "loading_96_14.png"; + tween: "loading_96_15.png"; + tween: "loading_96_16.png"; + tween: "loading_96_17.png"; + tween: "loading_96_18.png"; + } + } + } + } + + programs{ + program { + name: "loop_state"; + action: STATE_SET "default" 0.0; + target: "bg"; + signal: "elm,state,pulse,start"; + source: "elm"; + transition: LINEAR 0.5; + after: "post_loop_state"; + } + program { + name: "post_loop_state"; + script { + run_program(PROGRAM:"loop_state"); + } + } + } +} diff --git a/ug/wifi-direct/include/dbg.h b/ug/wifi-direct/include/dbg.h new file mode 100644 index 0000000..0e63b49 --- /dev/null +++ b/ug/wifi-direct/include/dbg.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DBG_H__ + +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "ug-wifi-direct" + +#ifndef _ERR +#define _ERR(fmt, args...) LOGE("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#ifndef _DBG +#define _DBG(fmt, args...) LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#ifndef _INFO +#define _INFO(fmt, args...) LOGI("[%s:%d] "fmt"\n", __func__, __LINE__, ##args) +#endif + +#endif /* __DBG_H__ */ diff --git a/ug/wifi-direct/include/defs.h b/ug/wifi-direct/include/defs.h new file mode 100644 index 0000000..a40c295 --- /dev/null +++ b/ug/wifi-direct/include/defs.h @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __DEFS_H__ +#define __DEFS_H__ + +#define RET_SUCCESS 0 +#define RET_FAILED -1 +#define WIFI_DIRECT_DEFAULT_BUF_LEN 256 +#define WIFI_DIRECT_HALF_BUF_LEN 128 +#define WIFI_DIRECT_STATE_BUF_LEN 32 +#define MAX_STRING_LENTH 200 +#define BTN_DIRECT 2 +#define POPUP_RIGHT 40 +#define HALF_SCALE 0.5 +#define POPUP_WIDTH 310 +#define CENTER_HEIGHT 40 +#define WIFI_DIRECT_COLON_LEN 8 +#define HANDLER_INTERVAL 0.5 +#define RSP_X 400 +#define RSP_Y 300 +#define CONN_YES 1 +#define CONN_NO 0 + +#define ELM_SCALE elm_config_scale_get() + +/*GROUP*/ +#define GRP_MAIN "main_view" +#define GRP_WIFI_DIRECT_SELECT "grp_wifi_direct_select" +#define GRP_WIFIDIRECT_DISCONNECT_LY "wifidirect_disconnect" +#define GRP_WIFIDIRECT_SCAN_LY "wifidirect_scan" +#define GRP_DIM_LY "dim_layout" +#define GRP_CONNECT_ACCEPT "connect_accept" + +/*PART*/ +#define PART_WIFI_DIRECT_SELECT "part_wifi_direct_select" +#define PART_DESCRIPTION "description" +#define PART_WIFI_DIRECT_ON "wifi_direct_on" +#define PART_SWALLOW_CONTENT "elm.swallow.content" +#define PART_REFRESH_BTN "refresh_btn" +#define PART_CLOSE_BTN "close_btn" +#define PART_GENLIST_ITEMS "genlist_item" +#define PART_WIFI_DIRECT_SELECT "part_wifi_direct_select" +#define PART_DISCONNECT_TEXT "disconnect.text" +#define PART_SEARCH_IMAGE "search_image" +#define PART_TITLE "title" +#define PART_YES "swallow_content_yes" +#define PART_NO "swallow_content_no" + +/*TEXT*/ +#define TXT_WIFI_DIRECT_DISC _("You can connect to device using WiFi "\ + "direct.
Select your WiFi direct device to connect to.") +#define TXT_WIFI_DIRECT _("WiFi direct") +#define TXT_WIFIDIRECT_NONE _("There is no connection device for WiFi "\ + "direct.
If you want to use WiFi direct,turn on the option.") +#define TXT_REFRESH_BTN "Refresh" +#define TXT_CLOSE_BTN "Close" +#define TXT_STOP_BTN "Stop" +#define TXT_OFF_BTN "OFF" +#define TXT_ON_BTN "ON" +#define TXT_CONNECT "Connected" +#define TXT_DISCONNECT "Disconnected" +#define TXT_ELM_TEXT "elm.text" +#define TXT_COLON " : " +#define TXT_CONN_PROG _("Connecting to......") +#define TXT_YES "YES" +#define TXT_NO "NO" + +/*STYLE*/ +#define STYLE_POPUP_BUTTON "popup_button" +#define STYLE_WIFI_DIRECT_BTN "wifi_direct_button" +#define STYLE_ACTION_BUTTON "action_button" +#define STYLE_TEXT_ICON "text.icon" +#define STYLE_SEARCH_PROGRESS "search_progress" + +/*SIGNAL*/ +#define PROG "prog" +#define SIG_CLICKED "clicked" +#define SIG_BTN_SELECTED "btn,selected" + +/* Key defines */ +#define KEY_UP "Up" +#define KEY_DOWN "Down" +#define KEY_LEFT "Left" +#define KEY_RIGHT "Right" +#define KEY_EXIT "XF86Close" + +#define KEY_0 "0" +#define KEY_1 "1" +#define KEY_2 "2" +#define KEY_3 "3" +#define KEY_4 "4" +#define KEY_5 "5" +#define KEY_6 "6" +#define KEY_7 "7" +#define KEY_8 "8" +#define KEY_9 "9" + +#endif /* __DEFS_H__ */ diff --git a/ug/wifi-direct/include/i18n.h b/ug/wifi-direct/include/i18n.h new file mode 100644 index 0000000..948c9fb --- /dev/null +++ b/ug/wifi-direct/include/i18n.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __I18N_H__ +#define __I18N_H__ + +#include + +#define i18n_init() bindtextdomain(PKGNAME, LOCALEDIR) + +#ifdef _ +#undef _ +#endif +#define _(s) dgettext(PKGNAME, s) +#define dgettext_noop(s) (s) + +#ifdef N_ +#undef N_ +#endif +#define N_(s) dgettext_noop(s) + +#endif /* __I18N_H__ */ diff --git a/ug/wifi-direct/include/util.h b/ug/wifi-direct/include/util.h new file mode 100644 index 0000000..1de093a --- /dev/null +++ b/ug/wifi-direct/include/util.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __UTIL_H__ +#define __UTIL_H__ + +Evas_Object *util_add_layout(Evas_Object *parent, const char *file, + const char *group); +Evas_Object *util_add_button(Evas_Object *parent, const char *style, + const char *part, const char *text); +Evas_Object *util_add_box(Evas_Object *parent, const char *part); +Evas_Object *util_add_progressbar(Evas_Object *parent, + const char *style, const char *part); +void util_set_cycle_focus(Evas_Object **obj, int count); + +#endif /* __UTIL_H__ */ diff --git a/ug/wifi-direct/include/wifi_direct_mgr.h b/ug/wifi-direct/include/wifi_direct_mgr.h new file mode 100644 index 0000000..d448ed4 --- /dev/null +++ b/ug/wifi-direct/include/wifi_direct_mgr.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __WIFI_DIRECT_MGR_H__ +#define __WIFI_DIRECT_MGR_H__ + +#include "defs.h" +#include +#include +#include +#include +#include + +#define WIFI_DIRECT_DISCOVERY_LISTEN_AND_SCAN 0 +#define WIFI_DIRECT_SCAN_TIMEOUT 3 + +struct device_info { + char dev_name[WIFI_DIRECT_DEFAULT_BUF_LEN]; + char mac_addr[WIFI_DIRECT_DEFAULT_BUF_LEN]; + Eina_Bool is_conn; + int wps_types; + char wps_pin[WIFI_DIRECT_STATE_BUF_LEN]; + char state[WIFI_DIRECT_STATE_BUF_LEN]; +}; + +struct discovered_device_info { + char mac_addr[WIFI_DIRECT_DEFAULT_BUF_LEN]; + int conn_status; + int wps_types; + char wps_pin[WIFI_DIRECT_STATE_BUF_LEN]; +}; + +struct wifi_direct_cbs { + wifi_direct_device_state_changed_cb device_state_cb; + wifi_direct_discovery_state_chagned_cb discovery_state_cb; + wifi_direct_connection_state_changed_cb connection_state_cb; + wifi_direct_connected_peer_cb connected_peer_cb; + wifi_direct_discovered_peer_cb discovered_peer_cb; +}; + +const char *wifi_direct_mgr_err_dbg(int errcode); +char *wifi_direct_mgr_get_device_name(void); +char *wifi_direct_mgr_get_mac_address(void); +int wifi_direct_mgr_register_callback(struct wifi_direct_cbs *cbs, + void *data); +int wifi_direct_mgr_unregister_callback(void); +int wifi_direct_mgr_wifi_init(void); +int wifi_direct_mgr_wifi_fini(void); +int wifi_direct_mgr_wifi_direct_init(void); +int wifi_direct_mgr_wifi_direct_fini(void); +int wifi_direct_mgr_get_state(wifi_direct_state_e *status); +int wifi_direct_mgr_activate(void); +int wifi_direct_mgr_deactivate(void); +int wifi_direct_mgr_set_configure_num(void); +int wifi_direct_mgr_foreach_discovered_peers( + wifi_direct_discovered_peer_cb cb, void *data); +int wifi_direct_mgr_foreach_connected_peers( + wifi_direct_connected_peer_cb cb, void *data); +int wifi_direct_mgr_start_discovery(void); +int wifi_direct_mgr_cancel_discovery(void); +int wifi_direct_mgr_connect(const char *mac_addr); +int wifi_direct_mgr_disconnect(const char *mac_addr); +int wifi_direct_mgr_reject_connection(const char *mac_addr); +int wifi_direct_mgr_accept_connection(char *mac_addr); +int wifi_direct_mgr_get_wps_type(Eina_Bool *is_pbc); +int wifi_direct_mgr_set_wps_type(wifi_direct_wps_type_e *type); + +#endif /* __WIFI_DIRECT_MGR_H__ */ diff --git a/ug/wifi-direct/include/wifi_direct_view.h b/ug/wifi-direct/include/wifi_direct_view.h new file mode 100644 index 0000000..1fb28b4 --- /dev/null +++ b/ug/wifi-direct/include/wifi_direct_view.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __WIFI_DIRECT_VIEW_H__ +#define __WIFI_DIRECT_VIEW_H__ + +#include +#include + +Evas_Object *wifi_direct_view_create(Evas_Object *win, ui_gadget_h ug); + +#endif /* __WIFI_DIRECT_VIEW_H__ */ diff --git a/ug/wifi-direct/src/ug_wifi_direct.c b/ug/wifi-direct/src/ug_wifi_direct.c new file mode 100644 index 0000000..a9cfd44 --- /dev/null +++ b/ug/wifi-direct/src/ug_wifi_direct.c @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef UG_MODULE_API +#define UG_MODULE_API __attribute__ ((visibility("default"))) +#endif + +#include +#include +#include +#include "i18n.h" +#include "dbg.h" +#include "wifi_direct_view.h" + +struct _ug_data { + Evas_Object *win; + Evas_Object *base; + ui_gadget_h ug; +}; + +/** +* Create the base layout for wifi direct UI gadget. +* +* This function supposed to be called after successful initialization +* with ug_init(), When wifi direct UG is created, the create operation is invoked, +* the implementation of create operation is _on_create. +* In this function a base layout will be created for the UI gadget instance. +* +* @param[in] ug UI gadget object +* @param[in] mode mode of UI gadget +* @param[in] service the handler to the service +* @param[in] priv _priv object +*/ +static void *_on_create(ui_gadget_h ug, enum ug_mode mode, + service_h service, void *priv) +{ + struct _ug_data *ugd; + Evas_Object *base; + Evas_Object *win; + + if (!ug || !priv) { + _ERR("Parameter error!"); + return NULL; + } + + ugd = priv; + ugd->ug = ug; + + elm_theme_extension_add(NULL, UG_WIFI_DIRECT_EDJ_THEME); + + win = ug_get_window(); + if (!win) { + _ERR("window get failed"); + return NULL; + } + ugd->win = win; + + elm_win_focus_highlight_enabled_set(win, EINA_TRUE); + elm_win_focus_highlight_style_set(win, "invisible"); + + base = wifi_direct_view_create(win, ug); + if (!base) { + _ERR("add base layout failed."); + return NULL; + } + + ugd->base = base; + evas_object_raise(base); + + return base; +} + +/** +* Called when wifi direct ug starts. +* +* @param[in] ug UI gadget object +* @param[in] service the handler to the service +* @param[in] priv _priv object +* +* There is no action in this function. +*/ +static void _on_start(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Invoked on pause state of UI Gadget +* +* @param[in] ug UI gadget object +* @param[in] service the handler to the service +* @param[in] priv _priv object +* +* There is no action in this application +*/ +static void _on_pause(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Invoked on resume state of UI Gadget +* +* @param[in] ug UI gadget object +* @param[in] service the handler to the service +* @param[in] priv _priv object +* +* There is no action in this application +*/ +static void _on_resume(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Invoked on destroy state of UI Gadget +* +* @param[in] ug UI gadget object +* @param[in] service the handler to the service +* @param[in] priv _priv object +* +* There is no action in this application +*/ +static void _on_destroy(ui_gadget_h ug, service_h service, void *priv) +{ +} + +/** +* Called When an UI gadget received message from its caller ug_send_message() +* +* @param[in] ug UI gadget object +* @param[in] msg the handler to the service +* @param[in] service the handler to the service +* @param[in] priv _priv object +* +* There is no action in this function +*/ +static void _on_message(ui_gadget_h ug, service_h msg, + service_h service, void *priv) +{ +} + +/** +* when a system event is generated and UI gadget receives event from caller +* using ug_send_event(), the event operation on_event is invoked +* +* @param[in] ug UI gadget +* @param[in] event event information +* @param[in] service the handler to the service +* @param[in] priv _priv object +*/ +static void _on_event(ui_gadget_h ug, enum ug_event event, + service_h service, void *priv) +{ + if (!ug || !priv) { + _ERR("Parameter error!"); + return; + } + + switch (event) { + case UG_EVENT_LOW_MEMORY: + break; + case UG_EVENT_LOW_BATTERY: + break; + case UG_EVENT_LANG_CHANGE: + break; + case UG_EVENT_ROTATE_PORTRAIT: + break; + case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN: + break; + case UG_EVENT_ROTATE_LANDSCAPE: + break; + case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN: + break; + default: + break; + } +} + +/** +* Invoked when the UI Gadget is loading, and it sets operations, private data, +* and the option. +* +* @param[in] ops a data structure describing operations, private data, +* and the option of UI Gadget +* @return 0 on success, otherwise -1 +*/ +UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops) +{ + struct _ug_data *ugd; + + if (!ops) + return -1; + + ugd = calloc(1, sizeof(*ugd)); + if (!ugd) + return -1; + + i18n_init(); + + ops->create = _on_create; + ops->start = _on_start; + ops->pause = _on_pause; + ops->resume = _on_resume; + ops->destroy = _on_destroy; + ops->message = _on_message; + ops->event = _on_event; + ops->priv = ugd; + ops->opt = UG_OPT_INDICATOR_ENABLE; + + return 0; +} + +/** +* Invoked when the UI Gadget is loading, and it clears private data. +* +* Release data used in the module. +* +* @param[in] ops a data structure describing operations, private data, +* and the option of UI Gadget +* @return 0 on success otherwise -1 +*/ +UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops) +{ + struct _ug_data *ugd; + + if (!ops) + return; + + ugd = ops->priv; + free(ugd); +} diff --git a/ug/wifi-direct/src/util.c b/ug/wifi-direct/src/util.c new file mode 100644 index 0000000..42007a8 --- /dev/null +++ b/ug/wifi-direct/src/util.c @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "i18n.h" +#include "defs.h" +#include "dbg.h" +#include "util.h" + +/** +* Universal function to add a new layout. +* +* @param[in] parent the parent object +* @param[in] file the path to file(edj) that will be used as layout +* @param[in] group the group that the layout belongs in edje file +* @return the new object created(NULL if create failed) +*/ +Evas_Object *util_add_layout(Evas_Object *parent, + const char *file, const char *group) +{ + Evas_Object *ly; + + if (!parent || !file || !group) + return NULL; + + ly = elm_layout_add(parent); + if (!ly) { + _ERR("add layout failed"); + return NULL; + } + + elm_layout_file_set(ly, file, group); + evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(ly, EVAS_HINT_FILL, + EVAS_HINT_FILL); + + evas_object_show(ly); + + return ly; +} + +/** +* Universal function to add a new button +* +* @param[in] parent the parent object +* @param[in] style the button style to be used +* @param[in] part the part name +* @param[in] text text of the button +* @return the new object created(NULL if create failed) +*/ +Evas_Object *util_add_button(Evas_Object *parent, const char *style, + const char *part, const char *text) +{ + Evas_Object *btn; + + if (!parent || !style || !text) { + _ERR("the parameter is NULL."); + return NULL; + } + + btn = elm_button_add(parent); + if (!btn) { + _ERR("add button failed"); + return NULL; + } + + elm_object_style_set(btn, style); + elm_object_text_set(btn, text); + + if (part) + elm_object_part_content_set(parent, part, btn); + + evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, + EVAS_HINT_FILL); + + evas_object_show(btn); + + return btn; +} + +/** +* Universal function to add a new box +* +* @param[in] parent the parent object +* @param[in] part the part name +* @return[in] the new object created(NULL if create failed) +*/ +Evas_Object *util_add_box(Evas_Object *parent, const char *part) +{ + Evas_Object *box; + + if (!parent) { + _ERR("the parent is NULL."); + return NULL; + } + + box = elm_box_add(parent); + if (!box) { + _ERR("elm_box_add() failed."); + return NULL; + } + + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, + EVAS_HINT_FILL); + + if (part) + elm_object_part_content_set(parent, part, box); + + evas_object_show(box); + + return box; +} + +/** +* Universal function to add a progress bar. +* +* If the part is NULL,set it on the part of the given container widget. +* +* @param[in] parent parent win/layout on which to add +* @param[in] style the progress bar style +* @param[in] part the part name +* @return the new object created(NULL if create failed) +*/ +Evas_Object *util_add_progressbar(Evas_Object *parent, + const char *style, const char *part) +{ + Evas_Object *pb; + + if (!parent || !style) { + _ERR("the parent is NULL."); + return NULL; + } + + pb = elm_progressbar_add(parent); + if (!pb) { + _ERR("add progressbar failed"); + return NULL; + } + + if (part) + elm_object_part_content_set(parent, part, pb); + + elm_object_style_set(pb, style); + evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + elm_progressbar_pulse(pb, EINA_TRUE); + evas_object_show(pb); + + return pb; +} + +/** +* Called when objects' focus needs to order. +* +* @param[in] obj the objects +* @param[in] count total count of the objects +*/ +void util_set_cycle_focus(Evas_Object **obj, int count) +{ + int i; + if (!*obj || !obj) + return; + + for (i = 0; i < count; i++) { + if (i == count - 1) + elm_object_focus_next_object_set(obj[i], obj[0], + ELM_FOCUS_DOWN); + else + elm_object_focus_next_object_set(obj[i], obj[i + 1], + ELM_FOCUS_DOWN); + + if (i == 0) + elm_object_focus_next_object_set(obj[i], obj[count - 1], + ELM_FOCUS_UP); + else + elm_object_focus_next_object_set(obj[i], obj[i - 1], + ELM_FOCUS_UP); + + elm_object_focus_next_object_set(obj[i], obj[i], + ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(obj[i], obj[i], + ELM_FOCUS_RIGHT); + } +} diff --git a/ug/wifi-direct/src/wifi_direct_mgr.c b/ug/wifi-direct/src/wifi_direct_mgr.c new file mode 100644 index 0000000..78e7d02 --- /dev/null +++ b/ug/wifi-direct/src/wifi_direct_mgr.c @@ -0,0 +1,613 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "wifi_direct_mgr.h" + +#define LOCAL_MAX_CLIENT 8 + +/** +* Convert the error code to the corresponding string. +* +* @param[in] errcode the wifi direct error code bypassed +* @return the error description +*/ +const char *wifi_direct_mgr_err_dbg(int errcode) +{ + switch (errcode) { + case WIFI_DIRECT_ERROR_OUT_OF_MEMORY: + return "WIFI_DIRECT_ERROR_OUT_OF_MEMORY"; + break; + case WIFI_DIRECT_ERROR_NOT_PERMITTED: + return "WIFI_DIRECT_ERROR_NOT_PERMITTED"; + break; + case WIFI_DIRECT_ERROR_INVALID_PARAMETER: + return "WIFI_DIRECT_ERROR_INVALID_PARAMETER"; + break; + case WIFI_DIRECT_ERROR_RESOURCE_BUSY: + return "WIFI_DIRECT_ERROR_RESOURCE_BUSY"; + break; + case WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT: + return "WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT"; + break; + case WIFI_DIRECT_ERROR_NOT_INITIALIZED: + return "WIFI_DIRECT_ERROR_NOT_INITIALIZED"; + break; + case WIFI_DIRECT_ERROR_COMMUNICATION_FAILED: + return "WIFI_DIRECT_ERROR_COMMUNICATION_FAILED"; + break; + case WIFI_DIRECT_ERROR_WIFI_USED: + return "WIFI_DIRECT_ERROR_WIFI_USED"; + break; + case WIFI_DIRECT_ERROR_MOBILE_AP_USED: + return "WIFI_DIRECT_ERROR_MOBILE_AP_USED"; + break; + case WIFI_DIRECT_ERROR_CONNECTION_FAILED: + return "WIFI_DIRECT_ERROR_CONNECTION_FAILED"; + break; + case WIFI_DIRECT_ERROR_AUTH_FAILED: + return "WIFI_DIRECT_ERROR_AUTH_FAILED"; + break; + case WIFI_DIRECT_ERROR_OPERATION_FAILED: + return "WIFI_DIRECT_ERROR_OPERATION_FAILED"; + break; + case WIFI_DIRECT_ERROR_TOO_MANY_CLIENT: + return "WIFI_DIRECT_ERROR_TOO_MANY_CLIENT"; + break; + default: + break; + } + + return "UNKNOWN"; +} + +/** +* Get device name. +* +* @return device name on success,otherwise NULL +*/ +char *wifi_direct_mgr_get_device_name(void) +{ + int ret; + char *name; + + name = NULL; + ret = wifi_direct_get_device_name(&name); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("get device name failed, ret: %s.", + wifi_direct_mgr_err_dbg(ret)); + return NULL; + } + + return name; +} + +/** +* Get local MAC address. +* +* @return MAC address string on success, otherwise NULL +*/ +char *wifi_direct_mgr_get_mac_address(void) +{ + int ret; + char *mac_addr; + + mac_addr = NULL; + ret = wifi_direct_get_mac_address(&mac_addr); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("get mac address failed, ret: %s.", + wifi_direct_mgr_err_dbg(ret)); + return NULL; + } + + return mac_addr; +} + +/** +* Initialize WiFi server. +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_wifi_init(void) +{ + int ret; + + ret = wifi_initialize(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_initialize failed, ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Finalize WiFi server +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_wifi_fini(void) +{ + int ret; + + ret = wifi_deinitialize(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_deinitialize failed, ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Initialize WiFi Direct server +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_wifi_direct_init(void) +{ + int ret; + + ret = wifi_direct_initialize(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_initialize failed, ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Finalize Wi-Fi Direct server. +* +* Uses the midware API to deregister the client application with the Wi-Fi Direct server. +* and releases all resources. Pre Application must be already registered to the Wi-Fi Direct server. +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_wifi_direct_fini(void) +{ + int ret; + + ret = wifi_direct_deinitialize(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_deinitialize failed, ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Register the callback functions called. +* +* Each callback function is synchronous. +* +* @param[in] cbs The fuction struct contains the action callback fuctions +* @param[in] data the user data +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_register_callback(struct wifi_direct_cbs *cbs, + void *data) +{ + int ret; + + if (!cbs || !data) { + _ERR("The parameter is NULL."); + return RET_FAILED; + } + + ret = wifi_direct_set_device_state_changed_cb(cbs->device_state_cb, + data); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("set device state changed cb failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + ret = wifi_direct_set_discovery_state_changed_cb( + cbs->discovery_state_cb, data); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("set discovery state changed cb failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + wifi_direct_unset_device_state_changed_cb(); + return RET_FAILED; + } + + ret = wifi_direct_set_connection_state_changed_cb( + cbs->connection_state_cb, data); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("set connection state changed cb failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + wifi_direct_unset_device_state_changed_cb(); + wifi_direct_unset_discovery_state_changed_cb(); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Unregister the action callback fuctions. +* +* Opposite action to wifi_direct_mgr_register_callback. +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_unregister_callback(void) +{ + int ret; + int result; + + result = RET_SUCCESS; + ret = wifi_direct_unset_device_state_changed_cb(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("unset device state changed cb failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + result = RET_FAILED; + } + + ret = wifi_direct_unset_discovery_state_changed_cb(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("unset discovery state changed cb failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + result = RET_FAILED; + } + + ret = wifi_direct_unset_connection_state_changed_cb(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("unset connection state changed cb failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + result = RET_FAILED; + } + + ret = wifi_direct_unset_client_ip_address_assigned_cb(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("unset device state changed cb failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + result = RET_FAILED; + } + + return result; +} + +/** +* Get the state of Wi-Fi Direct server +* +* @param[in] status The param bypassed used to save the status of the Wi-Fi Direct server +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_get_state(wifi_direct_state_e *status) +{ + int ret; + + if (!status) { + _ERR("The param is NULL."); + return RET_FAILED; + } + + ret = wifi_direct_get_state(status); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("get state failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Activate Wi-Fi Direct server +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_activate(void) +{ + int ret; + + ret = wifi_direct_activate(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_activate failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Deactivate Wi-Fi Direct server +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_deactivate(void) +{ + int ret; + + ret = wifi_direct_deactivate(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_deactivate failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Set the number of the clients. +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_set_configure_num(void) +{ + int ret; + + ret = wifi_direct_set_max_clients(LOCAL_MAX_CLIENT); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("set max client failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Get the information of all discovered peers.Synchronous. +* +* @param[in] cb the callback function +* @param[in] data the user data +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_foreach_discovered_peers( + wifi_direct_discovered_peer_cb cb, void *data) +{ + int ret; + + if (!cb || !data) { + _ERR("The parameter is NULL."); + return RET_FAILED; + } + + ret = wifi_direct_foreach_discovered_peers(cb, data); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("foreach connected pees failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Get the information of the connected peers.Synchronous. +* +* @param[in] cd the callback function +* @param[in] data the user data +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_foreach_connected_peers( + wifi_direct_connected_peer_cb cb, void *data) +{ + int ret; + + if (!cb || !data) { + _ERR("The parameter is NULL."); + return RET_FAILED; + } + + ret = wifi_direct_foreach_connected_peers(cb, data); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("foreach connected peers failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Start discovery process.Asynchronous. +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_start_discovery(void) +{ + int ret; + + ret = wifi_direct_start_discovery(WIFI_DIRECT_DISCOVERY_LISTEN_AND_SCAN, + WIFI_DIRECT_SCAN_TIMEOUT); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("start discovery failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Cancel discovery process +* +* The oppsite action to wifi_direct_mgr_start_discovery +* +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_cancel_discovery(void) +{ + int ret; + + ret = wifi_direct_cancel_discovery(); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_cancel_discovery failed ret:%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Connect the peer specified by MAC address. Asynchronous. +* +* @param[in] mac_adrr the MAC address +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_connect(const char *mac_addr) +{ + int ret; + + if (!mac_addr) { + _ERR("mac_address is NULL"); + return RET_FAILED; + } + + ret = wifi_direct_connect(mac_addr); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_connect failed,%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Disconnect to a peer. +* +* @param[in] mac_adrr the MAC address +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_disconnect(const char *mac_addr) +{ + int ret; + + if (!mac_addr) { + _ERR("mac_address is NULL"); + return RET_FAILED; + } + + ret = wifi_direct_disconnect(mac_addr); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_disconnect failed,%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Accept connection requested by a peer. +* +* Called for request event,WIFI_DIRECT_CONNECTION_REQ +* +* @param[in] mac_adrr the MAC address of the request peer +* @return[in] 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_accept_connection(char *mac_addr) +{ + int ret; + + if (!mac_addr) { + _ERR("mac_address is NULL"); + return RET_FAILED; + } + + ret = wifi_direct_accept_connection(mac_addr); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_accept_connection failed,%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + return RET_SUCCESS; +} + +/** +* Verify the WPS type. +* +* This function get the WPS(Wi-Fi Protected Setup) type and check if it is equal to PBC type, +* if equal, set EINA_TRUE to is_pbc, otherwise set EINA_FALSE,and return it. +* +* @param[in] is_pbc The point pointing to mark if WPS is PBC +* @return[in] 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_get_wps_type(Eina_Bool *is_pbc) +{ + _DBG("Not Yet"); +#if 0 + wifi_direct_wps_type_e type; + + if (!is_pbc) { + _ERR("Parameter is NULL"); + return RET_FAILED; + } + + int ret; + ret = wifi_direct_get_wps_type(&type); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_get_wps_type failed,%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } + + if ((type & WIFI_DIRECT_WPS_TYPE_PBC) == WIFI_DIRECT_WPS_TYPE_PBC) + *is_pbc = EINA_TRUE; + else + *is_pbc = EINA_FALSE; + + return RET_SUCCESS; +#endif + return RET_FAILED; +} + +/** +* Set the WPS(Wi-Fi Protected Setyup) type. +* +* @param[in] type The WPS type +* @return 0 on success, otherwise -1 +*/ +int wifi_direct_mgr_set_wps_type(wifi_direct_wps_type_e *type) +{ + if (!type) { + _ERR("Parameter is NULL"); + return RET_FAILED; + } + + _DBG("Not Yet"); +#if 0 + int ret; + ret = wifi_direct_set_wps_type(*type); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_get_wps_type failed,%s.", + wifi_direct_mgr_err_dbg(ret)); + return RET_FAILED; + } +#endif + + return RET_SUCCESS; +} diff --git a/ug/wifi-direct/src/wifi_direct_view.c b/ug/wifi-direct/src/wifi_direct_view.c new file mode 100644 index 0000000..88f5424 --- /dev/null +++ b/ug/wifi-direct/src/wifi_direct_view.c @@ -0,0 +1,2038 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include "defs.h" +#include "dbg.h" +#include "wifi_direct_view.h" +#include "wifi_direct_mgr.h" +#include "util.h" + +struct _priv { + Evas_Object *win; + Evas_Object *base; + Evas_Object *genlist; + Evas_Object *on_btn; + Evas_Object *direct_popup; + Evas_Object *connect_popup; + Evas_Object *dim_ly; + Evas_Object *btn_refresh; + Evas_Object *btn_close; + Evas_Object *btn_stop; + Evas_Object *scan_ly; + Evas_Object *scan_pb; + Evas_Object *no_conn_ly; + Evas_Object *prog_popup; + Evas_Object *req_popup; + + ui_gadget_h ug; + Elm_Genlist_Item_Class *itc; + Elm_Object_Item *popup_item; + Eina_List *item_list; + Ecore_Timer *timer; + + int conn_idx; + int direct_on_flag; + int finish_flag; + char *req_addr; +}; + +enum action_btn_enum { + ACTION_BTN_REFRESH, + ACTION_BTN_CLOSE, + ACTION_BTN_STOP +}; + +enum direct_swith_enum { + DIRECT_ON = 0, + DIRECT_OFF +}; + +const char *action_button[] = { + [ACTION_BTN_REFRESH] = TXT_REFRESH_BTN, + [ACTION_BTN_CLOSE] = TXT_CLOSE_BTN, + [ACTION_BTN_STOP] = TXT_STOP_BTN +}; + +const char *popup_button_on[] = { + [DIRECT_OFF] = TXT_OFF_BTN, + [DIRECT_ON] = TXT_ON_BTN +}; + +static char *popup_button_conn[] = { + [DIRECT_ON] = TXT_CONNECT, + [DIRECT_OFF] = TXT_DISCONNECT +}; + +static char *popup_button_req[] = { + [DIRECT_ON] = TXT_YES, + [DIRECT_OFF] = TXT_NO +}; + +static char *part_req[] = { + [DIRECT_ON] = PART_YES, + [DIRECT_OFF] = PART_NO +}; + +static void _device_state_changed_cb(int errcode, + wifi_direct_device_state_e state, void *data); +static void _discovery_state_changed_cb(int errcode, + wifi_direct_discovery_state_e state, void *data); +static void _connection_state_changed_cb(int errcode, + wifi_direct_connection_state_e state, const char *addr, + void *data); +static bool _connected_peer_cb( + wifi_direct_connected_peer_info_s * conn_info, void *data); +static bool _discoverd_peers_cb( + wifi_direct_discovered_peer_info_s * discov_info, + void *data); + +static struct wifi_direct_cbs cbs = { + .device_state_cb = _device_state_changed_cb, + .discovery_state_cb = _discovery_state_changed_cb, + .connection_state_cb = _connection_state_changed_cb, + .connected_peer_cb = _connected_peer_cb, + .discovered_peer_cb = _discoverd_peers_cb +}; + +static void _fill_content_part(struct _priv *priv, Evas_Object *obj); +static int _create_wifi_direct_scan(struct _priv *priv); +static void _create_device_list_view(struct _priv *priv); +static void _show_action_btn(struct _priv *priv); + +/** +* Initialize the priv. +* +* @return _priv _priv object initialized +*/ +static struct _priv *_init_priv(void) +{ + struct _priv *priv; + + priv = calloc(1, sizeof(*priv)); + if (!priv) { + _ERR("calloc failed."); + return NULL; + } + + return priv; +} + +/** +* Finalize the priv. +* +* Recycles memory allocated for the priv and free the point. +* +* @param[in] priv _priv object to be finalized +*/ +static void _fini_priv(struct _priv *priv) +{ + struct device_info *info; + + if (!priv) { + _ERR("priv is already NULL."); + return; + } + + if (!priv->item_list) + EINA_LIST_FREE(priv->item_list, info) + free(info); + + if (priv->dim_ly) + evas_object_del(priv->dim_ly); + + if (priv->scan_ly) + evas_object_del(priv->scan_ly); + + if (priv->timer) + ecore_timer_del(priv->timer); + + wifi_direct_mgr_wifi_fini(); + wifi_direct_mgr_unregister_callback(); + wifi_direct_mgr_wifi_direct_fini(); + + if (priv->base) + evas_object_del(priv->base); + + free(priv); +} + +/** +* It is a callback function responding mouse event +* +* This function set focus on the object when mouse is put on it +* +* @param[in] dt the user data +* @param[in] e evas handler +* @param[in] obj the corresponding object which the mouse event occurred +* @param[in] ei event information +*/ +static void _list_btn_mouse_in_cb(void *dt, Evas *e, + Evas_Object *obj, void *ei) +{ + if (!obj) { + _ERR("Invalid argument obj"); + return; + } + + elm_object_focus_set(obj, EINA_TRUE); +} + +/** +* Evas_Smart_Cb type callback for handling click event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event event information +*/ +static void _refresh_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + struct _priv *priv; + struct device_info *info; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + if (priv->scan_ly) + evas_object_hide(priv->scan_ly); + + elm_genlist_clear(priv->genlist); + + if (priv->item_list) + EINA_LIST_FREE(priv->item_list, info) + free(info); + + _create_device_list_view(priv); +} + +/** +* Evas_Smart_Cb type callback for handling click event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event event information +*/ +static void _close_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + if (!priv->ug) { + _ERR("priv->ug is NULL."); + return; + } + + ug_destroy_me(priv->ug); + + _fini_priv(priv); +} + +/** +* Create the action buttons. +* +* @param[in] priv _priv object bypassed +*/ +static void _show_action_btn(struct _priv *priv) +{ + Evas_Object *btn; + + if (!priv || !priv->base) { + _ERR("Parameter error!"); + return; + } + + if (!priv->btn_refresh || !priv->btn_close) { + _ERR("action btn NULL!"); + return; + } + + btn = elm_object_part_content_get(priv->base, PART_REFRESH_BTN); + if (btn) { + elm_object_part_content_unset(priv->base, PART_REFRESH_BTN); + evas_object_hide(btn); + } + + elm_object_part_content_set(priv->base, PART_REFRESH_BTN, + priv->btn_refresh); + evas_object_show(priv->btn_refresh); + + elm_object_part_content_set(priv->base, PART_CLOSE_BTN, + priv->btn_close); + evas_object_show(priv->btn_close); + + evas_object_smart_callback_add(priv->btn_refresh, SIG_CLICKED, + _refresh_btn_clicked_cb, priv); + evas_object_event_callback_add(priv->btn_refresh, + EVAS_CALLBACK_MOUSE_IN, _list_btn_mouse_in_cb, priv); + evas_object_smart_callback_add(priv->btn_close, SIG_CLICKED, + _close_btn_clicked_cb, priv); + evas_object_event_callback_add(priv->btn_close, + EVAS_CALLBACK_MOUSE_IN, _list_btn_mouse_in_cb, priv); +} + +/** +* Create the dim layout but did not show it. +* +* @param[in] priv _priv object bypassed +* @return on success, otherwise -1. +*/ +static int _create_wifi_direct_dim(struct _priv *priv) +{ + Evas_Object *base; + Evas_Object *ly; + + if (!priv || !priv->base) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + base = priv->base; + + ly = util_add_layout(base, UG_WIFI_DIRECT_EDJ_FILE, GRP_DIM_LY); + if (!ly) { + _ERR("Add dim layout failed."); + return RET_FAILED; + } + + priv->dim_ly = ly; + + evas_object_hide(ly); + + return RET_SUCCESS; +} + +/** +* Evas_Smart_Cb type callback for handling click event +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] ev event information +*/ +static void _stop_btn_clicked_cb(void *data, + Evas_Object *obj, void *ev) +{ + int ret; + struct _priv *priv; + Evas_Object *btn; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + ret = wifi_direct_mgr_cancel_discovery(); + if (ret != RET_SUCCESS) { + _ERR("Cancel disconery failed."); + return; + } + + btn = elm_object_part_content_get(priv->base, PART_REFRESH_BTN); + if (btn) { + elm_object_part_content_unset(priv->base, PART_REFRESH_BTN); + evas_object_hide(btn); + } + + _show_action_btn(priv); + + _fill_content_part(priv, priv->genlist); +} + +/** +* Create the scan process view +* +* @param[in] priv _priv object bypassed +*/ +static int _create_wifi_direct_scan(struct _priv *priv) +{ + Evas_Object *ly; + Evas_Object *pb; + Evas_Object *btn; + + if (!priv || !priv->base) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ly = util_add_layout(priv->base, UG_WIFI_DIRECT_EDJ_FILE, + GRP_WIFIDIRECT_SCAN_LY); + if (!ly) { + _ERR("Add scan_ly failed.\n"); + return RET_FAILED; + } + + priv->scan_ly = ly; + + elm_object_part_content_unset(priv->base, PART_REFRESH_BTN); + evas_object_hide(priv->btn_refresh); + + elm_object_part_content_unset(priv->base, PART_CLOSE_BTN); + evas_object_hide(priv->btn_close); + + pb = util_add_progressbar(ly, STYLE_SEARCH_PROGRESS, PART_SEARCH_IMAGE); + if (!pb) { + _ERR("Add progressbar failed.\n"); + goto error; + } + + btn = util_add_button(priv->base, STYLE_ACTION_BUTTON, PART_REFRESH_BTN, + _(action_button[ACTION_BTN_STOP])); + if (!btn) { + _ERR("Add stop button failed."); + goto error; + } + + priv->scan_pb = pb; + priv->btn_stop = btn; + + elm_object_focus_set(priv->btn_stop, EINA_TRUE); + evas_object_event_callback_add(priv->btn_stop, EVAS_CALLBACK_MOUSE_IN, + _list_btn_mouse_in_cb, priv); + evas_object_smart_callback_add(priv->btn_stop, SIG_CLICKED, + _stop_btn_clicked_cb, priv); + + _fill_content_part(priv, priv->scan_ly); + + return RET_SUCCESS; + +error: + evas_object_del(ly); + return RET_FAILED; +} + +/** +* Display device list view. +* +* Called when start or refresh the WiFi direct +* +* @param[in] priv the _priv object +*/ +static void _create_device_list_view(struct _priv *priv) +{ + wifi_direct_state_e status; + int ret; + + if (!priv) { + _ERR("parameter is invalid."); + return; + } + + if (priv->no_conn_ly) + evas_object_hide(priv->no_conn_ly); + + ret = wifi_direct_mgr_get_state(&status); + if (ret != RET_SUCCESS) { + _ERR("get state failed."); + return; + } + + if (status < WIFI_DIRECT_STATE_ACTIVATED) { + ret = wifi_direct_mgr_activate(); + if (ret != RET_SUCCESS) { + _ERR("activate failed."); + return; + } + } else { + ret = wifi_direct_mgr_set_configure_num(); + if (ret != RET_SUCCESS) { + _ERR("set configure num failed."); + return; + } + + ret = wifi_direct_mgr_start_discovery(); + if (ret != RET_SUCCESS) { + _ERR("start discovery failed."); + return; + } + } + + _fill_content_part(priv, priv->genlist); + + elm_object_focus_set(priv->btn_refresh, EINA_TRUE); +} + +/** +* Evas_object_Event_Cb type callback for handling delection event +* +* @param[in] data the user data +* @param[in] e evas handler +* @param[in] obj the corresponding object which clicked event occurred +* @param[in] ei event information +*/ +static void _popup_back_pressed_cb(void *data, Evas *e, + Evas_Object *obj, void *ei) +{ + Evas_Event_Key_Down *ev; + struct _priv *priv; + + if (!data || !obj || !ei) { + _ERR("Parameter error!"); + return; + } + + priv = data; + ev = ei; + + if (!ev->keyname) { + _ERR("ev->keyname is NULL."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK)) { + if (priv->dim_ly) + evas_object_hide(priv->dim_ly); + + evas_object_del(obj); + } +} + +/** +* Handle connection request. +* +* @param[in] info the target device infomation +* @param[in] is_conn request type +* @return 0 on success,otherwize -1 +*/ +int wifi_direct_cbbutton_connect( + struct device_info *info, int is_conn) +{ + int ret; + wifi_direct_wps_type_e wps_type; + + if (!info) { + _ERR("parameter is NULL!"); + return RET_FAILED; + } + + if (is_conn) { + if ((info->wps_types & WIFI_DIRECT_WPS_TYPE_PBC) + == WIFI_DIRECT_WPS_TYPE_PBC) + wps_type = WIFI_DIRECT_WPS_TYPE_PBC; + else if ((info->wps_types & WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) == + WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD) + wps_type = WIFI_DIRECT_WPS_TYPE_PIN_KEYPAD; + else if ((info->wps_types & WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) == + WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY) + wps_type = WIFI_DIRECT_WPS_TYPE_PIN_DISPLAY; + + ret = wifi_direct_mgr_set_wps_type(&wps_type); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct set wps type failev!"); + return RET_FAILED; + } + + ret = wifi_direct_mgr_connect(info->mac_addr); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_connect:%s fail!", info->dev_name); + return RET_FAILED; + } + } else { + ret = wifi_direct_mgr_disconnect(info->mac_addr); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_disconnect:%s fail!", info->dev_name); + return RET_FAILED; + } + } + + return RET_SUCCESS; +} + +/** +* @Evas_Smart_Cb type callback for handling click event. +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event_info event information +*/ +static void _item_conn_btn_clicked_cb(void *data, + Evas_Object *obj, void *event_inf) +{ + struct _priv *priv; + const char *value; + int ret; + Elm_Object_Item *gen_item; + struct device_info *info; + int cur_idx; + + if (!data || !obj) { + _ERR("the param is invalid."); + return; + } + + value = elm_object_text_get(obj); + if (!value) { + _ERR("get text from wifi_direct device btn is NULL."); + return; + } + + priv = data; + + gen_item = priv->popup_item; + + cur_idx = elm_genlist_item_index_get(gen_item); + if (cur_idx < 0) + return; + + info = eina_list_nth(priv->item_list, cur_idx); + if (!info) + return; + + if (!strcmp(value, TXT_CONNECT)) { + ret = wifi_direct_cbbutton_connect(info, CONN_YES); + if (ret == RET_FAILED) { + _ERR("Connect failed"); + return; + } + + info->is_conn = EINA_TRUE; + } else if (!strcmp(value, TXT_DISCONNECT)) { + ret = wifi_direct_cbbutton_connect(info, CONN_NO); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("wifi_direct_mgr_disconnect failed,,%s", + info->mac_addr); + return; + } + + strncpy(info->state, TXT_DISCONNECT, WIFI_DIRECT_STATE_BUF_LEN); + info->is_conn = EINA_FALSE; + } + + if (priv->direct_popup) { + evas_object_del(priv->direct_popup); + priv->direct_popup = NULL; + } + + if (priv->connect_popup) { + evas_object_del(priv->connect_popup); + priv->connect_popup = NULL; + } + + if (priv->dim_ly) + evas_object_hide(priv->dim_ly); +} + +/** +* @Evas_Smart_Cb type callback for handling click event. +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event_info event information +*/ +static void _genlist_item_select_cb(void *data, + Evas_Object *obj, void *event_info) +{ + struct _priv *priv; + Elm_Object_Item *gen_item; + Evas_Object *layout; + Evas_Object *box; + Evas_Object *item_btn; + Evas_Object *btn[BTN_DIRECT]; + struct device_info *info; + int cur_idx; + int i; + int ret; + int btn_x; + int btn_y; + int btn_w; + int btn_h; + int move_x; + int move_y; + + if (!data || !obj || !event_info) { + _ERR("The param is invalid."); + return; + } + + priv = data; + + if (!priv->dim_ly) { + ret = _create_wifi_direct_dim(priv); + if (ret != RET_SUCCESS) { + _fini_priv(priv); + return; + } + } + + evas_object_show(priv->dim_ly); + + gen_item = event_info; + priv->popup_item = gen_item; + + layout = util_add_layout(priv->base, UG_WIFI_DIRECT_EDJ_FILE, + GRP_WIFI_DIRECT_SELECT); + if (!layout) { + _ERR("add connect popup failed.\n"); + return; + } + + box = util_add_box(layout, PART_SWALLOW_CONTENT); + if (!box) { + _ERR("add box failed."); + evas_object_del(layout); + return; + } + + for (i = 0; i < BTN_DIRECT; i++) { + btn[i] = util_add_button(box, STYLE_POPUP_BUTTON, NULL, + _(popup_button_conn[i])); + if (!btn[i]) { + _ERR("add connect btn failed."); + evas_object_del(layout); + return; + } + + elm_box_pack_end(box, btn[i]); + evas_object_smart_callback_add(btn[i], SIG_CLICKED, + _item_conn_btn_clicked_cb, priv); + evas_object_event_callback_add(btn[i], + EVAS_CALLBACK_MOUSE_IN, + _list_btn_mouse_in_cb, priv); + } + + cur_idx = elm_genlist_item_index_get(gen_item); + if (cur_idx < 0) + return; + + info = eina_list_nth(priv->item_list, cur_idx); + if (!info) + return; + + if (info->is_conn) + elm_object_signal_emit(btn[DIRECT_ON], + SIG_BTN_SELECTED, PROG); + else + elm_object_signal_emit(btn[DIRECT_OFF], + SIG_BTN_SELECTED, PROG); + + util_set_cycle_focus(btn, BTN_DIRECT); + + item_btn = elm_object_item_track(gen_item); + if (!item_btn) { + _ERR("get genlist item track failed."); + evas_object_del(layout); + return; + } + + evas_object_geometry_get(item_btn, &btn_x, &btn_y, &btn_w, &btn_h); + + move_x = btn_x + btn_w - POPUP_WIDTH * HALF_SCALE - POPUP_RIGHT; + move_y = btn_y + btn_h; + evas_object_move(layout, move_x * ELM_SCALE, move_y * ELM_SCALE); + priv->connect_popup = layout; + + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _popup_back_pressed_cb, priv); + + elm_object_focus_set(btn[0], EINA_TRUE); +} + +/** +* Check if the peer discovered is already in the list. +* +* @param[in] priv the _priv object bypassed +* @param[in] new_info device_info object to be checked +* @return 0 if exist,otherwise -1 +*/ +static Eina_Bool _is_peer_exist(struct _priv *priv, + struct device_info *new_info) +{ + struct device_info *cur_info; + Eina_List *l; + + if (!priv || !new_info) { + _ERR("The param is invalid."); + return EINA_FALSE; + } + + if (!priv->item_list) { + _ERR("The list is NULL now."); + return EINA_FALSE; + } + + EINA_LIST_FOREACH(priv->item_list, l, cur_info) { + if (!strncmp(cur_info->mac_addr, new_info->mac_addr, + WIFI_DIRECT_DEFAULT_BUF_LEN - 1)) + return EINA_TRUE; + } + + return EINA_FALSE; +} + +/** +* Update the device connection state. +* +* @param[in] priv the _priv object bypassed +* @param[in] conn connection type +* @return 0 if exist,otherwise -1 +*/ +static Eina_Bool _update_device_conn_state(struct _priv *priv, + Eina_Bool conn) +{ + struct device_info *cur_info; + Eina_List *l; + + EINA_LIST_FOREACH(priv->item_list, l, cur_info) { + if (!strncmp(cur_info->mac_addr, priv->req_addr, + WIFI_DIRECT_DEFAULT_BUF_LEN - 1)) { + cur_info->is_conn = conn; + return EINA_TRUE; + } + } + + return EINA_FALSE; +} + +/** +* Update the device list. +* +* @param[in] priv the _priv object bypassed +* @param[in] device_info new device infomation +* @return 0 in success,otherwise -1 +*/ +static int _update_genlist_item(struct _priv *priv, + struct device_info *info) +{ + Eina_Bool exist; + + if (!priv || !info || !priv->genlist) { + _ERR("The param is invalid."); + return RET_FAILED; + } + + exist = _is_peer_exist(priv, info); + if (!exist) { + priv->item_list = eina_list_append(priv->item_list, info); + + if (info->is_conn) + strncpy(info->state, TXT_CONNECT, + WIFI_DIRECT_STATE_BUF_LEN); + else + strncpy(info->state, TXT_DISCONNECT, + WIFI_DIRECT_STATE_BUF_LEN); + + elm_genlist_item_append(priv->genlist, priv->itc, info, NULL, + ELM_GENLIST_ITEM_NONE, _genlist_item_select_cb, + (void *)priv); + } + + return RET_SUCCESS; +} + +/** +* Called when the device state is WIFI_DIRECT_DISCOVERY_STARTED. +* +* @param[in] cd the callback functions to invoke +* @param[in] data the user data +*/ +static void _process_discovery_start(struct wifi_direct_cbs cbs, + void *data) +{ + int ret; + struct _priv *priv; + struct device_info *info; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + if (priv->genlist) + elm_genlist_clear(priv->genlist); + + if (priv->item_list) + EINA_LIST_FREE(priv->item_list, info) + free(info); + + ret = wifi_direct_mgr_foreach_connected_peers( + cbs.connected_peer_cb, data); + if (ret != RET_SUCCESS) { + _ERR("foreach connected peers failed "); + return; + } + + ret = _create_wifi_direct_scan(priv); + if (ret != RET_SUCCESS) + _ERR("_create_wifi_direct_scan failed "); +} + +/** +* Called when the device state is WIFI_DIRECT_DISCOVERY_FOUND. +* +* @param[in] cbs the callback functions +* @param[in] data the user data +*/ +static void _process_discovery_found(struct wifi_direct_cbs cbs, + void *data) +{ + int ret; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + ret = wifi_direct_mgr_foreach_discovered_peers( + cbs.discovered_peer_cb, data); + if (ret != RET_SUCCESS) + _ERR("foreach connected peers failed "); +} + +/** +* Called when the device state is WIFI_DIRECT_DISCOVERY_FINISHED. +* +* @param[in] data the user data +*/ +static void _process_discovery_finished(void *data) +{ + struct _priv *priv; + + if (!data) { + _ERR("Parameter is NULL."); + return; + } + + priv = data; + + elm_object_part_content_unset(priv->base, PART_REFRESH_BTN); + evas_object_hide(priv->btn_stop); + + _show_action_btn(priv); + + _fill_content_part(priv, priv->genlist); +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] ev event information +*/ +static void _req_btn_clicked_cb(void *data, Evas_Object *obj, void *ev) +{ + struct _priv *priv; + const char *value; + int ret; + + if (!data || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + priv = data; + + value = elm_object_text_get(obj); + if (!value) { + _ERR("get text from network type btn is NULL."); + return; + } + + if (!strcmp(value, popup_button_req[DIRECT_ON])) { + ret = wifi_direct_mgr_accept_connection(priv->req_addr); + if (ret != RET_SUCCESS) { + _ERR("Disconnection failed."); + return; + } + + ret = _update_device_conn_state(priv, EINA_TRUE); + if (ret != EINA_TRUE) + _ERR("_update_device_conn_state failed."); + } else { + ret = wifi_direct_mgr_reject_connection(priv->req_addr); + if (ret != RET_SUCCESS) { + _ERR("Accept connection failed."); + return; + } + + ret = _update_device_conn_state(priv, EINA_FALSE); + if (ret != EINA_TRUE) + _ERR("_update_device_conn_state failed."); + } + + free(priv->req_addr); + priv->req_addr = NULL; + + if (priv->req_popup) { + evas_object_del(priv->req_popup); + priv->req_popup = NULL; + } + + if (priv->dim_ly) + evas_object_hide(priv->dim_ly); +} + +/** +* Create the reqest popup when has connection request by other devices. +* +* @param[in] priv the _priv object bypassed +* @return 0 on sucess, otherwise -1 +*/ +static int _create_req_popup_ly(struct _priv *priv) +{ + Evas_Object *layout; + Evas_Object *btn[BTN_DIRECT]; + int i; + int x; + int y; + int w; + int h; + + if (!priv || !priv->base) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + layout = util_add_layout(priv->base, UG_WIFI_DIRECT_EDJ_FILE, + GRP_CONNECT_ACCEPT); + if (!layout) { + _ERR("elm_layout_add() failed.\n"); + return RET_FAILED; + } + + for (i = 0; i < BTN_DIRECT; i++) { + btn[i] = util_add_button(layout, STYLE_POPUP_BUTTON, + part_req[i], _(popup_button_req[i])); + if (!btn[i]) { + _ERR("add btn req failed."); + evas_object_del(layout); + return RET_FAILED; + } + + evas_object_smart_callback_add(btn[i], + SIG_CLICKED, _req_btn_clicked_cb, priv); + evas_object_event_callback_add(btn[i], + EVAS_CALLBACK_MOUSE_IN, + _list_btn_mouse_in_cb, priv); + } + + evas_object_geometry_get(priv->genlist, &x, &y, &w, &h); + evas_object_move(layout, (x + RSP_X) * ELM_SCALE, + (y + RSP_Y) * ELM_SCALE); + + priv->req_popup = layout; + + elm_object_focus_set(btn[DIRECT_ON], EINA_TRUE); + + evas_object_event_callback_add(layout, + EVAS_CALLBACK_KEY_DOWN, _popup_back_pressed_cb, priv); + + return RET_SUCCESS; +} + +/** +* Process the connection request when the device state is WIFI_DIRECT_CONNECTION_REQ. +* +* @param[in] addr the MAC address +* @param[in] data the user data +*/ +static void _process_connection_req(const char *addr, void *data) +{ + struct _priv *priv; + Eina_Bool is_pbc; + int ret; + + if (!data || !addr) { + _ERR("the param is invalid."); + return; + } + + priv = data; + + ret = wifi_direct_mgr_get_wps_type(&is_pbc); + if (ret != WIFI_DIRECT_ERROR_NONE) { + _ERR("Get wps type failed."); + return; + } + + priv->req_addr = strdup(addr); + if (!priv->req_addr) { + _ERR("strdup wrong."); + return; + } + + if (is_pbc == EINA_TRUE) { + ret = _create_req_popup_ly(priv); + if (ret != RET_SUCCESS) + _ERR("Create rep popup failed."); + } +} + +/** +* Called when the device state is WIFI_DIRECT_CONNECTION_PROG. +* +* @param[in] data The data to be passed to the function +*/ +static void _process_connection_prog(void *data) +{ + struct _priv *priv; + Evas_Object *layout; + char title[MAX_STRING_LENTH]; + int x; + int y; + int w; + int h; + int move_x; + int move_y; + + if (!data) { + _ERR("the param is invalid."); + return; + } + + priv = data; + + if (priv->dim_ly) + evas_object_show(priv->dim_ly); + + layout = util_add_layout(priv->base, UG_WIFI_DIRECT_EDJ_FILE, + GRP_CONNECT_ACCEPT); + if (!layout) { + _ERR("add con_popup layout failed."); + return; + } + + memset(&title, 0x00, MAX_STRING_LENTH); + snprintf(title, MAX_STRING_LENTH - 1, "%s", TXT_CONN_PROG); + elm_object_part_text_set(layout, PART_TITLE, title); + + evas_object_geometry_get(priv->on_btn, &x, &y, &w, &h); + move_x = x + w - POPUP_WIDTH * HALF_SCALE - POPUP_RIGHT; + move_y = y + CENTER_HEIGHT; + evas_object_move(layout, move_x * ELM_SCALE, move_y * ELM_SCALE); + + priv->prog_popup = layout; +} + +/** +* Starts the device discovery when timer is empired. +* +* @param[in] data the user data +* @return ECORE_CALLBACK_CANCEL returns to finish time +*/ +static Eina_Bool _connection_ind_cb(void *data) +{ + int ret; + struct _priv *priv; + + if (!data) { + _ERR("the param is invalid."); + return ECORE_CALLBACK_CANCEL; + } + + priv = data; + + ret = wifi_direct_mgr_start_discovery(); + if (ret != RET_SUCCESS) + _ERR("start discovery failed."); + + priv->timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +/** +* Called when the device state is WIFI_DIRECT_DISCONNECTION_IND. +* +* @param[in] data The data to be passed to the function +*/ +static void _process_connection_ind(void *data) +{ + struct _priv *priv; + Ecore_Timer *timer; + + if (!data) { + _ERR("parameter is invalid."); + return; + } + + priv = data; + + timer = ecore_timer_add(HANDLER_INTERVAL, _connection_ind_cb, priv); + if (!timer) { + _ERR("add timer failed."); + return; + } + + priv->timer = timer; +} + +/** +* Called when the device state is WIFI_DIRECT_CONNECTION_RSP +* +* @param[in] data the user data +*/ +static void _process_connection_rsp(void *data) +{ + struct _priv *priv; + struct device_info *info; + int cur_index; + + if (!data) { + _ERR("the param is invalid."); + return; + } + + priv = data; + + cur_index = priv->conn_idx; + info = eina_list_nth(priv->item_list, cur_index); + if (!info) + return; + + info->is_conn = EINA_TRUE; + strncpy(info->state, TXT_CONNECT, WIFI_DIRECT_STATE_BUF_LEN); + + elm_genlist_item_update(priv->popup_item); + + if (priv->dim_ly) + evas_object_hide(priv->dim_ly); + + if (priv->prog_popup) { + evas_object_del(priv->prog_popup); + priv->prog_popup = NULL; + } + + if (priv->connect_popup) { + evas_object_del(priv->connect_popup); + priv->connect_popup = NULL; + } +} + +/** +* Callback function is called when device state is changed. +* +* @param[in] errcode error code +* @param[in] state WiFi Direct device state +* @param[in] data the user data +*/ +static void _device_state_changed_cb(int errcode, + wifi_direct_device_state_e state, void *data) +{ + int ret; + struct _priv *priv; + + if (!data) { + _ERR("The param is invalid."); + return; + } + + priv = data; + + if (state != WIFI_DIRECT_DEVICE_STATE_ACTIVATED) { + elm_genlist_clear(priv->genlist); + return; + } + + ret = wifi_direct_mgr_set_configure_num(); + if (ret != RET_SUCCESS) { + _ERR("set configure num failed."); + return; + } + + ret = wifi_direct_mgr_start_discovery(); + if (ret != RET_SUCCESS) + _ERR("start discovery failed."); +} + +/** +* Callback function is called when discovery state is changed. +* +* discovery state: +* WIFI_DIRECT_DISCOVERY_STARTED +* WIFI_DIRECT_DISCOVERY_FOUND +* WIFI_DIRECT_DISCOVERY_FINISHED +* +* @param[in] errcode error code +* @param[in] state WiFi Direct descovery state +* @param[in] data the user data +*/ +static void _discovery_state_changed_cb( + int errcode, wifi_direct_discovery_state_e state, void *data) +{ + if (!state || !data) { + _ERR("data is invalid."); + return; + } + + switch (state) { + case WIFI_DIRECT_DISCOVERY_STARTED: + _process_discovery_start(cbs, data); + break; + case WIFI_DIRECT_DISCOVERY_FOUND: + _process_discovery_found(cbs, data); + break; + case WIFI_DIRECT_DISCOVERY_FINISHED: + _process_discovery_finished(data); + break; + default: + break; + } +} + +/** +* Callback function is called when connection state is changed. +* +* connection state: +* WIFI_DIRECT_CONNECTION_REQ +* WIFI_DIRECT_CONNECTION_IN_PROGRESS +* WIFI_DIRECT_CONNECTION_RSP +* WIFI_DIRECT_DISCONNECTION_IND +* ... +* +* @param[in] errcode error code +* @param[in] state WiFi Direct descovery state +* @param[in] data the user data passed +*/ +static void _connection_state_changed_cb(int errcode, + wifi_direct_connection_state_e state, + const char *addr, void *data) +{ + if (!state || !addr || !data) { + _ERR("The param is invalid."); + return; + } + + switch (state) { + case WIFI_DIRECT_CONNECTION_REQ: + _process_connection_req(addr, data); + break; + case WIFI_DIRECT_CONNECTION_IN_PROGRESS: + _process_connection_prog(data); + break; + case WIFI_DIRECT_CONNECTION_RSP: + _process_connection_rsp(data); + break; + case WIFI_DIRECT_DISCONNECTION_IND: + _process_connection_ind(data); + break; + default: + break; + } +} + +/** +* Called for each connected peer and save its information. +* +* @param[in] conn_info wifi_direct_connected_peer_info_s store info of connected peer +* @param[in] data the user data +* @return EINA_TURE on success, otherwise EINA_FALSE +*/ +static bool _connected_peer_cb( + wifi_direct_connected_peer_info_s * conn_info, void *data) +{ + struct _priv *priv; + struct device_info *info; + int ret; + + if (!conn_info || !data) { + _ERR("The param is NULL."); + return EINA_FALSE; + } + + priv = data; + + info = calloc(1, sizeof(*info)); + if (!info) { + _ERR("calloc failed."); + return EINA_FALSE; + } + + strncpy(info->dev_name, conn_info->device_name, + WIFI_DIRECT_DEFAULT_BUF_LEN); + strncpy(info->mac_addr, conn_info->mac_address, + WIFI_DIRECT_DEFAULT_BUF_LEN); + info->is_conn = EINA_TRUE; + + ret = _update_genlist_item(priv, info); + if (ret != RET_SUCCESS) { + _ERR("update genlist view failed."); + free(info); + return EINA_FALSE; + } + + return EINA_TRUE; +} + +/** +* Called for each discovered peer and save its information. +* +* @param[in] discov_info wifi_direct_discovered_peer_info_s store info of discovered peer +* @param[in] data the user data passed to the callback function +* @return EINA_TURE on success, otherwise EINA_FALSE +*/ +static bool _discoverd_peers_cb( + wifi_direct_discovered_peer_info_s * discov_info, + void *data) +{ + struct _priv *priv; + struct device_info *info; + int ret; + + if (!discov_info || !data) { + _ERR("The param is invalid."); + return EINA_FALSE; + } + + priv = data; + info = calloc(1, sizeof(*info)); + if (!info) { + _ERR("calloc failed."); + return EINA_FALSE; + } + + strncpy(info->dev_name, discov_info->device_name, + WIFI_DIRECT_DEFAULT_BUF_LEN); + strncpy(info->mac_addr, discov_info->mac_address, + WIFI_DIRECT_DEFAULT_BUF_LEN); + info->is_conn = discov_info->is_connected; + info->wps_types = discov_info->supported_wps_types; + + ret = _update_genlist_item(priv, info); + if (ret != RET_SUCCESS) { + _ERR("update genlist view failed."); + free(info); + return EINA_FALSE; + } + + return EINA_TRUE; +} + +/** +* Refresh the ON/OFF sign on the Wi-Fi Direct button when popup button is clicked. +* +* @param[in] priv _priv object bypassed +*/ +static void _refresh_wifi_direct_on_text(struct _priv *priv) +{ + if (!priv) { + _ERR("the param is invalid."); + return; + } + + if (priv->scan_ly) + evas_object_hide(priv->scan_ly); + + if (priv->direct_on_flag == DIRECT_ON) + elm_object_part_text_set(priv->on_btn, PART_WIFI_DIRECT_SELECT, + _(popup_button_on[DIRECT_ON])); + else + elm_object_part_text_set(priv->on_btn, PART_WIFI_DIRECT_SELECT, + _(popup_button_on[DIRECT_OFF])); +} + +/** +* Set the object to the specified part. +* +* @param[in] priv _priv object bypassed +* @param[in] obj Evas_Object to be set to the part +*/ +static void _fill_content_part(struct _priv *priv, Evas_Object *obj) +{ + Evas_Object *old_obj; + + if (!priv || !obj) { + _ERR("The param is invalid.\n"); + return; + } + + old_obj = elm_object_part_content_get(priv->base, PART_GENLIST_ITEMS); + if (old_obj) { + elm_object_part_content_unset(priv->base, PART_GENLIST_ITEMS); + evas_object_hide(old_obj); + } + + elm_object_part_content_set(priv->base, PART_GENLIST_ITEMS, obj); + evas_object_show(obj); +} + +/** +* Create the Wi-Fi Direct off layout, but does not show here. +* +* @param[in] priv _priv object bypassed +* @return 0 on success,otherwise -1 +*/ +static int _create_wifi_direct_disconnect_part(struct _priv *priv) +{ + Evas_Object *ly; + + if (!priv || !priv->base) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + ly = util_add_layout(priv->base, + UG_WIFI_DIRECT_EDJ_FILE, GRP_WIFIDIRECT_DISCONNECT_LY); + if (!ly) { + _ERR("Add noconnect_ly failed.\n"); + return RET_FAILED; + } + + elm_object_part_text_set(ly, PART_DISCONNECT_TEXT, + TXT_WIFIDIRECT_NONE); + + priv->no_conn_ly = ly; + evas_object_hide(ly); + + return RET_SUCCESS; +} + +/** +* Called when WiFi Direct is off . +* +* @param[in] priv _priv object bypassed +* @return 0 on success, otherwise -1 +*/ +static int _display_wifi_direct_disconnect(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("the param is invalid."); + return RET_FAILED; + } + + if (!priv->no_conn_ly) { + ret = _create_wifi_direct_disconnect_part(priv); + if (ret != RET_SUCCESS) { + _ERR("_create_wifi_direct_disconnect_part failed."); + return RET_FAILED; + } + } + + _fill_content_part(priv, priv->no_conn_ly); + + elm_object_part_content_unset(priv->base, PART_REFRESH_BTN); + evas_object_hide(priv->btn_refresh); + elm_object_part_content_set(priv->base, PART_REFRESH_BTN, + priv->btn_close); + evas_object_show(priv->btn_close); + + evas_object_smart_callback_add(priv->btn_close, + SIG_CLICKED, _close_btn_clicked_cb, priv); + evas_object_event_callback_add(priv->btn_close, + EVAS_CALLBACK_MOUSE_IN, _list_btn_mouse_in_cb, priv); + + return RET_SUCCESS; +} + +/** +* Evas_Smart_Cb type callback for handling on/off button click event. +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event_inf event information +*/ +static void _wifi_direct_select_btn_cb(void *data, + Evas_Object *obj, void *event_inf) +{ + struct _priv *priv; + struct device_info *info; + const char *value; + int ret; + + if (!data || !obj) { + _ERR("the param is invalid."); + return; + } + + priv = data; + + value = elm_object_text_get(obj); + if (!value) { + _ERR("get text from network type btn is NULL."); + return; + } + + if (!strcmp(value, popup_button_on[DIRECT_ON])) { + if (priv->direct_on_flag == DIRECT_OFF) { + priv->direct_on_flag = DIRECT_ON; + + elm_genlist_clear(priv->genlist); + + if (priv->item_list) + EINA_LIST_FREE(priv->item_list, info) + free(info); + + _create_device_list_view(priv); + + _show_action_btn(priv); + } + } else { + priv->direct_on_flag = DIRECT_OFF; + + ret = _display_wifi_direct_disconnect(priv); + if (ret != RET_SUCCESS) { + _ERR("_display_wifi_direct_disconnect failed."); + return; + } + + ret = wifi_direct_mgr_deactivate(); + if (ret != RET_SUCCESS) { + _ERR("wif direct deactivate failed."); + return; + } + } + + _refresh_wifi_direct_on_text(priv); + + if (priv->direct_popup) { + evas_object_del(priv->direct_popup); + priv->direct_popup = NULL; + } + + if (priv->dim_ly) + evas_object_hide(priv->dim_ly); +} + +/** +* Evas_Smart_Cb type callback for handling click event. +* +* @param[in] data the user data +* @param[in] obj the corresponding object which the click event occurred +* @param[in] event_inf event information +*/ +static void _wifi_direct_btn_clicked_cb(void *data, + Evas_Object *obj, void *event_inf) +{ + Evas_Object *layout; + Evas_Object *box; + Evas_Object *btn[BTN_DIRECT]; + struct _priv *priv; + int ret; + int i; + int btn_x; + int btn_y; + int btn_w; + int btn_h; + int move_x; + int move_y; + + if (!data) { + _ERR("Parameter error!"); + return; + } + + priv = data; + + if (!priv->dim_ly) { + ret = _create_wifi_direct_dim(priv); + if (ret != RET_SUCCESS) { + _fini_priv(priv); + return; + } + } + + evas_object_show(priv->dim_ly); + + layout = util_add_layout(priv->base, UG_WIFI_DIRECT_EDJ_FILE, + GRP_WIFI_DIRECT_SELECT); + if (!layout) + return; + + elm_object_focus_allow_set(layout, EINA_TRUE); + + box = util_add_box(layout, PART_SWALLOW_CONTENT); + if (!box) { + evas_object_del(layout); + return; + } + + for (i = 0; i < BTN_DIRECT; i++) { + btn[i] = util_add_button(box, STYLE_POPUP_BUTTON, NULL, + _(popup_button_on[i])); + if (!btn[i]) { + _ERR("add btn direct failed."); + evas_object_del(layout); + return; + } + + elm_box_pack_end(box, btn[i]); + evas_object_smart_callback_add(btn[i], SIG_CLICKED, + _wifi_direct_select_btn_cb, priv); + evas_object_event_callback_add(btn[i], + EVAS_CALLBACK_MOUSE_IN, + _list_btn_mouse_in_cb, priv); + } + + if (priv->direct_on_flag == DIRECT_ON) + elm_object_signal_emit(btn[DIRECT_ON], + SIG_BTN_SELECTED, PROG); + else + elm_object_signal_emit(btn[DIRECT_OFF], + SIG_BTN_SELECTED, PROG); + + util_set_cycle_focus(btn, BTN_DIRECT); + + evas_object_geometry_get(priv->on_btn, &btn_x, &btn_y, &btn_w, &btn_h); + move_x = btn_x + btn_w - POPUP_WIDTH * HALF_SCALE - POPUP_RIGHT; + move_y = btn_y + btn_h; + evas_object_move(layout, move_x * ELM_SCALE, move_y * ELM_SCALE); + + priv->direct_popup = layout; + + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_DOWN, + _popup_back_pressed_cb, priv); + + elm_object_focus_set(btn[0], EINA_TRUE); +} + +/** +* Set the Wi-Fi Direct description. +* +* @param[in] priv _priv object bypassed +*/ +static void _set_description(struct _priv *priv) +{ + char descrption[MAX_STRING_LENTH]; + + if (!priv) { + _ERR("priv is invalid."); + return; + } + + memset(&descrption, 0x00, MAX_STRING_LENTH); + snprintf(descrption, MAX_STRING_LENTH - 1, "%s", TXT_WIFI_DIRECT_DISC); + elm_object_part_text_set(priv->base, PART_DESCRIPTION, descrption); +} + +/** +* Create the Wi-Fi Direct state button. +* +* @param[in] priv _priv object bypassed +* @return 0 on success, -1 otherwise +*/ +static int _create_wifi_direct_button(struct _priv *priv) +{ + Evas_Object *on_btn; + Evas_Object *base; + + if (!priv || !priv->base) { + _ERR("Parameter error!"); + return RET_FAILED; + } + + base = priv->base; + + on_btn = util_add_button(base, STYLE_WIFI_DIRECT_BTN, + PART_WIFI_DIRECT_ON, TXT_WIFI_DIRECT); + if (!on_btn) { + _ERR("Add wifi direct button failed."); + return RET_FAILED; + } + + elm_object_focus_allow_set(on_btn, EINA_TRUE); + elm_object_focus_set(on_btn, EINA_TRUE); + elm_object_focus_next_object_set(on_btn, on_btn, ELM_FOCUS_UP); + elm_object_focus_next_object_set(on_btn, on_btn, ELM_FOCUS_LEFT); + + evas_object_smart_callback_add(on_btn, SIG_CLICKED, + _wifi_direct_btn_clicked_cb, priv); + evas_object_event_callback_add(on_btn, + EVAS_CALLBACK_MOUSE_IN, _list_btn_mouse_in_cb, priv); + + priv->on_btn = on_btn; + + _refresh_wifi_direct_on_text(priv); + + return RET_SUCCESS; +} + +/** +* Create the genlist item text label. +* +* @param[in] data the user data +* @return pointer pointing to the text label +*/ +static char *_item_label_get(void *data, Evas_Object *obj, + const char *part) +{ + struct device_info *info; + char buf_name[WIFI_DIRECT_DEFAULT_BUF_LEN]; + + if (!data) { + _ERR("data is NULL."); + return NULL; + } + + info = data; + + memset(&buf_name, 0x00, WIFI_DIRECT_DEFAULT_BUF_LEN); + if (!strcmp(part, TXT_ELM_TEXT)) { + strncpy(buf_name, info->dev_name, WIFI_DIRECT_HALF_BUF_LEN); + strncat(buf_name, TXT_COLON, WIFI_DIRECT_COLON_LEN); + strncat(buf_name, info->state, WIFI_DIRECT_HALF_BUF_LEN); + + return strdup(buf_name); + } + + return NULL; +} + +/** +* Create the genlist object. +* +* @param[in] priv _priv object bypassed +* @return genlist object on success, otherwise NULL +*/ +static Evas_Object *_create_genlist(struct _priv *priv) +{ + Evas_Object *genlist; + Elm_Genlist_Item_Class *itc; + + if (!priv || !priv->base) { + _ERR("priv is invalid."); + return NULL; + } + + genlist = elm_genlist_add(priv->base); + if (!genlist) { + _ERR("add genlist failed."); + return NULL; + } + + priv->genlist = genlist; + + itc = elm_genlist_item_class_new(); + if (!itc) { + _ERR("genlist item class new failed."); + evas_object_del(genlist); + return NULL; + } + + itc->item_style = STYLE_TEXT_ICON; + itc->func.text_get = _item_label_get; + itc->func.content_get = NULL; + itc->func.state_get = NULL; + itc->func.del = NULL; + + priv->itc = itc; + + evas_object_size_hint_weight_set(genlist, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(genlist, + EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_focus_next_object_set(genlist, genlist, ELM_FOCUS_LEFT); + + return genlist; +} + +/** +* Creates the action buttons including refresh button and close button. +* +* @param[in] priv _priv object bypassed +* @return 0 on success, otherwise -1 +*/ +static int _create_action_btn(struct _priv *priv) +{ + Evas_Object *btn_refresh; + Evas_Object *btn_close; + + if (!priv || !priv->base) { + _ERR("priv is invalid."); + return RET_FAILED; + } + + btn_refresh = util_add_button(priv->base, STYLE_ACTION_BUTTON, + PART_REFRESH_BTN, _(action_button[ACTION_BTN_REFRESH])); + btn_close = util_add_button(priv->base, STYLE_ACTION_BUTTON, + PART_CLOSE_BTN, _(action_button[ACTION_BTN_CLOSE])); + + priv->btn_refresh = btn_refresh; + priv->btn_close = btn_close; + + evas_object_event_callback_add(priv->btn_refresh, + EVAS_CALLBACK_MOUSE_IN, _list_btn_mouse_in_cb, priv); + evas_object_smart_callback_add(priv->btn_refresh, + SIG_CLICKED, _refresh_btn_clicked_cb, priv); + evas_object_event_callback_add(priv->btn_close, + EVAS_CALLBACK_MOUSE_IN, _list_btn_mouse_in_cb, priv); + evas_object_smart_callback_add(priv->btn_close, + SIG_CLICKED, _close_btn_clicked_cb, priv); + + return RET_SUCCESS; +} + +/** +* Initialize Wi-Fi Direct stack. +* +* @param[in] priv _priv object bypassed +* @return 0 on success, otherwise -1 +*/ +static int _wifi_direct_view_stack_init(struct _priv *priv) +{ + int ret; + + if (!priv) { + _ERR("priv is NULL."); + return RET_FAILED; + } + + ret = wifi_direct_mgr_wifi_init(); + if (ret != RET_SUCCESS) { + _ERR("init wifi failed."); + return ret; + } + + ret = wifi_direct_mgr_wifi_direct_init(); + if (ret != RET_SUCCESS) { + _ERR("init wifi direct failed."); + wifi_direct_mgr_wifi_fini(); + return ret; + } + + ret = wifi_direct_mgr_register_callback(&cbs, (void *)priv); + if (ret != RET_SUCCESS) { + _ERR("register callback failed."); + wifi_direct_mgr_wifi_fini(); + wifi_direct_mgr_wifi_direct_fini(); + return ret; + } + + return ret; +} + +/** +* Evas_Object_Event_Cb type callback for handling deletion event. +* +* @param[in] data the user data +* @param[in] e evas handler +* @param[in] obj the corresponding object which the deletion event occurred +* @param[in] event_info event information +*/ +static void _base_layout_key_down_cb(void *data, + Evas *e, Evas_Object *obj, void *event_info) +{ + struct _priv *priv; + Evas_Event_Key_Down *ei; + + if (!data || !event_info) { + _ERR("the param is invalid."); + return; + } + + priv = data; + ei = event_info; + + if (!ei->keyname) { + _ERR("ei->keyname is NULL."); + return; + } + + if (!priv->ug) { + _ERR("priv->ug -s NULL."); + return; + } + + if (!strcmp(ei->keyname, KEY_BACK) || + !strcmp(ei->keyname, KEY_EXIT)) { + ug_destroy_me(priv->ug); + _fini_priv(priv); + } +} + +/** +* Create wifi direct main view. +* +* @param[in] win parent window +* @param[in] ug UI gadget object +* @return base layout +*/ +Evas_Object *wifi_direct_view_create(Evas_Object *win, ui_gadget_h ug) +{ + Evas_Object *base; + Evas_Object *obj; + struct _priv *priv; + int ret; + + if (!win || !ug) { + _ERR("The param is invalid.\n"); + return NULL; + } + + priv = _init_priv(); + if (!priv) { + _ERR("calloc priv failed.\n"); + return NULL; + } + + priv->win = win; + priv->ug = ug; + priv->direct_on_flag = DIRECT_ON; + + ret = _wifi_direct_view_stack_init(priv); + if (ret != RET_SUCCESS) { + _ERR("wifi direct view stack init failed."); + goto error; + } + + base = util_add_layout(win, UG_WIFI_DIRECT_EDJ_FILE, GRP_MAIN); + if (!base) { + _ERR("Add base layout failed.\n"); + goto error; + } + + priv->base = base; + + _set_description(priv); + + ret = _create_wifi_direct_button(priv); + if (ret != RET_SUCCESS) { + _ERR("fail to create wifi direct button."); + goto error; + } + + obj = _create_genlist(priv); + if (!obj) { + _ERR("fail to create genlist."); + goto error; + } + + ret = _create_action_btn(priv); + if (ret != RET_SUCCESS) { + _ERR("fail to create action button."); + goto error; + } + + _create_device_list_view(priv); + + evas_object_event_callback_add(base, EVAS_CALLBACK_KEY_DOWN, + _base_layout_key_down_cb, priv); + + evas_object_show(base); + + return base; + +error: + _fini_priv(priv); + return NULL; +} -- 2.7.4 From bbca78e0a614861df4c151e9629ba4f51b3a7a94 Mon Sep 17 00:00:00 2001 From: JuWan Kim Date: Thu, 5 Feb 2015 14:35:08 +0900 Subject: [PATCH 3/6] Remove manifest file Change-Id: Ieb8c06450ec8ffec64a12de13348f99bce3dccf0 Signed-off-by: JuWan Kim --- org.tizen.settings-tv-ref.manifest | 8 -------- 1 file changed, 8 deletions(-) delete mode 100755 org.tizen.settings-tv-ref.manifest diff --git a/org.tizen.settings-tv-ref.manifest b/org.tizen.settings-tv-ref.manifest deleted file mode 100755 index e74f9d1..0000000 --- a/org.tizen.settings-tv-ref.manifest +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - -- 2.7.4 From b4b3c29e3951efd81883fb98503e65d69277252f Mon Sep 17 00:00:00 2001 From: JuWan Kim Date: Mon, 23 Feb 2015 15:51:19 +0900 Subject: [PATCH 4/6] Add default manifest file and modify spec file for manifest file Change-Id: I89e95ef31fd25e8e0d44b61bb0c1d8973d86b2f7 Signed-off-by: JuWan Kim --- packaging/org.tizen.settings-tv-ref.manifest | 5 +++++ packaging/org.tizen.settings-tv-ref.spec | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 packaging/org.tizen.settings-tv-ref.manifest diff --git a/packaging/org.tizen.settings-tv-ref.manifest b/packaging/org.tizen.settings-tv-ref.manifest new file mode 100644 index 0000000..376ea7e --- /dev/null +++ b/packaging/org.tizen.settings-tv-ref.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/packaging/org.tizen.settings-tv-ref.spec b/packaging/org.tizen.settings-tv-ref.spec index c2697e7..73ad361 100644 --- a/packaging/org.tizen.settings-tv-ref.spec +++ b/packaging/org.tizen.settings-tv-ref.spec @@ -5,6 +5,7 @@ Release: 1 Group: Applications/Native Applications License: Apache-2.0 Source0: %{name}-%{version}.tar.gz +Source1: %{name}.manifest BuildRequires: cmake BuildRequires: gettext-tools BuildRequires: edje-bin @@ -51,6 +52,7 @@ Description: settings-tv-ref application %prep %setup -q +cp %{SOURCE1} . %build cmake . \ @@ -147,7 +149,7 @@ chmod -R 777 /var/kdb/db/menu/ rm -rf %{buildroot} %files -%manifest org.tizen.settings-tv-ref.manifest +%manifest %{name}.manifest %defattr(-,root,root,-) %{_bindir}/* %{_manifestdir}/%{name}.xml -- 2.7.4 From d24a98a6a94e7cec6e3f2181e3ef0d5708116383 Mon Sep 17 00:00:00 2001 From: JuWan Kim Date: Wed, 25 Feb 2015 14:13:35 +0900 Subject: [PATCH 5/6] Fix launch bug (json read fail) * After json_reader_read_member function is called, json_reader_end_member should be called * Added debug message Change-Id: I58c2f0c45062ffa977eae87f5698d8a4101bf234 Signed-off-by: JuWan Kim --- include/dbg.h | 2 +- src/data_wrapper.c | 1 + src/main.c | 3 +++ src/parser.c | 67 ++++++++++++++++++++++++++++++++++++++++++++------ src/view_maincatalog.c | 5 ++++ src/viewmgr.c | 2 ++ 6 files changed, 72 insertions(+), 8 deletions(-) diff --git a/include/dbg.h b/include/dbg.h index 5641211..c331cc3 100644 --- a/include/dbg.h +++ b/include/dbg.h @@ -29,7 +29,7 @@ #endif #ifndef _DBG -#define _DBG(fmt, args...) (LOGD("[%s:%d] "fmt"\n", __func__, __LINE__, ##args)) +#define _DBG(fmt, args...) (LOGD(" "fmt"\n", ##args)) #endif #ifndef _INFO diff --git a/src/data_wrapper.c b/src/data_wrapper.c index 59327bf..429ab45 100644 --- a/src/data_wrapper.c +++ b/src/data_wrapper.c @@ -751,6 +751,7 @@ static int _write_settingitems_to_hash(Eina_Hash *hash, _ERR("parser_init failed!\n"); return -1; } + _DBG("CREATED Parser [Path = %s]",path); reader = parser_get_json_reader(jparser); if (!reader) { diff --git a/src/main.c b/src/main.c index c152f52..794438b 100644 --- a/src/main.c +++ b/src/main.c @@ -186,6 +186,7 @@ static void _pause(void *data) */ static void _resume(void *data) { + _DBG("############################# _resume #############################"); } /** @@ -200,6 +201,7 @@ static void _resume(void *data) */ static void _service(service_h service, void *data) { + _DBG("############################# START _service #############################"); struct _appdata *ad; struct setting_mgr *mgr; int r; @@ -254,6 +256,7 @@ static void _service(service_h service, void *data) free(ad->item); ad->item = param; + _DBG("############################# END _service #############################"); } /** diff --git a/src/parser.c b/src/parser.c index 285b184..7bcd2c9 100644 --- a/src/parser.c +++ b/src/parser.c @@ -43,6 +43,7 @@ static void _restore_json_reader_location(struct json_parser *jparser, } while (cnt > 0) { + _DBG("[cnt = %d] json_reader_end_member",cnt); json_reader_end_member(jparser->reader); cnt--; } @@ -255,22 +256,42 @@ char **parser_get_itemlist_from_json(struct json_parser *jparser, cursor = 0; + // For Debugging + _DBG("==================================================================================="); + _DBG("[START][ name = %s ][Parser = %x][Reader = %x]",name, jparser, jparser->reader); + _DBG("Member cnt = %d", json_reader_count_members(jparser->reader)); + _DBG("Current Member = %s", json_reader_get_member_name(jparser->reader)); if (flag == DRAWING_INFO) { - if (!json_reader_read_member(jparser->reader, - JSONSTR_SETTING_ITEMS)) + _DBG("[%s] flag is DRAWING_INFO", JSONSTR_SETTING_ITEMS); + if (!json_reader_read_member(jparser->reader, JSONSTR_SETTING_ITEMS)) + { + cursor++; + _DBG("[%s] Fail to read member from json", JSONSTR_SETTING_ITEMS); goto error; + } } else if (flag == SUBMENU_INFO) { - if (!json_reader_read_member(jparser->reader, - JSONSTR_SETTING_TREE)) + _DBG("[%s] flag is SUBMENU_INFO", JSONSTR_SETTING_TREE); + if (!json_reader_read_member(jparser->reader, JSONSTR_SETTING_TREE)) + { + cursor++; + _DBG("[%s] Fail to read member from json", JSONSTR_SETTING_TREE); goto error; + } } else { + _DBG("flag is invalid. flag = %d", flag); goto error; } cursor++; if (!json_reader_read_member(jparser->reader, name)) + { + cursor++; + _DBG("[%s] Fail to read member from json", name); goto error; + } + _DBG("[END][ name = %s ]",name); + _DBG("==================================================================================="); cursor++; @@ -281,6 +302,8 @@ char **parser_get_itemlist_from_json(struct json_parser *jparser, return list; error: + _DBG("[END-ERROR][ name = %s ]",name); + _DBG("==================================================================================="); _restore_json_reader_location(jparser, cursor); *cnt = 0; @@ -311,22 +334,38 @@ char **parser_get_settingui_args_from_json(struct json_parser *jparser, cursor = 0; if (!json_reader_read_member(jparser->reader, JSONSTR_SETTING_ITEMS)) + { + cursor++; + _DBG("[%s] Fail to read member from json", JSONSTR_SETTING_ITEMS); goto error; + } cursor++; if (!json_reader_read_member(jparser->reader, name)) + { + cursor++; + _DBG("[%s] Fail to read member from json", name); goto error; + } cursor++; if (!json_reader_read_member(jparser->reader, pnode)) + { + cursor++; + _DBG("[%s] Fail to read member from json", pnode); goto error; + } cursor++; if (!json_reader_read_member(jparser->reader, JSONSTR_SETTINGUI_ARGS)) + { + cursor++; + _DBG("[%s] Fail to read member from json", JSONSTR_SETTINGUI_ARGS); goto error; + } cursor++; @@ -366,18 +405,27 @@ char **parser_get_data_list_from_json(struct json_parser *jparser, cursor = 0; if (!json_reader_read_member(jparser->reader, JSONSTR_SETTING_ITEMS)) + { + cursor++; + _DBG("[%s] Fail to read member from json", JSONSTR_SETTING_ITEMS); goto error; - + } cursor++; if (!json_reader_read_member(jparser->reader, name)) + { + cursor++; + _DBG("[%s] Fail to read member from json", name); goto error; - + } cursor++; if (!json_reader_read_member(jparser->reader, JSONSTR_DATA)) + { + cursor++; + _DBG("[%s] Fail to read member from json", JSONSTR_DATA); goto error; - + } cursor++; *cnt = json_reader_count_members(jparser->reader); @@ -533,6 +581,11 @@ int parser_get_array_length_from_json(struct json_parser *jparser, for (i = 1; i < cnt; i++) { if (!json_reader_read_member(jparser->reader, arr[i])) { + while(i){ + json_reader_end_member(jparser->reader); + i--; + } + free(arr[0]); free(arr); return 0; diff --git a/src/view_maincatalog.c b/src/view_maincatalog.c index 869cffc..044dd1c 100644 --- a/src/view_maincatalog.c +++ b/src/view_maincatalog.c @@ -1631,6 +1631,7 @@ error: static void _view_anim_finish(void *data, Evas_Object *obj, const char *emission, const char *source) { + _DBG("START ========================================================="); struct _view_data *priv; if (!data) @@ -1639,6 +1640,7 @@ static void _view_anim_finish(void *data, Evas_Object *obj, priv = data; _draw_main_items(priv); + _DBG("END ========================================================="); } /** @@ -1743,6 +1745,7 @@ static void _change_buttons_name(Eina_List *list, static Evas_Object *_create(struct setting_mgr *mgr, struct settingview_data *view, void *prev) { + _DBG("START =================================================================="); Evas_Object *base, *win; struct _view_data *data; @@ -1788,10 +1791,12 @@ static Evas_Object *_create(struct setting_mgr *mgr, _view_anim_finish(data, NULL, NULL, NULL); return base; + _DBG("END =================================================================="); error: evas_object_del(base); free(data); + _DBG("END-ERROR =================================================================="); return NULL; } diff --git a/src/viewmgr.c b/src/viewmgr.c index 4bd4f6e..cb2872a 100644 --- a/src/viewmgr.c +++ b/src/viewmgr.c @@ -411,11 +411,13 @@ int settingmgr_view_push(struct setting_mgr *mgr, goto error; } + _DBG("START sclass->create ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); base = sclass->create(mgr, view, data); if (!base) { _ERR("failed to create base layout."); goto error; } + _DBG("END sclass->create ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); _frozen_view_in_list(mgr); -- 2.7.4 From 0ddd16091b92905b880fb69748becda0456647a2 Mon Sep 17 00:00:00 2001 From: JuWan Kim Date: Wed, 25 Feb 2015 16:15:30 +0900 Subject: [PATCH 6/6] Apply changed app-lifecycle Change-Id: Id2a4e71ae7c62360d1edda777814fff30de485e9 Signed-off-by: JuWan Kim --- src/main.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/main.c b/src/main.c index 794438b..b2868fa 100644 --- a/src/main.c +++ b/src/main.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include "dbg.h" #include "def.h" @@ -35,7 +34,7 @@ struct _appdata { struct setting_mgr *mgr; const char *name; char *item; - unsigned int service; + unsigned int app_control; }; /** @@ -129,7 +128,7 @@ static bool _create(void *data) } ad->win = win; - ad->service = 0; + ad->app_control = 0; return true; } @@ -199,9 +198,9 @@ static void _resume(void *data) * @param data [in] The function specific data passed by app_efl_main. * @return void. */ -static void _service(service_h service, void *data) +static void _app_control(app_control_h app_control, void *data) { - _DBG("############################# START _service #############################"); + _DBG("############################# START _app_control #############################"); struct _appdata *ad; struct setting_mgr *mgr; int r; @@ -214,8 +213,8 @@ static void _service(service_h service, void *data) ad = data; param = NULL; - if (ad->service) { - service_get_extra_data(service, PARAM_SETTINGS_ITEM, ¶m); + if (ad->app_control) { + app_control_get_extra_data(app_control, PARAM_SETTINGS_ITEM, ¶m); if ((!param && !ad->item) || (param && ad->item && !strcmp(ad->item, param))) { @@ -240,8 +239,8 @@ static void _service(service_h service, void *data) if (!mgr) app_efl_exit(); - r = service_get_extra_data(service, PARAM_SETTINGS_ITEM, ¶m); - if (r == SERVICE_ERROR_NONE && param) { + r = app_control_get_extra_data(app_control, PARAM_SETTINGS_ITEM, ¶m); + if (r == APP_CONTROL_ERROR_NONE && param) { r = settingmgr_launch_item(mgr, param); if (r != 0) { _ERR("the item is not exist."); @@ -252,11 +251,11 @@ static void _service(service_h service, void *data) } ad->mgr = mgr; - ad->service = 1; + ad->app_control = 1; free(ad->item); ad->item = param; - _DBG("############################# END _service #############################"); + _DBG("############################# END _app_control #############################"); } /** @@ -305,17 +304,12 @@ static void _region_changed(void *data) int main(int argc, char **argv) { struct _appdata ad; - app_event_callback_s cbs = { + ui_app_lifecycle_callback_s cbs = { .create = _create, .terminate = _terminate, .pause = _pause, .resume = _resume, - .service = _service, - .low_memory = NULL, - .low_battery = NULL, - .device_orientation = NULL, - .language_changed = _lang_changed, - .region_format_changed = _region_changed, + .app_control = _app_control, }; memset(&ad, 0x00, sizeof(ad)); @@ -323,7 +317,11 @@ int main(int argc, char **argv) i18n_init(); - app_efl_main(&argc, &argv, &cbs, &ad); + /* TODO : _lang_changed, _region_changed callback will be registerd + * Use BaseApp in application-common. + */ + + ui_app_main(argc, argv, &cbs, &ad); return 0; } -- 2.7.4