summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS2
-rwxr-xr-xCMakeLists.txt5
-rw-r--r--NOTICE1
-rwxr-xr-xhome/CMakeLists.txt197
-rwxr-xr-xhome/LICENSE204
-rw-r--r--home/data/500.w-home.patch.sh15
-rwxr-xr-xhome/data/CMakeLists.txt12
-rwxr-xr-xhome/data/dump_w-home.sh5
-rwxr-xr-xhome/data/home_reset.sh19
-rw-r--r--home/data/org.tizen.w-home.efl82
-rwxr-xr-xhome/data/org.tizen.w-home.xml.in22
-rwxr-xr-xhome/data/org.tizen.w-home_ChangeableColorInfo.xml353
-rwxr-xr-xhome/data/org.tizen.w-home_ChangeableFontInfo.xml36
-rwxr-xr-xhome/data/org.tizen.w-home_apps_ChangeableColorInfo.xml161
-rwxr-xr-xhome/data/org.tizen.w-home_apps_ChangeableFontInfo.xml29
-rw-r--r--home/include/add-viewer.h49
-rwxr-xr-xhome/include/add-viewer_debug.h88
-rwxr-xr-xhome/include/add-viewer_package.h74
-rwxr-xr-xhome/include/add-viewer_pkgmgr.h41
-rwxr-xr-xhome/include/add-viewer_ucol.h44
-rwxr-xr-xhome/include/add-viewer_util.h26
-rwxr-xr-xhome/include/apps/apps_conf.h78
-rwxr-xr-xhome/include/apps/apps_main.h99
-rwxr-xr-xhome/include/apps/bg.h26
-rwxr-xr-xhome/include/apps/db.h59
-rwxr-xr-xhome/include/apps/effect.h34
-rwxr-xr-xhome/include/apps/grid.h37
-rwxr-xr-xhome/include/apps/item.h42
-rwxr-xr-xhome/include/apps/item_badge.h41
-rwxr-xr-xhome/include/apps/item_info.h75
-rwxr-xr-xhome/include/apps/lang.h33
-rwxr-xr-xhome/include/apps/layout.h43
-rw-r--r--home/include/apps/list.h42
-rwxr-xr-xhome/include/apps/page.h73
-rwxr-xr-xhome/include/apps/page_info.h38
-rwxr-xr-xhome/include/apps/pkgmgr.h41
-rwxr-xr-xhome/include/apps/scroller.h71
-rwxr-xr-xhome/include/apps/scroller_info.h41
-rwxr-xr-xhome/include/apps/xml.h26
-rwxr-xr-xhome/include/bg.h29
-rwxr-xr-xhome/include/clock_service.h262
-rwxr-xr-xhome/include/conf.h87
-rwxr-xr-xhome/include/critical_log.h31
-rwxr-xr-xhome/include/db.h60
-rw-r--r--home/include/dbox.h34
-rwxr-xr-xhome/include/dbus.h96
-rw-r--r--home/include/dynamicbox_evas.h357
-rwxr-xr-xhome/include/edit.h60
-rwxr-xr-xhome/include/edit_info.h31
-rwxr-xr-xhome/include/effect.h32
-rwxr-xr-xhome/include/gesture.h50
-rwxr-xr-xhome/include/index.h34
-rwxr-xr-xhome/include/index_info.h33
-rwxr-xr-xhome/include/item_info.h58
-rwxr-xr-xhome/include/key.h47
-rwxr-xr-xhome/include/lang.h29
-rwxr-xr-xhome/include/layout.h40
-rwxr-xr-xhome/include/layout_info.h37
-rwxr-xr-xhome/include/log.h154
-rwxr-xr-xhome/include/main.h66
-rwxr-xr-xhome/include/mapbuf.h38
-rwxr-xr-xhome/include/minictrl.h95
-rwxr-xr-xhome/include/noti_broker.h46
-rwxr-xr-xhome/include/page.h76
-rwxr-xr-xhome/include/page_info.h88
-rwxr-xr-xhome/include/pkgmgr.h42
-rwxr-xr-xhome/include/popup.h25
-rwxr-xr-xhome/include/power_mode.h42
-rwxr-xr-xhome/include/scroller.h134
-rwxr-xr-xhome/include/scroller_info.h60
-rwxr-xr-xhome/include/tutorial.h41
-rwxr-xr-xhome/include/tutorial_info.h32
-rwxr-xr-xhome/include/util.h270
-rwxr-xr-xhome/include/virtual_canvas.h28
-rwxr-xr-xhome/include/win.h24
-rwxr-xr-xhome/include/wms.h41
-rwxr-xr-xhome/include/xml.h24
-rwxr-xr-xhome/org.tizen.w-home.manifest8
-rw-r--r--home/res/CMakeLists.txt6
-rwxr-xr-xhome/res/edje/CMakeLists.txt15
-rwxr-xr-xhome/res/edje/apps_box.edc413
-rwxr-xr-xhome/res/edje/apps_button.edc125
l---------home/res/edje/apps_conf.edc1
-rwxr-xr-xhome/res/edje/apps_grid.edc197
-rwxr-xr-xhome/res/edje/apps_item.edc428
-rwxr-xr-xhome/res/edje/apps_layout.edc240
-rwxr-xr-xhome/res/edje/apps_page.edc143
-rwxr-xr-xhome/res/edje/box_layout.edc49
-rwxr-xr-xhome/res/edje/clock_shortcut.edc159
l---------home/res/edje/conf.edc1
-rw-r--r--home/res/edje/dynamicbox.edc427
-rw-r--r--home/res/edje/edit.edc169
-rwxr-xr-xhome/res/edje/images/Arrow_S_00015.pngbin0 -> 1415 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00016.pngbin0 -> 1814 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00017.pngbin0 -> 2025 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00018.pngbin0 -> 2109 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00019.pngbin0 -> 2201 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00020.pngbin0 -> 2149 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00021.pngbin0 -> 2152 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00022.pngbin0 -> 2029 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00023.pngbin0 -> 2579 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00024.pngbin0 -> 2974 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00025.pngbin0 -> 1971 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00026.pngbin0 -> 2034 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00027.pngbin0 -> 2189 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00028.pngbin0 -> 2230 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00029.pngbin0 -> 2139 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00030.pngbin0 -> 2088 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00031.pngbin0 -> 1930 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00032.pngbin0 -> 1821 bytes
-rwxr-xr-xhome/res/edje/images/Arrow_S_00033.pngbin0 -> 1547 bytes
-rwxr-xr-xhome/res/edje/images/B3_Data.pngbin0 -> 7321 bytes
-rwxr-xr-xhome/res/edje/images/b_favorite_app_line.pngbin0 -> 1001 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_add_widget_line.#.pngbin0 -> 981 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_badge_large_bg.#.pngbin0 -> 15675 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_badge_large_line.#.pngbin0 -> 16199 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_badge_large_shadow.#.pngbin0 -> 1889 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_block_btn_bg.pngbin0 -> 2277 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_block_btn_bg02.#.pngbin0 -> 2135 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_block_btn_ic.pngbin0 -> 1921 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_block_btn_line.pngbin0 -> 2692 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_block_btn_line02.#.pngbin0 -> 2570 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_block_text_btn_bg.#.pngbin0 -> 1966 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_block_text_btn_line.#.pngbin0 -> 2214 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_clock_arrow.pngbin0 -> 1322 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_clock_arrow_big.pngbin0 -> 2138 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_clock_arrow_big_ef.pngbin0 -> 3979 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_edit_cover.pngbin0 -> 1516 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_edit_cover_ef.pngbin0 -> 2433 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_favorite_more_icon.pngbin0 -> 1360 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_network_auto.pngbin0 -> 2525 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_network_off.pngbin0 -> 2642 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_network_on.pngbin0 -> 2403 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_recent_icon.pngbin0 -> 1396 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_widget_check.pngbin0 -> 1324 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_widget_check_ef.pngbin0 -> 1929 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_widget_del_bg.pngbin0 -> 1720 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_widget_del_icon.pngbin0 -> 1075 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_widget_del_line.pngbin0 -> 1859 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_widget_line.#.pngbin0 -> 987 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_widget_line_ef.pngbin0 -> 2414 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_widget_plus.pngbin0 -> 1220 bytes
-rwxr-xr-xhome/res/edje/images/b_home_screen_widget_plus_ef.pngbin0 -> 1762 bytes
-rwxr-xr-xhome/res/edje/images/b_widget_favorite_bg.pngbin0 -> 2787 bytes
-rwxr-xr-xhome/res/edje/images/bouncing_bottom_edge.pngbin0 -> 1090 bytes
-rwxr-xr-xhome/res/edje/images/bouncing_bottom_glow.pngbin0 -> 5100 bytes
-rwxr-xr-xhome/res/edje/images/bouncing_left_edge.pngbin0 -> 1007 bytes
-rwxr-xr-xhome/res/edje/images/bouncing_left_glow.pngbin0 -> 6433 bytes
-rwxr-xr-xhome/res/edje/images/bouncing_right_edge.pngbin0 -> 1007 bytes
-rwxr-xr-xhome/res/edje/images/bouncing_right_glow.pngbin0 -> 6380 bytes
-rwxr-xr-xhome/res/edje/images/do_not_ic_disturb.pngbin0 -> 4280 bytes
-rwxr-xr-xhome/res/edje/images/do_not_ic_donot_now.pngbin0 -> 4680 bytes
-rwxr-xr-xhome/res/edje/images/favorite_contact_bg_cover.pngbin0 -> 2281 bytes
-rwxr-xr-xhome/res/edje/images/indicator_clock_on_focused.pngbin0 -> 1192 bytes
-rwxr-xr-xhome/res/edje/images/indicator_clock_on_focused_ef.pngbin0 -> 1368 bytes
-rwxr-xr-xhome/res/edje/images/indicator_clock_on_normal.pngbin0 -> 1175 bytes
-rwxr-xr-xhome/res/edje/images/indicator_clock_on_normal_ef.pngbin0 -> 1296 bytes
-rwxr-xr-xhome/res/edje/images/indicator_on_focused.pngbin0 -> 1095 bytes
-rwxr-xr-xhome/res/edje/images/indicator_on_focused_ef.pngbin0 -> 1202 bytes
-rwxr-xr-xhome/res/edje/images/indicator_on_normal.pngbin0 -> 1088 bytes
-rwxr-xr-xhome/res/edje/images/indicator_on_normal_ef.pngbin0 -> 1201 bytes
-rwxr-xr-xhome/res/edje/images/indicator_panel_on_focused.pngbin0 -> 1031 bytes
-rwxr-xr-xhome/res/edje/images/indicator_panel_on_focused_ef.pngbin0 -> 1124 bytes
-rwxr-xr-xhome/res/edje/images/indicator_panel_on_normal.pngbin0 -> 1028 bytes
-rwxr-xr-xhome/res/edje/images/indicator_panel_on_normal_ef.pngbin0 -> 1107 bytes
-rwxr-xr-xhome/res/edje/images/overlay000_image.pngbin0 -> 52547 bytes
-rwxr-xr-xhome/res/edje/images/overlay00_bg_cover.pngbin0 -> 2281 bytes
-rwxr-xr-xhome/res/edje/images/overlay01_bg_cover.pngbin0 -> 32702 bytes
-rwxr-xr-xhome/res/edje/images/overlay05_bg_cover.pngbin0 -> 29519 bytes
-rwxr-xr-xhome/res/edje/images/overlay06_bg_cover.pngbin0 -> 29529 bytes
-rwxr-xr-xhome/res/edje/images/overlay08_bg_cover.pngbin0 -> 26773 bytes
-rwxr-xr-xhome/res/edje/images/overlay_button.#.pngbin0 -> 3206 bytes
-rwxr-xr-xhome/res/edje/images/overlay_button_press.#.pngbin0 -> 3165 bytes
-rwxr-xr-xhome/res/edje/images/overlay_close.pngbin0 -> 2524 bytes
-rwxr-xr-xhome/res/edje/images/overlay_cue.pngbin0 -> 2302 bytes
-rwxr-xr-xhome/res/edje/images/overlay_start_button.pngbin0 -> 4605 bytes
-rwxr-xr-xhome/res/edje/images/overlay_start_button_press.pngbin0 -> 6992 bytes
-rwxr-xr-xhome/res/edje/images/overlay_swipe_down.pngbin0 -> 2469 bytes
-rwxr-xr-xhome/res/edje/images/overlay_swipe_left.pngbin0 -> 2806 bytes
-rwxr-xr-xhome/res/edje/images/overlay_swipe_right.pngbin0 -> 2815 bytes
-rwxr-xr-xhome/res/edje/images/overlay_swipe_up.pngbin0 -> 2465 bytes
-rwxr-xr-xhome/res/edje/index.edc356
-rwxr-xr-xhome/res/edje/layout.edc667
-rwxr-xr-xhome/res/edje/page.edc1148
-rwxr-xr-xhome/res/edje/page_clock.edc1802
-rw-r--r--home/res/edje/popup.edc123
-rw-r--r--home/res/edje/preview.edc546
-rwxr-xr-xhome/res/edje/tutorial.edc1182
-rwxr-xr-xhome/res/icon/CMakeLists.txt3
-rwxr-xr-xhome/res/icon/org.tizen.w-home.pngbin0 -> 2765 bytes
-rwxr-xr-xhome/res/icon/org.tizen.w-home.small.pngbin0 -> 2481 bytes
-rw-r--r--home/res/image/CMakeLists.txt2
-rwxr-xr-xhome/res/image/b_home_screen_widget_line.pngbin0 -> 2828 bytes
-rwxr-xr-xhome/res/image/unknown.pngbin0 -> 19568 bytes
-rwxr-xr-xhome/res/list/CMakeLists.txt2
-rw-r--r--home/res/list/tts_black.list4
-rw-r--r--home/res/list/tts_white.list3
-rwxr-xr-xhome/res/ordering/CMakeLists.txt15
-rwxr-xr-xhome/res/ordering/apps_default_items.xml99
-rwxr-xr-xhome/res/ordering/apps_default_items_ATT.xml105
-rwxr-xr-xhome/res/ordering/default_favorite_apps.xml17
-rwxr-xr-xhome/res/ordering/default_favorite_apps_emergency.xml38
-rwxr-xr-xhome/res/ordering/default_favorite_apps_emulator.xml24
-rwxr-xr-xhome/res/ordering/default_favorite_apps_without_camera.xml108
-rwxr-xr-xhome/res/ordering/default_favorite_apps_without_camera_sleep.xml115
-rwxr-xr-xhome/res/ordering/default_favorite_apps_without_hr.xml108
-rwxr-xr-xhome/res/ordering/default_favorite_apps_without_sleep.xml122
-rwxr-xr-xhome/res/ordering/default_items.xml31
-rwxr-xr-xhome/res/ordering/default_items_tts.xml24
-rwxr-xr-xhome/res/ordering/settings.xml13
-rwxr-xr-xhome/res/po/CMakeLists.txt34
-rwxr-xr-xhome/res/po/ar.po284
-rwxr-xr-xhome/res/po/as.po284
-rwxr-xr-xhome/res/po/az.po284
-rwxr-xr-xhome/res/po/bg.po284
-rwxr-xr-xhome/res/po/bn.po284
-rwxr-xr-xhome/res/po/ca.po284
-rwxr-xr-xhome/res/po/cs.po284
-rwxr-xr-xhome/res/po/da.po284
-rwxr-xr-xhome/res/po/de.po284
-rwxr-xr-xhome/res/po/el_GR.po284
-rwxr-xr-xhome/res/po/en.po284
-rwxr-xr-xhome/res/po/en_PH.po284
-rwxr-xr-xhome/res/po/en_US.po284
-rwxr-xr-xhome/res/po/es_ES.po284
-rwxr-xr-xhome/res/po/es_US.po284
-rwxr-xr-xhome/res/po/et.po284
-rwxr-xr-xhome/res/po/eu.po284
-rwxr-xr-xhome/res/po/fa.po284
-rwxr-xr-xhome/res/po/fi.po284
-rwxr-xr-xhome/res/po/fr.po284
-rwxr-xr-xhome/res/po/fr_CA.po284
-rwxr-xr-xhome/res/po/ga.po284
-rwxr-xr-xhome/res/po/gl.po284
-rwxr-xr-xhome/res/po/gu.po284
-rwxr-xr-xhome/res/po/he.po284
-rwxr-xr-xhome/res/po/hi.po284
-rwxr-xr-xhome/res/po/hr.po284
-rwxr-xr-xhome/res/po/hu.po284
-rwxr-xr-xhome/res/po/hy.po284
-rwxr-xr-xhome/res/po/id.po284
-rwxr-xr-xhome/res/po/is.po284
-rwxr-xr-xhome/res/po/it_IT.po284
-rwxr-xr-xhome/res/po/ja_JP.po284
-rwxr-xr-xhome/res/po/ka.po284
-rwxr-xr-xhome/res/po/kk.po284
-rwxr-xr-xhome/res/po/km.po284
-rwxr-xr-xhome/res/po/kn.po284
-rwxr-xr-xhome/res/po/ko_KR.po284
-rwxr-xr-xhome/res/po/ky_KG.po284
-rwxr-xr-xhome/res/po/lo.po284
-rwxr-xr-xhome/res/po/lt.po284
-rwxr-xr-xhome/res/po/lv.po284
-rwxr-xr-xhome/res/po/mk.po284
-rwxr-xr-xhome/res/po/ml.po284
-rwxr-xr-xhome/res/po/mn_MN.po284
-rwxr-xr-xhome/res/po/mr.po284
-rwxr-xr-xhome/res/po/ms.po284
-rwxr-xr-xhome/res/po/my.po284
-rwxr-xr-xhome/res/po/nb.po284
-rwxr-xr-xhome/res/po/ne.po284
-rwxr-xr-xhome/res/po/nl.po284
-rwxr-xr-xhome/res/po/or.po284
-rwxr-xr-xhome/res/po/pa.po284
-rwxr-xr-xhome/res/po/pl.po284
-rwxr-xr-xhome/res/po/pt_BR.po284
-rwxr-xr-xhome/res/po/pt_PT.po284
-rwxr-xr-xhome/res/po/ro.po284
-rwxr-xr-xhome/res/po/ru_RU.po284
-rwxr-xr-xhome/res/po/si.po284
-rwxr-xr-xhome/res/po/sk.po284
-rwxr-xr-xhome/res/po/sl.po284
-rwxr-xr-xhome/res/po/sq.po284
-rwxr-xr-xhome/res/po/sr.po284
-rwxr-xr-xhome/res/po/sv.po284
-rwxr-xr-xhome/res/po/ta.po284
-rwxr-xr-xhome/res/po/te.po284
-rwxr-xr-xhome/res/po/tg_TJ.po284
-rwxr-xr-xhome/res/po/th.po284
-rwxr-xr-xhome/res/po/tk_TM.po284
-rwxr-xr-xhome/res/po/tl.po284
-rwxr-xr-xhome/res/po/tr_TR.po284
-rwxr-xr-xhome/res/po/uk.po284
-rwxr-xr-xhome/res/po/update-po.sh60
-rwxr-xr-xhome/res/po/ur.po284
-rwxr-xr-xhome/res/po/uz.po284
-rwxr-xr-xhome/res/po/vi.po284
-rwxr-xr-xhome/res/po/zh_CN.po284
-rwxr-xr-xhome/res/po/zh_HK.po284
-rwxr-xr-xhome/res/po/zh_TW.po284
-rw-r--r--home/src/add-viewer.c1118
-rw-r--r--home/src/add-viewer_package.c890
-rwxr-xr-xhome/src/add-viewer_pkgmgr.c639
-rwxr-xr-xhome/src/add-viewer_ucol.c785
-rwxr-xr-xhome/src/add-viewer_util.c413
-rwxr-xr-xhome/src/apps/apps_main.c930
-rwxr-xr-xhome/src/apps/bg.c217
-rwxr-xr-xhome/src/apps/db.c836
-rwxr-xr-xhome/src/apps/effect.c103
-rwxr-xr-xhome/src/apps/grid.c408
-rwxr-xr-xhome/src/apps/item.c1095
-rwxr-xr-xhome/src/apps/item_badge.c311
-rwxr-xr-xhome/src/apps/item_info.c483
-rwxr-xr-xhome/src/apps/lang.c150
-rwxr-xr-xhome/src/apps/layout.c695
-rw-r--r--home/src/apps/list.c229
-rwxr-xr-xhome/src/apps/page.c599
-rwxr-xr-xhome/src/apps/pkgmgr.c745
-rwxr-xr-xhome/src/apps/scroller.c1498
-rwxr-xr-xhome/src/apps/xml.c323
-rwxr-xr-xhome/src/bg.c210
-rwxr-xr-xhome/src/clock_event.c558
-rwxr-xr-xhome/src/clock_inf_dbox.c654
-rwxr-xr-xhome/src/clock_inf_minictrl.c380
-rwxr-xr-xhome/src/clock_manager.c297
-rwxr-xr-xhome/src/clock_service.c799
-rwxr-xr-xhome/src/clock_shortcut.c589
-rwxr-xr-xhome/src/clock_util.c248
-rwxr-xr-xhome/src/clock_view.c926
-rw-r--r--home/src/clock_view_cue.c90
-rwxr-xr-xhome/src/clock_view_hidden.c506
-rw-r--r--home/src/clock_view_indicator.c369
-rwxr-xr-xhome/src/critical_log.c233
-rw-r--r--home/src/db.c715
-rw-r--r--home/src/dbox.c1095
-rwxr-xr-xhome/src/dbus.c451
-rwxr-xr-xhome/src/dbus_util.c330
-rw-r--r--home/src/dynamicbox_evas.c4963
-rwxr-xr-xhome/src/edit.c3828
-rwxr-xr-xhome/src/effect.c120
-rwxr-xr-xhome/src/gesture.c293
-rw-r--r--home/src/index.c438
-rwxr-xr-xhome/src/item_info.c94
-rwxr-xr-xhome/src/key.c219
-rwxr-xr-xhome/src/lang.c145
-rwxr-xr-xhome/src/layout.c922
-rwxr-xr-xhome/src/main.c1478
-rwxr-xr-xhome/src/mapbuf.c250
-rwxr-xr-xhome/src/minictrl.c134
-rwxr-xr-xhome/src/minictrl_manager.c217
-rwxr-xr-xhome/src/minictrl_util.c154
-rwxr-xr-xhome/src/noti_broker.c666
-rw-r--r--home/src/page.c1105
-rw-r--r--home/src/page_info.c139
-rw-r--r--home/src/pkgmgr.c760
-rwxr-xr-xhome/src/popup.c69
-rwxr-xr-xhome/src/power_mode.c412
-rwxr-xr-xhome/src/scroller.c2965
-rwxr-xr-xhome/src/tutorial.c1660
-rwxr-xr-xhome/src/util.c1171
-rwxr-xr-xhome/src/virtual_canvas.c204
-rwxr-xr-xhome/src/win.c146
-rwxr-xr-xhome/src/wms.c262
-rwxr-xr-xhome/src/xml.c376
-rwxr-xr-xpackaging/org.tizen.w-home.spec178
355 files changed, 80666 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..0c603f8
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+Youngsub Ko<ys4610.ko at samsung.com>
+Jin Yoon<jinny.yoon at samsung.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100755
index 0000000..3a169fb
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,5 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+ADD_SUBDIRECTORY(home)
+
+# End of a file
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..703b63c
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1 @@
+Copyright (c) 2013 Samsung Electronics Co., Ltd.
diff --git a/home/CMakeLists.txt b/home/CMakeLists.txt
new file mode 100755
index 0000000..b94f2f4
--- /dev/null
+++ b/home/CMakeLists.txt
@@ -0,0 +1,197 @@
+PROJECT(w-home C)
+
+IF("${ARCH}" STREQUAL "arm")
+ OPTION(RUN_ON_DEVICE "Run on device" ON)
+ ADD_DEFINITIONS("-DRUN_ON_DEVICE")
+ELSE()
+ OPTION(RUN_ON_EMULATOR "Run on emulator" ON)
+ ADD_DEFINITIONS("-DRUN_ON_EMULATOR")
+ENDIF()
+MESSAGE("ARCH: ${ARCH}")
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(PKGS REQUIRED
+ ail
+ appcore-efl
+ aul
+ badge
+ bundle
+ capi-appfw-application
+ capi-media-player
+ capi-media-sound-manager
+ deviced
+ dlog
+ ecore
+ ecore-x
+ ecore-evas
+ ecore-file
+ ecore-imf
+ ecore-input
+ edje
+ eet
+ efl-assist
+ elementary
+ eina
+ evas
+ feedback
+ libxml-2.0
+ dynamicbox_viewer
+ dynamicbox_service
+ minicontrol-viewer
+ minicontrol-monitor
+ minicontrol-handler
+ pkgmgr
+ pkgmgr-info
+ syspopup-caller
+ rua
+ utilX
+ vconf
+ appsvc
+ capi-system-system-settings
+ capi-media-image-util
+ notification
+ capi-message-port
+)
+
+IF(RUN_ON_DEVICE)
+pkg_check_modules(PKGS_ARM REQUIRED
+ dbus-1
+ dbus-glib-1
+ glib-2.0
+ json
+ journal
+ tapi
+)
+ENDIF()
+
+SET(PACKAGE_NAME "org.tizen.${PROJECT_NAME}")
+SET(PREFIX "/usr/apps/${PACKAGE_NAME}")
+SET(BINDIR "${PREFIX}/bin")
+SET(RESDIR "${PREFIX}/res")
+SET(DATADIR "/opt${PREFIX}/data")
+SET(LOCALEDIR "${RESDIR}/locale")
+SET(IMAGEDIR "${RESDIR}/images")
+SET(EDJEDIR "${RESDIR}/edje")
+SET(ICONDIR "/usr/share/icons/default/small")
+
+REMOVE_DEFINITIONS("-DLOG_TAG")
+ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"")
+ADD_DEFINITIONS("-DPROJECT=\"${PROJECT_NAME}\"")
+ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE_NAME}\"")
+ADD_DEFINITIONS("-DVERSION=\"${VERSION}\"")
+ADD_DEFINITIONS("-DDATADIR=\"${DATADIR}\"")
+ADD_DEFINITIONS("-DRESDIR=\"${RESDIR}\"")
+ADD_DEFINITIONS("-DIMAGEDIR=\"${IMAGEDIR}\"")
+ADD_DEFINITIONS("-DEDJEDIR=\"${EDJEDIR}\"")
+ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"")
+ADD_DEFINITIONS("-DDYNAMICBOX_EVAS_RESOURCE_EDJ=\"${EDJEDIR}/dynamicbox.edj\"")
+ADD_DEFINITIONS("-DDYNAMICBOX_EVAS_RESOURCE_PD=\"gbar\"")
+ADD_DEFINITIONS("-DDYNAMICBOX_EVAS_RESOURCE_LB=\"dynamicbox\"")
+ADD_DEFINITIONS("-DDYNAMICBOX_EVAS_RESOURCE_IMG=\"dynamicbox,image\"")
+ADD_DEFINITIONS("-DENABLE_INDICATOR_BRIEFING_VIEW")
+
+IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+ SET(CMAKE_BUILD_TYPE "Release")
+ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
+
+FOREACH(flag ${PKGS_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+FOREACH(flag ${PKGS_ARM_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(PRIVATE_C_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/include")
+SET(CMAKE_C_FLAGS " ${PRIVATE_C_FLAGS} ${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE ${ADD_VIEWER_CFLAGS}")
+SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
+SET(CMAKE_C_FLAGS_RELEASE "-O2")
+
+FIND_PROGRAM(UNAME NAMES uname)
+EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
+
+SET(EXTRA_LDFLAGS "-ldl")
+SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed")
+
+#INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+
+ADD_EXECUTABLE(${PROJECT_NAME}
+ src/bg.c
+ src/clock_shortcut.c
+ src/clock_service.c
+ src/clock_event.c
+ src/clock_manager.c
+ src/clock_inf_dbox.c
+ src/clock_inf_minictrl.c
+ src/clock_manager.c
+ src/clock_util.c
+ src/clock_view.c
+ src/clock_view_cue.c
+ src/clock_view_hidden.c
+ src/clock_view_indicator.c
+ src/db.c
+ src/dbus.c
+ src/dbus_util.c
+ src/edit.c
+ src/effect.c
+ src/power_mode.c
+ src/gesture.c
+ src/index.c
+ src/item_info.c
+ src/key.c
+ src/lang.c
+ src/layout.c
+ src/dbox.c
+ src/dynamicbox_evas.c
+ src/main.c
+ src/mapbuf.c
+ src/noti_broker.c
+ src/minictrl.c
+ src/minictrl_util.c
+ src/minictrl_manager.c
+ src/page.c
+ src/page_info.c
+ src/popup.c
+ src/scroller.c
+ src/tutorial.c
+ src/util.c
+ src/virtual_canvas.c
+ src/win.c
+ src/xml.c
+ src/pkgmgr.c
+ src/add-viewer.c
+ src/add-viewer_pkgmgr.c
+ src/add-viewer_ucol.c
+ src/add-viewer_util.c
+ src/add-viewer_package.c
+ src/wms.c
+ src/apps/bg.c
+ src/apps/db.c
+ src/apps/effect.c
+ src/apps/item.c
+ src/apps/item_badge.c
+ src/apps/item_info.c
+ src/apps/lang.c
+ src/apps/layout.c
+ src/apps/list.c
+ src/apps/apps_main.c
+ src/apps/page.c
+ src/apps/pkgmgr.c
+ src/apps/scroller.c
+ src/apps/xml.c
+ src/critical_log.c
+)
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_LDFLAGS} ${EXTRA_LDFLAGS} -lm -Wl,--hash-style=both -Wl,--as-needed -pie )
+IF(RUN_ON_DEVICE)
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_ARM_LDFLAGS} -lm)
+ENDIF()
+
+# Install
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME ${PACKAGE_NAME})
+
+ADD_SUBDIRECTORY(data)
+ADD_SUBDIRECTORY(res)
+
+# End of a file
diff --git a/home/LICENSE b/home/LICENSE
new file mode 100755
index 0000000..44d83e3
--- /dev/null
+++ b/home/LICENSE
@@ -0,0 +1,204 @@
+Copyright (c) 2009 - 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/home/data/500.w-home.patch.sh b/home/data/500.w-home.patch.sh
new file mode 100644
index 0000000..3d40bfc
--- /dev/null
+++ b/home/data/500.w-home.patch.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+#--------------------------------------
+# W-Home
+#--------------------------------------
+
+# user data
+
+# vconf
+/usr/bin/vconftool set -t int "db/private/org.tizen.w-home/apps_initial_popup" 1 -g 5000 -s org.tizen.w-home
+/usr/bin/vconftool set -t string "memory/homescreen/music_status" ";" -i -g 5000 -f -s system::vconf_system
+
+# db
+
+# smack
diff --git a/home/data/CMakeLists.txt b/home/data/CMakeLists.txt
new file mode 100755
index 0000000..805c9da
--- /dev/null
+++ b/home/data/CMakeLists.txt
@@ -0,0 +1,12 @@
+SET(CHANGEABLEDIR "${PREFIX}/shared/res/tables")
+
+CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}.xml.in ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}.xml)
+INSTALL(FILES ${CMAKE_BINARY_DIR}/${PACKAGE_NAME}.xml DESTINATION /usr/share/packages)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}.efl DESTINATION /etc/smack/accesses.d)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}_ChangeableColorInfo.xml DESTINATION ${CHANGEABLEDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}_ChangeableFontInfo.xml DESTINATION ${CHANGEABLEDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}_apps_ChangeableColorInfo.xml DESTINATION ${CHANGEABLEDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}_apps_ChangeableFontInfo.xml DESTINATION ${CHANGEABLEDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dump_w-home.sh DESTINATION /opt/etc/dump.d/module.d/ PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/home_reset.sh PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ DESTINATION ${RESDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/500.w-home.patch.sh PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ DESTINATION /etc/opt/upgrade)
diff --git a/home/data/dump_w-home.sh b/home/data/dump_w-home.sh
new file mode 100755
index 0000000..453b478
--- /dev/null
+++ b/home/data/dump_w-home.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+W_HOME_DEBUG=$1/w-home
+mkdir -p ${W_HOME_DEBUG}
+/bin/cp -r /tmp/.w-home_log ${W_HOME_DEBUG}/log
diff --git a/home/data/home_reset.sh b/home/data/home_reset.sh
new file mode 100755
index 0000000..a5cd320
--- /dev/null
+++ b/home/data/home_reset.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+#---------------------------------------------
+# w3-home
+#---------------------------------------------
+
+# vconf reset
+/usr/bin/vconftool set -t int "memory/private/org.tizen.w-home/tutorial" 0 -i -g 5000 -f -s org.tizen.w-home
+/usr/bin/vconftool set -t int "db/private/org.tizen.w-home/enabled_tutorial" 1 -g 5000 -f -s org.tizen.w-home
+/usr/bin/vconftool set -t int "db/private/org.tizen.w-home/apps_first_boot" 1 -g 5000 -f -s org.tizen.w-home
+/usr/bin/vconftool set -t int "db/private/org.tizen.w-home/apps_flickup_count" 0 -g 5000 -f -s org.tizen.w-home
+/usr/bin/vconftool set -t int "db/private/org.tizen.w-home/apps_initial_popup" 1 -g 5000 -f -s org.tizen.w-home
+/usr/bin/vconftool set -t string "db/private/org.tizen.w-home/logging" ";" -g 5000 -f -s csystem::vconf_system
+/usr/bin/vconftool set -t int "memory/homescreen/clock_visibility" 0 -i -g 5000 -f -s system::vconf_system
+/usr/bin/vconftool set -t string "memory/homescreen/music_status" ";" -i -g 5000 -f -s system::vconf_system
+/usr/bin/vconftool set -t int "memory/private/org.tizen.w-home/auto_feed" 1 -i -g 5000 -f -s org.tizen.w-home
+/usr/bin/vconftool set -t int "memory/private/org.tizen.w-home/sensitive_move" 1 -i -g 5000 -f -s org.tizen.w-home
+
+#badge DB reset
+/usr/bin/sqlite3 /opt/dbspace/.badge.db "delete from badge_data; delete from badge_option; VACUUM;"
diff --git a/home/data/org.tizen.w-home.efl b/home/data/org.tizen.w-home.efl
new file mode 100644
index 0000000..7655cb2
--- /dev/null
+++ b/home/data/org.tizen.w-home.efl
@@ -0,0 +1,82 @@
+org.tizen.w-home device::app_logging -w---- ------
+org.tizen.w-home system::use_internet r----- ------
+org.tizen.w-home net-config r----- ------
+org.tizen.w-home xorg rw---- ------
+org.tizen.w-home isf rwx--- ------
+org.tizen.w-home sound_server rw---- ------
+org.tizen.w-home syspopup::db rw---- ------
+org.tizen.w-home dbus rwx--- ------
+org.tizen.w-home pulseaudio rwxat- ------
+org.tizen.w-home ail::db rw---- ------
+org.tizen.w-home connman r----- ------
+org.tizen.w-home system rwx--- ------
+org.tizen.w-home immvibed rw---- ------
+org.tizen.w-home svi-data r-x--- ------
+org.tizen.w-home e17 r-x--- ------
+org.tizen.w-home system::vconf rwxat- ------
+org.tizen.w-home system::vconf_setting rwx--l ------
+org.tizen.w-home system::vconf_inhouse rw---- ------
+org.tizen.w-home system::vconf_system rwxat- ------
+org.tizen.w-home system::vconf_multimedia rw---- ------
+org.tizen.w-home system::vconf_network rwxat- ------
+org.tizen.w-home org.tizen.shealth::vconf rwxat- ------
+org.tizen.w-home deviced rwx--- ------
+org.tizen.w-home deviced::display rw---- ------
+org.tizen.w-home testmode::vconf r----- ------
+org.tizen.w-home data-provider-master::db rw---- ------
+org.tizen.w-home data-provider-master::share rwxat- ------
+org.tizen.w-home data-provider-master::client rw---- ------
+org.tizen.w-home data-provider-master::data r-x--- ------
+org.tizen.w-home data-provider-master rw---- ------
+org.tizen.w-home org.tizen.alarm rwx--- ------
+org.tizen.w-home org.tizen.message rwx--- ------
+org.tizen.w-home org.tizen.setting::system rwx--- ------
+org.tizen.w-home org.tizen.wfmd rwx--- ------
+org.tizen.w-home org.tizen.w-media-controller rwx--- ------
+org.tizen.w-home org.tizen.w-music-player rwx--- ------
+org.tizen.w-home org.tizen.wnotification2 rwx--- ------
+org.tizen.w-home pkgmgr::db rwx--l ------
+org.tizen.w-home pkgmgr-client r-x--- ------
+org.tizen.w-home pkgmgr::svc r-x--- ------
+org.tizen.w-home pkgmgr::info r----- ------
+org.tizen.w-home efreet rwx--- ------
+org.tizen.w-home org.tizen.shealth rwx--- ------
+org.tizen.w-home org.tizen.w-contacts2 rwx--- ------
+org.tizen.w-home org.tizen.dailybriefing-weather rwx--- ------
+org.tizen.w-home org.tizen.w-calendar2 rwx--- ------
+org.tizen.w-home org.tizen.clocksetting rwx--- ------
+org.tizen.w-home org.tizen.clocksetting::default-resources r-x--- ------
+org.tizen.w-home org.tizen.w-idle-clock-weather2 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-pedometer rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style01 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style02 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style03 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style04 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style05 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style06 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style07 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style08 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style09 rwx--- ------
+org.tizen.w-home org.tizen.idle-clock-style10 rwx--- ------
+org.tizen.w-home badge::db rw---- ------
+org.tizen.w-home data-provider-master::badge rw---- ------
+org.tizen.w-home data-provider-master::badge.client -w---- ------
+org.tizen.w-home aul::launch --x--- ------
+org.tizen.w-home aul::terminate --x--- ------
+org.tizen.w-home csc-feature r----- ------
+org.tizen.w-home web-card-daemon.cardview rwxat- ------
+org.tizen.w-home web-card-viewer.cardview rwxat- ------
+aul org.tizen.w-home r-x--- ------
+dbus org.tizen.w-home rwx--- ------
+system org.tizen.w-home -w---- ------
+org.tizen.w-home system::homedir rwxat- ------
+org.tizen.w-home system::media rwxat- ------
+org.tizen.w-home system::share rwxat- ------
+e17 org.tizen.w-home -w---- ------
+org.tizen.w-home sys-assert::core rwxat- ------
+stest-service org.tizen.w-home r-x--- ------
+org.tizen.w-home stest-service -w---- ------
+org.tizen.w-home privacy-manager::db r----l ------
+org.tizen.w-home system::vconf_privacy rw---- ------
+org.tizen.w-home system::vconf_misc rw---- ------
+org.tizen.w-home ecore::lock rwxat- ------
diff --git a/home/data/org.tizen.w-home.xml.in b/home/data/org.tizen.w-home.xml.in
new file mode 100755
index 0000000..ddd65f0
--- /dev/null
+++ b/home/data/org.tizen.w-home.xml.in
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" package="@PACKAGE_NAME@" version="0.1.0" install-location="internal-only" support-mode="screen-reader" support-reset="true|res/home_reset.sh">
+ <label>W-Home</label>
+ <author email="ys4610.ko@samsung.com" href="www.samsung.com">Youngsub Ko</author>
+ <author email="jinny.yoon@samsung.com" href="www.samsung.com">Jin Yoon</author>
+ <description>W-Home Application</description>
+ <ui-application appid="@PACKAGE_NAME@" exec="@BINDIR@/@PROJECT_NAME@" nodisplay="true" multiple="false" type="capp" taskmanage="false" process-pool="false">
+ <category name="http://tizen.org/category/homeapp"></category>
+ <icon>org.tizen.w-home.png</icon>
+ <icon section="small">org.tizen.w-home.small.png</icon>
+ <label>W-Home</label>
+ </ui-application>
+ <privileges>
+ <privilege>http://tizen.org/privilege/setting</privilege>
+ <privilege>http://tizen.org/privilege/power</privilege>
+ <privilege>http://tizen.org/privilege/notification</privilege>
+ <privilege>http://tizen.org/privilege/application.launch</privilege>
+ <privilege>http://tizen.org/privilege/messaging.read</privilege>
+ <privilege>http://tizen.org/privilege/messaging.write</privilege>
+ <privilege>http://tizen.org/privilege/contact.read</privilege>
+ </privileges>
+</manifest>
diff --git a/home/data/org.tizen.w-home_ChangeableColorInfo.xml b/home/data/org.tizen.w-home_ChangeableColorInfo.xml
new file mode 100755
index 0000000..01fba63
--- /dev/null
+++ b/home/data/org.tizen.w-home_ChangeableColorInfo.xml
@@ -0,0 +1,353 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ChangeableColorTable num="1">
+ <Theme style="Dark">
+ <ChangeableColorInfo id="AO0111" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0112" inputColor="-" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0121L1" inputColor="-" hue="131" saturation="89" value="75" alpha="100" />
+ <ChangeableColorInfo id="AO0121L1P" inputColor="-" hue="131" saturation="89" value="75" alpha="50" />
+ <ChangeableColorInfo id="AO0121L2" inputColor="-" hue="192" saturation="96" value="88" alpha="100" />
+ <ChangeableColorInfo id="AO0121L2P" inputColor="-" hue="192" saturation="96" value="88" alpha="50" />
+ <ChangeableColorInfo id="AO0121L3" inputColor="-" hue="206" saturation="90" value="93" alpha="100" />
+ <ChangeableColorInfo id="AO0121L3P" inputColor="-" hue="206" saturation="90" value="93" alpha="50" />
+ <ChangeableColorInfo id="AO0121L4" inputColor="-" hue="38" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0121L4P" inputColor="-" hue="38" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO0121L5" inputColor="-" hue="27" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0121L5P" inputColor="-" hue="27" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO0121L6" inputColor="-" hue="14" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0121L6P" inputColor="-" hue="14" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO0121L7" inputColor="-" hue="268" saturation="62" value="94" alpha="100" />
+ <ChangeableColorInfo id="AO0121L7P" inputColor="-" hue="268" saturation="62" value="94" alpha="50" />
+ <ChangeableColorInfo id="AO0121L8" inputColor="-" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO0121L8P" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0122L1" inputColor="-" hue="0" saturation="0" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0122L2" inputColor="-" hue="0" saturation="0" value="24" alpha="100" />
+ <ChangeableColorInfo id="AO0123L1" inputColor="-" hue="0" saturation="0" value="20" alpha="100" />
+ <ChangeableColorInfo id="AO0123L2" inputColor="-" hue="0" saturation="0" value="63" alpha="100" />
+ <ChangeableColorInfo id="AO013L1" inputColor="-" hue="25" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO013L2" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO014" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO14P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO014P" inputColor="-" hue="0" saturation="0" value="98" alpha="50" />
+ <ChangeableColorInfo id="AO0151" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0151P" inputColor="K" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0151D" inputColor="K" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0152" inputColor="W" hue="0" saturation="0" value="0" alpha="30" />
+ <ChangeableColorInfo id="AO0152P" inputColor="W" hue="0" saturation="0" value="0" alpha="15" />
+ <ChangeableColorInfo id="AO0152D" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO0161" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0161P" inputColor="K" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0161D" inputColor="K" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0162" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO0162P" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO0162D" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO021" inputColor="-" hue="0" saturation="0" value="50" alpha="100" />
+ <ChangeableColorInfo id="AO021S" inputColor="3" hue="4" saturation="66" value="65" alpha="100" />
+ <ChangeableColorInfo id="AO022" inputColor="1" hue="-2" saturation="29" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO023" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO024" inputColor="-" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO024P" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0251L1" inputColor="-" hue="0" saturation="0" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0251L2" inputColor="-" hue="0" saturation="0" value="24" alpha="100" />
+ <ChangeableColorInfo id="AO0252L1" inputColor="-" hue="0" saturation="0" value="20" alpha="100" />
+ <ChangeableColorInfo id="AO0252L2" inputColor="-" hue="0" saturation="0" value="63" alpha="100" />
+ <ChangeableColorInfo id="AO031" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO032" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0321" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO032S" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO033" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO033P" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO034" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO034P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO035" inputColor="-" hue="177" saturation="9" value="87" alpha="100" />
+ <ChangeableColorInfo id="AO035P" inputColor="-" hue="177" saturation="9" value="87" alpha="50" />
+ <ChangeableColorInfo id="AO041" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO042" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO043" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L1" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L2" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L3" inputColor="-" hue="0" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO045" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO046" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO047" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0481" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0482" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO051S" inputColor="-" hue="82" saturation="92" value="92" alpha="90" />
+ <ChangeableColorInfo id="AO051" inputColor="-" hue="0" saturation="0" value="-5" alpha="90" />
+ <ChangeableColorInfo id="AO051D" inputColor="-" hue="82" saturation="92" value="92" alpha="50" />
+ <ChangeableColorInfo id="AO052L1S" inputColor="-" hue="-33" saturation="-27" value="-2" alpha="100" />
+ <ChangeableColorInfo id="AO052L1" inputColor="-" hue="-33" saturation="-27" value="-2" alpha="100" />
+ <ChangeableColorInfo id="AO052L1D" inputColor="-" hue="-33" saturation="-27" value="-2" alpha="100" />
+ <ChangeableColorInfo id="AO052L2S" inputColor="-" hue="49" saturation="65" value="63" alpha="100" />
+ <ChangeableColorInfo id="AO052L2" inputColor="-" hue="0" saturation="-8" value="18" alpha="100" />
+ <ChangeableColorInfo id="AO052L2D" inputColor="-" hue="49" saturation="65" value="63" alpha="50" />
+ <ChangeableColorInfo id="AO053" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO0531" inputColor="-" hue="194" saturation="35" value="33" alpha="100" />
+ <ChangeableColorInfo id="AO054L1S" inputColor="-" hue="196" saturation="100" value="11" alpha="100" />
+ <ChangeableColorInfo id="AO054L1" inputColor="-" hue="196" saturation="100" value="11" alpha="100" />
+ <ChangeableColorInfo id="AO054L1D" inputColor="-" hue="196" saturation="100" value="11" alpha="50" />
+ <ChangeableColorInfo id="AO054L2S" inputColor="-" hue="76" saturation="100" value="92" alpha="90" />
+ <ChangeableColorInfo id="AO054L2" inputColor="-" hue="0" saturation="0" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO054L2D" inputColor="-" hue="0" saturation="0" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO056L1" inputColor="K" hue="0" saturation="0" value="10" alpha="100" />
+ <ChangeableColorInfo id="AO056L1P" inputColor="K" hue="0" saturation="0" value="10" alpha="50" />
+ <ChangeableColorInfo id="AO056L2" inputColor="K" hue="0" saturation="0" value="30" alpha="100" />
+ <ChangeableColorInfo id="AO056L2P" inputColor="K" hue="0" saturation="0" value="30" alpha="50" />
+ <ChangeableColorInfo id="AO056L3" inputColor="-" hue="76" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO056L3P" inputColor="-" hue="76" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO056L4" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO056L4P" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO056L5" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO056L5P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO057" inputColor="K" hue="0" saturation="0" value="22" alpha="100" />
+ <ChangeableColorInfo id="AO058" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO058P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO058D" inputColor="W" hue="0" saturation="0" value="0" alpha="15" />
+ <ChangeableColorInfo id="AO061" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO062" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO062P" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO063" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO064" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO064P" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO065" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO0661" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO0662" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0663" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO0664" inputColor="-" hue="0" saturation="0" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO081S" inputColor="-" hue="78" saturation="100" value="100" alpha="30" />
+ <ChangeableColorInfo id="AO081" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO081D" inputColor="-" hue="210" saturation="1" value="84" alpha="15" />
+ <ChangeableColorInfo id="AO082" inputColor="W" hue="0" saturation="0" value="0" alpha="70" />
+ <ChangeableColorInfo id="AO082P" inputColor="W" hue="0" saturation="0" value="-48" alpha="100" />
+ <ChangeableColorInfo id="AO082D" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO083L1" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO083L1P" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO083L2" inputColor="-" hue="76" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO083L2P" inputColor="-" hue="76" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO084L1" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO084L1P" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO084L2" inputColor="K" hue="0" saturation="0" value="62" alpha="70" />
+ <ChangeableColorInfo id="AO084L2P" inputColor="K" hue="0" saturation="0" value="62" alpha="35" />
+ <ChangeableColorInfo id="AO085L1" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO085L2" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO086L1" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO086L1P" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO086L2" inputColor="W" hue="0" saturation="0" value="0" alpha="70" />
+ <ChangeableColorInfo id="AO086L2P" inputColor="W" hue="0" saturation="0" value="0" alpha="35" />
+ <ChangeableColorInfo id="AT0111" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0112" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0121" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0121P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT0122" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0122P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT0131" inputColor="-" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0132" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0133" inputColor="-" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0134" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT014" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT014P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT014D" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AT021" inputColor="2" hue="0" saturation="0" value="98" alpha="100" fixedHue="true" fixedSaturation="true" fixedValue="true" />
+ <ChangeableColorInfo id="AT0311" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0312" inputColor="-" hue="0" saturation="0" value="100" alpha="50" />
+ <ChangeableColorInfo id="AT041S" inputColor="-" hue="78" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AT041" inputColor="W" hue="0" saturation="0" value="0" alpha="60" />
+ <ChangeableColorInfo id="AT041D" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT043" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT043" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT043P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT043D" inputColor="W" hue="0" saturation="0" value="0" alpha="15" />
+ <ChangeableColorInfo id="AT045" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT045P" inputColor="W" hue="0" saturation="0" value="-48" alpha="100" />
+ <ChangeableColorInfo id="AT054" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT054P" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT054D" inputColor="K" hue="0" saturation="0" value="0" alpha="8" />
+ <ChangeableColorInfo id="AT055" inputColor="-" hue="76" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AT055P" inputColor="-" hue="76" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AT056" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT056P" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT057" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="B018E" inputColor="3" hue="4" saturation="66" value="65" alpha="70" />
+ <ChangeableColorInfo id="B019" inputColor="3" hue="4" saturation="66" value="65" alpha="100" />
+ </Theme>
+ <Theme style="Light">
+ <ChangeableColorInfo id="AO0111" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0112" inputColor="-" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0121L1" inputColor="-" hue="131" saturation="89" value="75" alpha="100" />
+ <ChangeableColorInfo id="AO0121L1P" inputColor="-" hue="131" saturation="89" value="75" alpha="50" />
+ <ChangeableColorInfo id="AO0121L2" inputColor="-" hue="192" saturation="96" value="88" alpha="100" />
+ <ChangeableColorInfo id="AO0121L2P" inputColor="-" hue="192" saturation="96" value="88" alpha="50" />
+ <ChangeableColorInfo id="AO0121L3" inputColor="-" hue="206" saturation="90" value="93" alpha="100" />
+ <ChangeableColorInfo id="AO0121L3P" inputColor="-" hue="206" saturation="90" value="93" alpha="50" />
+ <ChangeableColorInfo id="AO0121L4" inputColor="-" hue="38" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0121L4P" inputColor="-" hue="38" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO0121L5" inputColor="-" hue="27" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0121L5P" inputColor="-" hue="27" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO0121L6" inputColor="-" hue="14" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0121L6P" inputColor="-" hue="14" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO0121L7" inputColor="-" hue="268" saturation="62" value="94" alpha="100" />
+ <ChangeableColorInfo id="AO0121L7P" inputColor="-" hue="268" saturation="62" value="94" alpha="50" />
+ <ChangeableColorInfo id="AO0121L8" inputColor="-" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO0121L8P" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0122L1" inputColor="-" hue="0" saturation="0" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0122L2" inputColor="-" hue="0" saturation="0" value="24" alpha="100" />
+ <ChangeableColorInfo id="AO0123L1" inputColor="-" hue="0" saturation="0" value="20" alpha="100" />
+ <ChangeableColorInfo id="AO0123L2" inputColor="-" hue="0" saturation="0" value="63" alpha="100" />
+ <ChangeableColorInfo id="AO013L1" inputColor="-" hue="25" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO013L2" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO014" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO14P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO014P" inputColor="-" hue="0" saturation="0" value="98" alpha="50" />
+ <ChangeableColorInfo id="AO0151" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0151P" inputColor="K" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0151D" inputColor="K" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0152" inputColor="W" hue="0" saturation="0" value="0" alpha="30" />
+ <ChangeableColorInfo id="AO0152P" inputColor="W" hue="0" saturation="0" value="0" alpha="15" />
+ <ChangeableColorInfo id="AO0152D" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO0161" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0161P" inputColor="K" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0161D" inputColor="K" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0162" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO0162P" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO0162D" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO021" inputColor="-" hue="0" saturation="0" value="50" alpha="100" />
+ <ChangeableColorInfo id="AO021S" inputColor="3" hue="4" saturation="66" value="65" alpha="100" />
+ <ChangeableColorInfo id="AO022" inputColor="1" hue="-2" saturation="29" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO023" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO024" inputColor="-" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO024P" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0251L1" inputColor="-" hue="0" saturation="0" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO0251L2" inputColor="-" hue="0" saturation="0" value="24" alpha="100" />
+ <ChangeableColorInfo id="AO0252L1" inputColor="-" hue="0" saturation="0" value="20" alpha="100" />
+ <ChangeableColorInfo id="AO0252L2" inputColor="-" hue="0" saturation="0" value="63" alpha="100" />
+ <ChangeableColorInfo id="AO031" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO032" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0321" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO032S" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO033" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO033P" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO034" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO034P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO035" inputColor="-" hue="177" saturation="8" value="87" alpha="100" />
+ <ChangeableColorInfo id="AO035P" inputColor="-" hue="177" saturation="9" value="87" alpha="50" />
+ <ChangeableColorInfo id="AO041" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO042" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO043" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L1" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L2" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L3" inputColor="-" hue="0" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO045" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO046" inputColor="-" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO047" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0481" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0482" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO051S" inputColor="-" hue="82" saturation="92" value="92" alpha="90" />
+ <ChangeableColorInfo id="AO051" inputColor="-" hue="0" saturation="0" value="-5" alpha="90" />
+ <ChangeableColorInfo id="AO051D" inputColor="-" hue="82" saturation="92" value="92" alpha="50" />
+ <ChangeableColorInfo id="AO052L1S" inputColor="-" hue="-33" saturation="-27" value="-2" alpha="100" />
+ <ChangeableColorInfo id="AO052L1" inputColor="-" hue="-33" saturation="-27" value="-2" alpha="100" />
+ <ChangeableColorInfo id="AO052L1D" inputColor="-" hue="-33" saturation="-27" value="-2" alpha="100" />
+ <ChangeableColorInfo id="AO052L2S" inputColor="-" hue="49" saturation="65" value="63" alpha="100" />
+ <ChangeableColorInfo id="AO052L2" inputColor="-" hue="0" saturation="-8" value="18" alpha="100" />
+ <ChangeableColorInfo id="AO052L2D" inputColor="-" hue="49" saturation="65" value="63" alpha="50" />
+ <ChangeableColorInfo id="AO053" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO0531" inputColor="-" hue="194" saturation="35" value="33" alpha="100" />
+ <ChangeableColorInfo id="AO054L1S" inputColor="-" hue="196" saturation="100" value="11" alpha="100" />
+ <ChangeableColorInfo id="AO054L1" inputColor="-" hue="196" saturation="100" value="11" alpha="100" />
+ <ChangeableColorInfo id="AO054L1D" inputColor="-" hue="196" saturation="100" value="11" alpha="50" />
+ <ChangeableColorInfo id="AO054L2S" inputColor="-" hue="76" saturation="100" value="92" alpha="90" />
+ <ChangeableColorInfo id="AO054L2" inputColor="-" hue="0" saturation="0" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO054L2D" inputColor="-" hue="0" saturation="0" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO056L1" inputColor="K" hue="0" saturation="0" value="10" alpha="100" />
+ <ChangeableColorInfo id="AO056L1P" inputColor="K" hue="0" saturation="0" value="10" alpha="50" />
+ <ChangeableColorInfo id="AO056L2" inputColor="K" hue="0" saturation="0" value="30" alpha="100" />
+ <ChangeableColorInfo id="AO056L2P" inputColor="K" hue="0" saturation="0" value="30" alpha="50" />
+ <ChangeableColorInfo id="AO056L3" inputColor="-" hue="76" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO056L3P" inputColor="-" hue="76" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO056L4" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO056L4P" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO056L5" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO056L5P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO057" inputColor="K" hue="0" saturation="0" value="22" alpha="100" />
+ <ChangeableColorInfo id="AO058" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO058P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO058D" inputColor="W" hue="0" saturation="0" value="0" alpha="15" />
+ <ChangeableColorInfo id="AO061" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO062" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO062P" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO063" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO064" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO064P" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO065" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO0661" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO0662" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0663" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO0664" inputColor="-" hue="0" saturation="0" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO081S" inputColor="-" hue="78" saturation="100" value="100" alpha="30" />
+ <ChangeableColorInfo id="AO081" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO081D" inputColor="-" hue="210" saturation="1" value="84" alpha="15" />
+ <ChangeableColorInfo id="AO082" inputColor="W" hue="0" saturation="0" value="0" alpha="70" />
+ <ChangeableColorInfo id="AO082P" inputColor="W" hue="0" saturation="0" value="-48" alpha="100" />
+ <ChangeableColorInfo id="AO082D" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO083L1" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO083L1P" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO083L2" inputColor="-" hue="76" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO083L2P" inputColor="-" hue="76" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AO084L1" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO084L1P" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO084L2" inputColor="K" hue="0" saturation="0" value="62" alpha="70" />
+ <ChangeableColorInfo id="AO084L2P" inputColor="K" hue="0" saturation="0" value="62" alpha="35" />
+ <ChangeableColorInfo id="AO085L1" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO085L2" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO086L1" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO086L1P" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO086L2" inputColor="W" hue="0" saturation="0" value="0" alpha="70" />
+ <ChangeableColorInfo id="AO086L2P" inputColor="W" hue="0" saturation="0" value="0" alpha="35" />
+ <ChangeableColorInfo id="AT0111" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0112" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0121" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0121P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT0122" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0122P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT0131" inputColor="-" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0132" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0133" inputColor="-" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0134" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT014" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT014P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT014D" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AT021" inputColor="2" hue="-3" saturation="20" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0311" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0312" inputColor="-" hue="0" saturation="0" value="100" alpha="50" />
+ <ChangeableColorInfo id="AT041S" inputColor="-" hue="78" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AT041" inputColor="W" hue="0" saturation="0" value="0" alpha="60" />
+ <ChangeableColorInfo id="AT041D" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT043" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT043" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT043P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT043D" inputColor="W" hue="0" saturation="0" value="0" alpha="15" />
+ <ChangeableColorInfo id="AT045" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT045P" inputColor="W" hue="0" saturation="0" value="-48" alpha="100" />
+ <ChangeableColorInfo id="AT054" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT054P" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT054D" inputColor="K" hue="0" saturation="0" value="0" alpha="8" />
+ <ChangeableColorInfo id="AT055" inputColor="-" hue="76" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AT055P" inputColor="-" hue="76" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AT056" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT056P" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT057" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="B018E" inputColor="3" hue="4" saturation="66" value="65" alpha="70" />
+ <ChangeableColorInfo id="B019" inputColor="3" hue="4" saturation="66" value="65" alpha="100" />
+ </Theme>
+</ChangeableColorTable>
+<ChangeableColorTable num="2">
+ <Theme style="Dark">
+ </Theme>
+ <Theme style="Light">
+ </Theme>
+</ChangeableColorTable>
+<ChangeableColorTable num="3">
+ <Theme style="Dark">
+ </Theme>
+ <Theme style="Light">
+ </Theme>
+</ChangeableColorTable>
diff --git a/home/data/org.tizen.w-home_ChangeableFontInfo.xml b/home/data/org.tizen.w-home_ChangeableFontInfo.xml
new file mode 100755
index 0000000..2fecf7a
--- /dev/null
+++ b/home/data/org.tizen.w-home_ChangeableFontInfo.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<FontInfoTable>
+ <FontInfo id="AT0111" style="L" size="106" />
+ <FontInfo id="AT0112" style="R" size="36" />
+ <FontInfo id="AT0121" style="R" size="28" />
+ <FontInfo id="AT0121P" style="R" size="28" />
+ <FontInfo id="AT0122" style="R" size="25" />
+ <FontInfo id="AT0122P" style="R" size="25" />
+ <FontInfo id="AT0132" style="M" size="35" />
+ <FontInfo id="AT0134" style="M" size="32" />
+ <FontInfo id="AT014" style="R" size="32" />
+ <FontInfo id="AT014P" style="R" size="32" />
+ <FontInfo id="AT014D" style="R" size="32" />
+ <FontInfo id="AT021" style="R" size="28" />
+ <FontInfo id="AT0311" style="R" size="32" />
+ <FontInfo id="AT0312" style="R" size="32" />
+ <FontInfo id="AT041S" style="R" size="28" />
+ <FontInfo id="AT041" style="R" size="28" />
+ <FontInfo id="AT043" style="R" size="32" />
+ <FontInfo id="AT043P" style="R" size="32" />
+ <FontInfo id="AT043D" style="R" size="32" />
+ <FontInfo id="AT045" style="R" size="32" />
+ <FontInfo id="AT045P" style="R" size="32" />
+ <FontInfo id="AT052S" style="R" size="22" />
+ <FontInfo id="AT052" style="R" size="22" />
+ <FontInfo id="AT053S" style="R" size="28" />
+ <FontInfo id="AT053" style="R" size="28" />
+ <FontInfo id="AT054" style="R" size="28" />
+ <FontInfo id="AT054P" style="R" size="28" />
+ <FontInfo id="AT054D" style="R" size="28" />
+ <FontInfo id="AT055" style="R" size="32" />
+ <FontInfo id="AT055P" style="R" size="32" />
+ <FontInfo id="AT056" style="R" size="32" />
+ <FontInfo id="AT056P" style="R" size="32" />
+ <FontInfo id="AT057" style="R" size="32" />
+</FontInfoTable>
diff --git a/home/data/org.tizen.w-home_apps_ChangeableColorInfo.xml b/home/data/org.tizen.w-home_apps_ChangeableColorInfo.xml
new file mode 100755
index 0000000..6b91984
--- /dev/null
+++ b/home/data/org.tizen.w-home_apps_ChangeableColorInfo.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ChangeableColorTables>
+ <ChangeableColorTable num="1">
+ <Theme style="Dark">
+ <ChangeableColorInfo id="AO0111" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO013L1" inputColor="-" hue="25" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO013L2" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO014" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO14P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0151" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0151P" inputColor="K" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0151D" inputColor="K" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0152" inputColor="W" hue="0" saturation="0" value="0" alpha="30" />
+ <ChangeableColorInfo id="AO0152P" inputColor="W" hue="0" saturation="0" value="0" alpha="15" />
+ <ChangeableColorInfo id="AO0152D" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO0161" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0161P" inputColor="K" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0161D" inputColor="K" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0162" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO0162P" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO0162D" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO017" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO017P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO017D" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO021" inputColor="-" hue="0" saturation="0" value="50" alpha="100" />
+ <ChangeableColorInfo id="AO021S" inputColor="3" hue="4" saturation="66" value="65" alpha="100" />
+ <ChangeableColorInfo id="AO023" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO032" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0321" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO033" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO033P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO034" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO034P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO035" inputColor="-" hue="177" saturation="9" value="87" alpha="100" />
+ <ChangeableColorInfo id="AO035P" inputColor="-" hue="177" saturation="9" value="87" alpha="50" />
+ <ChangeableColorInfo id="AO042" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO043" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L1" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L2" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L3" inputColor="-" hue="0" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO045" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO047" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0481" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0482" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO061" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO062" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO062P" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO063" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO064" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO064P" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO065" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO0661" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO0662" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0663" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT0111" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0112" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0121" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0121P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT0122" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0122P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT0132" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0134" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT014" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT014P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT014D" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AT021" inputColor="2" hue="0" saturation="0" value="98" alpha="100" fixedHue="true" fixedSaturation="true" fixedValue="true" />
+ <ChangeableColorInfo id="AT0311" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT045" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT045P" inputColor="W" hue="0" saturation="0" value="-48" alpha="100" />
+ <ChangeableColorInfo id="AT055" inputColor="-" hue="76" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AT055P" inputColor="-" hue="76" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AT056" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT056P" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT057" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ </Theme>
+ <Theme style="Light">
+ <ChangeableColorInfo id="AO0111" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO013L1" inputColor="-" hue="25" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO013L2" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO014" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO14P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0151" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0151P" inputColor="K" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0151D" inputColor="K" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0152" inputColor="W" hue="0" saturation="0" value="0" alpha="30" />
+ <ChangeableColorInfo id="AO0152P" inputColor="W" hue="0" saturation="0" value="0" alpha="15" />
+ <ChangeableColorInfo id="AO0152D" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO0161" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO0161P" inputColor="K" hue="0" saturation="0" value="0" alpha="65" />
+ <ChangeableColorInfo id="AO0161D" inputColor="K" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0162" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO0162P" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO0162D" inputColor="-" hue="210" saturation="1" value="84" alpha="30" />
+ <ChangeableColorInfo id="AO017" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO017P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO017D" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO021" inputColor="-" hue="0" saturation="0" value="50" alpha="100" />
+ <ChangeableColorInfo id="AO021S" inputColor="3" hue="4" saturation="66" value="65" alpha="100" />
+ <ChangeableColorInfo id="AO023" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO032" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0321" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO033" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO033P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO034" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO034P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO035" inputColor="-" hue="177" saturation="8" value="87" alpha="100" />
+ <ChangeableColorInfo id="AO035P" inputColor="-" hue="177" saturation="9" value="87" alpha="50" />
+ <ChangeableColorInfo id="AO042" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO043" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L1" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L2" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO044L3" inputColor="-" hue="0" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AO045" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO047" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0481" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AO0482" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO061" inputColor="K" hue="0" saturation="0" value="0" alpha="40" />
+ <ChangeableColorInfo id="AO062" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO062P" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO063" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO064" inputColor="K" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AO064P" inputColor="K" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO065" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AO0661" inputColor="W" hue="0" saturation="0" value="0" alpha="10" />
+ <ChangeableColorInfo id="AO0662" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AO0663" inputColor="K" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT0111" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0112" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0121" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0121P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT0122" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0122P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT0132" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0134" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT014" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT014P" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT014D" inputColor="W" hue="0" saturation="0" value="0" alpha="20" />
+ <ChangeableColorInfo id="AT021" inputColor="2" hue="-3" saturation="20" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT0311" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT045" inputColor="W" hue="0" saturation="0" value="0" alpha="100" />
+ <ChangeableColorInfo id="AT045P" inputColor="W" hue="0" saturation="0" value="-48" alpha="100" />
+ <ChangeableColorInfo id="AT055" inputColor="-" hue="76" saturation="100" value="100" alpha="100" />
+ <ChangeableColorInfo id="AT055P" inputColor="-" hue="76" saturation="100" value="100" alpha="50" />
+ <ChangeableColorInfo id="AT056" inputColor="W" hue="0" saturation="0" value="0" alpha="50" />
+ <ChangeableColorInfo id="AT056P" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ <ChangeableColorInfo id="AT057" inputColor="W" hue="0" saturation="0" value="0" alpha="25" />
+ </Theme>
+ </ChangeableColorTable>
+ <ChangeableColorTable num="2">
+ <Theme style="Dark">
+ </Theme>
+ <Theme style="Light">
+ </Theme>
+ </ChangeableColorTable>
+ <ChangeableColorTable num="3">
+ <Theme style="Dark">
+ </Theme>
+ <Theme style="Light">
+ </Theme>
+ </ChangeableColorTable>
+</ChangeableColorTables>
diff --git a/home/data/org.tizen.w-home_apps_ChangeableFontInfo.xml b/home/data/org.tizen.w-home_apps_ChangeableFontInfo.xml
new file mode 100755
index 0000000..4a18b5b
--- /dev/null
+++ b/home/data/org.tizen.w-home_apps_ChangeableFontInfo.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<FontInfoTable>
+ <FontInfo id="AT0111" style="L" size="106" />
+ <FontInfo id="AT0112" style="R" size="36" />
+ <FontInfo id="AT0121" style="R" size="28" />
+ <FontInfo id="AT0121P" style="R" size="28" />
+ <FontInfo id="AT0122" style="R" size="25" />
+ <FontInfo id="AT0122P" style="R" size="25" />
+ <FontInfo id="AT0132" style="M" size="35" />
+ <FontInfo id="AT0134" style="M" size="32" />
+ <FontInfo id="AT014" style="R" size="32" />
+ <FontInfo id="AT014P" style="R" size="32" />
+ <FontInfo id="AT014D" style="R" size="32" />
+ <FontInfo id="AT021" style="R" size="28" />
+ <FontInfo id="AT0311" style="R" size="32" />
+ <FontInfo id="AT043" style="R" size="32" />
+ <FontInfo id="AT043P" style="R" size="32" />
+ <FontInfo id="AT043D" style="R" size="32" />
+ <FontInfo id="AT045" style="R" size="32" />
+ <FontInfo id="AT045P" style="R" size="32" />
+ <FontInfo id="AT054" style="R" size="28" />
+ <FontInfo id="AT054P" style="R" size="28" />
+ <FontInfo id="AT054D" style="R" size="28" />
+ <FontInfo id="AT055" style="R" size="32" />
+ <FontInfo id="AT055P" style="R" size="32" />
+ <FontInfo id="AT056" style="R" size="32" />
+ <FontInfo id="AT056P" style="R" size="32" />
+ <FontInfo id="AT057" style="R" size="32" />
+</FontInfoTable>
diff --git a/home/include/add-viewer.h b/home/include/add-viewer.h
new file mode 100644
index 0000000..a78271d
--- /dev/null
+++ b/home/include/add-viewer.h
@@ -0,0 +1,49 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Smart callback
+ * "selected"
+ * "dnd"
+ */
+
+struct add_viewer_event_info {
+ struct {
+ Evas_Object *obj;
+ } move;
+
+ struct {
+ const char *dbox_id;
+ const char *content;
+ int size_type;
+ int duplicated;
+ Evas_Object *image;
+ } pkg_info;
+};
+
+enum ADD_VIEWER_CONF_OPTION {
+ ADD_VIEWER_CONF_DND = 0x01
+};
+
+extern void evas_object_add_viewer_init(void);
+extern void evas_object_add_viewer_fini(void);
+extern Evas_Object *evas_object_add_viewer_add(Evas_Object *parent);
+extern void evas_object_add_viewer_conf_set(int type, int flag);
+extern int evas_object_add_viewer_access_action(Evas_Object *obj, int type, void *info);
+extern int evas_object_add_viewer_reload(void);
+
+/* End of a file */
diff --git a/home/include/add-viewer_debug.h b/home/include/add-viewer_debug.h
new file mode 100755
index 0000000..a2ef5c5
--- /dev/null
+++ b/home/include/add-viewer_debug.h
@@ -0,0 +1,88 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#if !defined(SECURE_LOGD)
+#define SECURE_LOGD LOGD
+#endif
+
+#if !defined(SECURE_LOGW)
+#define SECURE_LOGW LOGW
+#endif
+
+#if !defined(SECURE_LOGE)
+#define SECURE_LOGE LOGE
+#endif
+
+#if !defined(S_)
+#define S_(str) dgettext("sys_string", str)
+#endif
+
+#if !defined(T_)
+#define T_(str) dgettext(PACKAGE, str)
+#endif
+
+#if !defined(N_)
+#define N_(str) (str)
+#endif
+
+#if !defined(_)
+#define _(str) gettext(str)
+#endif
+
+
+#if !defined(DbgPrint)
+#define DbgPrint(format, arg...) SECURE_LOGD(format, ##arg)
+#endif
+
+#if !defined(ErrPrint)
+#define ErrPrint(format, arg...) SECURE_LOGE(format, ##arg)
+#endif
+
+#if !defined(WarnPrint)
+#define WarnPrint(format, arg...) SECURE_LOGW(format, ##arg)
+#endif
+
+#define HAPI __attribute__((visibility("hidden")))
+
+#if !defined(SERVICE_OPERATION_DBOX_SETUP)
+#define SERVICE_OPERATION_DBOX_SETUP "http://tizen.org/appcontrol/operation/appwidget/configuration"
+#endif
+
+#if !defined(SERVICE_OPERATION_SAMSUNG_DBOX_SETUP_MULTIPLE)
+#define SERVICE_OPERATION_SAMSUNG_DBOX_SETUP_MULTIPLE "http://samsung.com/appcontrol/operation/appwidget/configuration_multiple"
+#endif
+
+#if !defined(EXTRA_KEY_PROVIDER_NAME)
+#define EXTRA_KEY_PROVIDER_NAME "http://tizen.org/appcontrol/data/provider_name"
+#endif
+
+#if !defined(EXTRA_KEY_CONTENT_INFO)
+#define EXTRA_KEY_CONTENT_INFO "http://tizen.org/appcontrol/data/user_info"
+#endif
+
+#if !defined(EXTRA_KEY_CONTENT_INFO_LIST)
+#define EXTRA_KEY_CONTENT_INFO_LIST "http://samsung.com/appcontrol/data/user_info_list"
+#endif
+
+#if !defined(EXTRA_KEY_CONTENT_INFO_COUNT)
+#define EXTRA_KEY_CONTENT_INFO_COUNT "http://samsung.com/appcontrol/data/max_items"
+#endif
+
+#define EDJE_FILE RESDIR"/edje/preview.edj"
+#define UNKNOWN_ICON RESDIR"/images/unknown.png"
+
+/* End of a file */
diff --git a/home/include/add-viewer_package.h b/home/include/add-viewer_package.h
new file mode 100755
index 0000000..7a1363a
--- /dev/null
+++ b/home/include/add-viewer_package.h
@@ -0,0 +1,74 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+struct add_viewer_package;
+struct add_viewer_preview;
+
+enum package_type {
+ PACKAGE_TYPE_APP,
+ PACKAGE_TYPE_SHORTCUT,
+ PACKAGE_TYPE_BOX,
+ PACKAGE_TYPE_UNKNOWN,
+};
+
+enum pkg_evt_type {
+ PACKAGE_LIST_EVENT_DEL,
+ PACKAGE_LIST_EVENT_UPDATE,
+ PACKAGE_LIST_EVENT_RELOAD,
+};
+
+extern int add_viewer_package_init(void);
+extern int add_viewer_package_fini(void);
+extern void *add_viewer_package_list_handle(void);
+extern struct add_viewer_package *add_viewer_package_list_item(void *handle);
+extern void *add_viewer_package_list_next(void *handle);
+extern void *add_viewer_package_list_prev(void *handle);
+extern void add_viewer_package_list_del(struct add_viewer_package *package);
+
+extern const char *add_viewer_package_list_name(struct add_viewer_package *package);
+extern const char *add_viewer_package_list_pkgname(struct add_viewer_package *package);
+extern const char *add_viewer_package_list_icon(struct add_viewer_package *package);
+extern int add_viewer_package_list_type(struct add_viewer_package *package);
+extern const char *add_viewer_package_list_extra_key(struct add_viewer_package *package);
+extern const char *add_viewer_package_list_extra_data(struct add_viewer_package *package);
+
+extern int add_viewer_package_list_set_name(struct add_viewer_package *package, const char *name);
+extern int add_viewer_package_list_set_pkgname(struct add_viewer_package *package, const char *pkgname);
+extern int add_viewer_package_list_set_icon(struct add_viewer_package *package, const char *icon);
+extern void *add_viewer_package_list_preview_list(struct add_viewer_package *package);
+extern struct add_viewer_preview *package_list_preview(struct add_viewer_package *package, void *handle);
+extern void *add_viewer_package_list_preview_next(struct add_viewer_package *package, void *handle);
+extern void *add_viewer_package_list_preview_prev(struct add_viewer_package *package, void *handle);
+extern int add_viewer_package_list_preview_size(struct add_viewer_preview *preview);
+extern void *add_viewer_package_list_preview_data(struct add_viewer_preview *preview);
+extern void add_viewer_package_list_preview_set_data(struct add_viewer_preview *preview, void *data);
+extern int add_viewer_package_is_disabled(struct add_viewer_package *package);
+extern void add_viewer_package_set_disabled(struct add_viewer_package *package, int flag);
+extern void add_viewer_package_set_skip(struct add_viewer_package *package, int skip);
+extern int add_viewer_package_is_skipped(struct add_viewer_package *package);
+
+extern void add_viewer_package_set_data(struct add_viewer_package *package, void *data);
+extern void *add_viewer_package_data(struct add_viewer_package *package);
+
+extern int add_viewer_package_list_add_event_callback(struct add_viewer_package *package, int event, int (*cb)(struct add_viewer_package *package, void *data), void *data);
+extern int add_viewer_package_list_del_event_callback(struct add_viewer_package *package, int event, int (*cb)(struct add_viewer_package *package, void *data), void *data);
+
+extern int add_viewer_package_is_valid(struct add_viewer_package *package);
+extern struct add_viewer_package *add_viewer_package_find(const char *dbox_id);
+extern int add_viewer_package_reload_name(void);
+
+/* End of a file */
diff --git a/home/include/add-viewer_pkgmgr.h b/home/include/add-viewer_pkgmgr.h
new file mode 100755
index 0000000..92b6da0
--- /dev/null
+++ b/home/include/add-viewer_pkgmgr.h
@@ -0,0 +1,41 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+enum pkgmgr_event_type {
+ PKGMGR_EVENT_DOWNLOAD,
+ PKGMGR_EVENT_INSTALL,
+ PKGMGR_EVENT_UPDATE,
+ PKGMGR_EVENT_UNINSTALL,
+ PKGMGR_EVENT_RECOVER
+};
+
+enum pkgmgr_status {
+ PKGMGR_STATUS_START,
+ PKGMGR_STATUS_PROCESSING,
+ PKGMGR_STATUS_COMMAND,
+ PKGMGR_STATUS_END,
+ PKGMGR_STATUS_ERROR
+};
+
+extern int add_viewer_pkgmgr_init(void);
+extern int add_viewer_pkgmgr_fini(void);
+
+extern int add_viewer_pkgmgr_add_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data);
+
+extern void *add_viewer_pkgmgr_del_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data);
+
+/* End of a file */
diff --git a/home/include/add-viewer_ucol.h b/home/include/add-viewer_ucol.h
new file mode 100755
index 0000000..198fe47
--- /dev/null
+++ b/home/include/add-viewer_ucol.h
@@ -0,0 +1,44 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+enum LANGUAGE {
+ LANG_ENGLISH,
+ LANG_KOREAN,
+ LANG_JAPANESS,
+ LANG_CHINESS,
+ LANG_UNKNOWN
+};
+
+extern int add_viewer_ucol_init(void);
+
+extern int add_viewer_ucol_compare(const char *src, const char *dest);
+extern int add_viewer_ucol_case_compare(const char *src, const char *dest);
+
+extern int add_viewer_ucol_ncompare(const char *src, const char *dest, int len);
+extern int add_viewer_ucol_case_ncompare(const char *src, const char *dest, int len);
+
+extern int add_viewer_ucol_search(const char *haystack, const char *needle);
+extern int add_viewer_ucol_case_search(const char *haystack, const char *needle);
+
+extern int add_viewer_ucol_compare_first_letters(const char *src, const char *letters);
+extern int add_viewer_ucol_detect_lang(int ch);
+extern int add_viewer_ucol_fini(void);
+extern const int add_viewer_ucol_current_lang(void);
+extern int add_viewer_ucol_is_alpha(const char *name);
+
+/* End of a file */
+
diff --git a/home/include/add-viewer_util.h b/home/include/add-viewer_util.h
new file mode 100755
index 0000000..c6efd32
--- /dev/null
+++ b/home/include/add-viewer_util.h
@@ -0,0 +1,26 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+extern int add_viewer_util_add_to_home(struct add_viewer_package *package, int size, int use_noti);
+extern int add_viewer_util_init(void);
+extern int add_viewer_util_fini(void);
+extern int add_viewer_util_is_lcd_off(void);
+extern char *add_viewer_util_highlight_keyword(const char *name, const char *filter);
+extern int add_viewer_util_get_utf8_len(char ch);
+extern void add_viewer_util_update_matched_color(void);
+
+/* End of a file */
diff --git a/home/include/apps/apps_conf.h b/home/include/apps/apps_conf.h
new file mode 100755
index 0000000..4496585
--- /dev/null
+++ b/home/include/apps/apps_conf.h
@@ -0,0 +1,78 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _APPS_CONF_H_
+#define _APPS_CONF_H_
+
+/* Layout */
+#define BASE_WIDTH (360.0)
+#define BASE_HEIGHT (480.0)
+
+#define LAYOUT_PAGE_INDICATOR_HEIGHT 40
+
+#define LAYOUT_TITLE_BG_HEIGHT 50
+#define LAYOUT_TITLE_BG_MIN 0 LAYOUT_TITLE_BG_HEIGHT
+
+#define LAYOUT_TITLE_HEIGHT 50
+#define LAYOUT_TITLE_MIN 0 LAYOUT_TITLE_HEIGHT
+
+#define BUTTON_HEIGHT (69)
+
+#define GRID_EDIT_HEIGHT (BASE_HEIGHT-LAYOUT_PAGE_INDICATOR_HEIGHT-LAYOUT_TITLE_HEIGHT-LAYOUT_PAD_AFTER_TITLE_HEIGHT-BUTTON_HEIGHT)
+#define GRID_NORMAL_HEIGHT (BASE_HEIGHT-LAYOUT_PAGE_INDICATOR_HEIGHT-LAYOUT_TITLE_HEIGHT-LAYOUT_PAD_AFTER_TITLE_HEIGHT)
+
+#define BOX_TOP_HEIGHT 10
+#define BOX_TOP_MENU_WIDTH 360
+#define BOX_TOP_MENU_HEIGHT 87
+#define BOX_BOTTOM_HEIGHT 18
+#define BOX_BOTTOM_MENU_HEIGHT 61
+
+#define ITEM_WIDTH (33+98+33)
+#define ITEM_HEIGHT (98+64+16)
+#define ITEM_EDIT_WIDTH (3+23+95+23+3)
+#define ITEM_EDIT_HEIGHT (95+58+7)
+
+#define ITEM_ICON_WIDTH (105)
+#define ITEM_ICON_HEIGHT (108)
+
+#define ITEM_SMALL_ICON_WIDTH (95)
+#define ITEM_SMALL_ICON_HEIGHT (95)
+
+#define ITEM_ICON_Y (45)
+#define ITEM_TEXT_Y (90)
+
+#define ITEM_BADGE_X (29+87)
+#define ITEM_BADGE_Y (14)
+
+#define ITEM_BADGE_W 54
+#define ITEM_BADGE_H 59
+#define ITEM_BADGE_GAP 17
+#define ITEM_BADGE_2W (ITEM_BADGE_W+ITEM_BADGE_GAP)
+#define ITEM_BADGE_3W (ITEM_BADGE_W+(ITEM_BADGE_GAP*2))
+
+#define EDIT_BUTTON_SIZE_W (50)
+#define EDIT_BUTTON_SIZE_H (50)
+
+#define CTXPOPUP_ICON_SIZE 49
+
+/* Configuration */
+#define APPS_PER_PAGE 2
+#define LINE_SIZE 10
+#define LONGPRESS_TIME 0.5f
+
+#endif // _APPS_CONF_H_
+// End of file
diff --git a/home/include/apps/apps_main.h b/home/include/apps/apps_main.h
new file mode 100755
index 0000000..608c766
--- /dev/null
+++ b/home/include/apps/apps_main.h
@@ -0,0 +1,99 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_MAIN_H__
+#define __APPS_MAIN_H__
+
+#include <app.h>
+#include <Ecore_Evas.h>
+#include <efl_assist.h>
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+
+#include "util.h"
+
+typedef struct {
+ /* Multi-window : Every windows are written in the instance_list. */
+ Eina_List *instance_list;
+ Elm_Theme *theme;
+ Ea_Theme_Color_Table *color_theme;
+ Eina_List *font_theme;
+ int first_boot;
+ int updated;
+ double scale;
+ int tts;
+ bool longpress_edit_disable;
+} apps_main_s;
+
+typedef struct {
+ int state;
+ int root_w;
+ int root_h;
+ int booting_state;
+ int angle;
+ int is_rotated;
+ Eina_List *cbs_list[APPS_APP_STATE_MAX];
+ Evas *e;
+ Ecore_Evas *ee;
+ Evas_Object *win;
+ Evas_Object *layout;
+ char *content;
+} instance_info_s;
+
+
+enum {
+ APPS_LAUNCH_INIT = 0,
+ APPS_LAUNCH_SHOW,
+ APPS_LAUNCH_EDIT,
+ APPS_LAUNCH_HIDE,
+ APPS_LAUNCH_MAX,
+};
+
+HAPI apps_main_s *apps_main_get_info(void);
+
+HAPI apps_error_e apps_main_register_cb(
+ instance_info_s *info,
+ int state,
+ apps_error_e (*result_cb)(void *), void *result_data);
+
+HAPI void apps_main_unregister_cb(
+ instance_info_s *info,
+ int state,
+ apps_error_e (*result_cb)(void *));
+
+HAPI void apps_main_init();
+HAPI void apps_main_fini();
+HAPI void apps_main_launch(int launch_type);
+HAPI void apps_main_pause();
+HAPI void apps_main_resume();
+HAPI void apps_main_language_chnage();
+HAPI void apps_main_theme_chnage();
+HAPI Eina_Bool apps_main_is_visible();
+
+HAPI void apps_main_list_backup();
+HAPI void apps_main_list_restore();
+HAPI void apps_main_list_reset();
+
+HAPI void apps_main_list_tts(int is_tts);
+
+HAPI void apps_main_show_count_add(void);
+HAPI int apps_main_show_count_get(void);
+
+#endif //__APPS_MAIN_H__
+
+// End of a file
diff --git a/home/include/apps/bg.h b/home/include/apps/bg.h
new file mode 100755
index 0000000..87c9054
--- /dev/null
+++ b/home/include/apps/bg.h
@@ -0,0 +1,26 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_BG_H__
+#define __APPS_BG_H__
+
+#include <Evas.h>
+
+extern Evas_Object *apps_bg_create(Evas_Object *win, int w, int h);
+extern void apps_bg_destroy(Evas_Object *win);
+
+#endif /* __W_HOME_BG_H__ */
diff --git a/home/include/apps/db.h b/home/include/apps/db.h
new file mode 100755
index 0000000..d50fcb3
--- /dev/null
+++ b/home/include/apps/db.h
@@ -0,0 +1,59 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_DB_H__
+#define __APPS_DB_H__
+
+#include <stdbool.h>
+
+#include "util.h"
+
+typedef struct stmt stmt_h;
+
+apps_error_e apps_db_open(const char *db_file);
+stmt_h *apps_db_prepare(const char *query);
+apps_error_e apps_db_bind_bool(stmt_h *handle, int idx, bool value);
+apps_error_e apps_db_bind_int(stmt_h *handle, int idx, int value);
+apps_error_e apps_db_bind_str(stmt_h *handle, int idx, const char *str);
+apps_error_e apps_db_next(stmt_h *handle);
+bool apps_db_get_bool(stmt_h *handle, int index);
+int apps_db_get_int(stmt_h *handle, int index);
+const char *apps_db_get_str(stmt_h *handle, int index);
+apps_error_e apps_db_reset(stmt_h *handle);
+apps_error_e apps_db_finalize(stmt_h *handle);
+apps_error_e apps_db_exec(const char *query);
+void apps_db_close(void);
+
+apps_error_e apps_db_begin_transaction(void);
+apps_error_e apps_db_end_transaction(bool success);
+
+HAPI apps_error_e apps_db_init(void);
+HAPI int apps_db_insert_item(const char *id, int ordering);
+HAPI int apps_db_update_item(const char *id, int ordering);
+HAPI int apps_db_remove_item(const char *id);
+HAPI int apps_db_count_item(const char *id);
+HAPI int apps_db_count_item_in(void);
+
+HAPI apps_error_e apps_db_read_list(Eina_List *item_info_list);
+HAPI Eina_List *apps_db_write_list(void);
+HAPI Eina_List *apps_db_write_list_by_name(void);
+
+HAPI apps_error_e apps_db_find_empty_position(int *pos);
+HAPI apps_error_e apps_db_trim(void);
+HAPI apps_error_e apps_db_sync(void);
+
+#endif // __APPS_DB_H__
diff --git a/home/include/apps/effect.h b/home/include/apps/effect.h
new file mode 100755
index 0000000..724b5bc
--- /dev/null
+++ b/home/include/apps/effect.h
@@ -0,0 +1,34 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_EFFECT_H__
+#define __APPS_EFFECT_H__
+
+#include "util.h"
+
+HAPI apps_error_e apps_effect_init(void);
+HAPI void apps_effect_fini(void);
+
+HAPI void apps_effect_set_sound_status(int status);
+HAPI int apps_effect_get_sound_status(void);
+
+HAPI void apps_effect_play_sound(void);
+HAPI void apps_effect_play_vibration(void);
+
+#endif //__APPS_EFFECT_H__
+
+// End of a file
diff --git a/home/include/apps/grid.h b/home/include/apps/grid.h
new file mode 100755
index 0000000..6f2ad13
--- /dev/null
+++ b/home/include/apps/grid.h
@@ -0,0 +1,37 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_GRID_H__
+#define __APPS_GRID_H__
+
+#include <Evas.h>
+
+#include "util.h"
+#include "apps/list.h"
+
+HAPI void grid_destroy(Evas_Object *win, Evas_Object *grid);
+HAPI Evas_Object *grid_create(Evas_Object *win, Evas_Object *parent);
+HAPI void grid_refresh(Evas_Object *grid);
+
+HAPI void grid_show_top(Evas_Object *grid);
+
+HAPI void grid_append_list(Evas_Object *grid, Eina_List *list);
+HAPI void grid_remove_list(Evas_Object *grid, Eina_List *list);
+
+#endif //__APPS_GRID_H__
+
+// End of a file
diff --git a/home/include/apps/item.h b/home/include/apps/item.h
new file mode 100755
index 0000000..0bd9251
--- /dev/null
+++ b/home/include/apps/item.h
@@ -0,0 +1,42 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_ITEM_H__
+#define __APPS_ITEM_H__
+
+#include <Evas.h>
+#include "apps/item_info.h"
+#include "util.h"
+
+HAPI void item_destroy(Evas_Object *item);
+HAPI Evas_Object *item_create(Evas_Object *scroller, item_info_s *info);
+
+HAPI Evas_Object *item_virtual_create(Evas_Object *scroller);
+HAPI void item_virtual_destroy(Evas_Object *item);
+
+HAPI void item_change_language(Evas_Object *item);
+
+HAPI void item_edit(Evas_Object *item);
+HAPI void item_unedit(Evas_Object *item);
+
+HAPI Evas_Object* item_get_press_item(Evas_Object *scroller);
+HAPI int item_is_longpressed(Evas_Object *item);
+
+HAPI void item_is_pressed(Evas_Object *item);
+HAPI void item_is_released(Evas_Object *item);
+
+#endif // __APPS_ITEM_H__
diff --git a/home/include/apps/item_badge.h b/home/include/apps/item_badge.h
new file mode 100755
index 0000000..56f723b
--- /dev/null
+++ b/home/include/apps/item_badge.h
@@ -0,0 +1,41 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_ITEM_BADGE_H__
+#define __APPS_ITEM_BADGE_H__
+
+#include <Elementary.h>
+
+#include "util.h"
+
+HAPI int item_badge_count(Evas_Object *item);
+
+HAPI int item_badge_is_registered(const char *appid);
+HAPI apps_error_e item_badge_init(Evas_Object *item);
+HAPI void item_badge_destroy(Evas_Object *item);
+
+HAPI void item_badge_register_changed_cb(Evas_Object *layout);
+HAPI void item_badge_unregister_changed_cb(void);
+
+HAPI void item_badge_show(Evas_Object *item, int count);
+HAPI void item_badge_hide(Evas_Object *item);
+HAPI void item_badge_change_language(Evas_Object *item);
+HAPI void item_badge_remove(const char *pkgid);
+
+#endif //__APPS_ITEM_BADGE_H__
+
+// End of a file
diff --git a/home/include/apps/item_info.h b/home/include/apps/item_info.h
new file mode 100755
index 0000000..540ad4f
--- /dev/null
+++ b/home/include/apps/item_info.h
@@ -0,0 +1,75 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_ITEM_INFO_H__
+#define __APPS_ITEM_INFO_H__
+
+#include <Elementary.h>
+#include <Evas.h>
+
+#include "apps/apps_main.h"
+#include "util.h"
+
+typedef struct {
+ /* innate features */
+ char *pkgid;
+ char *appid;
+ char *name;
+ char *icon;
+ char *type;
+
+ int ordering;
+ int open_app;
+ int tts;
+
+ /* acquired features */
+ Evas_Object *win;
+ Evas_Object *layout;
+ instance_info_s *instance_info;
+
+ Evas_Object *scroller;
+ Evas_Object *box;
+ Evas_Object *page;
+
+ Evas_Object *item;
+ Evas_Object *item_inner;
+ Evas_Object *center;
+} item_info_s;
+
+typedef enum {
+ ITEM_INFO_LIST_TYPE_INVALID = 0,
+ ITEM_INFO_LIST_TYPE_ALL,
+ ITEM_INFO_LIST_TYPE_FACTORY_BINARY,
+ ITEM_INFO_LIST_TYPE_XML,
+ ITEM_INFO_LIST_TYPE_MAX,
+} item_info_list_type_e;
+
+HAPI void apps_item_info_destroy(item_info_s *item_info);
+HAPI item_info_s *apps_item_info_create(const char *appid);
+HAPI item_info_s *apps_item_info_get(Evas_Object *win, const char *appid);
+
+HAPI Eina_List *apps_item_info_list_create(item_info_list_type_e list_type);
+HAPI void apps_item_info_list_destroy(Eina_List *item_info_list);
+
+HAPI Evas_Object *apps_item_info_list_get_item(Eina_List *item_info_list, const char *appid);
+HAPI int apps_item_info_list_get_ordering(Eina_List *item_info_list, const char *appid);
+
+HAPI void apps_item_info_list_change_language(Eina_List *item_info_list);
+
+HAPI int apps_item_info_is_support_tts(const char *appid);
+
+#endif // __APPS_ITEM_INFO_H__
diff --git a/home/include/apps/lang.h b/home/include/apps/lang.h
new file mode 100755
index 0000000..b2267f3
--- /dev/null
+++ b/home/include/apps/lang.h
@@ -0,0 +1,33 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_LANG_H__
+#define __APPS_LANG_H__
+
+#include <Elementary.h>
+
+#include "util.h"
+
+HAPI apps_error_e apps_lang_add_id(Evas_Object *obj, const char *group, const char *id, int domain);
+HAPI void apps_lang_remove_id(Evas_Object *obj, const char *group);
+
+HAPI apps_error_e apps_lang_register_cb(apps_error_e (*result_cb)(void *), void *result_data);
+HAPI void apps_lang_unregister_cb(apps_error_e (*result_cb)(void *));
+
+HAPI void apps_lang_refresh_ids(void);
+
+#endif /* __APPS_LANG_H__ */
diff --git a/home/include/apps/layout.h b/home/include/apps/layout.h
new file mode 100755
index 0000000..50acbf9
--- /dev/null
+++ b/home/include/apps/layout.h
@@ -0,0 +1,43 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_LAYOUT_H__
+#define __APPS_LAYOUT_H__
+
+#include <Evas.h>
+#include "util.h"
+
+HAPI Evas_Object *apps_layout_create(Evas_Object *win, const char *file, const char *group);
+HAPI void apps_layout_destroy(Evas_Object *layout);
+
+HAPI apps_error_e apps_layout_show(Evas_Object *win, Eina_Bool show);
+
+HAPI Evas_Object* apps_layout_load_edj(Evas_Object *parent, const char *edjname, const char *grpname);
+HAPI void apps_layout_unload_edj(Evas_Object *layout);
+
+HAPI void apps_layout_rotate(Evas_Object *layout, int is_rotated);
+
+HAPI void apps_layout_block(Evas_Object *layout);
+HAPI void apps_layout_unblock(Evas_Object *layout);
+
+HAPI int apps_layout_is_edited(Evas_Object *layout);
+HAPI void apps_layout_edit(Evas_Object *layout);
+HAPI void apps_layout_unedit(Evas_Object *layout);
+
+#endif //__APPS_LAYOUT_H__
+
+// End of a file
diff --git a/home/include/apps/list.h b/home/include/apps/list.h
new file mode 100644
index 0000000..ed3a4fa
--- /dev/null
+++ b/home/include/apps/list.h
@@ -0,0 +1,42 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_LIST_H__
+#define __APPS_LIST_H__
+
+#include <Evas.h>
+#include <stdbool.h>
+
+#include "apps/item_info.h"
+#include "util.h"
+
+typedef struct _app_list {
+ Eina_List *list;
+ unsigned int cur_idx;
+} app_list;
+
+HAPI bool list_is_included(const char *id);
+
+HAPI app_list *list_create(void);
+HAPI app_list *list_create_by_appid(void);
+HAPI void list_destroy(app_list *list);
+
+HAPI void list_change_language(app_list *list);
+
+#endif //__APPS_LIST_H__
+
+// End of a file
diff --git a/home/include/apps/page.h b/home/include/apps/page.h
new file mode 100755
index 0000000..30ae23a
--- /dev/null
+++ b/home/include/apps/page.h
@@ -0,0 +1,73 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_PAGE_H__
+#define __APPS_PAGE_H__
+
+#include <Evas.h>
+#include "util.h"
+
+HAPI void apps_page_destroy(Evas_Object *page);
+HAPI Evas_Object *apps_page_create(Evas_Object *scroller, Evas_Object *prev_page, Evas_Object *next_page);
+
+HAPI apps_error_e apps_page_pack_item(Evas_Object *page, Evas_Object *item);
+HAPI apps_error_e apps_page_unpack_item(Evas_Object *page, Evas_Object *item);
+
+HAPI int apps_page_count_item(Evas_Object *page);
+
+HAPI Evas_Object *apps_page_get_item_at(Evas_Object *page, int position);
+
+HAPI apps_error_e apps_page_pack_nth(Evas_Object *page, Evas_Object *item, int position);
+HAPI Evas_Object *apps_page_unpack_nth(Evas_Object *page, int position);
+
+HAPI void apps_page_change_language(Evas_Object *page);
+
+HAPI int apps_page_has_item(Evas_Object *page, Evas_Object *item);
+
+/*
+ * origin order :
+ * ---------------------------------------------------------------------------
+ * | from_item | from_item + 1 | ... | to_item - 1 | to_item |
+ * ---------------------------------------------------------------------------
+ * changed order : from_item will be returned.
+ * ---------------------------------------------------------------------------
+ * | from_item + 1 | from_item + 2 | ... | to_item | append_item |
+ * ---------------------------------------------------------------------------
+ */
+HAPI Evas_Object *apps_page_move_item_prev(Evas_Object *page, Evas_Object *from_item, Evas_Object *to_item, Evas_Object *append_item);
+
+/*
+ * origin order :
+ * ---------------------------------------------------------------------------
+ * | from_item | from_item + 1 | ... | to_item - 1 | to_item |
+ * ---------------------------------------------------------------------------
+ * changed order : to_item will be returned.
+ * ---------------------------------------------------------------------------
+ * | insert_item | from_item | ... | ... | to_item - 1 |
+ * ---------------------------------------------------------------------------
+ */
+HAPI Evas_Object *apps_page_move_item_next(Evas_Object *page, Evas_Object *from_item, Evas_Object *to_item, Evas_Object *insert_item);
+
+HAPI int apps_page_seek_item_position(Evas_Object *page, Evas_Object *item);
+HAPI void apps_page_print_item(Evas_Object *page);
+
+HAPI void apps_page_edit(Evas_Object *page);
+HAPI void apps_page_unedit(Evas_Object *page);
+
+#endif //__APPS_PAGE_H__
+
+// End of a file
diff --git a/home/include/apps/page_info.h b/home/include/apps/page_info.h
new file mode 100755
index 0000000..2140772
--- /dev/null
+++ b/home/include/apps/page_info.h
@@ -0,0 +1,38 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_PAGE_INFO_H__
+#define __APPS_PAGE_INFO_H__
+
+#include <Evas.h>
+#include "apps/apps_main.h"
+
+typedef struct {
+ Evas_Object *win;
+ instance_info_s *instance_info;
+
+ Evas_Object *scroller;
+ Evas_Object *page_rect;
+
+ Evas_Object *prev_page;
+ Evas_Object *page;
+ Evas_Object *next_page;
+} page_info_s;
+
+#endif //__APPS_PAGE_INFO_H__
+
+// End of a file
diff --git a/home/include/apps/pkgmgr.h b/home/include/apps/pkgmgr.h
new file mode 100755
index 0000000..28cbabe
--- /dev/null
+++ b/home/include/apps/pkgmgr.h
@@ -0,0 +1,41 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_PKGMGR_H__
+#define __APPS_PKGMGR_H__
+
+#include <Evas.h>
+
+#include "apps/list.h"
+#include "util.h"
+
+
+
+HAPI apps_error_e apps_pkgmgr_init(void);
+HAPI void apps_pkgmgr_fini(void);
+
+HAPI apps_error_e apps_pkgmgr_item_list_append_item(const char *pkgid, const char *app_id, Evas_Object *item);
+HAPI apps_error_e apps_pkgmgr_item_list_remove_item(const char *pkgid, const char *app_id, Evas_Object *item);
+HAPI void apps_pkgmgr_item_list_affect_pkgid(const char *pkgid, Eina_Bool (*_affected_cb)(const char *, Evas_Object *, void *), void *data);
+HAPI void apps_pkgmgr_item_list_affect_appid(const char *app_id, Eina_Bool (*_affected_cb)(const char *, Evas_Object *, void *), void *data);
+
+HAPI apps_error_e apps_pkgmgr_item_list_enable_mounted_item(void);
+HAPI apps_error_e apps_pkgmgr_item_list_disable_unmounted_item(void);
+
+#endif //__APPS_PKGMGR_H__
+
+// End of a file
diff --git a/home/include/apps/scroller.h b/home/include/apps/scroller.h
new file mode 100755
index 0000000..a0fceed
--- /dev/null
+++ b/home/include/apps/scroller.h
@@ -0,0 +1,71 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_SCROLLER_H__
+#define __APPS_SCROLLER_H__
+
+#include <Evas.h>
+
+#include "apps/apps_main.h"
+#include "util.h"
+
+HAPI void apps_scroller_destroy(Evas_Object *layout);
+HAPI Evas_Object *apps_scroller_create(Evas_Object *layout);
+
+HAPI int apps_scroller_count_page(Evas_Object *scroller);
+HAPI int apps_scroller_count_item(Evas_Object *scroller);
+HAPI Eina_Bool apps_scroller_is_scrolling(Evas_Object *scroller);
+
+HAPI void apps_scroller_freeze(Evas_Object *scroller);
+HAPI void apps_scroller_unfreeze(Evas_Object *scroller);
+
+HAPI void apps_scroller_bring_in(Evas_Object *scroller, int page_no);
+HAPI void apps_scroller_bring_in_page(Evas_Object *scroller, Evas_Object *page);
+
+HAPI void apps_scroller_region_show(Evas_Object *scroller, int x, int y);
+
+HAPI void apps_scroller_append_item(Evas_Object *scroller, Evas_Object *item);
+HAPI void apps_scroller_remove_item(Evas_Object *scroller, Evas_Object *item);
+
+HAPI void apps_scroller_append_list(Evas_Object *scroller, Eina_List *list);
+HAPI void apps_scroller_remove_list(Evas_Object *scroller, Eina_List *list);
+
+HAPI void apps_scroller_trim(Evas_Object *scroller);
+
+HAPI void apps_scroller_change_language(Evas_Object *scroller);
+
+/* return a page that has the item */
+HAPI Evas_Object *apps_scroller_has_item(Evas_Object *scroller, Evas_Object *item);
+
+HAPI Evas_Object *apps_scroller_move_item_prev(Evas_Object *scroller, Evas_Object *from_item, Evas_Object *to_item, Evas_Object *append_item);
+HAPI Evas_Object *apps_scroller_move_item_next(Evas_Object *scroller, Evas_Object *from_item, Evas_Object *to_item, Evas_Object *insert_item);
+
+HAPI int apps_scroller_seek_item_position(Evas_Object *scroller, Evas_Object *item);
+HAPI void apps_scroller_bring_in_region_by_vector(Evas_Object *scroller, int vector);
+
+HAPI apps_error_e apps_scroller_read_list(Evas_Object *scroller, Eina_List *item_info_list);
+HAPI void apps_scroller_write_list(Evas_Object *scroller);
+
+HAPI Evas_Object *apps_scroller_get_item_by_pkgid(Evas_Object *scroller, const char *pkgid);
+HAPI Evas_Object *apps_scroller_get_item_by_appid(Evas_Object *scroller, const char *appid);
+
+HAPI void apps_scroller_edit(Evas_Object *scroller);
+HAPI void apps_scroller_unedit(Evas_Object *scroller);
+
+#endif //__APPS_SCROLLER_H__
+
+// End of a file
diff --git a/home/include/apps/scroller_info.h b/home/include/apps/scroller_info.h
new file mode 100755
index 0000000..a762433
--- /dev/null
+++ b/home/include/apps/scroller_info.h
@@ -0,0 +1,41 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_SCROLLER_INFO_H__
+#define __APPS_SCROLLER_INFO_H__
+
+#include <Evas.h>
+#include "apps/apps_main.h"
+
+typedef struct {
+ Evas_Object *win;
+ instance_info_s *instance_info;
+
+ Evas_Object *layout;
+ Evas_Object *box_layout;
+ Evas_Object *box;
+ Evas_Object *layout_focus;
+ Evas_Object *top_focus;
+ Evas_Object *bottom_focus;
+
+ Eina_List *list;
+ int list_index;
+} scroller_info_s;
+
+#endif //__APPS_SCROLLER_INFO_H__
+
+// End of a file
diff --git a/home/include/apps/xml.h b/home/include/apps/xml.h
new file mode 100755
index 0000000..38a7d74
--- /dev/null
+++ b/home/include/apps/xml.h
@@ -0,0 +1,26 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APPS_XML_H__
+#define __APPS_XML_H__
+
+#include "util.h"
+
+HAPI apps_error_e apps_xml_read_list(const char *xml_file, Eina_List *item_info_list);
+HAPI Eina_List *apps_xml_write_list(const char *xml_file);
+
+#endif // __APPS_XML_H__
diff --git a/home/include/bg.h b/home/include/bg.h
new file mode 100755
index 0000000..92f7a50
--- /dev/null
+++ b/home/include/bg.h
@@ -0,0 +1,29 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_BG_H__
+#define __W_HOME_BG_H__
+
+extern Evas_Object *bg_create(Evas_Object *win);
+extern void bg_destroy(Evas_Object *win);
+
+extern void bg_get_rgb(int *r, int *g, int *b);
+extern void bg_set_rgb(Evas_Object *bg, const char *buf);
+
+extern void bg_register_object(Evas_Object *obj);
+
+#endif /* __W_HOME_BG_H__ */
diff --git a/home/include/clock_service.h b/home/include/clock_service.h
new file mode 100755
index 0000000..dcd03f1
--- /dev/null
+++ b/home/include/clock_service.h
@@ -0,0 +1,262 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CLOCK_SERVICE_H
+#define __CLOCK_SERVICE_H
+
+#define PAGE_CLOCK_EDJE_FILE EDJEDIR"/page_clock.edj"
+
+#define CLOCK_RET_OK 0
+#define CLOCK_RET_FAIL 1
+#define CLOCK_RET_ASYNC 2
+#define CLOCK_RET_NEED_DESTROY_PREVIOUS 4
+
+#define CLOCK_SERVICE_MODE_NORMAL 1
+#define CLOCK_SERVICE_MODE_NORMAL_RECOVERY 2
+#define CLOCK_SERVICE_MODE_RECOVERY 3
+#define CLOCK_SERVICE_MODE_EMERGENCY 4
+#define CLOCK_SERVICE_MODE_COOLDOWN 5
+
+#define CLOCK_APP_TYPE_NATIVE 1
+#define CLOCK_APP_TYPE_WEBAPP 2
+#define CLOCK_APP_FACTORY_DEFAULT "org.tizen.w-idle-clock-weather2"
+#define CLOCK_APP_RECOVERY "org.tizen.idle-clock-digital"
+#define CLOCK_APP_EMERGENCY "org.tizen.idle-clock-ups"
+#define CLOCK_APP_COOLDOWN "org.tizen.idle-clock-emergency"
+
+#define CLOCK_STATE_IDLE 0
+#define CLOCK_STATE_WAITING 1
+#define CLOCK_STATE_RUNNING 2
+
+/*
+ * Events
+ */
+#define CLOCK_EVENT_MAP(SOURCE, TYPE) ((SOURCE << 16) | TYPE)
+
+/*
+ * instant events
+ */
+#define CLOCK_EVENT_VIEW 0x0000
+#define CLOCK_EVENT_VIEW_READY CLOCK_EVENT_MAP(CLOCK_EVENT_VIEW, 0x0)
+#define CLOCK_EVENT_VIEW_RESIZED CLOCK_EVENT_MAP(CLOCK_EVENT_VIEW, 0x1)
+#define CLOCK_EVENT_VIEW_HIDDEN_SHOW CLOCK_EVENT_MAP(CLOCK_EVENT_VIEW, 0x2)
+#define CLOCK_EVENT_VIEW_HIDDEN_HIDE CLOCK_EVENT_MAP(CLOCK_EVENT_VIEW, 0x4)
+#define CLOCK_EVENT_APP 0x0001
+#define CLOCK_EVENT_APP_PROVIDER_ERROR CLOCK_EVENT_MAP(CLOCK_EVENT_APP, 0x0)
+#define CLOCK_EVENT_APP_PROVIDER_ERROR_FATAL CLOCK_EVENT_MAP(CLOCK_EVENT_APP, 0x1)
+#define CLOCK_EVENT_APP_PAUSE CLOCK_EVENT_MAP(CLOCK_EVENT_APP, 0x2)
+#define CLOCK_EVENT_APP_RESUME CLOCK_EVENT_MAP(CLOCK_EVENT_APP, 0x4)
+#define CLOCK_EVENT_APP_LANGUAGE_CHANGED CLOCK_EVENT_MAP(CLOCK_EVENT_APP, 0x8)
+#define CLOCK_EVENT_DEVICE 0x0002
+#define CLOCK_EVENT_DEVICE_BACK_KEY CLOCK_EVENT_MAP(CLOCK_EVENT_DEVICE, 0x0)
+#define CLOCK_EVENT_DEVICE_LCD 0x0004
+#define CLOCK_EVENT_DEVICE_LCD_ON CLOCK_EVENT_MAP(CLOCK_EVENT_DEVICE_LCD, 0x0)
+#define CLOCK_EVENT_DEVICE_LCD_OFF CLOCK_EVENT_MAP(CLOCK_EVENT_DEVICE_LCD, 0x1)
+
+/*
+ * ongoing events
+ */
+#define CLOCK_EVENT_SCREEN_READER 0x0008
+#define CLOCK_EVENT_SCREEN_READER_ON CLOCK_EVENT_MAP(CLOCK_EVENT_SCREEN_READER, 0x0)
+#define CLOCK_EVENT_SCREEN_READER_OFF CLOCK_EVENT_MAP(CLOCK_EVENT_SCREEN_READER, 0x1)
+#define CLOCK_EVENT_SAP 0x0020
+#define CLOCK_EVENT_SAP_ON CLOCK_EVENT_MAP(CLOCK_EVENT_SAP, 0x0)
+#define CLOCK_EVENT_SAP_OFF CLOCK_EVENT_MAP(CLOCK_EVENT_SAP, 0x1)
+#define CLOCK_EVENT_MODEM 0x0040
+#define CLOCK_EVENT_MODEM_ON CLOCK_EVENT_MAP(CLOCK_EVENT_MODEM, 0x0)
+#define CLOCK_EVENT_MODEM_OFF CLOCK_EVENT_MAP(CLOCK_EVENT_MODEM, 0x1)
+#define CLOCK_EVENT_DND 0x0080
+#define CLOCK_EVENT_DND_ON CLOCK_EVENT_MAP(CLOCK_EVENT_DND, 0x0)
+#define CLOCK_EVENT_DND_OFF CLOCK_EVENT_MAP(CLOCK_EVENT_DND, 0x1)
+#define CLOCK_EVENT_SCROLLER 0x0100
+#define CLOCK_EVENT_SCROLLER_FREEZE_ON CLOCK_EVENT_MAP(CLOCK_EVENT_SCROLLER, 0x0)
+#define CLOCK_EVENT_SCROLLER_FREEZE_OFF CLOCK_EVENT_MAP(CLOCK_EVENT_SCROLLER, 0x1)
+#define CLOCK_EVENT_POWER 0x0200
+#define CLOCK_EVENT_POWER_ENHANCED_MODE_ON CLOCK_EVENT_MAP(CLOCK_EVENT_POWER, 0x0)
+#define CLOCK_EVENT_POWER_ENHANCED_MODE_OFF CLOCK_EVENT_MAP(CLOCK_EVENT_POWER, 0x1)
+#define CLOCK_EVENT_SIM 0x0400
+#define CLOCK_EVENT_SIM_INSERTED CLOCK_EVENT_MAP(CLOCK_EVENT_SIM, 0x0)
+#define CLOCK_EVENT_SIM_NOT_INSERTED CLOCK_EVENT_MAP(CLOCK_EVENT_SIM, 0x1)
+#define CLOCK_EVENT_CFWD 0x0800
+
+#define CLOCK_EVENT_CATEGORY(X) CLOCK_EVENT_MAP(X, 0x0)
+
+#define CLOCK_SMART_SIGNAL_PAUSE "clock,paused"
+#define CLOCK_SMART_SIGNAL_RESUME "clock,resume"
+#define CLOCK_SMART_SIGNAL_VIEW_REQUEST "clock,view,request"
+
+#define CLOCK_VIEW_REQUEST_DRAWER_HIDE 1
+#define CLOCK_VIEW_REQUEST_DRAWER_SHOW 2
+
+#define CLOCK_ATTACHED 1
+#define CLOCK_CANDIDATE 2
+
+#define CLOCK_INF_MINICONTROL 1
+#define CLOCK_INF_DBOX 2
+
+#define CLOCK_CONF_NONE 0
+#define CLOCK_CONF_WIN_ACTIVATION 1
+#define CLOCK_CONF_CLOCK_CONFIGURATION 2
+
+#define CLOCK_VIEW_TYPE_DRAWER 1
+
+#define VCONFKEY_MUSIC_STATUS "memory/homescreen/music_status"
+
+enum {
+ INDICATOR_HIDE_WITH_EFFECT,
+ INDICATOR_HIDE,
+ INDICATOR_SHOW,
+ INDICATOR_SHOW_WITH_EFFECT,
+};
+
+typedef struct {
+ int configure;
+ int interface;
+ int app_type;
+ int async;
+ int state;
+ int use_dead_monitor;
+ int pid;
+ int need_event_relay;
+ char *view_id;
+ char *appid;
+ char *pkgname;
+ void *view;
+ int w;
+ int h;
+} clock_s;
+typedef clock_s * clock_h;
+
+typedef struct _clock_inf_s {
+ int async;
+ int use_dead_monitor;
+ int (*prepare) (clock_h);
+ int (*config) (clock_h, int);
+ int (*create) (clock_h);
+ int (*attached_cb) (clock_h);
+ int (*destroy) (clock_h);
+} clock_inf_s;
+
+/*!
+ * Clock Service
+ */
+extern void clock_service_init(void);
+extern void clock_service_fini(void);
+
+extern void clock_service_mode_set(int mode);
+extern int clock_service_mode_get(void);
+extern char *clock_service_clock_pkgname_get(void);
+extern void clock_service_request(int mode);
+extern void clock_service_pause(void);
+extern void clock_service_resume(void);
+extern void clock_service_app_dead_cb(int pid);
+extern void clock_service_event_handler(clock_h clock, int event);
+extern int clock_service_clock_selector_launch(void);
+extern void clock_service_scroller_freezed_set(int is_freeze);
+extern int clock_service_scroller_freezed_get(void);
+extern const int const clock_service_get_retry_count(void);
+
+/*!
+ * Clock Event
+ */
+extern void clock_service_event_register(void);
+extern void clock_service_event_deregister(void);
+extern int clock_service_event_state_get(int event_source);
+extern void clock_service_event_app_dead_cb(int pid);
+
+/*!
+ * Clock manager
+ */
+extern clock_h clock_new(const char *pkgname);
+extern void clock_del(clock_h clock);
+
+extern int clock_manager_view_prepare(clock_h clock);
+extern int clock_manager_view_configure(clock_h clock, int type);
+extern int clock_manager_view_create(clock_h clock);
+extern int clock_manager_view_destroy(clock_h clock);
+extern int clock_manager_view_attach(clock_h clock);
+extern int clock_manager_view_deattach(clock_h clock);
+extern int clock_manager_view_exchange(clock_h clock, void *view);
+
+extern int clock_manager_clock_inf_type_get(const char *pkgname);
+extern clock_h clock_manager_clock_get(int type);
+extern void clock_manager_clock_set(int type, clock_h clock);
+extern int clock_manager_view_state_get(int view_type);
+
+/*!
+ * Clock View
+ */
+extern void clock_view_indicator_show(int is_show);
+extern Evas_Object *clock_view_add(Evas_Object *parent, Evas_Object *item);
+extern int clock_view_attach(Evas_Object *page);
+extern int clock_view_deattach(Evas_Object *page);
+extern void clock_view_show(Evas_Object *page);
+extern void clock_view_event_handler(clock_h clock, int event, int need_relay);
+extern Evas_Object *clock_view_empty_add(void);
+extern int clock_view_display_state_get(Evas_Object *page, int view_type);
+extern Evas_Object *clock_view_get_item(Evas_Object *view);
+
+/*!
+ * Clock Hidden view
+ */
+extern Evas_Object *clock_view_hidden_add(Evas_Object *page);
+extern void clock_view_hidden_event_handler(Evas_Object *page, int event);
+
+/*!
+ * Clock Visual Cue
+ */
+extern Evas_Object *clock_view_cue_add(Evas_Object *page);
+extern void clock_view_cue_display_set(Evas_Object *page, int is_display, int is_need_vi);
+
+/*!
+ * Clock Shortcut
+ */
+extern void clock_shortcut_init(void);
+extern void clock_shortcut_fini(void);
+extern void clock_shortcut_view_add(Evas_Object *page);
+extern void clock_shortcut_app_dead_cb(int pid);
+
+/*!
+ * Clock indicator
+ */
+extern void clock_view_indicator_add(Evas_Object *page);
+extern void clock_view_indicator_event_handler(Evas_Object *page, int event);
+
+/*!
+ * Clock Uitility
+ */
+extern char *clock_util_wms_configuration_get(void);
+extern int clock_util_wms_configuration_set(const char *pkgname);
+extern int clock_util_provider_launch(const char *clock_pkgname, int *pid_a, int configure);
+extern void clock_util_terminate_clock_by_pid(int pid);
+extern int clock_util_screen_reader_enabled_get(void);
+extern int clock_util_setting_conf_get(void);
+extern void clock_util_setting_conf_set(int value);
+extern void clock_util_setting_conf_bundle_add(bundle *b, int type);
+extern const char *clock_util_setting_conf_content(int type);
+
+/*!
+ * Clock interface::minicontrol
+ */
+extern void clock_inf_minictrl_event_hooker(int action, int pid, const char *minictrl_id, int is_realized, int width, int height);
+
+/*!
+ * Clock interface::dbox
+ */
+extern int clock_inf_prepare_first_clock(const char *pkgname);
+
+#endif
diff --git a/home/include/conf.h b/home/include/conf.h
new file mode 100755
index 0000000..8cbdd01
--- /dev/null
+++ b/home/include/conf.h
@@ -0,0 +1,87 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _W_HOME_CONF_H_
+#define _W_HOME_CONF_H_
+
+/* Layout */
+#define BASE_WIDTH (360.0)
+#define BASE_HEIGHT (480.0)
+
+#define SCROLLER_NORMAL_HEIGHT BASE_HEIGHT
+#define SCROLLER_EDIT_HEIGHT BASE_HEIGHT
+
+#define INDICATOR_START_Y (7.0)
+#define INDICATOR_HEIGHT (20.0)
+
+#define INDEX_THUMBNAIL_HOME_BG_SIZE 20 20
+#define INDEX_THUMBNAIL_HOME_IND_SIZE 20 20
+
+#define PAGE_EDIT_PAD_WIDTH (16.0)
+#define PAGE_EDIT_SIDE_PAD_WIDTH (40+16)
+
+#define PAGE_EDIT_WIDTH (PAGE_EDIT_PAD_WIDTH+216.0+PAGE_EDIT_PAD_WIDTH)
+#define PAGE_EDIT_HEIGHT (25.0+29.0+265.0)
+
+#define ITEM_EDIT_WIDTH (216.0)
+#define ITEM_EDIT_HEIGHT (288.0)
+
+#define ITEM_EDIT_EF_WIDTH 242
+#define ITEM_EDIT_EF_HEIGHT 314
+
+#define ITEM_EDIT_LINE_WIDTH (ITEM_EDIT_WIDTH+4)
+#define ITEM_EDIT_LINE_HEIGHT (ITEM_EDIT_HEIGHT+4)
+
+#define ADD_WIDGET_BUTTON_HEIGHT (24+37+24)
+#define BUTTON_HEIGHT_REL (0.15)
+#define ADD_WIDGET_BUTTON_TEXT_MIN 328 86
+#define ADD_VIEWER_PREVIEW_WIDTH 216
+#define ADD_VIEWER_PREVIEW_HEIGHT 288
+#define ADD_VIEWER_PREVIEW_LINE_WIDTH (ADD_VIEWER_PREVIEW_WIDTH+4)
+#define ADD_VIEWER_PREVIEW_LINE_HEIGHT (ADD_VIEWER_PREVIEW_HEIGHT+4)
+#define ADD_VIEWER_TEXT_HEIGHT 74
+#define ADD_VIEWER_PAGE_WIDTH 360
+#define ADD_VIEWER_PAGE_HEIGHT 377
+#define ADD_VIEWER_PREVIEW_PAD_LEFT 72
+#define ADD_VIEWER_PREVIEW_PAD_TOP 7
+#define ADD_VIEWER_PAD 8
+
+#define CLOCK_SHORTCUT_AREA_W 90
+#define CLOCK_SHORTCUT_AREA_H 90
+
+#define BEZEL_MOVE_THRESHOLD 80
+
+#define BUTTON_LOCATION 411.5
+
+#define CLOSE_BUTTON_X 316
+#define CLOSE_BUTTON_Y 41
+
+#define IMAGE_Y 112
+
+/* Configuration */
+#define BOOTING_STATE_DONE 1
+#define MAX_DBOX 5
+#define LONGPRESS_THRESHOLD 15
+#define LONGPRESS_TIME 0.5f
+#define INDEX_UPDATE_TIME 0.1f
+
+#define DEFAULT_XML_FILE RESDIR"/default_items.xml"
+#define TTS_XML_FILE RESDIR"/default_items_tts.xml"
+#define APP_CONTROL_OPERATION_MAIN "http://tizen.org/appcontrol/operation/main"
+
+#endif // _W_HOME_CONF_H_
+// End of file
diff --git a/home/include/critical_log.h b/home/include/critical_log.h
new file mode 100755
index 0000000..169ebb6
--- /dev/null
+++ b/home/include/critical_log.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2013 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+extern int critical_log(const char *func, int line, const char *fmt, ...);
+extern int critical_log_init(const char *tag);
+extern void critical_log_fini(void);
+
+#if defined(ENABLE_CRITICAL_LOG)
+#define CRITICAL_LOG(args...) critical_log(__func__, __LINE__, args)
+#define CRITICAL_LOG_INIT(a) critical_log_init(a)
+#define CRITICAL_LOG_FINI() critical_log_fini()
+#else
+#define CRITICAL_LOG(args...)
+#define CRITICAL_LOG_INIT(a) (0)
+#define CRITICAL_LOG_FINI()
+#endif
+
+/* End of a file */
diff --git a/home/include/db.h b/home/include/db.h
new file mode 100755
index 0000000..7ab7806
--- /dev/null
+++ b/home/include/db.h
@@ -0,0 +1,60 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_DB_H__
+#define __W_HOME_DB_H__
+
+typedef struct stmt stmt_h;
+typedef enum {
+ DB_FILE_INVALID = 0,
+ DB_FILE_NORMAL,
+ DB_FILE_TTS,
+ DB_FILE_MAX
+} db_file_e;
+
+extern w_home_error_e db_init(db_file_e db_file);
+extern w_home_error_e db_open(const char *db_file);
+extern stmt_h *db_prepare(const char *query);
+extern w_home_error_e db_bind_bool(stmt_h *handle, int idx, bool value);
+extern w_home_error_e db_bind_int(stmt_h *handle, int idx, int value);
+extern w_home_error_e db_bind_str(stmt_h *handle, int idx, const char *str);
+extern w_home_error_e db_next(stmt_h *handle);
+extern bool db_get_bool(stmt_h *handle, int index);
+extern int db_get_int(stmt_h *handle, int index);
+extern const char *db_get_str(stmt_h *handle, int index);
+extern w_home_error_e db_reset(stmt_h *handle);
+extern w_home_error_e db_finalize(stmt_h *handle);
+extern w_home_error_e db_exec(const char *query);
+extern void db_close(void);
+
+extern w_home_error_e db_begin_transaction(void);
+extern w_home_error_e db_end_transaction(bool success);
+
+extern int db_insert_item(const char *id, const char *subid, int ordering);
+extern int db_update_item(const char *id, const char *subid, int ordering);
+extern int db_update_item_by_ordering(const char *id, const char *subid, int ordering);
+extern int db_remove_item(const char *id, const char *subid);
+extern int db_remove_item_after_max(int max);
+extern int db_remove_all_item(void);
+
+extern int db_count_item(const char *id, const char *subid);
+extern int db_count_ordering(int ordering);
+
+extern w_home_error_e db_read_list(Eina_List *page_info_list);
+extern Eina_List *db_write_list(void);
+
+#endif // __W_HOME_DB_H__
diff --git a/home/include/dbox.h b/home/include/dbox.h
new file mode 100644
index 0000000..69a7d72
--- /dev/null
+++ b/home/include/dbox.h
@@ -0,0 +1,34 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_DYNAMICBOX_H__
+#define __W_HOME_DYNAMICBOX_H__
+
+
+extern Evas_Object *dbox_create(Evas_Object *parent, const char *id, const char *subid, double period);
+extern void dbox_destroy(Evas_Object *dynamicbox);
+
+extern void dbox_add_callback(Evas_Object *dynamicbox, Evas_Object *page);
+extern void dbox_del_callback(Evas_Object *dynamicbox);
+
+extern void dbox_set_update_callback(Evas_Object *obj, int (*updated)(Evas_Object *obj));
+extern void dbox_set_scroll_callback(Evas_Object *obj, int (*scroll)(Evas_Object *obj, int hold));
+
+extern void dbox_init(Evas_Object *win);
+extern void dbox_fini(void);
+
+#endif /* __W_HOME_DYNAMICBOX_H__ */
diff --git a/home/include/dbus.h b/home/include/dbus.h
new file mode 100755
index 0000000..6c073e5
--- /dev/null
+++ b/home/include/dbus.h
@@ -0,0 +1,96 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_DBUS_H__
+#define __W_HOME_DBUS_H__
+
+typedef enum {
+ DBUS_EVENT_COOLDOWN_STATE_CHANGED = 0,
+ DBUS_EVENT_ALPM_MANAGER_STATE_CHANGED = 1,
+ DBUS_EVENT_LCD_ON = 2,
+ DBUS_EVENT_LCD_OFF = 3,
+ DBUS_EVENT_MAX,
+} dbus_event_type_e;
+
+/*!
+ * DBUS interfaces and signals
+ */
+#define DBUS_ALPM_MANAGER_PATH "/Org/Tizen/System/AlpmMgr"
+#define DBUS_ALPM_MANAGER_INTERFACE "org.tizen.system.alpmmgr"
+#define DBUS_ALPM_MANAGER_MEMBER_STATUS "ALPMStatus"
+
+#define DBUS_WAKEUP_GESTURE_PATH "/org/tizen/sensor/context/gesture"
+#define DBUS_WAKEUP_GESTURE_INTERFACE "org.tizen.sensor.context.gesture"
+#define DBUS_WAKEUP_GESTURE_MEMBER_WAKEUP "wakeup"
+
+#define DBUS_LOW_BATTERY_PATH "/Org/Tizen/System/Popup/Lowbat"
+#define DBUS_LOW_BATTERY_INTERFACE "org.tizen.system.popup.Lowbat"
+#define DBUS_LOW_BATTERY_MEMBER_EXTREME_LEVEL "Extreme"
+
+#define DBUS_HOME_BUS_NAME "org.tizen.coreapps.home"
+#define DBUS_HOME_RAISE_PATH "/Org/Tizen/Coreapps/home/raise"
+#define DBUS_HOME_RAISE_INTERFACE DBUS_HOME_BUS_NAME".raise"
+#define DBUS_HOME_RAISE_MEMBER "homeraise"
+
+#define DBUS_PROCSWEEP_PATH "/Org/Tizen/ResourceD/Process"
+#define DBUS_PROCSWEEP_INTERFACE "org.tizen.resourced.process"
+#define DBUS_PROCSWEEP_METHOD "ProcSweep"
+
+#define DBUS_DEVICED_BUS_NAME "org.tizen.system.deviced"
+#define DBUS_DEVICED_PATH "/Org/Tizen/System/DeviceD"
+#define DBUS_DEVICED_INTERFACE DBUS_DEVICED_BUS_NAME
+// deviced::display
+#define DBUS_DEVICED_DISPLAY_PATH DBUS_DEVICED_PATH"/Display"
+#define DBUS_DEVICED_DISPLAY_INTERFACE DBUS_DEVICED_INTERFACE".display"
+#define DBUS_DEVICED_DISPLAY_MEMBER_LCD_ON "LCDOn"
+#define DBUS_DEVICED_DISPLAY_MEMBER_LCD_OFF "LCDOff"
+#define DBUS_DEVICED_DISPLAY_MEMBER_LCD_ON_BY_POWERKEY "LCDOnByPowerkey"
+#define DBUS_DEVICED_DISPLAY_METHOD_LCD_OFF "PowerKeyLCDOff"
+#define DBUS_DEVICED_DISPLAY_METHOD_CHANGE_STATE "changestate"
+#define DBUS_DEVICED_DISPLAY_METHOD_CUSTOM_LCD_ON "CustomLCDOn"
+#define DBUS_DEVICED_DISPLAY_COMMAND_LCD_ON "lcdon"
+// deviced::cooldown mode
+#define DBUS_DEVICED_SYSNOTI_PATH DBUS_DEVICED_PATH"/SysNoti"
+#define DBUS_DEVICED_SYSNOTI_INTERFACE DBUS_DEVICED_INTERFACE".SysNoti"
+#define DBUS_DEVICED_SYSNOTI_MEMBER_COOLDOWN_CHANGED "CoolDownChanged"
+#define DBUS_DEVICED_SYSNOTI_METHOD_COOLDOWN_STATUS "GetCoolDownStatus"
+// deviced::cpu booster
+#define DBUS_DEVICED_CPU_BOOSTER_PATH DBUS_DEVICED_PATH"/PmQos"
+#define DBUS_DEVICED_CPU_BOOSTER_INTERFACE DBUS_DEVICED_INTERFACE".PmQos"
+#define DBUS_DEVICED_CPU_BOOSTER_METHOD_HOME "HomeScreen"
+#define DBUS_DEVICED_CPU_BOOSTER_METHOD_HOME_LAUNCH "AppLaunchHome"
+
+/*!
+ * DBUS main functions
+ */
+extern void *home_dbus_connection_get(void);
+extern void home_dbus_init(void *data);
+extern void home_dbus_fini(void *data);
+extern int home_dbus_register_cb(int type, void (*result_cb)(void *, void *), void *result_data);
+extern void home_dbus_unregister_cb(int type, void (*result_cb)(void *, void *));
+/*!
+ * DBUS utility functions
+ */
+extern void home_dbus_lcd_on_signal_send(Eina_Bool wristup);
+extern void home_dbus_lcd_off_signal_send(void);
+extern void home_dbus_procsweep_signal_send(void);
+extern void home_dbus_home_raise_signal_send(void);
+extern void home_dbus_cpu_booster_signal_send(void);
+extern void home_dbus_scroll_booster_signal_send(int sec);
+extern char *home_dbus_cooldown_status_get(void);
+
+#endif
diff --git a/home/include/dynamicbox_evas.h b/home/include/dynamicbox_evas.h
new file mode 100644
index 0000000..8d0b62b
--- /dev/null
+++ b/home/include/dynamicbox_evas.h
@@ -0,0 +1,357 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __DYNAMICBOX_EVAS_H
+#define __DYNAMICBOX_EVAS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DYNAMICBOX_EVAS_DEFAULT_PERIOD -1.0f /**< Default Update Period */
+#define DYNAMICBOX_SMART_SIGNAL_DBOX_CREATE_ABORTED "dbox,create,aborted" /**< Dynamicbox creation is aborted */
+#define DYNAMICBOX_SMART_SIGNAL_DBOX_CREATED "dbox,created" /**< Dynamicbox is created */
+#define DYNAMICBOX_SMART_SIGNAL_DBOX_RESIZE_ABORTED "dbox,resize,aborted" /**< Resizing dynamicbox is aborted */
+#define DYNAMICBOX_SMART_SIGNAL_DBOX_RESIZED "dbox,resized" /**< Dynamicbox is resized */
+#define DYNAMICBOX_SMART_SIGNAL_DBOX_FAULTED "dbox,faulted" /**< Dynamicbox has faulted */
+#define DYNAMICBOX_SMART_SIGNAL_UPDATED "updated" /**< Dynamicbox content is updated */
+#define DYNAMICBOX_SMART_SIGNAL_EXTRA_INFO_UPDATED "info,updated" /**< Dynamicbox extra info is updated */
+#define DYNAMICBOX_SMART_SIGNAL_PROVIDER_DISCONNECTED "provider,disconnected" /**< Provider is disconnected */
+#define DYNAMICBOX_SMART_SIGNAL_GBAR_DESTROYED "gbar,destroyed" /**< GBAR is destroyed */
+#define DYNAMICBOX_SMART_SIGNAL_GBAR_ABORTED "gbar,aborted" /**< GBAR creation is aborted */
+#define DYNAMICBOX_SMART_SIGNAL_GBAR_CREATED "gbar,created" /**< GBAR is created */
+#define DYNAMICBOX_SMART_SIGNAL_FLICKDOWN_CANCELLED "flickdown,cancelled" /**< Flick down is canceld */
+#define DYNAMICBOX_SMART_SIGNAL_CONTROL_SCROLLER "control,scroller" /**< Control Scroller */
+#define DYNAMICBOX_SMART_SIGNAL_DBOX_DELETED "dbox,deleted" /**< DynamicBox is deleted */
+#define DYNAMICBOX_SMART_SIGNAL_PERIOD_CHANGED "dbox,period,changed" /**< Period is changed */
+
+/**
+ * \brief
+ * Data structure for Smart Callback Event
+ */
+struct dynamicbox_evas_event_info {
+ const char *pkgname; /**< Dynamicbox Application Id */
+ int event; /**< Event type - DBOX_EVENT_XXX, refer the dynamicbox.h */
+ int error; /**< Error type - DBOX_STATUS_XXX, refer the dynamicbox.h */
+};
+
+enum dynamicbox_evas_raw_event_type {
+ DYNAMICBOX_EVAS_RAW_DELETE = 0x00,
+ DYNAMICBOX_EVAS_RAW_CREATE = 0x02,
+ DYNAMICBOX_EVAS_RAW_MAX = 0xff,
+};
+
+struct dynamicbox_evas_raw_event_info {
+ const char *pkgname;
+ enum dynamicbox_evas_raw_event_type type;
+ int error;
+ Evas_Object *dynamicbox;
+};
+
+/**
+ * \brief
+ * Configuration keys
+ */
+enum dynamicbox_evas_conf {
+ DYNAMICBOX_EVAS_MANUAL_PAUSE_RESUME = 0x0001, /**< Visibility will be changed manually */
+ DYNAMICBOX_EVAS_SHARED_CONTENT = 0x0002, /**< Multiple instances will share the content of one real instance */
+ DYNAMICBOX_EVAS_SUPPORT_GBAR = 0x0004, /**< GBAR will be used */
+ DYNAMICBOX_EVAS_USE_FIXED_SIZE = 0x0008, /**< Dynamicbox will be resized to specific size only */
+ DYNAMICBOX_EVAS_EASY_MODE = 0x0010, /**< Easy mode on/off */
+ DYNAMICBOX_EVAS_SCROLL_X = 0x0020, /**< Box will be scrolled from left to right vice versa */
+ DYNAMICBOX_EVAS_SCROLL_Y = 0x0040, /**< Box will be scrolled from top to bottom vice versa */
+ DYNAMICBOX_EVAS_EVENT_AUTO_FEED = 0x0080, /**< Feeds event automatically from the master provider */
+ DYNAMICBOX_EVAS_DELAYED_PAUSE_RESUME = 0x0100, /**< Delaying the pause/resume when it is automatically changed */
+ DYNAMICBOX_EVAS_SENSITIVE_MOVE = 0x0200, /**< Force feeds mouse up event if the box is moved */
+ DYNAMICBOX_EVAS_AUTO_RENDER_SELECTION = 0x0400, /**< Select render automatically, if a box moved, do not sync using animator, or use the animator */
+ DYNAMICBOX_EVAS_DIRECT_UPDATE = 0x0800, /**< Enable direct update path */
+ DYNAMICBOX_EVAS_USE_RENDER_ANIMATOR = 0x1000, /**< Use the render animator or not */
+ DYNAMICBOX_EVAS_UNKNOWN = 0xFFFF
+};
+
+enum dynamicbox_access_result {
+ DYNAMICBOX_ACCESS_DONE = 0x00,
+ DYNAMICBOX_ACCESS_FIRST = 0x01,
+ DYNAMICBOX_ACCESS_LAST = 0x02,
+ DYNAMICBOX_ACCESS_READ = 0x04,
+ DYNAMICBOX_ACCESS_ERROR = 0x80,
+ DYNAMICBOX_ACCESS_UNKNOWN = 0xFF
+};
+
+/**
+ * @brief Initialize the dynamicbox system
+ * @param[in] win Window object
+ * @param[in] force_to_buffer if you want use the naive buffer directly (instead of resource id), use 1 or 0.
+ * @return int
+ * @retval
+ * @see evas_object_dynamicbox_fini()
+ */
+extern int evas_object_dynamicbox_init(Evas_Object *win, int force_to_buffer);
+
+/**
+ * @brief Finalize the dynamicbox system
+ * @return int
+ * @retval
+ * @see evas_object_dynamicbox_init()
+ */
+extern int evas_object_dynamicbox_fini(void);
+
+/**
+ * @brief Create a new dynamicbox object
+ * @param[in] parent
+ * @param[in] dbox_id
+ * @param[in] content_info
+ * @param[in] cluster
+ * @param[in] category
+ * @param[in] period update period
+ * @return Evas_Object*
+ * @retval NULL if it fails to create a new dynamicbox object
+ */
+extern Evas_Object *evas_object_dynamicbox_add(Evas_Object *parent, const char *dbox_id, const char *content_info, const char *cluster, const char *category, double period);
+
+/**
+ * @brief Close the Glance Bar if it is opened
+ * @param[in] dynamicbox Dynamicbox object
+ * @return int
+ */
+extern int evas_object_dynamicbox_destroy_gbar(Evas_Object *dynamicbox);
+
+/**
+ * @brief if a viewer is resumed, use this function to notify it to the providers.
+ * @details if you call this, all providers will gets resumed event.
+ * @return int
+ * @see evas_object_dynamicbox_paused()
+ */
+extern int evas_object_dynamicbox_resumed(void);
+
+/**
+ * @brief If a viewer is paused, use this function to notify it to the providers
+ * @detail if you call this, all providers will gets paused event.
+ * @return int
+ */
+extern int evas_object_dynamicbox_paused(void);
+
+/**
+ * @brief Change the state of each dynamicbox. if you want made a box should be paused, call this.
+ * @param[in] dynamicbox Dynamicbox object
+ * @return int
+ */
+extern int evas_object_dynamicbox_pause(Evas_Object *dynamicbox);
+
+/**
+ * @brief Change the state of each dynamicbox. If you want made a box should be resumed, call this.
+ * @param[in] dynamicbox Dynamicbox object
+ * @return int
+ */
+extern int evas_object_dynamicbox_resume(Evas_Object *dynamicbox);
+
+/**
+ * @brief Set the viewe port of given dynamicbox
+ * @param[in] dynamicbox
+ * @param[in] x
+ * @param[in] y
+ * @param[in] w
+ * @param[in] h
+ * @return int
+ */
+extern int evas_object_dynamicbox_view_port_set(Evas_Object *dynamicbox, int x, int y, int w, int h);
+
+/**
+ * @brief Get the current view port of given dynamicbox
+ * @param[in] dynamicbox
+ * @param[out] x
+ * @param[out] y
+ * @param[out] w
+ * @param[out] h
+ * @return int
+ */
+extern int evas_object_dynamicbox_view_port_get(Evas_Object *dynamicbox, int *x, int *y, int *w, int *h);
+
+/**
+ * @brief Change the configurable values of dynamicbox system
+ * @param[in] type Configuration item
+ * @param[in] value Its value
+ * @return int
+ */
+extern int evas_object_dynamicbox_conf_set(enum dynamicbox_evas_conf type, int value);
+
+/**
+ * @brief Content string of dynamicbox
+ * @details This string should be used for creating dynamicbox again after reboot device or recovered from crash(abnormal status)
+ * @param[in] dynamicbox Dynamicbox Object
+ * @return const char * String of content
+ * @retval NULL if there is no specific content string.
+ */
+extern const char *evas_object_dynamicbox_content(Evas_Object *dynamicbox);
+
+/**
+ * @brief Summarized string of dynamicbox content.
+ * @details If the accessibility feature is turned on, the homescreen can read this text to describe the dynamicbox.
+ * @param[in] dynamicbox Dynamicbox Object
+ * @return const char * Text should be read
+ * @retval NULL if there is no summarized text for content of given dynamicbox
+ */
+extern const char *evas_object_dynamicbox_title(Evas_Object *dynamicbox);
+
+/**
+ * @brief Get the dynamicbox Id
+ * @param[in] dynamicbox Dynamicbox Object
+ * @return const char * Dynamic Box Id
+ * @retval NULL if an error occurred
+ */
+extern const char *evas_object_dynamicbox_dbox_id(Evas_Object *dynamicbox);
+
+/**
+ * @brief Current period of updates
+ * @param[in] dynamicbox Dynamicbox Object
+ * @return double
+ * @retval Update period
+ */
+extern double evas_object_dynamicbox_period(Evas_Object *dynamicbox);
+
+/**
+ * @brief Cancelate click event procedure.
+ * @details If you call this after feed the mouse_down(or mouse_set) event, the box will get ON_HOLD events.\n
+ * If a box gets ON_HOLD event, it will not do anything even if you feed mouse_up(or mouse_unset) event.\n
+ * @param[in] dynamicbox Dynamicbox Object
+ * @return void
+ */
+extern void evas_object_dynamicbox_cancel_click(Evas_Object *dynamicbox);
+
+/**
+ * @brief This function should be called right after create the dynamicbox object. before resizing it.
+ * @param[in] dynamicbox
+ * @return void
+ */
+extern void evas_object_dynamicbox_disable_preview(Evas_Object *dynamicbox);
+
+/**
+ * @brief While loading a box, hide the help text
+ * @param[in] dynamicbox
+ * @return void
+ */
+extern void evas_object_dynamicbox_disable_overlay_text(Evas_Object *dynamicbox);
+
+/**
+ * @brief Do not display the overlay layer while loading a new box.
+ * @details if you disable it, there is no preview & help text while creating a dynamicbox object
+ * @return void
+ */
+extern void evas_object_dynamicbox_disable_loading(Evas_Object *dynamicbox);
+
+/**
+ * @brief Feeds the mouse_up event forcely.
+ * @details This is very similiar with evas_object_dynamicbox_cancel_click(), but this will sends mouse_up event explicitly.\n
+ * Also feed the ON_HOLD event before feeds mouse_up event.
+ * @param[in] dynamicbox Dynamic Box
+ * @return int
+ */
+extern int evas_object_dynamicbox_force_mouse_up(Evas_Object *dynamicbox);
+
+/**
+ * @brief Feeds accessibility events
+ * @param[in] dynamicbox
+ * @param[in] type
+ * @param[in] info
+ * @param[in] ret_cb
+ * @param[in] dta
+ * @return int
+ */
+extern int evas_object_dynamicbox_access_action(Evas_Object *dynamicbox, int type, void *info, void (*ret_cb)(Evas_Object *obj, int ret, void *data), void *data);
+
+/**
+ * @brief Activate
+ * @param[in] dynamicbox
+ */
+extern void evas_object_dynamicbox_activate(Evas_Object *dynamicbox);
+
+/**
+ * @brief
+ * @param[in] dynamicbox
+ */
+extern int evas_object_dynamicbox_is_faulted(Evas_Object *dynamicbox);
+
+/**
+ * @brief
+ * @param[in] type
+ * @param[in] cb
+ * @param[in] data
+ * @return int
+ */
+extern int evas_object_dynamicbox_unset_raw_event_callback(enum dynamicbox_evas_raw_event_type type, void (*cb)(struct dynamicbox_evas_raw_event_info *info, void *data), void *data);
+
+/**
+ * @brief
+ * @param[in] type
+ * @param[in] cb
+ * @param[in] data
+ */
+extern int evas_object_dynamicbox_set_raw_event_callback(enum dynamicbox_evas_raw_event_type type, void (*cb)(struct dynamicbox_evas_raw_event_info *info, void *data), void *data);
+
+/**
+ * @brief If you don't want change the visibility automatically, freeze it.\n
+ * The visibility will not be changed even though a box disappeared(hidden)/displayed(shown) from/on the screen.
+ * @param[in] dynamicbox
+ * @param[in] status
+ * @return int
+ */
+extern int evas_object_dynamicbox_freeze_visibility(Evas_Object *dynamicbox, int status);
+
+/**
+ * @brief
+ * @param[in] dynamicbox
+ * @return int
+ */
+extern int evas_object_dynamicbox_thaw_visibility(Evas_Object *dynamicbox);
+
+/**
+ * @brief Get the state of visibility option.
+ * @param[in] dynamicbox
+ * @return int
+ */
+extern int evas_object_dynamicbox_visibility_is_freezed(Evas_Object *dynamicbox);
+
+/**
+ * @brief Dump a contents of dynamicbox to a given filename.
+ * @param[in] dynamicbox Dynamicbox object
+ * @param[in] filename Filename will be used for saving content of a dynamicbox
+ * @return int
+ */
+extern int evas_object_dynamicbox_dump(Evas_Object *dynamicbox, const char *filename);
+
+/**
+ * @brief Validate the object, whether it is a dynamicbox object or not
+ * @param[in] dynamicbox
+ * @return int
+ */
+extern int evas_object_dynamicbox_is_dynamicbox(Evas_Object *dynamicbox);
+
+/**
+ * @brief Before delete a box, set the deletion mode using this.
+ * @param[in] dynamicbox Dynamicbox Object which will be deleted soon
+ * @param[in] flag 1 if you delete this dynamicbox instance permanently, of 0 if you want keep it and it will be re-created soon.
+ * @return void
+ */
+extern void evas_object_dynamicbox_set_permanent_delete(Evas_Object *dynamicbox, int flag);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/* End of a file */
diff --git a/home/include/edit.h b/home/include/edit.h
new file mode 100755
index 0000000..72c0791
--- /dev/null
+++ b/home/include/edit.h
@@ -0,0 +1,60 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_EDIT_H__
+#define __W_HOME_EDIT_H__
+
+#include "page.h"
+
+typedef enum {
+ EDIT_MODE_INVALID = 0,
+ EDIT_MODE_LEFT,
+ EDIT_MODE_CENTER,
+ EDIT_MODE_RIGHT,
+ EDIT_MODE_MAX,
+} edit_mode_e;
+
+extern Evas_Object *edit_create_layout(Evas_Object *layout, edit_mode_e edit_mode);
+extern void edit_destroy_layout(void *layout);
+
+extern Evas_Object *edit_create_proxy_page(Evas_Object *edit_scroller, Evas_Object *real_page, page_changeable_bg_e changable_color);
+extern void edit_destroy_proxy_page(Evas_Object *proxy_page);
+
+extern Evas_Object *edit_create_add_viewer(Evas_Object *layout);
+extern void edit_destroy_add_viewer(Evas_Object *layout);
+
+extern void edit_change_focus(Evas_Object *edit_scroller, Evas_Object *page_current);
+
+extern w_home_error_e edit_push_page_before(Evas_Object *scroller
+ , Evas_Object *page
+ , Evas_Object *before);
+extern w_home_error_e edit_push_page_after(Evas_Object *scroller
+ , Evas_Object *page
+ , Evas_Object *after);
+
+extern void edit_minify_effect_page(void *effect_page);
+extern Evas_Object *edit_create_minify_effect_page(Evas_Object *page);
+extern void edit_destroy_minify_effect_page(Evas_Object *effect_page);
+
+extern void edit_enlarge_effect_page(void *effect_page);
+extern Evas_Object *edit_create_enlarge_effect_page(Evas_Object *page);
+extern void edit_destroy_enlarge_effect_page(Evas_Object *effect_page);
+
+extern void edit_arrange_plus_page(Evas_Object *edit);
+extern char *edit_get_count_str_from_icu(int count);
+
+#endif /* __W_HOME_EDIT_H__ */
diff --git a/home/include/edit_info.h b/home/include/edit_info.h
new file mode 100755
index 0000000..10e9a91
--- /dev/null
+++ b/home/include/edit_info.h
@@ -0,0 +1,31 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_EDIT_INFO_H__
+#define __W_HOME_EDIT_INFO_H__
+
+typedef struct {
+ Evas_Object *layout;
+ Evas_Object *scroller;
+
+ Evas_Object *center_page;
+ Evas_Object *plus_page;
+
+ int is_max;
+} edit_info_s;
+
+#endif /* __W_HOME_EDIT_INFO_H__ */
diff --git a/home/include/effect.h b/home/include/effect.h
new file mode 100755
index 0000000..7f7fc44
--- /dev/null
+++ b/home/include/effect.h
@@ -0,0 +1,32 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_EFFECT_H__
+#define __W_HOME_EFFECT_H__
+
+extern w_home_error_e effect_init(void);
+extern void effect_fini(void);
+
+extern void effect_set_sound_status(int status);
+extern int effect_get_sound_status(void);
+
+extern void effect_play_sound(void);
+extern void effect_play_vibration(void);
+
+#endif //__W_HOME_EFFECT_H__
+
+// End of a file
diff --git a/home/include/gesture.h b/home/include/gesture.h
new file mode 100755
index 0000000..6c63a89
--- /dev/null
+++ b/home/include/gesture.h
@@ -0,0 +1,50 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_GESTURE_H__
+#define __W_HOME_GESTURE_H__
+
+#define HOME_GESTURE_WRISTUP_OFF 0
+#define HOME_GESTURE_WRISTUP_CLOCK 1
+#define HOME_GESTURE_WRISTUP_LASTVIEW 2
+
+#define ALPM_MANAGER_STATUS_SHOW "show"
+#define ALPM_MANAGER_STATUS_ALPM_HIDE "ALPMHide"
+#define ALPM_MANAGER_STATUS_SIMPLE_HIDE "SimpleHide"
+
+typedef enum {
+ BEZEL_UP = 0,
+ BEZEL_DOWN,
+} gesture_type_e;
+
+extern void home_gesture_init(void);
+extern void home_gesture_fini(void);
+
+extern int home_gesture_wristup_setting_get(void);
+extern void gesture_home_window_effect_set(int is_enable);
+
+extern void gesture_execute_cbs(int mode);
+
+extern w_home_error_e gesture_register_cb(
+ int mode,
+ void (*result_cb)(void *), void *result_data);
+
+extern void gesture_unregister_cb(
+ int mode,
+ void (*result_cb)(void *));
+
+#endif // __W_HOME_GESTURE_H__
diff --git a/home/include/index.h b/home/include/index.h
new file mode 100755
index 0000000..27f68ad
--- /dev/null
+++ b/home/include/index.h
@@ -0,0 +1,34 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_INDEX_H__
+#define __W_HOME_INDEX_H__
+
+#include "page.h"
+
+typedef enum {
+ INDEX_BRING_IN_NONE = 0,
+ INDEX_BRING_IN_AFTER,
+} index_bring_in_e;
+
+extern void index_bring_in_page(Evas_Object *index, Evas_Object *page);
+
+extern Evas_Object *index_create(Evas_Object *layout, Evas_Object *scroller, page_direction_e direction);
+extern void index_destroy(Evas_Object *index);
+extern void index_update(Evas_Object *index, Evas_Object *scroller, index_bring_in_e after);
+
+#endif /* __W_HOME_INDEX_H__ */
diff --git a/home/include/index_info.h b/home/include/index_info.h
new file mode 100755
index 0000000..dc325e2
--- /dev/null
+++ b/home/include/index_info.h
@@ -0,0 +1,33 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_INDEX_INFO_H__
+#define __W_HOME_INDEX_INFO_H__
+
+typedef struct {
+ /* innate features; */
+ int count;
+ int current_no;
+ page_direction_e direction;
+
+ /* acquired features */
+ Evas_Object *layout;
+ Evas_Object *scroller;
+ Eina_List *page_index_list;
+} index_info_s;
+
+#endif // __W_HOME_INDEX_INFO_H__
diff --git a/home/include/item_info.h b/home/include/item_info.h
new file mode 100755
index 0000000..33fdb48
--- /dev/null
+++ b/home/include/item_info.h
@@ -0,0 +1,58 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_ITEM_INFO_H__
+#define __W_HOME_ITEM_INFO_H__
+
+typedef enum {
+ ITEM_TYPE_IDLE_CLOCK = 0,
+ ITEM_TYPE_APP,
+ ITEM_TYPE_WIDGET,
+ ITEM_TYPE_MORE_APPS,
+ ITEM_TYPE_NXN_PAGE,
+ ITEM_TYPE_MAX,
+} item_type_e;
+
+typedef enum {
+ ITEM_ORDERING_ALL = 0,
+ ITEM_ORDERING_FIRST_TO_CENTER_LEFT,
+ ITEM_ORDERING_FIRST_TO_CENTER,
+ ITEM_ORDERING_CENTER_TO_LAST,
+ ITEM_ORDERING_CENTER_RIGHT_TO_LAST,
+ ITEM_ORDERING_MAX,
+} item_ordering_e;
+
+typedef struct {
+ /* innate features */
+ char *id;
+ char *subid;
+ item_type_e category;
+ int ordering;
+
+ /* acquired features */
+ Evas_Object *page;
+ Evas_Object *item;
+ int removable;
+} item_info_s;
+
+extern item_info_s *item_info_create(const char *id, const char *subid);
+extern void item_info_destroy(item_info_s *item_info);
+extern void item_info_list_destroy(Eina_List *page_info_list);
+
+extern int item_info_is_removable(const char *id);
+
+#endif // __W_HOME_ITEM_INFO_H__
diff --git a/home/include/key.h b/home/include/key.h
new file mode 100755
index 0000000..c2dee6e
--- /dev/null
+++ b/home/include/key.h
@@ -0,0 +1,47 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_KEY_H__
+#define __W_HOME_KEY_H__
+
+typedef enum {
+ KEY_CB_RET_CONTINUE = 0,
+ KEY_CB_RET_STOP,
+} key_cb_ret_e;
+
+typedef enum {
+ KEY_TYPE_BACK = 0,
+ KEY_TYPE_HOME,
+ KEY_TYPE_MAX,
+} key_type_e;
+
+/* Key callbacks are managed as a stack[LIFO] */
+extern w_home_error_e key_register_cb(
+ int type,
+ key_cb_ret_e (*result_cb)(void *), void *result_data);
+
+extern void key_unregister_cb(
+ int type,
+ key_cb_ret_e (*result_cb)(void *));
+
+extern void key_register(void);
+extern void key_unregister(void);
+extern void key_cb_execute(int type);
+
+#endif //__W_HOME_KEY_H__
+
+// End of a file
diff --git a/home/include/lang.h b/home/include/lang.h
new file mode 100755
index 0000000..c15fbd9
--- /dev/null
+++ b/home/include/lang.h
@@ -0,0 +1,29 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APP_TRAY_LANG_H__
+#define __APP_TRAY_LANG_H__
+
+extern w_home_error_e lang_add_id(Evas_Object *obj, const char *group, const char *id, int domain);
+extern void lang_remove_id(Evas_Object *obj, const char *group);
+
+extern w_home_error_e lang_register_cb(w_home_error_e (*result_cb)(void *), void *result_data);
+extern void lang_unregister_cb(w_home_error_e (*result_cb)(void *));
+
+extern void lang_refresh_ids(void);
+
+#endif /* __APP_TRAY_LANG_H__ */
diff --git a/home/include/layout.h b/home/include/layout.h
new file mode 100755
index 0000000..837a8e6
--- /dev/null
+++ b/home/include/layout.h
@@ -0,0 +1,40 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_LAYOUT_H__
+#define __W_HOME_LAYOUT_H__
+
+#define LAYOUT_SMART_SIGNAL_EDIT_ON "edit,on"
+#define LAYOUT_SMART_SIGNAL_EDIT_OFF "edit,off"
+#define LAYOUT_SMART_SIGNAL_FLICK_UP "flick,up"
+
+extern Evas_Object *layout_create(Evas_Object *win);
+extern void layout_destroy(Evas_Object *win);
+
+extern void layout_add_mouse_cb(Evas_Object *layout);
+extern void layout_del_mouse_cb(Evas_Object *layout);
+
+extern void layout_show_left_index(Evas_Object *layout);
+extern void layout_show_right_index(Evas_Object *layout);
+extern void layout_hide_index(Evas_Object *layout);
+
+extern int layout_is_edit_mode(Evas_Object *layout);
+
+extern void layout_set_idle(Evas_Object *layout);
+extern int layout_is_idle(Evas_Object *layout);
+
+#endif /* __W_HOME_LAYOUT_H__ */
diff --git a/home/include/layout_info.h b/home/include/layout_info.h
new file mode 100755
index 0000000..47130df
--- /dev/null
+++ b/home/include/layout_info.h
@@ -0,0 +1,37 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_LAYOUT_INFO_H__
+#define __W_HOME_LAYOUT_INFO_H__
+
+
+
+typedef struct {
+ /* innate features */
+ Evas_Object *win;
+ Evas_Object *scroller;
+ Evas_Object *index;
+ Evas_Object *gestuer_layer;
+ Evas_Object *tutorial;
+
+ /* acquired features */
+ Evas_Object *edit;
+ Evas_Object *pressed_page;
+ Evas_Object *pressed_item;
+} layout_info_s;
+
+#endif // __W_HOME_LAYOUT_INFO_H__
diff --git a/home/include/log.h b/home/include/log.h
new file mode 100755
index 0000000..348f529
--- /dev/null
+++ b/home/include/log.h
@@ -0,0 +1,154 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_LOG_H__
+#define __W_HOME_LOG_H__
+
+#include <unistd.h>
+#include <dlog.h>
+
+#undef LOG_TAG
+#define LOG_TAG "W_HOME"
+
+#if !defined(_D)
+#define _D(fmt, arg...) LOGD(fmt"\n", ##arg)
+#endif
+
+#if !defined(_W)
+#define _W(fmt, arg...) LOGW(fmt"\n", ##arg)
+#endif
+
+#if !defined(_E)
+#define _E(fmt, arg...) LOGE(fmt"\n", ##arg)
+#endif
+
+#if !defined(_SD)
+#define _SD(fmt, arg...) SECURE_LOGD(fmt"\n", ##arg)
+#endif
+
+#if !defined(_SW)
+#define _SW(fmt, arg...) SECURE_LOGW(fmt"\n", ##arg)
+#endif
+
+#if !defined(_SE)
+#define _SE(fmt, arg...) SECURE_LOGE(fmt"\n", ##arg)
+#endif
+
+#if !defined(_T)
+#define _T(package) SECURE_LOG(LOG_DEBUG, "LAUNCH", "[%s:Menuscreen:launch:done]", package);
+#endif
+
+/* Apps Debug message */
+#define LOG_TAG_APPS "APPS"
+
+#if !defined(_APPS_D)
+#define _APPS_D(fmt, arg...) LOG(LOG_DEBUG, LOG_TAG_APPS, " "fmt, ##arg)
+#endif
+
+#if !defined(_APPS_W)
+#define _APPS_W(fmt, arg...) LOG(LOG_WARN, LOG_TAG_APPS, " "fmt, ##arg)
+#endif
+
+#if !defined(_APPS_E)
+#define _APPS_E(fmt, arg...) LOG(LOG_ERROR, LOG_TAG_APPS, " "fmt, ##arg)
+#endif
+
+#if !defined(_APPS_SD)
+#define _APPS_SD(fmt, arg...) SECURE_LOG(LOG_DEBUG, LOG_TAG_APPS, " "fmt, ##arg)
+#endif
+
+#if !defined(_APPS_SW)
+#define _APPS_SW(fmt, arg...) SECURE_LOG(LOG_WARN, LOG_TAG_APPS, " "fmt, ##arg)
+#endif
+
+#if !defined(_APPS_SE)
+#define _APPS_SE(fmt, arg...) SECURE_LOG(LOG_ERROR, LOG_TAG_APPS, " "fmt, ##arg)
+#endif
+
+#ifdef ADD_FILE_LOG
+#define _F(fmt, arg...) do { \
+ FILE *fp;\
+ fp = fopen("/opt/usr/apps/org.tizen.w-home/data/logs", "a+");\
+ if (NULL == fp) break;\
+ fprintf(fp, "[%s:%d] "fmt"\n", __func__, __LINE__, ##arg); \
+ fclose(fp);\
+} while (0)
+#else
+#define _F(fmt, arg...) ;
+#endif
+
+#define retvm_if_timer(timer, expr, val, fmt, arg...) do { \
+ if (expr) { \
+ _E(fmt, ##arg); \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ timer = NULL; \
+ return (val); \
+ } \
+} while (0)
+
+#define retvm_if(expr, val, fmt, arg...) do { \
+ if(expr) { \
+ _E(fmt, ##arg); \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return val; \
+ } \
+} while (0)
+
+#define retv_if(expr, val) do { \
+ if(expr) { \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+} while (0)
+
+#define retm_if(expr, fmt, arg...) do { \
+ if(expr) { \
+ _E(fmt, ##arg); \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+} while (0)
+
+#define ret_if(expr) do { \
+ if(expr) { \
+ _E("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+} while (0)
+
+#define goto_if(expr, val) do { \
+ if(expr) { \
+ _E("(%s) -> goto", #expr); \
+ goto val; \
+ } \
+} while (0)
+
+#define break_if(expr) { \
+ if(expr) { \
+ _E("(%s) -> break", #expr); \
+ break; \
+ } \
+}
+
+#define continue_if(expr) { \
+ if(expr) { \
+ _E("(%s) -> continue", #expr); \
+ continue; \
+ } \
+}
+
+#endif /* __W_HOME_LOG_H__ */
diff --git a/home/include/main.h b/home/include/main.h
new file mode 100755
index 0000000..e38d75d
--- /dev/null
+++ b/home/include/main.h
@@ -0,0 +1,66 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_MAIN_H__
+#define __W_HOME_MAIN_H__
+
+typedef struct {
+ Evas_Object *win;
+ Evas *e;
+ Evas_Object *layout;
+ Ecore_Event_Handler *handler;
+ Ea_Theme_Color_Table *color_theme;
+ Eina_List *font_theme;
+ Elm_Theme *theme;
+
+ int first_boot;
+ int state;
+ int root_w;
+ int root_h;
+ int booting_state;
+ int is_mapbuf;
+ int is_rotated;
+ int angle;
+ int apps_pid;
+ int is_tts;
+ int panning_sensitivity;
+ int setup_wizard;
+ int is_alpm_clock_enabled;
+ int is_lcd_on;
+ int is_win_visible;
+ int is_wide_character;
+
+ Eina_List *cbs_list[APP_STATE_MAX];
+
+ Ecore_Timer *safety_init_timer;
+ int is_service_initialized;
+} main_s;
+
+extern main_s *main_get_info(void);
+
+extern void main_inc_booting_state(void);
+extern void main_dec_booting_state(void);
+extern int main_get_booting_state(void);
+
+extern w_home_error_e main_register_cb(
+ int state,
+ w_home_error_e (*result_cb)(void *), void *result_data);
+extern void main_unregister_cb(
+ int state,
+ w_home_error_e (*result_cb)(void *));
+
+#endif /* __W_HOME_MAIN_H__ */
diff --git a/home/include/mapbuf.h b/home/include/mapbuf.h
new file mode 100755
index 0000000..3b78d93
--- /dev/null
+++ b/home/include/mapbuf.h
@@ -0,0 +1,38 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APP_TRAY_MAPBUF_H__
+#define __APP_TRAY_MAPBUF_H__
+
+extern void mapbuf_set_color(Evas_Object *obj, int a);
+extern w_home_error_e mapbuf_enable(Evas_Object *obj, int force);
+extern int mapbuf_disable(Evas_Object *obj, int force);
+
+extern Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page);
+extern Evas_Object *mapbuf_unbind(Evas_Object *obj);
+
+extern Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj);
+extern Evas_Object *mapbuf_get_page(Evas_Object *obj);
+
+extern int mapbuf_is_enabled(Evas_Object *obj);
+extern int mapbuf_can_be_made(Evas_Object *obj);
+extern int mapbuf_can_be_on(Evas_Object *obj);
+
+
+#endif //__APP_TRAY_MAPBUF_H__
+
+// End of a file
diff --git a/home/include/minictrl.h b/home/include/minictrl.h
new file mode 100755
index 0000000..288443b
--- /dev/null
+++ b/home/include/minictrl.h
@@ -0,0 +1,95 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_MINICTRL_H__
+#define __W_MINICTRL_H__
+
+#define MINICONTROL_MAGIC 0xCAFEDEAD
+
+#define _MINICTRL_VIEW(obj) (page_get_item(obj))
+#define _MINICTRL_PLUG_OBJ(obj) (elm_object_part_content_get(_MINICTRL_VIEW(obj), "item"))
+
+#define MC_CATEGORY_CLOCK 1
+#define MC_CATEGORY_NOTIFICATION 2
+#define MC_CATEGORY_DASHBOARD 3
+
+#define MINICTRL_DATA_KEY_MAGIC "mc_magic"
+#define MINICTRL_DATA_KEY_PID "mc_pid"
+#define MINICTRL_DATA_KEY_VISIBILITY "mc_vis"
+#define MINICTRL_DATA_KEY_CATEGORY "mc_cat"
+#define MINICTRL_DATA_KEY_NAME "mc_name"
+
+#define MINICTRL_EVENT_APP_RESUME "mc_resume"
+#define MINICTRL_EVENT_APP_PAUSE "mc_pause"
+#define MINICTRL_EVENT_VIEW_REMOVED "mc_removed"
+
+typedef struct _Home_Minicontrol_Handler {
+ void (*add) (Evas_Object *view, const char *name, unsigned int width, unsigned int height, minicontrol_priority_e priority, minicontrol_h handler);
+ void (*update) (Evas_Object *view, const char *name, unsigned int width, unsigned int height, minicontrol_priority_e priority, minicontrol_h handler);
+ void (*remove) (Evas_Object *view, const char *name, unsigned int width, unsigned int height, minicontrol_priority_e priority, minicontrol_h handler);
+ void (*request) (Evas_Object *view, const char *name, unsigned int width, unsigned int height, minicontrol_priority_e priority, minicontrol_h handler);
+ void (*visibility_changed_cb) (Evas_Object *view, int visibility);
+ void (*pause_resume_cb) (Evas_Object *view, int is_paused);
+ void (*lcd_state_cb) (Evas_Object *view, int is_lcd_on);
+} Home_Minicontrol_Handler;
+
+typedef struct _Minictrl_Entry {
+ int category;
+ char *name;
+ char *service_name;
+ Evas_Object *view;
+} Minictrl_Entry;
+
+typedef void (*Minictrl_Entry_Foreach_Cb)(Minictrl_Entry *entry, void *user_data);
+
+/*!
+ * Main functions
+ */
+extern void minicontrol_init(void);
+extern void minicontrol_fini(void);
+extern void minicontrol_resume(void);
+extern void minicontrol_pause(void);
+
+/*!
+ * Object manager functions
+ */
+extern void minictrl_manager_entry_add_with_data(const char *name, const char *service_name, int category, Evas_Object *view);
+extern Evas_Object *minictrl_manager_view_get_by_category(int category);
+extern Evas_Object *minictrl_manager_view_get_by_name(const char *name);
+extern Minictrl_Entry *minictrl_manager_entry_get_by_category(int category);
+extern Minictrl_Entry *minictrl_manager_entry_get_by_name(const char *name);
+extern int minictrl_manager_entry_del_by_category(int category);
+extern int minictrl_manager_entry_del_by_name(const char *name);
+extern void minictrl_manager_entry_foreach(Minictrl_Entry_Foreach_Cb cb, void *user_data);
+
+/*!
+ * Utility functions
+ */
+extern int minicontrol_message_send(Evas_Object *obj, char *message);
+extern void minicontrol_visibility_set(Evas_Object *obj, int visibility);
+extern int minicontrol_visibility_get(Evas_Object *obj);
+extern void minicontrol_magic_set(Evas_Object *obj);
+extern int minicontrol_magic_get(Evas_Object *obj);
+extern void minicontrol_name_set(Evas_Object *obj, const char *name);
+extern char *minicontrol_name_get(Evas_Object *obj);
+extern void minicontrol_category_set(Evas_Object *obj, int category);
+extern int minicontrol_category_get(Evas_Object *obj);
+extern void minicontrol_pid_set(Evas_Object *obj, int pid);
+extern int minicontrol_pid_get(Evas_Object *obj);
+extern char *minicontrol_appid_get_by_pid(int pid);
+
+#endif
diff --git a/home/include/noti_broker.h b/home/include/noti_broker.h
new file mode 100755
index 0000000..9bf4c17
--- /dev/null
+++ b/home/include/noti_broker.h
@@ -0,0 +1,46 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_NOTI_BROKER_H__
+#define __W_HOME_NOTI_BROKER_H__
+
+extern const int EVENT_SOURCE_SCROLLER;
+extern const int EVENT_SOURCE_VIEW;
+extern const int EVENT_SOURCE_EDITING;
+
+extern const int EVENT_TYPE_ANIM_START;
+extern const int EVENT_TYPE_ANIM_STOP;
+extern const int EVENT_TYPE_DRAG_START;
+extern const int EVENT_TYPE_DRAG_STOP;
+extern const int EVENT_TYPE_EDGE_LEFT;
+extern const int EVENT_TYPE_EDGE_RIGHT;
+extern const int EVENT_TYPE_EDIT_START;
+extern const int EVENT_TYPE_EDIT_STOP;
+extern const int EVENT_TYPE_NOTI_DELETE;
+extern const int EVENT_TYPE_NOTI_DELETE_ALL;
+extern const int EVENT_TYPE_MOUSE_DOWN;
+extern const int EVENT_TYPE_MOUSE_UP;
+extern const int EVENT_TYPE_SCROLLING;
+extern const int EVENT_TYPE_APPS_SHOW;
+extern const int EVENT_TYPE_APPS_HIDE;
+
+extern void noti_broker_load(void);
+extern void noti_broker_init(void);
+extern void noti_broker_fini(void);
+extern int noti_broker_event_fire_to_plugin(int source, int event, void *data);
+
+#endif /* __W_HOME_NOTI_BROKER_H__ */
diff --git a/home/include/page.h b/home/include/page.h
new file mode 100755
index 0000000..7de0c8d
--- /dev/null
+++ b/home/include/page.h
@@ -0,0 +1,76 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_PAGE_H__
+#define __W_HOME_PAGE_H__
+
+#include <Evas.h>
+#include "page_info.h"
+#include "util.h"
+
+typedef enum {
+ PAGE_CHANGEABLE_BG_OFF = 0,
+ PAGE_CHANGEABLE_BG_ON,
+} page_changeable_bg_e;
+
+typedef enum {
+ PAGE_EFFECT_TYPE_LEFT = 0,
+ PAGE_EFFECT_TYPE_RIGHT,
+} page_effect_type_e;
+
+extern void page_destroy(Evas_Object *page);
+extern Evas_Object *page_create(Evas_Object *scroller
+ , Evas_Object *item
+ , const char *id
+ , const char *subid
+ , int width, int height
+ , page_changeable_bg_e changeable_bg
+ , page_removable_e removable);
+
+/* page_set_item returns the old item. You have to delete the old item */
+extern Evas_Object *page_set_item(Evas_Object *page, Evas_Object *item);
+extern Evas_Object *page_get_item(Evas_Object *page);
+
+extern Evas_Object *page_create_plus_page(Evas_Object *scroller);
+extern void page_destroy_plus_page(Evas_Object *scroller);
+extern void page_arrange_plus_page(Evas_Object *scroller, int toast_popup);
+
+extern void page_focus(Evas_Object *page);
+extern void page_unfocus(Evas_Object *page);
+extern char *page_read_title(Evas_Object *page);
+
+extern void page_set_effect(Evas_Object *page, void (*left_effect)(Evas_Object *), void (*right_effect)(Evas_Object *));
+extern void page_unset_effect(Evas_Object *page);
+extern void *page_get_effect(Evas_Object *page, page_effect_type_e effect_type);
+extern void page_clean_effect(Evas_Object *scroller);
+
+extern void page_effect_none(Evas_Object *page);
+extern void page_effect_smaller_by_remainder(Evas_Object *page);
+
+extern void page_backup_inner_focus(Evas_Object *page, Evas_Object *prev_page, Evas_Object *next_page);
+extern void page_restore_inner_focus(Evas_Object *page);
+
+extern void page_set_title(Evas_Object *page, const char *title);
+extern const char *page_get_title(Evas_Object *page);
+
+extern void page_highlight(Evas_Object *page);
+extern void page_unhighlight(Evas_Object *page);
+
+extern int page_is_appended(Evas_Object *page);
+
+
+#endif /* __W_HOME_PAGE_H__ */
diff --git a/home/include/page_info.h b/home/include/page_info.h
new file mode 100755
index 0000000..ea9b107
--- /dev/null
+++ b/home/include/page_info.h
@@ -0,0 +1,88 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_PAGE_INFO_H__
+#define __W_HOME_PAGE_INFO_H__
+
+typedef enum {
+ PAGE_DIRECTION_LEFT = 0,
+ PAGE_DIRECTION_CENTER,
+ PAGE_DIRECTION_RIGHT,
+ PAGE_DIRECTION_ANY, /* This direction is only for scroller_pop_pages, never use this in the push functions */
+ PAGE_DIRECTION_MAX,
+} page_direction_e;
+
+typedef enum {
+ PAGE_CATEGORY_IDLE_CLOCK = 0,
+ PAGE_CATEGORY_APP,
+ PAGE_CATEGORY_WIDGET,
+ PAGE_CATEGORY_MORE_APPS,
+ PAGE_CATEGORY_NXN_PAGE,
+ PAGE_CATEGORY_MAX,
+} page_category_e;
+
+typedef enum {
+ PAGE_REMOVABLE_OFF = 0,
+ PAGE_REMOVABLE_ON,
+} page_removable_e;
+
+typedef struct {
+ /* innate features */
+ char *id;
+ char *subid;
+ char *title;
+ double period;
+ int width;
+ int height;
+ page_direction_e direction;
+ page_category_e category;
+ page_removable_e removable;
+
+ /* acquired features */
+ Evas_Object *layout;
+ Evas_Object *scroller;
+ Evas_Object *page;
+ Evas_Object *page_rect;
+ Evas_Object *page_inner;
+ Evas_Object *page_inner_area;
+ Evas_Object *page_inner_bg;
+ Evas_Object *focus;
+ Evas_Object *remove_focus;
+ Evas_Object *item;
+ Evas_Object *focus_prev;
+ Evas_Object *focus_next;
+
+ int ordering;
+ int layout_longpress;
+ int highlighted;
+ int drag_threshold_page;
+ Eina_Bool need_to_unhighlight;
+ Eina_Bool highlight_changed;
+ Eina_Bool is_scrolled_object;
+ Eina_Bool appended;
+ Eina_Bool need_to_read;
+ void *faulted_hl_timer;
+} page_info_s;
+
+extern page_info_s *page_info_create(const char *id, const char *subid, double period);
+extern void page_info_destroy(page_info_s *page_info);
+extern page_info_s *page_info_dup(page_info_s *page_info);
+
+extern void page_info_list_destroy(Eina_List *page_info_list);
+extern int page_info_is_removable(const char *id);
+
+#endif // __W_HOME_PAGE_INFO_H__
diff --git a/home/include/pkgmgr.h b/home/include/pkgmgr.h
new file mode 100755
index 0000000..6c53374
--- /dev/null
+++ b/home/include/pkgmgr.h
@@ -0,0 +1,42 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_PKGMGR_H__
+#define __W_HOME_PKGMGR_H__
+
+extern void pkgmgr_hold_event(void);
+extern void pkgmgr_unhold_event(void);
+
+extern w_home_error_e pkgmgr_init(void);
+extern void pkgmgr_fini(void);
+
+extern w_home_error_e pkgmgr_uninstall(const char *appid);
+
+extern w_home_error_e pkgmgr_item_list_append_item(const char *pkg_id, const char *app_id, Evas_Object *item);
+extern w_home_error_e pkgmgr_item_list_remove_item(const char *pkg_id, const char *app_id, Evas_Object *item);
+
+extern void pkgmgr_item_list_affect_pkgid(const char *pkg_id, Eina_Bool (*_affected_cb)(const char *, Evas_Object *, void *), void *data);
+extern void pkgmgr_item_list_affect_appid(const char *app_id, Eina_Bool (*_affected_cb)(const char *, Evas_Object *, void *), void *data);
+
+extern w_home_error_e pkgmgr_reserve_list_push_request(const char *package, const char *key, const char *val);
+extern w_home_error_e pkgmgr_reserve_list_pop_request(void);
+
+extern int pkgmgr_exist(char *appid);
+
+#endif //__W_HOME_PKGMGR_H__
+
+// End of a file
diff --git a/home/include/popup.h b/home/include/popup.h
new file mode 100755
index 0000000..50a53aa
--- /dev/null
+++ b/home/include/popup.h
@@ -0,0 +1,25 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_POPUP_H__
+#define __W_HOME_POPUP_H__
+
+#define POPUP_STAGE_AFTER_TUTORIAL 1
+
+extern void popup_show(int stage);
+
+#endif
diff --git a/home/include/power_mode.h b/home/include/power_mode.h
new file mode 100755
index 0000000..48d659d
--- /dev/null
+++ b/home/include/power_mode.h
@@ -0,0 +1,42 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __POWER_MODE_H
+#define __POWER_MODE_H
+
+typedef enum {
+ POWER_MODE_COOLDOWN_ON,
+ POWER_MODE_COOLDOWN_OFF,
+ POWER_MODE_ENHANCED_ON,
+ POWER_MODE_ENHANCED_OFF,
+ POWER_MODE_EVENT_MAX,
+} power_mode_event_type_e;
+
+#define COOLDOWN_MODE_RELEASE 1
+#define COOLDOWN_MODE_LIMITATION 2
+#define COOLDOWN_MODE_WARNING 3
+
+extern int power_mode_register_cb(int type, void (*result_cb)(void *, void *), void *result_data);
+extern void power_mode_unregister_cb(int type, void (*result_cb)(void *, void *));
+extern void power_mode_init(void);
+extern void power_mode_ui_init(void);
+extern void power_mode_fini(void);
+extern int emergency_mode_enabled_get(void);
+extern int cooldown_mode_enabled_get(void);
+extern int cooldown_mode_warning_get(void);
+
+#endif
diff --git a/home/include/scroller.h b/home/include/scroller.h
new file mode 100755
index 0000000..c855a06
--- /dev/null
+++ b/home/include/scroller.h
@@ -0,0 +1,134 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_SCROLLER_H__
+#define __W_HOME_SCROLLER_H__
+
+/*
+ * FIRST - ... - CENTER_LEFT - CENTER_NEIGHBOR_LEFT - CENTER - CENTER_NEIGHBOR_RIGHT - CENTER_RIGHT - ... - LAST
+ * If there is no center page,
+ * then put the CENTER_LEFT & CENTER & CREATE_RIGHT page to LAST.
+ * The scroller has only one CENTER, CENTER_NEIGHBOR_LEFT and CENTER_NEIGHBOR_RIGHT page each.
+ * If there are already the CENTER & CENTER_NEIGHBOR pages, the scroller replaces them.
+ */
+typedef enum {
+ SCROLLER_PUSH_TYPE_INVALID = 0,
+ SCROLLER_PUSH_TYPE_FIRST,
+ SCROLLER_PUSH_TYPE_CENTER_LEFT,
+ SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT,
+ SCROLLER_PUSH_TYPE_CENTER,
+ SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_RIGHT,
+ SCROLLER_PUSH_TYPE_CENTER_RIGHT,
+ SCROLLER_PUSH_TYPE_LAST,
+ SCROLLER_PUSH_TYPE_MAX,
+} scroller_push_type_e;
+
+typedef enum {
+ SCROLLER_FREEZE_OFF = 0,
+ SCROLLER_FREEZE_ON,
+ SCROLLER_FREEZE_MAX,
+} scroller_freeze_e;
+
+typedef enum {
+ SCROLLER_BRING_TYPE_INVALID = 0,
+ SCROLLER_BRING_TYPE_INSTANT,
+ SCROLLER_BRING_TYPE_INSTANT_SHOW,
+ SCROLLER_BRING_TYPE_ANIMATOR,
+ SCROLLER_BRING_TYPE_JOB,
+ SCROLLER_BRING_TYPE_MAX,
+} scroller_bring_type_e;
+
+extern Evas_Object *scroller_get_focused_page(Evas_Object *scroller);
+extern void scroller_destroy(Evas_Object *layout);
+extern Evas_Object *scroller_create(Evas_Object *layout, Evas_Object *parent, int page_width, int page_height, scroller_index_e index);
+
+extern w_home_error_e scroller_push_page(Evas_Object *scroller, Evas_Object *page, scroller_push_type_e scroller_type);
+extern Evas_Object *scroller_pop_page(Evas_Object *scroller, Evas_Object *page);
+
+extern w_home_error_e scroller_push_pages(Evas_Object *scroller, Eina_List *page_info_list, void (*after_func)(void *), void *data);
+extern void scroller_pop_pages(Evas_Object *scroller, page_direction_e direction);
+
+extern w_home_error_e scroller_push_page_before(Evas_Object *scroller
+ , Evas_Object *page
+ , Evas_Object *before);
+extern w_home_error_e scroller_push_page_after(Evas_Object *scroller
+ , Evas_Object *page
+ , Evas_Object *after);
+
+extern int scroller_count(Evas_Object *scroller);
+extern int scroller_count_direction(Evas_Object *scroller, page_direction_e direction);
+
+extern Eina_Bool scroller_is_scrolling(Evas_Object *scroller);
+
+extern void scroller_freeze(Evas_Object *scroller);
+extern void scroller_unfreeze(Evas_Object *scroller);
+
+extern void scroller_bring_in(Evas_Object *scroller, int i, scroller_freeze_e freeze, scroller_bring_type_e bring_type);
+extern void scroller_bring_in_page(Evas_Object *scroller, Evas_Object *page, scroller_freeze_e freeze, scroller_bring_type_e bring_type);
+extern void scroller_bring_in_by_push_type(Evas_Object *scroller, scroller_push_type_e push_type, scroller_freeze_e freeze, scroller_bring_type_e bring_type);
+extern void scroller_bring_in_center_of(Evas_Object *scroller
+ , Evas_Object *page
+ , scroller_freeze_e freeze
+ , void (*before_func)(void *), void *before_data
+ , void (*after_func)(void *), void *after_data);
+
+extern void scroller_region_show_page(Evas_Object *scroller, Evas_Object *page, scroller_freeze_e freeze, scroller_bring_type_e bring_type);
+extern void scroller_region_show_by_push_type(Evas_Object *scroller, scroller_push_type_e push_type, scroller_freeze_e freeze, scroller_bring_type_e bring_type);
+extern void scroller_region_show_center_of(Evas_Object *scroller
+ , Evas_Object *page
+ , scroller_freeze_e freeze
+ , void (*before_func)(void *), void *before_data
+ , void (*after_func)(void *), void *after_data);
+extern void scroller_region_show_page_without_timer(Evas_Object *scroller, Evas_Object *page);
+
+extern void scroller_read_favorites_list(Evas_Object *scroller, Eina_List *page_info_list);
+extern void scroller_read_list(Evas_Object *scroller, Eina_List *page_info_list);
+extern Eina_List *scroller_write_list(Evas_Object *scroller);
+
+extern Evas_Object *scroller_move_page_prev(Evas_Object *scroller, Evas_Object *from_page, Evas_Object *to_page, Evas_Object *append_page);
+extern Evas_Object *scroller_move_page_next(Evas_Object *scroller, Evas_Object *from_page, Evas_Object *to_page, Evas_Object *insert_page);
+extern int scroller_seek_page_position(Evas_Object *scroller, Evas_Object *page);
+
+extern Evas_Object *scroller_get_page_at(Evas_Object *scroller, int idx);
+
+extern int scroller_get_current_page_direction(Evas_Object *scroller);
+extern Evas_Object *scroller_get_left_page(Evas_Object *scroller, Evas_Object *page);
+extern Evas_Object *scroller_get_right_page(Evas_Object *scroller, Evas_Object *page);
+
+extern void scroller_focus(Evas_Object *scroller);
+
+extern void scroller_highlight(Evas_Object *scroller);
+extern void scroller_unhighlight(Evas_Object *scroller);
+
+extern void scroller_enable_focus_on_scroll(Evas_Object *scroller);
+extern void scroller_disable_focus_on_scroll(Evas_Object *scroller);
+
+extern void scroller_enable_index_on_scroll(Evas_Object *scroller);
+extern void scroller_disable_index_on_scroll(Evas_Object *scroller);
+
+extern void scroller_enable_effect_on_scroll(Evas_Object *scroller);
+extern void scroller_disable_effect_on_scroll(Evas_Object *scroller);
+
+extern void scroller_enable_cover_on_scroll(Evas_Object *scroller);
+extern void scroller_disable_cover_on_scroll(Evas_Object *scroller);
+
+extern void scroller_backup_inner_focus(Evas_Object *scroller);
+extern void scroller_restore_inner_focus(Evas_Object *scroller);
+
+extern void scroller_reorder_with_list(Evas_Object *scroller, Eina_List *list, page_direction_e page_direction);
+
+#endif /* __W_HOME_SCROLLER_H__ */
diff --git a/home/include/scroller_info.h b/home/include/scroller_info.h
new file mode 100755
index 0000000..86ba4ff
--- /dev/null
+++ b/home/include/scroller_info.h
@@ -0,0 +1,60 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_SCROLLER_INFO_H__
+#define __W_HOME_SCROLLER_INFO_H__
+
+typedef enum {
+ SCROLLER_INDEX_INVALID = 0,
+ SCROLLER_INDEX_SINGULAR,
+ SCROLLER_INDEX_PLURAL,
+ SCROLLER_INDEX_MAX,
+} scroller_index_e;
+
+typedef struct {
+ /* innate features; */
+ int root_width;
+ int root_height;
+ int page_width;
+ int page_height;
+ int max_page;
+ scroller_index_e index_number;
+
+ /* acquired features */
+ int scroll_focus;
+ int scroll_index;
+ int scroll_effect;
+ int scroll_cover;
+ int scrolling;
+ int unpack_page_inners_on_scroll;
+ int enable_highlight;
+ int mouse_down;
+
+ Evas_Object *layout;
+ Evas_Object *parent;
+ Evas_Object *box_layout;
+ Evas_Object *box;
+ Evas_Object *center_neighbor_left;
+ Evas_Object *center;
+ Evas_Object *center_neighbor_right;
+ Evas_Object *plus_page;
+ Evas_Object *index[PAGE_DIRECTION_MAX];
+ Ecore_Timer *index_update_timer;
+ Eina_List *effect_page_list;
+} scroller_info_s;
+
+#endif // __W_HOME_SCROLLER_INFO_H__
diff --git a/home/include/tutorial.h b/home/include/tutorial.h
new file mode 100755
index 0000000..6fa7b05
--- /dev/null
+++ b/home/include/tutorial.h
@@ -0,0 +1,41 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_TUTORIAL_H__
+#define __W_HOME_TUTORIAL_H__
+
+enum {
+ TUTORIAL_STEP_INIT = 0,
+ TUTORIAL_STEP_ONE,
+ TUTORIAL_STEP_TWO,
+ TUTORIAL_STEP_THREE,
+ TUTORIAL_STEP_FOUR,
+ TUTORIAL_STEP_FIVE,
+ TUTORIAL_STEP_SIX,
+ TUTORIAL_STEP_SEVEN,
+ TUTORIAL_STEP_MAX,
+};
+
+extern void tutorial_set_transient_for(Ecore_X_Window xwin);
+extern int tutorial_is_first_boot(void);
+extern int tutorial_is_exist(void);
+extern Evas_Object *tutorial_create(Evas_Object *layout);
+extern void tutorial_destroy(Evas_Object *tutorial);
+extern int tutorial_is_apps(Ecore_X_Window xwin);
+extern int tutorial_is_indicator(Ecore_X_Window xwin);
+
+#endif /* __W_HOME_TUTORIAL_H__ */
diff --git a/home/include/tutorial_info.h b/home/include/tutorial_info.h
new file mode 100755
index 0000000..5bded74
--- /dev/null
+++ b/home/include/tutorial_info.h
@@ -0,0 +1,32 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_TUTORIAL_INFO_H__
+#define __W_HOME_TUTORIAL_INFO_H__
+
+typedef struct {
+ Evas_Object *win;
+ Evas_Object *tutorial;
+ Evas_Object *bg;
+ Evas_Object *layout_focus;
+ Evas_Object *text_focus;
+ Evas_Object *layout; // layout of home
+ Evas_Object *scroller; // scroller of home
+ scroller_info_s *scroller_info; //scroller_info of home
+} tutorial_info_s;
+
+#endif /* __W_HOME_TUTORIAL_INFO_H__ */
diff --git a/home/include/util.h b/home/include/util.h
new file mode 100755
index 0000000..13d73d3
--- /dev/null
+++ b/home/include/util.h
@@ -0,0 +1,270 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_UTIL_H__
+#define __W_HOME_UTIL_H__
+
+#include <bundle.h>
+#include <Evas.h>
+
+/* Key */
+#define DATA_KEY_ADD_VIEWER "av"
+#define DATA_KEY_BG "bg"
+#define DATA_KEY_CHECK "ch"
+#define DATA_KEY_CHECK_POPUP "ch_pp"
+#define DATA_KEY_CONFORMANT "cf"
+#define DATA_KEY_EDIT_INFO "ed_if"
+#define DATA_KEY_EDIT_MODE "ed_md"
+#define DATA_KEY_EFFECT_PAGE "ef_pg"
+#define DATA_KEY_EVENT_UPPER_IS_ON "ev_io"
+#define DATA_KEY_EVENT_UPPER_PAGE "ev_up"
+#define DATA_KEY_EVENT_UPPER_TIMER "ev_ut"
+#define DATA_KEY_INDEX "id"
+#define DATA_KEY_INDEX_INFO "id_if"
+#define DATA_KEY_IS_LONGPRESS "is_lp"
+#define DATA_KEY_ITEM_INFO "it_if"
+#define DATA_KEY_LAYOUT "ly"
+#define DATA_KEY_LAYOUT_INFO "ly_if"
+#define DATA_KEY_MAPBUF "mb"
+#define DATA_KEY_MAPBUF_DISABLED_PAGE "mb_dis"
+#define DATA_KEY_PAGE "pg"
+#define DATA_KEY_PAGE_INFO "pg_i"
+#define DATA_KEY_PAGE_ONHOLD_COUNT "pg_ohc"
+#define DATA_KEY_PROXY_PAGE "pr_p"
+#define DATA_KEY_REAL_PAGE "rp"
+#define DATA_KEY_SCROLLER "sc"
+#define DATA_KEY_SCROLLER_INFO "sc_i"
+#define DATA_KEY_WIN "win"
+
+
+//Apps
+#define DATA_KEY_BG "bg"
+#define DATA_KEY_BOX "bx"
+#define DATA_KEY_BUTTON "bt"
+#define DATA_KEY_CURRENT_ITEM "cu_item"
+#define DATA_KEY_EDJE_OBJECT "ej_o"
+#define DATA_KEY_EVAS_OBJECT "ev_o"
+#define DATA_KEY_EVENT_UPPER_ITEM "eu_it"
+#define DATA_KEY_FUNC_DELETE_PACKAGE "fn_del_pkg"
+#define DATA_KEY_FUNC_DESTROY_POPUP "fn_dr_pp"
+#define DATA_KEY_FUNC_DISABLE_ITEM "fn_dis_it"
+#define DATA_KEY_FUNC_ENABLE_ITEM "fn_en_it"
+#define DATA_KEY_FUNC_HIDE_POPUP "fn_hd_pp"
+#define DATA_KEY_FUNC_ROTATE_POPUP "fn_rt_pp"
+#define DATA_KEY_FUNC_SHOW_POPUP "fn_sh_pp"
+#define DATA_KEY_GIC "gic"
+#define DATA_KEY_GRID "gr"
+#define DATA_KEY_HIDE_TRAY_TIMER "htt"
+#define DATA_KEY_HISTORY_LIST "hi_l"
+#define DATA_KEY_IDLE_TIMER "idle_timer"
+#define DATA_KEY_INSTANCE_INFO "ii"
+#define DATA_KEY_ITEM "it"
+#define DATA_KEY_ITEM_ICON_HEIGHT "it_ic_h"
+#define DATA_KEY_ITEM_ICON_WIDTH "it_ic_w"
+#define DATA_KEY_ITEM_HEIGHT "it_h"
+#define DATA_KEY_ITEM_WIDTH "it_w"
+#define DATA_KEY_LAYOUT "ly"
+#define DATA_KEY_LAYOUT_IS_PAUSED "ly_is_ps"
+#define DATA_KEY_LAYOUT_FOCUS_ON "ly_fcs_on"
+#define DATA_KEY_LAYOUT_HIDE_TIMER "ly_hd_tm"
+#define DATA_KEY_LIST "ls"
+#define DATA_KEY_LIST_INDEX "ls_ix"
+#define DATA_KEY_POPUP "pp"
+#define DATA_KEY_SCROLLER "sc"
+#define DATA_KEY_TIMER "timer"
+#define DATA_KEY_WIN "win"
+#define DATA_KEY_IS_VIRTUAL_ITEM "vit"
+#define DATA_KEY_IS_ORDER_CHANGE "ioc"
+#define DATA_KEY_ITEM_UNINSTALL_RESERVED "i_u_r"
+
+#define STR_SIGNAL_EMIT_SIGNAL_ROTATE "rotate"
+#define STR_SIGNAL_EMIT_SIGNAL_UNROTATE "unrotate"
+
+
+
+/* Strings */
+#define APPID_W_HOME "org.tizen.w-home"
+#define APPID_APPS "org.tizen.apps-dbox"
+#define FILE_W_HOME_DB DATADIR"/.w_home.db"
+#define STR_SIGNAL_EMIT_SIGNAL_ROTATE "rotate"
+#define STR_SIGNAL_EMIT_SIGNAL_UNROTATE "unrotate"
+
+
+
+/* Multi-language */
+#if !defined(_)
+#define _(str) gettext(str)
+#endif
+#define gettext_noop(str) (str)
+#define N_(str) gettext_noop(str)
+#define D_(str) dgettext("sys_string", str)
+
+
+
+/* Accessibility */
+#define ACCESS_BUTTON "button"
+#define ACCESS_EDIT "IDS_AT_POP_EDIT"
+
+
+
+/* SIZE */
+#define NAME_LEN 256
+#define TEXT_LEN 256
+#define LOCALE_LEN 32
+#define BUFSZE 1024
+#define SPARE_LEN 128
+#define INDEX_COUNT_LEN 3
+#define PART_NAME_SIZE 128
+
+
+/* VCONF */
+#define VCONF_KEY_WMS_APPS_ORDER "memory/wms/apps_order"
+#define VCONF_KEY_WMS_FAVORITES_ORDER "memory/wms/favorites_order"
+#define VCONF_KEY_HOME_LOGGING "db/private/org.tizen.w-home/logging"
+#define VCONF_KEY_HOME_IS_TUTORIAL "memory/private/org.tizen.w-home/tutorial"
+#define VCONF_KEY_HOME_IS_TUTORIAL_ENABLED_TO_RUN "db/private/org.tizen.w-home/enabled_tutorial"
+#define VCONFKEY_APPS_IS_INITIAL_POPUP "db/private/org.tizen.w-home/apps_initial_popup"
+
+
+/* Build */
+#define HAPI __attribute__((visibility("hidden")))
+
+/* Packaging */
+#define DEFAULT_ICON IMAGEDIR"/unknown.png"
+
+
+/* Enum */
+typedef enum {
+ W_HOME_ERROR_NONE = 0,
+ W_HOME_ERROR_FAIL = -1,
+ W_HOME_ERROR_DB_FAILED = -2,
+ W_HOME_ERROR_OUT_OF_MEMORY = -3,
+ W_HOME_ERROR_INVALID_PARAMETER = -4,
+ W_HOME_ERROR_NO_DATA = -5,
+} w_home_error_e;
+
+
+
+typedef enum {
+ APP_STATE_CREATE = 0,
+ APP_STATE_PAUSE,
+ APP_STATE_RESET,
+ APP_STATE_RESUME,
+ APP_STATE_LANGUAGE_CHANGED,
+ APP_STATE_TERMINATE,
+ APP_STATE_POWER_OFF,
+ APP_STATE_MAX,
+} app_state_e;
+
+
+
+typedef enum {
+ FEATURE_CLOCK_SELECTOR = 0x0001,
+ FEATURE_CLOCK_CHANGE = 0x0002,
+ FEATURE_CLOCK_VISUAL_CUE = 0x0004,
+ FEATURE_CLOCK_HIDDEN_BUTTON = 0x0008,
+ FEATURE_CLOCK_HIDDEN_BUTTON_TIMER = 0x0010,
+ FEATURE_APPS_BY_BEZEL_UP = 0x0020,
+ FEATURE_APPS = 0x0040,
+ FEATURE_TUTORIAL = 0x0080,
+ FEATURE_MAX,
+} feature_e;
+
+
+typedef enum {
+ APPS_ERROR_NONE = 0,
+ APPS_ERROR_FAIL = -1,
+ APPS_ERROR_DB_FAILED = -2,
+ APPS_ERROR_OUT_OF_MEMORY = -3,
+ APPS_ERROR_INVALID_PARAMETER = -4,
+ APPS_ERROR_NO_DATA = -5,
+} apps_error_e;
+
+enum {
+ APPS_APP_STATE_CREATE = 0,
+ APPS_APP_STATE_PAUSE,
+ APPS_APP_STATE_RESET,
+ APPS_APP_STATE_RESUME,
+ APPS_APP_STATE_TERMINATE,
+ APPS_APP_STATE_POWER_OFF,
+ APPS_APP_STATE_MAX,
+};
+
+
+
+enum {
+ APPS_ROTATE_PORTRAIT = 0,
+ APPS_ROTATE_LANDSCAPE,
+};
+
+
+
+enum {
+ APP_TYPE_NATIVE = 0,
+ APP_TYPE_WEB,
+};
+
+
+enum {
+ TUTORIAL_LANGUAGE_NORMAL = 0,
+ TUTORIAL_LANGUAGE_MALI,
+ TUTORIAL_LANGUAGE_GEORGIA,
+};
+
+#if !defined(_EDJ)
+#define _EDJ(a) elm_layout_edje_get(a)
+#endif
+
+/* Functions */
+extern void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+extern void _evas_object_event_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+extern void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+extern void _evas_object_event_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+extern void _evas_object_event_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+extern void _evas_object_event_changed_size_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+extern void util_post_message_for_launch_fail(const char *name);
+extern void util_launch(const char *package, const char *name);
+extern void util_launch_with_arg(const char *app_id, const char *arg, const char *name);
+extern void util_launch_with_bundle(const char *app_id, bundle *b, const char *name);
+extern void util_notify_to_home(int pid);
+
+extern int util_launch_app(const char *appid, const char *key, const char *value);
+extern int util_feature_enabled_get(int feature);
+
+extern int util_find_top_visible_window(char **command);
+
+//apps
+extern void apps_util_launch(Evas_Object *win, const char *package, const char *name);
+extern void apps_util_launch_main_operation(Evas_Object *win, const char *app_id, const char *name);
+extern void apps_util_launch_with_arg(Evas_Object *win, const char *app_id, const char *arg, const char *name);
+extern void apps_util_launch_with_bundle(Evas_Object *win, const char *app_id, bundle *b, const char *name);
+
+extern void apps_util_post_message_for_launch_fail(const char *name);
+extern void apps_util_notify_to_home(int pid);
+
+extern int util_create_toast_popup(Evas_Object *parent, const char* text);
+extern int util_create_check_popup(Evas_Object *parent, const char* text, void _clicked_cb(void *, Evas_Object *, void *));
+
+extern int util_get_app_type(const char *appid);
+extern char *util_get_appid_by_pkgname(const char *pkgname);
+
+extern const char *util_basename(const char *name);
+extern double util_timestamp(void);
+
+extern void util_activate_home_window(void);
+#endif /* __W_HOME_UTIL_H__ */
diff --git a/home/include/virtual_canvas.h b/home/include/virtual_canvas.h
new file mode 100755
index 0000000..06d58ae
--- /dev/null
+++ b/home/include/virtual_canvas.h
@@ -0,0 +1,28 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __APP_TRAY_VIRTUAL_CANVAS_H__
+#define __APP_TRAY_VIRTUAL_CANVAS_H__
+
+extern Evas *virtual_canvas_create(int w, int h);
+extern bool virtual_canvas_flush_to_file(Evas *e, const char *filename, int w, int h);
+extern void *virtual_canvas_load_file_to_data(Evas *e, const char *file, int w, int h);
+extern bool virtual_canvas_destroy(Evas *e);
+
+#endif //__APP_TRAY_VIRTUAL_CANVAS_H__
+
+// End of a file
diff --git a/home/include/win.h b/home/include/win.h
new file mode 100755
index 0000000..271bad8
--- /dev/null
+++ b/home/include/win.h
@@ -0,0 +1,24 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_WIN_H__
+#define __W_HOME_WIN_H__
+
+extern Evas_Object *win_create(const char *name);
+extern void win_destroy(Evas_Object *win);
+
+#endif /* __W_HOME_WIN_H__ */
diff --git a/home/include/wms.h b/home/include/wms.h
new file mode 100755
index 0000000..66a34b9
--- /dev/null
+++ b/home/include/wms.h
@@ -0,0 +1,41 @@
+/*
+ * W-Home
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 __W_HOME_WMS_H__
+#define __W_HOME_WMS_H__
+
+// 0 : init, 1 : backup request, 2 : restore request, 3: write done
+enum {
+ W_HOME_WMS_INIT = 0,
+ W_HOME_WMS_BACKUP,
+ W_HOME_WMS_RESOTRE,
+ W_HOME_WMS_DONE,
+};
+
+extern void wms_change_apps_order(int value);
+extern void wms_change_favorite_order(int value);
+
+extern void wms_register_setup_wizard_vconf();
+extern void wms_unregister_setup_wizard_vconf();
+
+extern void wms_launch_gear_manager(Evas_Object *parent, char *link);
+
+#endif /* __W_HOME_MAIN_H__ */
diff --git a/home/include/xml.h b/home/include/xml.h
new file mode 100755
index 0000000..bdaeae8
--- /dev/null
+++ b/home/include/xml.h
@@ -0,0 +1,24 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __W_HOME_XML_H__
+#define __W_HOME_XML_H__
+
+extern w_home_error_e xml_read_list(const char *xml_file, Eina_List *page_info_list);
+extern Eina_List *xml_write_list(const char *xml_file);
+
+#endif // __W_HOME_XML_H__
diff --git a/home/org.tizen.w-home.manifest b/home/org.tizen.w-home.manifest
new file mode 100755
index 0000000..318ff94
--- /dev/null
+++ b/home/org.tizen.w-home.manifest
@@ -0,0 +1,8 @@
+<manifest>
+ <define>
+ <domain name="org.tizen.w-home"/>
+ </define>
+ <request>
+ <domain name="org.tizen.w-home"/>
+ </request>
+</manifest>
diff --git a/home/res/CMakeLists.txt b/home/res/CMakeLists.txt
new file mode 100644
index 0000000..bf453d7
--- /dev/null
+++ b/home/res/CMakeLists.txt
@@ -0,0 +1,6 @@
+ADD_SUBDIRECTORY(edje)
+ADD_SUBDIRECTORY(icon)
+ADD_SUBDIRECTORY(image)
+ADD_SUBDIRECTORY(ordering)
+ADD_SUBDIRECTORY(list)
+ADD_SUBDIRECTORY(po)
diff --git a/home/res/edje/CMakeLists.txt b/home/res/edje/CMakeLists.txt
new file mode 100755
index 0000000..01985fd
--- /dev/null
+++ b/home/res/edje/CMakeLists.txt
@@ -0,0 +1,15 @@
+FILE(GLOB edc_files ${CMAKE_CURRENT_SOURCE_DIR}/*.edc)
+FOREACH(edc_file ${edc_files})
+ GET_FILENAME_COMPONENT( FName ${edc_file} NAME_WE )
+ MESSAGE("${FName}")
+ ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${FName}.edj
+ COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/images
+ ${CMAKE_CURRENT_SOURCE_DIR}/${FName}.edc ${FName}.edj ${EDJE_CFLAGS}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FName}.edc
+ )
+ ADD_CUSTOM_TARGET(${FName}.edj DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FName}.edj)
+ ADD_DEPENDENCIES(${PROJECT_NAME} ${FName}.edj)
+ENDFOREACH(edc_file)
+
+# install edc files
+INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${EDJEDIR} FILES_MATCHING PATTERN "*.edj")
diff --git a/home/res/edje/apps_box.edc b/home/res/edje/apps_box.edc
new file mode 100755
index 0000000..77db7db
--- /dev/null
+++ b/home/res/edje/apps_box.edc
@@ -0,0 +1,413 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "apps_conf.edc"
+
+images {
+ image: "b_home_screen_recent_icon.png" COMP;
+}
+
+
+styles {
+ style {
+ name: "button_text_style";
+ base: "font=TIZEN:style=Regular text_class=AT014 font_size="32" color_class=AT014 text_class=AT014 align=middle color=#FFFFFF ellipsis=1 wrap=mixed";
+ }
+ style {
+ name: "button_text_style,pressed";
+ base: "font=TIZEN:style=Regular text_class=AT014P font_size="32" color_class=AT014P text_class=AT014P align=middle color=#FFFFFF ellipsis=1 wrap=mixed";
+ }
+}
+
+collections {
+ group {
+ name: "box";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ part {
+ name: "top_area";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "bg"; }
+ rel2 { relative: 1.0 0.0; to, "bg"; }
+ align: 0.0 0.0;
+ fixed: 1 1;
+ visible: 0;
+ /* Do not need buttons */
+ //min: 0 BOX_TOP_MENU_HEIGHT;
+ min: 0 BOX_TOP_HEIGHT;
+ }
+ }
+#if 0 /* Do not need buttons */
+ part {
+ name: "top_button";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "top_area"; }
+ rel2 { relative: 1.0 1.0; to, "top_area"; }
+ visible: 1;
+ }
+ }
+#endif
+ part {
+ name: "top";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to, "top_area"; }
+ rel2 { relative: 1.0 1.0; to, "top_area"; }
+ align: 0.0 0.0;
+ fixed: 1 1;
+ visible: 0;
+ min: 0 BOX_TOP_HEIGHT;
+ }
+ }
+ part {
+ name: "box";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 1.0;
+ rel1.to: "top";
+ rel2.relative: 1.0 0.0;
+ rel2.to: "bottom";
+ visible: 1;
+ }
+ }
+ part {
+ name: "bottom";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to, "bg"; }
+ rel2 { relative: 1.0 1.0; to, "bg"; }
+ align: 0.0 1.0;
+ fixed: 1 1;
+ visible: 0;
+ /* Do not need buttons */
+ //min: 0 (BOX_BOTTOM_HEIGHT+BOX_BOTTOM_MENU_HEIGHT);
+ min: 0 0;
+ }
+ }
+#if 0 /* Do not need buttons */
+ part {
+ name: "bottom_button";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 BOX_BOTTOM_HEIGHT/BOX_BOTTOM_MENU_HEIGHT; to, "bottom"; }
+ rel2 { relative: 1.0 1.0; to, "bottom"; }
+ visible: 1;
+ }
+ }
+#endif
+ }
+ }
+
+#if 0 /* Do not need bottom button */
+ group {
+ name: "bottom_button";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ min: 0 BOX_BOTTOM_MENU_HEIGHT;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "button,line";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 0.0; to: "bg"; }
+ color_class: "AO0152";
+ min: 0 1;
+ align: 0.5 0.0;
+ fixed: 1 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO0152P";
+ }
+ }
+ part {
+ name: "button,body";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color_class: "AO0151";
+ fixed: 1 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO0151P";
+ }
+ }
+ part {
+ name: "button,txt";
+ type: TEXTBLOCK;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "button,body"; offset: 16 5; }
+ rel2 { relative: 1.0 1.0; to: "button,body"; offset: -16 -5; }
+ color_class: "AT014";
+ text {
+ style: "button_text_style";
+ align: 0.0 0.5;
+ }
+ align: 0.5 0.5;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AT014P";
+ text {
+ style: "button_text_style,pressed";
+ align: 0.0 0.5;
+ }
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ }
+
+ programs {
+ program {
+ signal: "mouse,down,1";
+ source: "focus";
+ action: STATE_SET "pressed" 0.0;
+ target: "button,line";
+ target: "button,body";
+ target: "button,txt";
+ }
+ program {
+ signal: "mouse,up,1";
+ source: "focus";
+ action: STATE_SET "default" 0.0;
+ target: "button,line";
+ target: "button,body";
+ target: "button,txt";
+ }
+ program {
+ signal: "mouse,out";
+ source: "focus";
+ action: STATE_SET "default" 0.0;
+ target: "button,line";
+ target: "button,body";
+ target: "button,txt";
+ }
+ }
+ } //button group
+
+
+ group {
+ name: "top_button";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "button,bg";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ align: 0.5 0.0;
+ min: BOX_TOP_MENU_WIDTH BOX_TOP_MENU_HEIGHT;
+ max: BOX_TOP_MENU_WIDTH BOX_TOP_MENU_HEIGHT;
+ fixed: 1 1;
+ visible: 0;
+ }
+ }
+ part {
+ name: "button,txt";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "button,bg"; }
+ rel2 { relative: 0.5 0.5; to: "button,bg"; }
+ align: 0.5 0.5;
+ visible: 1;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "button,bg"; }
+ rel2 { relative: 1.0 1.0; to: "button,bg"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ }
+ } //button group
+
+ group {
+ name: "top_button_text";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "icon";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.5; to: "bg"; }
+ rel2 { relative: 0.0 0.5; to: "bg"; }
+ align: 0.0 0.5;
+ min: 55 37;
+ image {
+ normal: "b_home_screen_recent_icon.png";
+ }
+ color_class: "AO017";
+ fixed: 1 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO017P";
+ }
+ }
+ part {
+ name: "txt";
+ type: TEXT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 1.0 0.0; to_x: "icon"; to_y: "bg"; offset: 3 0; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color_class: "AT014";
+ text {
+ text_class: "AT014";
+ align: 0.0 0.5;
+ min: 1 0;
+ }
+ align: 0.0 0.5;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AT014P";
+ text {
+ text_class: "AT014P";
+ align: 0.0 0.5;
+ min: 1 0;
+ }
+ }
+ }
+ }
+
+ programs {
+ program {
+ signal: "press,button";
+ source: "button";
+ action: STATE_SET "pressed" 0.0;
+ target: "txt";
+ target: "icon";
+ }
+ program {
+ signal: "release,button";
+ source: "button";
+ action: STATE_SET "default" 0.0;
+ target: "txt";
+ target: "icon";
+ }
+ }
+ } //button group
+#endif
+}
diff --git a/home/res/edje/apps_button.edc b/home/res/edje/apps_button.edc
new file mode 100755
index 0000000..616ba62
--- /dev/null
+++ b/home/res/edje/apps_button.edc
@@ -0,0 +1,125 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "apps_conf.edc"
+
+collections {
+ group {
+ name : "button";
+ images {
+ image: "images/b_home_screen_favorite_more_icon.png" COMP;
+ }
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ part {
+ name : "image";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.24 0.5; to, "bg"; }
+ rel2 { relative: 0.24 0.5; to, "bg"; }
+ image {
+ normal: "images/b_home_screen_favorite_more_icon.png";
+ }
+ min: 37 37;
+ max: 37 37;
+ align: 0.5 0.5;
+ color_class: AO0351;
+ }
+ }
+ part {
+ name : "center_padding";
+ type: SPACER;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 1.0 0.0; to, "image"; }
+ rel2 { relative: 1.0 1.0; to, "image"; }
+ min: 13 69;
+ align: 0.0 0.5;
+ }
+ }
+ part {
+ name : "button_txt";
+ type: TEXT;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 1.0 0.0; to, "center_padding"; }
+ rel2 { relative: 1.0 1.0; to, "center_padding"; }
+ color: 255 255 255 255;
+ text {
+ font: "Tizen:style=Bold";
+ text_class: "tizen";
+ size: 27;
+ align: 0.0 0.5;
+ ellipsis: 1;
+ }
+ min: 157 69;
+ align: 0.0 0.5;
+ visible: 1;
+ }
+ }
+ part {
+ name : "event";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "bg"; }
+ rel2 { relative: 1.0 1.0; to, "bg"; }
+ color : 0 0 0 0;
+ visible : 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default";
+ color : 255 255 255 50;
+ }
+ }
+ }
+ programs {
+ program {
+ signal: "pressed";
+ source: "button";
+ action: STATE_SET "pressed" 0.0;
+ target: "event";
+ }
+ program {
+ signal: "unpressed";
+ source: "button";
+ action: STATE_SET "default" 0.0;
+ target: "event";
+ }
+ }
+ } //group
+} //collections
+
+
+
+// End of file
diff --git a/home/res/edje/apps_conf.edc b/home/res/edje/apps_conf.edc
new file mode 120000
index 0000000..4734118
--- /dev/null
+++ b/home/res/edje/apps_conf.edc
@@ -0,0 +1 @@
+../../include/apps/apps_conf.h \ No newline at end of file
diff --git a/home/res/edje/apps_grid.edc b/home/res/edje/apps_grid.edc
new file mode 100755
index 0000000..a1c432c
--- /dev/null
+++ b/home/res/edje/apps_grid.edc
@@ -0,0 +1,197 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "apps_conf.edc"
+
+#define STYLE(NAME, SIZE) style {\
+ name: "style_name_"NAME;\
+ base: "font=TIZEN:style=MEDIUM text_class=tizen font_size="SIZE" align=center valign=top color=#FFFFFF ellipsis=1 wrap=mixed";\
+ tag: "br" "\n";\
+ }
+
+styles {
+ STYLE("27", 27)
+}
+
+collections {
+ group {
+ name: "elm/gengrid/item/recent-apps/default";
+ /* content_get reads these data */
+ data.item: "contents" "bg icon_image selected";
+ data.item: "texts" "txt";
+
+ parts {
+ part {
+ name: "bg";
+ type: SWALLOW;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ visible: 1;
+ }
+ }
+ part {
+ name: "icon_bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 ITEM_ICON_Y/ITEM_HEIGHT; to, "bg"; }
+ rel2 { relative: 0.5 ITEM_ICON_Y/ITEM_HEIGHT; to, "bg"; }
+ }
+ }
+ part {
+ name: "selected";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to, "bg"; }
+ rel2 { relative: 0.5 0.5; to, "bg"; }
+ visible: 1;
+ }
+ }
+ part {
+ name: "icon_image";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to, "icon_bg"; }
+ rel2 { relative: 0.5 0.5; to, "icon_bg"; }
+ align: 0.5 0.5;
+ fixed: 1 1;
+ }
+ description {
+ state: "bigger" 0.0;
+ inherit: "default" 0.0;
+ }
+ }
+ part {
+ name: "txt_region";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 ITEM_TEXT_Y/ITEM_HEIGHT; to, "bg"; }
+ rel2 { relative: 1.0 1.0; to, "bg"; }
+ }
+ }
+ part {
+ name: "txt";
+ type: TEXTBLOCK;
+ effect: SOFT_SHADOW;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "txt_region"; }
+ rel2 { relative: 1.0 1.0; to: "txt_region"; }
+ color: 255 255 255 255;
+ color2: 0 0 0 35;
+ color3: 0 0 0 35;
+ text {
+ style: "style_name_27";
+ align: 0.5 0.0;
+ }
+ visible: 1;
+ }
+ description
+ {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "icon_image_event";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "bg"; }
+ rel2 { relative: 1.0 1.0; to, "bg"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ }
+
+ programs {
+ program {
+ name: "item,down";
+ signal: "mouse,down,1";
+ source: "icon_image_event";
+ action: SIGNAL_EMIT "item,down" "menu";
+ }
+ program {
+ name: "item,up";
+ signal: "mouse,up,1";
+ source: "icon_image_event";
+ action: SIGNAL_EMIT "item,up" "menu";
+ }
+
+ program {
+ name: "txt,single";
+ signal: "txt,single";
+ source: "txt";
+ script {
+ set_state(PART:"txt", "default", 0.0);
+ }
+ }
+ program {
+ name: "txt,dual";
+ signal: "txt,dual";
+ source: "txt";
+ script {
+ set_state(PART:"txt", "dual", 0.0);
+ }
+ }
+ program {
+ name: "txt,single,full";
+ signal: "txt,single,full";
+ source: "txt";
+ script {
+ set_state(PART:"txt", "single_full", 0.0);
+ }
+ }
+ program {
+ name: "txt,hide";
+ signal: "hide";
+ source: "txt";
+ action: STATE_SET "hide" 0.0;
+ target: "txt";
+ }
+ program {
+ name: "txt,show";
+ signal: "show";
+ source: "txt";
+ action: STATE_SET "default" 0.0;
+ target: "txt";
+ }
+ }
+ } // group
+}
diff --git a/home/res/edje/apps_item.edc b/home/res/edje/apps_item.edc
new file mode 100755
index 0000000..c13a642
--- /dev/null
+++ b/home/res/edje/apps_item.edc
@@ -0,0 +1,428 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "apps_conf.edc"
+
+styles {
+ style {
+ name: "name_style";
+ base: "font=TIZEN:style=Regular text_class=AT0121 font_size="28" align=middle color=#FFFFFF color_class=AT0121 ellipsis=1 wrap=mixed";
+ }
+}
+
+images {
+ image: "b_home_screen_badge_large_bg.#.png" COMP;
+ image: "b_home_screen_badge_large_line.#.png" COMP;
+ image: "b_home_screen_badge_large_shadow.#.png" COMP;
+}
+
+collections {
+group {
+ name: "item";
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ min: ITEM_WIDTH ITEM_HEIGHT;
+ align: 0.0 0.0;
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ description {
+ state: "edit" 0.0;
+ inherit: "default" 0.0;
+ min: ITEM_EDIT_WIDTH ITEM_EDIT_HEIGHT;
+ }
+ }
+ part {
+ name: "item_inner";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "bg"; }
+ rel2 { relative: 0.5 0.5; to: "bg"; }
+ align: 0.5 0.5;
+ fixed: 1 1;
+ visible: 1;
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ program {
+ signal: "unedit";
+ source: "item";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ }
+ program {
+ signal: "edit";
+ source: "item";
+ action: STATE_SET "edit" 0.0;
+ target: "bg";
+ }
+ }
+}
+
+group {
+ name: "item_inner";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ min: ITEM_WIDTH ITEM_HEIGHT;
+ fixed: 1 1;
+ }
+ description {
+ state: "edit" 0.0;
+ inherit: "default" 0.0;
+ min: ITEM_EDIT_WIDTH ITEM_EDIT_HEIGHT;
+ }
+ }
+ part {
+ name: "icon";
+ type: SWALLOW;
+ scale: 1;
+ clip_to: "event,clip";
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.0; to: "bg"; }
+ rel2 { relative: 0.5 0.0; to: "bg"; }
+ min: ITEM_ICON_WIDTH ITEM_ICON_HEIGHT;
+ align: 0.5 0.0;
+ fixed: 1 1;
+ visible: 1;
+ }
+ description {
+ state: "edit" 0.0;
+ inherit: "default" 0.0;
+ min: ITEM_SMALL_ICON_WIDTH ITEM_SMALL_ICON_HEIGHT;
+ }
+ }
+ part {
+ name: "name";
+ type: TEXTBLOCK;
+ scale: 1;
+ clip_to: "event,clip";
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to_x: "bg"; to_y: "icon"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color_class: "AT0121";
+ text {
+ style: "name_style";
+ min: 0 0;
+ align: 0.0 0.0;
+ }
+ visible: 1;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "badge_bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ITEM_BADGE_X/ITEM_WIDTH) (ITEM_BADGE_Y/ITEM_HEIGHT); to, "bg"; }
+ rel2 { relative: (ITEM_BADGE_X/ITEM_WIDTH) (ITEM_BADGE_Y/ITEM_HEIGHT); to, "bg"; }
+ }
+ }
+ part {
+ name: "badge_image";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "badge_txt"; offset: -1 -1; }
+ rel2 { relative: 1.0 1.0; to, "badge_txt"; offset: -1 -1; }
+ image {
+ normal: "b_home_screen_badge_large_bg.#.png";
+ }
+ color_class: "AO013L1";
+ min: ITEM_BADGE_W ITEM_BADGE_H;
+ fixed: 1 1;
+ visible: 0;
+ }
+ description {
+ state: "1" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ min: ITEM_BADGE_W ITEM_BADGE_H;
+ }
+ description {
+ state: "2" 0.0;
+ inherit: "1" 0.0;
+ rel1 { relative: 0.0 0.0; to, "badge_txt"; offset: 0 -1; }
+ rel2 { relative: 1.0 1.0; to, "badge_txt"; offset: 0 -1; }
+ min: ITEM_BADGE_2W ITEM_BADGE_H;
+ }
+ description {
+ state: "3" 0.0;
+ inherit: "1" 0.0;
+ rel1 { relative: 0.0 0.0; to, "badge_txt"; offset: 0 -1; }
+ rel2 { relative: 1.0 1.0; to, "badge_txt"; offset: 0 -1; }
+ min: ITEM_BADGE_3W ITEM_BADGE_H;
+ }
+ }
+ part {
+ name: "badge_line";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "badge_image"; }
+ rel2 { relative: 1.0 1.0; to, "badge_image"; }
+ image {
+ normal: "b_home_screen_badge_large_line.#.png";
+ }
+ color_class: "AO013L2";
+ fixed: 1 1;
+ visible: 0;
+ }
+ description {
+ state: "1" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ description {
+ state: "2" 0.0;
+ inherit: "1" 0.0;
+ }
+ description {
+ state: "3" 0.0;
+ inherit: "1" 0.0;
+ }
+ }
+ part {
+ name: "badge_shadow";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "badge_image"; }
+ rel2 { relative: 1.0 1.0; to, "badge_image"; }
+ image {
+ normal: "b_home_screen_badge_large_shadow.#.png";
+ }
+ color_class: "AO061";
+ fixed: 1 1;
+ visible: 0;
+ }
+ description {
+ state: "1" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ description {
+ state: "2" 0.0;
+ inherit: "1" 0.0;
+ }
+ description {
+ state: "3" 0.0;
+ inherit: "1" 0.0;
+ }
+ }
+
+ part {
+ name: "badge_txt";
+ type: TEXT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to, "badge_bg"; }
+ rel2 { relative: 0.5 0.5; to, "badge_bg"; }
+ align: 0.5 0.5;
+ color_class: "AT0132";
+ text {
+ text_class: "AT0132";
+ ellipsis: 0.0;
+ align: 0.5 0.5;
+ min: 1 1;
+ }
+ fixed: 1 1;
+ visible: 0;
+ }
+ description {
+ state: "1" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ description {
+ state: "2" 0.0;
+ inherit: "1" 0.0;
+ }
+ description {
+ state: "3" 0.0;
+ inherit: "1" 0.0;
+ }
+ }
+ part {
+ name: "event,clip";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "bg"; }
+ rel2 { relative: 1.0 1.0; to, "bg"; }
+ color: 255 255 255 255;
+ visible: 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 127;
+ }
+ }
+ }
+ programs {
+ program {
+ signal: "item,pressed";
+ source: "item_inner";
+ action: STATE_SET "pressed" 0.0;
+ target: "event,clip";
+ }
+ program {
+ signal: "item,released";
+ source: "item_inner";
+ action: STATE_SET "default" 0.0;
+ target: "event,clip";
+ }
+ program {
+ signal: "name,show";
+ source: "item_inner";
+ action: STATE_SET "default" 0.0;
+ target: "name";
+ }
+ program {
+ signal: "name,hide";
+ source: "item_inner";
+ action: STATE_SET "hide" 0.0;
+ target: "name";
+ }
+ program {
+ signal: "unedit";
+ source: "item_inner";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ target: "icon";
+ }
+ program {
+ signal: "edit";
+ source: "item_inner";
+ action: STATE_SET "edit" 0.0;
+ target: "bg";
+ target: "icon";
+ }
+ // Badge
+ program {
+ signal: "badge,on,1";
+ source: "item";
+ action: STATE_SET "1" 0.0;
+ target: "badge_image";
+ target: "badge_line";
+ target: "badge_txt";
+ }
+ program {
+ signal: "badge,on,2";
+ source: "item";
+ action: STATE_SET "2" 0.0;
+ target: "badge_image";
+ target: "badge_line";
+ target: "badge_shadow";
+ target: "badge_txt";
+ }
+ program {
+ signal: "badge,on,3";
+ source: "item";
+ action: STATE_SET "3" 0.0;
+ target: "badge_image";
+ target: "badge_line";
+ target: "badge_shadow";
+ target: "badge_txt";
+ }
+ program {
+ signal: "badge,off";
+ source: "item";
+ action: STATE_SET "default" 0.0;
+ target: "badge_image";
+ target: "badge_line";
+ target: "badge_shadow";
+ target: "badge_txt";
+ }
+ }
+}
+group {
+ name: "center";
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ }
+}
+
+
+}
diff --git a/home/res/edje/apps_layout.edc b/home/res/edje/apps_layout.edc
new file mode 100755
index 0000000..0d26b05
--- /dev/null
+++ b/home/res/edje/apps_layout.edc
@@ -0,0 +1,240 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "apps_conf.edc"
+
+collections {
+ group {
+ name: "layout";
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; offset: 0 0; }
+ rel2 { relative: 1.0 1.0; offset: 0 0; }
+ color: 0 0 0 0;
+ visible: 1;
+ perspective {
+ zplane: 0;
+ }
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "container";
+ type: SWALLOW;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ visible: 1;
+ }
+ }
+ part {
+ name: "container_dimmer";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "container"; }
+ rel2 { relative: 1.0 1.0; to: "container"; }
+ color_class: "AO0111";
+ visible: 1;
+ }
+ }
+ part {
+ name: "zoom";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ perspective {
+ zplane: -140;
+ }
+ }
+ }
+ part {
+ name: "scroller";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to, "bg"; }
+ align: 0.5 0.0;
+ visible: 1;
+ map {
+ on: 0;
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default" 0.0;
+ map {
+ on: 1;
+ perspective: "bg";
+ }
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "on";
+ map {
+ perspective: "zoom";
+ }
+ }
+ }
+ part {
+ name: "top_checker";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 0.2; to: "bg"; }
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "bottom_checker";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.8; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+
+ part {
+ name: "blocker";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ description {
+ state: "enable" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "bg,down";
+ signal: "mouse,down,1";
+ source: "bg";
+ action: SIGNAL_EMIT "bg,down" "bg";
+ }
+ program {
+ name: "bg,up";
+ signal: "mouse,up,1";
+ source: "bg";
+ action: SIGNAL_EMIT "bg,up" "bg";
+ }
+ program {
+ signal: "show";
+ source: "checker";
+ action: STATE_SET "show" 0.0;
+ target: "top_checker";
+ target: "bottom_checker";
+ }
+ program {
+ signal: "hide";
+ source: "checker";
+ action: STATE_SET "default" 0.0;
+ target: "top_checker";
+ target: "bottom_checker";
+ }
+ program {
+ signal: "block";
+ source: "layout";
+ action: STATE_SET "enable" 0.0;
+ target: "blocker";
+ }
+ program {
+ signal: "unblock";
+ source: "layout";
+ action: STATE_SET "default" 0.0;
+ target: "blocker";
+ }
+ program {
+ signal: "show,zoom";
+ source: "scroller";
+ action: STATE_SET "on" 0.0;
+ target: "scroller";
+ after: "show,zoom,after";
+ }
+ program {
+ name: "show,zoom,after";
+ action: STATE_SET "zoom" 0.0;
+ transition: SIN_FAC 0.2 0.90;
+ target: "scroller";
+ }
+ program {
+ signal: "reset,zoom";
+ source: "scroller";
+ action: STATE_SET "on" 0.0;
+ transition: SIN_FAC 0.2 0.90;
+ target: "scroller";
+ after: "reset,zoom,after";
+ }
+ program {
+ name: "reset,zoom,after";
+ action: STATE_SET "default" 0.0;
+ target: "scroller";
+ }
+ }
+ } // layout group
+
+} // collections
+
+
+
+// End of file
diff --git a/home/res/edje/apps_page.edc b/home/res/edje/apps_page.edc
new file mode 100755
index 0000000..10e2605
--- /dev/null
+++ b/home/res/edje/apps_page.edc
@@ -0,0 +1,143 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "apps_conf.edc"
+
+
+
+#define ITEM_CENTER_PART(part_name, rel_x, rel_y, off_x, off_y, align_x, align_y) \
+ part { \
+ name: "item_center_"part_name; \
+ type: SWALLOW; \
+ mouse_events: 1; \
+ description { \
+ state: "default" 0.0; \
+ rel1 { relative: (rel_x) (rel_y); offset: off_x off_y; to: "bg"; } \
+ rel2 { relative: (rel_x) (rel_y); offset: off_x off_y; to: "bg"; } \
+ align: align_x align_y; \
+ min: ITEM_WIDTH ITEM_HEIGHT; \
+ fixed: 1 1; \
+ } \
+ description { \
+ state: "edit" 0.0; \
+ inherit: "default" 0.0; \
+ min: ITEM_EDIT_WIDTH ITEM_EDIT_HEIGHT; \
+ } \
+ }
+
+#define ITEM_CENTER_PROGRAM(part_name) \
+ program { \
+ signal: "unedit"; \
+ source: "item_center_"part_name; \
+ action: STATE_SET "default" 0.0; \
+ target: "item_center_"part_name; \
+ transition: DECELERATE 0.1; \
+ } \
+ program { \
+ signal: "edit"; \
+ source: "item_center_"part_name; \
+ action: STATE_SET "edit" 0.0; \
+ target: "item_center_"part_name; \
+ transition: DECELERATE 0.1; \
+ }
+
+#define ITEM_PART(part_name, pre_center, next_center) \
+ part { \
+ name: "item_"part_name; \
+ type: SWALLOW; \
+ scale: 1; \
+ mouse_events: 1; \
+ repeat_events: 1; \
+ description { \
+ state: "default" 0.0; \
+ visible: 1; \
+ rel1 { relative: 0.5 0.5; to: "item_center_"part_name; } \
+ rel2 { relative: 0.5 0.5; to: "item_center_"part_name; } \
+ align: 0.5 0.5; \
+ fixed: 1 1; \
+ } \
+ description { \
+ state: "prev" 0.0; \
+ inherit: "default" 0.0; \
+ rel1 { relative: 0.5 0.5; to: "item_center_"pre_center; } \
+ rel2 { relative: 0.5 0.5; to: "item_center_"pre_center; } \
+ } \
+ description { \
+ state: "next" 0.0; \
+ inherit: "default" 0.0; \
+ rel1 { relative: 0.5 0.5; to: "item_center_"next_center; } \
+ rel2 { relative: 0.5 0.5; to: "item_center_"next_center; } \
+ } \
+ }
+
+#define ITEM_PROGRAM(part_name) \
+ program { \
+ signal: "prev"; \
+ source: "item_"part_name; \
+ action: STATE_SET "prev" 0.0; \
+ target: "item_"part_name; \
+ } \
+ program { \
+ signal: "next"; \
+ source: "item_"part_name; \
+ action: STATE_SET "next" 0.0; \
+ target: "item_"part_name; \
+ } \
+ program { \
+ signal: "return"; \
+ source: "item_"part_name; \
+ action: STATE_SET "default" 0.0; \
+ target: "item_"part_name; \
+ transition: LINEAR 0.2; \
+ }
+
+collections {
+ group {
+ name: "page";
+ parts {
+ part {
+ name: "bg";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ visible: 0;
+ }
+ }
+
+ ITEM_CENTER_PART("-1", 0.5, -0.5, 1, 0, 0.0, 0.5)
+ ITEM_CENTER_PART("0", 0.5, 0.5, 0, 0, 1.0, 0.5)
+ ITEM_CENTER_PART("1", 0.5, 0.5, 1, 0, 0.0, 0.5)
+ ITEM_CENTER_PART("2", 0.5, 1.5, 0, 0, 1.0, 0.5)
+
+ ITEM_PART("0", "-1", "1")
+ ITEM_PART("1", "0", "2")
+ }
+
+ programs {
+ ITEM_CENTER_PROGRAM("-1");
+ ITEM_CENTER_PROGRAM("0");
+ ITEM_CENTER_PROGRAM("1");
+ ITEM_CENTER_PROGRAM("2");
+
+ ITEM_PROGRAM("0")
+ ITEM_PROGRAM("1")
+ }
+ } // group
+} // collections
diff --git a/home/res/edje/box_layout.edc b/home/res/edje/box_layout.edc
new file mode 100755
index 0000000..d04161c
--- /dev/null
+++ b/home/res/edje/box_layout.edc
@@ -0,0 +1,49 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "conf.edc"
+
+collections {
+ group {
+ name: "box";
+ parts {
+ part {
+ name: "bg";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ part {
+ name: "box";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel1.to: "bg";
+ rel2.relative: 1.0 1.0;
+ rel2.to: "bg";
+ visible: 1;
+ }
+ }
+ }
+ }
+}
diff --git a/home/res/edje/clock_shortcut.edc b/home/res/edje/clock_shortcut.edc
new file mode 100755
index 0000000..868e6c8
--- /dev/null
+++ b/home/res/edje/clock_shortcut.edc
@@ -0,0 +1,159 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "conf.edc"
+
+#define CLOCK_SHORTCUT_W 65
+#define CLOCK_SHORTCUT_H 65
+
+images {
+ image: "do_not_ic_donot_now.png" COMP;
+}
+
+collections {
+group {
+ name: "shortcut";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ part {
+ name: "shortcut,icon";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ min: CLOCK_SHORTCUT_W CLOCK_SHORTCUT_H;
+ max: CLOCK_SHORTCUT_W CLOCK_SHORTCUT_H;
+ rel1 { relative: 1.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 0.0; to: "bg"; }
+ align: 1.0 0.0;
+ fixed: 1 1;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "block";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.to: "focus";
+ rel2.to: "focus";
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ fixed: 1 1;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ align: 0.0 0.0;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "icon,show";
+ signal: "icon,show";
+ source: "prog";
+ action: STATE_SET "show" 0.0;
+ target: "shortcut,icon";
+ target: "focus";
+ target: "block";
+ }
+ program {
+ name: "icon,hide";
+ signal: "icon,hide";
+ source: "prog";
+ action: STATE_SET "default" 0.0;
+ target: "shortcut,icon";
+ target: "focus";
+ target: "block";
+ }
+ }
+}
+
+group {
+ name: "shortcut_default_icon";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ part {
+ name: "shortcut,icon";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "bg"; }
+ rel2 { relative: 0.5 0.5; to: "bg"; }
+ image {
+ normal: "do_not_ic_donot_now.png";
+ }
+ min: CLOCK_SHORTCUT_W CLOCK_SHORTCUT_H;
+ max: CLOCK_SHORTCUT_W CLOCK_SHORTCUT_H;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ visible: 1;
+ }
+ }
+ }
+}
+} // collections
+
+
+
+// End of file
diff --git a/home/res/edje/conf.edc b/home/res/edje/conf.edc
new file mode 120000
index 0000000..de97229
--- /dev/null
+++ b/home/res/edje/conf.edc
@@ -0,0 +1 @@
+../../include/conf.h \ No newline at end of file
diff --git a/home/res/edje/dynamicbox.edc b/home/res/edje/dynamicbox.edc
new file mode 100644
index 0000000..8080fad
--- /dev/null
+++ b/home/res/edje/dynamicbox.edc
@@ -0,0 +1,427 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+collections {
+ styles {
+ style {
+ name: "overlay,text";
+ base: "font=Tizen text_class=tizen font_size=30 align=center color=#FFFFFF ellipsis=1.0 wrap=char";
+ tag: "br" "\n";
+ tag: "hilight" "+ font=Tizen:style=Bold";
+ tag: "b" "+ font=Tizen:style=Bold";
+ tag: "tab" "\t";
+ }
+ }
+
+ group
+ {
+ name: "overlay";
+ parts
+ {
+ part {
+ name: "preview";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+
+ part {
+ name: "bg,img";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ color: 100 100 100 100;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+
+ part {
+ name: "text";
+ type: TEXTBLOCK;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 200/320; }
+ rel2 { relative: 0.5 320/320; }
+ max: 280 -1;
+ fixed: 1 0;
+ text {
+ style: "overlay,text";
+ min: 0 0;
+ }
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ }
+
+ programs {
+ program {
+ name: "disable,text";
+ signal: "disable";
+ source: "text";
+ action: STATE_SET "hide" 0.0;
+ target: "text";
+ target: "bg,img";
+ }
+
+ program {
+ name: "enable,text";
+ signal: "enable";
+ source: "text";
+ action: STATE_SET "default" 0.0;
+ target: "text";
+ target: "bg,img";
+ }
+ }
+ }
+
+ group
+ {
+ name: "dynamicbox,image";
+ parts
+ {
+ part {
+ name: "front";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ visible: 1;
+ }
+ description {
+ state: "to,back" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+
+ part {
+ name: "front,content";
+ type: SWALLOW;
+ clip_to: "front";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+
+ part {
+ name: "back";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ visible: 0;
+ }
+ description {
+ state: "to,back" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+
+ part {
+ name: "back,content";
+ type: SWALLOW;
+ clip_to: "back";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ }
+
+ programs
+ {
+ program {
+ name: "turn,to,back,front";
+ signal: "to,back";
+ source: "turn";
+ action: STATE_SET "to,back" 0.0;
+ target: "front";
+ target: "back";
+ transition: LINEAR 0.5;
+ after: "play,end";
+ }
+
+ program {
+ name: "turn,to,front";
+ signal: "to,front";
+ source: "turn";
+ action: STATE_SET "default" 0.0;
+ target: "front";
+ target: "back";
+ transition: LINEAR 0.5;
+ after: "play,end";
+ }
+
+ program {
+ name: "play,end";
+ action: SIGNAL_EMIT "done" "turn";
+ }
+ }
+ }
+
+ group
+ {
+ name: "dynamicbox";
+ parts
+ {
+ part {
+ name: "dynamicbox,content";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ map {
+ on: 0;
+ }
+ }
+ description {
+ state: "tilt" 0.0;
+ inherit: "default" 0.0;
+ map {
+ on: 1;
+ rotation {
+ x: 30.0;
+ }
+ }
+ }
+ description {
+ state: "move,down" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 0.0 0.2; }
+ rel2 { relative: 1.0 1.2; }
+ }
+ }
+
+ part {
+ name: "scroller";
+ mouse_events: 1;
+ repeat_events: 1;
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+
+ part {
+ name: "overlay";
+ mouse_events: 1;
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ color: 255 255 255 255;
+ visible: 1;
+ }
+ description {
+ state: "disable,overlay" 0.0;
+ inherit: "default" 0.0;
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ }
+
+ part {
+ name: "overlay,content";
+ mouse_events: 1;
+ type: SWALLOW;
+ clip_to: "overlay";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ }
+
+ programs
+ {
+ program {
+ name: "reset,overlay";
+ signal: "reset";
+ source: "overlay";
+ action: STATE_SET "disable,overlay" 0.0;
+ target: "overlay";
+ }
+ program {
+ name: "enable,overlay";
+ signal: "enable";
+ source: "overlay";
+ action: STATE_SET "default" 0.0;
+ target: "overlay";
+ transition: LINEAR 0.5;
+ after: "animation,done";
+ }
+
+ program {
+ name: "disable,overlay";
+ signal: "disable";
+ source: "overlay";
+ action: STATE_SET "disable,overlay" 0.0;
+ target: "overlay";
+ transition: LINEAR 0.5;
+ after: "animation,done";
+ }
+
+ program {
+ name: "tilt,start";
+ signal: "tilt";
+ source: "content";
+ action: STATE_SET "tilt" 0.0;
+ target: "dynamicbox,content";
+ transition: LINEAR 0.15;
+ after: "tilt,end";
+ }
+
+ program {
+ name: "tilt,end";
+ action: STATE_SET "default" 0.0;
+ target: "dynamicbox,content";
+ transition: LINEAR 0.15;
+ after: "animation,done";
+ }
+
+ program {
+ name: "move,down,start";
+ signal: "move,down";
+ source: "content";
+ action: STATE_SET "move,down" 0.0;
+ target: "dynamicbox,content";
+ transition: LINEAR 0.15;
+ after: "move,down,end";
+ }
+
+ program {
+ name: "move,down,end";
+ action: STATE_SET "default" 0.0;
+ target: "dynamicbox,content";
+ transition: LINEAR 0.15;
+ after: "animation,done";
+ }
+
+ program {
+ name: "animation,done";
+ action: SIGNAL_EMIT "finished" "animation";
+ }
+ }
+ }
+
+ group
+ {
+ name: "gbar";
+ parts
+ {
+ part {
+ name: "gbar,content";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+
+ part {
+ name: "overlay";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ color: 255 255 255 255;
+ visible: 1;
+ }
+ description {
+ state: "disable,overlay" 0.0;
+ inherit: "default" 0.0;
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ }
+
+ part {
+ name: "overlay,content";
+ type: SWALLOW;
+ clip_to: "overlay";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ }
+
+ programs
+ {
+ program {
+ name: "reset,overlay";
+ signal: "reset";
+ source: "overlay";
+ action: STATE_SET "disable,overlay" 0.0;
+ target: "overlay";
+ }
+ program {
+ name: "enable,overlay";
+ signal: "enable";
+ source: "overlay";
+ action: STATE_SET "default" 0.0;
+ target: "overlay";
+ transition: LINEAR 0.15;
+ after: "animation,done";
+ }
+
+ program {
+ name: "disable,overlay";
+ signal: "disable";
+ source: "overlay";
+ action: STATE_SET "disable,overlay" 0.0;
+ target: "overlay";
+ transition: LINEAR 0.15;
+ after: "animation,done";
+ }
+
+ program {
+ name: "animation,done";
+ action: SIGNAL_EMIT "finished" "animation";
+ }
+ }
+ }
+}
+
+/* End of a file */
diff --git a/home/res/edje/edit.edc b/home/res/edje/edit.edc
new file mode 100644
index 0000000..b3c3dd8
--- /dev/null
+++ b/home/res/edje/edit.edc
@@ -0,0 +1,169 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "conf.edc"
+
+#define PLUS_MIN 90 90
+
+styles {
+ style {
+ name: "max_text_style";
+ base: "font=TIZEN:style=Regular text_class=tizen style=shadow shadow_color=#0000004C font_size="25" color_class=AT0121 align=middle color=#FFFFFF ellipsis=1 wrap=mixed";
+ }
+}
+
+images {
+ image: "b_home_screen_widget_line.#.png" COMP;
+ image: "b_home_screen_widget_line_ef.png" COMP;
+ image: "b_home_screen_widget_plus.png" COMP;
+ image: "b_home_screen_widget_plus_ef.png" COMP;
+ image: "b_home_screen_edit_cover.png" COMP;
+ image: "b_home_screen_edit_cover_ef.png" COMP;
+}
+
+collections {
+group {
+ name: "edit";
+ parts {
+ part {
+ name: "bottom_bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ part {
+ name: "bg";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ color_class: "AO041";
+ visible: 0;
+ }
+ }
+ part {
+ name: "scroller_region";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "bg"; }
+ rel2 { relative: 1.0 1.0; to, "bg"; }
+ }
+ }
+ part {
+ name: "scroller";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "scroller_region";}
+ rel2 { relative: 1.0 1.0; to, "scroller_region";}
+ visible: 1;
+ }
+ }
+ part {
+ name: "index_region";
+ type: SPACER;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 INDICATOR_START_Y/BASE_HEIGHT; to, "bg"; }
+ rel2 { relative: 1.0 (INDICATOR_START_Y+INDICATOR_HEIGHT)/BASE_HEIGHT; to, "bg"; }
+ }
+ }
+ part {
+ name: "index_clipper";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "index_region"; }
+ rel2 { relative: 1.0 1.0; to: "index_region"; }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "init" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "index";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ clip_to: "index_clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "index_region";}
+ rel2 { relative: 1.0 1.0; to, "index_region";}
+ visible: 1;
+ }
+ }
+ } // parts
+ programs {
+ program {
+ signal: "init";
+ source: "edit";
+ action: STATE_SET "init" 0.0;
+ target: "index_clipper";
+ transition: LINEAR 0.5;
+ }
+ program {
+ signal: "hide";
+ source: "edit";
+ action: STATE_SET "default" 0.0;
+ target: "index_clipper";
+ }
+ } // programs
+} // group
+
+group {
+ name: "proxy_item";
+ parts {
+ part {
+ name: "proxy_item";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ min: ITEM_EDIT_WIDTH ITEM_EDIT_HEIGHT;
+ max: ITEM_EDIT_WIDTH ITEM_EDIT_HEIGHT;
+ visible: 1;
+ }
+ }
+ }
+} // group
+} // collections
+
+
+
+// End of file
diff --git a/home/res/edje/images/Arrow_S_00015.png b/home/res/edje/images/Arrow_S_00015.png
new file mode 100755
index 0000000..69f2485
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00015.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00016.png b/home/res/edje/images/Arrow_S_00016.png
new file mode 100755
index 0000000..3031c31
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00016.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00017.png b/home/res/edje/images/Arrow_S_00017.png
new file mode 100755
index 0000000..f5a79b8
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00017.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00018.png b/home/res/edje/images/Arrow_S_00018.png
new file mode 100755
index 0000000..4c3d3b5
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00018.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00019.png b/home/res/edje/images/Arrow_S_00019.png
new file mode 100755
index 0000000..1b26644
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00019.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00020.png b/home/res/edje/images/Arrow_S_00020.png
new file mode 100755
index 0000000..1e977b6
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00020.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00021.png b/home/res/edje/images/Arrow_S_00021.png
new file mode 100755
index 0000000..b547ea8
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00021.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00022.png b/home/res/edje/images/Arrow_S_00022.png
new file mode 100755
index 0000000..658875f
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00022.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00023.png b/home/res/edje/images/Arrow_S_00023.png
new file mode 100755
index 0000000..d372d7b
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00023.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00024.png b/home/res/edje/images/Arrow_S_00024.png
new file mode 100755
index 0000000..c97b531
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00024.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00025.png b/home/res/edje/images/Arrow_S_00025.png
new file mode 100755
index 0000000..c491f5a
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00025.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00026.png b/home/res/edje/images/Arrow_S_00026.png
new file mode 100755
index 0000000..cf545b5
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00026.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00027.png b/home/res/edje/images/Arrow_S_00027.png
new file mode 100755
index 0000000..4db14a9
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00027.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00028.png b/home/res/edje/images/Arrow_S_00028.png
new file mode 100755
index 0000000..0c7a48f
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00028.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00029.png b/home/res/edje/images/Arrow_S_00029.png
new file mode 100755
index 0000000..be5bd13
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00029.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00030.png b/home/res/edje/images/Arrow_S_00030.png
new file mode 100755
index 0000000..5bd12d4
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00030.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00031.png b/home/res/edje/images/Arrow_S_00031.png
new file mode 100755
index 0000000..1925c20
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00031.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00032.png b/home/res/edje/images/Arrow_S_00032.png
new file mode 100755
index 0000000..1de629f
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00032.png
Binary files differ
diff --git a/home/res/edje/images/Arrow_S_00033.png b/home/res/edje/images/Arrow_S_00033.png
new file mode 100755
index 0000000..067c9ae
--- /dev/null
+++ b/home/res/edje/images/Arrow_S_00033.png
Binary files differ
diff --git a/home/res/edje/images/B3_Data.png b/home/res/edje/images/B3_Data.png
new file mode 100755
index 0000000..f4afdb1
--- /dev/null
+++ b/home/res/edje/images/B3_Data.png
Binary files differ
diff --git a/home/res/edje/images/b_favorite_app_line.png b/home/res/edje/images/b_favorite_app_line.png
new file mode 100755
index 0000000..673cea1
--- /dev/null
+++ b/home/res/edje/images/b_favorite_app_line.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_add_widget_line.#.png b/home/res/edje/images/b_home_screen_add_widget_line.#.png
new file mode 100755
index 0000000..55a0938
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_add_widget_line.#.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_badge_large_bg.#.png b/home/res/edje/images/b_home_screen_badge_large_bg.#.png
new file mode 100755
index 0000000..9aee496
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_badge_large_bg.#.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_badge_large_line.#.png b/home/res/edje/images/b_home_screen_badge_large_line.#.png
new file mode 100755
index 0000000..e06e33e
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_badge_large_line.#.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_badge_large_shadow.#.png b/home/res/edje/images/b_home_screen_badge_large_shadow.#.png
new file mode 100755
index 0000000..0c3620c
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_badge_large_shadow.#.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_block_btn_bg.png b/home/res/edje/images/b_home_screen_block_btn_bg.png
new file mode 100755
index 0000000..d1fc193
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_block_btn_bg.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_block_btn_bg02.#.png b/home/res/edje/images/b_home_screen_block_btn_bg02.#.png
new file mode 100755
index 0000000..c459e1f
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_block_btn_bg02.#.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_block_btn_ic.png b/home/res/edje/images/b_home_screen_block_btn_ic.png
new file mode 100755
index 0000000..07cf628
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_block_btn_ic.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_block_btn_line.png b/home/res/edje/images/b_home_screen_block_btn_line.png
new file mode 100755
index 0000000..a7ffe2b
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_block_btn_line.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_block_btn_line02.#.png b/home/res/edje/images/b_home_screen_block_btn_line02.#.png
new file mode 100755
index 0000000..7d90848
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_block_btn_line02.#.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_block_text_btn_bg.#.png b/home/res/edje/images/b_home_screen_block_text_btn_bg.#.png
new file mode 100755
index 0000000..8b2f8da
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_block_text_btn_bg.#.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_block_text_btn_line.#.png b/home/res/edje/images/b_home_screen_block_text_btn_line.#.png
new file mode 100755
index 0000000..c204d34
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_block_text_btn_line.#.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_clock_arrow.png b/home/res/edje/images/b_home_screen_clock_arrow.png
new file mode 100755
index 0000000..97d2854
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_clock_arrow.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_clock_arrow_big.png b/home/res/edje/images/b_home_screen_clock_arrow_big.png
new file mode 100755
index 0000000..c034338
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_clock_arrow_big.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_clock_arrow_big_ef.png b/home/res/edje/images/b_home_screen_clock_arrow_big_ef.png
new file mode 100755
index 0000000..8cfd5db
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_clock_arrow_big_ef.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_edit_cover.png b/home/res/edje/images/b_home_screen_edit_cover.png
new file mode 100755
index 0000000..0127861
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_edit_cover.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_edit_cover_ef.png b/home/res/edje/images/b_home_screen_edit_cover_ef.png
new file mode 100755
index 0000000..2a86f81
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_edit_cover_ef.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_favorite_more_icon.png b/home/res/edje/images/b_home_screen_favorite_more_icon.png
new file mode 100755
index 0000000..2e22894
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_favorite_more_icon.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_network_auto.png b/home/res/edje/images/b_home_screen_network_auto.png
new file mode 100755
index 0000000..06ead26
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_network_auto.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_network_off.png b/home/res/edje/images/b_home_screen_network_off.png
new file mode 100755
index 0000000..ae84409
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_network_off.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_network_on.png b/home/res/edje/images/b_home_screen_network_on.png
new file mode 100755
index 0000000..593721d
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_network_on.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_recent_icon.png b/home/res/edje/images/b_home_screen_recent_icon.png
new file mode 100755
index 0000000..cc28224
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_recent_icon.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_widget_check.png b/home/res/edje/images/b_home_screen_widget_check.png
new file mode 100755
index 0000000..3851009
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_widget_check.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_widget_check_ef.png b/home/res/edje/images/b_home_screen_widget_check_ef.png
new file mode 100755
index 0000000..2995bea
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_widget_check_ef.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_widget_del_bg.png b/home/res/edje/images/b_home_screen_widget_del_bg.png
new file mode 100755
index 0000000..c4e87a9
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_widget_del_bg.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_widget_del_icon.png b/home/res/edje/images/b_home_screen_widget_del_icon.png
new file mode 100755
index 0000000..5101f62
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_widget_del_icon.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_widget_del_line.png b/home/res/edje/images/b_home_screen_widget_del_line.png
new file mode 100755
index 0000000..16b3c0a
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_widget_del_line.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_widget_line.#.png b/home/res/edje/images/b_home_screen_widget_line.#.png
new file mode 100755
index 0000000..cb25821
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_widget_line.#.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_widget_line_ef.png b/home/res/edje/images/b_home_screen_widget_line_ef.png
new file mode 100755
index 0000000..6b77be7
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_widget_line_ef.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_widget_plus.png b/home/res/edje/images/b_home_screen_widget_plus.png
new file mode 100755
index 0000000..0d6af14
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_widget_plus.png
Binary files differ
diff --git a/home/res/edje/images/b_home_screen_widget_plus_ef.png b/home/res/edje/images/b_home_screen_widget_plus_ef.png
new file mode 100755
index 0000000..0c502d3
--- /dev/null
+++ b/home/res/edje/images/b_home_screen_widget_plus_ef.png
Binary files differ
diff --git a/home/res/edje/images/b_widget_favorite_bg.png b/home/res/edje/images/b_widget_favorite_bg.png
new file mode 100755
index 0000000..0ff8fd1
--- /dev/null
+++ b/home/res/edje/images/b_widget_favorite_bg.png
Binary files differ
diff --git a/home/res/edje/images/bouncing_bottom_edge.png b/home/res/edje/images/bouncing_bottom_edge.png
new file mode 100755
index 0000000..7259d14
--- /dev/null
+++ b/home/res/edje/images/bouncing_bottom_edge.png
Binary files differ
diff --git a/home/res/edje/images/bouncing_bottom_glow.png b/home/res/edje/images/bouncing_bottom_glow.png
new file mode 100755
index 0000000..5b150b0
--- /dev/null
+++ b/home/res/edje/images/bouncing_bottom_glow.png
Binary files differ
diff --git a/home/res/edje/images/bouncing_left_edge.png b/home/res/edje/images/bouncing_left_edge.png
new file mode 100755
index 0000000..413fccd
--- /dev/null
+++ b/home/res/edje/images/bouncing_left_edge.png
Binary files differ
diff --git a/home/res/edje/images/bouncing_left_glow.png b/home/res/edje/images/bouncing_left_glow.png
new file mode 100755
index 0000000..11015e4
--- /dev/null
+++ b/home/res/edje/images/bouncing_left_glow.png
Binary files differ
diff --git a/home/res/edje/images/bouncing_right_edge.png b/home/res/edje/images/bouncing_right_edge.png
new file mode 100755
index 0000000..e14f69b
--- /dev/null
+++ b/home/res/edje/images/bouncing_right_edge.png
Binary files differ
diff --git a/home/res/edje/images/bouncing_right_glow.png b/home/res/edje/images/bouncing_right_glow.png
new file mode 100755
index 0000000..69ed30b
--- /dev/null
+++ b/home/res/edje/images/bouncing_right_glow.png
Binary files differ
diff --git a/home/res/edje/images/do_not_ic_disturb.png b/home/res/edje/images/do_not_ic_disturb.png
new file mode 100755
index 0000000..6ae3a40
--- /dev/null
+++ b/home/res/edje/images/do_not_ic_disturb.png
Binary files differ
diff --git a/home/res/edje/images/do_not_ic_donot_now.png b/home/res/edje/images/do_not_ic_donot_now.png
new file mode 100755
index 0000000..09427ca
--- /dev/null
+++ b/home/res/edje/images/do_not_ic_donot_now.png
Binary files differ
diff --git a/home/res/edje/images/favorite_contact_bg_cover.png b/home/res/edje/images/favorite_contact_bg_cover.png
new file mode 100755
index 0000000..9d7eb1c
--- /dev/null
+++ b/home/res/edje/images/favorite_contact_bg_cover.png
Binary files differ
diff --git a/home/res/edje/images/indicator_clock_on_focused.png b/home/res/edje/images/indicator_clock_on_focused.png
new file mode 100755
index 0000000..4c2a757
--- /dev/null
+++ b/home/res/edje/images/indicator_clock_on_focused.png
Binary files differ
diff --git a/home/res/edje/images/indicator_clock_on_focused_ef.png b/home/res/edje/images/indicator_clock_on_focused_ef.png
new file mode 100755
index 0000000..84a2ace
--- /dev/null
+++ b/home/res/edje/images/indicator_clock_on_focused_ef.png
Binary files differ
diff --git a/home/res/edje/images/indicator_clock_on_normal.png b/home/res/edje/images/indicator_clock_on_normal.png
new file mode 100755
index 0000000..334e96d
--- /dev/null
+++ b/home/res/edje/images/indicator_clock_on_normal.png
Binary files differ
diff --git a/home/res/edje/images/indicator_clock_on_normal_ef.png b/home/res/edje/images/indicator_clock_on_normal_ef.png
new file mode 100755
index 0000000..9978881
--- /dev/null
+++ b/home/res/edje/images/indicator_clock_on_normal_ef.png
Binary files differ
diff --git a/home/res/edje/images/indicator_on_focused.png b/home/res/edje/images/indicator_on_focused.png
new file mode 100755
index 0000000..0c84b5f
--- /dev/null
+++ b/home/res/edje/images/indicator_on_focused.png
Binary files differ
diff --git a/home/res/edje/images/indicator_on_focused_ef.png b/home/res/edje/images/indicator_on_focused_ef.png
new file mode 100755
index 0000000..7e52913
--- /dev/null
+++ b/home/res/edje/images/indicator_on_focused_ef.png
Binary files differ
diff --git a/home/res/edje/images/indicator_on_normal.png b/home/res/edje/images/indicator_on_normal.png
new file mode 100755
index 0000000..a844317
--- /dev/null
+++ b/home/res/edje/images/indicator_on_normal.png
Binary files differ
diff --git a/home/res/edje/images/indicator_on_normal_ef.png b/home/res/edje/images/indicator_on_normal_ef.png
new file mode 100755
index 0000000..e2b20f6
--- /dev/null
+++ b/home/res/edje/images/indicator_on_normal_ef.png
Binary files differ
diff --git a/home/res/edje/images/indicator_panel_on_focused.png b/home/res/edje/images/indicator_panel_on_focused.png
new file mode 100755
index 0000000..cdaa564
--- /dev/null
+++ b/home/res/edje/images/indicator_panel_on_focused.png
Binary files differ
diff --git a/home/res/edje/images/indicator_panel_on_focused_ef.png b/home/res/edje/images/indicator_panel_on_focused_ef.png
new file mode 100755
index 0000000..f509daa
--- /dev/null
+++ b/home/res/edje/images/indicator_panel_on_focused_ef.png
Binary files differ
diff --git a/home/res/edje/images/indicator_panel_on_normal.png b/home/res/edje/images/indicator_panel_on_normal.png
new file mode 100755
index 0000000..9965865
--- /dev/null
+++ b/home/res/edje/images/indicator_panel_on_normal.png
Binary files differ
diff --git a/home/res/edje/images/indicator_panel_on_normal_ef.png b/home/res/edje/images/indicator_panel_on_normal_ef.png
new file mode 100755
index 0000000..f11fe19
--- /dev/null
+++ b/home/res/edje/images/indicator_panel_on_normal_ef.png
Binary files differ
diff --git a/home/res/edje/images/overlay000_image.png b/home/res/edje/images/overlay000_image.png
new file mode 100755
index 0000000..b700c87
--- /dev/null
+++ b/home/res/edje/images/overlay000_image.png
Binary files differ
diff --git a/home/res/edje/images/overlay00_bg_cover.png b/home/res/edje/images/overlay00_bg_cover.png
new file mode 100755
index 0000000..95d1e63
--- /dev/null
+++ b/home/res/edje/images/overlay00_bg_cover.png
Binary files differ
diff --git a/home/res/edje/images/overlay01_bg_cover.png b/home/res/edje/images/overlay01_bg_cover.png
new file mode 100755
index 0000000..bed116a
--- /dev/null
+++ b/home/res/edje/images/overlay01_bg_cover.png
Binary files differ
diff --git a/home/res/edje/images/overlay05_bg_cover.png b/home/res/edje/images/overlay05_bg_cover.png
new file mode 100755
index 0000000..45807bd
--- /dev/null
+++ b/home/res/edje/images/overlay05_bg_cover.png
Binary files differ
diff --git a/home/res/edje/images/overlay06_bg_cover.png b/home/res/edje/images/overlay06_bg_cover.png
new file mode 100755
index 0000000..0528375
--- /dev/null
+++ b/home/res/edje/images/overlay06_bg_cover.png
Binary files differ
diff --git a/home/res/edje/images/overlay08_bg_cover.png b/home/res/edje/images/overlay08_bg_cover.png
new file mode 100755
index 0000000..07ed911
--- /dev/null
+++ b/home/res/edje/images/overlay08_bg_cover.png
Binary files differ
diff --git a/home/res/edje/images/overlay_button.#.png b/home/res/edje/images/overlay_button.#.png
new file mode 100755
index 0000000..b942f7a
--- /dev/null
+++ b/home/res/edje/images/overlay_button.#.png
Binary files differ
diff --git a/home/res/edje/images/overlay_button_press.#.png b/home/res/edje/images/overlay_button_press.#.png
new file mode 100755
index 0000000..2fd68e2
--- /dev/null
+++ b/home/res/edje/images/overlay_button_press.#.png
Binary files differ
diff --git a/home/res/edje/images/overlay_close.png b/home/res/edje/images/overlay_close.png
new file mode 100755
index 0000000..0cf4539
--- /dev/null
+++ b/home/res/edje/images/overlay_close.png
Binary files differ
diff --git a/home/res/edje/images/overlay_cue.png b/home/res/edje/images/overlay_cue.png
new file mode 100755
index 0000000..78f9263
--- /dev/null
+++ b/home/res/edje/images/overlay_cue.png
Binary files differ
diff --git a/home/res/edje/images/overlay_start_button.png b/home/res/edje/images/overlay_start_button.png
new file mode 100755
index 0000000..8e479c4
--- /dev/null
+++ b/home/res/edje/images/overlay_start_button.png
Binary files differ
diff --git a/home/res/edje/images/overlay_start_button_press.png b/home/res/edje/images/overlay_start_button_press.png
new file mode 100755
index 0000000..9ba2878
--- /dev/null
+++ b/home/res/edje/images/overlay_start_button_press.png
Binary files differ
diff --git a/home/res/edje/images/overlay_swipe_down.png b/home/res/edje/images/overlay_swipe_down.png
new file mode 100755
index 0000000..988ac7b
--- /dev/null
+++ b/home/res/edje/images/overlay_swipe_down.png
Binary files differ
diff --git a/home/res/edje/images/overlay_swipe_left.png b/home/res/edje/images/overlay_swipe_left.png
new file mode 100755
index 0000000..53415f0
--- /dev/null
+++ b/home/res/edje/images/overlay_swipe_left.png
Binary files differ
diff --git a/home/res/edje/images/overlay_swipe_right.png b/home/res/edje/images/overlay_swipe_right.png
new file mode 100755
index 0000000..45ae883
--- /dev/null
+++ b/home/res/edje/images/overlay_swipe_right.png
Binary files differ
diff --git a/home/res/edje/images/overlay_swipe_up.png b/home/res/edje/images/overlay_swipe_up.png
new file mode 100755
index 0000000..0801f9d
--- /dev/null
+++ b/home/res/edje/images/overlay_swipe_up.png
Binary files differ
diff --git a/home/res/edje/index.edc b/home/res/edje/index.edc
new file mode 100755
index 0000000..cdb5fdf
--- /dev/null
+++ b/home/res/edje/index.edc
@@ -0,0 +1,356 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "conf.edc"
+
+collections {
+ group {
+ name: "elm/index/item/vertical/clock/thumbnail";
+ alias: "elm/index/item_odd/vertical/clock/thumbnail";
+ alias: "elm/index/item/horizontal/clock/thumbnail";
+ alias: "elm/index/item_odd/horizontal/clock/thumbnail";
+ images {
+ image: "images/indicator_clock_on_normal.png" COMP;
+ image: "images/indicator_clock_on_focused.png" COMP;
+ image: "images/indicator_clock_on_normal_ef.png" COMP;
+ image: "images/indicator_clock_on_focused_ef.png" COMP;
+ }
+ parts {
+ part { name:"bg";
+ type : RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ color: 0 0 0 0;
+ min: INDEX_THUMBNAIL_HOME_BG_SIZE;
+ max: INDEX_THUMBNAIL_HOME_BG_SIZE;
+ visible: 0;
+ align: 0.5 0.5;
+ }
+ }
+ part { name: "indicator1_ef";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_clock_on_normal_ef.png";
+ color_class: "AO062";
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "indicator1";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_clock_on_normal.png";
+ color_class: "AO032";
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "indicator2_ef";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_clock_on_focused_ef.png";
+ color_class: "AO062P";
+ visible: 0;
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "indicator2";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_clock_on_focused.png";
+ color_class: "AO0321";
+ visible: 0;
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ } //parts
+ programs {
+ program { name: "active";
+ signal: "elm,state,active";
+ source: "elm";
+ action: STATE_SET "active" 0.0;
+ target: "indicator1";
+ target: "indicator2";
+ target: "indicator1_ef";
+ target: "indicator2_ef";
+ }
+ program { name: "inactive";
+ signal: "elm,state,inactive";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "indicator1";
+ target: "indicator2";
+ target: "indicator1_ef";
+ target: "indicator2_ef";
+ }
+ } //programs
+ } // group
+ group {
+ name: "elm/index/item/vertical/noti/thumbnail";
+ alias: "elm/index/item_odd/vertical/noti/thumbnail";
+ alias: "elm/index/item/horizontal/noti/thumbnail";
+ alias: "elm/index/item_odd/horizontal/noti/thumbnail";
+ images {
+ image: "images/indicator_panel_on_normal.png" COMP;
+ image: "images/indicator_panel_on_focused.png" COMP;
+ image: "images/indicator_panel_on_normal_ef.png" COMP;
+ image: "images/indicator_panel_on_focused_ef.png" COMP;
+ }
+ parts {
+ part { name:"bg";
+ type : RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ color: 0 0 0 0;
+ min: INDEX_THUMBNAIL_HOME_BG_SIZE;
+ max: INDEX_THUMBNAIL_HOME_BG_SIZE;
+ visible: 0;
+ align: 0.5 0.5;
+ }
+ }
+ part { name: "indicator1_ef";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_panel_on_normal_ef.png";
+ color_class: "AO062";
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "indicator1";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_panel_on_normal.png";
+ color_class: "AO032";
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "indicator2_ef";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_panel_on_focused_ef.png";
+ color_class: "AO062P";
+ visible: 0;
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "indicator2";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_panel_on_focused.png";
+ color_class: "AO0321";
+ visible: 0;
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ } //parts
+ programs {
+ program { name: "active";
+ signal: "elm,state,active";
+ source: "elm";
+ action: STATE_SET "active" 0.0;
+ target: "indicator1";
+ target: "indicator2";
+ target: "indicator1_ef";
+ target: "indicator2_ef";
+ }
+ program { name: "inactive";
+ signal: "elm,state,inactive";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "indicator1";
+ target: "indicator2";
+ target: "indicator1_ef";
+ target: "indicator2_ef";
+ }
+ } //programs
+ } // group
+ group {
+ name: "elm/index/item/vertical/page/thumbnail";
+ alias: "elm/index/item_odd/vertical/page/thumbnail";
+ alias: "elm/index/item/horizontal/page/thumbnail";
+ alias: "elm/index/item_odd/horizontal/page/thumbnail";
+ images {
+ image: "images/indicator_on_normal.png" COMP;
+ image: "images/indicator_on_focused.png" COMP;
+ image: "images/indicator_on_normal_ef.png" COMP;
+ image: "images/indicator_on_focused_ef.png" COMP;
+ }
+ parts {
+ part { name:"bg";
+ type : RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ color: 0 0 0 0;
+ min: INDEX_THUMBNAIL_HOME_BG_SIZE;
+ max: INDEX_THUMBNAIL_HOME_BG_SIZE;
+ visible: 0;
+ align: 0.5 0.5;
+ }
+ }
+ part { name: "indicator1_ef";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_on_normal_ef.png";
+ color_class: "AO062";
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "indicator1";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_on_normal.png";
+ color_class: "AO032";
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "indicator2_ef";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_on_focused_ef.png";
+ color_class: "AO062P";
+ visible: 0;
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "indicator2";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ min: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ max: INDEX_THUMBNAIL_HOME_IND_SIZE;
+ image.normal: "images/indicator_on_focused.png";
+ color_class: "AO0321";
+ visible: 0;
+ }
+ description { state: "active" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ } //parts
+ programs {
+ program { name: "active";
+ signal: "elm,state,active";
+ source: "elm";
+ action: STATE_SET "active" 0.0;
+ target: "indicator1";
+ target: "indicator2";
+ target: "indicator1_ef";
+ target: "indicator2_ef";
+ }
+ program { name: "inactive";
+ signal: "elm,state,inactive";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "indicator1";
+ target: "indicator2";
+ target: "indicator1_ef";
+ target: "indicator2_ef";
+ }
+ } // programs
+ } //group
+} // collections
+
+/* End of a file */
diff --git a/home/res/edje/layout.edc b/home/res/edje/layout.edc
new file mode 100755
index 0000000..3d84bb5
--- /dev/null
+++ b/home/res/edje/layout.edc
@@ -0,0 +1,667 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "conf.edc"
+
+images {
+ image: "bouncing_bottom_edge.png" COMP;
+ image: "bouncing_bottom_glow.png" COMP;
+ image: "bouncing_left_edge.png" COMP;
+ image: "bouncing_left_glow.png" COMP;
+ image: "bouncing_right_edge.png" COMP;
+ image: "bouncing_right_glow.png" COMP;
+}
+
+collections {
+ group {
+ name: "layout";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ part {
+ name: "opacity";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { to: "bg"; }
+ rel2 { to: "bg"; }
+ color: 0 0 0 64;
+ visible: 0;
+ }
+ description {
+ state: "opacity" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "scroller,clip";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "bg";}
+ rel2 { relative: 1.0 1.0; to, "bg";}
+ color: 255 255 255 255;
+ visible: 1;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 0;
+ }
+ }
+ part {
+ name: "scroller_region";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { to, "bg"; }
+ rel2 { to, "bg"; }
+ }
+ }
+ part {
+ name: "scroller";
+ type: SWALLOW;
+ clip_to: "scroller,clip";
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "scroller_region";}
+ rel2 { relative: 1.0 1.0; to, "scroller_region";}
+ visible: 1;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "index_region";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 INDICATOR_START_Y/BASE_HEIGHT; to, "bg"; }
+ rel2 { relative: 1.0 (INDICATOR_START_Y+INDICATOR_HEIGHT)/BASE_HEIGHT; to, "bg"; }
+ }
+ }
+ part {
+ name: "left_index,clip";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "index_region"; }
+ rel2 { relative: 1.0 1.0; to, "index_region"; }
+ color: 255 255 255 255;
+ visible: 1;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "left_index";
+ type: SWALLOW;
+ scale: 1;
+ clip_to: "left_index,clip";
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "index_region";}
+ rel2 { relative: 1.0 1.0; to, "index_region";}
+ visible: 1;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "right_index,clip";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "index_region"; }
+ rel2 { relative: 1.0 1.0; to, "index_region"; }
+ color: 255 255 255 255;
+ visible: 1;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 0;
+ }
+ }
+ part {
+ name: "right_index";
+ type: SWALLOW;
+ scale: 1;
+ clip_to: "right_index,clip";
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "index_region";}
+ rel2 { relative: 1.0 1.0; to, "index_region";}
+ visible: 1;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "edit_region";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { to, "bg"; }
+ rel2 { to, "bg"; }
+ }
+ }
+ part {
+ name: "edit";
+ type: SWALLOW;
+ clip_to: "scroller,clip";
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "edit_region";}
+ rel2 { relative: 1.0 1.0; to, "edit_region";}
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "add_viewer_region";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { to, "bg"; }
+ rel2 { to, "bg"; }
+ }
+ }
+ part {
+ name: "add_viewer,clip";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "bg";}
+ rel2 { relative: 1.0 1.0; to, "bg";}
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "add_viewer";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ clip_to: "add_viewer,clip";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "add_viewer_region";}
+ rel2 { relative: 1.0 1.0; to, "add_viewer_region";}
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "left_checker";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 0.2 1.0; to: "bg"; }
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "right_checker";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.8 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "blocker";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ description {
+ state: "enable" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "bottom,clipper";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to: "bouncing,bottom,edge"; }
+ rel2 { relative: 1.0 1.0; to: "bouncing,bottom,edge"; }
+ visible: 1;
+ }
+ description {
+ state: "show";
+ inherit: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bouncing,bottom,glow"; }
+ rel2 { relative: 1.0 1.0; to: "bouncing,bottom,edge"; }
+ }
+ }
+ part {
+ name: "bouncing,bottom,edge";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "bottom,clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ image {
+ normal: "bouncing_bottom_edge.png";
+ }
+ color_class: "B019";
+ min: 360 2;
+ fixed: 1 1;
+ align: 0.5 1.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "bouncing,bottom,glow";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "bottom,clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bouncing,bottom,edge"; }
+ rel2 { relative: 1.0 0.0; to: "bouncing,bottom,edge"; }
+ image {
+ normal: "bouncing_bottom_glow.png";
+ }
+ color_class: "B018E";
+ min: 360 50;
+ fixed: 1 1;
+ align: 0.5 1.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "left,clipper";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bouncing,left,edge"; }
+ rel2 { relative: 0.0 1.0; to: "bouncing,left,edge"; }
+ visible: 1;
+ }
+ description {
+ state: "show";
+ inherit: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bouncing,left,edge"; }
+ rel2 { relative: 1.0 1.0; to: "bouncing,left,glow"; }
+ }
+ }
+ part {
+ name: "bouncing,left,edge";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "left,clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 0.0 1.0; to: "bg"; }
+ image {
+ normal: "bouncing_left_edge.png";
+ }
+ color_class: "B019";
+ min: 1 480;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ visible: 1;
+ }
+ }
+ part {
+ name: "bouncing,left,glow";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "left,clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 1.0 0.0; to: "bouncing,left,edge"; }
+ rel2 { relative: 1.0 1.0; to: "bouncing,left,edge"; }
+ image {
+ normal: "bouncing_left_glow.png";
+ }
+ color_class: "B018E";
+ min: 50 480;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ visible: 1;
+ }
+ }
+ part {
+ name: "right,clipper";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 1.0 0.0; to: "bouncing,right,edge"; }
+ rel2 { relative: 1.0 1.0; to: "bouncing,right,edge"; }
+ visible: 1;
+ }
+ description {
+ state: "show";
+ inherit: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bouncing,right,glow"; }
+ rel2 { relative: 1.0 1.0; to: "bouncing,right,edge"; offset: 1 0; }
+ }
+ }
+
+ part {
+ name: "bouncing,right,edge";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "right,clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 1.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ image {
+ normal: "bouncing_right_edge.png";
+ }
+ color_class: "B019";
+ min: 1 480;
+ fixed: 1 1;
+ align: 1.0 0.5;
+ visible: 1;
+ }
+ }
+ part {
+ name: "bouncing,right,glow";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "right,clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bouncing,right,edge"; }
+ rel2 { relative: 0.0 1.0; to: "bouncing,right,edge"; }
+ image {
+ normal: "bouncing_right_glow.png";
+ }
+ color_class: "B018E";
+ min: 50 480;
+ fixed: 1 1;
+ align: 1.0 0.5;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ program {
+ signal: "opacity";
+ source: "layout";
+ action: STATE_SET "opacity" 0.0;
+ target: "opacity";
+ }
+ program {
+ signal: "transparent";
+ source: "layout";
+ action: STATE_SET "default" 0.0;
+ target: "opacity";
+ }
+ program {
+ signal: "show";
+ source: "checker";
+ action: STATE_SET "show" 0.0;
+ target: "left_checker";
+ target: "right_checker";
+ }
+ program {
+ signal: "hide";
+ source: "checker";
+ action: STATE_SET "default" 0.0;
+ target: "left_checker";
+ target: "right_checker";
+ }
+ program {
+ signal: "block";
+ source: "layout";
+ action: STATE_SET "enable" 0.0;
+ target: "blocker";
+ }
+ program {
+ signal: "unblock";
+ source: "layout";
+ action: STATE_SET "default" 0.0;
+ target: "blocker";
+ }
+ program {
+ signal: "show";
+ source: "left_index";
+ action: STATE_SET "default" 0.0;
+ target: "left_index,clip";
+ }
+ program {
+ signal: "hide";
+ source: "left_index";
+ action: STATE_SET "hide" 0.0;
+ target: "left_index,clip";
+ transition: LINEAR 0.2;
+ }
+ program {
+ signal: "show";
+ source: "right_index";
+ action: STATE_SET "default" 0.0;
+ target: "right_index,clip";
+ }
+ program {
+ signal: "hide";
+ source: "right_index";
+ action: STATE_SET "hide" 0.0;
+ target: "right_index,clip";
+ transition: LINEAR 0.2;
+ }
+ program {
+ signal: "show";
+ source: "edit";
+ action: STATE_SET "show" 0.0;
+ target: "edit";
+ }
+ program {
+ signal: "hide";
+ source: "edit";
+ action: STATE_SET "default" 0.0;
+ target: "edit";
+ }
+ program {
+ signal: "show";
+ source: "scroller";
+ action: STATE_SET "default" 0.0;
+ target: "scroller";
+ target: "left_index";
+ target: "right_index";
+ }
+ program {
+ signal: "hide";
+ source: "scroller";
+ action: STATE_SET "hide" 0.0;
+ target: "scroller";
+ target: "left_index";
+ target: "right_index";
+ }
+ program {
+ signal: "show";
+ source: "add_viewer";
+ action: STATE_SET "show" 0.0;
+ target: "add_viewer,clip";
+ target: "add_viewer";
+ target: "scroller,clip";
+ transition: LINEAR 0.1;
+ }
+ program {
+ signal: "hide";
+ source: "add_viewer";
+ action: STATE_SET "default" 0.0;
+ target: "add_viewer,clip";
+ target: "add_viewer";
+ target: "scroller,clip";
+ transition: LINEAR 0.1;
+ after: "hide,after";
+ }
+ program {
+ signal: "hide,instant";
+ source: "add_viewer";
+ action: STATE_SET "default" 0.0;
+ target: "add_viewer,clip";
+ target: "add_viewer";
+ target: "scroller,clip";
+ after: "hide,after";
+ }
+ program {
+ name: "hide,after";
+ source: "add_viewer";
+ action: SIGNAL_EMIT "add_viewer,hide" "add_viewer";
+ }
+ program {
+ name: "bottom,show";
+ signal: "bottom,show";
+ source: "layout";
+ action: STATE_SET "show" 0.0;
+ target: "bottom,clipper";
+ transition: LINEAR 0.2;
+ after: "bottom,hide";
+ }
+ program {
+ name: "bottom,hide";
+ signal: "bottom,hide";
+ source: "layout";
+ action: STATE_SET "default" 0.0;
+ target: "bottom,clipper";
+ }
+ program {
+ name: "left,show";
+ signal: "left,show";
+ source: "layout";
+ action: STATE_SET "show" 0.0;
+ target: "left,clipper";
+ transition: LINEAR 0.2;
+ after: "left,hide";
+ }
+ program {
+ name: "left,hide";
+ signal: "left,hide";
+ source: "layout";
+ action: STATE_SET "default" 0.0;
+ target: "left,clipper";
+ }
+ program {
+ name: "right,show";
+ signal: "right,show";
+ source: "layout";
+ action: STATE_SET "show" 0.0;
+ target: "right,clipper";
+ transition: LINEAR 0.2;
+ after: "right,hide";
+ }
+ program {
+ name: "right,hide";
+ signal: "right,hide";
+ source: "layout";
+ action: STATE_SET "default" 0.0;
+ target: "right,clipper";
+ }
+ }
+ } // group
+} // collections
+
+
+
+// End of file
diff --git a/home/res/edje/page.edc b/home/res/edje/page.edc
new file mode 100755
index 0000000..b259544
--- /dev/null
+++ b/home/res/edje/page.edc
@@ -0,0 +1,1148 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "conf.edc"
+
+#define DEL_IMAGE_MIN 54 54
+#define PLUS_IMAGE_MIN 90 90
+#define LINE_IMAGE_MIN (216+4) (288+4)
+#define TEXT_MIN 300 420
+
+
+
+styles {
+ style {
+ name: "max_text_style";
+ base: "font=TIZEN:style=Regular text_class=tizen style=shadow shadow_color=#0000004C font_size="25" color_class=AT0121 align=middle color=#FFFFFF ellipsis=1 wrap=mixed";
+ }
+}
+
+images {
+ image: "b_home_screen_widget_del_bg.png" COMP;
+ image: "b_home_screen_widget_del_line.png" COMP;
+ image: "b_home_screen_widget_del_icon.png" COMP;
+ image: "b_widget_favorite_bg.png" COMP;
+ image: "b_home_screen_widget_plus.png" COMP;
+ image: "b_home_screen_widget_plus_ef.png" COMP;
+ image: "b_home_screen_add_widget_line.#.png" COMP;
+ image: "b_home_screen_widget_line_ef.png" COMP;
+ image: "b_home_screen_edit_cover.png" COMP;
+ image: "b_home_screen_edit_cover_ef.png" COMP;
+}
+
+collections {
+group {
+ name: "page";
+ parts {
+ part {
+ name: "bg";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ part {
+ name: "inner";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ fixed: 1 1;
+ visible: 1;
+ }
+ }
+ }
+}
+group {
+ name: "page_inner";
+ parts {
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale : 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "item"; }
+ rel2 { relative: 1.0 1.0; to: "item"; }
+ color: 0 0 0 0;
+ fixed: 1 1;
+ visible: 1;
+ }
+ }
+ part {
+ name: "area";
+ type: SWALLOW;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ fixed: 1 1;
+ visible: 1;
+ }
+ }
+ part {
+ name: "normal";
+ type: RECT;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ perspective {
+ zplane: 0;
+ }
+ }
+ }
+ part {
+ name: "zoom";
+ type: RECT;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ perspective {
+ zplane: 120;
+ }
+ }
+ }
+ part {
+ name: "bg";
+ type: SWALLOW;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "item"; }
+ rel2 { relative: 1.0 1.0; to: "item"; }
+ fixed: 1 1;
+ visible: 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "gradient,bg";
+ type: IMAGE;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "item"; }
+ rel2 { relative: 1.0 1.0; to: "item"; }
+ color_class: "AO031";
+ image {
+ normal: "b_widget_favorite_bg.png";
+ }
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "item";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "area"; }
+ rel2 { relative: 0.5 0.5; to: "area"; }
+ fixed: 1 1;
+ align: 0.5 0.5;
+ visible: 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "cover_clipper";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "cover_ef"; }
+ rel2 { relative: 1.0 1.0; to: "cover_ef"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ description {
+ state: "select" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "cover_ef";
+ type: IMAGE;
+ clip_to: "cover_clipper";
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "item"; }
+ rel2 { relative: 0.5 0.5; to: "item"; }
+ image {
+ normal: "b_home_screen_edit_cover_ef.png";
+ }
+ color_class: "AO063";
+ /* This size is different from "item" */
+ min: ITEM_EDIT_EF_WIDTH ITEM_EDIT_EF_HEIGHT;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ visible: 0;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "select" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ description {
+ state: "disable" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "select" 0.0;
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default" 0.0;
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "cover";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "cover_clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "item"; }
+ rel2 { relative: 0.5 0.5; to: "item"; }
+ image {
+ normal: "b_home_screen_edit_cover.png";
+ }
+ color_class: "AO0482";
+ min: ITEM_EDIT_WIDTH ITEM_EDIT_HEIGHT;
+ fixed: 1 1;
+ visible: 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "deselect" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ description {
+ state: "select" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO0482";
+ }
+ description {
+ state: "disable" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO047";
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "select" 0.0;
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default" 0.0;
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "line_clipper";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "line_ef"; offset: -30 -30; }
+ rel2 { relative: 1.0 1.0; to: "line_ef"; offset: 30 30; }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "select" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "line,widget";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "cover"; }
+ rel2 { relative: 0.5 0.5; to: "cover"; }
+ image {
+ normal: "b_home_screen_add_widget_line.#.png";
+ }
+ /* this color class code is AO033 */
+ //color_class: "AO033";
+ color_class: "AO0481";
+ min: 222 294;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "line_ef";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "line_clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "cover_ef"; }
+ rel2 { relative: 1.0 1.0; to: "cover_ef"; }
+ image {
+ normal: "b_home_screen_widget_line_ef.png";
+ }
+ color_class: "AO063";
+ align: 0.5 0.5;
+ visible: 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "disable" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "default" 0.0;
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default" 0.0;
+ map {
+ on: 1;
+ }
+
+ }
+ }
+ part {
+ name: "line";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "line_clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "item"; }
+ rel2 { relative: 0.5 0.5; to: "item"; }
+ color_class: "AO043";
+ min: ITEM_EDIT_LINE_WIDTH ITEM_EDIT_LINE_HEIGHT;
+ align: 0.5 0.5;
+ visible: 1;
+ fixed: 1 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "disable" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "default" 0.0;
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default" 0.0;
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "item_event";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1.to: "item";
+ rel2.to: "item";
+ color: 0 0 0 0;
+ visible: 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "del_clipper";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "del_event_region"; }
+ rel2 { relative: 1.0 1.0; to: "del_event_region"; }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "del_image_region";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 1.0 0.0; to: "item"; offset: 0 -2; }
+ rel2 { relative: 1.0 0.0; to: "item"; offset: 0 -2; }
+ align: 0.5 0.5;
+ min: DEL_IMAGE_MIN;
+ fixed: 1 1;
+ }
+ }
+ /* This part blocks events */
+ part {
+ name: "del_event_region";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: -0.5 -0.5; to: "del_image_region"; }
+ rel2 { relative: 1.5 1.5; to: "del_image_region"; }
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "del_bg";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "del_clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "del_image_region"; }
+ rel2 { relative: 0.5 0.5; to: "del_image_region"; }
+ image {
+ normal: "b_home_screen_widget_del_bg.png";
+ }
+ color_class: "AO044L1";
+ align: 0.5 0.5;
+ min: DEL_IMAGE_MIN;
+ fixed: 1 1;
+ visible: 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "del_line";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "del_clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "del_image_region"; }
+ rel2 { relative: 0.5 0.5; to: "del_image_region"; }
+ image {
+ normal: "b_home_screen_widget_del_line.png";
+ }
+ color_class: "AO044L2";
+ align: 0.5 0.5;
+ min: DEL_IMAGE_MIN;
+ fixed: 1 1;
+ visible: 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "del_icon";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "del_clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "del_image_region"; }
+ rel2 { relative: 0.5 0.5; to: "del_image_region"; }
+ image {
+ normal: "b_home_screen_widget_del_icon.png";
+ }
+ color_class: "AO044L3";
+ align: 0.5 0.5;
+ min: DEL_IMAGE_MIN;
+ fixed: 1 1;
+ visible: 1;
+ map {
+ on: 0;
+ perspective: "normal";
+ }
+ }
+ description {
+ state: "zoom" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ perspective: "zoom";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default";
+ map {
+ on: 1;
+ }
+ }
+ }
+ part {
+ name: "remove_focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "del_event_region"; }
+ rel2 { relative: 1.0 1.0; to: "del_event_region"; }
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ rel1 { relative: 0.0 0.0; to: "del_event_region"; }
+ rel2 { relative: 1.0 1.0; to: "del_event_region"; }
+ visible: 1;
+ }
+ }
+ part {
+ name: "blocker";
+ type: RECT;
+ mouse_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "cover"; }
+ rel2 { relative: 1.0 1.0; to: "cover"; }
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ description {
+ state: "enable" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ program {
+ signal: "show";
+ source: "del";
+ action: STATE_SET "show" 0.0;
+ target: "del_clipper";
+ target: "del_event_region";
+ target: "remove_focus";
+ }
+ program {
+ signal: "hide";
+ source: "del";
+ action: STATE_SET "default" 0.0;
+ target: "del_clipper";
+ target: "del_event_region";
+ target: "remove_focus";
+ }
+ program {
+ signal: "mouse,clicked,1";
+ source: "focus";
+ action: SIGNAL_EMIT "clicked" "page";
+ }
+ program {
+ name: "enable,bg";
+ signal: "enable";
+ source: "gradient,bg";
+ action: STATE_SET "show" 0.0;
+ target: "gradient,bg";
+ }
+ program {
+ name: "disable,bg";
+ signal: "disable";
+ source: "gradient,bg";
+ action: STATE_SET "default" 0.0;
+ target: "gradient,bg";
+ }
+ program {
+ source: "blocker";
+ signal: "enable";
+ action: STATE_SET "enable" 0.0;
+ target: "blocker";
+ }
+ program {
+ source: "blocker";
+ signal: "disable";
+ action: STATE_SET "default" 0.0;
+ target: "blocker";
+ }
+ program {
+ signal: "deselect";
+ source: "cover_clipper";
+ action: STATE_SET "default" 0.0;
+ target: "cover_clipper";
+ target: "cover_ef";
+ }
+ program {
+ signal: "select";
+ source: "cover_clipper";
+ action: STATE_SET "select" 0.0;
+ target: "cover_clipper";
+ target: "cover_ef";
+ transition: LINEAR 0.5;
+ }
+ program {
+ signal: "deselect";
+ source: "cover";
+ action: STATE_SET "default" 0.0;
+ target: "cover";
+ transition: LINEAR 0.5;
+ }
+ program {
+ signal: "select";
+ source: "cover";
+ action: STATE_SET "select" 0.0;
+ target: "cover";
+ transition: LINEAR 0.5;
+ }
+ program {
+ signal: "disable";
+ source: "cover";
+ action: STATE_SET "disable" 0.0;
+ target: "cover";
+ target: "cover_ef";
+ target: "line_ef";
+ target: "line";
+ transition: LINEAR 0.5;
+ }
+ program {
+ signal: "deselect";
+ source: "line";
+ action: STATE_SET "default" 0.0;
+ target: "line_clipper";
+ transition: LINEAR 0.5;
+ }
+ program{
+ signal: "deselect,im";
+ source: "line";
+ action: STATE_SET "default" 0.0;
+ target: "line_clipper";
+ }
+ program {
+ signal: "hide";
+ source: "line,widget";
+ action: STATE_SET "default" 0.0;
+ target: "line,widget";
+ }
+ program {
+ signal: "show";
+ source: "line,widget";
+ action: STATE_SET "show" 0.0;
+ target: "line,widget";
+ }
+ program {
+ signal: "select";
+ source: "line";
+ action: STATE_SET "select" 0.0;
+ target: "line_clipper";
+ transition: LINEAR 0.5;
+ }
+ program {
+ signal: "on,zoom";
+ source: "inner";
+ action: STATE_SET "on" 0.0;
+ target: "item_event";
+ target: "bg";
+ target: "gradient,bg";
+ target: "item";
+ target: "del_bg";
+ target: "del_line";
+ target: "del_icon";
+ target: "cover_ef";
+ target: "cover";
+ target: "line_ef";
+ target: "line";
+ after: "show,zoom";
+ }
+ program {
+ name: "show,zoom";
+ action: STATE_SET "zoom" 0.0;
+ transition: SIN_FAC 0.2 0.90;
+ target: "item_event";
+ target: "bg";
+ target: "gradient,bg";
+ target: "item";
+ target: "del_bg";
+ target: "del_line";
+ target: "del_icon";
+ target: "cover_ef";
+ target: "cover";
+ target: "line_ef";
+ target: "line";
+ }
+ program {
+ signal: "reset,zoom";
+ source: "inner";
+ action: STATE_SET "on" 0.0;
+ transition: SIN_FAC 0.2 0.90;
+ target: "item_event";
+ target: "bg";
+ target: "gradient,bg";
+ target: "item";
+ target: "del_bg";
+ target: "del_line";
+ target: "del_icon";
+ target: "cover_ef";
+ target: "cover";
+ target: "line_ef";
+ target: "line";
+ after: "off,zoom";
+ }
+ program {
+ name: "off,zoom";
+ action: STATE_SET "defalut" 0.0;
+ target: "item_event";
+ target: "bg";
+ target: "gradient,bg";
+ target: "item";
+ target: "del_bg";
+ target: "del_line";
+ target: "del_icon";
+ after: "on,cover";
+ }
+ program {
+ name: "on,cover";
+ action: STATE_SET "select" 0.0;
+ target: "line_ef";
+ target: "cover_ef";
+ target: "cover_clipper";
+ target: "line_clipper";
+ }
+ }
+}
+group {
+ name: "plus_item";
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ /* This size is different from "item" */
+ min: ITEM_EDIT_WIDTH ITEM_EDIT_HEIGHT;
+ fixed: 1 1;
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "add,bg";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "bg"; }
+ rel2 { relative: 0.5 0.5; to: "bg"; }
+ min: LINE_IMAGE_MIN;
+ fixed: 1 1;
+ color_class: "AO0111";
+ visible: 1;
+ }
+ description {
+ state: "edit" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO0481";
+ }
+ }
+ part {
+ name: "plus_ef";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ rel1 { relative: 0.5 0.5; to: "add,bg"; }
+ rel2 { relative: 0.5 0.5; to: "add,bg"; }
+ image {
+ normal: "b_home_screen_widget_plus_ef.png";
+ }
+ color_class: "AO063";
+ min: PLUS_IMAGE_MIN;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ visible: 1;
+ }
+ description {
+ state: "press" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO0663";
+ }
+ description {
+ state: "edit" 0.0;
+ inherit: "default" 0.0;
+ }
+ description {
+ state: "edit,press" 0.0;
+ inherit: "press" 0.0;
+ }
+ description {
+ state: "max" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "plus";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "add,bg"; }
+ rel2 { relative: 0.5 0.5; to: "add,bg"; }
+ image {
+ normal: "b_home_screen_widget_plus.png";
+ }
+ color_class: "AO035";
+ min: PLUS_IMAGE_MIN;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ visible: 1;
+ }
+ description {
+ state: "press" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO035P";
+ }
+ description {
+ state: "edit" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO034";
+ }
+ description {
+ state: "edit,press" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO034P";
+ }
+ description {
+ state: "max" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "max_text";
+ type: TEXTBLOCK;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.1 0.05; to: "bg"; }
+ rel2 { relative: 0.9 0.95; to: "bg"; }
+ fixed: 1 0;
+ text {
+ style: "max_text_style";
+ }
+ visible: 0;
+ }
+ description {
+ state: "max" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "button,down";
+ signal: "mouse,down,1";
+ source: "bg";
+ action: SIGNAL_EMIT "down" "plus_item";
+ }
+ program {
+ source: "plus";
+ signal: "press";
+ action: STATE_SET "press" 0.0;
+ target: "plus";
+ target: "plus_ef";
+ }
+ program {
+ name: "button,up";
+ signal: "mouse,up,1";
+ source: "bg";
+ action: SIGNAL_EMIT "up" "plus_item";
+ }
+ program {
+ name: "button,click";
+ signal: "mouse,clicked,1";
+ source: "bg";
+ action: SIGNAL_EMIT "click" "plus_item";
+ }
+ program {
+ source: "plus";
+ signal: "release";
+ action: STATE_SET "default" 0.0;
+ target: "plus";
+ target: "plus_ef";
+ }
+ program {
+ source: "plus";
+ signal: "edit,press";
+ action: STATE_SET "edit,press" 0.0;
+ target: "plus";
+ target: "plus_ef";
+ }
+ program {
+ source: "plus";
+ signal: "edit,release";
+ action: STATE_SET "edit" 0.0;
+ target: "plus";
+ target: "plus_ef";
+ }
+ program {
+ name: "hide_plus";
+ signal: "max";
+ source: "plus_in_edit";
+ action: STATE_SET "max" 0.0;
+ target: "max_text";
+ target: "plus";
+ target: "plus_ef";
+ }
+ program {
+ name: "show_plus";
+ signal: "no_max";
+ source: "plus_in_edit";
+ action: STATE_SET "default" 0.0;
+ target: "max_text";
+ after: "show,edit";
+ }
+ program {
+ name: "show,widget";
+ signal: "show,widget";
+ source: "plus_item";
+ action: STATE_SET "default" 0.0;
+ target: "add,bg";
+ target: "plus";
+ }
+ program {
+ name: "show,edit";
+ signal: "show,edit";
+ source: "plus_item";
+ action: STATE_SET "edit" 0.0;
+ target: "add,bg";
+ target: "plus";
+ target: "plus_ef";
+ }
+ program {
+ name: "show,widget,ani";
+ signal: "show,widget,ani";
+ source: "plus_item";
+ action: STATE_SET "edit" 0.0;
+ target: "add,bg";
+ target: "plus";
+ after: "show,widget,ani,2";
+ }
+ program {
+ name: "show,widget,ani,2";
+ action: STATE_SET "default" 0.0;
+ target: "add,bg";
+ target: "plus";
+ transition: LINEAR 0.5;
+ }
+
+ }
+}//end group
+}//end collections
diff --git a/home/res/edje/page_clock.edc b/home/res/edje/page_clock.edc
new file mode 100755
index 0000000..a4a3a9c
--- /dev/null
+++ b/home/res/edje/page_clock.edc
@@ -0,0 +1,1802 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "conf.edc"
+
+#define HIDDEN_AREA_H 256
+#define HIDDEN_QUICKBUTTON_W (29+90+29)
+#define HIDDEN_QUICKBUTTON_H (90+7+33+33)
+#define HIDDEN_BUTTON_TRANSIT_TIME 0.35
+#define CLOCK_INDICATOR_W 65
+#define CLOCK_INDICATOR_H 65
+#define CLOCK_INDICATOR_ICON_W 60
+#define CLOCK_INDICATOR_ICON_H 60
+
+images {
+ image: "b_home_screen_clock_arrow_big.png" COMP;
+ image: "b_home_screen_clock_arrow_big_ef.png" COMP;
+ image: "Arrow_S_00015.png" COMP;
+ image: "Arrow_S_00016.png" COMP;
+ image: "Arrow_S_00017.png" COMP;
+ image: "Arrow_S_00018.png" COMP;
+ image: "Arrow_S_00019.png" COMP;
+ image: "Arrow_S_00020.png" COMP;
+ image: "Arrow_S_00021.png" COMP;
+ image: "Arrow_S_00022.png" COMP;
+ image: "Arrow_S_00023.png" COMP;
+ image: "Arrow_S_00024.png" COMP;
+ image: "Arrow_S_00025.png" COMP;
+ image: "Arrow_S_00026.png" COMP;
+ image: "Arrow_S_00027.png" COMP;
+ image: "Arrow_S_00028.png" COMP;
+ image: "Arrow_S_00029.png" COMP;
+ image: "Arrow_S_00030.png" COMP;
+ image: "Arrow_S_00031.png" COMP;
+ image: "Arrow_S_00032.png" COMP;
+ image: "Arrow_S_00033.png" COMP;
+ image: "B3_Data.png" COMP;
+ image: "do_not_ic_disturb.png" COMP;
+ image: "b_home_screen_block_btn_bg.png" COMP;
+ image: "b_home_screen_block_btn_line.png" COMP;
+ image: "b_home_screen_block_text_btn_bg.#.png" COMP;
+ image: "b_home_screen_block_text_btn_line.#.png" COMP;
+ image: "b_home_screen_block_btn_ic.png" COMP;
+ image: "b_home_screen_network_auto.png" COMP;
+ image: "b_home_screen_network_off.png" COMP;
+ image: "b_home_screen_network_on.png" COMP;
+}
+
+collections {
+
+ styles {
+ style {
+ name: "text,1,normal";
+ base: "font=Tizen text_class=AT041 font_size=32 align=center color=#FFFFFF color_class=AT044 wrap=mixed"; # ellipsis=1.0
+ }
+ style {
+ name: "text,1,pressed";
+ base: "font=Tizen text_class=AT041S font_size=32 align=center color=#FFFFFF color_class=AT044P wrap=mixed"; # ellipsis=1.0
+ }
+ style {
+ name: "name_style";
+ base: "font=TIZEN:style=Regular text_class=tizen font_size="28" align=center color=#FFFFFF color_class=AT043 ellipsis=1 wrap=mixed";
+ }
+ style {
+ name: "name_style_pressed";
+ base: "font=TIZEN:style=Regular text_class=tizen font_size="28" align=center color=#FFFFFF color_class=AT043P ellipsis=1 wrap=mixed";
+ }
+ }
+ group {
+ name: "clock_page";
+ parts {
+ part {
+ name: "clock_bg";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ visible: 1;
+ }
+ }
+ part {
+ name: "item";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "clock_bg";}
+ rel2 { relative: 0.5 0.5; to: "clock_bg";}
+ fixed: 1 1;
+ visible: 1;
+ align: 0.5 0.5;
+ }
+ }
+ part {
+ name: "hidden_region";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "clock_bg";}
+ rel2 { relative: 1.0 0.0; to: "clock_bg";}
+ min: 0 HIDDEN_AREA_H;
+ fixed: 1 1;
+ align: 0.0 1.0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ min: 0 HIDDEN_AREA_H;
+ max: -1 HIDDEN_AREA_H;
+ rel1 { relative: 0.0 0.0; to: "clock_bg";}
+ rel2 { relative: 1.0 0.0; to: "clock_bg";}
+ align: 0.0 0.0;
+ }
+ description {
+ state: "show.short" 0.0;
+ inherit: "default" 0.0;
+ min: 0 HIDDEN_AREA_H;
+ max: -1 HIDDEN_AREA_H;
+ rel1 { relative: 0.0 0.0; to: "clock_bg"; offset: 0 -99;}
+ rel2 { relative: 1.0 0.0; to: "clock_bg";}
+ align: 0.0 0.0;
+ }
+ }
+ part {
+ name: "bottom_cue";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 0;
+ ignore_flags: ON_HOLD;
+ description {
+ state: "default" 0.0;
+ min: 75 75;
+ max: 75 75;
+ rel1 { relative: 0.5 1.0; to: "clock_bg"; }
+ rel2 { relative: 0.5 1.0; to: "clock_bg"; }
+ fixed: 1 1;
+ visible: 1;
+ align: 0.5 1.0;
+ }
+ }
+ part {
+ name: "bottom_cue_button_bg";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ min: 106 53;
+ max: 106 53;
+ rel1 { relative: 0.5 1.0; to: "clock_bg"; offset: 0 -19;}
+ rel2 { relative: 0.5 1.0; to: "clock_bg"; offset: 0 -19;}
+ image {
+ normal: "b_home_screen_clock_arrow_big_ef.png";
+ }
+ color_class: "AO064";
+ fixed: 1 1;
+ visible: 0;
+ align: 0.5 1.0;
+ }
+ description {
+ state: "enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "bottom_cue_button";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ min: 106 53;
+ max: 106 53;
+ rel1 { relative: 0.5 1.0; to: "clock_bg"; offset: 0 -19;}
+ rel2 { relative: 0.5 1.0; to: "clock_bg"; offset: 0 -19;}
+ image {
+ normal: "b_home_screen_clock_arrow_big.png";
+ }
+ color_class: "AO014";
+ fixed: 1 1;
+ visible: 0;
+ align: 0.5 1.0;
+ }
+ description {
+ state: "enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "clock_bg"; }
+ rel2 { relative: 1.0 1.0; to: "clock_bg"; }
+ align: 0.0 0.0;
+ visible: 0;
+ }
+ description {
+ state: "enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "shortcut";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ ignore_flags: ON_HOLD;
+ description {
+ state: "default" 0.0;
+ min: CLOCK_SHORTCUT_AREA_W CLOCK_SHORTCUT_AREA_W;
+ max: CLOCK_SHORTCUT_AREA_W CLOCK_SHORTCUT_AREA_W;
+ rel1 { relative: 1.0 0.0; to: "clock_bg"; }
+ rel2 { relative: 1.0 0.0; to: "clock_bg"; }
+ fixed: 1 1;
+ visible: 1;
+ align: 1.0 0.0;
+ }
+ }
+ part {
+ name: "indicator.1";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ ignore_flags: ON_HOLD;
+ description {
+ state: "default" 0.0;
+ min: CLOCK_INDICATOR_W CLOCK_INDICATOR_H;
+ max: CLOCK_INDICATOR_W CLOCK_INDICATOR_H;
+ rel1 { relative: 0.0 0.0; to: "clock_bg"; }
+ rel2 { relative: 0.0 0.0; to: "clock_bg"; }
+ fixed: 1 1;
+ visible: 1;
+ align: 0.0 0.0;
+ }
+ }
+ part {
+ name: "indicator.2";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ ignore_flags: ON_HOLD;
+ description {
+ state: "default" 0.0;
+ min: CLOCK_INDICATOR_W CLOCK_INDICATOR_H;
+ max: CLOCK_INDICATOR_W CLOCK_INDICATOR_H;
+ rel1 { relative: 1.0 0.0; to_x: "indicator.1"; to_y: "clock_bg"; }
+ rel2 { relative: 1.0 0.0; to_x: "indicator.1"; to_y: "clock_bg"; }
+ fixed: 1 1;
+ visible: 1;
+ align: 0.0 0.0;
+ }
+ }
+ part {
+ name: "hidden_item";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ ignore_flags: ON_HOLD;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "hidden_region"; }
+ rel2 { relative: 1.0 1.0; to: "hidden_region"; }
+ fixed: 1 1;
+ visible: 1;
+ align: 0.0 0.0;
+ }
+ }
+ part {
+ name: "focus.bottom.cue";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bottom_cue_button"; }
+ rel2 { relative: 1.0 1.0; to: "bottom_cue_button"; }
+ align: 0.0 0.0;
+ visible: 0;
+ }
+ description {
+ state: "enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "event_blocker";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "clock_bg"; }
+ rel2 { relative: 0.5 0.5; to: "clock_bg"; }
+ fixed: 1 1;
+ visible: 1;
+ align: 0.5 0.5;
+ }
+ }
+
+ programs {
+ program {
+ signal: "hidden.show";
+ source: "clock_bg";
+ action: STATE_SET "show" 0.0;
+ target: "hidden_region";
+ transition: SIN_FAC HIDDEN_BUTTON_TRANSIT_TIME 1.7;
+ after: "hidden.show,after";
+ }
+ program {
+ signal: "hidden.show.short";
+ source: "clock_bg";
+ action: STATE_SET "show.short" 0.0;
+ target: "hidden_region";
+ transition: SIN_FAC HIDDEN_BUTTON_TRANSIT_TIME 1.7;
+ after: "hidden.show,after";
+ }
+ program {
+ name: "hidden.show,after";
+ source: "clock_bg";
+ action: SIGNAL_EMIT "drawer,displayed" "clock_bg";
+ }
+ program {
+ signal: "hidden.hide";
+ source: "clock_bg";
+ action: STATE_SET "default" 0.0;
+ target: "hidden_region";
+ transition: DECELERATE 0.2;
+ transition: SIN_FAC HIDDEN_BUTTON_TRANSIT_TIME 1.7;
+ after: "hidden.hide,after";
+ }
+ program {
+ name: "hidden.hide,after";
+ source: "clock_bg";
+ action: SIGNAL_EMIT "drawer,hided" "clock_bg";
+ }
+ program {
+ signal: "screenreader,on";
+ source: "clock_bg";
+ action: STATE_SET "enabled" 0.0;
+ target: "focus";
+ }
+ program {
+ signal: "screenreader,off";
+ source: "clock_bg";
+ action: STATE_SET "default" 0.0;
+ target: "focus";
+ }
+ program {
+ signal: "screenreader,apps,on";
+ source: "clock_bg";
+ action: STATE_SET "enabled" 0.0;
+ target: "focus.bottom.cue";
+ target: "bottom_cue_button";
+ }
+ program {
+ signal: "screenreader,apps,off";
+ source: "clock_bg";
+ action: STATE_SET "default" 0.0;
+ target: "focus.bottom.cue";
+ target: "bottom_cue_button";
+ }
+ }
+ }
+ } // end of group
+
+ group {
+ name: "blockingmode";
+ 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_class: "AO053";
+ fixed: 1 1;
+ visible: 1;
+ }
+ }
+ part {
+ name: "pad.top";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 53;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 0.0; to: "bg"; }
+ align: 0.0 0.0;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "line.1";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to: "pad.top"; }
+ rel2 { relative: 1.0 1.0; to: "pad.top"; }
+ min: 0 1;
+ max: -1 1;
+ fixed: 1 1;
+ align: 0.0 1.0;
+ color_class: "AO057";
+ }
+ }
+ part {
+ name: "area.content";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to_x: "bg"; to_y: "pad.top"; }
+ rel2 { relative: 1.0 1.0; to_x: "bg"; to_y: "bg"; }
+ align: 0.0 0.0;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "area.button.1";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 99;
+ max: -1 99;
+ rel1 { relative: 0.0 0.0; to_x:"area.content"; to_y:"area.content";}
+ rel2 { relative: 1.0 0.0; to_x:"area.content"; to_y:"area.content";}
+ align: 0.0 0.0;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "line.2";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to: "area.button.1"; }
+ rel2 { relative: 1.0 1.0; to: "area.button.1"; }
+ min: 0 1;
+ max: -1 1;
+ fixed: 1 1;
+ align: 0.0 1.0;
+ color_class: "AO057";
+ }
+ }
+ part {
+ name: "line.3";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ min: 0 2;
+ max: -1 2;
+ fixed: 1 1;
+ align: 0.0 1.0;
+ color_class: "AO0531";
+ }
+ }
+ part {
+ name: "area.button.2";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 100;
+ max: -1 100;
+ rel1 { relative: 0.0 1.0; to_x:"area.content"; to_y: "line.2";}
+ rel2 { relative: 1.0 1.0; to_x:"area.content"; to_y: "line.2";}
+ align: 0.0 0.0;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "button.1";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "area.button.1";}
+ rel2 { relative: 1.0 1.0; to: "area.button.1";}
+ fixed: 1 1;
+ visible: 1;
+ align: 0.0 0.0;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "button.2";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "area.button.2";}
+ rel2 { relative: 1.0 1.0; to: "area.button.2";}
+ fixed: 1 1;
+ visible: 1;
+ align: 0.0 0.0;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ }
+ programs {
+ program {
+ signal: "button.1.show";
+ source: "prog";
+ script {
+ set_state(PART:"button.1", "default", 0.0);
+ }
+ }
+ program {
+ signal: "button.1.hide";
+ source: "prog";
+ script {
+ set_state(PART:"button.1", "hide", 0.0);
+ }
+ }
+ program {
+ signal: "button.2.hide";
+ source: "prog";
+ script {
+ set_state(PART:"button.2", "hide", 0.0);
+ }
+ }
+ }
+ } // end of group
+ group {
+ styles {
+ style {
+ name: "dnd,title,normal";
+ base: "font=Tizen text_class=AT044 font_size=32 align=center color=#FFFFFF color_class=AT056 wrap=mixed"; # ellipsis=1.0
+ }
+ style {
+ name: "dnd,title,pressed";
+ base: "font=Tizen text_class=AT044 font_size=32 align=center color=#FFFFFF color_class=AT056P wrap=mixed"; # ellipsis=1.0
+ }
+ style {
+ name: "dnd,title,enabled";
+ base: "font=Tizen text_class=AT044 font_size=32 align=center color=#FFFFFF color_class=AT055 wrap=mixed"; # ellipsis=1.0
+ }
+ style {
+ name: "dnd,title,enabled,pressed";
+ base: "font=Tizen text_class=AT044 font_size=32 align=center color=#FFFFFF color_class=AT055P wrap=mixed"; # ellipsis=1.0
+ }
+ }
+ name: "hidden_item_blocking_mode";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ min: 0 100;
+ max: -1 100;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "pad.top";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 16;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 0.0; to: "bg"; }
+ align: 0.0 0.0;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "pad.left";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 14 0;
+ fixed: 1 1;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 0.0 1.0; to: "bg"; }
+ align: 0.0 0.0;
+ }
+ }
+ part {
+ name: "pad.right";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 14 0;
+ fixed: 1 1;
+ rel1 { relative: 1.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ align: 1.0 0.0;
+ }
+ }
+ part {
+ name: "area.icon";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 332 69;
+ max: 332 69;
+ fixed: 1 1;
+ rel1 { relative: 1.0 1.0; to_x:"pad.left"; to_y: "pad.top";}
+ rel2 { relative: 0.0 1.0; to_x:"pad.right"; to_y: "pad.top";}
+ align: 0.0 0.0;
+ }
+ }
+ part {
+ name: "icon.bg";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { to: "area.icon"; }
+ rel2 { to: "area.icon"; }
+ image {
+ normal: "b_home_screen_block_text_btn_bg.#.png";
+ }
+ color_class: "AO084L1";
+ fixed: 1 1;
+ visible: 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO084L1P";
+ }
+ description {
+ state: "enabled" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO083L1";
+ }
+ description {
+ state: "enabled_pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO083L1P";
+ }
+ }
+ part {
+ name: "icon";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { to: "area.icon"; }
+ rel2 { to: "area.icon"; }
+ image {
+ normal: "b_home_screen_block_text_btn_line.#.png";
+ }
+ color_class: "AO084L2";
+ fixed: 1 1;
+ visible: 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO084L2P";
+ }
+ description {
+ state: "enabled" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO083L2";
+ }
+ description {
+ state: "enabled_pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO083L2P";
+ }
+ }
+ part {
+ name: "name";
+ type: TEXTBLOCK;
+ scale: 1;
+ multiline: 1;
+ description {
+ state: "default" 0.0;
+ min: 300 38;
+ max: 300 38;
+ fixed: 1 1;
+ rel1 { relative: 0.5 0.5; to:"icon";}
+ rel2 { relative: 0.5 0.5; to:"icon";}
+ text {
+ style: "dnd,title,normal";
+ align: 0.5 0.5;
+ }
+ visible: 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ text { style: "dnd,title,pressed"; }
+ visible: 1;
+ }
+ description {
+ state: "enabled" 0.0;
+ inherit: "default" 0.0;
+ text { style: "dnd,title,enabled"; }
+ visible: 1;
+ }
+ description {
+ state: "enabled_pressed" 0.0;
+ inherit: "default" 0.0;
+ text { style: "dnd,title,enabled,pressed"; }
+ visible: 1;
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ script {
+ public g_icon_enabled;
+ public g_is_graytone;
+ }
+ program {
+ signal: "gray,enable";
+ source: "prog";
+ script {
+ set_int(g_is_graytone, 1);
+ }
+ }
+ program {
+ signal: "gray,disable";
+ source: "prog";
+ script {
+ set_int(g_is_graytone, 0);
+ }
+ }
+ program {
+ signal: "icon,enable";
+ source: "prog";
+ script {
+ set_int(g_icon_enabled, 1);
+ set_state(PART:"icon.bg", "enabled", 0.0);
+ set_state(PART:"icon", "enabled", 0.0);
+ set_state(PART:"name", "enabled", 0.0);
+ }
+ }
+ program {
+ signal: "icon,disable";
+ source: "prog";
+ script {
+ set_int(g_icon_enabled, 0);
+ set_state(PART:"icon.bg", "default", 0.0);
+ set_state(PART:"icon", "default", 0.0);
+ set_state(PART:"name", "default", 0.0);
+ }
+ }
+ program {
+ signal: "mouse,down,1";
+ source: "focus";
+ script {
+ if (get_int(g_icon_enabled) == 1) {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon.bg", "enabled_pressed", 0.0);
+ set_state(PART:"icon", "enabled_pressed", 0.0);
+ set_state(PART:"name", "enabled_pressed", 0.0);
+ } else {
+ set_state(PART:"icon.bg", "enabled_pressed", 0.0);
+ set_state(PART:"icon", "enabled_pressed", 0.0);
+ set_state(PART:"name", "enabled_pressed", 0.0);
+ }
+ } else {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon.bg", "pressed", 0.0);
+ set_state(PART:"icon", "pressed", 0.0);
+ set_state(PART:"name", "pressed", 0.0);
+ } else {
+ set_state(PART:"icon.bg", "pressed", 0.0);
+ set_state(PART:"icon", "pressed", 0.0);
+ set_state(PART:"name", "pressed", 0.0);
+ }
+ }
+ }
+ }
+ program {
+ signal: "mouse,up,1";
+ source: "focus";
+ script {
+ if (get_int(g_is_graytone) == 1) {
+ if (get_int(g_icon_enabled) == 1) {
+ set_state(PART:"icon.bg", "enabled", 0.0);
+ set_state(PART:"icon", "enabled", 0.0);
+ set_state(PART:"name", "enabled", 0.0);
+ } else {
+ set_state(PART:"icon.bg", "default", 0.0);
+ set_state(PART:"icon", "default", 0.0);
+ set_state(PART:"name", "default", 0.0);
+ }
+ } else {
+ if (get_int(g_icon_enabled) == 1) {
+ set_state(PART:"icon.bg", "enabled", 0.0);
+ set_state(PART:"icon", "enabled", 0.0);
+ set_state(PART:"name", "enabled", 0.0);
+ } else {
+ set_state(PART:"icon.bg", "default", 0.0);
+ set_state(PART:"icon", "default", 0.0);
+ set_state(PART:"name", "default", 0.0);
+ }
+ }
+ }
+ }
+ program {
+ signal: "mouse,out";
+ source: "focus";
+ script {
+ if (get_int(g_is_graytone) == 1) {
+ if (get_int(g_icon_enabled) == 1) {
+ set_state(PART:"icon.bg", "enabled", 0.0);
+ set_state(PART:"icon", "enabled", 0.0);
+ set_state(PART:"name", "enabled", 0.0);
+ } else {
+ set_state(PART:"icon.bg", "default", 0.0);
+ set_state(PART:"icon", "default", 0.0);
+ set_state(PART:"name", "default", 0.0);
+ }
+ } else {
+ if (get_int(g_icon_enabled) == 1) {
+ set_state(PART:"icon.bg", "enabled", 0.0);
+ set_state(PART:"icon", "enabled", 0.0);
+ set_state(PART:"name", "enabled", 0.0);
+ } else {
+ set_state(PART:"icon.bg", "default", 0.0);
+ set_state(PART:"icon", "default", 0.0);
+ set_state(PART:"name", "default", 0.0);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ group {
+ name: "bottom_cue";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name: "cue_clip";
+ type: RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "bg"; }
+ rel2 { relative: 1.0 1.0; to, "bg"; }
+ align: 0.0 0.0;
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "cue";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ clip_to: "cue_clip";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "bg"; }
+ rel2 { relative: 1.0 1.0; to, "bg"; }
+ image {
+ normal: "Arrow_S_00033.png";
+ }
+ fixed: 1 1;
+ visible: 0;
+ }
+ description {
+ state: "idle" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ description {
+ state: "work" 0.0;
+ inherit: "default" 0.0;
+ image {
+ normal: "Arrow_S_00033.png";
+ tween: "Arrow_S_00015.png";
+ tween: "Arrow_S_00016.png";
+ tween: "Arrow_S_00017.png";
+ tween: "Arrow_S_00018.png";
+ tween: "Arrow_S_00019.png";
+ tween: "Arrow_S_00020.png";
+ tween: "Arrow_S_00021.png";
+ tween: "Arrow_S_00022.png";
+ tween: "Arrow_S_00023.png";
+ tween: "Arrow_S_00024.png";
+ tween: "Arrow_S_00025.png";
+ tween: "Arrow_S_00026.png";
+ tween: "Arrow_S_00027.png";
+ tween: "Arrow_S_00028.png";
+ tween: "Arrow_S_00029.png";
+ tween: "Arrow_S_00030.png";
+ tween: "Arrow_S_00031.png";
+ tween: "Arrow_S_00032.png";
+ tween: "Arrow_S_00033.png";
+ }
+ visible: 1;
+ }
+ }
+ }
+
+ programs {
+ script {
+ public g_is_enabled;
+ public g_anim_count;
+ }
+ program{
+ name: "cue,enable";
+ in: 1.0 0.0;
+ signal: "cue,enable";
+ source: "prog";
+ script {
+ if (get_int(g_is_enabled) == 0) {
+ set_int(g_is_enabled, 1);
+ set_int(g_anim_count, 0);
+
+ stop_programs_on(PART:"cue");
+
+ run_program(PROGRAM:"anim,cue,fadeout");
+ run_program(PROGRAM:"anim,cue,image");
+ } else {
+ set_int(g_anim_count, 0);
+ }
+ }
+ }
+ program{
+ name: "cue,disable";
+ signal: "cue,disable";
+ source: "prog";
+ script {
+ set_int(g_is_enabled, 0);
+ set_int(g_anim_count, 0);
+
+ stop_programs_on(PART:"cue");
+
+ run_program(PROGRAM:"anim,cue,fadein");
+ }
+ }
+ program {
+ name: "anim,cue,fadeout";
+ signal: "anim,cue,fadeout";
+ action: STATE_SET "show" 0.0;
+ target: "cue_clip";
+ }
+ program {
+ name: "anim,cue,fadein";
+ signal: "anim,cue,fadein";
+ action: STATE_SET "default" 0.0;
+ target: "cue_clip";
+ }
+ program {
+ name: "anim,cue,image";
+ action: STATE_SET "work" 0.0;
+ target: "cue";
+ transition: DECELERATE 1.3;
+ after: "anim,cue,image,idle";
+ }
+ program {
+ name: "anim,cue,image,idle";
+ action: STATE_SET "idle" 0.0;
+ target: "cue";
+ after: "anim,cue,image,restart";
+ }
+ program {
+ name: "anim,cue,image,restart";
+ in: 0.5 0.0;
+ script {
+ set_int(g_anim_count, get_int(g_anim_count) + 1);
+
+ if (get_int(g_is_enabled) == 1) {
+ run_program(PROGRAM:"anim,cue,image");
+ }
+ if (get_int(g_anim_count) >= 1) {
+ run_program(PROGRAM:"cue,disable");
+ }
+ }
+ }
+ }
+ } // end of group
+ group {
+ name: "modem_off_icon";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ part {
+ name: "icon";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "bg"; }
+ rel2 { relative: 0.5 0.5; to: "bg"; }
+ image {
+ normal: "B3_Data.png";
+ }
+ //color_class: "AO013L2";
+ color: 255 255 255 255;
+ min: CLOCK_INDICATOR_ICON_W CLOCK_INDICATOR_ICON_H;
+ max: CLOCK_INDICATOR_ICON_W CLOCK_INDICATOR_ICON_H;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ visible: 1;
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ align: 0.0 0.0;
+ visible: 1;
+ }
+ }
+ }
+ }
+ group {
+ name: "dnd_icon";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ part {
+ name: "icon";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "bg"; }
+ rel2 { relative: 0.5 0.5; to: "bg"; }
+ image {
+ normal: "do_not_ic_disturb.png";
+ }
+ min: CLOCK_INDICATOR_W CLOCK_INDICATOR_H;
+ max: CLOCK_INDICATOR_W CLOCK_INDICATOR_H;
+ align: 0.5 0.5;
+ fixed: 1 1;
+ visible: 1;
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ align: 0.0 0.0;
+ visible: 1;
+ }
+ }
+ }
+ }
+ group {
+ name: "item_1";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ min: HIDDEN_QUICKBUTTON_W HIDDEN_QUICKBUTTON_H;
+ max: HIDDEN_QUICKBUTTON_W HIDDEN_QUICKBUTTON_H;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name : "color_clip_icon";
+ type : RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ fixed: 1 1;
+ rel1 {
+ to: "icon";
+ }
+ rel2 {
+ to: "icon";
+ }
+ align: 0.5 0.5;
+ color_class: "AO056L4";
+ }
+ description {
+ state: "off" 0.0;
+ inherit: "default" 0.0;
+ }
+ description {
+ state: "off_p" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L4P";
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L3";
+ }
+ description {
+ state: "on_p" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L3P";
+ }
+ description {
+ state: "e_off" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L4";
+ }
+ description {
+ state: "e_off_p" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L4P";
+ }
+ description {
+ state: "e_on" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L5";
+ }
+ description {
+ state: "e_on_p" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L5P";
+ }
+ }
+ part {
+ name: "icon_bg_1";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.0; to: "bg"; }
+ rel2 { relative: 0.5 0.0; to: "bg"; }
+ image {
+ normal: "b_home_screen_block_btn_bg.png";
+ }
+ min: 90 90;
+ align: 0.5 0.0;
+ fixed: 1 1;
+ visible: 1;
+ color_class: "AO056L1";
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L1P";
+ }
+ }
+ part {
+ name: "icon_bg_2";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.0; to: "bg"; }
+ rel2 { relative: 0.5 0.0; to: "bg"; }
+ image {
+ normal: "b_home_screen_block_btn_line.png";
+ }
+ min: 90 90;
+ align: 0.5 0.0;
+ fixed: 1 1;
+ visible: 1;
+ color_class: "AO056L2";
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L1P";
+ }
+ }
+ part {
+ name: "icon";
+ type: IMAGE;
+ scale: 1;
+ clip_to: "color_clip_icon";
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.0; to: "bg"; }
+ rel2 { relative: 0.5 0.0; to: "bg"; }
+ image {
+ normal: "b_home_screen_block_btn_ic.png";
+ }
+ min: 90 90;
+ align: 0.5 0.0;
+ fixed: 1 1;
+ visible: 1;
+ }
+ }
+ part {
+ name: "name";
+ type: TEXTBLOCK;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ min: HIDDEN_QUICKBUTTON_W 70;
+ max: HIDDEN_QUICKBUTTON_W 70;
+ rel1 { relative: 0.0 1.0; to_x: "bg"; to_y: "icon"; offset: 0 7; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ text {
+ style: "name_style";
+ align: 0.5 0.5;
+ }
+ visible: 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ text {
+ style: "name_style_pressed";
+ align: 0.5 0.5;
+ }
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ script {
+ public g_icon_enabled;
+ public g_is_graytone;
+ }
+ program {
+ signal: "gray,enable";
+ source: "prog";
+ script {
+ set_int(g_is_graytone, 1);
+ if (get_int(g_icon_enabled) == 1) {
+ set_state(PART:"color_clip_icon", "e_on", 0.0);
+ } else {
+ set_state(PART:"color_clip_icon", "e_off", 0.0);
+ }
+ }
+ }
+ program {
+ signal: "gray,disable";
+ source: "prog";
+ script {
+ set_int(g_is_graytone, 0);
+ if (get_int(g_icon_enabled) == 1) {
+ set_state(PART:"color_clip_icon", "on", 0.0);
+ } else {
+ set_state(PART:"color_clip_icon", "off", 0.0);
+ }
+ }
+ }
+ program {
+ signal: "icon,enable";
+ source: "prog";
+ script {
+ set_int(g_icon_enabled, 1);
+ set_state(PART:"color_clip_icon", "on", 0.0);
+ }
+ }
+ program {
+ signal: "icon,disable";
+ source: "prog";
+ script {
+ set_int(g_icon_enabled, 0);
+ set_state(PART:"color_clip_icon", "off", 0.0);
+ }
+ }
+ program {
+ signal: "mouse,down,1";
+ source: "focus";
+ script {
+ set_state(PART:"name", "pressed", 0.0);
+ set_state(PART:"icon_bg_1", "pressed", 0.0);
+ set_state(PART:"icon_bg_2", "pressed", 0.0);
+ if (get_int(g_icon_enabled) == 1) {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_on_p", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "on_p", 0.0);
+ }
+ } else {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_off_p", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "off_p", 0.0);
+ }
+ }
+ }
+ }
+ program {
+ signal: "mouse,up,1";
+ source: "focus";
+ script {
+ set_state(PART:"name", "default", 0.0);
+ set_state(PART:"icon_bg_1", "default", 0.0);
+ set_state(PART:"icon_bg_2", "default", 0.0);
+ if (get_int(g_icon_enabled) == 1) {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_on", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "on", 0.0);
+ }
+ } else {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_off", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "off", 0.0);
+ }
+ }
+ }
+ }
+ program {
+ signal: "mouse,out";
+ source: "focus";
+ script {
+ set_state(PART:"name", "default", 0.0);
+ set_state(PART:"icon_bg_1", "default", 0.0);
+ set_state(PART:"icon_bg_2", "default", 0.0);
+ if (get_int(g_icon_enabled) == 1) {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_on", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "on", 0.0);
+ }
+ } else {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_off", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "off", 0.0);
+ }
+ }
+ }
+ }
+ }
+ }
+ group {
+ name: "item_2";
+ parts {
+ part {
+ name: "bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ min: HIDDEN_QUICKBUTTON_W HIDDEN_QUICKBUTTON_H;
+ max: HIDDEN_QUICKBUTTON_W HIDDEN_QUICKBUTTON_H;
+ fixed: 1 1;
+ }
+ }
+ part {
+ name : "color_clip_icon";
+ type : RECT;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ fixed: 1 1;
+ rel1 {
+ to: "icon";
+ }
+ rel2 {
+ to: "icon";
+ }
+ align: 0.5 0.5;
+ color_class: "AO056L4";
+ }
+ description {
+ state: "off" 0.0;
+ inherit: "default" 0.0;
+ }
+ description {
+ state: "off_p" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L4P";
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L3";
+ }
+ description {
+ state: "on_p" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L3P";
+ }
+ description {
+ state: "e_off" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L4";
+ }
+ description {
+ state: "e_off_p" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L4P";
+ }
+ description {
+ state: "e_on" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L5";
+ }
+ description {
+ state: "e_on_p" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L5P";
+ }
+ }
+ part {
+ name: "icon_bg_1";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.0; to: "bg"; }
+ rel2 { relative: 0.5 0.0; to: "bg"; }
+ image {
+ normal: "b_home_screen_block_btn_bg.png";
+ }
+ min: 90 90;
+ align: 0.5 0.0;
+ fixed: 1 1;
+ visible: 1;
+ color_class: "AO056L1";
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L1P";
+ }
+ }
+ part {
+ name: "icon_bg_2";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.0; to: "bg"; }
+ rel2 { relative: 0.5 0.0; to: "bg"; }
+ image {
+ normal: "b_home_screen_block_btn_line.png";
+ }
+ min: 90 90;
+ align: 0.5 0.0;
+ fixed: 1 1;
+ visible: 1;
+ color_class: "AO056L2";
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO056L1P";
+ }
+ }
+ part {
+ name: "icon";
+ type: IMAGE;
+ scale: 1;
+ clip_to: "color_clip_icon";
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.0; to: "bg"; }
+ rel2 { relative: 0.5 0.0; to: "bg"; }
+ image {
+ normal: "b_home_screen_network_off.png";
+ }
+ min: 90 90;
+ align: 0.5 0.0;
+ fixed: 1 1;
+ visible: 1;
+ }
+ description {
+ state: "off" 0.0;
+ inherit: "default" 0.0;
+ image {
+ normal: "b_home_screen_network_off.png";
+ }
+ }
+ description {
+ state: "on" 0.0;
+ inherit: "default" 0.0;
+ image {
+ normal: "b_home_screen_network_on.png";
+ }
+ }
+ description {
+ state: "auto" 0.0;
+ inherit: "default" 0.0;
+ image {
+ normal: "b_home_screen_network_auto.png";
+ }
+ }
+ }
+ part {
+ name: "name";
+ type: TEXTBLOCK;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ min: HIDDEN_QUICKBUTTON_W 70;
+ max: HIDDEN_QUICKBUTTON_W 70;
+ rel1 { relative: 0.0 1.0; to_x: "bg"; to_y: "icon"; offset: 0 7; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ text {
+ style: "name_style";
+ align: 0.5 0.5;
+ }
+ visible: 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ text {
+ style: "name_style_pressed";
+ align: 0.5 0.5;
+ }
+ }
+ }
+ part {
+ name: "focus";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg"; }
+ rel2 { relative: 1.0 1.0; to: "bg"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ script {
+ public g_icon_enabled;
+ public g_is_graytone;
+ }
+ program {
+ signal: "gray,enable";
+ source: "prog";
+ script {
+ set_int(g_is_graytone, 1);
+ if (get_int(g_icon_enabled) == 1) {
+ set_state(PART:"color_clip_icon", "e_on", 0.0);
+ } else {
+ set_state(PART:"color_clip_icon", "e_off", 0.0);
+ }
+ }
+ }
+ program {
+ signal: "gray,disable";
+ source: "prog";
+ script {
+ set_int(g_is_graytone, 0);
+ if (get_int(g_icon_enabled) == 1) {
+ set_state(PART:"color_clip_icon", "on", 0.0);
+ } else {
+ set_state(PART:"color_clip_icon", "off", 0.0);
+ }
+ }
+ }
+ program {
+ signal: "icon,enable";
+ source: "prog";
+ script {
+ set_int(g_icon_enabled, 1);
+ set_state(PART:"color_clip_icon", "on", 0.0);
+ }
+ }
+ program {
+ signal: "icon,disable";
+ source: "prog";
+ script {
+ set_int(g_icon_enabled, 0);
+ set_state(PART:"color_clip_icon", "off", 0.0);
+ }
+ }
+ program {
+ signal: "icon,set,off";
+ source: "prog";
+ script {
+ set_state(PART:"icon", "off", 0.0);
+ }
+ }
+ program {
+ signal: "icon,set,on";
+ source: "prog";
+ script {
+ set_state(PART:"icon", "on", 0.0);
+ }
+ }
+ program {
+ signal: "icon,set,auto";
+ source: "prog";
+ script {
+ set_state(PART:"icon", "auto", 0.0);
+ }
+ }
+ program {
+ signal: "mouse,down,1";
+ source: "focus";
+ script {
+ set_state(PART:"name", "pressed", 0.0);
+ set_state(PART:"icon_bg_1", "pressed", 0.0);
+ set_state(PART:"icon_bg_2", "pressed", 0.0);
+ if (get_int(g_icon_enabled) == 1) {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_on_p", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "on_p", 0.0);
+ }
+ } else {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_off_p", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "off_p", 0.0);
+ }
+ }
+ }
+ }
+ program {
+ signal: "mouse,up,1";
+ source: "focus";
+ script {
+ set_state(PART:"name", "default", 0.0);
+ set_state(PART:"icon_bg_1", "default", 0.0);
+ set_state(PART:"icon_bg_2", "default", 0.0);
+ if (get_int(g_icon_enabled) == 1) {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_on", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "on", 0.0);
+ }
+ } else {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_off", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "off", 0.0);
+ }
+ }
+ }
+ }
+ program {
+ signal: "mouse,out";
+ source: "focus";
+ script {
+ set_state(PART:"name", "default", 0.0);
+ set_state(PART:"icon_bg_1", "default", 0.0);
+ set_state(PART:"icon_bg_2", "default", 0.0);
+ if (get_int(g_icon_enabled) == 1) {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_on", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "on", 0.0);
+ }
+ } else {
+ if (get_int(g_is_graytone) == 1) {
+ set_state(PART:"icon_bg_2", "e_off", 0.0);
+ } else {
+ set_state(PART:"icon_bg_2", "off", 0.0);
+ }
+ }
+ }
+ }
+ }
+ }
+} // end of collection
diff --git a/home/res/edje/popup.edc b/home/res/edje/popup.edc
new file mode 100644
index 0000000..a679d43
--- /dev/null
+++ b/home/res/edje/popup.edc
@@ -0,0 +1,123 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "conf.edc"
+
+
+
+collections {
+ group {
+ name: "popup_checkview_internal";
+ parts {
+ part {
+ name: "label";
+ scale: 1;
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ fixed: 1 0;
+ rel2 {
+ relative: 1.0 0.0;
+ to_y: "end_field";
+ }
+ }
+ }
+ part {
+ name: "bottom_pad";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ min: 0 4;
+ fixed: 0 1;
+ rel1.relative: 0.0 1.0;
+ }
+ }
+ part {
+ name: "pad_b";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ min: 0 82;
+ fixed: 0 1;
+ rel1 {
+ relative: 0.0 0.0;
+ to: "bottom_pad";
+ }
+ rel2 {
+ relative: 1.0 0.0;
+ to: "bottom_pad";
+ }
+ }
+ }
+ part {
+ name: "end_field";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ min: 0 82;
+ fixed: 0 1;
+ rel1 {
+ relative: 0.0 1.0;
+ to: "pad_b";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ to: "pad_b";
+ }
+ }
+ }
+ part {
+ name: "check_bottom";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ min: 0 4;
+ fixed: 0 1;
+ rel1 {
+ relative: 0.0 0.0;
+ to: "end_field";
+ }
+ rel2 {
+ relative: 1.0 0.0;
+ to: "end_field";
+ }
+ }
+ }
+ part {
+ name: "elm.swallow.end";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ rel1.to: "end_field";
+ rel1.offset: 11 0;
+ rel2.to: "end_field";
+ }
+ }
+ }
+ } //end group
+} //end collections
diff --git a/home/res/edje/preview.edc b/home/res/edje/preview.edc
new file mode 100644
index 0000000..00ca2b2
--- /dev/null
+++ b/home/res/edje/preview.edc
@@ -0,0 +1,546 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "../../include/conf.h"
+
+styles {
+ style {
+ name: "preview,title";
+ base: "font=Tizen text_class=AT0311 style=shadow shadow_color=#0000004C font_size=40 align=center color=#FFFFFF color_class=AT0311 wrap=word"; # ellipsis=1.0
+ tag: "br" "\n";
+ tag: "hilight" "+ font=Tizen:style=Bold";
+ tag: "b" "+ font=Tizen:style=Bold";
+ tag: "tag" "\t";
+ }
+}
+styles {
+ style {
+ name: "preview,title,dim";
+ base: "font=Tizen text_class=AT0312 style=shadow shadow_color=#0000004C font_size=40 align=center color=#FFFFFF color_class=AT0312 wrap=word"; # ellipsis=1.0
+ tag: "br" "\n";
+ tag: "hilight" "+ font=Tizen:style=Bold";
+ tag: "b" "+ font=Tizen:style=Bold";
+ tag: "tag" "\t";
+ }
+}
+
+styles {
+ style {
+ name: "preview,title,press";
+ base: "font=Tizen text_class=AT0312 style=shadow shadow_color=#0000004C font_size=40 align=center color=#FFFFFF color_class=AT0312 wrap=word"; # ellipsis=1.0
+ tag: "br" "\n";
+ tag: "hilight" "+ font=Tizen:style=Bold";
+ tag: "b" "+ font=Tizen:style=Bold";
+ tag: "tag" "\t";
+ }
+}
+
+images {
+ image: "b_widget_favorite_bg.png" COMP;
+ image: "b_home_screen_widget_line.#.png" COMP;
+ image: "b_home_screen_widget_line_ef.png" COMP;
+ image: "b_home_screen_edit_cover.png" COMP;
+ image: "b_home_screen_edit_cover_ef.png" COMP;
+ image: "b_home_screen_widget_check.png" COMP;
+ image: "b_home_screen_widget_check_ef.png" COMP;
+}
+
+#define HEIGHT (ADD_VIEWER_TEXT_HEIGHT + ADD_VIEWER_PAD + ADD_VIEWER_PREVIEW_HEIGHT)
+
+collections {
+ group {
+ name: "bg";
+ parts {
+ part {
+ name: "bg_bottom";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ color_class: "AO041";
+ visible: 0;
+ }
+ }
+ part {
+ name: "empty";
+ type: TEXT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ text {
+ text_class: "AT0132";
+ align: 0.5 0.5;
+ ellipsis: 0.0;
+ min: 1 1;
+ }
+ visible: 1;
+ }
+ }
+ }
+ }
+
+ /* Icon group */
+ group {
+ name: "default,1x1";
+ }
+ group {
+ name: "default,2x2";
+ }
+
+ /* Preview group */
+ group {
+ name: "preview,1x1";
+ }
+ group {
+ name: "preview,2x2";
+ script {
+ public g_focus = 0;
+ }
+ parts {
+ part {
+ name: "entire,bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ min: ADD_VIEWER_PREVIEW_WIDTH HEIGHT;
+ color: 0 0 0 0;
+ }
+ }
+
+ part {
+ name: "title";
+ type: TEXTBLOCK;
+ scale: 1;
+ multiline: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 ADD_VIEWER_TEXT_HEIGHT/HEIGHT; }
+ text {
+ style: "preview,title";
+ align: 0.5 1.0;
+ min: 0 1;
+ }
+ min: 0 ADD_VIEWER_TEXT_HEIGHT;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ text { style: "preview,title,dim"; }
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ text { style: "preview,title,press"; }
+ }
+ }
+
+ part {
+ name: "pad";
+ type: SPACER;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 ADD_VIEWER_TEXT_HEIGHT/HEIGHT; }
+ rel2 { relative: 1.0 (ADD_VIEWER_TEXT_HEIGHT+ADD_VIEWER_PAD)/HEIGHT; }
+ min: 0 ADD_VIEWER_PAD;
+ }
+ }
+
+ part {
+ name: "bg";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "preview"; }
+ rel2 { relative: 1.0 1.0; to, "preview"; }
+ }
+ }
+
+ part {
+ name: "gradient,bg";
+ type: IMAGE;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to, "preview"; }
+ rel2 { relative: 1.0 1.0; to, "preview"; }
+ image { normal: "b_widget_favorite_bg.png"; }
+ color_class: "AO031";
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+
+ part {
+ name: "preview";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 (ADD_VIEWER_TEXT_HEIGHT+ADD_VIEWER_PAD)/HEIGHT; }
+ rel2 { relative: 1.0 1.0; }
+ min: ADD_VIEWER_PREVIEW_WIDTH ADD_VIEWER_PREVIEW_HEIGHT; // 216, 288
+ }
+ description {
+ state: "pressed" 0.0;
+ rel1 { relative: 5/ADD_VIEWER_PREVIEW_WIDTH (ADD_VIEWER_TEXT_HEIGHT+ADD_VIEWER_PAD+5)/HEIGHT; }
+ rel2 { relative: (ADD_VIEWER_PREVIEW_WIDTH-5)/ADD_VIEWER_PREVIEW_WIDTH (HEIGHT-5)/HEIGHT; }
+ min: (ADD_VIEWER_PREVIEW_WIDTH-10) (ADD_VIEWER_PREVIEW_HEIGHT-10);
+ }
+ }
+ part {
+ name: "check_ef";
+ type: IMAGE;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ADD_VIEWER_PREVIEW_WIDTH-54)/ADD_VIEWER_PREVIEW_WIDTH (ADD_VIEWER_TEXT_HEIGHT+ADD_VIEWER_PAD)/HEIGHT; }
+ rel2 { relative: 1.0 (ADD_VIEWER_TEXT_HEIGHT+ADD_VIEWER_PAD+54)/HEIGHT; }
+ image {
+ normal: "b_home_screen_widget_check_ef.png";
+ }
+ color_class: "AO063";
+ min: 54 54;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "check";
+ type: IMAGE;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ADD_VIEWER_PREVIEW_WIDTH-54)/ADD_VIEWER_PREVIEW_WIDTH (ADD_VIEWER_TEXT_HEIGHT+ADD_VIEWER_PAD)/HEIGHT; }
+ rel2 { relative: 1.0 (ADD_VIEWER_TEXT_HEIGHT+ADD_VIEWER_PAD+54)/HEIGHT; }
+ image {
+ normal: "b_home_screen_widget_check.png";
+ }
+ color_class: "AO042";
+ min: 54 54;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "cover_ef";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.to: "preview";
+ rel2.to: "preview";
+ image {
+ normal: "b_home_screen_edit_cover_ef.png";
+ }
+ color_class: "AO065";
+ fixed: 1 1;
+ min: ITEM_EDIT_EF_WIDTH ITEM_EDIT_EF_HEIGHT;
+ align: 0.5 0.5;
+ visible: 0;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "cover";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.to: "preview";
+ rel2.to: "preview";
+ image {
+ normal: "b_home_screen_edit_cover.png";
+ }
+ color_class: "AO0482";
+ min: ADD_VIEWER_PREVIEW_WIDTH ADD_VIEWER_PREVIEW_HEIGHT;
+ visible: 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO0661";
+ }
+ }
+ part {
+ name: "line_ef";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ clip_to: "line_clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "preview"; }
+ rel2 { relative: 0.5 0.5; to: "preview"; }
+ image {
+ normal: "b_home_screen_widget_line_ef.png";
+ }
+ color_class: "AO063";
+ fixed: 1 1;
+ min: ITEM_EDIT_EF_WIDTH ITEM_EDIT_EF_HEIGHT;
+ align: 0.5 0.5;
+ visible: 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO0663";
+ }
+ }
+ part {
+ name: "line_clipper";
+ type: RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1.to: "line_ef";
+ rel2.to: "line_ef";
+ color: 255 255 255 255;
+ visible: 1;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 0;
+ }
+ }
+ part {
+ name: "line";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ clip_to: "line_clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "preview"; }
+ rel2 { relative: 0.5 0.5; to: "preview"; }
+ image {
+ normal: "b_home_screen_widget_line.#.png";
+ }
+ color_class: "AO043";
+ min: ADD_VIEWER_PREVIEW_LINE_WIDTH ADD_VIEWER_PREVIEW_LINE_HEIGHT;
+ align: 0.5 0.5;
+ visible: 1;
+ }
+ description {
+ state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ color_class: "AO0662";
+ }
+ }
+ part {
+ name: "preview,dbg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { to, "preview"; }
+ rel2 { to, "preview"; }
+ color: 0 0 0 0;
+ }
+ }
+ } // parts
+
+ programs {
+ program {
+ name: "pressed";
+ source: "preview,dbg";
+ signal: "mouse,down,1";
+ script {
+ if (get_int(g_focus) != 0) {
+ set_state(PART:"preview", "pressed", 0.0);
+ set_state(PART:"title", "pressed", 0.0);
+ set_state(PART:"cover", "pressed", 0.0);
+ set_state(PART:"line", "pressed", 0.0);
+ set_state(PART:"line_ef", "pressed", 0.0);
+ set_state(PART:"line_clipper", "default", 0.0);
+ set_state(PART:"cover_ef", "default", 0.0);
+ } else {
+ set_state(PART:"preview", "pressed", 0.0);
+ set_state(PART:"cover", "pressed", 0.0);
+ set_state(PART:"title", "hide", 0.0);
+ set_state(PART:"line", "pressed", 0.0);
+ set_state(PART:"line_ef", "pressed", 0.0);
+ set_state(PART:"line_clipper", "hide", 0.0);
+ set_state(PART:"cover_ef", "hide", 0.0);
+ }
+ }
+ }
+ program {
+ name: "released";
+ source: "preview,dbg";
+ signal: "mouse,up,1";
+ script {
+ if (get_int(g_focus) != 0) {
+ set_state(PART:"preview", "default", 0.0);
+ set_state(PART:"title", "default", 0.0);
+ set_state(PART:"cover", "default", 0.0);
+ set_state(PART:"line", "default", 0.0);
+ set_state(PART:"line_ef", "default", 0.0);
+ set_state(PART:"line_clipper", "default", 0.0);
+ set_state(PART:"cover_ef", "default", 0.0);
+ } else {
+ set_state(PART:"preview", "default", 0.0);
+ set_state(PART:"cover", "default", 0.0);
+ set_state(PART:"line", "default", 0.0);
+ set_state(PART:"line_ef", "default", 0.0);
+ set_state(PART:"title", "hide", 0.0);
+ set_state(PART:"line_clipper", "hide", 0.0);
+ set_state(PART:"cover_ef", "hide", 0.0);
+ }
+ }
+ }
+ program {
+ name: "released,force";
+ source: "preview,dbg";
+ signal: "reset";
+ action: STATE_SET "default" 0.0;
+ target: "preview";
+ }
+ program {
+ name: "clicked";
+ source: "preview,dbg";
+ signal: "mouse,clicked,1";
+ action: SIGNAL_EMIT "clicked" "preview";
+ }
+
+ program {
+ name: "enable,bg";
+ source: "gradient,bg";
+ signal: "enable";
+ action: STATE_SET "show" 0.0;
+ target: "gradient,bg";
+ }
+ program {
+ name: "disable,bg";
+ source: "gradient,bg";
+ signal: "disable";
+ action: STATE_SET "default" 0.0;
+ target: "gradient,bg";
+ }
+ program {
+ name: "show,line";
+ signal: "show";
+ source: "line";
+ action: STATE_SET "default" 0.0;
+ target: "title";
+ after: "show,after";
+ }
+ program {
+ name: "show,after";
+ script {
+ set_int(g_focus, 1);
+ }
+ after: "show,after,2";
+ }
+ program {
+ name: "show,after,2";
+ action: STATE_SET "default" 0.0;
+ target: "line_clipper";
+ target: "cover_ef";
+ transition: LINEAR 0.5;
+ }
+ program {
+ name: "hide,line";
+ signal: "hide";
+ source: "line";
+ action: STATE_SET "hide" 0.0;
+ target: "title";
+ after: "hide,after";
+ }
+ program {
+ name: "hide,after";
+ script {
+ set_int(g_focus, 0);
+ }
+ after: "hide,after,2";
+ }
+ program {
+ name: "hide,after,2";
+ action: STATE_SET "hide" 0.0;
+ target: "line_clipper";
+ target: "cover_ef";
+ transition: LINEAR 0.5;
+ }
+ program {
+ name: "hide,line,im";
+ signal: "hide,im";
+ source: "line";
+ script {
+ set_int(g_focus, 0);
+ }
+ after: "hide,im,after";
+ }
+ program {
+ name: "hide,im,after";
+ action: STATE_SET "hide" 0.0;
+ target: "line_clipper";
+ target: "title";
+ target: "cover_ef";
+ }
+ program {
+ name: "duplicated,mark,show";
+ signal: "show";
+ source: "duplicated";
+ action: STATE_SET "show" 0.0;
+ target: "check_ef";
+ target: "check";
+ }
+ program {
+ name: "duplicated,mark,hide";
+ signal: "hide";
+ source: "duplicated";
+ action: STATE_SET "default" 0.0;
+ target: "check_ef";
+ target: "check";
+ }
+ } // programs
+ } // group
+} // collections
+
+/* End of a file */
diff --git a/home/res/edje/tutorial.edc b/home/res/edje/tutorial.edc
new file mode 100755
index 0000000..e84168d
--- /dev/null
+++ b/home/res/edje/tutorial.edc
@@ -0,0 +1,1182 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "conf.edc"
+
+styles {
+ style {
+ name: "main_text_style";
+ base: "font=TIZEN:style=REGULAR text_class=tizen font_size="40" align=center valign=top color=#FFFFFF ellipsis=1 wrap=mixed";
+ tag: "<br/>" "\n";
+ }
+ style {
+ name: "sub_text_style";
+ base: "font=TIZEN:style=REGULAR text_class=tizen font_size="32" color=#FFFFFF ellipsis=1 wrap=mixed";
+ tag: "<br/>" "\n";
+ }
+ style {
+ name: "main_text_style,medium";
+ base: "font=TIZEN:style=REGULAR text_class=tizen font_size="38" align=center valign=top color=#FFFFFF ellipsis=1 wrap=mixed";
+ tag: "<br/>" "\n";
+ }
+ style {
+ name: "sub_text_style,medium";
+ base: "font=TIZEN:style=REGULAR text_class=tizen font_size="30" color=#FFFFFF ellipsis=1 wrap=mixed";
+ tag: "<br/>" "\n";
+ }
+ style {
+ name: "main_text_style,small";
+ base: "font=TIZEN:style=REGULAR text_class=tizen font_size="34" align=center valign=top color=#FFFFFF ellipsis=1 wrap=mixed";
+ tag: "<br/>" "\n";
+ }
+ style {
+ name: "sub_text_style,small";
+ base: "font=TIZEN:style=REGULAR text_class=tizen font_size="24" color=#FFFFFF ellipsis=1 wrap=mixed";
+ tag: "<br/>" "\n";
+ }
+ style {
+ name: "button_text_style";
+ base: "font=TIZEN:style=BOLD text_class=tizen font_size="28" align=center color=#FFFFFF ellipsis=1.0 wrap=mixed";
+ tag: "<br/>" "\n";
+ }
+}
+
+images {
+ image: "overlay00_bg_cover.png" COMP;
+ image: "overlay01_bg_cover.png" COMP;
+ image: "overlay05_bg_cover.png" COMP;
+ image: "overlay06_bg_cover.png" COMP;
+ image: "overlay08_bg_cover.png" COMP;
+ image: "overlay_swipe_right.png" COMP;
+ image: "overlay_swipe_left.png" COMP;
+ image: "overlay_swipe_up.png" COMP;
+ image: "overlay_swipe_down.png" COMP;
+ image: "overlay_start_button.png" COMP;
+ image: "overlay_start_button_press.png" COMP;
+ image: "overlay_cue.png" COMP;
+ image: "overlay_close.png" COMP;
+ image: "overlay_button.#.png" COMP;
+ image: "overlay_button_press.#.png" COMP;
+ image: "overlay000_image.png" COMP;
+}
+
+collections {
+ group {
+ name: "tutorial";
+ parts {
+ part {
+ name: "bg_area";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ visible: 0;
+ }
+ }
+ part {
+ name: "page0";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ image {
+ normal: "overlay00_bg_cover.png";
+ }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "in" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "page1";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ image {
+ normal: "overlay01_bg_cover.png";
+ }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "in" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "page2";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ image {
+ normal: "overlay01_bg_cover.png";
+ }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "in" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "page3";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ image {
+ normal: "overlay01_bg_cover.png";
+ }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "in" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "page4";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ image {
+ normal: "overlay01_bg_cover.png";
+ }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "in" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "page5";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ image {
+ normal: "overlay05_bg_cover.png";
+ }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "in" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "page6";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ image {
+ normal: "overlay06_bg_cover.png";
+ }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "in" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "page7";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ image {
+ normal: "overlay06_bg_cover.png";
+ }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "in" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "page8";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ image {
+ normal: "overlay08_bg_cover.png";
+ }
+ color: 255 255 255 0;
+ visible: 1;
+ }
+ description {
+ state: "in" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+ part {
+ name: "structure";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 IMAGE_Y/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 0.5 IMAGE_Y/BASE_HEIGHT; to: "bg_area"; }
+ image {
+ normal: "overlay000_image.png";
+ }
+ min: 360 260;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ visible: 1;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "show" 0.0;
+ color: 255 255 255 0;
+ }
+ }
+ part {
+ name: "text_area";
+ type: SPACER;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 16/BASE_WIDTH 269/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 344/BASE_WIDTH 386/BASE_HEIGHT; to: "bg_area"; }
+ }
+ description {
+ state: "structure" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 16/BASE_WIDTH 242/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 344/BASE_WIDTH 359/BASE_HEIGHT; to: "bg_area"; }
+ }
+ description {
+ state: "down" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 16/BASE_WIDTH 209/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 344/BASE_WIDTH 365/BASE_HEIGHT; to: "bg_area"; }
+ }
+ description { // use page 8
+ state: "down,indi" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 16/BASE_WIDTH 331/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 344/BASE_WIDTH 448/BASE_HEIGHT; to: "bg_area"; }
+ }
+ description {
+ state: "up" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 16/BASE_WIDTH 112/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 344/BASE_WIDTH 307/BASE_HEIGHT; to: "bg_area"; }
+ }
+ description {
+ state: "center" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 16/BASE_WIDTH 77/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 344/BASE_WIDTH 383/BASE_HEIGHT; to: "bg_area"; }
+ }
+ description {
+ state: "center,done" 0.0;
+ inherit: "center" 0.0;
+ rel1 { relative: 16/BASE_WIDTH 112/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 344/BASE_WIDTH 316/BASE_HEIGHT; to: "bg_area"; }
+ }
+ }
+ part {
+ name: "text,clipper";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ color: 255 255 255 255;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 0;
+ }
+ }
+ part {
+ name: "text";
+ type: TEXTBLOCK;
+ mouse_events: 1;
+ repeat_events: 1;
+ clip_to: "text,clipper";
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "text_area"; }
+ rel2 { relative: 1.0 1.0; to: "text_area"; }
+ align: 0.5 0.5;
+ text {
+ style: "sub_text_style";
+ align: 0.5 0.5;
+ min: 0 1;
+ }
+ visible: 1;
+ }
+ description {
+ state: "sub_up" 0.0;
+ inherit: "default" 0.0;
+ text {
+ style: "sub_text_style";
+ align: 0.5 0.1;
+ min: 0 1;
+ }
+ }
+ description {
+ state: "center" 0.0;
+ inherit: "default" 0.0;
+ text {
+ style: "main_text_style";
+ align: 0.5 0.2;
+ min: 0 1;
+ }
+ }
+ description {
+ state: "sub_medium" 0.0;
+ inherit: "default" 0.0;
+ text {
+ style: "sub_text_style,medium";
+ align: 0.5 0.5;
+ min: 0 1;
+ }
+ }
+ description {
+ state: "center_medium" 0.0;
+ inherit: "default" 0.0;
+ text {
+ style: "main_text_style,medium";
+ align: 0.5 0.2;
+ min: 0 1;
+ }
+ }
+ description {
+ state: "sub_small" 0.0;
+ inherit: "default" 0.0;
+ text {
+ style: "sub_text_style,small";
+ align: 0.5 0.5;
+ min: 0 1;
+ }
+ }
+ description {
+ state: "center_small" 0.0;
+ inherit: "default" 0.0;
+ text {
+ style: "main_text_style,small";
+ align: 0.5 0.2;
+ min: 0 1;
+ }
+ }
+ }
+ part {
+ name: "focus,text";
+ type: SWALLOW;
+ scale : 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "text"; }
+ rel2 { relative: 1.0 1.0; to: "text"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "swipe";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0; //right
+ rel1 { relative: 100/BASE_WIDTH 419/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 260/BASE_WIDTH 461/BASE_HEIGHT; to: "bg_area"; }
+ image {
+ normal: "overlay_swipe_right.png";
+ }
+ align: 0.5 0.5;
+ visible: 1;
+ }
+ description {
+ state: "left" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 100/BASE_WIDTH 419/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 260/BASE_WIDTH 461/BASE_HEIGHT; to: "bg_area"; }
+ image {
+ normal: "overlay_swipe_left.png";
+ }
+ }
+ description {
+ state: "down" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 159/BASE_WIDTH 384/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 201/BASE_WIDTH 464/BASE_HEIGHT; to: "bg_area"; }
+ image {
+ normal: "overlay_swipe_up.png";
+ }
+ }
+ description { // use page 8
+ state: "down,indi" 0.0;
+ inherit: "down" 0.0;
+ rel1 { relative: 159/BASE_WIDTH 241/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 201/BASE_WIDTH 321/BASE_HEIGHT; to: "bg_area"; }
+ }
+ description {
+ state: "up" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 159/BASE_WIDTH 16/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 201/BASE_WIDTH 96/BASE_HEIGHT; to: "bg_area"; }
+ image {
+ normal: "overlay_swipe_down.png";
+ }
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "swipe_cue";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0; // hide
+ rel1 { relative: 159/BASE_WIDTH -24/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 201/BASE_WIDTH 18/BASE_HEIGHT; to: "bg_area"; }
+ image {
+ normal: "overlay_cue.png";
+ }
+ visible: 0;
+ }
+ description {
+ state: "down" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 148/BASE_WIDTH 453/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 213/BASE_WIDTH 518/BASE_HEIGHT; to: "bg_area"; }
+ visible: 1;
+ }
+ description {
+ state: "up" 0.0;
+ inherit: "default" 0.0;
+ rel1 { relative: 148/BASE_WIDTH -38/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 213/BASE_WIDTH 27/BASE_HEIGHT; to: "bg_area"; }
+ visible: 1;
+ }
+ }
+ part {
+ name: "close_button";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: CLOSE_BUTTON_X/BASE_WIDTH CLOSE_BUTTON_Y/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: CLOSE_BUTTON_X/BASE_WIDTH CLOSE_BUTTON_Y/BASE_HEIGHT; to: "bg_area"; }
+ min: 66 66;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "close_button,line";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "close_button"; }
+ rel2 { relative: 0.5 0.5; to: "close_button"; }
+ image {
+ normal: "overlay_close.png";
+ }
+ min: 66 66;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "button_bg";
+ type: SPACER;
+ scale: 1;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.5 BUTTON_LOCATION/BASE_HEIGHT; to: "bg_area"; }
+ rel2 { relative: 0.5 BUTTON_LOCATION/BASE_HEIGHT; to: "bg_area"; }
+ }
+ }
+ part {
+ name: "button";
+ type: SWALLOW;
+ scale: 1;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0; // hide
+ rel1 { relative: 0.0 0.0; to: "button_text"; offset: -16 0; }
+ rel2 { relative: 1.0 1.0; to: "button_text"; offset: 16 0; }
+ min: 174 71;
+ max: 334 71;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "button_line";
+ type: IMAGE;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0; // hide
+ rel1 { relative: 0.0 0.0; to: "button_text"; offset: -16 0; }
+ rel2 { relative: 1.0 1.0; to: "button_text"; offset: 16 0; }
+ image {
+ normal: "overlay_button.#.png";
+ }
+ min: 174 71;
+ max: 334 71;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ description {
+ state: "press" 0.0;
+ inherit: "default" 0.0;
+ image {
+ normal: "overlay_button_press.#.png";
+ }
+ visible: 1;
+ }
+ }
+ part {
+ name: "button_text";
+ type: TEXTBLOCK;
+ scale: 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description { // hide
+ state: "default" 0.0;
+ rel1 { relative: 0.5 0.5; to: "button_bg"; }
+ rel2 { relative: 0.5 0.5; to: "button_bg"; }
+ align: 0.5 0.5;
+ text {
+ style: "button_text_style";
+ align: 0.5 0.5;
+ min: 0 0;
+ }
+ fixed: 1 1;
+ visible: 0;
+ }
+ description {
+ state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "focus,tutorial";
+ type: SWALLOW;
+ scale : 1;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "bg_area"; }
+ rel2 { relative: 1.0 1.0; to: "bg_area"; }
+ color: 0 0 0 0;
+ visible: 1;
+ }
+ }
+ }// end parts
+
+ programs {
+ program { // start
+ signal: "start";
+ source: "start";
+ action: STATE_SET "center" 0.0;
+ target: "text_area";
+ after: "bg,show";
+ }
+ program {
+ name: "bg,show";
+ action: STATE_SET "in" 0.0;
+ target: "page0";
+ after: "init,show";
+ }
+ program {
+ name: "init,show";
+ action: STATE_SET "default" 0.0;
+ target: "text,clipper";
+ target: "focus,text";
+ after: "swipe,hide";
+ }
+ program {
+ name: "swipe,hide";
+ action: STATE_SET "hide" 0.0;
+ target: "swipe";
+ target: "swipe_cue";
+ after: "button,show";
+ }
+ program {
+ name: "button,show";
+ action: STATE_SET "show" 0.0;
+ target: "button";
+ target: "button_line";
+ target: "button_text";
+ target: "close_button";
+ target: "close_button,line";
+ }
+ program { // start, pressed
+ signal: "show";
+ source: "start,pressed";
+ action: STATE_SET "press" 0.0;
+ target: "button_line";
+ after: "text,hide";
+ }
+ program {
+ name: "text,hide";
+ action: STATE_SET "hide" 0.0;
+ target: "text,clipper";
+ transition: LINEAR 0.5;
+ after: "button,hide";
+ }
+ program {
+ name: "button,hide";
+ action: STATE_SET "default" 0.0;
+ target: "button_line";
+ target: "button_text";
+ target: "close_button";
+ target: "close_button,line";
+ after: "tutorial,start";
+ }
+ program {
+ name: "tutorial,start";
+ action: SIGNAL_EMIT "start" "button";
+ }
+ program { // structure page
+ signal: "show";
+ source: "structure_page";
+ action: STATE_SET "default" 0.0;
+ target: "text,clipper";
+ after: "image,show";
+ }
+ program {
+ name: "image,show";
+ action: STATE_SET "show" 0.0;
+ target: "button_line";
+ target: "button_text";
+ target: "structure";
+ after: "structure_page,text";
+ }
+ program {
+ name: "structure_page,text";
+ action: STATE_SET "structure" 0.0;
+ target: "text_area";
+ }
+ program { // start 2, pressed
+ signal: "show";
+ source: "start2,pressed";
+ action: STATE_SET "press" 0.0;
+ target: "button_line";
+ after: "text2,hide";
+ }
+ program {
+ name: "text2,hide";
+ action: STATE_SET "hide" 0.0;
+ target: "text,clipper";
+ target: "structure";
+ transition: LINEAR 0.5;
+ after: "button2,hide";
+ }
+ program {
+ name: "button2,hide";
+ action: STATE_SET "default" 0.0;
+ target: "structure";
+ target: "button_line";
+ target: "button_text";
+ after: "tutorial,start2";
+ }
+ program {
+ name: "tutorial,start2";
+ action: SIGNAL_EMIT "start2" "button";
+ }
+ program { // structure page out
+ signal: "hide";
+ source: "page0";
+ action: STATE_SET "default" 0.0;
+ target: "page0";
+ transition: LINEAR 0.3;
+ }
+ program { // page 1
+ signal: "show";
+ source: "page1";
+ action: STATE_SET "default" 0.0;
+ target: "page1";
+ target: "text_area";
+ target: "text,clipper";
+ target: "swipe";
+ target: "swipe_cue";
+ after: "page1,in";
+ }
+ program {
+ name: "page1,in";
+ action: STATE_SET "in" 0.0;
+ target: "page1";
+ transition: LINEAR 0.3;
+ }
+ program { // page 1 out
+ signal: "hide";
+ source: "page1";
+ action: STATE_SET "default" 0.0;
+ target: "page1";
+ transition: LINEAR 0.3;
+ }
+ program { // page 2
+ signal: "show";
+ source: "page2";
+ action: STATE_SET "default" 0.0;
+ target: "page2";
+ after: "page2,in";
+ }
+ program {
+ name: "page2,in";
+ action: STATE_SET "in" 0.0;
+ target: "page2";
+ transition: LINEAR 0.3;
+ after: "swipe,left";
+ }
+ program {
+ name: "swipe,left";
+ action: STATE_SET "left" 0.0;
+ target: "swipe";
+ after: "text,show";
+ }
+ program {
+ name: "text,show";
+ action: STATE_SET "default" 0.0;
+ target: "text,clipper";
+ }
+ program { // page 2 out
+ signal: "hide";
+ source: "page2";
+ action: STATE_SET "default" 0.0;
+ target: "page2";
+ transition: LINEAR 0.3;
+ }
+ program { // page 3
+ signal: "show";
+ source: "page3";
+ action: STATE_SET "default" 0.0;
+ target: "page3";
+ after: "page3,in";
+ }
+ program {
+ name: "page3,in";
+ action: STATE_SET "in" 0.0;
+ target: "page3";
+ transition: LINEAR 0.3;
+ after: "text,show";
+ }
+ program { // page 3 out
+ signal: "hide";
+ source: "page3";
+ action: STATE_SET "default" 0.0;
+ target: "page3";
+ transition: LINEAR 0.3;
+ }
+ program { // page 4
+ signal: "show";
+ source: "page4";
+ action: STATE_SET "default" 0.0;
+ target: "page4";
+ after: "page4,in";
+ }
+ program {
+ name: "page4,in";
+ action: STATE_SET "in" 0.0;
+ target: "page4";
+ transition: LINEAR 0.3;
+ after: "swipe,right";
+ }
+ program {
+ name: "swipe,right";
+ action: STATE_SET "default" 0.0;
+ target: "swipe";
+ after: "text,show";
+ }
+ program { // page 4 out
+ signal: "hide";
+ source: "page4";
+ action: STATE_SET "hide" 0.0;
+ target: "text,clipper";
+ after: "page4,out";
+ }
+ program {
+ name: "page4,out";
+ action: STATE_SET "default" 0.0;
+ target: "page4";
+ transition: LINEAR 0.3;
+ }
+ program { // page 5
+ signal: "show";
+ source: "page5";
+ action: STATE_SET "default" 0.0;
+ target: "page5";
+ after: "page5,in";
+ }
+ program {
+ name: "page5,in";
+ action: STATE_SET "in" 0.0;
+ target: "page5";
+ transition: LINEAR 0.3;
+ after: "down";
+ }
+ program {
+ name: "down";
+ action: STATE_SET "down" 0.0;
+ target: "text_area";
+ target: "swipe";
+ target: "swipe_cue";
+ after: "text,show";
+ }
+ program { // page 5 out
+ signal: "hide";
+ source: "page5";
+ action: STATE_SET "hide" 0.0;
+ target: "text,clipper";
+ after: "page5,out";
+ }
+ program {
+ name: "page5,out";
+ action: STATE_SET "default" 0.0;
+ target: "page5";
+ transition: LINEAR 0.3;
+ }
+ program { // page 6
+ signal: "show";
+ source: "page6";
+ action: STATE_SET "default" 0.0;
+ target: "page6";
+ after: "page6,in";
+ }
+ program {
+ name: "page6,in";
+ action: STATE_SET "in" 0.0;
+ target: "page6";
+ transition: LINEAR 0.3;
+ after: "up";
+ }
+ program {
+ name: "up";
+ action: STATE_SET "up" 0.0;
+ target: "text_area";
+ target: "swipe";
+ target: "swipe_cue";
+ after: "text,show";
+ }
+ program { // page 6 out
+ signal: "hide";
+ source: "page6";
+ action: STATE_SET "default" 0.0;
+ target: "page6";
+ transition: LINEAR 0.4;
+ }
+ program { // page 7
+ signal: "show";
+ source: "page7";
+ action: STATE_SET "default" 0.0;
+ target: "page7";
+ after: "page7,in";
+ }
+ program {
+ name: "page7,in";
+ action: STATE_SET "in" 0.0;
+ target: "page7";
+ transition: LINEAR 0.3;
+ after: "text,show";
+ }
+ program { // page 7 out
+ signal: "hide";
+ source: "page7";
+ action: STATE_SET "hide" 0.0;
+ target: "text,clipper";
+ after: "page7,out";
+ }
+ program {
+ name: "page7,out";
+ action: STATE_SET "default" 0.0;
+ target: "page7";
+ transition: LINEAR 0.3;
+ }
+ program { // page 8
+ signal: "show";
+ source: "page8";
+ action: STATE_SET "default" 0.0;
+ target: "page8";
+ after: "page8,in";
+ }
+ program {
+ name: "page8,in";
+ action: STATE_SET "in" 0.0;
+ target: "page8";
+ transition: LINEAR 0.3;
+ after: "indicator,down";
+ }
+ program {
+ name: "indicator,down";
+ action: STATE_SET "down,indi" 0.0;
+ target: "text_area";
+ target: "swipe";
+ after: "cue,hide";
+ }
+ program {
+ name: "cue,hide";
+ action: STATE_SET "default" 0.0;
+ target: "swipe_cue";
+ after: "text,show";
+ }
+ program { // page 8 out
+ signal: "hide";
+ source: "page8";
+ action: STATE_SET "hide" 0.0;
+ target: "text,clipper";
+ target: "swipe";
+ after: "page8,out";
+ }
+ program {
+ name: "page8,out";
+ action: STATE_SET "default" 0.0;
+ target: "page8";
+ transition: LINEAR 0.3;
+ }
+ program { // page 9
+ signal: "show";
+ source: "page9";
+ action: STATE_SET "default" 0.0;
+ target: "page0";
+ after: "page9,in";
+ }
+ program {
+ name: "page9,in";
+ action: STATE_SET "in" 0.0;
+ target: "page0";
+ transition: LINEAR 0.3;
+ after: "swipe,hide2";
+ }
+ program {
+ name: "swipe,hide2";
+ action: STATE_SET "hide" 0.0;
+ target: "swipe";
+ after: "button,show2";
+ }
+ program {
+ name: "button,show2";
+ action: STATE_SET "show" 0.0;
+ target: "button";
+ target: "button_line";
+ target: "button_text";
+ after: "text,center";
+ }
+ program {
+ name: "text,center";
+ action: STATE_SET "center,done" 0.0;
+ target: "text_area";
+ after: "text,show";
+ }
+ program { // page 9, pressed
+ signal: "show";
+ source: "page9,pressed";
+ action: STATE_SET "press" 0.0;
+ target: "button_line";
+ after: "text,hide2";
+ }
+ program {
+ name: "text,hide2";
+ action: STATE_SET "hide" 0.0;
+ target: "text,clipper";
+ transition: LINEAR 0.5;
+ after: "button,hide2";
+ }
+ program {
+ name: "button,hide2";
+ action: STATE_SET "default" 0.0;
+ target: "button_line";
+ target: "button_text";
+ after: "tutorial,done";
+ }
+ program {
+ name: "tutorial,done";
+ action: SIGNAL_EMIT "done" "button";
+ }
+ program {
+ signal: "standard";
+ source: "sub";
+ action: STATE_SET "default" 0.0;
+ target: "text";
+ }
+ program {
+ signal: "up";
+ source: "sub";
+ action: STATE_SET "sub_up" 0.0;
+ target: "text";
+ }
+ program {
+ signal: "medium";
+ source: "sub";
+ action: STATE_SET "sub_medium" 0.0;
+ target: "text";
+ }
+ program {
+ signal: "small";
+ source: "sub";
+ action: STATE_SET "sub_small" 0.0;
+ target: "text";
+ }
+ program {
+ signal: "standard";
+ source: "center";
+ action: STATE_SET "center" 0.0;
+ target: "text";
+ }
+ program {
+ signal: "medium";
+ source: "center";
+ action: STATE_SET "center_medium" 0.0;
+ target: "text";
+ }
+ program {
+ signal: "small";
+ source: "center";
+ action: STATE_SET "center_small" 0.0;
+ target: "text";
+ }
+ program {
+ signal: "show";
+ source: "text";
+ action: STATE_SET "default" 0.0;
+ target: "text,clipper";
+ }
+ program {
+ signal: "hide";
+ source: "text";
+ action: STATE_SET "hide" 0.0;
+ target: "text,clipper";
+ }
+ }// end programs
+ }// end group
+}// end collection
diff --git a/home/res/icon/CMakeLists.txt b/home/res/icon/CMakeLists.txt
new file mode 100755
index 0000000..ef2cd79
--- /dev/null
+++ b/home/res/icon/CMakeLists.txt
@@ -0,0 +1,3 @@
+# install icons
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}.png DESTINATION ${ICONDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${PACKAGE_NAME}.small.png DESTINATION ${ICONDIR})
diff --git a/home/res/icon/org.tizen.w-home.png b/home/res/icon/org.tizen.w-home.png
new file mode 100755
index 0000000..ac14444
--- /dev/null
+++ b/home/res/icon/org.tizen.w-home.png
Binary files differ
diff --git a/home/res/icon/org.tizen.w-home.small.png b/home/res/icon/org.tizen.w-home.small.png
new file mode 100755
index 0000000..453073b
--- /dev/null
+++ b/home/res/icon/org.tizen.w-home.small.png
Binary files differ
diff --git a/home/res/image/CMakeLists.txt b/home/res/image/CMakeLists.txt
new file mode 100644
index 0000000..44a4687
--- /dev/null
+++ b/home/res/image/CMakeLists.txt
@@ -0,0 +1,2 @@
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/unknown.png DESTINATION ${IMAGEDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/b_home_screen_widget_line.png DESTINATION ${IMAGEDIR})
diff --git a/home/res/image/b_home_screen_widget_line.png b/home/res/image/b_home_screen_widget_line.png
new file mode 100755
index 0000000..4f4a320
--- /dev/null
+++ b/home/res/image/b_home_screen_widget_line.png
Binary files differ
diff --git a/home/res/image/unknown.png b/home/res/image/unknown.png
new file mode 100755
index 0000000..535db60
--- /dev/null
+++ b/home/res/image/unknown.png
Binary files differ
diff --git a/home/res/list/CMakeLists.txt b/home/res/list/CMakeLists.txt
new file mode 100755
index 0000000..99a6b87
--- /dev/null
+++ b/home/res/list/CMakeLists.txt
@@ -0,0 +1,2 @@
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tts_white.list DESTINATION ${RESDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tts_black.list DESTINATION ${RESDIR})
diff --git a/home/res/list/tts_black.list b/home/res/list/tts_black.list
new file mode 100644
index 0000000..e4bb9d9
--- /dev/null
+++ b/home/res/list/tts_black.list
@@ -0,0 +1,4 @@
+org.tizen.w-magazine.dbox.home
+org.tizen.w-calendar2.win
+org.tizen.shealth.dbox
+org.tizen.clocksetting.live
diff --git a/home/res/list/tts_white.list b/home/res/list/tts_white.list
new file mode 100644
index 0000000..c1b3abf
--- /dev/null
+++ b/home/res/list/tts_white.list
@@ -0,0 +1,3 @@
+org.tizen.w-music-player.livebox
+org.tizen.w-contacts2.dbox
+org.tizen.weather.widget-today
diff --git a/home/res/ordering/CMakeLists.txt b/home/res/ordering/CMakeLists.txt
new file mode 100755
index 0000000..fa9753f
--- /dev/null
+++ b/home/res/ordering/CMakeLists.txt
@@ -0,0 +1,15 @@
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/default_favorite_apps_emergency.xml DESTINATION ${RESDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/default_items.xml DESTINATION ${RESDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/default_items_tts.xml DESTINATION ${RESDIR})
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/settings.xml DESTINATION ${RESDIR})
+IF(RUN_ON_DEVICE)
+ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/default_favorite_apps.xml DESTINATION ${RESDIR})
+ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/default_favorite_apps_without_hr.xml DESTINATION ${RESDIR})
+ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/default_favorite_apps_without_sleep.xml DESTINATION ${RESDIR})
+ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/default_favorite_apps_without_camera.xml DESTINATION ${RESDIR})
+ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/default_favorite_apps_without_camera_sleep.xml DESTINATION ${RESDIR})
+ELSEIF(RUN_ON_EMULATOR)
+ INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/default_favorite_apps_emulator.xml DESTINATION ${RESDIR} RENAME default_favorite_apps.xml)
+ENDIF()
+
+INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/apps_default_items.xml DESTINATION ${RESDIR})
diff --git a/home/res/ordering/apps_default_items.xml b/home/res/ordering/apps_default_items.xml
new file mode 100755
index 0000000..241828c
--- /dev/null
+++ b/home/res/ordering/apps_default_items.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <apps>
+ <packageName>org.tizen.w-dialer2</packageName>
+ <className>org.tizen.w-dialer2</className>
+ <screen>0</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-contacts2</packageName>
+ <className>org.tizen.w-contacts2</className>
+ <screen>0</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.message</packageName>
+ <className>org.tizen.message</className>
+ <screen>1</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.wemail</packageName>
+ <className>org.tizen.wemail</className>
+ <screen>1</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-calendar2</packageName>
+ <className>org.tizen.w-calendar2</className>
+ <screen>2</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.clocksetting</packageName>
+ <className>org.tizen.clocksetting</className>
+ <screen>2</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>grk68HBhDL.Navigator</packageName>
+ <className>grk68HBhDL.Navigator</className>
+ <screen>3</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.shealth.dashboard</packageName>
+ <className>org.tizen.shealth.dashboard</className>
+ <screen>3</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>bNAm8uFvZ6.Running</packageName>
+ <className>bNAm8uFvZ6.Running</className>
+ <screen>4</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-music-player</packageName>
+ <className>org.tizen.w-music-player</className>
+ <screen>4</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-magazine</packageName>
+ <className>org.tizen.w-magazine</className>
+ <screen>5</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.weather</packageName>
+ <className>org.tizen.weather</className>
+ <screen>5</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.svoice</packageName>
+ <className>org.tizen.svoice</className>
+ <screen>6</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.alarm</packageName>
+ <className>org.tizen.alarm</className>
+ <screen>6</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-gallery</packageName>
+ <className>org.tizen.w-gallery</className>
+ <screen>7</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.wfmd</packageName>
+ <className>org.tizen.wfmd</className>
+ <screen>7</screen>
+ <cell>1</cell>
+ </apps>
+</data>
diff --git a/home/res/ordering/apps_default_items_ATT.xml b/home/res/ordering/apps_default_items_ATT.xml
new file mode 100755
index 0000000..5bee97f
--- /dev/null
+++ b/home/res/ordering/apps_default_items_ATT.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <apps>
+ <packageName>org.tizen.w-dialer2</packageName>
+ <className>org.tizen.w-dialer2</className>
+ <screen>0</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-contacts2</packageName>
+ <className>org.tizen.w-contacts2</className>
+ <screen>0</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.message</packageName>
+ <className>org.tizen.message</className>
+ <screen>1</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.wemail</packageName>
+ <className>org.tizen.wemail</className>
+ <screen>1</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.shealth.dashboard</packageName>
+ <className>org.tizen.shealth.dashboard</className>
+ <screen>2</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-calendar2</packageName>
+ <className>org.tizen.w-calendar2</className>
+ <screen>2</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>bNAm8uFvZ6.Running</packageName>
+ <className>bNAm8uFvZ6.Running</className>
+ <screen>3</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.weather</packageName>
+ <className>org.tizen.weather</className>
+ <screen>3</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-music-player</packageName>
+ <className>org.tizen.w-music-player</className>
+ <screen>4</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>M6escjwPfn.MilkMusic</packageName>
+ <className>M6escjwPfn.MilkMusic</className>
+ <screen>4</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>grk68HBhDL.Navigator</packageName>
+ <className>grk68HBhDL.Navigator</className>
+ <screen>5</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-magazine</packageName>
+ <className>org.tizen.w-magazine</className>
+ <screen>5</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.w-gallery</packageName>
+ <className>org.tizen.w-gallery</className>
+ <screen>6</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.alarm</packageName>
+ <className>org.tizen.alarm</className>
+ <screen>6</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.clocksetting</packageName>
+ <className>org.tizen.clocksetting</className>
+ <screen>7</screen>
+ <cell>0</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.wfmd</packageName>
+ <className>org.tizen.wfmd</className>
+ <screen>7</screen>
+ <cell>1</cell>
+ </apps>
+ <apps>
+ <packageName>org.tizen.svoice</packageName>
+ <className>org.tizen.svoice</className>
+ <screen>8</screen>
+ <cell>0</cell>
+ </apps>
+</data>
diff --git a/home/res/ordering/default_favorite_apps.xml b/home/res/ordering/default_favorite_apps.xml
new file mode 100755
index 0000000..425e7c8
--- /dev/null
+++ b/home/res/ordering/default_favorite_apps.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <favorite>
+ <packagename>org.tizen.w-media-controller.livebox</packagename>
+ <classname>org.tizen.w-media-controller.livebox</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.weather.widget</packagename>
+ <classname>org.tizen.weather.widget</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+</data>
diff --git a/home/res/ordering/default_favorite_apps_emergency.xml b/home/res/ordering/default_favorite_apps_emergency.xml
new file mode 100755
index 0000000..8cffa59
--- /dev/null
+++ b/home/res/ordering/default_favorite_apps_emergency.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <idle-clock>
+ <packageName>org.tizen.idle-clock-digital</packageName>
+ <className>org.tizen.idle-clock-digital</className>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </idle-clock>
+ <favorite>
+ <packagename>org.tizen.w-dialer2</packagename>
+ <classname>org.tizen.w-dialer2</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.message</packagename>
+ <classname>org.tizen.message</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-contacts2</packagename>
+ <classname>org.tizen.w-contacts2</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.wnotification2</packagename>
+ <classname>org.tizen.wnotification2</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+</data>
diff --git a/home/res/ordering/default_favorite_apps_emulator.xml b/home/res/ordering/default_favorite_apps_emulator.xml
new file mode 100755
index 0000000..5f077d7
--- /dev/null
+++ b/home/res/ordering/default_favorite_apps_emulator.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <idle-clock>
+ <packageName>org.tizen.idle-clock-digital</packageName>
+ <className>org.tizen.idle-clock-digital</className>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </idle-clock>
+ <favorite>
+ <packageName>org.tizen.clocksetting</packageName>
+ <className>org.tizen.clocksetting</className>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <more-apps>
+ <packageName>org.tizen.w-launcher-app</packageName>
+ <className>org.tizen.w-launcher-app</className>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </more-apps>
+</data>
diff --git a/home/res/ordering/default_favorite_apps_without_camera.xml b/home/res/ordering/default_favorite_apps_without_camera.xml
new file mode 100755
index 0000000..5d594b8
--- /dev/null
+++ b/home/res/ordering/default_favorite_apps_without_camera.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <favorite>
+ <packagename>org.tizen.svoice-w</packagename>
+ <classname>org.tizen.svoice-w</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-music-player</packagename>
+ <classname>org.tizen.w-music-player</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-voicerecorder</packagename>
+ <classname>org.tizen.w-voicerecorder</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.pedometer</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.exercise</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>2</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.heartrate</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>2</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.sleep</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.wnotification2</packagename>
+ <classname>org.tizen.wnotification2</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-logs2</packagename>
+ <classname>org.tizen.w-logs2</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-dialer2</packagename>
+ <classname>org.tizen.w-dialer2</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-contacts2</packagename>
+ <classname>org.tizen.w-contacts2</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>2</cellY>
+ </favorite>
+ <more-apps>
+ <packageName>org.tizen.w-launcher-app</packageName>
+ <className>org.tizen.w-launcher-app</className>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>2</cellY>
+ </more-apps>
+ <idle-clock>
+ <packageName>org.tizen.w-idle-clock-shortcut2</packageName>
+ <className>org.tizen.w-idle-clock-shortcut2</className>
+ <screen>2</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </idle-clock>
+ <favorite>
+ <packagename>org.tizen.clocksetting</packagename>
+ <classname>org.tizen.clocksetting</classname>
+ <screen>3</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.windicator</packagename>
+ <classname>org.tizen.windicator</classname>
+ <screen>3</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+</data>
diff --git a/home/res/ordering/default_favorite_apps_without_camera_sleep.xml b/home/res/ordering/default_favorite_apps_without_camera_sleep.xml
new file mode 100755
index 0000000..9113971
--- /dev/null
+++ b/home/res/ordering/default_favorite_apps_without_camera_sleep.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <favorite>
+ <packagename>S8UVkC4ryF</packagename>
+ <classname>S8UVkC4ryF.WatchONWeb</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.svoice-w</packagename>
+ <classname>org.tizen.svoice-w</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.wfmd</packagename>
+ <classname>org.tizen.wfmd</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-voicerecorder</packagename>
+ <classname>org.tizen.w-voicerecorder</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.pedometer</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.exercise</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.heartrate</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.windicator</packagename>
+ <classname>org.tizen.windicator</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <idle-clock>
+ <packageName>org.tizen.w-idle-clock-shortcut2</packageName>
+ <className>org.tizen.w-idle-clock-shortcut2</className>
+ <screen>2</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </idle-clock>
+ <favorite>
+ <packagename>org.tizen.wnotification2</packagename>
+ <classname>org.tizen.wnotification2</classname>
+ <screen>3</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-logs2</packagename>
+ <classname>org.tizen.w-logs2</classname>
+ <screen>3</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-dialer2</packagename>
+ <classname>org.tizen.w-dialer2</classname>
+ <screen>3</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-contacts2</packagename>
+ <classname>org.tizen.w-contacts2</classname>
+ <screen>3</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <more-apps>
+ <packageName>org.tizen.w-launcher-app</packageName>
+ <className>org.tizen.w-launcher-app</className>
+ <screen>4</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </more-apps>
+ <favorite>
+ <packagename>org.tizen.clocksetting</packagename>
+ <classname>org.tizen.clocksetting</classname>
+ <screen>4</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-music-player</packagename>
+ <classname>org.tizen.w-music-player</classname>
+ <screen>4</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+</data>
diff --git a/home/res/ordering/default_favorite_apps_without_hr.xml b/home/res/ordering/default_favorite_apps_without_hr.xml
new file mode 100755
index 0000000..e171c14
--- /dev/null
+++ b/home/res/ordering/default_favorite_apps_without_hr.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <favorite>
+ <packagename>org.tizen.svoice-w</packagename>
+ <classname>org.tizen.svoice-w</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-music-player</packagename>
+ <classname>org.tizen.w-music-player</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-voicerecorder</packagename>
+ <classname>org.tizen.w-voicerecorder</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-camera-app</packagename>
+ <classname>org.tizen.w-camera-app</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.pedometer</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.exercise</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.sleep</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.windicator</packagename>
+ <classname>org.tizen.windicator</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <idle-clock>
+ <packageName>org.tizen.w-idle-clock-shortcut2</packageName>
+ <className>org.tizen.w-idle-clock-shortcut2</className>
+ <screen>2</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </idle-clock>
+ <favorite>
+ <packagename>org.tizen.wnotification2</packagename>
+ <classname>org.tizen.wnotification2</classname>
+ <screen>3</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-logs2</packagename>
+ <classname>org.tizen.w-logs2</classname>
+ <screen>3</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-dialer2</packagename>
+ <classname>org.tizen.w-dialer2</classname>
+ <screen>3</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-contacts2</packagename>
+ <classname>org.tizen.w-contacts2</classname>
+ <screen>3</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <more-apps>
+ <packageName>org.tizen.w-launcher-app</packageName>
+ <className>org.tizen.w-launcher-app</className>
+ <screen>4</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </more-apps>
+ <favorite>
+ <packagename>org.tizen.clocksetting</packagename>
+ <classname>org.tizen.clocksetting</classname>
+ <screen>4</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+</data>
diff --git a/home/res/ordering/default_favorite_apps_without_sleep.xml b/home/res/ordering/default_favorite_apps_without_sleep.xml
new file mode 100755
index 0000000..e040dbc
--- /dev/null
+++ b/home/res/ordering/default_favorite_apps_without_sleep.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <favorite>
+ <packagename>S8UVkC4ryF</packagename>
+ <classname>S8UVkC4ryF.WatchONWeb</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.svoice-w</packagename>
+ <classname>org.tizen.svoice-w</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.wfmd</packagename>
+ <classname>org.tizen.wfmd</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-voicerecorder</packagename>
+ <classname>org.tizen.w-voicerecorder</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.pedometer</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.exercise</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth</packagename>
+ <classname>org.tizen.shealth.heartrate</classname>
+ <screen>1</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.windicator</packagename>
+ <classname>org.tizen.windicator</classname>
+ <screen>1</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <idle-clock>
+ <packageName>org.tizen.w-idle-clock-shortcut2</packageName>
+ <className>org.tizen.w-idle-clock-shortcut2</className>
+ <screen>2</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </idle-clock>
+ <favorite>
+ <packagename>org.tizen.wnotification2</packagename>
+ <classname>org.tizen.wnotification2</classname>
+ <screen>3</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-logs2</packagename>
+ <classname>org.tizen.w-logs2</classname>
+ <screen>3</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-dialer2</packagename>
+ <classname>org.tizen.w-dialer2</classname>
+ <screen>3</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-contacts2</packagename>
+ <classname>org.tizen.w-contacts2</classname>
+ <screen>3</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <more-apps>
+ <packageName>org.tizen.w-launcher-app</packageName>
+ <className>org.tizen.w-launcher-app</className>
+ <screen>4</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </more-apps>
+ <favorite>
+ <packagename>org.tizen.w-camera-app</packagename>
+ <classname>org.tizen.w-camera-app</classname>
+ <screen>4</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.clocksetting</packagename>
+ <classname>org.tizen.clocksetting</classname>
+ <screen>4</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-music-player</packagename>
+ <classname>org.tizen.w-music-player</classname>
+ <screen>4</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+</data>
diff --git a/home/res/ordering/default_items.xml b/home/res/ordering/default_items.xml
new file mode 100755
index 0000000..bc2bdbf
--- /dev/null
+++ b/home/res/ordering/default_items.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <favorite>
+ <packagename>org.tizen.w-music-player.livebox</packagename>
+ <classname>org.tizen.w-music-player.livebox</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.shealth.dbox</packagename>
+ <classname>org.tizen.shealth.dbox</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-magazine.dbox.home</packagename>
+ <classname>org.tizen.w-magazine.dbox.home</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-calendar2.win</packagename>
+ <classname>org.tizen.w-calendar2.win</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>1</cellY>
+ </favorite>
+</data>
diff --git a/home/res/ordering/default_items_tts.xml b/home/res/ordering/default_items_tts.xml
new file mode 100755
index 0000000..f217e27
--- /dev/null
+++ b/home/res/ordering/default_items_tts.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+ <favorite>
+ <packagename>org.tizen.w-music-player.livebox</packagename>
+ <classname>org.tizen.w-music-player.livebox</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>0</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.w-contacts2.dbox</packagename>
+ <classname>org.tizen.w-contacts2.dbox</classname>
+ <screen>0</screen>
+ <cellX>0</cellX>
+ <cellY>1</cellY>
+ </favorite>
+ <favorite>
+ <packagename>org.tizen.weather.widget-today</packagename>
+ <classname>org.tizen.weather.widget-today</classname>
+ <screen>0</screen>
+ <cellX>1</cellX>
+ <cellY>0</cellY>
+ </favorite>
+</data>
diff --git a/home/res/ordering/settings.xml b/home/res/ordering/settings.xml
new file mode 100755
index 0000000..766226b
--- /dev/null
+++ b/home/res/ordering/settings.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Shortcutapp>
+ <item>
+ <AppName>@IDS_IDLE_BODY_APPS</AppName>
+ <PackageName>org.tizen.w-home</PackageName>
+ <ClassName>org.tizen.w-home</ClassName>
+ <ImageFileName>org.tizen.w-home.png</ImageFileName>
+ <SettingFileName>null</SettingFileName>
+ <IsAppWidget>false</IsAppWidget>
+ <PreLoad>true</PreLoad>
+ </item>
+</Shortcutapp>
+
diff --git a/home/res/po/CMakeLists.txt b/home/res/po/CMakeLists.txt
new file mode 100755
index 0000000..75c8adc
--- /dev/null
+++ b/home/res/po/CMakeLists.txt
@@ -0,0 +1,34 @@
+# for i18n
+
+SET(POFILES
+ ar.po as.po az.po bg.po bn.po ca.po cs.po
+ da.po de.po el_GR.po en.po en_PH.po en_US.po es_ES.po
+ es_US.po et.po eu.po fa.po fi.po fr.po fr_CA.po
+ ga.po gl.po gu.po he.po hi.po hr.po hu.po hy.po
+ id.po is.po it_IT.po ja_JP.po ka.po kk.po km.po
+ kn.po ko_KR.po ky_KG.po lo.po lt.po lv.po mk.po ml.po mn_MN.po
+ mr.po ms.po my.po nb.po ne.po nl.po or.po pa.po
+ pl.po pt_BR.po pt_PT.po ro.po ru_RU.po si.po
+ sk.po sl.po sq.po sr.po sv.po ta.po te.po tg_TJ.po th.po tk_TM.po tl.po tr_TR.po
+ uk.po ur.po uz.po vi.po zh_CN.po zh_HK.po zh_TW.po
+)
+
+SET(MSGFMT "/usr/bin/msgfmt")
+
+FOREACH(pofile ${POFILES})
+ SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile})
+ MESSAGE("PO: ${pofile}")
+ GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE)
+ GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE)
+ SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo)
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${moFile}
+ COMMAND ${MSGFMT} -o ${moFile} ${absPofile}
+ DEPENDS ${absPofile}
+ )
+ INSTALL(FILES ${moFile}
+ DESTINATION ${LOCALEDIR}/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo)
+ SET(moFiles ${moFiles} ${moFile})
+ENDFOREACH(pofile)
+
+ADD_CUSTOM_TARGET(home_po ALL DEPENDS ${moFiles})
diff --git a/home/res/po/ar.po b/home/res/po/ar.po
new file mode 100755
index 0000000..edb81c9
--- /dev/null
+++ b/home/res/po/ar.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "تطبيقات"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "التالي"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "عدم التكرار"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "حذف الكل"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "تتعذر الإزالة."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "انقر مع الاستمرار فوق عنصر واجهة المستخدم لنقله."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "تم تغيير الشاشة الرئيسية."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "جاري التحميل ..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "يتعذر تحميل البيانات. انقر لإعادة المحاولة."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "تتعذر إضافة التطبيق. لا تتوفّر مساحة إضافية على الشاشة الرئيسية."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "تتعذر إضافة التطبيق المصغر. لا تتوفّر مساحة إضافية على الشاشة الرئيسية."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "التطبيقات موجودة بالفعل."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "التطبيق المصغر موجود بالفعل."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "إلغاء"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "تم تغيير تخطيط الشاشة الرئيسية."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "سيُزال هذا التطبيق من الشاشة الرئيسية. لن يُحذف من الجهاز."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "إزالة التطبيق"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "إزالة التطبيق المصغر"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ستتم إزالة هذا التطبيق المصغر من الشاشة الرئيسية. لن يُحذف من الجهاز."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "وضع التوفير الفائق للطاقة"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "تتعذر إضافة التطبيق المصغر. تم الوصول إلى الحد الأقصى للتطبيقات المصغرة (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "تتعذر إضافة تطبيق. تم الوصول إلى أقصى عدد من التطبيقات (‎%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "تتعذر إضافة صفحة."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "الوضع العادي"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "تم إلغاء تفعيل وضع توفير الطاقة."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "تم تفعيل وضع توفير الطاقة."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "تطبيقات حديثة"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "تتعذر إضافة تطبيق. تم بلوغ الحدّ الأقصى لعدد التطبيقات (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "تتعذر إضافة تطبيق مصغّر. تم بلوغ الحدّ الأقصى لعدد التطبيقات المصغّرة (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "إزالة صفحة"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "سيتم إزالة هذه الصفحة ومحتواها."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "حذف"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "قم بإدخال البطاقة للنفاذ إلى خدمات الشبكة."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "وضع الحظر"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "مفعل"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "غير مفعل"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "تم نقل العنصر."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "انقر نقرًا مزدوجًا للإضافة."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "إضافة تطبيق مصغر"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "تمت إضافة العنصر."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "تمت إزالة العنصر."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "صفحة %1$d من %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "تتعذر إعادة ترتيب عناصر لوحة الإشعارات."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "إنها %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "إنها %d:%d صباحا."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "إنها %d:%d مساء."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d عناصر جديدة"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "تم بلوغ الحد الأقصى لعدد التطبيقات المصغرة (%s). احذف بعض التطبيقات المصغرة وحاول مرة أخرى."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "اسحب لليمين للعودة إلى الساعة."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "اسحب لليسار لعرض التطبيقات المصغرة."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "اسحب لليسار للعودة إلى الساعة."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "اسحب لليمين لعرض الإشعارات."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "هل تريد إلغاء تثبيت %s؟"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "تم بلوغ الحد الأقصى لعدد التطبيقات المصغرة (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "انقر نقرًا مزدوجًا لفتح علبة التطبيقات."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "عنصر واحد جديد"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "انقر نقراً مزدوجاً للتفعيل."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "الساعة"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "درجة حرارة الجهاز مرتفعة للغاية"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "قم بتنزيل تطبيقات ساعة Gear باستخدام الجهاز المحمول."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "أثناء النوم"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "الحصول على مزيد من التطبيقات"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "لا يتوفر هذا الإجراء بينما يكون توفير الطاقة + قيد التفعيل."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "لا يتوفر %s عندما يكون قارئ الشاشة قيد التفعيل."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "عدم الإزعاج"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "يتعذر تشغيل بيانات الهاتف المحمول عندما يكون وضع الطيران قيد التفعيل. قم بإلغاء تفعيل وضع الطيران وحاول مرة أخرى."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "اسحب للأعلى للعودة إلى الساعة."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "هذا كل شيء! استمتع باستخدام ساعة Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "شبكات المحمول"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "تحويل المكالمات إلى Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "بدء"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "خروج"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "مرحباً! انقر فوق الزر أدناه للتعرف على كيفية استخدام ساعة Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "تم طلب إلغاء التفعيل"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "تم طلب التفعيل"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "اسحب من أعلى الحافة للأسفل لرؤية رموز المؤشر على الساعة."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "اسحب للأعلى من أسفل الحافة لعرض التطبيقات على الساعة."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "موافق"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "اسحب من أعلى الحافة للأسفل للعودة."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "لتثبيت التطبيقات أو إلغاء تثبيتها، استخدم تطبيق Samsung Gear على جهازك المحمول."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "هذه هي البنية الأساسية للشاشة الرئيسية."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "خالي"
diff --git a/home/res/po/as.po b/home/res/po/as.po
new file mode 100755
index 0000000..6354485
--- /dev/null
+++ b/home/res/po/as.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "এপ্প্‌চ"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "পৰৱৰ্তী"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "ৱিজেট"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "পুনৰাই নকৰিব।"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "সকলো বিলোপ কৰক"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "আঁতৰাবলৈ অক্ষম৷"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ইয়াক লৈ যাবৰ বাবে এটা ৱিজেট টিপক আৰু ধৰি থাকক৷"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "গৃহ স্ক্ৰীণ সলনি কৰা হৈছে৷"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "লোড হৈ আছে..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ডাটা লোড কৰিবলৈ অক্ষম৷ পুনঃচেষ্টা কৰিবৰ বাবে টিপক।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "এপ্লিকেশ্বন যোগ কৰিবলৈ অক্ষম৷ গৃহ স্ক্ৰীণত কোনো কোঠা নাই৷"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ৱিজেট যোগ কৰিবলৈ অক্ষম৷ গৃহ স্ক্ৰীণত কোনো কোঠা নাই৷"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "এপ্লিকেশ্বন ইতিমধ্যে মজুত আছে৷"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ৱিজেট ইতিমধ্যে মজুত আছে৷"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "বাতিল"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "গৃহ স্ক্ৰীণ লেআউট পৰিৱৰ্তন হৈছে৷"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "গৃহ স্ক্রীণৰ পৰা এই এপ্লিকেশ্বন আঁতৰোৱা হ'ব৷ ইয়াক ডিভাইচৰ পৰা বিলোপ কৰিব নোৱাৰিব৷"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "এপ্লিকেশ্বন আঁতৰাওক"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ৱিজেট আঁতৰাওক"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "গৃহ স্ক্রীণৰ পৰা এই ৱিজেট আঁতৰোৱা হ'ব৷ ইয়াক ডিভাইচৰ পৰা বিলোপ কৰিব নোৱাৰিব৷"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "অত্যাধিক পাৱাৰ সংৰক্ষণ ম'ড"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ৱিজেট যোগ কৰিবলৈ অক্ষম৷ সৰ্বাধিক সংখ্যক ৱিজেট (%d) উপনীত হৈছে৷"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "এপ্লিকেশ্বন যোগ কৰাত অক্ষম৷ সৰ্বাধিক সংখ্যক এপ্লিকেশ্বনত (%d) উপনীত হৈছে৷"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "পৃষ্ঠা যোগ কৰিবলৈ অক্ষম৷"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "সাধাৰণ ম'ড"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "পাৱাৰ সংৰক্ষণ ম'ড অক্ষম কৰা হৈছে৷"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "পাৱাৰ সংৰক্ষণ ম'ড সক্ষম৷"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "শেহতীয়া এপ্প্‌চ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "এপ্লিকেশ্বন যোগ কৰিবলৈ অক্ষম৷ এপ্লিকেশ্বনৰ সৰ্বাধিক সংখ্যা (%s) ত উপনীত হৈছে৷"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ৱিজেট যোগ কৰিবলৈ অক্ষম৷ এপ্লিকেশ্বনৰ সৰ্বাধিক সংখ্যা (%s) ত উপনীত হৈছে৷"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "পৃষ্ঠা আঁতৰাওক"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "এই পৃষ্ঠাটো আৰু ইয়াৰ সমল আঁতৰোৱা হ'ব৷"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "আঁতৰাওক"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "নেটৱৰ্ক সেৱাত প্ৰৱেশ কৰিবলৈ SIM কাৰ্ড আন্তঃসংযোগ কৰক৷"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "অৱৰোধ ম'ড"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "অন"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "অফ"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "আইটেম লৈ যোৱা হৈছে৷"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "যোগ কৰিবলৈ দুবাৰ টিপক৷"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "ৱিডগেট যোগ কৰক"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "আইটেম যোগ কৰা হৈছে৷"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "আইটেম আঁতৰোৱা হৈছে৷"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "পৃষ্ঠা %2$d ৰ %1$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "অধিসূচনা ব'ৰ্ড আইটেমসমূহ পুনঃক্ৰম কৰিব নোৱাৰি৷"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "এইটো %1$d:%2$d হয়৷"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "এইটো %d:%d এম৷"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "এইটো %d:%d পিএম৷"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d নতুন আইটেমসমূহ"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "ৱিজেটৰ সৰ্বাধিক সংখ্যাত (%s)-ত উপনীত হৈছে৷ কিছুমান ৱিজেট বিলোপ কৰক আৰু পুনঃচেষ্টা কৰক৷"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ঘড়ীলৈ ঘুৰি যাবলৈ সোঁদিশলৈ ঘঁহাওক৷"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ৱিজেটসমূহ দৰ্শন কৰিবলৈ বাঁওদিশলৈ ঘঁহাওক৷"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ঘড়ীলৈ ঘুৰি যাবলৈ বাঁওদিশলৈ ঘঁহাওক৷"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "অধিসূচনাসমূহ দৰ্শন কৰিবলৈ সোঁদিশলৈ ঘঁহাওক৷"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "আনইনষ্টল %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ৱিজেটৰ সৰ্বাধিক সংখ্যাত (%s) উপনীত হৈছে৷"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "এপ ট্ৰে খুলিবলৈ দুবাৰ টিপক৷"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 টা নতুন আইটেম"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "সক্ষম কৰিবলৈ দুবাৰ টিপক৷"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ঘড়ী"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "ডিভাইচৰ তাপমাত্ৰা অতি বেছি৷"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "ম'বাইল ডিভাইচ ব্যৱহাৰ কৰি গীয়েৰ এপ্লিকেশ্বনসমূহ ডাউনলোড কৰক৷"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "শুই থকাৰ সময়ত"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "অধিক এপ্লিকেশ্বন লাভ কৰক"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "পাৱাৰ সংৰক্ষণ + সক্ষম হৈ থকাৰ অৱস্থাত কাৰ্য উপলব্ধ নহয়৷"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "স্ক্ৰীণ ৰিডাৰ সক্ষম কৰাৰ সময়ত %s উপলব্ধ নহয়৷"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "আমনি নকৰিব"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ফ্লাইট ম'ড সক্ষম হৈ থকাৰ সময়ত ম'বাইল ডাটা অন কৰিবলৈ অক্ষম৷ ফ্লাইট ম'ড অক্ষম কৰক আৰু পুনৰ চেষ্টা কৰক৷"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ঘড়ীলৈ পিছুৱাই যাবলৈ ওপৰলৈ ঘহাঁওক৷"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "সেইটোৱেই! গীয়েৰলৈ যাওক!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "ম'বাইল নেটৱৰ্ক"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "গীয়েৰলৈ কল ফৰৱাৰ্ড"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "আৰম্ভ কৰক"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "প্ৰস্থান"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "স্বাগতম! আপোনাৰ গীয়েৰ কেনেকৈ ব্যৱহাৰ কৰিব লাগে তাক জানিবলৈ তলৰ বুটামটো টিপক৷"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "অক্ষম কৰিবলৈ অনুৰোধিত"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "সক্ষম কৰিবলৈ অনুৰোধিত"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ঘড়ীত ইণ্ডিকেটৰ আইকনসমূহ চাবলৈ শীৰ্ষ কাষ তললৈ ঘহাঁওক৷"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ঘড়ীত এপ্প্‌চ দৰ্শন কৰিবলৈ তলৰ কাষ ওপৰলৈ ঘহাঁওক৷"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ঠিক"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "ঘূৰি যাবলৈ শীৰ্ষ কাষ তললৈ ঘহাঁওক৷"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "এপ্লিকেশ্বনসমূহ ইনষ্টল বা আনইনষ্টল কৰিবলৈ, আপোনাৰ ম'বাইল ডিভাইচত চেমচাং গীয়েৰ এপ্লিকেশ্বন ব্যৱহাৰ কৰক৷"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "এইটো হ'ল গৃহ স্ক্ৰীণৰ প্ৰধান গঠন৷"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "খালী"
diff --git a/home/res/po/az.po b/home/res/po/az.po
new file mode 100755
index 0000000..567b850
--- /dev/null
+++ b/home/res/po/az.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Proqramlar"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Növbəti"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Qurğu"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Təkrar etmə"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Hamısını sil"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Silmək mümkün deyil."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Yerini dəyişmək üçün piktoqrama vurub saxlayın."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Əsas ekran dəyişib."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Yüklənir..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Məlumatları yükləmək mümkün deyil. Yenidən cəhd etmək üçün vurun"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Proqram əlavə etmək mümkün olmadı. Əsas ekranda artıq yer yoxdur."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Piktoqram əlavə etmək mümkün olmadı. Əsas ekranda artıq yer yoxdur."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Proqram artıq mövcuddur."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Piktoqram artıq mövcuddur."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Ləğv et"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Əsas ekranın tərtibatı dəyişdirildi."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Bu proqram əsas ekrandan silinəcəkdir. O, cihazdan silinməyəcək."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Proqramı sil"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Piktoqramı sil"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Bu piktoqram əsas ekrandan silinəcəkdir. O, cihazdan silinməyəcək."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra enerji qən rejimi"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Piktoqram əlavə etmək mümkün deyil. Piktoqramların sayı maksimuma (%d) çatmışdır."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Proqram əlavə etmək mümkün olmadı. Proqramların sayı maksimuma (%d) çatmışdır."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Səhifə əlavə etmək mümkün deyil."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normal rejim"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Enerjiyə qənaət rejimi qeyri-aktiv edildi."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Enerjiyə qənaət rejimi aktivləşdirilmişdir."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Son proqr"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Proqram əlavə etmək mümkün olmadı. Proqramların sayı maksimuma (%s) çatmışdır."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Piktoqram əlavə etmək mümkün deyil. Piktoqramların sayı maksimuma (%s) çatmışdır."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Səhifəni sil"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Bu səhifə və onun məzmunu silinəcək."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Sil"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Şəbəkə xidmətlərinə daxil olmaq üçün SİM kartı daxil edin."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Bloklama rejimi"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Qoş"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Söndür"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elementin yeri dəyişdirildi."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Əlavə etmək üçün iki dəfə vur."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Piktoqram əlavə edin"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Element əlavə olundu."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Element silindi."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Səhifə %1$d / %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Bildiriş panel elementlərini yenidən sıralamaq olmur."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Belədir: %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Saat %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Saat %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d yeni element"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Vidjetlərin sayı maksimuma (%s) çatdı. Bəzi vidjetləri silin və yenidən cəhd edin."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Saata dönmək üçün sağa sürüşdürün."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Vidjetə baxmaq üçün sola sürüşdürün."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Saata dönmək üçün sola sürüşdürün."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Bild bax üçün sağa sürüş."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s silinsin?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Vidjetlərin sayı maksimuma (%s) çatmışdır."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Proqram panelini açmaq üçün iki dəfə vurun."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 yeni element"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Aktiv etmək üçün iki dəfə vur."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Saat"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Cihazın temperaturu olduqca yüksəkdir."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Mobil cihaz vasitəsilə Gear proqramlarını yükləyin."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Yatan\nzaman"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Daha çox proqram əldə et"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Enerjiyə qənaət+ aktiv olduqda əməliyyat mümkün olmur."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Ekran oxuyucusu aktiv olan zaman %s mövcud olmur."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Narahat etmə"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Uçuş rej akt olan zaman Mobil tarifi yand olmadı. Uçuş rej q-akt et və yen cəhd et."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Saata qayıtmaq üçün yuxarı sürüşdürün."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Budur! Gear-a keç!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobil şəbəkələr"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Zən. Gear-a yönl."
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Başla"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Çıx"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Xoş gəldiniz! Gear-dan ist qayd öyrən üçün aşağ.düyməyə vur."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Söndürmək sorğusu verildi"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Yandırmaq sorğusu verildi"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Saatda niş görmək üçün yuxarı kənar hiss aşağı sürüşdr."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Proqr saatda baxmaq üçün kənarda aşağ yuxarıya sürüşdür."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Geri qayıtmaq üçün yuxarı kənar hissəni aşağı sürüşdür."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Proqramları quraşdırmaq və ya pozmaq üçün mobil cihazınızda Samsung Gear proqramından istifadə edin."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Bu, əsas ekranın əsas strukturudur."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Boşdur"
diff --git a/home/res/po/bg.po b/home/res/po/bg.po
new file mode 100755
index 0000000..33d0666
--- /dev/null
+++ b/home/res/po/bg.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Приложения"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Следващ"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Визуален елемент"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Не повтаряй"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Изтрий всички"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Не може да се премахне."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Чукнете и задръжте виз. ел., за да го преместите."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Началният екран е променен."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Зареждане"
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Данните не могат да се заредят. Чукнете, за да опитате отново."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Приложението не може да се добави. Няма повече място в началния екран."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Визуалният елемент не може да се добави. Няма повече място в началния екран."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Приложението вече съществува."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Визуалният елемент вече съществува."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Отказ"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Оформлението на началния екран е променено."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Това приложение ще бъде премахнато от началния екран. То няма да бъде изтрито от устройството."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Прем. на приложение"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Прем. на виз. елем."
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Този визуален елемент ще бъде премахнат от началния екран. Той няма да бъде изтрит от устройството."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Режим ултра пест. енергия"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Визуалният елемент не може да се добави. Достигнат е максималният брой визуални елементи (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Приложението не може да се добави. Достигнат е максималният брой приложения (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Страницата не може да се добави."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Нормален режим"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Режимът на пестене на енергия е деактивиран."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Режимът на пестене енергия е активиран."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Скор. прил."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Неуспешно добавяне на приложение. Достигнат е максималният брой приложения (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Визуалният елемент не може да бъде добавен. Достигнат е максималният брой визуални елементи (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Премахване на страницата"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Тази страница и съдържанието й ще бъдат премахнати."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Премаxни"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Поставете SIM картата, за да получите достъп до услуги на мрежата."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Режим на блокиране"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Включено"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Изключено"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Елементът е преместен."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Чукнете двукратно, за да добавите."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Добавяне на визуален елемент"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Елементът е добавен."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Елементът е премахнат."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Страница %1$d от %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Елементите от таблото за уведомления не може да се пренаредят."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Сега е %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Сега е %d:%d часа пр.об."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Сега е %d:%d часа сл.об."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d нови елемента"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Достигнат е максималният брой уиджети (%s). Изтрийте някои уиджети и опитайте отново."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Плъз. надясно за назад към часовника."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Плъзнете наляво за още уиджети."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Плъз. наляво за обратно към часовника."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Плъзнете надясно за преглед уведомл."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Деинсталиране на %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Достигнат е максималният брой уиджети (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Докоснете двукратно, за да отворите областта с приложения."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 нов елемент"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Докоснете двукратно, за да активирате."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Часовник"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Температурата на устройството е твърде висока."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Изтеглете приложения за Gear чрез мобилно устройство."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "По време на сън"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Получаване на още прил."
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Действието не е налично, докато „Пестене на енергия +“ е активирано."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s не е налично, докато Екранен четец е активирано."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Не безпокойте"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Моб. данни не може да се вкл. при акт. режим Полет. Деакт. режим Полет и опитайте пак."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Плъз. нагоре за обратно към часовника."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Това е! Съединете се с Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Мобилни мрежи"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Преп.пов. до Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Старт"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Изход"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Привет! Док. бутона долу, за да научите как се ползва Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Искане за деактивиране"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Искане за активиране"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Плъз. горния край надолу за индикаторни икони на часовн."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Плъзн. долния край нагоре, за да видите прил. на часов."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Плъзнете горния край надолу, за да се върнете назад."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "За да инсталирате или деинсталирате приложения, използвайте приложението Samsung Gear на мобилното си устройство."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Това е основната структура на началния екран."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Празно"
diff --git a/home/res/po/bn.po b/home/res/po/bn.po
new file mode 100755
index 0000000..818f64d
--- /dev/null
+++ b/home/res/po/bn.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "অ্যাপগুলি"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "পরে"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "উইজেট"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "পুনরাবৃত্তি করবেন না।"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "সমস্ত মুছুন"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "অপসারণ করতে অক্ষম।"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "উইজেট সরাতে সেটি ট্যাপ করে ধরে থাকুন।"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "হোম স্ক্রিন পরিবর্তিত।"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "লোড হচ্ছে..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "তথ্য লোড করতে অক্ষম৷ পুনরায় চেষ্টা করতে ট্যাপ করুন৷"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "অ্যাপ্লিকেশন যোগ করতে অক্ষম। হোম স্ক্রিনে আর রুম নেই।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "উইজেট যোগ করতে অক্ষম। হোম স্ক্রিনে আর রুম নেই।"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "অ্যাপ্লিকেশন ইতিমধ্যে বিদ্যমান।"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "উইজেট ইতিমধ্যে বিদ্যমান।"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "বাতিল"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "হোম স্ক্রিনের বিন্যাস পরিবর্তিত হয়েছে।"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "হোম স্ক্রিন থেকে এই অ্যাপ্লিকেশনটি অপসারণ করা হবে। এটি ডিভাইস থেকে মোছা হবে না।"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "অ্যাপ্লিকেশন সরান"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "উইজেট অপসারণ করুন"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "হোম স্ক্রিন থেকে এই উইজেটটি অপসারণ করা হবে। এটি ডিভাইস থেকে মোছা হবে না।"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "অতিরিক্ত পাওয়ার সাশ্রয় মোড"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "উইজেট যোগ করতে অক্ষম। উইজেটগুলির সর্বাধিক সংখ্যায় (%d) পৌঁছেছে।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "অ্যাপ্লিকেশন যোগ করতে অক্ষম৷ অ্যাপ্লিকেশনের সর্বাধিক সংখ্যায় (%d) পৌঁছেছে৷"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "পৃষ্ঠা যোগ করতে অক্ষম।"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "সাধারণ মোড"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "পাওয়ার সাশ্রয় মোড অক্ষম হয়েছে।"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "পাওয়ার সাশ্রয় মোড সক্ষম হয়েছে।"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "সাম্প্রতিক অ্যাপগুলি"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "অ্যাপ্লিকেশন যোগ করতে অক্ষম। অ্যাপ্লিকেশনের সর্বাধিক সংখ্যায় (%sটি) পৌঁছেছে।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "উইজেট যোগ করতে অক্ষম। উইজেটের সর্বাধিক সংখ্যায় (%sটি) পৌঁছেছে।"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "পৃষ্ঠা অপসারণ করুন"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "এই পৃষ্ঠাটি এবং এর সামগ্রী অপসারিত হবে।"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "অপসারণ"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "নেটওয়ার্ক পরিষেবা অ্যাক্সেস করার জন্যে SIM কার্ড প্রবেশ করান।"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "অবরুদ্ধকারী মোড"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "চালু"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "বন্ধ"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "আইটেম সরানো হয়েছে৷"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "যোগ করতে দুবার ট্যাপ করুন।"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "উইজেট যোগ করুন"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "আইটেম যুক্ত হয়েছে৷"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "আইটেম অপসারিত হয়েছে৷"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d-এর মধ্যে %1$d পৃষ্ঠা"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "বিজ্ঞপ্তি বোর্ড আইটেমগুলি পুনরায় ক্রমসজ্জিত করতে পারা যায় না।"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "এটি %1$d:%2$d।"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "এখন %d:%d AM।"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "এখন %d:%d PM।"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%dটি নতুন আইটেম"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "উইজেটগুলির সর্বাধিক সংখ্যায় (%sটি) পৌঁছেছে। কিছু আইটেম মুছুন এবং পুনরায় চেষ্টা করুন।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ঘড়িতে ফিরে যেতে ডানে সোয়াইপ করুন।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "উইজেটগুলি দেখতে বামে সোয়াইপ করুন।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ঘড়িতে ফিরে যেতে বামে সোয়াইপ করুন।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "বিজ্ঞপ্তিগুলি দেখতে ডানে সোয়াইপ করুন।"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s আনইনস্টল করবেন?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "উইজেটগুলির সর্বাধিক সংখ্যায় (%s) পৌঁছেছে।"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "অ্যাপ ট্রেটি খুলতে দুবার ট্যাপ করুন।"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1টি নতুন আইটেম"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "সক্ষম করতে দুবার ট্যাপ করুন।"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ঘড়ি"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "ডিভাইসের তাপমাত্রাটি অত্যন্ত বেশি।"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "মোবাইল ডিভাইস ব্যবহার করে গিয়ার অ্যাপ্লিকেশনগুলি ডাউনলোড করুন।"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "ঘুমানোর সময়"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "আরও অ্যাপ্লিকেশন পান"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "পাওয়ার সাশ্রয় + সক্ষম থাকাকালীন ক্রিয়াকলাপ সুলভ নেই।"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "স্ক্রিন রিডার সক্ষম অবস্থায় %s সুলভ নয়।"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "বিরক্ত করবেন না"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "বিমান মোড সক্ষম থাকলে মোবাইল তথ্য চালু করতে অক্ষম। বিমান মোড অক্ষম করুন ও আবার চেষ্টা করুন।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ঘড়িতে ফিরে যেতে উপরের দিকে সোয়াইপ করুন।"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "ব্যাস এতটাই! গিয়ার উপভোগ করুন!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "মোবাইল নেটওয়ার্কগুলি"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "গিয়ারে কল অগ্রবর্তী"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "শুরু"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "প্রস্থান"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "স্বাগত! কীভাবে আপনার গাড়ি ব্যবহার করতে হয় তা জানতে নীচের বোতামটি ট্যাপ করুন।"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "অক্ষম করার জন্য অনুরোধ করা হয়েছে"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "সক্ষম করার জন্য অনুরোধ করা হয়েছে"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ঘড়িগুলিতে সূচক আইকনগুলি দেখতে শীর্ষের প্রান্তটি নীচের দিকে সোয়াইপ করুন।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ঘড়িতে অ্যাপস দেখতে নীচের প্রান্তটি থেকে উপরে সোয়াইপ করুন।"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ওকে"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "ফিরে যেতে শীর্ষের প্রান্তটি নীচের দিকে সোয়াইপ করুন।"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "অ্যাপ্লিকেশনগুলি ইনস্টল বা আনইনস্টল করতে আপনার মোবাইল ডিভাইসে Samsung Gear অ্যাপ্লিকেশনটি ব্যবহার করুন।"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "এটি হোম স্ক্রিনের প্রধান কাঠামো।"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ফাঁকা"
diff --git a/home/res/po/ca.po b/home/res/po/ca.po
new file mode 100755
index 0000000..7571958
--- /dev/null
+++ b/home/res/po/ca.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplicacions"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Seg"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "No repetir"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Esborrar tot"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "No es pot eliminar"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Mantenir tocat un widget per moure'l"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Ha canviat la pantalla d'inici"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Carregant..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "No es poden carregar les dades. Toqui per tornar-ho a intentar."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "No es pot afegir l'aplicació. No hi ha més lloc a la pantalla d'inici."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "No es pot afegir el widget. No hi ha més lloc a la pantalla d'inici."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "L'aplicació ja existeix."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "El widget ja existeix."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cancel·lar"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "S'ha canviat el disseny de la pantalla d'inici."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "S'eliminarà aquesta aplicació de la pantalla d'inici. No s'esborrarà del dispositiu."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Eliminar aplicació"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Eliminar widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "S'eliminarà aquest widget de la pantalla d'inici. No s'esborrarà del dispositiu."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Mode estalvi ultra energ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "No es pot afegir el widget. S'ha assolit el nombre màxim de widgets (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "No es pot afegir l'aplicació. S'ha assolit el nombre màxim d'aplicacions (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "No es pot afegir pàgina."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Mode normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Mode d'estalvi d'energia deshabilitat."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Mode d'estalvi d'energia habilitat."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Aplic recent"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "No es pot afegir l'aplicació. S'ha assolit el nombre màxim d'aplicacions (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "No es pot afegir el widget. S'ha assolit el nombre màxim de widgets (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Eliminar pàgina"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "S'eliminarà aquesta pàgina i el seu contingut."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Eliminar"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Insereixi la targeta SIM per a accedir als serveis de xarxa"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Mode de bloqueig"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Activat"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Desactivat"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Element mogut."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Toqui dos cops per afegir."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Afegir widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Element afegit."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Element esborrat."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Pàgina %1$d de %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "No es pot canviar l'ordre dels elements de la pissarra de notificacions."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Són les %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Són les %d:%d AM"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Són les %d:%d PM"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d elements nous"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "S'ha assolit el nombre màxim de widgets (%s). Esborri'n alguns i torni-ho a intentar."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Desplaci dreta per tornar a rellotge."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Desplaci a esquerra per veure widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Desplaci esq per tornar a rellotge."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Desplaci a dreta per veure notific."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Desinstal·lar %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "S'ha assolit el nombre màxim de widgets (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Toqui dos cops per obrir la safata d'aplicacions."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 element nou"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Toqui dues vegades per habilitar."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Rellotge"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "La temperatura del dispositiu és massa alta"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Descarregar aplicacions de Gear amb el dispositiu mòbil."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Mentre dorm"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Obtenir més aplicacions"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Acció no disponible amb Estalvi energia + habilitat."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s no està disponible mentre el Lector de pantalla estigui habilitat."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "No molestar"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "No pot activar dades mòbils amb mode Vol habilitat. Deshab mode Vol i torni a intentar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Desplaci amunt per tornar a rellotge."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Ja està! Entri a Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Xarxes mòbils"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Desv truc a Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Iniciar"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Sortir"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Benvingut! Toqui el botó següent per informació sobre Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "S'ha sol·licitat que es deshabiliti"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "S'ha sol·licitat que s'habiliti"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Desplaci's cap avall per veure icon d'indic al rellotge."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Desplaci's cap amunt per veure aplicacions al rellotge."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "Acceptar"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Desplaci's avall des de dalt per tornar."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Per instal·lar o desinstal·lar aplicacions, utilitzi l'aplicació Samsung Gear al dispositiu mòbil."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Aquesta és l'estructura principal de la pantalla d'inici."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Buit"
diff --git a/home/res/po/cs.po b/home/res/po/cs.po
new file mode 100755
index 0000000..fac8b48
--- /dev/null
+++ b/home/res/po/cs.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikace"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Další"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Neopakovat"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Odstranit vše"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Nelze odstranit."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Klepnutím a podržením nástroje ho přesunete."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Domovská obrazovka byla změněna."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Nahrávám..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Data nelze načíst. Klepnutím opakujte akci."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Aplikaci nelze přidat. Na domovské obrazovce již není místo."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nástroj nelze přidat. Na domovské obrazovce již není místo."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikace již existuje."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Nástroj již existuje."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Zrušit"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Rozložení domovské obrazovky bylo změněno."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Aplikace bude odebrána z domovské obrazovky, ale nebude odstraněna ze zařízení."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Odebrat aplikaci"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Odebrat nástroj"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Nástroj bude odebrán z domovské obrazovky, ale nebude odstraněn ze zařízení."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra úsporný režim"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Nástroj nelze přidat. Bylo dosaženo maximálního počtu nástrojů (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Aplikaci nelze přidat. Bylo dosaženo maximálního počtu aplikací (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Nelze přidat stránku."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normální režim"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Úsporný režim byl vypnut."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Byl zapnut úsporný režim."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Posl. aplik."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Aplikaci nelze přidat. Bylo dosaženo maximálního počtu aplikací (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Nástroj nelze přidat. Bylo dosaženo maximálního počtu nástrojů (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Odebrat stránku"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Tato stránka a její obsah budou odebrány."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Odebrat"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Chcete-li používat síťové služby, vložte SIM kartu."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Režim blokování"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Zapnout"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Vypnout"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Položka byla přesunuta."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Poklepáním přidáte."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Přidat nástroj"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Položka byla přidána."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Položka byla odebrána."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Stránka %1$d z %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Pořadí položek na oznamovacím panelu nelze změnit."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Je %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Je %d:%d dop."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Je %d:%d odp."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d nových položek"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Bylo dosaženo maximálního počtu nástrojů (%s). Odstraňte některé nástroje a zkuste to znovu."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Přejetím doprava se vraťte na hodiny."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Přejetím doleva zobrazíte nástroje."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Přejetím doleva se vraťte na hodiny."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Přejetím doprava zobrazíte oznámení."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Odinstalovat %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Bylo dosaženo maximálního počtu nástrojů (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Poklepáním otevřete panel aplikací."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nová položka"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Poklepáním zapnete."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Hodiny"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Teplota zařízení je příliš vysoká."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Stáhněte si aplikace Gear pomocí mobilního zařízení."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Při spánku"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Získat další aplikace"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Když je zapnutý Úsporný režim +, akce není dostupná."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s není k dispozici, když je zapnutá Čtečka displeje."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Nerušit"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "V režimu Letadlo není možné zapnout Mobilní data. Vypněte režim Letadlo a opakujte akci."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Přejetím nahoru se vraťte na hodiny."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "To je ono! Nadchněte se pro Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobilní sítě"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Př. hov. do Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Konec"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Vítejte! Klepněte na tl. a dozvíte se, jak používat Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Požadováno vypnutí"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Požadováno zapnutí"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Přejetím od hor. okr. zobrazíte na hod. ikony indik."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Přejetím od dolního okraje zobrazíte apl. v hodinách."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Přejetím od horního okraje dolů se vrátíte zpět."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Pro nainstalování nebo odinstalování aplikací použijte aplikaci Samsung Gear v mobilním zařízení."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Toto je hlavní struktura domovské obrazovky."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Prázdný"
diff --git a/home/res/po/da.po b/home/res/po/da.po
new file mode 100755
index 0000000..25bce26
--- /dev/null
+++ b/home/res/po/da.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Apps"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Næste"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Gentag ikke."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Slet alt"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Kan ikke fjerne."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Tryk og hold en widget nede for at flytte den."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Startskærm ændret."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Indlæser data ..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Kan ikke indlæse data. Tap for at prøve igen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Kunne ikke tilføje program. Ikke mere plads på Startskærmen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Kunne ikke tilføje widget. Ikke mere plads på Startskærmen."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Applikationen findes allerede."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget findes allerede."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Annullér"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Layout for startskærm ændret."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Dette program vil blive fjernet fra Startskærmen. Det vil ikke blive slettet fra enheden."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Fjern applikation"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Fjern widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Denne widget vil blive fjernet fra Startskærmen. Den vil ikke blive slettet fra enheden."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultrastrømbesp. tilstand"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Kan ikke tilføje widget. Det maksimale antal widgets (%d) er nået."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Kunne ikke tilføje program. Det maksimale antal programmer (%d) er nået."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Kunne ikke tilføje side."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normal tilstand"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Strømsparetilstand deaktiveret."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Strømbesparende tilstand er aktiveret."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Seneste apps"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Kan ikke tilføje applikation. Det maksimale antal applikationer (%s) er nået."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Kan ikke tilføje widget. Det maksimale antal widgets (%s) er nået."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Fjern side"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Denne side og dens indhold vil blive fjernet."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Fjern"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Indsæt SIM-kortet for at få adgang til netværkstjenesterne."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blokeringstilstand"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Til"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Fra"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Element flyttet."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Dobbeltap for at tilføje."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Tilføj widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Element tilføjet."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Element fjernet."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Side %1$d af %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Det er ikke muligt at flytte rundt på elementer i informationspanelet."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Den er %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Den er %d:%d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Den er %d:%d."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d nye elementer"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Det maksimale antal widgets (%s) er nået. Slet nogle widgets, og prøv igen."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Stryg mod h. for at gå tilbage til ur."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Stryg mod venstre for at se widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Stryg mod v. for at gå tilbage til ur."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Stryg mod højre for at se meddelelser."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Afinstallér %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Det maksimale antal widgets er blevet nået (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Dobbelttryk for at åbne app-bakken."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nyt element"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Dobbelttryk for at aktivere."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Ur"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Enhedens temperatur er for høj."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Download Gear-applikationer med en mobilenhed."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Når du sover"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Hent flere applikationer"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Handlingen er ikke tilgængelig, mens Strømbesparelse + er aktiveret."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s er ikke tilgængelig, når Skærmlæser er aktiveret."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Forstyr ikke"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Kan ikke slå Mobile data til, når Flytilstand er aktiv. Deaktiver Flytilst., og prøv igen."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Stryg opad for at gå tilbage til ur."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Sådan! Kom op i Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobile netværk"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Viderest. t. Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Afslut"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Velkommen! Tryk på knappen for at lære at bruge dit Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Anmodede om at deaktivere"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Anmodede om at aktivere"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Stryg øverste kant nedad, og se indikatorikoner på uret."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Stryg den nederste kant opad for at se apps på uret."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Stryg den øverste kant nedad for at gå tilbage."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Vil du installere eller afinstallere applikationer, skal du bruge applikationen Samsung Gear på din mobilenhed."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Dette er startskærmens overordnede opbygning."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Tom"
diff --git a/home/res/po/de.po b/home/res/po/de.po
new file mode 100755
index 0000000..0f6a86e
--- /dev/null
+++ b/home/res/po/de.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Menü"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Weiter"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Nicht wiederholen"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Alles löschen"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Entfernen nicht möglich"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Zum Verschieben des Widgets tippen und halten."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Startbildschirm geändert"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Lädt..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Daten konnten nicht geladen werden. Für erneuten Versuch tippen"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Anwendung kann nicht hinzugefügt werden. Kein Platz mehr auf dem Startbildschirm."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Widget kann nicht hinzugefügt werden. Kein Platz mehr auf dem Startbildschirm."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Anwendung ist bereits vorhanden."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget bereits vorhanden."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Abbrechen"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Layout des Startbildschirms geändert."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Diese Anwendung wird vom Startbildschirm entfernt. Sie wird nicht vom Gerät gelöscht."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Anwendung entfernen"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Widget entfernen"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Dieses Widget wird vom Startbildschirm entfernt. Es wird nicht vom Gerät gelöscht."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra-Energiesparmodus"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Widget konnte nicht hinzugefügt werden. Maximale Anzahl von Widgets (%d) erreicht."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Anwendung konnte nicht hinzugefügt werden. Maximale Anzahl an Anwendungen (%d) erreicht."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Seite kann nicht hinzugefügt werden."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normalmodus"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Energiesparmodus deaktiviert."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Energiesparmodus aktiviert."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Akt. Apps"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Anwendung konnte nicht hinzugefügt werden. Maximale Anzahl an Anwendungen (%s) erreicht."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Widget konnte nicht hinzugefügt werden. Maximale Anzahl an Widgets (%s) erreicht."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Seite entfernen"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Diese Seite und der zugehörige Inhalt werden entfernt."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Entfernen"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "SIM-Karte einsetzen, um auf Netzdienste zuzugreifen"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Ruhemodus"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Ein"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Aus"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Element verschoben."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Zum Hinzufügen zweimal tippen."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Widget hinzufügen"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Element hinzugefügt."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Element entfernt."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Seite %1$d von %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Elemente im Benachrichtigungsfeld können nicht neu angeordnet werden."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Es ist %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Es ist %d:%d AM"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Es ist %d:%d PM"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d neue Elemente"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Die max. Anzahl von Widgets (%s) ist erreicht. Löschen Sie einige und versuchen Sie es erneut."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Zurück zur Uhr: Nach rechts streichen."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Widgets zeigen: Nach links streichen."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Zurück zur Uhr: Nach links streichen."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Benachrichtigungen: Nach rechts streichen."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s deinstallieren?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Maximale Anzahl von Widgets (%s) erreicht."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Zweimal tippen, um das App-Fach zu öffnen."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 neues Element"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Zum Aktivieren zweimal tippen."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Uhr"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Die Gerätetemperatur ist zu hoch."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Gear-Anwendungen über Mobilgerät herunterladen."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Beim Schlafen"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Weitere Anw. herunterl."
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Wenn der Energiesparmodus + aktiviert ist, ist die Aktion nicht verfügbar."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s ist nicht verfügbar, wenn das Bildschirmleseprogramm aktiviert ist."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Nicht stören"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Mobile Daten sind im Offline-Modus nicht verfügbar. Modus deaktiv. und erneut versuchen."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Zurück zur Uhr: Nach oben streichen."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Herzlich willkommen! Viel Spass mit der Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobiles Netzwerk"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Anr. zur Gear weiterl."
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Beenden"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Willkommen! Unten tippen, um mehr über die Gear zu erfahren."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Deaktivieren angefordert"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Aktivieren angefordert"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Abwärts streichen, um Anzeigesymbole auf Uhr anzuzeigen."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Von Unterkante hochstreichen, um die Apps anzuzeigen."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Von Oberkante hinunterstreichen, um zurückzugehen."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "Auf der Uhr von der oberen Kante nach unten streichen, um Anzeigesymbole anzuzeigen."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "Auf der Uhr von der unteren Kante nach oben streichen, um Apps anzuzeigen."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "Streichen Sie von der Uhr aus nach rechts, um Benachrichtigungen anzuzeigen."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Nach links streichen, um zur Uhr zurückzukehren."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "Streichen Sie von der Uhr aus nach links, um die Widgets anzuzeigen."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Nach rechts streichen, um zur Uhr zurückzukehren."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "Streichen Sie von der Uhr aus nach oben, um Apps anzuzeigen."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Nach unten streichen, um zur Uhr zurückzukehren."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "Streichen Sie von der Uhr aus nach unten, um die Momente-Leiste anzuzeigen."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Nach oben streichen, um zur Uhr zurückzukehren."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "Die Uhr ist Ihr Startbildschirm. Um loszulegen, tippen Sie unten."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Zum Installieren und Deinstallieren von Anwendungen nutzen Sie die Samsung Gear-Anwendung auf Ihrem Mobilgerät."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Dies ist die Hauptstruktur des Startbildschirms."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "Dies ist das Layout Ihres Startbildschirms."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Leer"
diff --git a/home/res/po/el_GR.po b/home/res/po/el_GR.po
new file mode 100755
index 0000000..394f58c
--- /dev/null
+++ b/home/res/po/el_GR.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Εφαρμογές"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Επόμενο"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Όχι επανάλ."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Διαγραφή όλων"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Δεν είναι δυνατή η αφαίρεση."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Πατ. παρατετ. ένα widget για να το μετακινήσετε."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Η αρχική οθόνη άλλαξε."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Φόρτωση..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Δεν είναι δυνατή η φόρτωση δεδομένων. Πατήστε για να δοκιμάσετε ξανά."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Δεν είναι δυνατή η προσθήκη της εφαρμογής. Δεν υπάρχει χώρος στην αρχική οθόνη."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Δεν είναι δυνατή η προσθήκη του widget. Δεν υπάρχει χώρος στην αρχική οθόνη."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Η εφαρμογή υπάρχει ήδη."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Το widget υπάρχει ήδη."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Ακύρωση"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Η διάταξη της αρχικής οθόνης άλλαξε."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Αυτή η εφαρμογή θα καταργηθεί από την αρχική οθόνη. Δεν πρόκειται να διαγραφεί από τη συσκευή."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Κατάργηση εφαρμογής"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Κατάργηση widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Αυτό το widget θα καταργηθεί από την αρχική οθόνη. Δεν πρόκειται να διαγραφεί από τη συσκευή."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Λειτ. εξοικ. ενέργ. Ultra"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Δεν είναι δυνατή η προσθήκη widget. Συμπληρώθηκε ο μέγιστος αριθμός widget (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Δεν είναι δυνατή η προσθήκη εφαρμογής. Συμπληρώθηκε ο μέγιστος αριθμός εφαρμογών (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Δεν είναι δυνατή η προσθήκη σελίδας."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Κανονική λειτουργία"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Η λειτουργία εξοικονόμησης ενέργειας απενεργοποιήθηκε."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Η λειτουργία εξοικονόμησης ενέργειας ενεργοποιήθηκε."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Πρόσφ. εφ."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Δεν είναι δυνατή η προσθήκη εφαρμογής. Συμπληρώθηκε ο μέγιστος αριθμός εφαρμογών (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Δεν είναι δυνατή η προσθήκη widget. Συμπληρώθηκε ο μέγιστος αριθμός widget (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Κατάργηση σελίδας"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Αυτή η σελίδα και το περιεχόμενό της θα καταργηθεί."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Κατάργηση"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Εισάγετε την κάρτα SIM για παροχή πρόσβασης στις υπηρεσίες δικτύου."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Λειτουργία αποκλεισμού"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Ενεργό"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Ανενεργό"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Το στοιχείο μετακινήθηκε."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Πατήστε δύο φορές για προσθήκη."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Προσθήκη widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Προσθήκη στοιχείου."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Το στοιχείο καταργήθηκε."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Σελίδα %1$d από %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Δεν είναι δυνατή η αναδιάταξη στοιχείων του πίνακα ειδοποιήσεων."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Η ώρα είναι %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Η ώρα είναι %d:%d πμ."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Η ώρα είναι %d:%d μμ."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d νέα στοιχεία"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Συμπληρώθηκε ο μέγιστος αριθμός widget (%s). Διαγράψτε μερικά widget και προσπαθήστε ξανά."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Κάντε σάρ. δεξιά για επισ. στο ρολόι."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Κάντε σάρ. αριστ. για να δείτε widget."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Κάντε σάρ. αριστ. για επισ. στο ρολόι."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Κάντε σάρωση δεξιά για να δείτε ειδοπ."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Κατάργηση της εγκατάστασης του %s;"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Συμπληρώθηκε ο μέγιστος αριθμός widget (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Πατήστε δύο φορές για να ανοίξετε τη γραμμή εφαρμογών."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 νέο στοιχείο"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Πατήστε δύο φορές για ενεργοποίηση."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Ρολόι"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Η θερμοκρασία της συσκευής είναι υπερβολικά υψηλή."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Κάντε λήψη εφαρμογών Gear χρησιμοποιώντας την κινητή συσκευή."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Κατά τον ύπνο"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Λήψη περισσ. εφαρμογών"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Η ενέργεια δεν είναι διαθέσιμη όταν η «Εξοικονόμηση ενέργειας +» είναι ενεργοποιημένη."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Η λειτουργία %s δεν είναι διαθέσιμη όταν είναι ενεργοποιημένο το Εργαλείο ανάγνωσης οθόνης."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Μην ενοχλείτε"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Δεν επιτρ. ταυτ. ενεργ. δεδ. κιν. τηλ. και λειτ. πτήσ. Απεν. τη λειτ. πτήσ. και δοκ. ξανά."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Κάντε σάρ. επάνω για επισ. στο ρολόι."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Αυτό ήταν! Ξεκινήστε με το Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Δίκτυα κινητής"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Πρ. κλ. στο Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Έναρξη"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Έξοδος"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Καλώς ορίσατε! Για να μάθετε για το Gear, πατήστε το κουμπί."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Έγινε αίτηση για απενεργοποίηση"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Έγινε αίτηση για ενεργοποίηση"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Σύρ. κάτω την πάνω άκρη, για προβ. ενδείξεων στο ρολόι."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Σύρ. επάνω το κάτω άκρο για προβολή εφαρμογών στο ρολόι."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Για επιστροφή, σύρετε της επάνω άκρη προς τα κάτω."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Για την εγκατάσταση ή την κατάργηση εγκατάστασης εφαρμογών, χρησιμοποιήστε την εφαρμογή Samsung Gear στην κινητή συσκευή σας."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Αυτή είναι η κύρια δομή της αρχικής οθόνης."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Κενό"
diff --git a/home/res/po/en.po b/home/res/po/en.po
new file mode 100755
index 0000000..01ade24
--- /dev/null
+++ b/home/res/po/en.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Apps"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Next"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Don't repeat."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Delete all"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Unable to remove."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Tap and hold a widget to move it."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Home screen changed."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Loading..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Unable to load data. Tap to retry."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Unable to add application. No more room on home screen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Unable to add widget. No more room on home screen."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Application already exists."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget already exists."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cancel"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Home screen layout changed."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "This application will be removed from the home screen. It will not be deleted from the device."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Remove application"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Remove widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "This widget will be removed from the home screen. It will not be deleted from the device."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra power saving mode"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Unable to add widget. Maximum number of widgets (%d) reached."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Unable to add application. Maximum number of applications (%d) reached."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Unable to add page."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normal mode"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Power saving mode disabled."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Power saving mode enabled."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Recent apps"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Unable to add application. Maximum number of applications (%s) reached."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Unable to add widget. Maximum number of widgets (%s) reached."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Remove page"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "This page and its content will be removed."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Remove"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Insert SIM card to access network services."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blocking mode"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "On"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Off"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Item moved."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Double tap to add."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Add widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Item added."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Item removed."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Page %1$d of %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Cannot reorder notification board items."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "It is %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "It is %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "It is %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d new items"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "The maximum number of widgets (%s) has been reached. Delete some widgets and try again."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Swipe left to view widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Swipe right to view notifications."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Uninstall %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Maximum number of widgets (%s) reached."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Double tap to open app tray."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 new item"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Double tap to enable."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Clock"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "The device temperature is too high."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Download Gear applications using mobile device."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "While sleeping"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Get more applications"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Action not available while Power saving + enabled."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s is not available while Screen reader is enabled."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Do not disturb"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Unable to turn on Mobile data while Flight mode enabled. Disable Flight mode and try again."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Swipe upwards to go back to clock."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "That's it! Get into Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobile networks"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Fwd calls to Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Exit"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Welcome! Tap the button below to learn how to use your Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Requested to disable"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Requested to enable"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Swipe top edge down to see indicator icons on clock."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Swipe bottom edge up to view apps on clock."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Swipe top edge down to go back."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "To install or uninstall applications, use the Samsung Gear application on your mobile device."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "This is the main structure of the home screen."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Empty"
diff --git a/home/res/po/en_PH.po b/home/res/po/en_PH.po
new file mode 100755
index 0000000..8eba95d
--- /dev/null
+++ b/home/res/po/en_PH.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Apps"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Next"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Don't repeat"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Delete all"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Unable to remove."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Tap and hold a widget to move it."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Home screen changed."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Loading..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Unable to load data. Tap to retry."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Unable to add application. No more room on home screen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Unable to add widget. No more room on home screen."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Application already exists."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget already exists."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cancel"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Home screen layout changed."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "This application will be removed from the home screen. It will not be deleted from the device."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Remove application"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Remove widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "This widget will be removed from the home screen. It will not be deleted from the device."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra power saving mode"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Unable to add widget. Maximum number of widgets (%d) reached."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Unable to add application. Maximum number of applications (%d) reached."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Unable to add page."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normal mode"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Power saving mode disabled."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Power saving mode enabled."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Recent apps"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Unable to add application. Maximum number of applications (%s) reached."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Unable to add widget. Maximum number of widgets (%s) reached."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Remove page"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "This page and its content will be removed."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Remove"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Insert SIM card to access network services."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blocking mode"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "On"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Off"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Item moved."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Double tap to add."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Add widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Item added."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Item removed."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Page %1$d of %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Cannot reorder notification board items."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "It is %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "It is %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "It is %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d new items"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "The maximum number of widgets (%s) has been reached. Delete some widgets and try again."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Swipe left to view widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Swipe right to view notifications."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Uninstall %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Maximum number of widgets (%s) reached."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Double tap to open app tray."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 new item"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Double tap to enable."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Clock"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "The device temperature is too high."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Download Gear applications using mobile device."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "While sleeping"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Get more applications"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Action not available while Power saving + enabled."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s is not available while Screen reader is enabled."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Do not disturb"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Unable to turn on Mobile data while Flight mode enabled. Disable Flight mode and try again."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Swipe upwards to go back to clock."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "That's it! Get into Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobile networks"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Fwd calls to Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Exit"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Welcome! Tap the button below to learn how to use your Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Requested to disable"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Requested to enable"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Swipe top edge down to see indicator icons on clock."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Swipe bottom edge up to view apps on clock."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Swipe top edge down to go back."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "To install or uninstall applications, use the Samsung Gear application on your mobile device."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "This is the main structure of the home screen."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Empty"
diff --git a/home/res/po/en_US.po b/home/res/po/en_US.po
new file mode 100755
index 0000000..70d5e26
--- /dev/null
+++ b/home/res/po/en_US.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Apps"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Next"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Don't repeat"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Delete all"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Unable to remove."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Press and hold a widget to move it."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Home screen changed."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Loading..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Unable to load data. Tap to retry."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Unable to add application. No more room on Home screen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Unable to add widget. No more room on Home screen."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Application already exists."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget already exists."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cancel"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Home screen layout changed."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "This application will be removed from the Home screen. It will not be deleted from the device."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Remove application"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Remove widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "This widget will be removed from the Home screen. It will not be deleted from the device."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra power saving mode"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Unable to add widget. Maximum number of widgets (%d) reached."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Unable to add application. Maximum number of applications (%d) reached."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Unable to add page."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normal mode"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Power saving mode disabled."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Power saving mode turned on."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Recent apps"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Unable to add application. Maximum number of applications (%s) reached."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Unable to add widget. Maximum number of widgets (%s) reached."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Remove page"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "This page and its content will be removed."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Remove"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Insert SIM card to access network services."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blocking mode"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "On"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Off"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Item moved."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Double tap to add."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Add widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Item added."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Item removed."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Page %1$d of %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Cannot reorder notification board items."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "It is %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "It is %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "It is %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d new items"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "The maximum number of widgets (%s) has been reached. Delete some widgets and try again."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Swipe left to view widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Swipe left to view the clock."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Swipe right to view notifications."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Uninstall %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Maximum number of widgets (%s) reached."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Double tap to open app tray."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 new item"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Double tap to turn on."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Clock"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "The device temperature is too high."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Download Gear applications using mobile device."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "While sleeping"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Get more applications"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Action not available while Power saving + on."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s is not available while Screen reader is on."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Do not disturb"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Unable to use Mobile data while Airplane mode is on. Turn off Airplane mode and try again."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Swipe upwards to go back to clock."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "That's it! Get into Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobile networks"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Fwd calls to Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Exit"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Welcome! Tap the button below to learn how to use your Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Requested to disable"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Requested to enable"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Swipe top edge downwards to see indicator icons on clock."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Swipe bottom edge upwards to view apps on clock."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Swipe top edge downwards to go back."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "To install or uninstall applications, use the Samsung Gear application on your mobile device."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "This is the main structure of the Home screen."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Empty"
diff --git a/home/res/po/es_ES.po b/home/res/po/es_ES.po
new file mode 100755
index 0000000..da73045
--- /dev/null
+++ b/home/res/po/es_ES.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplicaciones"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Siguiente"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "No repetir"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Eliminar todo"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "No se puede eliminar"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Mantenga pulsado un widget para moverlo"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Se ha cambiado la pantalla de inicio"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Cargando..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "No se pueden cargar datos. Pulse para volver a intentarlo."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "No se puede añadir la aplicación. No hay espacio disponible en la pantalla de inicio."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "No se puede añadir el widget. No hay espacio disponible en la pantalla de inicio."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "La aplicación ya existe."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "El widget ya existe."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cancelar"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Se ha cambiado el diseño de la pantalla de inicio."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Se eliminará esta aplicación de la pantalla de inicio. No obstante, no se eliminará del dispositivo."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Eliminar aplicación"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Eliminar widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Se eliminará este widget de la pantalla de inicio. No obstante, no se eliminará del dispositivo."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Modo Ultrahorro energía"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "No se puede añadir widget. Se ha alcanzado el número máximo de widgets (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "No se puede añadir aplicación. Número máximo de aplicaciones (%d) alcanzado."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "No se puede añadir la página."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Modo normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Modo Ahorro de energía desactivado."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Modo de ahorro de energía activado."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Aplic recien"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "No se puede añadir la aplicación. Se ha alcanzado el número máximo de aplicaciones (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "No se puede añadir el widget. Se ha alcanzado el número máximo de widgets (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Eliminar página"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Se eliminará esta página y su contenido."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Eliminar"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Inserte la tarjeta SIM para acceder a los servicios de red."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Modo Bloqueo"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Activado"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Desactivado"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elemento movido."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Pulse dos veces para añadir."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Añadir widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Elemento añadido."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Elemento eliminado."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Página %1$d de %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "No se pueden reordenar los elementos del panel de notificación."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Son las %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Son las %d:%d AM"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Son las %d:%d PM"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d elementos nuevos"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Se ha alcanzado el número máximo de widgets (%s). Elimine algunos y vuelva a intentarlo."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Deslice a dcha para volver al reloj."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Deslice a izquierda para ver widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Deslice a izqda para volver al reloj."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Deslice a dcha para ver notificac."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "¿Desinstalar %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Se alcanzó el número máximo de widgets (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Pulse dos veces para abrir la bandeja de aplicaciones."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 elemento nuevo"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Pulse dos veces para activarlo."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Reloj"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "La temperatura del dispositivo es demasiado alta"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Descargue aplicaciones de Gear mediante el dispositivo móvil."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Mientras duerme"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Obtener más aplicaciones"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Acción no disponible con Ahorro de energía + activado."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s no está disponible mientras Lector de pantalla esté activado."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "No molestar"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Imposible activ datos móviles con modo Avión activ. Desac modo Avión y vuelva a intentarlo."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Deslice arriba para volver al reloj."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "¡Eso es! ¡Conozca Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Redes móviles"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Desví llam a Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Iniciar"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Salir"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Bienvenido. Pulse siguiente botón para aprender a usar Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Solicitud de desactivación"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Solicitud de activación"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Deslice borde sup ab para ver icon indicadores en reloj."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Deslice el borde inferior arr para ver aplic en reloj."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "Aceptar"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Deslice el borde superior hacia abajo para volver."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Para instalar o desinstalar aplicaciones, utilice la aplicación de Samsung Gear en su dispositivo móvil."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Esta es la estructura principal de la pantalla de inicio."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Vacío"
diff --git a/home/res/po/es_US.po b/home/res/po/es_US.po
new file mode 100755
index 0000000..058d19e
--- /dev/null
+++ b/home/res/po/es_US.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplic."
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Siguiente"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "No volver a mostrar"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Eliminar todo"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "No se puede eliminar."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Mantenga pulsado el widget para moverlo."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Se cambió la pantalla de inicio."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Cargando..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "No es posible cargar los datos. Pulse para intentarlo de nuevo."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "No se puede añadir la aplicación. No hay espacio disponible en la pantalla de inicio."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "No se puede añadir el widget. No hay espacio disponible en la pantalla de inicio."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "La aplicación ya existe."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "El widget ya existe."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cancelar"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Se ha cambiado el diseño de la pantalla de inicio."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Se eliminará esta aplicación de la pantalla de inicio. No obstante, no se eliminará del dispositivo."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Eliminar aplicación"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Eliminar widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Se eliminará este widget de la pantalla de inicio. No obstante, no se eliminará del dispositivo."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Modo ultra ahorro energía"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "No se puede añadir widget. Se alcanzó el número máximo de widget (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "No se puede añadir la aplicación. Se alcanzó el número máximo de aplicaciones (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "No se puede añadir la página."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Modo normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Modo de ahorro de energía desactivado."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Modo Ahorro de energía activado."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Apl. recien."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "No se puede añadir la aplicación. Se alcanzó el número máximo de aplicaciones (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "No se puede añadir el widget. Se alcanzó el número máximo de widget (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Eliminar página"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Se eliminará esta página y su contenido."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Eliminar"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Inserte tarjeta SIM para acceder a los servicios de red"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Modo de bloqueo"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Activado"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Desactivado"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elemento movido."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Pulse dos veces para añadir."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Añadir Widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Elemento añadido."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Elemento eliminado."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Página %1$d de %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "No se puede reordenar los elementos del panel de notificación."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Son las %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Son las %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Son las %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d elementos nuevos"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Se alcanzó el número máximo de widgets (%s). Elimine algunos widgets e inténtelo de nuevo."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Deslice a la derecha para volver al reloj."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Deslice a la izquierda para ver widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Deslice a la izquierda para volver al reloj."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Deslice a la derecha para ver notificaciones."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "¿Desinstalar %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Se alcanzó el número máximo de widgets (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Pulse dos veces para abrir la bandeja de aplicaciones."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nuevo elemento"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Pulse dos veces para activar."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Reloj"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "La temperatura del dispositivo es demasiado alta."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Descargar aplicaciones de Gear a través del dispositivo móvil."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Mientras duerme"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Obtener más aplicaciones"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "La acción no está disponible mientras Ahorro de energía + activado."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s no se encuentra disponible mientras Lector de pantalla esté activado."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "No molestar"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "No es pos. activ. Dat. móviles mientras que el perfil fuera de línea está activ. Desact. el perfil Fuera de línea e intént. de nuevo."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Deslice hacia arriba para volver al reloj."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "¡Listo! Ahora, a disfrutar de Gear."
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Redes móviles"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Desv. llam. a Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Iniciar"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Salir"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "¡Bienvenido! Pulse el sig. botón para aprender a usar Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Desactivación solicitada"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Activación solicitada"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Deslice borde superior hacia abajo para ver indicadores."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Deslice borde inferior arriba para ver aplicaciones."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "Aceptar"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Deslice el borde superior hacia abajo para retroceder."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "En el reloj, deslice el borde superior hacia abajo para ver los íconos del indicador."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "En el reloj, deslice el borde inferior hacia arriba para ver las aplicaciones."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "En el reloj, deslice hacia la derecha para ver las notificaciones."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Deslice a la izquierda para volver al reloj."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "En el reloj, deslice hacia la izquierda para ver los widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Deslice a la derecha para volver al reloj."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "En el reloj, deslice hacia arriba para ver las aplicaciones."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Deslice hacia abajo para volver al reloj."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "En el reloj, deslice hacia abajo para ver la barra Momentos."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Deslice hacia arriba para volver al reloj."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "El reloj es la pantalla de inicio. Pulse abajo para comenzar."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Para instalar o desinstalar aplicaciones, use la aplicación Samsung Gear en el dispositivo móvil."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Esta es la estructura principal de la pantalla de inicio."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "Este es el diseño de la pantalla de inicio."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Vacío"
diff --git a/home/res/po/et.po b/home/res/po/et.po
new file mode 100755
index 0000000..825d834
--- /dev/null
+++ b/home/res/po/et.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Rakendused"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Järgmine"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Vidin"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ära korda"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Kustuta kõik"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Ei saa eemaldada."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Vidina teisaldamiseks toksake ja hoidke seda."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Avaekraani on muudetud."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Laadimine..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Andmeid ei saa laadida. Toksake, et proovida uuesti."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Rakendust ei saa lisada. Avaekraanil pole rohkem ruumi."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Vidinat ei saa lisada. Avaekraanil pole rohkem ruumi."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Rakendus on juba olemas."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Vidin on juba olemas."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Tühista"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Avaekraani paigutust on muudetud."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "See rakendus eemaldatakse avaekraanilt. Seda ei kustutata seadmest."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Eemalda rakendus"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Eemalda vidin"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "See vidin eemaldatakse avaekraanilt. Seda ei kustutata seadmest."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ülim energiasäästurežiim"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Vidinat ei saa lisada. Vidinate maksimaalne arv (%d) on saavutatud."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Rakendust ei saa lisada. Rakenduste maksimaalne arv (%d) on saavutatud."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Lehte ei saa lisada."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Tavarežiim"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Energiasäästurežiim on desaktiveeritud."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Energiasäästurežiim on aktiveeritud."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Hilj. rak.-d"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Rakendust ei saa lisada. Rakenduste maksimaalne arv (%s) on saavutatud."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Vidinat ei saa lisada. Vidinate maksimaalne arv (%s) on saavutatud."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Eemalda leht"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "See leht ja selle sisu eemaldatakse."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Eemalda"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Sisestage SIM-kaart, et paaseda ligi vorguteenustele."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blokeerimis-\nrežiim"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Sees"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Väljas"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Üksus on teisaldatud."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Toksake kaks korda, et lisada."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Lisa vidin"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Üksus on lisatud."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Üksus on eemaldatud."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Leht %1$d/%2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Teavituste tahvli üksusi ei saa ümber järjestada."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Kell on %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Kell on %d:%d EL."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Kell on %d:%d PL."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d uut üksust"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Vidinate maksimaalne arv (%s) on saavutatud. Kustutage mõni vidin ja proovige uuesti."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Kellale naasmiseks libistage paremale."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Vidinate kuvamiseks libist. vasakule."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Kellale naasmiseks libistage vasakule."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Teavituste kuvamiseks lib. paremale."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Kas desinstallida %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Vidinate maksimaalne arv (%s) on saavutatud."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Toksake kaks korda, et avada rakenduste salve."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 uus üksus"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Toksake kaks korda, et aktiveerida."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Kell"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Seadme temperatuur on liiga korge."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Saate laadida Geari rakendusi alla mobiilsideseadmes."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Magamise ajal"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Hangi rohkem rakendusi"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Toiming ei ole saadaval, kui Energia säästmine + on aktiveeritud."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s ei ole saadaval, kui ekraanilugeja on aktiveeritud."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Mitte segada"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Mob. andmesidet ei saa lennurežiimis sisse lülitada. Desakt. lennurežiim ja proovige veel."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Kellale naasmiseks libistage üles."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Ongi kõik! Alustage seadme Gear kasutamist!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobiilivõrgud"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Suuna kõned Geari"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Käivita"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Välju"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Tere tulemast! Toksake nuppu, et tutvuda Geari kasutamisega."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Taotletud desaktiveerimist"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Taotletud aktiveerimist"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Libistage ülaservast alla, et näha kellal indik. ikoone."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Rakenduste kuvamiseks kellal libistage allservast üles."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Naasmiseks libistage ülaservast allapoole."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Rakenduste installimiseks või desinstallimiseks kasutage oma mobiilsideseadmes rakendust Samsung Gear."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "See on avaekraani põhistruktuur."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Tühi"
diff --git a/home/res/po/eu.po b/home/res/po/eu.po
new file mode 100755
index 0000000..675a0ba
--- /dev/null
+++ b/home/res/po/eu.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikazioak"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Hurrengoa"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "ElMezularitza tua"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ez errepik."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Ezab. guztiak"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Ezin da kendu"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Ukitu eta eutsi widget bat mugitzeko"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Pantaila nagusia aldatuta"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Kargatzen..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Ezin dira datuak kargatu. Ukitu berriz saiatzeko."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Ezin da aplikazioa gehitu. Ez dago lekurik pantaila nagusian."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Ezin da widgeta gehitu. Ez dago lekurik pantaila nagusian."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikazioa badago lehendik."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widgeta badago lehendik."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Ezeztatu"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Pantaila nagusiaren diseinua aldatu da."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Aplikazio hau pantaila nagusitik kenduko da. Ez da gailutik ezabatuko."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Kendu aplikazioa"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Kendu widgeta"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Widget hau pantaila nagusitik kenduko da. Ez da gailutik ezabatuko."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Bat. aurrezt. ultramodua"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Ezin da widget aplikazioa gehitu. Gehienezko widget kopurura (%d) iritsi zara."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Ezin da aplikazioa gehitu. Gehieneko aplikazio kopurura (%d) iritsi zara."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Ezin da orria gehitu."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Modu normala"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Bateria aurrezteko modua ezgaitu da."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Bateria aurrezteko modua gaitu da."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Berr. aplik."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Ezin da aplikazioa gehitu. Gehieneko aplikazio kopurura (%s) iritsi zara."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Ezin da widgeta gehitu. Gehieneko widget kopurura (%s) iritsi zara."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Kendu orria"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Orri hau eta bere edukia ezabatuko dira."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Kendu"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Sartu SIM txartela sare zerbitzuetan sartzeko."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blokeo modua"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Aktibatuta"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Desaktibatuta"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elementua mugituta."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Ukitu bi aldiz gehitzeko."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Gehitu widgeta"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Elementua gehituta."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Elementua kenduta."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%1$d. orria %2$d-(e)tik"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Ezin dira berrordenatu jakinarazpenen paneleko elementuak."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "%1$d:%2$d dira"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Goizeko %d:%d-a(k) d(ir)a"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Arratsaldeko %d:%d-a(k) d(ir)a"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d elementu berri"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Widgeten gehieneko kopurura (%s) iritsi zara. Ezabatu widget janari eta saiatu berriz."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Irris. esk. ordularian atzera joateko."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Irristatu ezkerrera widgetak ikusteko."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Irris. ezk. ordularian atzera joateko."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Irristatu esk. jakinarazp. Ikusteko."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Desinstalatu %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Widget-en gehieneko kopurura (%s) iritsi zara."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Ukitu bi aldiz aplikazio ontzia irekitzeko."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "Elementu berri 1"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Ukitu bi aldiz gaitzeko."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Erlojua"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Gailuaren tenperatura altuegia da."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Deskargatu Gear-en aplikazioak gailu mugikorra erabiliz."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Lo egon bitartean"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Lortu aplikazio gehiago"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Ekintza ez dago erabilgarri, + bateria aurrezlea gaituta badago."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s ez dago erabilgarri, Pantaila irakurgailua gaituta badago."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ez molestatu"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Ezin dira datu mugikorrak piztu, hegaldi modua gaituta badago. Ezgaitu eta saiatu berriz."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Irristatu gora, erlojura itzultzeko."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Hori da! Murgildu Gear-en!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Sare mugikorrak"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Birb. deiak Gear-era"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Hasi"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Irten"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Ongi etorri! Ukitu beheko botoia, Gear erabiltzen ikasteko."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Ezgaitzeko eskatuta"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Gaitzeko eskatuta"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Irris. goiko ertza behera, ikonoak erlojuan ikusteko."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Irristatu beheko ertzetik gora erlojuan apl. ikusteko."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "Ados"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Irristatu goiko ertzetik beherantz, atzera egiteko."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Aplikazioak instalatzeko edo desinstalatzeko, erabili gailu mugikorreko Samsung Gear aplikazioa."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Hau da pantaila nagusiaren egitura nagusia."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Hutsik"
diff --git a/home/res/po/fa.po b/home/res/po/fa.po
new file mode 100755
index 0000000..5d70d1c
--- /dev/null
+++ b/home/res/po/fa.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "برنامه"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "بعدی"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "نوار ابزار"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "تکرار نشود"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "حذف همه"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "حذف ممکن نیست."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "برای جابجا کردن ابزارک روی آن ضربه زده و نگه دارید."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "صفحه اصلی تغییر کرد."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "در حال دانلود..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "بارگیری داده ممکن نیست. برای امتحان مجدد ضربه بزنید."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "افزودن برنامه ممکن نیست. فضای بیشتری در صفحه اصلی وجود ندارد."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "افزودن ویجت ممکن نیست. فضای بیشتری در صفحه اصلی وجود ندارد."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "برنامه از قبل وجود دارد."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ویجت از قبل وجود دارد."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "لغو"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "چیدمان صفحه اصلی تغییر کرد."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "این برنامه از صفحه اصلی حذف می‌شود.ولی از دستگاه حذف نخواهد شد."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "حذف برنامه"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "حذف ویجت"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "این ویجت از صفحه اصلی حذف می‌شود. ولی از دستگاه حذف نخواهد شد."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "حالت ذخیره نیروی بیشتر"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "افزودن ویجت ممکن نیست. تعداد ویجت‌ها به حداکثر مجاز (‎%d) رسیده است."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "افزودن برنامه ممکن نیست. تعداد شرکت‌کنندگان به حداکثر مجاز (‎%d) رسید."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "افزودن صفحه ممکن نیست."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "حالت عادی"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "حالت ذخیره نیرو غیرفعال شد."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "حالت ذخیره نیرو فعال شد."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "برنامه اخیر"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "افزودن برنامه ممکن نیست. تعداد برنامه‌ها به حداکثر مجاز (‎%s) رسید."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "افزودن ویجت ممکن نیست. تعداد ویجت‌ها به حداکثر مجاز (‎%s) رسید."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "حذف صفحه"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "این صفحه و محتوای آن حذف خواهد شد."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "حذف"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "برای دستیابی به خدمات شبکه سیم کارت را وارد کنید."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "حالت انسداد"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "روشن"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "خاموش"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "مورد منتقل شد."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "برای افزودن دو بار ضربه بزنید."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "افزودن ابزار"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "مورد افزوده شد."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "مورد حذف شد."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "صفحه %1$d از %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "تغییر ترتیب موارد در صفحه اعلان‌ها ممکن نیست."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "%1$d:%2$d است."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "%d:%d صبح است."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "%d:%d عصر است."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d مورد جدید"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "تعداد ویجت‌ها به حداکثر (‎%s) رسیده است. چند ویجت را حذف کرده و دوباره امتحان کنید."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "برای برگشت به ساعت به راست بکشید."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "برای مشاهده ویجت‌ها به چپ بکشید."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "برای برگشت به ساعت به چپ بکشید."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "برای مشاهده اعلان‌ها به راست بکشید."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "لغو نصب %s؟"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "تعداد ویجت‌ها به حداکثر مجاز (‎%s) رسیده است."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "برای باز کردن سینی برنامه‌ها دو بار ضربه بزنید."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 مورد جدید"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "برای فعال‌سازی دو بار ضربه بزنید."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ساعت"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "دمای دستگاه بسیار بالا است"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "برنامه‌های Gear را با استفاده از دستگاه تلفن همراه دانلود کنید."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "هنگام خواب"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "دریافت برنامه‌های بیشتر"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "عملکرد هنگام فعال بودن ذخیره نیرو + در دسترس نیست."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "وقتی صفحه‌خوان فعال است، ‎%s در دسترس نیست."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "مزاحم نشوید"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "وقتی حالت پرواز فعال است، داده تلفن همراه روشن نمی‌شود. حالت پرواز را غیرفعال وامتحان کنید."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "برای بازگشت به ساعت، به بالا بکشید."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "به همین سادگی! از Gear لذت ببرید!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "شبکه تلفن همراه"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "هدایت تماس بهGear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "شروع"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "خروج"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "خوش آمدید! برای نحوه کار با Gear، روی دکمه زیر ضربه بزنید."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "غیرفعال‌سازی درخواست شد"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "فعال‌سازی درخواست شد"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "جهت نمایش نمادها روی ساعت، بالای صفحه را به پایین بکشید."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "جهت نمایش برنامه‌ها در ساعت،پایین صفحه را به بالا بکشید."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "تأیید"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "برای بازگشت، لبه بالایی صفحه را به سمت پایین بکشید."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "برای نصب یا لغو نصب برنامه‌ها، از برنامه Samsung Gear در دستگاه تلفن همراهتان استفاده کنید."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "این ساختار مهم صفحه اصلی است."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "خالی"
diff --git a/home/res/po/fi.po b/home/res/po/fi.po
new file mode 100755
index 0000000..d32ff3b
--- /dev/null
+++ b/home/res/po/fi.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Sovellukset"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Seuraava"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Pienoisohjelma"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Älä toista."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Poista kaikki"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Ei voi poistaa."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Siirrä pienoisohjelmaa painamalla jonkin aikaa."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Alkunäyttö vaihdettu."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Ladataan..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Tietoja ei voi ladata. Yritä napauttamalla uudelleen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Sovellusta ei voi lisätä. Alkunäytössä ei ole enää tilaa."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Pienoisohjelmaa ei voi lisätä. Alkunäytössä ei ole enää tilaa."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Sovellus on jo olemassa."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Pienoisohjelma on jo olemassa."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Peruuta"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Alkunäytön asettelu muutettu."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Tämä sovellus poistetaan alkunäytöstä. Sitä ei poisteta laitteesta."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Poista sovellus"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Poista pienoisohj."
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Tämä pienoisohjelma poistetaan alkunäytöstä. Sitä ei poisteta laitteesta."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Er. teh. virransäästötila"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Pienoisohjelmaa ei voi lisätä. Pienoisohjelmien enimmäismäärä (%d) saavutettu."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Sovellusta ei voi lisätä. Sovellusten enimmäismäärä (%d) on saavutettu."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Sivua ei voi lisätä."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normaali tila"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Virransäästötila on poistettu käytöstä."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Virransäästötila käytössä."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Viim. sov."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Sovellusta ei voi lisätä. Sovellusten enimmäismäärä (%s) on saavutettu."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Pienoisohjelmaa ei voi lisätä. Pienoisohjelmien enimmäismäärä (%s) on saavutettu."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Poista sivu"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Tämä sivu ja sen sisältö poistetaan."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Poista"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Pääset verkkopalveluihin asettamalla SIM-kortin paikalleen."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Estotila"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Päällä"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Pois"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Kohde siirretty."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Lisää kaksoisnapauttamalla."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Lisää pienoisohjelma"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Kohde lisätty."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Kohde poistettu."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Sivu %1$d/%2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Ilmoitustaulun kohteiden järjestystä ei voi muuttaa."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Kello on %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Nyt on klo %d:%d ap."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Nyt on klo %d:%d ip."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d uutta kohdetta"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Pienoisohjelmien enimmäismäärä (%s) on saavutettu. Poista pienoisohjelmia ja yritä uudelleen."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Palaa kelloon pyyhkäisemällä oikealle."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Näytä pienoisohj. pyyhk. vasemmalle."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Palaa kelloon pyyhk. vasemmalle."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Näytä ilmoitukset pyyhk. oikealle."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Poistetaanko kohteen %s asennus?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Pienoisohjelmien enimmäismäärä (%s) on saavutettu."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Avaa sovelluspalkki kaksoisnapauttamalla."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 uusi kohde"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Ota käyttöön kaksoisnapauttamalla."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Kello"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Laitteen lämpötila on liian korkea."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Lataa Gear-sovelluksia mobiililaitteella."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Nukkuessa"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Hae lisää sovelluksia"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Toiminto ei ole käytettävissä, kun Virransäästö + on käytössä."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s ei ole käytettävissä, kun Näytönlukija on käytössä."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Älä häiritse"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Mobiilidataa ei voi käyttää lentotilassa. Poista lentotila käytöstä ja yritä uudelleen."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Palaa kelloon pyyhkäisemällä ylöspäin."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Hienoa! Aloita Gearin käyttö!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Matkapuh.verkot"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Soitons. Geariin"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Käynnistä"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Poistu"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Tervetuloa! Perehdy Gearin käyttöön napauttamalla painiketta."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Pyydetty poistamaan käytöstä"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Pyydetty ottamaan käyttöön"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Näytä ilmaisinkuv. kellossa pyyhk. yläreunasta alaspäin."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Näytä sovellukset kellossa pyyhk. alareunasta ylöspäin."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Palaa pyyhkäisemällä yläreunasta alaspäin."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Jos haluat asentaa sovelluksia tai poistaa niiden asennuksen, käytä mobiililaitteessa olevaa Samsung Gear -sovellusta."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Tämä on alkunäytön päärakenne."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Tyhjä"
diff --git a/home/res/po/fr.po b/home/res/po/fr.po
new file mode 100755
index 0000000..e683654
--- /dev/null
+++ b/home/res/po/fr.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Applications"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Suivant"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widgets"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ne plus afficher"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Supprimer tout"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Suppression impossible"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "App. de façon prolongée sur widget pour déplacer."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Ecran d'accueil modifié"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Chargement en cours."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Impossible de charger les données. Appuyez pour réessayer."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Impossible d'ajouter l'application. Espace saturé sur l'écran d'accueil."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Impossible d'ajouter le widget. Espace saturé sur l'écran d'accueil."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "L'application existe déjà."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Le widget existe déjà."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Annuler"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Disposition de l'écran d'accueil modifiée."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Cette application sera supprimée de l'écran d'accueil. Elle sera cependant conservée sur l'appareil."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Supprimer l'appli"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Supprimer le widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ce widget sera supprimé de l'écran d'accueil. Il sera cependant conservé sur l'appareil."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Mode Ultra éco. d'énergie"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Impossible d'ajouter le widget. Nombre maximal de widgets (%d) atteint."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Impossible d'ajouter l'application. Nombre maximal d'applications (%d) atteint."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Impossible d'ajouter une page."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Mode normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Mode économie d'énergie désactivé."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Mode Économie d'énergie activé."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Applis réc."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Impossible d'ajouter l'application. Nombre maximal d'applications (%s) atteint."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Impossible d'ajouter le widget. Nombre maximal de widgets (%s) atteint."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Supprimer la page"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Cette page et son contenu vont être supprimés."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Supprimer"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Insérez une carte SIM pour accéder aux services réseau."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Mode Blocage"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Activé"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Désactivé"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elément déplacé."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Appuyez deux fois pour ajouter."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Ajouter widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Elément ajouté."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Elément supprimé."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Page %1$d sur %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Impossible de réorganiser les éléments de la barre de notifications."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Il est %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Il est %d:%d du matin."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Il est %d:%d de l'après-midi."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d nouveaux éléments"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Le nombre maximal de widgets (%s) a été atteint. Supprimez des widgets, puis réessayez."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Retour horloge : glisser vers la droite"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Widgets : glisser vers la gauche."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Retour horloge : glisser vers la gauche"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Notifications : glisser vers la droite"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Désinstaller %s ?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Nombre maximal de widgets (%s) atteint."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Appuyez deux fois pour ouvrir la barre des applications."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nouvel élément"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Appuyez deux fois pour activer."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Horloge"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "La température de l'appareil est trop élevée."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Téléchargez des applications Gear via votre appareil mobile."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "En dormant"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Obtenir plus d'applis"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Cette action est impossible lorsque le mode Économie d'énergie + est activé."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s n'est pas disponible si le lecteur d'écran est activé."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ne pas déranger"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Impossible d'activer Données mobiles en mode Hors-ligne. Désactivez ce mode et réessayez."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Retour horloge : glisser vers le haut"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Ça y est ! Utilisez Gear !"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Réseaux mobiles"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Appel vers Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Démarrer"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Quitter"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Bienvenue ! Appuyez sur la touche pour découvrir la Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Demande de désactivation effectuée"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Demande d'activation effectuée"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Notifications : glisser de haut en bas."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Applications : glisser de bas en haut."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Retour : glisser de haut en bas."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "Sur l'horloge, faites glisser votre doigt de haut en bas pour voir les icônes de pointeur."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "Sur l'horloge, faites glisser votre doigt de bas en haut pour afficher les applications."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "Depuis l'horloge, faites glisser votre doigt vers la droite pour afficher les notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Faites glisser votre doigt vers la gauche pour revenir à l'horloge."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "Depuis l'horloge, faites glisser vers la gauche pour afficher les widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Faites glisser votre doigt vers la droite pour revenir à l'horloge."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "Depuis l'horloge, faites glisser vers le haut pour afficher les applications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Faites glisser votre doigt vers le bas pour revenir à l'horloge."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "Depuis l'horloge, faites glisser votre doigt vers le bas pour afficher la barre Moments."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Faites glisser votre doigt vers le haut pour revenir à l'horloge."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "L'horloge est votre écran d'accueil. Appuyez ci-dessous pour démarrer."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Pour installer ou désinstaller des applications, utilisez l'application Samsung Gear sur votre appareil mobile."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Votre écran d'accueil est organisé de cette façon."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "Voici la disposition de votre écran d'accueil."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Vide"
diff --git a/home/res/po/fr_CA.po b/home/res/po/fr_CA.po
new file mode 100755
index 0000000..740e305
--- /dev/null
+++ b/home/res/po/fr_CA.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Applications"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Suivant"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widgets"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ne pas rép."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Supprimer tout"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Suppression impossible."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Touchez longuement le widget pour le déplacer."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Écran d'accueil modifié"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Chargement..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Impossible de charger les données. Appuyez pour réessayer."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Impossible d'ajouter l'application. Espace saturé sur l'écran d'accueil."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Impossible d'ajouter le widget. Espace saturé sur l'écran d'accueil."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "L'application existe déjà."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Le widget existe déjà."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Non"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Disposition de l'écran d'accueil modifiée."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Cette application sera supprimée de l'écran d'accueil. Elle sera cependant conservée sur l'appareil."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Supprimer l'appli"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Supprimer le widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ce widget sera supprimé de l'écran d'accueil. Il sera cependant conservé sur l'appareil."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Mode Ultra écon. d'énergie"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Impossible d'ajouter le widget. Nombre maximal de widgets (%d) atteint."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Impossible d'ajouter l'application. Nombre maximal d'applications (%d) atteint."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Impossible d'ajouter une page."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Mode normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Mode économie d'énergie désactivé."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Mode Économie d'énergie activé."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Applis réc."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Impossible d'ajouter l'application. Nombre maximal d'applications (%s) atteint."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Impossible d'ajouter le widget. Nombre maximal de widgets (%s) atteint."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Supprimer la page"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Cette page et son contenu vont être supprimés."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Supprimer"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Insérez une carte SIM pour accéder aux services réseau."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Mode Blocage"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Activé"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Désactivé"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Élément déplacé."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Touchez deux fois pour ajouter."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Ajouter widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Élément ajouté."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Élément supprimé."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Page %1$d sur %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Impossible de réorganiser les éléments de la barre de notifications."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Il est %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Il est %d:%d du matin."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Il est %d:%d de l'après-midi."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d nouveaux éléments"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Le nombre maximal de widgets (%s) a été atteint. Supprimez des widgets, puis réessayez."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Glissez à droite pour rev. à horloge."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Glissez à gauche pr aff. des widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Glissez à gauche pour rev. à horloge."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Glissez à droite pour afficher notif."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Désinstaller %s ?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Nombre maximal de widgets (%s) atteint."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Touchez deux fois pour ouvrir la barre des applications."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nouvel élément"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Touchez deux fois pour activer."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Horloge"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "La température de l'appareil est trop élevée."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Téléchargez des applications Gear via votre appareil mobile."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "En dormant"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Obtenir plus d'applis"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Cette action est impossible lorsque le mode Économie d'énergie + est activé."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s n'est pas disponible si le lecteur d'écran est activé."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ne pas déranger"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Impossible d'activer Données mobiles en mode Hors-ligne. Désactivez ce mode et réessayez."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Glissez vers haut pr reven. à horloge."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Ça y est ! Utilisez Gear !"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Réseaux mobiles"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Tr. app. v. Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Démarrer"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Quitter"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Bienvenue ! Touchez le bouton pour découvrir votre Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Demande de désactivation effectuée"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Demande d'activation effectuée"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Gliss. haut en bas pour aff. icônes indic. sur horloge."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Gliss. bas en haut de l'écr. pour aff. apps sur horloge."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Faites glisser votre doigt de haut en bas pour revenir."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "Sur l'horloge, faites glisser votre doigt de haut en bas pour voir les icônes de pointeur."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "Sur l'horloge, faites glisser votre doigt de bas en haut pour afficher les applications."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "Depuis l'horloge, faites glisser votre doigt vers la droite pour afficher les notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Faites glisser votre doigt vers la gauche pour revenir à l'horloge."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "Depuis l'horloge, faites glisser vers la gauche pour afficher les widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Faites glisser votre doigt vers la droite pour revenir à l'horloge."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "Depuis l'horloge, faites glisser vers le haut pour afficher les applications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Faites glisser votre doigt vers le bas pour revenir à l'horloge."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "Depuis l'horloge, faites glisser votre doigt vers le bas pour afficher la barre Moments."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Faites glisser votre doigt vers le haut pour revenir à l'horloge."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "L'horloge est votre écran d'accueil. Touchez ci-dessous pour démarrer."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Pour installer ou désinstaller des applications, utilisez l'application Samsung Gear sur votre appareil mobile."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Votre écran d'accueil est organisé de cette façon."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "Voici la disposition de votre écran d'accueil."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Vide"
diff --git a/home/res/po/ga.po b/home/res/po/ga.po
new file mode 100755
index 0000000..0ed0546
--- /dev/null
+++ b/home/res/po/ga.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Feidhmchláir"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Ar aghaidh"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Giuirléid"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ná hathdhéan"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Scrios gach"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Ní féidir é a bhaint."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Tapáil agus coinnigh giuirléid lena bogadh"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Scáileán baile athraithe."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Ag lódáil..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Ní féidir sonraí a choinneáil. Tapáil le triail arís."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Ní féidir an feidhmchlár a chur leis. Níl aon spás eile fágtha ar an scáileán baile."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Ní féidir giuirléid a chur leis. Níl aon spás eile fágtha ar an scáileán baile."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Tá an feidhmchlár ann cheana."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Tá giuirléid ann cheana."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cuir ar ceal"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Leagan amach an scáileáin bhaile athraithe."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Bainfear an feidhmchlár seo ón scáileán baile. Ní scriosfar ón ngléas é."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Bain an feidhmchlár"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Bain giuirléid"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Bainfear an ghiuirléid seo ón scáileán baile. Ní scriosfar ón ngléas í."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultramhód coigilte cumh."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Ní féidir giuirléid a chur leis. Uaslíon na ngiuirléidí (%d) bainte amach."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Ní féidir feidhmchlár a chur leis. Uaslíon na bhfeidhmchlár (%d) bainte amach."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Ní féidir leathanach a chur leis."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Mód normálta"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Mód coigilte cumhachta díchumasaithe."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Mód coigilte cumhachta cumasaithe."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "F'chláir le déanaí"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Ní féidir feidhmchlár a chur leis. Uaslíon na bhfeidhmchlár (%s) bainte amach."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Ní féidir giuirléid a chur leis. Uaslíon na ngiuirléidí (%s) bainte amach."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Bain leathanach"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Bainfear an leathanach agus a inneachar."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Bain"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Ionsáigh cárta SIM le seirbhísí líonra a rochtain"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Mód bactha"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Air"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "As"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Mír bogtha."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Déthapáil le cur leis."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Cuir giuirléid leis"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Mír curtha leis."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Mír bainte."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Leathanach %1$d as %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Ní féidir míreanna ar an mbord fógraí a chur in ord nua."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "%1$d:%2$d an t-am anois"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Tá sé %d:%d R.N."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Tá sé %d:%d I.N."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d mír nua"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Tá uaslíon na ngiuirléidí (%s) bainte amach. Scrios roinnt giuirléidí agus triail arís."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Svaidhp. ar dheis le fill. ar chlog."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Svaidhp. ar clé le giuirléidí a fheic."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Svaidhp. ar clé le fill. ar an gclog."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Svaidhp. ar dheis le harc. ar fhógraí."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Díshuiteáil %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Uaslíon na ngiuirléidí (%s) bainte amach."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Déthapáil leis an tráidire feidhmchlár a oscailt."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 mhír nua"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Déthapáil lena chumasú."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Clog"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Tá teocht an ghléis ró-ard."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Íoslódáil feidhmchláir Gear le gléas móibíleach."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Le linn codlata"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Faigh breis feidhmchlár"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Níl an gníomh ar fáil agus Coigilt chumhachta + cumasaithe."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Níl %s ar fáil agus Léitheoir scáileáin cumasaithe."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ná cuir isteach"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Ní féidir Son. móib. a chasadh air agus mód Eitilte cumas. Díchum. Mód eit. agus triail arís."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Svaidhp. suas le filleadh ar chlog."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Sin a bhfuil! Tosaigh ar úsáid Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Líonraí móibíl."
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Ar agh. go Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Tosaigh"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Scoir"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Fáilte! Tapáil an cnaipe le foghlaim conas do Gear a úsáid."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Díchumasú iarrtha"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Cumasú iarrtha"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Svaidhp. barrimeall anuas le táscairí a fheic. ar chlog."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Svaidhp. bunimeall aníos le hamh. ar f.chláir ar chlog."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Svaidhpeáil barimeall anuas le gabháil siar."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Le feidhmchláir a shuiteáil nó a dhíshuiteáil, úsáid feidhmchlár Samsung Gear ar do ghléas móibíleach."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Seo príomhstruchtúr an scáileáin bhaile."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Folamh"
diff --git a/home/res/po/gl.po b/home/res/po/gl.po
new file mode 100755
index 0000000..5eda57a
--- /dev/null
+++ b/home/res/po/gl.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplicacións"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Seguinte"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Non repetir"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Eliminar todos"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Non se pode eliminar"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Mantén tocado un widget para movelo"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Pantalla de inicio cambiada"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Cargando..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Non se poden cargar datos. Toca para tentalo de novo."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Non se pode engadir a aplicación. Non hai máis espazo na pantalla de inicio."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Non se pode engadir o widget. Non hai máis espazo na pantalla de inicio."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "A aplicación xa existe."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "O widget xa existe."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cancelar"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Cambiouse o deseño da pantalla de inicio."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Esta aplicación eliminarase da pantalla de inicio. Non se eliminará do dispositivo."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Eliminar aplicación"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Eliminar widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Este widget eliminarase da pantalla de inicio. Non se eliminará do dispositivo."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Modo Aforro enerxía ultra"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Non se pode engadir o widget. Alcanzouse o número máximo de widgets (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Non se pode engadir a aplicación. Alcanzouse o número máximo de aplicacións (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Non se pode engadir a páxina."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Modo normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Modo Aforro de enerxía desactivado."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Modo de aforro de enerxía activado."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Aplic.recen."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Non se pode engadir a aplicación. Alcanzouse o número máximo de aplicacións (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Non se pode engadir o widget. Alcanzouse o número máximo de widgets (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Eliminar páxina"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Eliminarase esta páxina e os seus contidos."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Eliminar"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Insira a tarxeta SIM para acceder aos servizos de rede."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Modo Bloqueo"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Activado"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Desactivado"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elemento movido."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Toca dúas veces para engadir."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Engadir widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Elemento engadido."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Elemento eliminado."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Páxina %1$d de %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Non se poden reordenar os elementos do taboleiro de notificacións."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Son as %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Son as %d:%d AM"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Son as %d:%d PM"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d elementos novos"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Alcanzouse o número máximo de widgets (%s). Elimina algún widget e téntao de novo."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Pasa o dedo á der. para volver ao rel."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Pasa o dedo á esq. para ver widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Pasa o dedo á esq. para volver ao rel."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Pasa o dedo á der. para ver notific."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Desexas desinstalar %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Alcanzouse o número máximo de widgets (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Toca dúas veces para abrir a bandexa de aplicacións."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 novo elemento"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Toca aquí dúas veces para activar."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Reloxo"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "A temperatura do dispositivo é demasiado elevada"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Descarga as aplicacións de Gear mediante o dispositivo móbil."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Mentres dormes"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Obter máis aplicacións"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Acción non dispoñible cando Aforro de enerxía + está activado."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s non está dispoñible con Lector da pantalla activado."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Non molestar"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Imposible activar datos móbiles co modo Avión activa. Desactiva modo avión e volve tentalo."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Pasa o dedo arriba para volver ao rel."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Iso é! Entra en Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Redes móbiles"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Desvi.cham.a Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Iniciar"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Saír"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Benvido. Toca o botón para obter info. de como usar Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Solicitouse a desactivación"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Solicitouse a activación"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Pasa dedo bordo sup.abaixo para ver ico.indic.no reloxo."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Pasa dedo dsd.bordo infer.arriba para ver apl. no relox."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "Aceptar"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Pasa o dedo do bordo superior cara abaixo para volver."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Para instalar ou desinstalar aplicacións, utiliza a aplicación Samsung Gear do teu dispositivo móbil."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Esta é a estrutura principal da pantalla de inicio."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Baleiro"
diff --git a/home/res/po/gu.po b/home/res/po/gu.po
new file mode 100755
index 0000000..4785b8b
--- /dev/null
+++ b/home/res/po/gu.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "એપ્સ"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "પછીનું"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "વિજેટ"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "દોહરાવશો નહીં."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "બધુ હટાવો"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "કાઢવામાં અસમર્થ."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "વિજેટ ખસેડવા માટે તેને ટેપ કરો અને હોલ્ડ કરો."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "હોમ સ્ક્રીન બદલાઇ ગઈ છે."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "લોડિંગ..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ડેટા લોડ કરવામાં અસમર્થ. ફરીથી પ્રયાસ કરવા માટે ટેપ કરો."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "એપ્લિકેશન ઉમેરવા માટે અસમર્થ. હોમ સ્ક્રીન પર હવે વધુ અવકાશ નથી."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "વિજેટ ઉમેરવામાં અસમર્થ. હોમ સ્ક્રીન પર હવે વધુ અવકાશ નથી."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "એપ્લિકેશન પહેલાંથી હયાત છે."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "વિજેટ પહેલાંથી હયાત છે."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "રદ કરો"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "હોમ સ્ક્રીન લેઆઉટ બદલાયું છે."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "હોમ સ્ક્રીનમાંથી આ એપ્લિકેશનને દૂર કરવામાં આવશે. ઉપકરણમાંથી તે દૂર થશે નહીં."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "એપ્લિકેશન દૂર કરો"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "વિજેટ દૂર કરો"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "હોમ સ્ક્રીનમાંથી આ વિજેટને દૂર કરવામાં આવશે. ઉપકરણમાંથી તે દૂર થશે નહીં."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "અલ્ટ્રા પાવર બચત મોડ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "વિજેટ ઉમેરવામાં અક્ષમ. વિજેટ્સની મહત્તમ સંખ્યા (%d) પર પહોંચી ગયા."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "એપ્લિકેશનને ઉમેરવામાં અસમર્થ. એપ્લિકેશનોની મહત્તમ સંખ્યા (%d) પર પહોંચી ગયા."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "પૃષ્ઠ ઉમેરવા માટે અસમર્થ."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "સામાન્ય મોડ"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "પાવર બચત મોડ નિષ્ક્રિય થયો."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "પાવર બચત મોડ સક્ષમ થયો."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "તાજેતરની એપ્સ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "એપ્લિકેશનને ઉમેરવામાં અસમર્થ. એપ્લિકેશનોની મહત્તમ સંખ્યા (%s) પર પહોંચી ગયા."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "વિજેટ ઉમેરવામાં અક્ષમ. વિજેટ્સની મહત્તમ સંખ્યા (%s) પર પહોંચી ગયા."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "પૃષ્ઠ દૂર કરો"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "આ પૃષ્ઠ અને તેની સામગ્રીને દૂર કરવામાં આવશે."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "કાઢી નાખો"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "નેટવર્ક સેવાઓ ઍક્સેસ કરવા માટે SIM કાર્ડ સામેલ કરો."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "મોડને અવરોધિત કરવું"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ચાલુ"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "બંધ"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "વસ્તુ ખસેડવામાં આવી."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "ઉમેરવા બેવાર ટેપ કરો."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "વિજેટ ઉમેરો"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "વસ્તુ ઉમેરી."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "વસ્તુને દૂર કરી."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d નું %1$d પૃષ્ઠ"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "સૂચના બોર્ડની વસ્તુઓને પુનઃક્રમાંકિત કરી શકાતી નથી."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "આ છે %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "તે %d:%d AM છે."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "તે %d:%d PM છે."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d નવી વસ્તુઓ"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "વિજેટ્સની મહત્તમ સંખ્યા (%s) પર પહોંચી ગયા છો. કેટલાક વિજેટ્સ હટાવો અને ફરી પ્રયત્ન કરો."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ઘડિયાળ પર પાછા જવા માટે જમણે સ્વાઇપ કરો."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "વિજેટ્સ જોવા માટે ડાબે સ્વાઇપ કરો."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ઘડિયાળ પર પાછા જવા માટે ડાબે સ્વાઇપ કરો."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "સૂચનાઓ જોવા માટે જમણે સ્વાઇપ કરો."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s ને અનઇન્સ્ટોલ કરીએ?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "વિજેટ્સની મહત્તમ સંખ્યા (%s) પર પહોંચ્યા."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "એપ્લિકેશન ટ્રે ખોલવા માટે બેવાર ટેપ કરો."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 નવી વસ્તુ"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "સક્ષમ કરવા માટે બે વાર ટેપ કરો."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ઘડિયાળ"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "ઉપકરણનું તાપમાન ખૂબ વધારે છે."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "મોબાઇલ ઉપકરણનો ઉપયોગ કરી ગિઅર એપ્લિકેશનો ડાઉનલોડ કરો."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "સૂતી વખતે"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "વધુ એપ્લિકેશનો મેળવો"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "પાવર બચત + સક્ષમ કરેલું હોય ત્યારે ક્રિયા ઉપલબ્ધ નથી."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s તે સમય ઉપલબ્ધ નથી કે જ્યારે સ્ક્રીન રીડર સક્ષમ કરેલ હોય."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "વિક્ષેપ પાડશો નહીં"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ફલાઇટ મોડ સક્ષમ કરેલ હોય ત્યારે મોબાઇલ ડેટાને ચાલુ કરવામાં અસમર્થ. ફલાઇટ મોડને અક્ષમ કરો અને ફરી પ્રયાસ કરો."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ઘડિયાળ પર પાછા જવા માટે ઉપરની બાજુએ સ્વાઇપ કરો."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "બસ એવી રીતે જ! ગિઅરનો આનંદ લો!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "મોબાઇલ નેટવર્ક્સ"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "કોલ્સ ગિઅર પર ફો. કરો"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "પ્રારંભ કરો"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "બહાર"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "સ્વાગત છે! તમારા ગિઅરનો ઉપયોગ કેવી રીતે કરવો તે જાણવા માટે નીચેના બટનને ટેપ કરો."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "અક્ષમ કરવાની વિનંતી કરેલ"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "સક્ષમ કરવાની વિનંતી કરેલ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ઘડિયાળ પર દર્શક ચિહ્નો જોવા માટે ટોચની કિનારી સ્વાઇપ કરો."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ઘડિયાળ પર એપ્લિકેશનો જોવા માટે નીચલી કિનારીને ઉપર સ્વાઇપ કરો."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ઓકે"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "પાછળ જવા માટે ટોચની કિનારીને નીચે સ્વાઇપ કરો."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "એપ્લિકેશન્સને ઇન્સ્ટોલ અથવા અનઇન્સ્ટોલ કરવા માટે, તમારા મોબાઇલ ઉપકરણ પરની Samsung Gear એપ્લિકેશનનો ઉપયોગ કરો."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "આ હોમ સ્ક્રીનનું મુખ્ય માળખું છે."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ખાલી"
diff --git a/home/res/po/he.po b/home/res/po/he.po
new file mode 100755
index 0000000..470eaa6
--- /dev/null
+++ b/home/res/po/he.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "יישומים"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "הבא"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "אל תציג שוב"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "מחק הכול"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "לא ניתן להסיר."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "הקש באריכות על ווידג'ט כדי להזיז אותו."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "מסך הבית השתנה."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "טוען..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "לא ניתן לטעון נתונים. הקש כדי לנסות שנית."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "לא ניתן להוסיף יישום. אין עוד מקום במסך הבית."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "לא ניתן להוסיף יישומון. אין עוד מקום במסך הבית."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "יישום זה כבר קיים."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "היישומון כבר קיים."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "ביטול"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "פריסת מסך הבית שונתה."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "יישום זה יוסר ממסך הבית. הוא לא יימחק מהמכשיר."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "הסר יישום"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "הסר יישומון"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "יישומון זה יוסר ממסך הבית. הוא לא יימחק מהמכשיר."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "מצב ‘חיסכון מרבי בחשמל’"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "לא ניתן להוסיף יישומון. הגעת למספר היישומונים המרבי המותר (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "לא ניתן להוסיף יישום. הגעת למספר היישומים המרבי (%d‏)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "לא ניתן להוסיף דף."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "מצב רגיל"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "מצב ‘חיסכון באנרגיה’ מושבת."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "מצב חיסכון בחשמל מופעל."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "יישומים אחרונים"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "לא ניתן להוסיף יישום. הגעת למספר היישומים המרבי המותר (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "לא ניתן להוסיף יישומון. הגעת למספר היישומונים המרבי המותר (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "הסר דף"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "דף זה יוסר, עם כל התוכן שהוא מכיל."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "הסר"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "הכנס כרטיס SIM כדי לגשת לשירותי רשת."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "מצב ‘חסימה’"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "מופעל"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "כבוי"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "הפריט הועבר."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "הקש הקשה כפולה כדי להוסיף."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "הוסף יישומון"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "הפריט נוסף."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "פריט הוסר."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "עמוד %1$d מתוך %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "לא ניתן לשנות את סדר הפריטים בחלונית ההתראות."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "השעה היא %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "הוא %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "הוא %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d פריטים חדשים"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "הגעת למספר היישומונים המרבי המותר (%s). מחק יישומונים אחדים ונסה שוב."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "החלק לימין כדי לחזור אל השעון."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "החלק לשמאל כדי להציג יישומונים."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "החלק לשמאל כדי לחזור אל השעון."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "החלק לימין כדי להציג התראות."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "להסיר את %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "הגעת למספר היישומונים המרבי המותר (%s)‏."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "הקש הקשה כפולה כדי לפתוח את מגש היישומים."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "פריט חדש אחד"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "הקש הקשה כפולה כדי להפעיל."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "שעון"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "טמפרטורת המכשיר גבוהה מדי"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "הורד יישומי Gear בעזרת המכשיר הנייד."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "בשינה"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "קבל יישומים נוספים"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "פעולה זו לא זמינה כל עוד התכונה ’חיסכון באנרגיה +‘ מופעלת."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s אינו זמין כל עוד ’קורא מסך‘ מופעל."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "נא לא להפריע"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "לא ניתן להפעיל במקביל את ’נתונים ניידים‘ ומצב ’טיסה‘. השבת את מצב ’טיסה‘ ונסה שוב."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "החלק מעלה כדי לחזור לשעון."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "זהו זה! היכנס ל-Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "רשתות סלולריות"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "העבר שיחות ל-Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "התחל"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "יציאה"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "ברוך הבא! הקש על הלחצן מטה כדי ללמוד כיצד להשתמש ב-Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "ביקש להשבית"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "ביקש להפעיל"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "להצגת סמלי מחוונים בשעון, החלק מטה מהשוליים העליונים."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "כדי להציג יישומים בשעון, החלק מעלה מהשוליים התחתונים."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "אישור"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "כדי לחזור, החלק מטה מהשוליים העליונים."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "כדי להתקין או להסיר יישומים, השתמש ביישום Samsung Gear במכשיר הנייד שלך."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "זהו המבנה הראשי של מסך הבית."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ריק"
diff --git a/home/res/po/hi.po b/home/res/po/hi.po
new file mode 100755
index 0000000..fb05976
--- /dev/null
+++ b/home/res/po/hi.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "एप्स"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "अगला"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "विजेट"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "दोहराएं नहीं"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "सभी हटाएँ"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "हटाने में असमर्थ।"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "विजेट ले जाने के लिए उसे टैप करे रखें।"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "होम स्क्रीन बदली गई।"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "लोड हो रहा है..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "डाटा लोड करने में अक्षम। फिर से प्रयास करने हेतु टैप करें।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "एप्लीकेशन जोड़ने में अक्षम। होम स्क्रीन पर कोई और रूम नहीं है।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "विजेट जोड़ने में अक्षम। होम स्क्रीन पर कोई और रूम नहीं है।"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "एप्लीकेशन पहले से मौजूद है।"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "विजेट पहले से मौजूद है।"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "रद्द करें"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "होम स्क्रीन लेआउट परिवर्तित किया गया।"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "यह एप्लीकेशन होम स्क्रीन से निकाल दिया जाएगा। इसे डिवाइस से नहीं निकाला जाएगा।"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "एप्लीकेशन निकालें"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "विजेट निकालें"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "यह विजेट होम स्क्रीन से निकाल दिया जाएगा। इसे डिवाइस से नहीं निकाला जाएगा।"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "अल्ट्रा पॉवर बचत मोड"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "विजेट को जोड़ने में असमर्थ। विजेट्स की संख्या अधिकतम (%d) तक पहुँच गयी है।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "एप्लीकेशन जोड़ने में असमर्थ। एप्लीकेशंस की अधिकतम संख्या (%d) तक पहुँच गई।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "पेज जोड़ने में अक्षम।"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "सामान्‍य मोड"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "पॉवर बचत मोड अक्षम किया गया।"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "पॉवर बचत मोड सक्षम किया गया।"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "हाल ही के एप्स"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "एप्लीकेशन जोड़ने में असमर्थ। एप्लीकेशंस की अधिकतम संख्या (%s) तक पहुँच गई है।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "विजेट जोड़ने में असमर्थ। विजेट्स की अधिकतम संख्या (%s) तक पहुँच गई है।"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "पेज निकालें"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "यह पेज और इसकी सामग्री निकाल दी जाएगी।"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "निकालें"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "नेटवर्क सेवाएँ एक्सेस करने के लिए SIM कार्ड इंसर्ट करें।"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "अवरोध मोड"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "चालू"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "बंद"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "मद ले जाया गया।"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "जोड़ने के लिए दो बार टैप करें।"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "विजेट जोड़ें"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "मद जोड़ी गई।"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "मद निकाली गई।"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d का %1$d पेज"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "अधिसूचना बोर्ड मदों को पुनः क्रमित नहीं किया जा सकता।"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "यह %1$d:%2$d है"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "समय है %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "समय है %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d नई मदें"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "विजेट्स की अधिकतम संख्या (%s) तक पहुँच गई है। कुछ विजेट्स हटाएँ और फिर प्रयास करें।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "घड़ी पर वापस जाने हेतु दाएँ स्वाइप करें।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "विजेट्स देखने हेतु बाएँ स्वाइप करें।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "घड़ी पर वापस जाने हेतु बाएँ स्वाइप करें।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "अधिसूचनाएँ देखने हेतु दाएँ स्वाइप करें।"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s की स्थापना रद्द करें?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "विजेट्स की अधिकतम संख्या (%s) पहुँच गई है।"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "एप ट्रे खोलने के लिए दो बार टैप करें।"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 नई मद"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "सक्षम करने के लिए दो बार टैप करें।"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "घड़ी"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "डिवाइस का तापमान बहुत अधिक है"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "मोबाइल डिवाइस का उपयोग करके गियर एप्लीकेशंस डाउनलोड करें।"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "सोने के दौरान"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "अधिक एप्लीकेशंस प्राप्त करें"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "पॉवर बचत + को सक्षम किए जाने के दौरान, कार्रवाई अनुपलब्ध।"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "स्क्रीन रीडर के सक्षम होने के दौरान %s उपलब्ध नहीं होता है।"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "परेशान न करें"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "फ्लाइट मोड सक्षम होने पर मोबाइल डाटा चालू करने में असमर्थ। फ्लाइट मोड अक्षम करें और फिर प्रयास करें।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "घड़ी पर वापस जाने हेतु ऊपर स्वाइप करें।"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "बस, हो गया! गियर में जाएँ!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "मोबाइल नेटवर्क"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "गियर पर कॉल भेजें"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "प्रारंभ करें"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "निकास"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "स्वागत है! गियर उपयोग का तरीका जानने हेतु नीचे बटन टैप करें।"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "अक्षम करने के लिए अनुरोध किया गया"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "सक्षम करने के लिए अनुरोध किया गया"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "घड़ी पर संकेतक चिह्न देखने हेतु शीर्ष किनारा नीचे स्वाइप करें।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "घड़ी पर एप्स देखने हेतु निचले किनारे से ऊपर स्वाइप करें।"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ओके"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "वापस जाने हेतु शीर्ष किनारे से नीचे की ओर स्वाइप करें।"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "एप्लीकेशंस स्थापित करने या स्थापना रद्द करने के लिए, अपने मोबाइल डिवाइस पर सैमसंग गियर एप्लीकेशन का उपयोग करें।"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "यह होम स्क्रीन की मुख्य संरचना है।"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "खाली"
diff --git a/home/res/po/hr.po b/home/res/po/hr.po
new file mode 100755
index 0000000..c56685d
--- /dev/null
+++ b/home/res/po/hr.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikacije"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Dalje"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ne ponovi."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Obriši sve"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Nemoguće ukloniti."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Dodirnite i držite widget da biste ga premjestili."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Početni zaslon je promijenjen."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Učitavanje..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Nije moguće učitati podatke. Dodirnite radi ponavljanja."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Dodavanje aplikacije nije moguće. Nema više mjesta na početnom zaslonu."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Dodavanje widgeta nije moguće. Nema više mjesta na početnom zaslonu."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikacija već postoji."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget već postoji."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Prekid"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Izgled početnog zaslona je promijenjen."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ova će aplikacija biti uklonjena s početnog zaslona. Neće biti obrisana s uređaja."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Ukloni aplikaciju"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Ukloni widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ovaj će widget biti uklonjen s početnog zaslona. Neće biti obrisan s uređaja."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Maks. štednja baterije"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Nemoguće dodati widget. Dostignut maksimalan broj widgeta (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Nemoguće dodati aplikaciju. Dosegnut maksimalan broj aplikacija (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Nemoguće dodati stranicu."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normalan način rada"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Isključena je Štednja baterije."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Štednja energije uključena."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Ned. aplik."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Nemoguće dodati aplikaciju. Dosegnut maksimalan broj aplikacija (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Nemoguće dodati widget. Dostignut maksimalan broj widgeta (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Obrišite stranicu"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Ova stranica i njezin sadržaj bit će uklonjeni."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Ukloni"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Umetnite SIM karticu za pristup mrežnim uslugama."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Način Blokiranja"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Uključeno"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Isključeno"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Premješteno."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Dodirnite dvaput za dodavanje."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Dodaj widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Stavka dodana."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Stavka uklonjena."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Stranica %1$d od %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Nije moguće sortirati stavke ploče s obavijestima."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Sada je %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Sada je %d:%d ujutro."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Sada je %d:%d poslijepodne."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d novih stavki"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Dosegnut je maksimalan broj widgeta (%s). Izbrišite neke widgete pa pokušajte ponovno."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Kliznite desno za vraćanje na sat."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Kliznite lijevo za prikaz widgeta."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Kliznite lijevo za vraćanje na sat."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Kliznite desno za prikaz obavijesti."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Deinstalirati %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Dosegnut je maksimalni broj widgeta (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Dvostrukim dodirom otvorite traku aplikacije."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nova stavka"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Dvaput dodirnite za uključivanje."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Sat"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Temperatura uređaja je previsoka."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Skinite aplikacije za Gear pomoću mobilnog uređaja."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Tijekom spavanja"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Preuzmi više aplikacija"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Radnja nije dostupna dok je uključena Štednja baterije +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s nije dostupna dok je uključen Čitač zaslona."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ne ometajte"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Nemoguće uklj. mob. pod. dok je profil Bez mreže uklj. Isklj. Bez mreže i pokuš. ponovno."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Kliznite gore za vraćanje na sat."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "To je to! Pripremite se za Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobilne mreže"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Pro. poz. na Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Pokretanje"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Prekid"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Dobrodošli! Da biste nauč. upotr. Gear, dodajte gumb u nast."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Zahtjev za isključivanje"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Zahtjev za uključivanje"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Prijeđ. gornj. rub. dolje za prik. ikona indik. na satu."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Prijeđite po donjem rubu gore za prikaz aplik. na satu."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Prijeđite po gornjem rubu prema dolje za povratak."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Za instalaciju ili deinstalaciju aplikacija koristite aplikaciju Samsung Gear na mobilnom uređaju."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Ovo je osnovna struktura početnog zaslona."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Prazno"
diff --git a/home/res/po/hu.po b/home/res/po/hu.po
new file mode 100755
index 0000000..9da43ce
--- /dev/null
+++ b/home/res/po/hu.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Alkalmazások"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Következő"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ne ismételje"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Összes törlése"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Nem lehet eltávolítani."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Tartsa ujját a widgeten, amelyet át kíván helyezni."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "A kezdőképernyő módosult."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Betöltés..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Nem lehet betölteni az adatokat. Érintse meg az újabb próbálkozáshoz."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nem adható hozzá alkalmazás. Nincs több hely a kezdőképernyőn."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nem adható hozzá widget. Nincs több hely a kezdőképernyőn."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Ez az alkalmazás már megvan."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Ez a widget már megvan."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Mégse"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "A kezdőképernyő elrendezése módosult."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ezzel eltávolítja az alkalmazást a kezdőképernyőről. Az eszközről nem törlődik."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Alkalm. eltávolítása"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Widget eltávolítása"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ezzel eltávolítja a widgetet a kezdőképernyőről. Az eszközről nem törlődik."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultratakarékos mód"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Nem lehet hozzáadni a widgetet. Elérte a widgetek maximális számát (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Nem lehet alkalmazást hozzáadni. Elérte az alkalmazások maximális számát (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Nem adható hozzá oldal."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normál mód"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Energiatakarékos mód letiltva."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Energiatakarékos mód engedélyezve."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Legut. alk."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Nem lehet alkalmazást hozzáadni. Elérte az alkalmazások maximális számát (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Nem lehet hozzáadni a widgetet. Elérte a widgetek maximális számát (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Oldal eltávolítása"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "El fogja távolítani az oldalt és annak tartalmát."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Eltávolít"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Hálózati szolgáltatások eléréséhez helyezze be a SIM kártyát."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blokkolás üzemmód"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Be"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Ki"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Tétel áthelyezve."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Érintse meg kétszer a hozzáadáshoz."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Widget hozzáadása"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Tétel hozzáadva."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Tétel eltávolítva."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%1$d. oldal, összesen: %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Az értesítési panel elemei nem rendezhetők át."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "%1$d óra %2$d perc van."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "%d:%d de. van."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "%d:%d du. van."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d új tétel"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Elérte a widgetek maximális számát (%s). Töröljön widgeteket, és próbálja újra."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Jobbra simítva visszajut az órához."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Balra simítva megjelennek a widgetek."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Balra simítva visszajut az órához."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Jobbra simítva megjel. az értesítések."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Eltávolítja a(z) %s animált emotikont?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Elérte a widgetek maximális számát (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Érintse meg kétszer az alkalmazástálca megnyitásához."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 új tétel"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Érintse meg kétszer az engedélyezéshez."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Óra"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Túl magas az eszköz hőmérséklete."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Gear-alkalmazásokat tölthet le a mobileszközzel."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Alváskor"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "További alk. letöltése"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Bekapcsolt Energiatakarékosság + mellett a művelet nem használható."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "A(z) %s nem érhető el, ha a Képernyőolvasó engedélyezett."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ne zavarjanak"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Repülő módban nem kapcsolh. be a mobil int.kapcs. Kapcsolja ki a Rep. módot, és prób. újra."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Felfelé simítva visszajut az órához."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Ez az! Vegye használatba a Geart!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobilhálózatok"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Hívásátir. Gearre"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Indítás"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Kilépés"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Üdvözöljük! A gombot megérintve megismerkedhet a Gearrel."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "A funkció kikapcsolását kérte"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "A funkció bekapcsolását kérte"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "A felső szélt lehúzva jelzőikonok jelennek meg az órán."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Az alsó szélt felhúzva alkalmazások jelenn. meg az órán."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "A visszatéréshez húzza le a felső szélt."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Alkalmazások telepítéséhez vagy eltávolításához használja a mobileszköz Samsung Gear alkalmazását."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Bemutatjuk a kezdőképernyő alapvető felépítését."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Üres"
diff --git a/home/res/po/hy.po b/home/res/po/hy.po
new file mode 100755
index 0000000..e647cd2
--- /dev/null
+++ b/home/res/po/hy.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Ծրագրեր"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Հաջորդ"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Վիդջետ"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Չկրկնել"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Ջնջել բոլորը"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Անհնար է հեռացնել:"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Տեղափոխելու համար թակեք և պահեք պատկերագիրը:"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Հիմնական էկրանը փոխվել է:"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Բեռնում է..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Անհնար է տվյալներ բեռնել: Թակեք՝ նորից փորձելու համար"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Անհնար է ծրագիր ավելացնել. այլևս տեղ չկա հիմնական էկրանում:"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Անհնար է պատկերագիր ավելացնել. այլևս տեղ չկա հիմնական էկրանում:"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Ծրագիրն արդեն գոյություն ունի:"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Պատկերագիրն արդեն գոյություն ունի:"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Չեղարկել"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Հիմնական էկրանի դասավորվածքը փոխվել է:"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Այս ծրագիրը կհեռացվի հիմնական էկրանից: Այն չի վերացվի սարքից:"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Հեռացնել ծրագիրը"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Հեռացնել պատկերագիրը"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Այս պատկերագիրը կհեռացվի հիմնական էկրանից: Այն չի վերացվի սարքից:"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Էներգիայի գերխնայ. ռեժիմ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Անհնար է ավելացնել հարմարանք: Հասել է հարմարանքների առավել. քանակին (%d):"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Անհնար է ծրագիր ավելացնել. հասել է ծրագրերի առավելագույն քանակին (%d):"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Անհնար է էջ ավելացնել:"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Սովորական ռեժիմ"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Էներգիայի խնայման ռեժիմը կասեցված է:"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Էներգիայի խնայման ռեժիմն ընձեռվեց:"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Վերջ. ծրգրեր"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Անհնար է ծրագիր ավելացնել. հասել է ծրագրերի առավելագույն քանակին (%s):"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Անհնար է պատկերագիր ավելացնել. հասել է պատկերագրերի առավելագույն քանակին (%s):"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Հեռացնել էջը"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Այս էջն ու այնտեղի բովանդակությունը կհեռացվեն:"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Հեռացնել"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Տեղադրեք SIM քարտը՝ ցանցային ծառայություններ մտնելու համար:"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Արգելափակման ռեժիմ"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Միացված է"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Անջտվծ"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Տարրը տեղափոխվել է:"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Երկհպեք՝ հավելելու համար:"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Ավելացնել պատկերագիր"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Տարրն ավելացվել է:"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Տարրը հեռացվել է:"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%1$d էջը՝ %2$d-ից"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Անհնար է վերադասավորել ծանուցումների հտախտակի տարրերը:"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Ժամը %1$d:%2$d է:"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Ժամը՝ %d:%d AM:"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Ժամը՝ %d:%d PM:"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d նոր տարրեր"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Հարմարանքների առավելագույն քանակը (%s) լրացավ: Ջնջեք որոշ հարմարանքներ և կրկին փորձեք:"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Սահեցրեք աջ՝ ժամացույց վերադառնալու:"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Սահեցրեք վեր՝ հարմարանքներ դիտելու:"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Սահեցրեք ձախ՝ ժամացույց վերադառնալու:"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Սահեցրեք աջ՝ ծանուցումներ դիտելու:"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Ապատեղադրե՞լ %s-ը:"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Հասել է պատկերագրերի առավելագույն քանակին (%s):"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Կրկնակի թակեք՝ ծրագրերի մատուցարանը բացելու համար:"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 նոր տարր"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Երկհպեք` միացնելու համար:"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Ժամացույց"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Սարքի ջերմաստիճանը չափազանց բարձր է:"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Ներբեռնել Gear ծրագրեր շարժական սարքով:"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Քնի ընթացքում"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Ստացեք ավելի շատ ծրագրեր"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Գործողությունն անմատչելի է, երբ միացված է Էներգիայի խնայում +:"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s-ը մատչելի չէ, երբ Էկրանի ընթերցիչն ընձեռված է:"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Չանհանգստացնել"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Անհն. է միացնել Շարժ. տվյ., երբ Թռիչք. ռեժիմն ընձեռ. է: Կասեցրեք Թռիչք. ռժմ և նորից փորձեք:"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Սահեցրեք վեր՝ ժամացույցին վերադառ. հր:"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Ահա՛ և ամենը: Սկսե՛ք գործածել Gear-ը:"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Շարժական ցանցեր"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Փխնցլ կանչեր Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Մեկնարկել"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Ելք"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Բարի գալուստ: Թակ. ներքևի կոճակ՝ իմանալու, ինչպես օգտ. Gear:"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Պահանջվում է կասեցնել"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Պահանջվում է ընձեռել"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Վերին եզր սահեց. վար՝ ցուցիչ պատկերակ. ժմց. վրա տես. հր:"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Ներքևի եզրը սահեցրեք վեր՝ ծրագրերը ժմցույցի վրա դիտ. հր:"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Վերին եզրը մատով սահեցրեք ներքև՝ հետ գնալու համար:"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Ծրագրեր տեղադրելու և ապատեղադրելու համար օգտագործեք Samsung Gear ծրագիրը Ձեր շարժական սարքում:"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Սա հիմնական էկրանի գլխավոր կառուցվածքն է:"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Դատարկ է"
diff --git a/home/res/po/id.po b/home/res/po/id.po
new file mode 100755
index 0000000..7e36e3e
--- /dev/null
+++ b/home/res/po/id.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikasi"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Selanjutnya"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Jgn ulangi"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Hapus semua"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Tidak dapat menghapus."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Ketuk dan tahan widget untuk memindahkannya."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Layar depan diubah."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Meloading…"
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Tidak dapat memuat data. Ketuk untuk mencoba lagi."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Tidak dapat menambah aplikasi. Tidak ada ruang lagi di layar depan."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Tidak dapat menambah widget. Tidak ada ruang lagi di layar depan."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikasi sudah ada."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget sudah ada."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Batalkan"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Tata letak layar depan diubah."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Aplikasi ini akan dihapus dari layar depan. Aplikasi tidak akan dihapus dari perangkat."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Hapus aplikasi"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Hapus widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Widget ini akan dihapus dari layar depan. Aplikasi tidak akan dihapus dari perangkat."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Mode hemat daya ultra"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Tidak dapat menambah widget. Jumlah maksimum widget (%d) tercapai."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Tidak dapat menambahkan aplikasi. Jumlah maksimum aplikasi (%d) tercapai."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Tidak dapat menambah halaman."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Mode normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Mode hemat daya diaktifkan."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Mode hemat daya diaktifkan."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Apl terakhir"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Tidak dapat menambah aplikasi. Jumlah maksimum aplikasi (%s) tercapai."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Tidak dapat menambah widget. Jumlah maksimum widget (%s) tercapai."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Hapus halaman"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Halaman ini beserta kontennya akan dihapus."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Hapus"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Masukkan kartu SIM utk mengakses layanan jaringan."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Mode pemblokiran"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Aktif"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Tdk aktif"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Item dipindahkan."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Ketuk dua kali untuk menambah."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Tambah widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Item ditambahkan."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Item dihapus."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Halaman %1$d dari %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Tidak dapat menyusun ulang item papan notifikasi."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Pukul %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Adalah %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Adalah %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d item baru"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Jumlah maksimum widget (%s) telah tercapai. Hapus beberapa widget dan coba lagi."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Usap ke kanan untuk kembali ke jam."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Usap ke kiri untuk melihat widget."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Usap ke kiri untuk kembali ke jam."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Usap ke kanan untuk lihat notifikasi."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Hapus instalasi %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Jumlah maksimum widget (%s) tercapai."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Ketuk dua kali untuk membuka baki aplikasi."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 item baru"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Ketuk dua kali untuk mengaktifkan."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Jam"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Suhu perangkat terlalu tinggi."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Unduh aplikasi Gear dengan perangkat seluler."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Saat tidur"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Dapatkan aplk lainnya"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Tindakan tidak tersedia saat Hemat daya + diaktifkan."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s tidak tersedia saat Pembaca layar diaktifkan."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Jangan diganggu"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Tdk dpt hidupkan Data seluler saat mode Terbang aktif. Nnaktifkan mde Terbang dan cb lg."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Usap ke atas untuk kembali ke jam."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Nah! Ayo mulai pakai Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Jringan seluler"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Trskn pgln k Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Mulai"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Keluar"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Selamat dtng! Ktk tmbl di bwh utk pelajari cr gunakan Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Diminta untuk dinonaktifkan"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Diminta untuk diaktifkan"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Usap tepi atas ke bwh utk melihat ikon indikator di jam."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Usap dr tepi bawah ke atas utk melihat aplikasi di jam."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Usap tepi atas ke bawah untuk kembali."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Untuk menginstal atau menghapus instalasi aplikasi, gunakan aplikasi Samsung Gear di perangkat seluler Anda."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Ini adalah struktur utama dari layar depan."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Kosong"
diff --git a/home/res/po/is.po b/home/res/po/is.po
new file mode 100755
index 0000000..3b18d3d
--- /dev/null
+++ b/home/res/po/is.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Forrit"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Næsta"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Græja"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ekki endurt."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Eyða öllu"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Mistókst að fjarlægja."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Pikkaðu og haltu inni á græju til að færa hana."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Heimaskjá var breytt."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Hleð..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Ekki tókst að hlaða gögn. Pikkaðu til að reyna aftur."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Ekki er hægt að bæta við forriti. Ekki er pláss á heimaskjánum."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Ekki er hægt að bæta við græju. Ekki er pláss á heimaskjánum."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Forritið er þegar til."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Græjan er þegar til."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Hætta við"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Útliti heimaskjás var breytt."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Forritið verður fjarlægt af heimaskjánum. Því verður ekki eytt úr tækinu."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Fjarlægja forrit"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Fjarlægja græju"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Græjan verður fjarlægð af heimaskjánum. Henni verður ekki eytt úr tækinu."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ofursparnaðarstilling"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Ekki er hægt að bæta græju við. Hámarksfjölda græja (%d) hefur verið náð."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Ekki er hægt að bæta forritinu við. Hámarksfjölda forrita (%d) hefur verið náð."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Ekki er hægt að bæta við síðu."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Venjuleg stilling"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Slökkt á orkusparnaðarstillingu."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Kveikt á orkusparnaðarstillingu."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Nýleg forrit"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Ekki er hægt að bæta forritinu við. Hámarksfjölda forrita (%s) hefur verið náð."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Ekki er hægt að bæta græjunni við. Hámarksfjölda græja (%s) hefur verið náð."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Fjarlægja síðu"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Síðan og efni hennar verður fjarlægt."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Fjarlægja"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Setjið SIM kort í til að fá aðgang að netþjónustu."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Bannlista-\nstilling"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Kveikt"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Slökkt"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Atriði fært."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Pikkaðu tvisvar til að bæta við."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Bæta við græju"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Atriði bætt við."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Atriði fjarlægt."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Síða %1$d af %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Ekki er hægt að endurraða atriðum á tilkynningatöflu."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Klukkan er %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Hún er %d:%d fyrir hádegi."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Hún er %d:%d eftir hádegi."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d nýir hlutir"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Hámarksfjölda græja (%s) hefur verið náð. Eyddu einhverjum græjum og reyndu svo aftur."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Strjúktu til hægri fyrir klukku."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Strjúktu til vinstri fyrir græjur."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Strjúktu til vinstri fyrir klukku."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Strjúktu til hægri fyrir tilkynningar."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Fjarlægja %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Hámarksfjölda græja (%s) hefur verið náð."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Pikkaðu tvisvar til að opna forritaskúffu."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "Eitt nýtt atriði"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Pikkaðu tvisvar til að kveikja."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Klukka"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Tækið er of heitt."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Sæktu Gear-forrit með fartæki."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Sofandi"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Sækja fleiri forrit"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Ekki er hægt að nota aðgerð meðan kveikt er á orkusparnaði +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s er ekki í boði þegar kveikt er á skjálesara."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ónáðið ekki"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Ekki er hægt að kveikja á farsímagögnum í flugstillingu. Slökktu á henni og reyndu aftur."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Strjúktu upp fyrir klukku."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Þá er þetta komið! Þú getur byrjað að nota Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Farsímakerfi"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Frs. símt. í Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Ræsa"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Fara út"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Velkomin(n)! Pikkaðu á hnappinn niðri og lærðu að nota Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Beðið um að slökkva"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Beðið um að kveikja"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Strjúktu niður frá efri brún til að sjá tákn á klukku."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Strjúktu upp frá neðri brún til að skoða forrit klukku."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "Í lagi"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Strjúktu niður frá efri brún til að fara til baka."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Til að setja upp eða fjarlægja forrit skaltu nota Samsung Gear forritið í fartækinu."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Þetta er uppbygging heimaskjásins."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Tómt"
diff --git a/home/res/po/it_IT.po b/home/res/po/it_IT.po
new file mode 100755
index 0000000..b225b63
--- /dev/null
+++ b/home/res/po/it_IT.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Applicazioni"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Avanti"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Non ripetere"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Elimina tutto"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Impossibile rimuovere."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Toccate e tenete premuto un widget per spostarlo."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Schermata Home modificata."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Caricamento..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Impossibile caricare i dati. Toccate per riprovare."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Impossibile aggiungere applicazione. Spazio insufficiente nella schermata Home."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Impossibile aggiungere widget. Spazio insufficiente nella schermata Home."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Applicazione già esistente."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget già esistente."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Annulla"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Layout della schermata Home modificato."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Quest'applicazione verrà rimossa dalla schermata Home. Non verrà eliminata dal dispositivo."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Rimuovi applicazione"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Rimuovi widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Questo widget verrà rimosso dalla schermata Home. Non verrà eliminato dal dispositivo."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Risparmio energetico avanzato."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Impossibile aggiungere il widget. Il numero massimo di widget (%d) è stato raggiunto."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Impossibile aggiungere l'applicazione. Il numero massimo di applicazioni (%d) è stato raggiunto."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Impossibile aggiungere la pagina."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Modalità normale"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Modalità di risparmio energetico disattivata."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Modalità di risparmio energetico attivata."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "App recenti"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Impossibile aggiungere l'applicazione. Il numero massimo di applicazioni (%s) è stato raggiunto."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Impossibile aggiungere il widget. Il numero massimo di widget (%s) è stato raggiunto."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Rimuovi pagina"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Questa pagina e il relativo contenuto verranno rimossi."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Rimuovi"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Inserite una scheda SIM per accedere ai servizi di rete."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Modalità di blocco"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Attivo"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Non attivo"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elemento spostato."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Toccate due volte per aggiungere."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Aggiungi widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Elemento aggiunto."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Elemento rimosso."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Pagina %1$d di %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Impossibile riordinare gli elementi dell'area notifiche."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Sono le %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Sono le %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Sono le %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d nuovi elementi"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "È stato raggiunto il numero massimo di widget (%s). Eliminate alcuni widget e riprovate."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Trascinate a dx per tornare all'orologio."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Trascinate a sx per vedere i widget."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Trascinate a sx per tornare all'orologio."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Trascinate a dx per vedere le notifiche."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Disinstallare %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Numero massimo di widget (%s) raggiunto."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Toccate due volte per aprire la barra delle applicazioni."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nuovo elemento"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Toccate due volte per attivare."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Orologio"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "La temperatura del dispositivo è troppo alta."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Potete scaricare applicazioni Gear mediante il dispositivo mobile."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Mentre dormite"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Ottieni altre applicaz."
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Azione non disponibile mentre il Risparmio energetico + è attivato."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s non è disponibile mentre Lettore schermo è attivo."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Non disturbare"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Imposs. attiv. la conness. dati se la mod. offline è attivata. Disattivatela e riprovate."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Trascina in alto per tornare all'orologio."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Perfetto, entra in Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Reti mobili"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Inol. ch. su Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Avvia"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Esci"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Benvenuti! Per imparare a usare Gear toccate il pulsante."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Richiesta di disattivazione"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Richiesta di attivazione"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Trasc. bordo super. in basso per vedere icone su orolog."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Trasc. bordo infer. in alto per vedere le app su orolog."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Trascinate il bordo super. in basso per tornare indietro."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "Nell'orologio, trascinate verso il basso dal bordo superiore per visualizzare le icone degli indicatori."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "Nell'orologio, trascinate verso l'alto dal bordo inferiore per visualizzare le applicazioni."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "Dall'orologio, trascinate il dito a destra per visualizzare le notifiche."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Trascinate il dito a sinistra per tornare all'orologio."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "Dall'orologio, trascinate il dito a sinistra per visualizzare i widget."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Trascinate il dito a destra per tornare a orologio."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "Dall'orologio, trascinate il dito verso l'alto per visualizzare le app."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Trascinate il dito verso il basso per tornare all'orologio."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "Dall'orologio, trascinate il dito verso il basso per visualizzare la barra dei momenti."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Trascinate il dito verso l'alto per tornare all'orologio."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "L'orologio è impostato come schermata Home. Toccate sotto per iniziare."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Per installare o disinstallare le applicazioni, utilizzate l'applicazione Samsung Gear sul dispositivo mobile."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Questa è la struttura principale della schermata Home."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "Questo è il layout della schermata Home."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Vuoto"
diff --git a/home/res/po/ja_JP.po b/home/res/po/ja_JP.po
new file mode 100755
index 0000000..83eef94
--- /dev/null
+++ b/home/res/po/ja_JP.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "アプリ"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "次へ"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "ウィジェット"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "表示しない"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "全て削除"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "削除することはできません。"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "移動するには、ウィジェットを長押しします。"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "ホーム画面が変更されました。"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "読み込み中..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "データをロードできません。タップして再度実行してください。"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "アプリケーションを追加できません。ホーム画面に空きがありません。"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ウィジェットを追加できません。ホーム画面に空きがありません。"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "アプリケーションは既に存在します。"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ウィジェットは既に存在します。"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "キャンセル"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "ホーム画面のレイアウトを変更しました。"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "このアプリケーションをホーム画面から削除します。端末からは削除されません。"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "アプリを削除"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ウィジェットを削除"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "このウィジェットをホーム画面から削除します。端末からは削除されません。"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "ウルトラ省電力モード"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ウィジェットを追加できません。ウィジェットの最大数(%d)に達しました。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "アプリケーションを追加できません。アプリケーションの最大数(%d件)に達しました。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "ページを追加できません。"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "標準モード"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "[省電力モード]を無効にしました。"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "省電力モードを有効にしました。"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "最近のアプリ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "アプリケーションを追加できません。アプリケーションの最大件数(%s件)に達しました。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ウィジェットを追加できません。ウィジェットの最大件数(%s件)に達しました。"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "ページを削除"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "このページとコンテンツを削除します。"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "削除"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "ネットワークサービスを利用するにはSIMカードを挿入してください。"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "ブロック​モード"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ON"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "OFF"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "アイテムを移動しました。"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "追加するにはダブルタップしてください。"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "ウィジェットを追加"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "アイテムが追加されました。"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "アイテムが削除されました。"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d中の%1$dページです。"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "通知ボードのアイテムを並べ替えることはできません。"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "%1$d:%2$dです。"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "午前%d時%d分です。"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "午後%d時%d分です。"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d件の最新アイテム"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "ウィジェットの最大件数(%s件)に達しました。不要なウィジェットを削除し、再度実行してください。"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "時計に戻るには右にスワイプします。"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ウィジェットを表示するには左にスワイプします。"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "時計に戻るには左にスワイプします。"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "通知を見るには右にスワイプします。"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%sをアンインストールしますか?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ウィジェットの最大件数(%s件)に達しました。"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "アプリトレイを開くにはダブルタップします。"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1件の最新アイテムです。"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "有効にするには、ダブルタップします。"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "時計"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "端末の温度が高すぎます。"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "モバイル端末でGearアプリケーションをダウンロードしてください。"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "睡眠中"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "他のアプリを取得"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "[省電力モード+]が有効な間は、この操作を実行できません。"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "スクリーンリーダーが有効な間は、%sを利用できません。"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "通知をミュート"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "機内モードが有効なときはモバイルデータをONにできません。機内モードを無効にし、再度お試しください。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "時計に戻るには、上にスワイプします。"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "説明は以上です。Gearをお楽しみください。"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "モバイルネットワーク"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Gearに転送"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "開始"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "終了"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "ようこそ。Gearの使い方を確認するには、下のボタンをタップします。"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "無効に設定中"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "有効に設定中"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "インジケーターを表示するには、時計の上端から下にスワイプします。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "アプリを表示するには、時計の下端から上にスワイプします。"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "戻るには、画面の上端から下にスワイプします。"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "アプリケーションをインストールまたはアンインストールするには、モバイル端末でSamsung Gearアプリケーションを使用してください。"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "これはホーム画面の構成です。"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "空き"
diff --git a/home/res/po/ka.po b/home/res/po/ka.po
new file mode 100755
index 0000000..59f72ad
--- /dev/null
+++ b/home/res/po/ka.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "პროგრამები"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "შემდეგი"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "გრაფიკული კლიპი"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "არ გამეორდეს"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "ყველას წაშლა"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "ვერ მოცილდება."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ვიჯეტის გადასატანად დაარტყით მას და არ აიღოთ ხელი."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "საწყისი ეკრანი შეიცვალა."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "იტვირთება..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "მონაცემთა ჩატვირთვა შეუძლებელია. შეეხეთ და გაიმეორეთ მცდელობა"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "პროგრამა ვერ ემატება. საწყის ეკრანზე აღარ არის ადგილი."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ვიჯეტის დამატება შეუძლებელია. საწყის ეკრანზე აღარ არის ადგილი."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "პროგრამა უკვე არსებობს."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ვიჯეტი უკვე არის."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "გაუქმება"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "საწყისი ეკრანის განლაგება შეიცვალა."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ეს პროგრამა წაიშლება საწყის ეკრანზე. იგი არ წაიშლება აპარატში."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "პროგრამის წაშლა"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ვიჯეტის წაშლა"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ეს ვიჯეტი წაიშლება საწყის ეკრანზე. იგი არ წაიშლება აპარატში."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "დაზოგვის ულტრა რეჟიმი"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ვიჯეტის დამატება შეუძლებელია. მიღწეულია ვიჯეტების მაქსიმალური რაოდენობა (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "პროგრამის დამატება შეუძლებელია. მიღწეულია პროგრამების მაქსიმალური რაოდენობა (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "გვერდს ვერ დაამატებთ."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "ნორმალური რეჟიმი"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "ენერგიის დაზოგვის რეჟიმი გამორთულია."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "ენერგიის დაზოგვის რეჟიმი ჩართულია."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "ბოლო პროგრ."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "პროგრამა ვერ ემატება. მიღწეულია პროგრამების მაქსიმალური რაოდენობა (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ვიჯეტის დამატება შეუძლებელია. მიღწეულია ვიჯეტების მაქსიმალური რაოდენობა (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "გვერდის წაშლა"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "ეს გვერდი და მისი შიგთავსი წაიშლება."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "წაშლა"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "ქსელის მომსახურების მისაღებად ჩასვით SIM ბარათი."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "დაბლოკვის რეჟიმი"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ჩართ."
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "გამორთ."
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "ელემენტი გადატანილია."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "დასამატებლად შეეხეთ ორჯერ."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "ვიჯეტის დამატება"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "ელემენტი დაემატა."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "ელემენტი წაიშალა."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "გვერდი %1$d, სულ %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "შეტყობინებათა დაფის ელემენტების განლაგებას ვერ შეცვლით."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "ახლა არის %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "ახლა არის %d:%d, შუადღემდე."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "ახლა არის %d:%d, შუადღის შემდეგ."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d ახალი ელემენტი"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "მიღწეულია ვიჯეტების მაქსიმალური რაოდენობა (%s). წაშალეთ ზოგიერთი ვიჯეტი და ისევ სცადეთ."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "საათზე დაბრუნდებით მარჯვნივ გადასმით."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ვიჯეტებს ნახავთ მარცხნივ გადასმით."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "საათზე დაბრუნდებით მარცხნივ გადასმით."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "შეტყობინებები ნახეთ მარჯვნივ გადასმით."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "ამოინსტალირდეს %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "მიღწეულია ვიჯეტების მაქსიმალური რაოდენობა (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "შეეხეთ ორჯერ და პროგრამის ლანგარი გაიხსნება."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 ახალი ელემენტი"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "შეეხეთ ორჯერ და გააქტიურდება."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "საათი"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "მოწყობილობის ტემპერატურა ძალიან მაღალია."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "მობილური აპარატით ჩამოტვირთეთ Gear-ის აპლიკაციები."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "ძილის დროს"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "მიიღეთ სხვა აპლიკაციები"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "მოქმედება ვერ შესრულდება, როდესაც გააქტიურებულია ენერგიის დაზოგვა +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s მიუწვდომელია, როდესაც გააქტიურებულია ეკრანის წამკითხველი."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "არ შემაწუხოთ"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "მობილურ მონაცემთა ქსელს ვერ ჩართავთ ფრენის რეჟიმში. გამორთეთ ფრენის რეჟიმი და ისევ სცადეთ."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "აუსვით თითი და დაბრუნდებით საათზე."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "სულ ესაა! მოირგეთ Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "მობილური ქსელი"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "ზარები Gear-ში"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "დასაწყისი"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "გამოსვ."
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "სალამი! Gear-ის ინფოსთვის შეეხეთ ქვემოთ მოცემულ ღილაკს."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "მოთხოვნილია გამორთვა"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "მოთხოვნილია გააქტიურება"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "საათზე ინდიკატორების სანახავად, ჩამოუსვით თითი ზემოდან."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "საათზე აპლიკაციების სანახავად, აუსვით თითი ქვემოდან."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "კი"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "უკან დასაბრუნებლად, ჩამოუსვით ზედა კიდედან ქვემოთ."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "აპლიკაციების დასაინსტალირებლად ან ინსტალაციის გასაუქმებლად, გამოიყენეთ Samsung Gear აპლიკაცია მობილურ მოწყობილობაში."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "ეს არის საწყისი ეკრანის ძირითადი სტრუქტურა."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ცარიელია"
diff --git a/home/res/po/kk.po b/home/res/po/kk.po
new file mode 100755
index 0000000..3f623ac
--- /dev/null
+++ b/home/res/po/kk.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Бағдарламалар"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Келесі"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Виджет"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Қайталамау"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Барлығын жою"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Алып тастау мүмкін емес."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Виджетті жылжыту үшін оны басып тұрыңыз."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Бастапқы экран өзгертілді."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Жазылуда..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Деректерді жүктеу мүмкін емес. Қайталау үшін түртіңіз"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Бағдарламаны қосу мүмкін емес. Бұл бастапқы экранда басқа орын жоқ."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Виджетті қосу мүмкін емес. Бұл бастапқы экранда басқа орын жоқ."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Бағдарлама бұрыннан бар."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Виджет бұрыннан бар."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Тоқтату"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Бастапқы экран құрылымы өзгертілді."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Осы бағдарлама бастапқы экраннан жойылады. Ол құрылғыдан жойылмайды."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Бағдарламаны жою"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Виджетті жою"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Осы виджет бастапқы экраннан жойылады. Ол құрылғыдан жойылмайды."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ультра қуат үнемдеу реж."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Виджетті қосу мүмкін емес. Виджеттердің ең көп санына (%d) жетті."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Қолданбаны қосу мүмкін болмады. Ең көп қолданбалар санына (%d) жеттіңіз."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Бет қосу мүмкін емес."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Қалыпты режим"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Қуат үнемдеу режимі өшірілді."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Қуат үнемдеу режимі қосылды."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Соңғы бағд-р"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Бағдарламаны қосу мүмкін болмады. Бағдарламалардың ең көп санына (%s) жетті."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Виджет қосу мүмкін емес. Виджеттердің ең көп санына (%s) жетті."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Бетті жою"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Бұл бет және оның мазмұны жойылады."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Жою"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Желі қызметтеріне өту үшін SIM картасына салу."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Блоктау режимі"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Қосылған"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Өшірілген"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Элемент көшірілді."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Қосу үшін екі рет түртіңіз."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Графикалық үзінді қосу"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Элемент қосылды."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Элемент жойылды."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d ішіндегі %1$d бет"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Хабарландыру тақтасының элементтерін қайта ретке келтіру мүмкін емес."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Ол — %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Сағат %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Сағат %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d жаңа элемент"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Виджеттердің максималды санына (%s) жетті. Кейбір виджеттерді жойып, әрекетті қайталаңыз."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Сағатқа оралу үшін, оңға сипаңыз."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Виджеттерді көру үшін, солға сипаңыз."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Сағатқа оралу үшін, солға сипаңыз."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Хабарлан-ды көру үшін, солға сипаңыз."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s жою керек пе?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Виджеттердің ең көп санына (%s) жетті."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Бағдарлама науасын ашу үшін екі рет түртіңіз."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 жаңа элемент"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Іске қосу үшін екі рет түртіңіз."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Сағат"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Құрылғы температурасы тым жоғары."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Ұялы құрылғының көмегімен Gear бағдарламасын жүктеңіз."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Ұйықтау кезінде"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Қос.бағдарламалар алу"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Қуат үнемдеу + іске қосылғанда әрекет қол жетімсіз."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Экран оқу құралы қосулы болған кезде %s қолжетімсіз."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Мазаламаңыз"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Ұшу реж.іске қосылғанда ұялы дерект.қосу мүмкін емес. Ұшу реж.өшіріп, әрекетті қайталаңыз."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Сағатқа қайта өту үшін жоғ.сипаңыз."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Бітті! Gear құрылғысына кіріңіз!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Ұялы байл.жел-і"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Қоң.Gear құр.бұру"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Бастау"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Шығу"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Қош келдіңіз! Gear пайд. көру үшін, төмендегі түймені түр-з."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Өшіру сұралды"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Қосу сұралды"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Сағат индик. белг. көру үшін, жоғ. төмен қарай сипаңыз."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Сағат бағдарл. көру үшін, төменнен жоғары қарай сипаңыз."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Артқа қайту үшін, жоғарыдан төмен қарай сипаңыз."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Бағдарламаларды орнату немесе жою үшін, ұялы құрылғыдағы Samsung Gear бағдарламасын пайдаланыңыз."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Бұл бастапқы экранның негізгі құрылымы."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Бос"
diff --git a/home/res/po/km.po b/home/res/po/km.po
new file mode 100755
index 0000000..e298aa2
--- /dev/null
+++ b/home/res/po/km.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "កម្មវិធី"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "បន្ទាប់"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "វីដជីត"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "កុំ​ធ្វើឡើងវិញ"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "លុប​ទាំងអស់"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "មិន​អាច​លុប។"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ប៉ះ​វីដជីត​មួយ​ឲ្យ​ជាប់​ដើម្បី​ផ្លាស់ទី​វា។"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "បាន​ប្តូរ​គេហ​អេក្រង់។"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "កំពុង​ផ្ទុក..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "មិន​អាច​ផ្ទុក​ទិន្នន័យ។ ប៉ះ​ដើម្បី​សាកល្បង​ម្ដងទៀត។"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "មិន​អាច​ថែម​កម្មវិធី។ គ្មាន​កន្លែង​ទៀត​លើ​គេហអេក្រង់។"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "មិន​អាច​ថែម​វីដជីត។ គ្មាន​កន្លែង​ទៀត​លើ​គេហអេក្រង់។"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "កម្មវិធី​មាន​ហើយ។"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "វីដជីត​មាន​ហើយ។"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "បោះ​បង់"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "បាន​ប្តូរ​ប្លង់​គេហអេក្រង់។"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "នឹង​លុប​កម្មវិធី​នេះ​ពី​គេហអេក្រង់។ វា​នឹង​មិន​លុប​ពី​ឧបករណ៍​នេះ​ទេ។"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "លុប​កម្មវិធី"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "លុប​វីដជីត"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "នឹង​លុប​វីដជីត​នេះ​ពី​គេហអេក្រង់។ វា​នឹង​មិន​លុប​ពី​ឧបករណ៍​នេះ​ទេ។"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "ទម្រង់​សំចៃ​ថាមពល​បំផុត"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "មិន​អាច​ថែម​វីដជីត។ បាន​ដល់​ចំនួន​អតិបរមា​នៃ​វីដជីត (%d)។"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "មិន​អាច​ថែម​កម្មវិធី។ បាន​ដល់​ចំនួន​អតិបរមា​នៃ​កម្មវិធី (%d)។"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "មិន​អាច​ថែម​ទំព័រ។"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "ទម្រង់​ធម្មតា"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "បាន​បិទ​ទម្រង់​សំចៃ​ថាមពល។"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "បាន​បើកប្រើ​ទម្រង់​សំចៃ​ថាមពល។"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "កម្មវិធី​ថ្មីៗ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "មិន​អាច​ថែម​កម្មវិធី។ បាន​ដល់​ចំនួន​អតិបរមា​នៃ​កម្មវិធី (%s)។"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "មិន​អាច​ថែម​វីដជីត។ បាន​ដល់​ចំនួន​អតិបរមា​នៃ​វីដជីត (%s)។"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "លុប​ទំព័រ"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "នឹង​លុប​ទំព័រ​នេះ និង ខ្លឹមព័ត៌មាន​របស់​វា។"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "លុបចេញ"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "បញ្ចូលកាត SIM ដើម្បី​ចូលប្រើ​សេវា​បណ្ដាញ។"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "ទម្រង់​ខ្ទប់"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "បើក"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "បិទ"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "បាន​ផ្លាស់ទី​ធាតុ។"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "ប៉ះ​ពីរដង​ដើម្បី​ថែម។"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "ថែម​វីដជីត"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "បាន​ថែម​ធាតុ។"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "បាន​លុប​ធាតុ។"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "ទំព័រ %1$d នៃ %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "មិន​អាច​រៀបលំដាប់​ធាតុ​លើ​ក្ដារ​ជូនដំណឹង​ឡើងវិញ។"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "វា​គឺ %1$d:%2$d។"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "វា​គឺ %d:%d AM។"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "វា​គឺ %d:%d PM។"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "ធាតុ​ថ្មី %d"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "បាន​ដល់​ចំនួន​អតិបរមា​នៃ​វីដជីត (%s)។ លុប​វីដជីត​ខ្លះ ហើយ​សាកល្បង​ម្ដងទៀត។"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "អូស​ទៅ​ស្ដាំ ដើម្បី​ត្រឡប់​ទៅ​នាឡិកា។"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "អូស​មក​ឆ្វេង ដើម្បី​បង្ហាញ​វីដជីត។"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "អូស​មក​ឆ្វេង ដើម្បី​ត្រឡប់​ទៅ​នាឡិកា។"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "អូស​ទៅ​ស្ដាំ ដើម្បី​បង្ហាញ​ការជូនដំណឹង។"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "មិនដំឡើង %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "បាន​ដល់​ចំនួន​អតិបរមា​នៃ​វីដជីត (%s)។"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "ប៉ះ​ពីរដង​ដើម្បី​បើក​ស្ពក​កម្មវិធី។"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "ធាតុ​ថ្មី 1"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "ប៉ះ​ពីរដង​ដើម្បី​បើកប្រើ។"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "នាឡិកា"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "សីតុណ្ហភាព​ឧបករណ៍​ខ្ពស់​ពេក។"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "ទាញយក​កម្មវិធី Gear ដោយ​ប្រើ​ឧបករណ៍​ចល័ត។"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "ខណៈពេល​គេង"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "ទទួល​កម្មវិធី​ច្រើនទៀត"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "មិន​អាច​ធ្វើ​សកម្មភាព ខណៈពេល​បាន​បើកប្រើ​ការសំចៃ​ថាមពល +។"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s មិន​អាច​ប្រើ​បាន ខណៈពេល​បាន​បើកប្រើ​កម្មវិធី​អាន​អេក្រង់។"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "កុំ​រំខាន"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "មិន​អាច​បើក​ទិន្នន័យ​ចល័ត ខណៈពេល​បាន​បើកប្រើ​ទម្រង់​យន្តហោះ។ បិទ​ទម្រង់​យន្តហោះ ហើយ​សាកល្បង​ម្ដងទៀត។"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "អូស​ឡើងលើ ដើម្បី​ត្រឡប់​ទៅ​នាឡិកា។"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "ប៉ុណ្ណេះ​ឯង! សូម​ចូល​ទៅ​ប្រើ Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "បណ្ដាញ​ចល័ត"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "បញ្ជូនបន្ត​ការហៅ​ទៅ Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "ចាប់ផ្តើម"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "ចេញ"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "សូម​ស្វាគមន៍! ប៉ះ​ប៊ូតុង​ខាងក្រោម​ដើម្បី​រៀន​ពី​របៀប​ប្រើ Gear របស់​អ្នក។"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "បាន​ស្នើ​ឲ្យ​បិទ"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "បាន​ស្នើ​ឲ្យ​បើកប្រើ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "អូស​ពី​គែម​ខាងលើ​ចុះក្រោម ដើម្បី​ឃើញ​អាយខុន​សញ្ញាបង្ហាញ​លើ​នាឡិកា។"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "អូស​ពី​គែម​ខាងក្រោម​ឡើងលើ ដើម្បី​បង្ហាញ​កម្មវិធី​លើ​នាឡិកា។"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ព្រម"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "អូស​ពី​គែម​ខាងលើ​ចុះក្រោម ដើម្បី​ថយ​ក្រោយ។"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "ដើម្បី​ដំឡើង ឬ លុប​កម្មវិធី សូម​ប្រើ​កម្មវិធី Samsung Gear លើ​ឧបករណ៍​ចល័ត​របស់​អ្នក។"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "នេះ​គឺ​ជា​រចនាសម្ពន្ធ​មេ​នៃ​គេហអេក្រង់។"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ទទេ"
diff --git a/home/res/po/kn.po b/home/res/po/kn.po
new file mode 100755
index 0000000..47287ad
--- /dev/null
+++ b/home/res/po/kn.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "ಅನ್ವಯಿಸುವಿಕೆಗಳು"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "ಮುಂದಿನ"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "ವಿಜೆಟ್"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "ಪುನರಾವರ್ತಿಸಬೇಡಿ."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "ಎಲ್ಲವನ್ನೂ ಅಳಿಸಿ"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "ಕದಲಿಸಲು ಅಸಮರ್ಥ."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ಅದನ್ನು ಕದಲಿಸಲು ಒಂದು ವಿಜೆಟ್‌ನ್ನು ತಟ್ಟಿ ಮತ್ತು ಹಿಡಿಯಿರಿ."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಬದಲಾಯಿಸಲಾಗಿದೆ."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "ಲೋಡಿಂಗ್..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ಡೇಟಾ ಲೋಡ್ ಮಾಡಲು ಅಸಮರ್ಥ. ಮರುಪ್ರಯತ್ನಿಸಲು ಒತ್ತಿ."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ಅನ್ವಹಿಸುವಿಕೆ ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಹೋಮ್‌ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಇನ್ನು ಕೊಠಡಿಗಳು ಇಲ್ಲ."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ವಿಜೆಟ್ ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಹೋಮ್‌ ಸ್ಕ್ರೀನ್‌ನಲ್ಲಿ ಇನ್ನು ಕೊಠಡಿಗಳು ಇಲ್ಲ."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "ಅನ್ವಯಿಸುವಿಕೆ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ವಿಜೆಟ್ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "ರದ್ದು"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "ಹೋಮ್‌ ಸ್ಕ್ರೀನ್‌ ವಿನ್ಯಾಸ ಬದಲಾಗಿದೆ."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ಈ ಅನ್ವಹಿಸುವಿಕೆ ಅನ್ನು ಹೋಮ್‌ ಸ್ಕ್ರೀನ್‌ನಿಂದ ತೆಗೆಯಲಾಗುವುದು. ಇದನ್ನು ಸಾಧನದಿಂದ ಅಳಿಸಲಾಗುವುದಿಲ್ಲ."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "ಅನ್ವಹಿಸುವಿಕೆ ತೆಗೆಯಿರಿ"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ವಿಜೆಟ್ ತೆಗೆಯಿರಿ"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ಈ ವಿಜೆಟ್ ಅನ್ನು ಹೋಮ್‌ ಸ್ಕ್ರೀನ್‌ನಿಂದ ತೆಗೆಯಲಾಗುವುದು. ಇದನ್ನು ಸಾಧನದಿಂದ ಅಳಿಸಲಾಗುವುದಿಲ್ಲ."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "ಅಲ್ಟ್ರಾ ಪವರ್ ಸೇವಿಂಗ್ ಮೋಡ್‌"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ವಿಡ್ಜೆಟ್ ಸೇರಿಸಲಾಗಲಿಲ್ಲ. ವಿಜೆಟ್‌ಗಳ ಗರಿಷ್ಠ ಸಂಖ್ಯೆಯು (%d) ತಲುಪಿದೆ."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "ಅನ್ವಯಿಸುವಿಕೆ ಸೇರಿಸಲು ಅಸಮರ್ಥ. ಅನ್ವಯಿಸುವಿಕೆಗಳ ಗರಿಷ್ಠ ಸಂಖ್ಯೆಯು (%d) ತಲುಪಿದೆ."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "ಪುಟ ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "ಸಾಮಾನ್ಯ ಮೋಡ್"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "ಪವರ್ ಸೇವಿಂಗ್ ಮೋಡ್‌ ನಿಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "ಪವರ್ ಸೇವಿಂಗ್ ಮೋಡ್‌ ಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "ಇತ್ತೀಚಿನ ಅನ್ವಯಿಸುವಿಕೆಗಳು"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "ಅನ್ವಹಿಸುವಿಕೆ ಸೇರಿಸಲು ಅಸಮರ್ಥ. ಅನ್ವಹಿಸುವಿಕೆಗಳ ಗರಿಷ್ಠ ಸಂಖ್ಯೆಯು (%s) ತಲುಪಿದೆ."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ವಿಜೆಟ್ ಸೇರಿಸಲು ಅಸಮರ್ಥ. ವಿಜೆಟ್‌ಗಳ ಗರಿಷ್ಠ ಸಂಖ್ಯೆಯು (%s) ತಲುಪಿದೆ."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "ಪುಟ ತೆಗೆಯಿರಿ"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "ಈ ಪುಟ ಮತ್ತು ಅದರ ಒಳಾಂಶವನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "ತೆಗೆಯಿರಿ"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "ನೆಟ್‌ವರ್ಕ್ ಸೇವೆಯನ್ನು ಪಡೆಯಲು SIM ಕಾರ್ಡ್ ಸೇರಿಸಿ."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "ನಿರ್ಬಂಧಿಸುವ ಮೋಡ್"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ಆನ್"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "ಆಫ್"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "ಅಂಶ ಚಲಿಸಲಾಗಿದೆ."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "ಸೇರಿಸಲು ಎರಡು ಸಲ ತಟ್ಟಿ."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "ವಿಜೆಟ್ ಸೇರಿಸಿ"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "ಅಂಶ ಸೇರಿಸಲಾಗಿದೆ."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "ಅಂಶವನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "ಪುಟ %2$d ರಲ್ಲಿ %1$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "ಪ್ರಕಟಣೆ ಬೋರ್ಡ್ ಅಂಶಗಳನ್ನು ಮರುಕ್ರಮಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "ಇದು %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "ಈಗ %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "ಈಗ %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d ಹೊಸ ಅಂಶಗಳು"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "ವಿಜೆಟ್‌ಗಳ ಗರಿಷ್ಠ ಮಿತಿ (%s) ತಲುಪಿದೆ. ಕೆಲವು ವಿಜೆಟ್‌ಗಳನ್ನು ಅಳಿಸಿ ಹಾಗೂ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ಗಡಿಯಾರಕ್ಕೆ ಮರಳಿ ಹೋಗಲು ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ವಿಜೆಟ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಎಡಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ಗಡಿಯಾರಕ್ಕೆ ಹಿಂತಿರುಗಲು ಎಡಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "ಪ್ರಕಟಣೆಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s ಸ್ಥಾಪನೆ ತೆಗೆಯಲೇ?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ವಿಜೆಟ್‌ಗಳ ಗರಿಷ್ಠ ಸಂಖ್ಯೆ (%s) ತಲುಪಿದೆ."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "ಅನ್ವಹಿಸುವಿಕೆ ಟ್ರೇ ತೆರೆಯಲು ಎರಡು ಬಾರಿ ತಟ್ಟಿ."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 ಹೊಸ ಅಂಶ"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "ಶಕ್ತಗೊಳಿಸಲು ಎರಡು ಬಾರಿ ತಟ್ಟಿ."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ಗಡಿಯಾರ"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "ಸಾಧನದ ಉಷ್ಣತೆಯು ಅತ್ಯಂತ ಹೆಚ್ಚಾಗಿರುತ್ತದೆ."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "ಮೊಬೈಲ್ ಸಾಧನವನ್ನು ಬಳಸಿ ಗೇರ್ ಅನ್ವಹಿಸುವಿಕೆಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "ನಿದ್ರೆಯಲ್ಲಿರುವಾಗ"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "ಹೆಚ್ಚು ಅನ್ವಹಿಸುವಿಕೆ. ಪಡೆ"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "ಪವರ್ ಉಳಿತಾಯ + ಶಕ್ತಗೊಳಿಸಿದಾಗ ಕ್ರಿಯೆ ಲಭ್ಯವಿರುವುದಿಲ್ಲ."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "ಸ್ಕ್ರೀನ್ ರೀಡರ್ ಶಕ್ತಗೊಂಡಿರುವಾಗ %s ಲಭ್ಯವಿರುವುದಿಲ್ಲ."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "ಅಡಚಣೆ ಮಾಡಬೇಡಿ"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ಫ್ಲೈಟ್ ಮೋಡ್ ಶಕ್ತವಾಗಿರುವಾಗ ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಆನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಫ್ಲೈಟ್ ಮೋಡ್ ನಿಶಕ್ತಗೊಳಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ಗಡಿಯಾರಕ್ಕೆ ಮರಳಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "ಮುಗಿಯಿತು! ಗೇರ್‌ಗೆ ಪ್ರವೇಶಿಸಿ!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್‌ಗಳು"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "ಕರೆಗಳನ್ನು ಗೇರ್‌ಗೆ ಫಾರ್ವಡ್ ಮಾಡಿ"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "ಆರಂಭಿಸಿ"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "ನಿರ್ಗಮನ"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "ಸ್ವಾಗತ! ನಿಮ್ಮ ಗೇರ್ ಹೇಗೆ ಬಳಸುವುದು ಎಂಬುದನ್ನು ತಿಳಿಯಲು ಕೆಳಗಿನ ಬಟನ್ ತಟ್ಟಿ."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "ನಿಶಕ್ತಗೊಳಿಸಲು ವಿನಂತಿಸಿದೆ"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "ಶಕ್ತಗೊಳಿಸಲು ವಿನಂತಿಸಿದೆ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ಗಡಿಯಾರದಲ್ಲಿ ಇಂಡಿಕೇಟರ್ ಐಕಾನ್‌ಗಳನ್ನು ನೋಡಲು ಮೇಲಿನ ಅಂಚನ್ನು ಕೆಳಗೆ ಸ್ವೈಪ್ ಮಾಡಿ."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ಗಡಿಯಾರದಲ್ಲಿ ಅನ್ವಯಿಸುವಿಕೆಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಕೆಳಭಾಗದ ತುದಿಯನ್ನು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ಓಕೆ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "ಹಿಂದಕ್ಕೆ ಮರಳಲು ಮೇಲಿನ ಅಂಚನ್ನು ಕೆಳಗೆ ಸ್ವೈಪ್ ಮಾಡಿ."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "ಅನ್ವಯಿಸುವಿಕೆಗಳನ್ನು ಸ್ಥಾಪಿಸಲು ಅಥವಾ ಅಸ್ಥಾಪಿಸಲು, ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನದಲ್ಲಿ ಸ್ಯಾಮ್‌ಸಂಗ್ ಗೇರ್ ಅನ್ವಯಿಸುವಿಕೆಯನ್ನು ಬಳಸಿ."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "ಇದು ಹೋಮ್‌ ಸ್ಕ್ರೀನ್‌ನ ಮುಖ್ಯ ರಚನೆಯಾಗಿದೆ."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ಖಾಲಿ"
diff --git a/home/res/po/ko_KR.po b/home/res/po/ko_KR.po
new file mode 100755
index 0000000..d6e29da
--- /dev/null
+++ b/home/res/po/ko_KR.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "앱스"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "다음"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "위젯"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "다시 보지 않기"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "모두 삭제"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "제거할 수 없습니다."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "위젯을 이동하려면 길게 누르세요."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "홈 화면을 변경하였습니다."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "불러오는 중..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "데이터를 불러올 수 없습니다. 다시 시도하려면 누르세요."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "홈 화면에 공간이 없어 애플리케이션을 추가할 수 없습니다."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "홈 화면에 공간이 없어 위젯을 추가할 수 없습니다."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "동일한 애플리케이션이 있습니다."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "동일한 위젯이 있습니다."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "취소"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "홈 화면 구성을 변경하였습니다."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "선택한 애플리케이션을 홈 화면에서 제거합니다. 디바이스에서는 삭제되지 않습니다."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "애플리케이션 제거"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "위젯 제거"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "선택한 위젯을 홈 화면에서 제거합니다. 디바이스에서는 삭제되지 않습니다."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "초절전 모드"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "최대 위젯 수(%d)에 도달하여 추가할 수 없습니다."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "최대 애플리케이션 수(%d)에 도달하여 추가할 수 없습니다."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "페이지를 추가할 수 없습니다."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "일반 모드"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "[절전 모드]를 해제하였습니다."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "[절전 모드]를 실행하였습니다."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "최근 사용 앱"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "최대 애플리케이션 수(%s)에 도달하여 추가할 수 없습니다."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "최대 위젯 수(%s)에 도달하여 추가할 수 없습니다."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "페이지 제거"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "이 페이지 및 컨텐츠를 제거합니다."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "제거"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "네트워크 서비스를 이용하려면 SIM 카드를 삽입하세요."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "차단 모드"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "사용"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "해제"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "항목을 이동하였습니다."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "추가하려면 두 번 누르세요."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "위젯 추가"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "항목을 추가하였습니다."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "항목을 제거하였습니다."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d페이지 중 %1$d페이지입니다"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "알림보드 항목의 순서를 변경할 수 없습니다."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "%1$d시 %2$d분입니다."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "오전 %d시%d분입니다."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "오후 %d시%d분입니다."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "새 항목 %d개"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "최대 위젯 수(%s)에 도달하였습니다. 일부 위젯을 삭제한 후 다시 시도하세요."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "시계로 돌아가려면 오른쪽으로 미세요."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "위젯을 보려면 왼쪽으로 미세요."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "시계로 돌아가려면 왼쪽으로 미세요."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "알림을 보려면 오른쪽으로 미세요."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s을(를) 삭제할까요?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "최대 위젯 수(%s)에 도달하였습니다."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "앱 트레이를 열려면 두 번 누르세요."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "새 항목 1개"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "실행하려면 두 번 누르세요."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "시계"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "디바이스 온도가 너무 높습니다."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "모바일 디바이스를 사용하여 Gear 애플리케이션을 다운로드하세요."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "잠자는 중"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "애플리케이션 더보기"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "[절전+] 실행 중에는 작업을 실행할 수 없습니다."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "[스크린 리더] 실행 중에는 %s 기능을 사용할 수 없습니다."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "방해 금지"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "[비행기 탑승 모드] 실행 중에는 [모바일 데이터]를 실행할 수 없습니다. [비행기 탑승 모드]을 해제한 후 다시 시도하세요."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "시계로 돌아가려면 위로 미세요."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "준비를 완료하였습니다. Gear를 사용해보세요!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "모바일 네트워크"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Gear로 착신전환"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "시작"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "종료"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "환영합니다! Gear 사용 방법을 알아보려면 아래 버튼을 누르세요."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "해제하도록 요청하였습니다"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "실행하도록 요청하였습니다"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "시계에서 상태표시 아이콘을 보려면 화면 상단을 아래로 미세요."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "시계에서 앱을 보려면 화면 하단을 위로 미세요."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "확인"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "돌아가려면 화면 상단을 아래로 미세요."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "시계에서, 상태표시 아이콘을 보려면 화면 상단을 아래로 미세요."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "시계에서, 앱을 보려면 화면 하단을 위로 미세요."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "시계에서, 알림을 보려면 오른쪽으로 미세요."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "시계로 돌아가려면 왼쪽으로 미세요."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "시계에서, 위젯을 보려면 왼쪽으로 미세요."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "시계로 돌아가려면 오른쪽으로 미세요."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "시계에서, 앱을 보려면 위로 미세요."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "시계로 돌아가려면 아래로 미세요."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "시계에서, 모멘트 바를 보려면 아래로 미세요."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "시계로 돌아가려면 위로 미세요."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "시계가 내 홈 화면입니다. 시작하려면 아래를 누르세요."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "애플리케이션을 설치 또는 삭제하려면, 모바일 디바이스에서 Samsung Gear 애플리케이션을 사용하세요."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "홈 화면의 메인 구조입니다."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "홈 화면 구성입니다."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "비어 있음"
diff --git a/home/res/po/ky_KG.po b/home/res/po/ky_KG.po
new file mode 100755
index 0000000..327b4bc
--- /dev/null
+++ b/home/res/po/ky_KG.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Колдонмолор"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Кийн."
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Виджет"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Кайталабоо"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Бардыгын жок кылуу"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Алып салуу мүмкүн эмес."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Жылдыруу үчүн виджетти таптап, кармап туруңуз."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Home screen changed."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Жүктөлүүдө..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Unable to load data. Tap to retry."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Сунуучуну кошууга мүмкүн эмес. Башкы экранда бөлмө жок."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Widget кошуу мүмкүн эмес. Башкы экранда бөлмө жок."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Колдонмо эчак бар."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget эчак бар."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Артка"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Башкы экран жайгаштырылышы өзгөрдү."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Бул колдонмо башкы экрандан алып салынат. Ал түзмөктөн өчүрүлбөйт."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Сунуучуну өчүрүү"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Виджетти алып салуу"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Бул widget башкы экрандан алып салынат. Ал түзмөктөн өчүрүлбөйт."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ашынг. кубат сактоо режим"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Widget кошуу мүмкүн эмес. Виджеттер эң көп боло турган санына (%d) жетти."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Колдонмону кошууга мүмкүн эмес. Колдонмолордун саны (%d) чегине жетти."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Бетти кошууга мүмкүн эмес."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Кадимки режим"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Кубаттуулукту үнөмдөө моду өчүрүлдү."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Кубатты үнөмдөө режими иштетилди."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Акыркы колд."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Сунуучуну кошууга мүмкүн эмес. Сунуучулардын саны (%s) нары четине жетти."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Widget кошуу мүмкүн эмес. Виджеттер эң көп боло турган санына (%s) жетти."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Бетти алып салуу"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Бул бет жана анын мазмуну алып салынат."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Алып сал"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Тармак кызматтарына жөлөө үчүн SIM карта салыңыз"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Камоо режими"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Күйүк"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Өчүк"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Нерсе ордун которду."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Кошууга эки жолу таптаңыз."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Виджет кошуу"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Нерсе кошулду."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Нерсе алып салынды."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Page %1$d of %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Эскертүү тактасынын нерселерин кайра иреттей албайт."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Бул %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Саат %d:%d AM болду"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Саат %d:%d PM болду"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d жаңы нерсе"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Виджеттердин саны жогорку чегине (%s) жетти. Айрым виджеттерди жок кылып, дагы аракеттениңиз."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Саатка кайтууга оңго жылдырыңыз."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Виджеттерди көрүүгө солго жылдырыңыз."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Саатка кайтууга солго жылдырыңыз."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Эскертүүлөрдү көрүүгө оңго жылдырыңыз."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Uninstall %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Виджеттер максималдык санына (%s) жетти."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Сунуучу тактаны ачууга эки жолу таптаңыз."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 жаңы элемент"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Иштетүү үчүн эки басыңыз."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Саат"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "The device temperature is too high."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Gear колдонмолорун уюлдук түзмөк менен жүктөп алыңыз."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Уктоо учурунда"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Дагы колдонмолорду алуу"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Кубат сактоо + иштетилген учурда иш-аракет аткаруу мүмкүн эмес."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Экран окугуч иштетилген учурда %s байкалбайт."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Тынчымды албоо"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Учуу режим иштет-де Мобил. айтымдар күйгүзүлбөдү. Учуу реж. иштен чыгарып, дагы аракет кыл."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Саатка кайтууга өйдө жылдырыңыз."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Бүттү! Gear'ди колдонуңуз!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Мобил. тармакт."
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Gear'ге чакыр. ктр"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Баштоо"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Чыгуу"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Кош келиңиз! Gear'ди колдонууну үйрөнүүгө, төмөнкүнү басыңыз."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Иштен чыгарууга суралды"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Иштетүүгө суралды"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Саатта көрсөтк. сүрөт. көрүүгө, баш кырын ылдый жылдырыңыз."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Саатта колдонмолорду көрүүгө, таман кырын өйдө жылдырыңыз."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ОК"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Артка кайтууга баш кырды ылдый жылдырыңыз."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Колдонмолорду орнотуу же өчүрүү үчүн, мобилдик түзмөгүңүздөгү Samsung Gear колдонмосун пайдаланыңыз."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Бул башкы экрандын негизги түзүлүшү."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Бош"
diff --git a/home/res/po/lo.po b/home/res/po/lo.po
new file mode 100755
index 0000000..08f3c42
--- /dev/null
+++ b/home/res/po/lo.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "ແອັບ"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "ຕໍ່ໄປ"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "ວິດເຈັທ"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "ຢ່າເຮັດຊໍ້າຄືນ"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "ລຶບທັງໝົດ"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "ບໍ່ສາມາດເອົາອອກໄປໄດ້."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ແຕະວິດເຈັດຄ້າງໄວ້ເພື່ອຍ້າຍມັນ."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "ໜ້າຈໍຫຼັກໄດ້ປ່ຽນ."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "ກຳລັງໂຫຼດ..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ບໍ່ສາມາດໂຫຼດຂໍ້ມູນໄດ້. ເຄາະເພື່ອລອງໃໝ່."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ບໍ່ສາມາດເພີ່ມແອພພລິເຄຊັນໄດ້. ບໍ່ມີຫ້ອງຢູ່ໃນໜ້າຈໍຫຼັກອີກ."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ບໍ່ສາມາດເພີ່ມວິດເຈັດໄດ້. ບໍ່ມີຫ້ອງຢູ່ໃນໜ້າຈໍຫຼັກອີກ."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "ມີແອພພລິເຄຊັນຢູ່ແລ້ວ."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ມີວິດເຈັດຢູ່ແລ້ວ."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "ຍົກເລີກ"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "ແຜນຜັງໜ້າຈໍຫຼັກປ່ຽນແປງແລ້ວ."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ແອພພລິເຄຊັນນີ້ຈະຖືກເອົາອອກໄປຈາກໜ້າຈໍຫຼັກ. ມັນຈະບໍ່ຖືກລຶບໄປຈາກເຄື່ອງ."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "ເອົາແອພພລິເຄຊັນອອກໄປ"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ເອົາວິດເຈັດອອກໄປ"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ວິດເຈັດນີ້ຈະຖືກເອົາອອກໄປຈາກໜ້າຈໍຫຼັກ. ມັນຈະບໍ່ຖືກລຶບໄປຈາກເຄື່ອງ."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "ໂໝດປະຢັດໄຟພິເສດ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ບໍ່ສາມາດເພີ່ມວິດເຈັດໄດ້. ຮອດຈໍານວນວິດເຈັດສູງສຸດ (%d) ແລ້ວ."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "ບໍ່ສາມາດເພີ່ມແອພພລິເຄຊັນໄດ້. ຮອດຈໍານວນແອພພລິເຄຊັນສູງສຸດ (%d) ແລ້ວ."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "ບໍ່ສາມາດເພີ່ມໜ້າໄດ້."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "ໂໝດປົກກະຕິ"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "ໂໝດປະຢັດໄຟປິດໃຊ້ງານແລ້ວ."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "ເປີດໃຊ້ງານໂໝດປະຢັດໄຟແລ້ວ."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "ແອັບບໍ່ດົນນີ້"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "ບໍ່ສາມາດເພີ່ມແອພພລິເຄຊັນໄດ້. ຮອດຈໍານວນແອພພລິເຄຊັນສູງສຸດ (%s) ແລ້ວ."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ບໍ່ສາມາດເພີ່ມວິດເຈັດໄດ້. ຮອດຈໍານວນວິດເຈັດສູງສຸດ (%s) ແລ້ວ."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "ເອົາໜ້າອອກໄປ"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "ໜ້ານີ້ ແລະເນື້ອໃນຂອງມັນຈະຖືກເອົາອອກໄປ."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "ເອົາອອກໄປ"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "ໃສ່ແຜ່ນ SIM ເຂົ້າໄປ ເພື່ອເຂົ້າຫາການບໍລິການເຄືອຂ່າຍ."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "ໂໝດການບລັອກ"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ເປີດ"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "ປິດ"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "ລາຍການຖືກຍ້າຍແລ້ວ."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "ແຕະສອງເທື່ອຊ້ອນ ເພື່ອເພີ່ມ."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "ເພີ່ມວິດເຈັທ"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "ລາຍການໄດ້ເພີ່ມເຂົ້າ."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "ລາຍການເອົາອອກແລ້ວ."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "ໜ້າ %1$d ໃນ %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "ບໍ່ສາມາດຈັດລໍາດັບລາຍການກະດານການແຈ້ງເຕືອນຄືນໃໝ່ໄດ້."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "ມັນແມ່ນ %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "ເວລາ %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "ເວລາ %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "ລາຍການໃໝ່ %d ລາຍການ"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "ຮອດຈໍານວນວິດເຈັດສູງສຸດ (%s) ແລ້ວ. ລຶບບາງວິດເຈັດອອກ ແລະລອງໃໝ່ອີກ."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ຮູດໄປທາງຂວາ ເພື່ອກັບໄປຫາໂມງ."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ຮູດໄປທາງຊ້າຍ ເພື່ອເບິ່ງວິດເຈັດ."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ຮູດໄປທາງຊ້າຍ ເພື່ອກັບໄປຫາໂມງ."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "ຮູດໄປທາງຂວາ ເພື່ອເບິ່ງການແຈ້ງເຕືອນ."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "ຖອນການຕິດຕັ້ງ %s ບໍ?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ຮອດຈໍານວນວິດເຈັດສູງສຸດ (%s) ແລ້ວ."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "ແຕະສອງເທື່ອຊ້ອນເພື່ອເປີດຖາດແອັບ."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 ລາຍການໃໝ່"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "ແຕະສອງເທື່ອຊ້ອນ ເພື່ອເປີດໃຊ້ງານ."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ໂມງ"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "ອຸນຫະພູມເຄື່ອງສູງໂພດ."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "ດາວໂຫຼດແອພພລິເຄຊັນເກຍດ້ວຍການໃຊ້ໂທລະສັບມືຖື."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "ໃນຂະນະກໍາລັງນອນຫຼັບ"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "ເອົາແອພພລິເຄຊັນເພີ່ມເຕີມ"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "ບໍ່ມີການກະທໍາຢູ່ໃນຂະນະທີ່ການປະຢັດໄຟ + ເປີດໃຊ້ງານ."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "ບໍ່ມີ %s ຢູ່ໃນຂະນະທີ່ເຄື່ອງອ່ານໜ້າຈໍເປີດໃຊ້ງານ."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "ຫ້າມລົບກວນ"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ບໍ່ສາມາດເປີດຂໍ້ມູນມືຖືໄດ້ໃນຂະນະທີ່ໂໝດການບິນເປີດໃຊ້ງານແລ້ວ. ປິດໃຊ້ງານໂໝດການບິນ ແລະລອງໃໝ່ອີກ."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ຮູດຂຶ້ນເທິງ ເພື່ອກັບໄປຫາໂມງ."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "ເທົ່ານັ້ນລະ! ເຂົ້າໄປຫາເກຍ!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "ເຄືອຂ່າຍໂທລະສັບມືຖື"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "ໂອນສາຍໄປຫາເກຍ"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "ເລີ່ມຕົ້ນ"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "ອອກ"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "ຍິນດີຕ້ອນຮັບ! ແຕະປຸ່ມລຸ່ມນີ້ ເພື່ອຮຽນວິທີໃຊ້ເກຍຂອງທ່ານ."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "ຂໍປິດໃຊ້ງານແລ້ວ"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "ຂໍເປີດໃຊ້ງານແລ້ວ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ຮູດຂອບດ້ານເທິງລົງລຸ່ມ ເພື່ອເບິ່ງໄອຄອນຕົວຊີ້ບອກຢູ່ໂມງ."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ຮູດຂອບລຸ່ມຂຶ້ນ ເພື່ອເບິ່ງແອັບຢູ່ໃນໂມງ."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ຕົກລົງ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "ຮູດຂອບເທິງລົງລຸ່ມ ເພື່ອກັບຄືນ."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "ເພື່ອຕິດຕັ້ງ ຫຼືຖອນຕິດຕັ້ງແອພພລິເຄຊັນ, ໃຊ້ແອພພລິເຄຊັນ Samsung Gear ຢູ່ເທິງອຸປະກອນມືຖືຂອງທ່ານ."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "ອັນນີ້ແມ່ນໂຄງສ້າງຫຼັກຂອງໜ້າຈໍຫຼັກ."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ຫວ່າງ​ເປົ່າ"
diff --git a/home/res/po/lt.po b/home/res/po/lt.po
new file mode 100755
index 0000000..8439fd4
--- /dev/null
+++ b/home/res/po/lt.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Programos"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Kitas"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Valdiklis"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Nekartoti"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Trinti viską"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Negalima pašalinti."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Norėdami perkelti vald., bakstelėkite ir laikykite."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Pradžios ekranas pakeistas."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Įkeliama..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Neįmanoma įkelti duomenų. Bakstelėkite ir bandykite dar kartą."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Neįmanoma pridėti programos. Pradžios ekrane nebėra vietos."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Neįmanoma pridėti valdiklio. Pradžios ekrane nebėra vietos."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Programa jau yra."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Valdiklis jau yra."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Atšaukti"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Pradžios ekrano išdėstymas pakeistas."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ši programa bus pašalinta iš pradžios ekrano. Ji nebus ištrinta iš įrenginio."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Pašalinti programą"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Pašalinti valdiklį"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Šis valdiklis bus pašalintas iš pradžios ekrano. Jis nebus ištrintas iš įrenginio."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ypat.energ.taupymo režim."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Neįmanoma pridėti valdiklio. Pasiektas didžiausias leistinas valdiklių skaičius (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Neįmanoma pridėti programos. Pasiektas didžiausias programų skaičius (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Neįmanoma pridėti puslapio."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Įprastinis režimas"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Energijos taupymo režimas išjungtas."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Įjungtas energijos taupymo režimas."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Pask. progr."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Neįmanoma pridėti programos. Pasiektas didžiausias programų skaičius (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Neįmanoma pridėti valdiklio. Pasiektas didžiausias valdiklių skaičius (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Pašalinti puslapį"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Šis puslapis ir jo turinys bus pašalinti."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Šalinti"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Įdėkite SIM kortelę, kad galėtumėte naudotis tinklo paslaugomis."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blokavimo režimas"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Įjungta"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Išjungta"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elementas perkeltas."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Bakstelėkite dukart ir pridėkite."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Pridėti valdiklį"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Elementas pridėtas."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Elementas pašalintas."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%1$d psl. iš %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Pranešimų lentos elementų pertvarkyti negalima."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Tai %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Dabar %d:%d (priešpiet)."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Dabar %d:%d (popiet)."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "Naujų elementų: %d"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Pasiektas didžiausias valdiklių skaičius (%s). Ištrinkite kelis valdiklius ir bandykite dar."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Braukit dešinėn ir grįžkit į laikrodį."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Braukite kairėn ir peržr. valdiklius."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Braukite kairėn ir grįžkit į laikrodį."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Braukite dešinėn ir peržr. pranešimus."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Pašalinti „%s“?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Pasiektas didžiausias leistinas valdiklių skaičius (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Bakstelėkite dukart, kad atidarytumėte programų dėklą."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 naujas elementas"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Bakstelėkite dukart ir įjunkite."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Laikrodis"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Įrenginio temperatūra per didelė."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Atsisiųskite „Gear“ programas naudodamiesi įrenginiu."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Miegant"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Gauti daugiau programų"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Veiksmo negalima atlikti, kai įjungtas „Energijos taupymas +“."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s nepasiekiama, kai įjungtas ekrano skaitytuvas."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Netrukdyti"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Veikiant skrydžio rež.negalima įjungti mob.duom. Išjunkite skrydžio rež. ir bandykite dar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Brūkš. į viršų ir grįžkite į laikrodį."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Viskas! Prisijunkite prie „Gear“!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mob. tinklai"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Prs. skamb.į Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Paleisti"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Išeiti"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Sveiki! Bakstelėję mygtuką sužinosite, kaip naudoti „Gear“."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Paprašė išjungti"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Paprašė įjungti"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Braukit virš.kraštą žemyn, žr.indik. piktogr.laikrodyje."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Braukite iš apačios į viršų ir žr. programas laikrodyje."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "Gerai"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Braukite viršutinį kraštą žemyn ir grįžkite atgal."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Norėdami įdiegti arba pašalinti programas, naudokite „Samsung Gear“ programą mobiliajame įrenginyje."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Tai pagrindinė pradžios ekrano struktūra."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Tuščia"
diff --git a/home/res/po/lv.po b/home/res/po/lv.po
new file mode 100755
index 0000000..85e83e0
--- /dev/null
+++ b/home/res/po/lv.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Progr."
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Nākamais"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Logrīks"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Neatkārtot"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Dzēst visu"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Nevar noņemt."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Pieskarieties un turiet logrīku, lai to pārvietotu."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Sākuma ekrāns ir nomainīts."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Ielādē..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Nevar ielādēt datus. Pieskarieties, lai mēģinātu vēlreiz."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nevar pievienot programmu. Sākuma ekrānā vairs nav vietas."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nevar pievienot logrīku. Sākuma ekrānā vairs nav vietas."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Programma jau pastāv."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Logrīks jau pastāv."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Atcelt"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Sākuma ekrāna izkārtojums ir mainīts."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Šī programma tiks noņemta no sākuma ekrāna. Tā netiks izdzēsta no ierīces."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Noņemt programmu"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Noņemt logrīku"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Šis logrīks tiks noņemts no sākuma ekrāna. Tas netiks izdzēsts no ierīces."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Īpašais enerģ. taup. rež."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Nevar pievienot logrīku. Sasniegts maksimālais logrīku skaits (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Nevar pievienot programmu. Sasniegts maksimālais programmu skaits (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Nevar pievienot lapu."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Parastais režīms"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Enerģijas taupīšanas režīms ir deaktivizēts."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Aktivizēts enerģijas taupīšanas režīms."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Nes. progr."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Nevar pievienot programmu. Sasniegts maksimālais programmu skaits (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Nevar pievienot logrīku. Sasniegts maksimālais logrīku skaits (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Noņemt lapu"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Šī lapa un tās saturs tiks noņemts."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Noņemt"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Lai piekļūtu tīkla pakalpojumiem, ievietojiet SIM karti."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Bloķēšanas režīms"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Ieslēgt"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Izslēgt"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Objekts pārvietots."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Veiciet dubultskārienu, lai pievienotu."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Pievienot logrīku"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Objekts ir pievienots."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Objekts ir noņemts."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%1$d. lapa no %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Nevar pārkārtot paziņojumu paneļa objektus."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Pareizs laiks ir %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Pareizs laiks %d:%d priekšpusdienā."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Pareizs laiks %d:%d pēcpusdienā."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d jauni objekti"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Sasniegts maksimālais logrīku skaits (%s). Izdzēsiet dažus logrīkus un mēģiniet vēlreiz."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Pavelc. pa labi, lai atgr. pie pulkst."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Pavelciet pa kreisi, lai sk. logrīkus."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Pav. pa kreisi, lai atgr. pie pulkst."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Pavelciet pa labi, lai skatītu paziņ."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Vai atinstalēt %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Sasniegts maksimālais logrīku skaits (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Lai atvērtu programmu ikonjoslu, veiciet dubultskārienu."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 jauns objekts"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Veiciet dubultskārienu, lai aktivizētu."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Pulkstenis"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Ierīces temperatūra ir pārāk augsta."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Lejupielādējiet Gear programmas, izmantojot mobilo ierīci."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Gulēšanas laikā"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Iegūt citas programmas"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Šī darbība nav pieejama, kad ir aktivizēta enerģijas taupīšana +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s nav pieejama, kad ir aktivizēts ekrāna lasītājs."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Netraucēt"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Nevar ieslēgt mob.datus, ja aktivizēts lid. režīms. Deakt. lid. režīmu un mēģiniet vēlreiz."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Lai atvērtu pulkst., velciet augšup."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Tieši tā! Uzvelciet un apgūstiet Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobilie tīkli"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Pārs. zv. uz Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Sākt"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Iziet"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Sveiki! Pieskar. pogai tālāk, lai uzzinātu, kā lietot Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Pieprasīts deaktivizēt"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Pieprasīts aktivizēt"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Pav. augš. malu uz leju,lai sk. indik. ikonas uz pulkst."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Pavelciet ap. malu uz augšu, lai sk. progr. uz pulkst."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "Labi"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Pavelciet augšējo malu uz leju, lai atgrieztos."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Lai instalētu vai atinstalētu programmas, izmantojiet Samsung Gear programmu savā mobilajā ierīcē."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Šī ir sākuma ekrāna galvenā struktūra."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Tukšs"
diff --git a/home/res/po/mk.po b/home/res/po/mk.po
new file mode 100755
index 0000000..4ac4f13
--- /dev/null
+++ b/home/res/po/mk.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Апликации"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Следно"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Виџет"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Не повтор."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Избриши сè"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Не може да се отстрани."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Допрете и држете виџет за да го поместите."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Почетниот екран е сменет."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Активирање..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Не можат да се вчитаат податоци. Допрете за повторен обид."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Не може да се додаде апликација. Нема веќе место на почетниот екран."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Не може да се додаде виџет. Нема веќе место на почетниот екран."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Апликацијата веќе постои."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Виџетот веќе постои."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Откажи"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Распоредот на почетниот екран е сменет."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Апликацијата ќе се отстрани од почетниот екран. Нема да се избрише од уредот."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Отстрани апликација"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Отстрани виџет"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Виџетот ќе се отстрани од почетниот екран. Нема да се избрише од уредот."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ултра реж.за штед.енерг."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Не може да се додаде виџетот. Достигнат е максималниот број виџети (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Не може да се додаде апликација. Достигнат е максималниот број апликации (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Не може да се додаде страница."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Нормален режим"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Режимот за штедење енергија е исклучен."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Вклучен е режимот за штедење енергија."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Посл. аплик."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Не може да се додаде апликација. Достигнат е максималниот број апликации (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Не може да се додаде виџет. Достигнат е максималниот број виџети (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Отстрани страница"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Страницата и содржините ќе се отстранат."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Отстрани"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Вметнете SIM-картичка за да пристапите кон мрежните услуги."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Режим за блокирање"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Вклучено"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Исклучено"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Записот е преместен."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Допрете двапати за да додадете."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Додај виџет"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Записот е додаден."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Записот е отстранет."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Страница %1$d од %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Не може да се прередат ставките на таблата за известувања."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Сега е %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Сега е %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Сега е %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d нови записи"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Достигнат е максималниот број виџети (%s). Избришете некој виџет и обидете се повторно."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Помин. десно за да се врат.на часовн."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Помин.лево за да ги видите виџетите."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Помин.лево за да се врат.на часовн."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Помин. десно за да видите известувања."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Да се деинсталира %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Достигнат е максималниот број виџети (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Допрете двапати за да ја отворите лентата за апликации."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 нов запис"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Допрете двапати за да овозможите."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Часовник"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Температурата на уредот е превисока."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Преземајте апликации за Gear користејќи мобилен уред."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "При спиење"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Земи повеќе апликации"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Дејството не е достапно додека е вклучено Штедење енергија +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s не е достапно додека е вклучен екранскиот читач."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Не вознемирувај"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Не може да се вклучи Моб. подат. додека е вклучен режимот за лет. Искл. режим за лет. и обид.се повт."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Помин.горе за враќање на часовникот."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Толку! Забавувајте се со Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Мобилни мрежи"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Препр.пов.на Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Почни"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Излез"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Добре дојдовте! Доп.го коп. подолу за да го користите Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Побарано да се исклучи"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Побарано да се вклучи"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Пом.со горн.раб надолу за показните икони на часовникот."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Пом. од долниот раб нагоре за апликациите на часовникот."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Поминете со горниот раб надолу за да се вратите."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "За да инсталирате или одинсталирате апликации, користете ја апликацијата Samsung Gear на мобилниот уред."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Ова е главната структура на почетниот екран."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Празно"
diff --git a/home/res/po/ml.po b/home/res/po/ml.po
new file mode 100755
index 0000000..a77c047
--- /dev/null
+++ b/home/res/po/ml.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "ആപ്ലിക്കേഷനുകൾ"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "അടുത്തത്"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "വിജറ്റ്"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "ആവർത്തിക്കേണ്ട."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "എല്ലാം ഇല്ലാതാക്കുക"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "നീക്കം ചെയ്യാന്‍ ആവുന്നില്ല."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ഒരു വിജറ്റ് നീക്കുന്നതിന് അതിൽ സ്പർശിച്ചുപിടിക്കുക."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "ഹോം സ്ക്രീന്‍ മാറ്റി."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "ലോഡ്‌ ചെയ്യുന്നു..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ഡാറ്റ ലോഡുചെയ്യാന്‍ കഴിയുന്നില്ല. വീണ്ടും ശ്രമിക്കുന്നതിന് ടാപ്പുചെയ്യുക"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ആപ്ലിക്കേഷൻ ചേർക്കാനാവില്ല. ഹോം സ്ക്രീനിൽ ഇനിയും സ്ഥലമില്ല."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "വിജറ്റ് ചേർ‌ക്കാനാവില്ല. ഹോം സ്ക്രീനിൽ ഇനിയും സ്ഥലമില്ല."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "ആപ്ലിക്കേഷൻ നേരത്തേതന്നെ നിലവിലുണ്ട്."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "വിജറ്റ് നേരത്തേതന്നെ നിലവിലുണ്ട്."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "റദ്ദാക്കുക"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "ഹോം സ്ക്രീൻ ലേഔട്ട് മാറ്റി."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ഈ ആപ്ലിക്കേഷൻ ഹോം സ്ക്രീനിൽ നിന്ന് നീക്കം ചെയ്യപ്പെടും. ഉപകരണത്തിൽ നിന്ന് അത് നീക്കംചെയ്യപ്പെടുകയില്ല."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "ആപ്ലിക്കേഷൻ നീക്കംചെയ്യുക"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "വിജറ്റ് നീക്കംചെയ്യുക"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ഈ വിജറ്റ് ഹോം സ്ക്രീനിൽ നിന്ന് നീക്കം ചെയ്യപ്പെടും. ഉപകരണത്തിൽ നിന്ന് അത് നീക്കംചെയ്യപ്പെടുകയില്ല."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "അൾട്രാ പവർ സേവിംഗ് മോഡ്"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "വിജറ്റ് ചേർ‌ക്കാനാവില്ല. വിജറ്റുകളുടെ എണ്ണം പരമാവധിയിൽ (%d) എത്തി."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "ആപ്ലിക്കേഷൻ ചേർക്കാനാകില്ല. ആപ്ലിക്കേഷനുകളുടെ പരമാവധി എണ്ണം (%d) എത്തി."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "പേജ് ചേർക്കാനാവില്ല."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "സാധാരണ മോഡ്"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "പവർ ലാഭിക്കൽ മോഡ് അപ്രാപ്തമാക്കി."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "പവർ സേവിംഗ് മോഡ് പ്രാപ്തമാക്കി."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "അടുത്തിടെ ഉപയോഗിച്ച ആപ്ലിക്കേഷനുകൾ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "ആപ്ലിക്കേഷൻ ചേർക്കാനാവില്ല. ആപ്ലിക്കേഷനുകളുടെ എണ്ണം പരമാവധിയിൽ (%s) എത്തി."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "വിജറ്റ് ചേർ‌ക്കാനാവില്ല. വിജറ്റുകളുടെ എണ്ണം പരമാവധിയിൽ (%s) എത്തി."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "പേജ് നീക്കംചെയ്യുക"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "ഈ പേജും ഇതിലെ ഉള്ളടക്കവും നീക്കംചെയ്യപ്പെടും."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "നീക്കംചെയ്യുക"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "നെറ്റ്‌വര്‍ക്ക് സേവനങ്ങള്‍ ആക്സസുചെയ്യാന്‍ SIM കാര്‍ഡ് തിരുകുക"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "തടയൽ മോഡ്"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ഓണ്‍‌"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "ഓഫ്"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "ഇനം നീക്കി."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "ചേർക്കുന്നതിന് ഇരട്ട ടാപ്പുചെയ്യുക."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "വിജറ്റ് ചേര്‍ക്കുക"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "ചേർത്ത ഇനം."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "ഇനം നീക്കംചെയ്യപ്പെട്ടു."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d ല്‍ പേജ് %1$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "അറിയിപ്പ് ബോർഡ് ഇനങ്ങളുടെ ക്രമം മാറ്റാനാവില്ല."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "ഇത് %1$d:%2$d ആണ്."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "ഇപ്പോള്‍ %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "ഇപ്പോള്‍ %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d പുതിയ ഇനങ്ങള്‍"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "വിജറ്റുകളുടെ എണ്ണം പരമാവധിയിൽ (%s) എത്തി. ഏതാനും വിജറ്റുകൾ ഇല്ലാതാക്കി വീണ്ടും ശ്രമിക്കുക."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ക്ലോക്കിലേക്ക് മടങ്ങുന്നതിന് വലത്തോട്ട് സ്വൈപ് ചെയ്യുക."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "വിജറ്റുകൾ കാണുന്നതിന് ഇടത്തോട്ട് സ്വൈപ് ചെയ്യുക."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ക്ലോക്കിലേക്ക് മടങ്ങുന്നതിന് ഇടത്തോട്ട് സ്വൈപ് ചെയ്യുക."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "അറിയിപ്പുകൾ കാണുന്നതിന് വലത്തോട്ട് സ്വൈപ് ചെയ്യുക."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s അണ്‍‌ഇന്‍സ്റ്റാള്‍ചെയ്യണോ?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "വിജറ്റുകളുടെ എണ്ണം പരമാവധിയിൽ (%s) എത്തി."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "ആപ്ലിക്കേഷൻ ട്രേ തുറക്കുന്നതിന് രണ്ടുതവണ സ്പർശിക്കുക."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 പുതിയ ഇനം"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "പ്രാപ്തമാക്കുന്നതിന് രണ്ടുതവണ സ്പർശിക്കുക."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ക്ലോക്ക്"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "ഉപകരണത്തിന്‍റെ താപനില വളരെ ഉയര്‍ന്നതാണ്."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "മൊബൈൽ ഉപകരണം ഉപയോഗിച്ച് ഗിയർ ആപ്ലിക്കേഷനുകൾ ഡൗൺലോഡ് ചെയ്യുക."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "ഉറങ്ങുമ്പോൾ"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "കൂടുതൽ ആപ്ലിക്കേഷനുകൾ നേടുക"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "പവർ സേവിംഗ് + പ്രാപ്തമാക്കിയിരിക്കുന്ന സമയത്ത് പ്രവർത്തനം ലഭ്യമല്ല."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "സ്ക്രീൻ റീഡർ പ്രാപ്തമാക്കിയിരിക്കുന്ന സമയത്ത് %s ലഭ്യമല്ല."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "ശല്യപ്പെടുത്തരുത്"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ഫ്ലൈറ്റ് മോഡ് പ്രാപ്തമാക്കിയിരിക്കുന്ന സമയത്ത് മൊബൈൽ ഡാറ്റ ഓൺ ചെയ്യാനാവില്ല. ഫ്ലൈറ്റ് മോഡ് അപ്രാപ്തമാക്കി വീണ്ടും ശ്രമിക്കുക."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ക്ലോക്കിലേക്ക് തിരികെ പോകുന്നതിന് മുകളിലേക്ക് സ്വൈപ് ചെയ്യുക."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "അതുതന്നെ! ഗിയറിൽ പ്രവേശിക്കുക!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "മൊബൈൽ നെറ്റ്‍വർക്കുകൾ"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "ഗിയറിലേക്ക് കോളുകൾ ഫോർവേഡ് ചെയ്യുക"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "ആരംഭിക്കുക"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "പുറത്തുകടക്കുക"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "സ്വാഗതം! നിങ്ങളുടെ ഗിയർ ഉപയോഗിക്കുന്നത് എങ്ങനെയെന്നറിയുന്നതിന് താഴെയുള്ള ബട്ടണിൽ സ്പർശിക്കുക."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "അപ്രാപ്തമാക്കുന്നതിന് അഭ്യർത്ഥിച്ചു"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "പ്രാപ്തമാക്കുന്നതിന് അഭ്യർത്ഥിച്ചു"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ക്ലോക്കിൽ ഇൻഡിക്കേറ്റർ ഐക്കണുകളെ കാണുന്നതിന് മുകളിലെ അരുകിൽ നിന്ന് താഴേയ്ക്ക് സ്വൈപ് ചെയ്യുക."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ആപ്ലിക്കേഷനുകളെ ക്ലോക്കിൽ കാണുന്നതിന് താഴത്തെ അരുകിൽ നിന്ന് മുകളിലേക്ക് സ്വൈപ് ചെയ്യുക."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ശരി"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "പിന്നോട്ട് പോവുന്നതിന് മുകളിലെ അരുകിൽ നിന്ന് താഴേയ്ക്ക് സ്വൈപ് ചെയ്യുക."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "ആപ്ലിക്കേഷനുകൾ ഇൻസ്റ്റാൾ ചെയ്യാനോ അൺഇൻസ്റ്റാൾ ചെയ്യാനോ, നിങ്ങളുടെ മൊബൈൽ ഉപകരണത്തിലെ Samsung Gear ആപ്ലിക്കേഷൻ ഉപയോഗിക്കുക."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "ഇതാണ് ഹോം സ്ക്രീനിന്‍റെ പ്രധാന ഘടന."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ശൂന്യം"
diff --git a/home/res/po/mn_MN.po b/home/res/po/mn_MN.po
new file mode 100755
index 0000000..f36da60
--- /dev/null
+++ b/home/res/po/mn_MN.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Апп"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Цааш"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Тоноглол"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Бүү давт"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Бүгдийг устгах"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Арилгах боломжгүй."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Тоноглолыг зөөхийн тулд товшиж барь"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Эхлэл дэлгэц өөрчлөгдсөн."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Ачаалж байна..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Өгөгдөл ачаалах боломжгүй. Товшиж дахин оролд"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Програм нэмэх боломжгүй. Эхлэл дэлгэцэд дахиад зай байхгүй."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Тоноглол нэмэх боломжгүй. Эхлэл дэлгэцэд дахиад зай байхгүй."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Програм аль хэдийн байна."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Тоноглол аль хэдийн байна."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Цуцлах"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Эхлэл дэлгэцийн байрлал өөрчлөгдсөн."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Эхлэл дэлгэцээс энэ програмыг арилгана. Энэ нь төхөөрөмжөөс устгагдахгүй."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Програм арилгах"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Тоноглол арилгах"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Эхлэл дэлгэцээс энэ тоноглолыг арилгана. Энэ нь төхөөрөмжөөс устгагдахгүй."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Хэт тэжээл хэмнэх горим"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Тоноглол нэмэх боломжгүй. Тоноглолын (%d) тооны дээд хязгаарт хүрсэн."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Програм нэмэх боломжгүй. Програмын (%d) тооны дээд хязгаарт хүрсэн."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Хуудас нэмэх боломжгүй."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Хэвийн горим"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Тэжээл хэмнэх горим идэвхгүй боллоо"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Тэжээл хэмнэх горимыг идэвхжүүлсэн."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Сүүл. прог"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Програм нэмэх боломжгүй. Програмын (%s) тооны дээд хязгаарт хүрсэн."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Тоноглол нэмэх боломжгүй. Тоноглолын (%s) тооны дээд хязгаарт хүрсэн."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Хуудас арилгах"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Энэ хуудас болон түүний агуулгыг арилгана."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Арилгах"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Сүлжээний үйлчилгээнд хандахын тулд SIM картыг оруул"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Хаах горим"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Идэвхтэй"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Идэвхгүй"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Зүйлийг зөөсөн."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Нэмэхийн тулд хоёр товш."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Тоноглол нэмэх"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Зүйл нэмсэн."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Зүйл арилгасан."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Хуудас %1$d / %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Мэдэгдлийн самбарын зүйлсийн дарааллыг өөрчлөх боломжгүй."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Энэ нь %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Одоо %d:%d AM"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Одоо %d:%d PM"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d шинэ зүйл"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Тоноглолын тооны дээд хязгаарт (%s) хүрсэн. Зарим тоноглолыг устгаад, дахин оролд."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Баруун тийш шударч цаг руу буц."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Зүүн тийш шударч тоноглолууд хар."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Зүүн тийш шударч цаг руу буц."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Баруун тийш шударч мэдэгдэл хар."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Uninstall %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Тоноглолын (%s) тооны дээд хязгаарт хүрсэн."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Аппын тавиурыг нээхийн тулд хоёр товш."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 шинэ зүйл"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Идэвхжүүлэхийн тулд хоёр товш."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Цаг"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Төхөөрөмжийн температур хэт өндөр байна"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Мобайл төхөөрөмж ашиглан Gear-ийн аппууд тат."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Унтаж байхад"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Өөр аппууд авах"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Тэжээл хэмнэх + идэвхжүүлсэн үед үйлдэл боломжгүй."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Дэлгэц уншигчийг идэвхжүүлсэн үед %s боломжгүй байна."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Бүү үймүүл"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Нислэг горим идэвхжсэн үед Хөдөл. дата асахгүй. Нислэг горим идэвхгүй болгоод, дахин оролд."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Дээш шударч цаг руу буц."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Ингээд боллоо! Gear-ээ ашиглаж эхэл!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Хөдөлгнт сүлжээ"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Gear-т дууд уламж"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Эхлүүлэх"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Гарах"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Тавтай морил! Gear ашиглаж сурахын тулд доорх товчийг товш."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Идэвхгүй болгохыг хүссэн"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Идэвхжүүлэхийг хүссэн"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Цаган дээр заагчийн дүрс харахдаа дээд ирмэг доош шудар."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Цаган дээр аппууд харахын тулд доод ирмэгийг дээш шудар."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Буцахын тулд дээд ирмэгийг доош шудар."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Аппликэйшныг суулгах эсвэл устгах бол хөдөлгөөнт төхөөрөмж дээрх Samsung Gear аппликэйшн ашигла."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Энэ бол эхлэл дэлгэцийн үндсэн бүтэц юм."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Хоосон"
diff --git a/home/res/po/mr.po b/home/res/po/mr.po
new file mode 100755
index 0000000..d450896
--- /dev/null
+++ b/home/res/po/mr.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "अनुप्रयोग"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "पुढे"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "विजेट"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "पुनरावृत्‍ती करू नका."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "सर्व हटवा"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "काढण्यास अक्षम."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ते हलवण्या साठी विजेट टॅप आणि होल्ड करा."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "होम स्क्रीन बदलली."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "लोड होत आहे..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "डेटा लोड करण्यामध्‍ये अक्षम. पुनर्प्रयत्न करण्‍यासाठी टॅप करा."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "अनुप्रयोग जोडण्यात अक्षम. मुख्य स्‍क्रीनवर कोणतेही अधिक कक्ष नाहीत."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "विजेट जोडण्यात अक्षम. मुख्य स्‍क्रीनवर कोणतेही अधिक कक्ष नाहीत."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "अनुप्रयोग आधीपासूनच अस्तित्वात आहे."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "विजेट आधीपासूनच अस्तित्वात आहे."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "रद्द"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "मुख्य स्क्रीन लेआउट बदलले."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "हा अनुप्रयोग मुख्य स्‍क्रीनवरून काढण्‍यात येईल. हे उपकरणा मधून हटवण्यात येणार नाही."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "अनुप्रयोग काढून टाका"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "विजेट काढून टाका"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "हा विजेट मुख्य स्‍क्रीनवरून काढून टाकण्यात येईल. हे उपकरणा मधून हटवण्यात येणार नाही."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "अल्ट्रा पॉवर बचत मोड"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "विजेट जोडण्यात अक्षम. विजेटची कमाल संख्‍या (%d) गाठली."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "अनुप्रयोग जोडण्‍यामध्‍ये अक्षम. अनुप्रयोगांची कमाल संख्‍या (%d) गाठली."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "पृष्ठ जोडण्यात अक्षम."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "सामान्य मोड"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "ऊर्जा बचत मोड अक्षम केला."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "पॉवर जतन करत आहे मोड सक्षम केला."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "अलीकडील अनुप्रयोग"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "अनुप्रयोग जोडण्‍यामध्‍ये अक्षम. अनुप्रयोगांची कमाल संख्‍या (%s) गाठली."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "विजेट जोडण्यास अक्षम. विजेट्सची कमाल संख्‍या (%s) गाठली."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "पृष्‍ठ काढून टाका."
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "हे पृष्ठ आणि त्याची सामग्री काढली जाईल."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "काढून टाका"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "नेटवर्क सेवा एक्सेस करण्या साठी कृपया SIM कार्ड प्रविष्ट करा."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "अवरोध मोड"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "चालू"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "बंद"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "आयटेम हलवला."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "जोडण्‍यासाठी दोनदा टॅप करा."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "विजेट जोडा"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "आयटम जोडला."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "आयटम काढून टाकला."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d पैकी %1$d पृष्‍ठ"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "अधिसूचना बोर्ड आयटम्‍स पुन्‍हा ऑर्डर करू शकत नाही."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "हे %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "%d:%d AM वाजलेले आहेत."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "%d:%d PM वाजलेले आहेत."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d नवीन आयटेम्स"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "विजेट्सची कमाल संख्‍या (%s) गाठली. काही विजेट्स हटवा आणि पुन्हा प्रयत्न करा."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "घड्याळावर परत जाण्‍यासाठी उजवीकडे स्‍वाइप करा."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "विजेट्स पाहण्‍यासाठी डावीकडे स्‍वाइप करा."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "घड्याळावर परत जाण्‍यासाठी डावीकडे स्‍वाइप करा."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "अधिसूचना पाहण्‍यासाठी उजवीकडे स्‍वाइप करा."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s अनइंस्टॉल?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "विजेट्सची कमाल संख्‍या (%s) गाठली."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "अनुप्रयोग ट्रे उघडण्यासाठी दोनदा टॅप करा."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 नवीन आयटम"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "सक्षम करण्‍यासाठी दोनदा टॅप करा."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "घड्याळ"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "उपकरणचे तापमान खूपच जास्‍त आहे."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "मोबाईल उपकरण वापरून गिअर अनुप्रयोग डाउनलोड करा."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "झोपत असताना"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "अधिक अनुप्रयोग प्राप्त करा"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "पॉवर बचत + सक्षम असताना क्रिया उपलब्‍ध नाही."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "स्‍क्रीन रीडर सक्षम असताना %s उपलब्‍ध नसेल."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "व्‍यत्‍यय आणू नका"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "फ्लाइट मोड सक्षम केलेला असताना मोबाईल डेटा चालू करण्यात अक्षम. फ्लाइट मोड अक्षम करा आणि पुन्हा प्रयत्न करा."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "घड्याळावर परत जाण्यासाठी वरच्या दिशेने स्वाइप करा."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "झाले! गिअरमध्ये जा!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "मोबाईल नेटवर्क्स"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "गिअरवर कॉल्स अग्रेषित करा"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "सुरु करा"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "बाहेर पडा"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "आपले स्वागत आहे! आपले गिअर कसे वापरायचे हे शिकण्यासाठी खालील बटण टॅप करा."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "अक्षम करण्याची विनंती केली"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "सक्षम करण्याची विनंती केली"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "घड्याळावर सूचक आयकॉन्‍स पाहण्यासाठी शीर्ष कडा खाली स्वाइप करा."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "घड्याळावर अनुप्रयोग पाहण्यासाठी तळाची कडा स्वाइप करा."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ठीक"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "मागे जाण्यासाठी शीर्ष कडा खाली स्वाइप करा."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "अनुप्रयोग इन्‍स्‍टॉल किंवा अनइन्‍स्‍टॉल करण्‍यासाठी, आपल्‍या मोबाईल उपकरणावर Samsung Gear अनुप्रयोग वापरा."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "ही मुख्‍य स्‍क्रीनची मूळ रचना आहे."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "रिकामा"
diff --git a/home/res/po/ms.po b/home/res/po/ms.po
new file mode 100755
index 0000000..5d941bd
--- /dev/null
+++ b/home/res/po/ms.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikasi"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Berikut"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Jgn ulang"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Padam semua"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Tidak dapat mengalih keluar."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Ketik dan tahan widget untuk mengalihkannya."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Skrin utama ditukar."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Memuat…"
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Tidak dapat memuatkan data. Ketik untuk mencuba semula."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Tidak dapat menambah aplikasi. Tiada ruang pada skrin utama."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Tidak dapat menambah widget. Tiada ruang pada skrin utama."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikasi telah wujud."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget telah wujud."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Batal"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Reka letak skrin utama berubah."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Aplikasi ini akan dialih keluar dari skrin utama. Aplikasi ini tidak akan dipadamkan daripada peranti."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Alih keluar aplikasi"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Alih keluar widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Widget ini akan dialih keluar dari skrin utama. Widget ini tidak akan dipadamkan daripada peranti."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Mod p'jimatan kuasa ultra"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Tidak dapat menambah widget. Bilangan maksimum widget (%d) dicapai."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Tidak dapat menambah aplikasi. Bilangan maksimum aplikasi (%d) dicapai."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Tidak dapat menambah halaman."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Mod biasa"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Mod penjimatan kuasa dinyahaktifkan."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Mod penjimatan kuasa diaktifkan."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Apl terkini"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Tidak dapat menambah aplikasi. Bilangan maksimum aplikasi (%s) dicapai."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Tidak dapat menambah widget. Bilangan maksimum widget (%s) dicapai."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Alih keluar halaman"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Halaman ini dan kandungannya akan dialih keluar."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Alih keluar"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Masukkan kad SIM utk mencapai perkhidmatan rangkaian."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Mod sekat"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Hidupkan"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Matikan"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Item dialihkan."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Dwiketik untuk menambah."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Tambah widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Item ditambah."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Item dialih keluar."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Halaman %1$d daripada %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Tidak boleh menyusun semula item papan pemberitahuan."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Ia adalah %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Ia adalah %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Ia adalah %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d item baru"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Bilangan maksimum widget (%s) telah dicapai. Padam beberapa widget dan cuba lagi."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Leret ke kanan untuk kembali ke jam."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Leret ke kiri untuk melihat widget."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Leret ke kiri untuk kembali ke jam."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Leret ke kanan utk lihat pmberitahuan."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Nyahpasang %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Bilangan maksimum widget (%s) dicapai."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Dwiketik untuk membuka bekas aplikasi."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 item baru"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Dwiketik untuk aktifkan."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Jam"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Suhu peranti terlalu tinggi."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Muat turun aplikasi Gear menggunakan peranti mudah alih."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Ketika tidur"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Dapatkan apl selanjutnya"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Tindakan tidak tersedia ketika Jimat kuasa + diaktifkan."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s tidak tersedia apabila Pembaca skrin diaktifkan."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Jangan ganggu"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Tdk dpt hidupkn Data mudah alih ketika Mod penerbangan aktif. Nyhaktf Mod penerbangan dn cuba lg."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Leret ke atas untuk kembali ke jam."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Itu sahaja! Nikmati Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Rangkaian mobile"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Maju pgln ke Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Mula"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Keluar"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Slmt dtg! Ktik butng di bwh utk ketahui cara guna Gear anda."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Diminta untuk dinyahaktifkan"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Diminta untuk diaktifkan"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Leret bhgn ats sisi ke bwh utk lht ikon penunjuk pd jam."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Leret bhgn bwh sisi ke atas utk melihat aplikasi pd jam."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Leret bahagian atas sisi ke bawah untuk kembali."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Untuk memasang atau menyahpasang aplikasi, gunakan aplikasi Samsung Gear di peranti mudah alih anda."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Ini adalah struktur utama skrin utama."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Kosong"
diff --git a/home/res/po/my.po b/home/res/po/my.po
new file mode 100755
index 0000000..f20e4f6
--- /dev/null
+++ b/home/res/po/my.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "အက္ပ္မ်ား"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "ေနာက္ထပ္"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "၀စ္ဂ်စ္တ္"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "ထပ္ခါထပ္ခါ မလုပ္ပါႏွင့္"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "အားလုံး ဖ်က္ပစ္ပါ"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "ျဖဳတ္ရန္ မရႏိုင္ပါ။"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ဝစ္ဂတ္အား ေရႊ႕ရန္ ဤအား ႏွိပ္ျပီး ကိုင္ထားပါ။"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "မူလ ဖန္သားျပင္ ေျပာင္းထားသည္။"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "အခ်က္အလက္ျဖည့္သြင္းေနပါသည္…"
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ေဒတာ တင္ရန္ မရႏိုင္ပါ။ ျပန္ၾကိဳးစားရန္ ႏွိပ္ပါ။"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "အပလီေကးရွင္းကို ေပါင္းထည့္လို႔ မရႏိုင္ပါ။ မူလ ဖန္သားျပင္ေပၚ၌ အခန္းလြတ္ေနရာ ေနာက္ထပ္ မရွိေတာ့ပါ။"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ဝစ္ဂက္စ္ကို ေပါင္းထည့္လို႔ မရႏိုင္ပါ။ မူလ ဖန္သားျပင္ေပၚ၌ အခန္းလြတ္ေနရာ ေနာက္ထပ္ မရွိေတာ့ပါ။"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "အပလီေကးရွင္းက ရွိႏွင့္ေနၿပီးသား ျဖစ္သည္။"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ဝစ္ဂက္စ္က ရွိႏွင့္ေနၿပီးသား ျဖစ္သည္။"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "ပယ္ဖ်က္ပါ"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "မူလ ဖန္သားျပင္ပုံစံကို ေျပာင္းထားၿပီးပါၿပီ။"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ဤအပလီေကးရွင္းကို မူလ ဖန္သားျပင္မွ ဖယ္ထုတ္ပါလိမ့္မည္။ ၎ကို ကိရိယာမွ ဖ်က္ထုတ္လိမ့္မည္ မဟုတ္ပါ။"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "အပလီေကးရွင္းကို ဖယ္ထုတ္ပါ"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ဝစ္ဂတ္ ျဖဳတ္ပါ"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ဤျဖတ္လမ္းကို မူလ ဖန္သားျပင္မွ ျဖဳတ္ထုတ္လိမ့္မည္။ ၎ကို ကိရိယာမွ ဖ်က္ထုတ္လိမ့္မည္ မဟုတ္ပါ။"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "အလြန္ ပါဝါေခြ်တာေရး အေနအထား"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ဝစ္ဂက္ ထည့္မရႏိုင္ပါ။ ဝစ္ဂက္ အမ်ားဆံုး အေရအတြက္ (%d) ေရာက္ပါၿပီ။"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "အပလီေကးရွင္းကို ထည့္လို႔ မရႏိုင္ပါ။ အမ်ားဆံုး အပလီေကးရွင္း အေရအတြက္ (%d) သို႔ ေရာက္ေနပါၿပီ။"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "စာမ်က္ႏွာကုိ ေပါင္းထည့္လို႔ မရႏိုင္ပါ။"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "ရိုးရိုး အေနအထား"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "ပါဝါ ေခၽြတာ အေနအထား ပိတ္ထားသည္။"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "ပါဝါ ေခၽြတာျခင္း အေနအထား ရထားသည္။"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "လတ္တေလာ အပ္မ်ား"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "အပလီေကးရွင္း ထည့္မရႏိုင္ပါ။ အပလီေကးရွင္း အမ်ားဆံုး အေရအတြက္ (%s) ေရာက္ပါၿပီ။"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ဝစ္ဂက္ ထည့္မရႏိုင္ပါ။ ဝစ္ဂက္ အမ်ားဆံုး အေရအတြက္ (%d) ေရာက္ပါၿပီ။"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "စာမ်က္ႏွာ ျဖဳတ္ပါ"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "ဤစာမ်က္ႏွာႏွင့္ ၎၏ ပါဝင္မႈ ျဖဳတ္မည္။"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "ဖယ္ရွားမလား"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "ကြန္ယက္ ၀န္ေဆာင္မႈမ်ားကုိ ၀င္ေရာက္ရရန္ SIM ကဒ္ကုိ ထည့္ပါ။"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "ပိတ္ဆီး အေနအထား"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ဖြင့္"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "ပိတ္"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "အရာဝတၳဳကို ေရြ႕ျပီး။"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "ထည့္ရန္ ႏွစ္ခါႏွိပ္ပါ။"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "၀ီဂ်က္ကုိ ထည့္ေပး"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "အရာဝတၳဳ ထည့္ျပီး။"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "အရာဝတၳဳ ေရြ႕ျပီး။"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "စာမ်က္ႏွာ %2$d ၏ %1$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "အေၾကာင္းၾကားစာ ဘုတ္အကြက္ကို ျပန္စီစဥ္လို႔ မရပါ။"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "၎မွာ %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "မနက္ %d.%d AM"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "မြန္းလြဲ %d.%d PM"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "ပစၥည္း အသစ္ %d ခု"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "ဝစ္ဂ်စ္ အမ်ားဆံုးအေရအတြက္ (%s) ကုိ ေရာက္ပါၿပီ။ ဝစ္ဂ်စ္အခ်ိဳ႕ကုိ ဖ်က္ၿပီး ထပ္ၾကိဳးစားပါ။"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "နာရီသုိ႔ ျပန္သြားရန္ ညာဘက္သုိ႔ ပြတ္ဆြဲပါ။"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ဝစ္ဂ်စ္မ်ားကုိ ၾကည့္ရန္ ဘယ္ဘက္သုိ႔ ပြတ္ဆြဲပါ။"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ေသာ့သုိ႔ျပန္သြားရန္ ဘယ္ဘက္သုိ႔ ပြတ္ဆြဲပါ။"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "အသိေပးခ်က္မ်ားကုိ ၾကည့္ရန္ ညာဘက္သုိ႔ ပြတ္ဆြဲပါ။"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s ကို တပ္ဆင္မည္လား?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ဝစ္ဂ်စ္ အမ်ားဆံုး အေရအတြက္ (%s) သုိ႔ ေရာက္ပါၿပီ။"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "အက္ပ္ ဗန္း ဖြင့္ရန္ ႏွစ္ခ်က္ႏွိပ္ပါ။"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "အေၾကာင္းအရာ အသစ္ ၁ ခု"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "ဖြင့္ရန္ ႏွစ္ခ်က္ႏွိပ္ပါ။"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "နာရီ"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "ကိရိယာ သိပ္ပူလြန္းသည္။"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "မုိဘုိင္းကိရိယာကုိ သံုးၿပီး Gear အပလီေကးရွင္းမ်ားကုိ ေဒါင္းလုပ္ လုပ္ပါ။"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "အိပ္ေနစဥ္"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "ေနာက္ထပ္ အပလီေကးရွင္းမ်ား ရယူျခင္း"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "ပါဝါ ေခြ်တာျခင္း + ကုိ ဖြင့္ထားစဥ္ လုပ္ေဆာင္ခ်က္ မရႏုိင္ပါ။"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "ဖန္သားျပင္ဖတ္စက္ကို ပိတ္ထားစဥ္မွာ %s ကို သုံးလို႔ မရႏိုင္ပါ။"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "အေႏွာင့္အယွက္ မျပဳပါႏွင့္"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ေလယာဥ္ အေနအထားကုိ ဖြင့္ထားစဥ္ မုိဘုိင္းလ္ ေဒတာကုိ မဖြင့္ႏုိင္ပါ။ ေလယာဥ္ အေနအထားကုိ ပိတ္ၿပီး ထပ္ၾကိဳးစားပါ။"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "နာရီသို႔ ျပန္သြားရန္ အထက္သို႔ ပြတ္ဆြဲပါ။"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "ဤမွ်ပါပဲ! Gear ျဖင့္ လႈပ္ရွားေဆာင္ရြက္ပါ!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "မိုဘိုင္း ကြန္ယက္မ်ား"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "ေခၚဆိုမႈမ်ား ဂီယာသို႔ ဆက္ပို႔ပါ"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "စတင္ပါ"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "ထြက္ပါ"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "ႀကိဳဆိုပါသည္! သင့္ Gear အသံုးျပဳပံုကုိ သင္ယူရန္ ေအာက္ပါ ခလုတ္ကုိ ႏွိပ္ပါ။"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "ပိတ္ရန္ ေတာင္းဆုိၿပီးပါၿပီ"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "ဖြင့္ရန္ ေတာင္းဆုိၿပီးပါၿပီ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "နာရီရွိ ညႊန္တံ အုိင္ကြန္မ်ားကုိ ၾကည့္ရန္ ထိပ္အစြန္းကုိ ေအာက္သုိ႔ ပြတ္ဆြဲပါ။"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "နာရီတြင္ အက္ပ္မ်ားၾကည့္ရန္ ေအာက္ဖက္အစြန္းကို အေပၚသုိ႔ ပြတ္ဆြဲပါ။"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "အိုေက"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "ျပန္သြားရန္ ထိပ္အစြန္းကုိ ေအာက္သုိ႔ ပြတ္ဆြဲပါ။"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "အပလီေကးရွင္းမ်ားကို တပ္ဆင္ရန္ (သို႔) သြင္းထားျခင္းအား ျပန္ထုတ္ရန္၊ သင့္မိုဘိုင္းကိရိယာေပၚက Samsung Gear အပလီေကးရွင္းကို သုံးပါ။"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "ဒီတစ္ခုက ပင္မ ဖန္သားျပင္၏ အဓိက ဖြဲ႔စည္းပံုျဖစ္သည္။"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "အားလုံးရွင္းထုတ္ပစ္ၿပီး"
diff --git a/home/res/po/nb.po b/home/res/po/nb.po
new file mode 100755
index 0000000..a12631e
--- /dev/null
+++ b/home/res/po/nb.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Apper"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Neste"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ikke gjenta."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Slett alle"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Kan ikke fjerne."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Trykk på og hold en widget for å flytte den."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Startskjerm endret."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Åpner..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Kan ikke laste data. Trykk for å prøve på nytt."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Kan ikke legge til appen. Ikke mer plass på startskjermbildet."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Kan ikke legge til widgeten. Ikke mer plass på startskjermbildet."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Appen finnes allerede."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widgeten finnes allerede."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Avbryt"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Startskjermoppsett er endret."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Denne appen vil bli fjernet fra startskjermbildet. Den vil ikke bli slettet fra enheten."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Fjern app"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Fjern widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Denne widgeten vil bli fjernet fra startskjermbildet. Den vil ikke bli slettet fra enheten."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra strømsparingsmodus"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Kan ikke legge til widget. Maksimalt antall widgeter (%d) er nådd."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Kan ikke legge til app. Maksimalt antall apper (%d) er nådd."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Kan ikke legge til side."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normal modus"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Strømsparingsmodus er deaktivert."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Strømsparingsmodus er aktivert."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Nylige apper"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Kan ikke legge til app. Maksimalt antall apper (%s) er nådd."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Kan ikke legge til widget. Maksimalt antall widgeter (%s) er nådd."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Fjern side"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Denne siden og dens innhold vil bli fjernet."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Fjern"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Sett inn SIM-kort for å få tilgang til nettverkstjenester."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Sperremodus"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "På"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Av"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elementet ble flyttet."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Trykk raskt to ganger for å legge til."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Legg til widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Element lagt til."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Element fjernet."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Side %1$d av %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Kan ikke omorganisere varselstavleelementer."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Den er %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Klokken er %d:%d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Klokken er %d:%d."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d nye elementer"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Du har nådd det maksimale antallet widgeter (%s). Slett noen widgeter, og prøv på nytt."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Stryk mot høyre for å gå tilbake til klokken."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Stryk mot venstre for å vise widgeter."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Stryk mot venstre for å gå tilbake til klokken."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Stryk mot høyre for å se varsler."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Avinstallere %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Maksimalt antall widgeter (%s) er nådd."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Trykk raskt to ganger for å åpne appskuffen."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nytt element"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Trykk raskt to ganger for å aktivere."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Klokke"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Enhetens temperatur er for høy."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Last ned Gear-apper med en mobilenhet."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Når du sover"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Skaff deg flere apper"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Handling ikke tilgjengelig mens Strømsparing + er aktivert."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s er ikke tilgjengelig mens Skjermleser er aktivert."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ikke forstyrr"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Kan ikke slå på mobildata mens Flymodus er aktivert. Deaktiver Flymodus, og prøv på nytt."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Stryk oppover for å gå til klokken."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Det er det! Kom i gang med Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobilnett"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Viderekoble hit"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Avslutt"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Velkommen! Trykk på knapp under og se hvordan Gear brukes."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Bedt om å deaktivere"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Bedt om å aktivere"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Stryk øvre kant ned for å se indikatorikoner på klokke."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Stryk nedre kant opp for å vise apper på klokke."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Stryk øvre kant ned for å gå tilbake."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "For å installere eller avinstallere apper må du bruke Samsung Gear-appen på mobilenheten."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Dette er hovedstrukturen på startskjermbildet."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Tom"
diff --git a/home/res/po/ne.po b/home/res/po/ne.po
new file mode 100755
index 0000000..6865f6a
--- /dev/null
+++ b/home/res/po/ne.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "एप्स"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "अर्को"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "विजिट"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "नदोहर्‍याउनुहोस्।"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "सबै मेटाउनुहोस्"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "हटाउन असमर्थ छ।"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "विजेटलाई सार्न ट्याप गरि समात्नुहोस्।"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "गृह स्क्रीन परिवर्तित भयो।"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "लोड हुँदै छ..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "डाटा लोड गर्न सकेन। पुन: प्रयास गर्नुहोस् मा ट्याप गर्नुहोस्।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "अनुप्रयोग थप्‍न असक्षम। गृह स्क्रीनमा थप स्थान छैन।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "विजिट थप्न असक्षम। गृह स्क्रीनमा थप स्थान छैन।"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "अनुप्रयोगहरू पहिलेनै अवस्थित छ।"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "विजिट पहिलेनै अवस्थित छ।"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "रद्द गर्नुहोस्"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "गृह स्क्रीन लेआउट परिवर्तन गरिएको छ।"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "यो अनुप्रयोग गृह स्क्रीनबाट हटाइने छ। यसलाई यन्त्रबाट मेटाइने छैन।"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "अनुप्रयोग हटाउनुहोस्"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "विजिट हटाउनुहोस्"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "यो विजिट गृह स्क्रीनबाट हटाइने छ। यसलाई यन्त्रबाट मेटाइने छैन।"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "अल्ट्रा पावर बचत मोड"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "विजिट थप्न असक्षम। विजिटहरूको अधिकतम संख्या (%d) पुग्यो।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "अनुप्रयोग थप्‍न असक्षम। अनुप्रयोगहरूको अधिकतम संख्या (%d) पुग्यो।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "पृष्‍ठ थप्‍न असमर्थ।"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "सामान्य मोड"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "पवर बचत मोड असक्षम भयो।"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "पवर बचत गर्ने मोड सक्षम बनाइयो।"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "हालका एप्‍स"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "अनुप्रयोग थप्‍न असक्षम। अनुप्रयोगहरूको अधिकतम संख्या (%s) पुग्यो।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "विजिट थप्न असक्षम। विजिटहरूको अधिकतम संख्या (%s) पुग्यो।"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "पृष्ठ हटाउनुहोस्"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "यो पृष्ठ र यसका सामग्री हटाइनेछ।"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "हटाउनुहोस्"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "नेटवर्क सेवाहरु पहुँच गर्न SIM कार्ड घुसाउनुहोस्।"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "ब्लकिङ मोड"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "अन"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "अफ"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "वस्तु सारियो।"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "थप्न दुई पटक ट्याप गर्नुहोस्।"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "विजेटहरु थप्नुहोस्"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "वस्तु थपियो।"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "वस्तु हटाइयो।"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d को %1$d पृष्ठहरू"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "सूचना बोर्ड वस्तुहरू पुनः क्रमबद्ध गर्न सकिँदैन।"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "यो %1$d:%2$d हो।"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "अहिले %d:%d AM भयो।"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "अहिले %d:%d PM भयो।"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d नयाँ वस्तु"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "विजेटहरूको अधिकतम संख्या (%s) पुगेको छ। केही विजेटहरू मेटाएर फेरि प्रयास गर्नुहोस्।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "घडीको पछाडि जान दायाँ स्वाइप गर्नुहोस्।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "विजेटहरू हेर्न बायाँ स्वाइप गर्नुहोस्।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "घडीमा फर्कन बायाँ स्वाइप गर्नुहोस्।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "सूचनाहरू हेर्न दायाँ स्वाइप गर्नुहोस्।"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s को स्थापना रद्द गर्ने?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "विजेटहरूको अधिकतम संख्या (%s) पुग्यो।"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "एप ट्रे खोल्न दुईपटक ट्याप गर्नुहोस्।"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 नया चीज"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "सक्षम गर्न दुई पटक ट्याप गर्नुहोस्।"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "घडी"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "यन्त्रको तापक्रम अति उच्च छ।"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "मोबाइल यन्त्र प्रयोग गरेर गियरका अनुप्रयोगहरू डाउनलोड गर्नुहोस्।"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "सुतेको बेला"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "थप अनुप्रयोगहरू प्राप्त गर्नुहोस्"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "वेक-अप + सक्षम गरेको बेला कार्य उपलब्ध छैन।"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "स्क्रीन रिडर सक्षम छँदा %s उपलब्ध हुँदैन।"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "बाधा नपुर्याउनुहोला"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "उडान मोड सक्षम गरिएको बेला मोबाइल डाटा अन गर्न असक्षम। उडान मोडलाई असक्षम गरेर फेरि प्रयास गर्नुहोस्।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "घडीमा फर्कन माथितिर स्वाइप गर्नुहोस्।"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "त्यति नै हो! गियर प्रयोग गर्न सुरू गर्नुहोस्!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "मोबाइल नेटवर्कहरू"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "गियरमा कलहरू फर्वाड गर्नुहोस्"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "सुरु"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "बाहिर निस्कनु"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "स्वागतम्! आफ्नो गियर कसरी प्रयोग गर्ने भन्ने बारे सिक्न तलको बटनमा ट्याप गर्नुहोस्।"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "असक्षम गर्न अनुरोध गरियो"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "सक्षम गर्न अनुरोध गरियो"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "घडीमा सूचक प्रतिमाहरू हेर्नको लागि शीर्ष किनारालाई तल स्वाइप गर्नुहोस्।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "घडीमा एप्स हेर्नको लागि तल्लो किनारालाई माथितिर स्वाइप गर्नुहोस्।"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ठीक छ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "पछाडि जानको लागि शीर्ष किनारालाई तल स्वाइप गर्नुहोस्।"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "अनुप्रयोगहरू स्थापना गर्न वा स्थापना रद्द गर्न, आफ्नो मोबाइल यन्त्रमा सैमसंग गियर अनुप्रयोग प्रयोग गर्नुहोस्।"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "यो गृह स्क्रीनको मुख्य संरचना हो।"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "खाली"
diff --git a/home/res/po/nl.po b/home/res/po/nl.po
new file mode 100755
index 0000000..ca4e86b
--- /dev/null
+++ b/home/res/po/nl.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Apps"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Volgende"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Niet herhalen"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Alles wissen"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Kan niet verwijderen."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Tik op widget en houd vast om deze te verplaatsen."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Startscherm gewijzigd."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Laden..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Kan gegevens niet laden. Tik om opnieuw te proberen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Kan applicatie niet toevoegen. Geen ruimte meer op startscherm."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Kan widget niet toevoegen. Geen ruimte meer op startscherm."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Applicatie bestaat al."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget bestaat al."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Annul."
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Lay-out startscherm gewijzigd."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "De applicatie wordt uit het startscherm verwijderd. Deze wordt niet van het apparaat verwijderd."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Applic. verwijderen"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Widget verwijderen"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "De widget wordt uit het startscherm verwijderd. Deze wordt niet van het apparaat verwijderd."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Extra energiebespar.stand"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Kan widget niet toevoegen. Maximumaantal widgets (%d) bereikt."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Kan applicatie niet toevoegen. Maximumaantal applicaties (%d) bereikt."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Kan pagina niet toevoegen."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normale stand"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Spaarstand uitgeschakeld."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Spaarstand ingeschakeld."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Recente apps"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Kan applicatie niet toevoegen. Maximumaantal applicaties (%s) bereikt."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Kan widget niet toevoegen. Maximumaantal widgets (%s) bereikt."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Pagina verwijderen"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Deze pagina en de inhoud daarvan worden verwijderd."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Wissen"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Plaats de SIM-kaart voor netwerkdiensten."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blokkeerstand"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Aan"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Uit"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Item verplaatst."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Tik twee keer om toe te voegen."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Widget toevoegen"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Item toegevoegd."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Item verwijderd."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Pagina %1$d van %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Items op het meldingenbord kunnen niet anders worden ingedeeld."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Het is %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Het is %d:%d vm."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Het is %d:%d nm."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d nieuwe items"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Het maximumaantal widgets (%s) is bereikt. Verwijder enkele widgets en probeer het opnieuw."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Veeg rechts en ga terug naar klok."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Veeg links om widgets weer te geven."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Veeg links en ga terug naar klok."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Veeg rechts om meldingen te bekijken."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s verwijderen?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Maximumaantal widgets (%s) bereikt."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Tik tweemaal om appvak te openen."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nieuw item"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Tik twee keer om in te schakelen."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Klok"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Temperatuur van het apparaat is te hoog."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Download Gear-applicaties met een mobiel apparaat."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Tijdens slapen"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Meer applicaties ophalen"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Actie niet beschikbaar als Spaarstand+ is ingeschakeld."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s is niet beschikbaar wanneer Schermlezer is ingeschakeld."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Niet storen"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Mobiele gegevens niet beschikbaar in Vliegtuigstand. Zet Vliegtuigstand uit en probeer opn."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Veeg omhoog om terug te gaan naar klok."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Aan de slag met Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobiele netw."
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Doorsch naar Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Sluiten"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Welkom! Tik op knop hieronder om uw Gear te leren gebruiken."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Uitschakelen aangevr."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Inschakelen aangevraagd"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Veeg vanaf bovenrand omlaag voor indicatorpict. op klok."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Veeg vanaf onderrand omhoog voor appweergave op klok."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Veeg vanaf bovenrand omlaag om terug te gaan."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Als u applicaties wilt installeren of verwijderen, gebruikt u de applicatie Samsung Gear op uw mobiele apparaat."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Dit is de hoofdstructuur van het startscherm."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Leeg"
diff --git a/home/res/po/or.po b/home/res/po/or.po
new file mode 100755
index 0000000..4eb6ce6
--- /dev/null
+++ b/home/res/po/or.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "ଆପ୍ଲିକେସନଗୁଡିକ"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "ପରବର୍ତ୍ତୀ"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "ୱିଜେଟ୍"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "ପୁନରାବୃତ୍ତି କରନ୍ତୁ ନାହିଁ।"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "ସମସ୍ତ ବିଲୋପ"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "ଅପସାରଣ କରିବାକୁ ଅସମର୍ଥ।"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ଏହା ଘୁଞ୍ଚାଇବାକୁ ଏକ ୱିଜେଟ୍ ଟ୍ୟାପ୍ କରି ଧରି ରଖନ୍ତୁ।"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "ହୋମ୍ ସ୍କ୍ରିନ୍ ପରିବର୍ତ୍ତନ ହେଲା।"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "ଲୋଡ୍ କରୁଛି..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ଡାଟା ଲୋଡ୍ କରିବାକୁ ଅସମର୍ଥ। ପୁନଃଚେଷ୍ଟା କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ଆପ୍ଲିକେସନ୍ ଯୋଡିବାକୁ ଅସମର୍ଥ। ହୋମ୍ ସ୍କ୍ରିନରେ ଆଉ ଅଧିକ ପ୍ରକୋଷ୍ଟ ନାହିଁ।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ୱିଜେଟ୍ ଯୋଡିବାକୁ ଅସମର୍ଥ। ହୋମ୍ ସ୍କ୍ରିନରେ ଆଉ ଅଧିକ ପ୍ରକୋଷ୍ଟ ନାହିଁ।"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "ଆପ୍ଲିକେସନ୍ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି।"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ୱିଜେଟ୍ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି।"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "ବାତିଲ୍"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "ହୋମ୍ ସ୍କ୍ରିନ୍ ଲେଆଉଟ୍ ବଦଳିଛି।"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ଏହି ଆପ୍ଲିକେସନ୍ ହୋମ୍ ସ୍କ୍ରିନ୍‌ରୁ ଅପସାରିତ ହେବ। ଏହା ଡିଭାଇସ୍ ଠାରୁ ବିଲୋପିତ ହେବନାହିଁ।"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "ଆପ୍ଲିକେସନ୍ ଅପସାରଣ"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ୱିଜେଟ୍ ଅପସାରଣ କରନ୍ତୁ"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ଏହି ୱିଜେଟ୍ ହୋମ୍ ସ୍କ୍ରିନ୍‌ରୁ ଅପସାରିତ ହେବ। ଏହା ଡିଭାଇସ୍ ଠାରୁ ବିଲୋପିତ ହେବନାହିଁ।"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "ଅଲଟ୍ରା ପାୱାର୍ ସଞ୍ଚୟ ମୋଡ୍"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ୱିଜେଟ୍‌ ଯୋଡିବାକୁ ଅସମର୍ଥ। ସର୍ବାଧିକ ସଂଖ୍ୟାର ୱିଜେଟ୍‌ (%d)ରେ ପହଞ୍ଚିଛି।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "ଆପ୍ଲିକେସନ୍ ଯୋଡିବାକୁ ଅସମର୍ଥ। ସର୍ବାଧିକ ସଂଖ୍ୟକର ଆପ୍ଲିକେସନ୍‌ (%d)ରେ ପହଞ୍ଚିଛି।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "ପୃଷ୍ଠା ଯୋଡିବାକୁ ଅସମର୍ଥ।"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "ସାଧାରଣ ମୋଡ୍"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "ପାୱାର୍ ସଞ୍ଚୟ ମୋଡ୍ ଅକ୍ଷମ ହୋଇଛି।"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "ପାୱାର୍ ସଞ୍ଚୟ ମୋଡ୍ ସକ୍ଷମ ହୋଇଛି।"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "ସମ୍ପ୍ରତି ଆପସ୍"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "ଆପ୍ଲିକେସନ୍ ଯୋଡିବାକୁ ଅସମର୍ଥ। ସର୍ବାଧିକ ସଂଖ୍ୟକର ଆପ୍ଲିକେସନ୍ (%s)ରେ ପହଞ୍ଚିଛି।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ୱିଜେଟ୍ ଯୋଡିବାକୁ ଅସମର୍ଥ। ସର୍ବାଧିକ ସଂଖ୍ୟକ ୱିଜେଟ୍ (%s)ରେ ପହଞ୍ଚିଛି।"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "ପୃଷ୍ଠା ଅପସାରଣ କରନ୍ତୁ"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "ଏହି ପୃଷ୍ଠା ଏବଂ ଏହାର ବିଷୟବସ୍ତୁ ଅପସାରିତ ହେବ।"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "ଅପସାରଣ"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "ନେଟୱାର୍କ୍‌ ସେବା ପ୍ରବେଶ କରିବାକୁ SIM କାର୍ଡ୍ ସନ୍ନିବେଶ କରନ୍ତୁ।"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "ଅବରୋଧକରଣ ମୋଡ୍"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ଅନ୍"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "ଅଫ୍"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "ଆଇଟମ୍ ଘୁଞ୍ଚିଛି।"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "ଯୋଡିବାକୁ ଦୁଇଥର ଟ୍ୟାପ୍ କରନ୍ତୁ।"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "ୱିଜେଟକୁ ଯୋଗ କରନ୍ତୁ"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "ଆଇଟମ୍ ଯୋଡି ହୋଇଛି।"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "ଆଇଟମ୍ ଅପସାରିତ ହୋଇଛି।"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d ର %1$d ପୃଷ୍ଠା"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "ସୂଚନା ବୋର୍ଡ ଆଇଟମଗୁଡିକ ପୁନଃଆକୃତି କରାଯାଇ ପାରିବ ନାହିଁ।"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "ଏହା %1$d:%2$d।"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "ଏହା %d:%d AM"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "ଏହା %d:%d PM"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d ନୂତନ ଆଇଟମ୍"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "ସର୍ବାଧିକ ସଂଖ୍ୟକର ୱିଜେଟଗୁଡିକ (%s)ରେ ପହଞ୍ଚିଛି। କିଛି ୱିଜେଟଗୁ. ବିଲୋପ କରନ୍ତୁ ଏବଂ ପୁନଃଚେଷ୍ଟା କରନ୍ତୁ।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ଘଣ୍ଟାକୁ ଫେରିବାକୁ ଡାହାଣକୁ ସ୍ଵାଇପ୍ କରନ୍ତୁ।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ୱିଜେଟଗୁଡିକ ଦେଖିବାକୁ ବାମକୁ ସ୍ଵାଇପ୍ କର.।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ଘଣ୍ଟାକୁ ଫେରିବାକୁ ବାମକୁ ସ୍ଵାଇପ୍ କରନ୍ତୁ।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "ବିଜ୍ଞପ୍ତିଗୁ. ଦେଖି. ଡାହାଣକୁ ସ୍ଵାଇ. କର.।"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s ଅଣସଂସ୍ଥାପନ କରିବେ?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ସର୍ବାଧିକ ସଂଖ୍ୟାର ୱିଜେଟ୍‌ (%s)ରେ ପହଞ୍ଚିଛି।"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "ଆପ୍ଲିକେସନ୍‌ ଟ୍ରେ ଖୋଲିବାକୁ ଦୁଇଥର ଟ୍ୟାପ୍‌ କରନ୍ତୁ।"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 ନୂତନ ଆଇଟମ୍"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "ଦୁଇଥର ଟ୍ୟାପ୍ କରି ସକ୍ଷମ କରନ୍ତୁ।"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ଘଣ୍ଟା"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "ଡିଭାଇସ୍ ତାପମାତ୍ରା ବହୁତ ଅଟେ।"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "ମୋବାଇଲ୍‌ ଡିଭାଇସ୍‌ ବ୍ୟବହାର କରି ଗିଅର୍‌ ଆପ୍ଲିକେସନଗୁଡିକ ଡାଉନଲୋଡ୍‍ କରନ୍ତୁ।"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "ଶୋ‍ଇବା ସମୟରେ"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "ଅଧିକ ଆପ୍ଲିକେସନ୍ ପାଆନ୍ତୁ"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "ପାୱାର୍ ସଞ୍ଚୟ + ସକ୍ଷମ ଥିବାବେଳେ କ୍ରିୟା ଉପଲବ୍ଧ ହୁଏ ନାହିଁ।"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "ସ୍କ୍ରିନ୍ ପାଠକ ସକ୍ଷମ ସମୟରେ %s ଉପଲବ୍ଧ ନାହିଁ।"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "ବିଚଳିତ କରାନ୍ତୁ ନାହିଁ"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ଫ୍ଲାଇଟ୍ ମୋଡ୍ ସକ୍ଷମ ହୋଇଥିବା ବେଳେ ମୋବାଇଲ୍ ଡାଟା ଅନ୍‌ କରିବାକୁ ଅସମର୍ଥ। ଫ୍ଲାଇଟ୍ ମୋଡ୍ ଅକ୍ଷମ କର. ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ଘଣ୍ଟାକୁ ଫେରିବାକୁ ଉପରକୁ ସ୍ଵାଇପ୍ କରନ୍ତୁ।"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "ଏହା ଅଟେ! ଗିଅରକୁ ଯାଆନ୍ତୁ!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "ମୋବାଇଲ୍ ନେଟୱାର୍କଗୁଡିକ"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "ଗିଅର୍‌କୁ କଲ୍‍ଗୁଡିକ ଅଗ୍ରଗାମୀ କରନ୍ତୁ"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "ଆରମ୍ଭ"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "ପ୍ରସ୍ଥାନ"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "ସ୍ଵାଗତ! କିପରି ଆପଣଙ୍କ ଗିଅର୍‌ ବ୍ୟବହାର କରିବେ ସେହି ବିଷୟରେ ଜାଣିବାକୁ ନିମ୍ନର ବଟନ୍‌ ଟ୍ୟାପ୍‌ କରନ୍ତୁ।"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "ଅକ୍ଷମ କରିବାକୁ ଅନୁରୋଧ ହୋଇଛି"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "ସକ୍ଷମ କରିବାକୁ ଅନୁରୋଧ ହୋଇଛି"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ଘଣ୍ଟାରେ ସୂଚକ ଆଇକନଗୁଡିକ ଦେଖିବାକୁ ଶୀର୍ଷ ପ୍ରାନ୍ତର ନିମ୍ନ ଆଡକୁ ସ୍ଵାଇପ୍ କରନ୍ତୁ।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ଘଣ୍ଟାରେ ଆପ୍ଲିକେସନଗୁଡିକ ଦର୍ଶନ କରିବାକୁ ନିମ୍ନ ପ୍ରାନ୍ତ ପର୍ଯ୍ୟନ୍ତ ସ୍ଵାଇପ୍ କରନ୍ତୁ।"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ଓକେ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "ପଛକୁ ଯିବାକୁ ଶୀର୍ଷ ପ୍ରାନ୍ତର ନିମ୍ନ ଆଡକୁ ସ୍ଵାଇପ୍ କରନ୍ତୁ।"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "ଆପ୍ଲିକେସନଗୁଡିକ ସଂସ୍ଥାପନ କିମ୍ୱା ଅଣସଂସ୍ଥାପନ କରିବାକୁ, ଆପଣଙ୍କ ମୋବାଇଲ୍‌ ଡିଭାଇସରେ ସାମସଙ୍ଗ ଗିଅର୍‌ ଆପ୍ଲିକେସନ୍ ବ୍ୟବହାର କରନ୍ତୁ।"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "ଏହା ହୋମ୍ ସ୍କ୍ରିନର ମୁଖ୍ୟ ଗଠନ।"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ଖାଲି"
diff --git a/home/res/po/pa.po b/home/res/po/pa.po
new file mode 100755
index 0000000..34bdacb
--- /dev/null
+++ b/home/res/po/pa.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "ਐਪਸ"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "ਅੱਗੇ"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "ਵਿੱਜੇਟ"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "ਦੁਹਰਾਉ ਨਹੀਂ।"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "ਸਾਰੇ ਮਿਟਾਓ"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "ਹਟਾਉਣ ਵਿੱਚ ਅਸਮਰੱਥ।"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ਵਿੱਜੇਟ ਨੂੰ ਮੂਵ ਕਰਨ ਲਈ ਟੈਪ ਕਰਕੇ ਰੱਖੋ।"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "ਹੋਮ ਸਕ੍ਰੀਨ ਬਦਲੀ।"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ਡੈਟਾ ਨੂੰ ਲੋਡ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ਅਨੁਪ੍ਰਯੋਗ ਜੋੜਨ ਵਿੱਚ ਅਸਮਰੱਥ। ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਹੋਰ ਥਾਂ ਨਹੀਂ।"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ਵਿੱਜੇਟ ਜੋੜਨ ਵਿੱਚ ਅਸਮਰੱਥ। ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਹੋਰ ਥਾਂ ਨਹੀਂ।"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "ਅਨੁਪ੍ਰਯੋਗ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਮੌਜੂਦ ਹੈ।"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ਵਿੱਜੇਟ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਮੌਜੂਦ ਹੈ।"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "ਰੱਦ ਕਰੋ"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "ਹੋਮ ਸਕ੍ਰੀਨ ਲੇਆਉਟ ਬਦਲਿਆ।"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ਇਸ ਅਨੁਪ੍ਰਯੋਗ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਇਹ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਤੋਂ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾਵੇਗਾ।"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "ਅਨੁਪ੍ਰਯੋਗ ਹਟਾਓ"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ਵਿੱਜੇਟ ਹਟਾਉ"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ਇਸ ਵਿੱਜੇਟ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ। ਇਹ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਤੋਂ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾਵੇਗਾ।"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "ਅਲਟ੍ਰਾ ਪਾਵਰ ਸੇਵਿੰਗ ਮੋਡ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ਵਿੱਜੇਟ ਜੋੜਨ ਵਿੱਚ ਅਸਮਰੱਥ। ਵਿੱਜੇਟਸ ਅਧਿਕਤਮ ਸੰਖਿਆ (%d) ਤੇ ਪਹੁੰਚੇ।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "ਅਨੁਪ੍ਰਯੋਗ ਜੋੜਨ ਵਿੱਚ ਅਸਮਰੱਥ। ਅਨੁਪ੍ਰਯੋਗਾਂ ਦੀ ਅਧਿਕਤਮ ਸੰਖਿਆ (%d) ਤੇ ਪਹੁੰਚ ਗਈ ਹੈ।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "ਪੇਜ ਜੋੜਨ ਵਿੱਚ ਅਸਮਰੱਥ।"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "ਸਧਾਰਨ ਮੋਡ"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "ਪਾਵਰ ਸੇਵਿੰਗ ਮੋਡ ਅਸਮਰੱਥ ਹੋਇਆ।"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "ਪਾਵਰ ਸੇਵਿੰਗ ਮੋਡ ਸਮਰੱਥ ਹੋਇਆ।"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "ਹਾਲ ਹੀ ਦੇ ਐਪਸ"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "ਅਨੁਪ੍ਰਯੋਗ ਜੋੜਨ ਵਿੱਚ ਅਸਮਰੱਥ। ਅਨੁਪ੍ਰਯੋਗ ਅਧਿਕਤਮ ਸੰਖਿਆ (%s) ਤੇ ਪਹੁੰਚ ਗਏ ਹਨ।"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ਵਿੱਜੇਟ ਜੋੜਨ ਵਿੱਚ ਅਸਮਰੱਥ। ਵਿੱਜੇਟ ਅਧਿਕਤਮ ਸੰਖਿਆ (%s) ਤੇ ਪਹੁੰਚ ਗਏ ਹਨ।"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "ਪੰਨਾ ਹਟਾਉ"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "ਇਹ ਪੰਨਾ ਅਤੇ ਇਸਦੀ ਸਮੱਗਰੀ ਹਟਾ ਦਿੱਤੀ ਜਾਵੇਗੀ।"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "ਹਟਾਉ"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "ਨੈੱਟਵਰਕ ਸੇਵਾਵਾਂ ਐਕਸੈੱਸ ਕਰਨ ਲਈ SIM ਕਾਰਡ ਸੰਮਿਲਤ ਕਰੋ।"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "ਬਲੌਕਿੰਗ ਮੋਡ"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ਚਾਲੂ"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "ਬੰਦ"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "ਆਈਟਮ ਮੂਵ ਕੀਤੀ ਗਈ।"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "ਜੋੜਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ।"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "ਵਿੱਜੇਟ ਜੋੜੋ"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "ਆਈਟਮ ਜੋੜੀ ਗਈ।"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "ਆਈਟਮ ਹਟਾਈ ਗਈ।"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d ਦਾ %1$d ਪੰਨਾ"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "ਸੂਚਨਾ ਬੋਰਡ ਆਈਟਮਸ ਨੂੰ ਪੁਨਰ ਕ੍ਰਮ ਨਹੀਂ ਦਿੱਤਾ ਜਾ ਸਕਦਾ।"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "ਇਹ %1$d:%2$d ਹੈ।"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "ਹੁਣ %d:%d AM ਹੈ।"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "ਹੁਣ %d:%d PM ਹੈ।"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d ਨਵੀਆਂ ਆਈਟਮਸ"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "ਵਿੱਜੇਟਸ ਦੀ ਅਧਿਕਤਮ ਸੰਖਿਆ (%s) ਤੇ ਪਹੁੰਚ ਗਈ ਹੈ। ਕੁੱਝ ਵਿੱਜੇਟਸ ਮਿਟਾਓ ਅਤੇ ਫਿਰ ਕੋਸ਼ਿਸ ਕਰੋ।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ਘੜੀ ਤੇ ਵਾਪਸ ਜਾਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰੋ।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ਵਿੱਜੇਟ ਦੇਖਣ ਲਈ ਖੱਬੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰੋ।"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ਘੜੀ ਤੇ ਵਾਪਸ ਜਾਣ ਲਈ ਖੱਬੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰੋ।"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "ਸੂਚਨਾਵਾਂ ਦੇਖਣ ਲਈ ਸੱਜੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰੋ।"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s ਅਸਥਾਪਿਤ ਕਰੀਏ?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ਵਿੱਜੇਟਸ ਅਧਿਕਤਮ ਸੰਖਿਆ (%s) ਤੇ ਪਹੁੰਚ ਗਏ ਹਨ।"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "ਐਪ ਟ੍ਰੇਅ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ।"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 ਨਵੀਂ ਆਈਟਮ"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "ਸਮਰੱਥ ਕਰਨ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ।"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ਘੜੀ"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "ਡਿਵਾਈਸ ਦਾ ਤਾਪਮਾਨ ਬਹੁਤ ਵੱਧ ਹੈ।"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "ਮੋਬਾਈਲ ਡਿਵਾਈਸ ਰਾਹੀਂ ਗੇਅਰ ਅਨੁਪ੍ਰਯੋਗ ਡਾਉਨਲੋਡ ਕਰੋ।"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "ਸੌਂਦੇ ਸਮੇਂ"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "ਹੋਰ ਅਨੁਪ੍ਰਯੋਗ ਪ੍ਰਾਪਤ ਕਰੋ"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "ਪਾਵਰ ਸੇਵਿੰਗ + ਸਮਰੱਥ ਹੋਣ ਤੇ ਕਾਰਜ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "ਸਕ੍ਰੀਨ ਰੀਡਰ ਸਮਰੱਥ ਹੋਣ ਵੇਲੇ %s ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ਫਲਾਈਟ ਮੋਡ ਸਮਰੱਥ ਹੋਣ ਤੇ ਮੋਬਾਈਲ ਡੈਟਾ ਚਾਲੂ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ। ਫਲਾਈਟ ਮੋਡ ਅਸਮਰੱਥ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ਘੜੀ ਉੱਤੇ ਵਾਪਸ ਜਾਣ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ।"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "ਇਹੀ ਗੱਲ ਹੈ! ਗੇਅਰ ਤੇ ਜਾਓ!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "ਗੇਅਰ ਤੇ ਕਾੱਲਾਂ ਫਾੱਰਵਰਡ ਕਰੋ"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "ਅਰੰਭ ਕਰੋ"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "ਬਾਹਰ ਜਾਓ"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "ਸੁਆਗਤ ਹੈ! ਆਪਣੇ ਗੇਅਰ ਦਾ ਉਪਯੋਗ ਕਰਨਾ ਸਿੱਖਣ ਲਈ ਹੇਠਾਂ ਦਿੱਤੇ ਬਟਨ ਉੱਤੇ ਟੈਪ ਕਰੋ।"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "ਅਸਮਰੱਥ ਕਰਨ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਗਈ"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "ਸਮਰੱਥ ਕਰਨ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਗਈ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ਘੜੀ ਤੇ ਸੂਚਕ ਪ੍ਰਤੀਰੂਪਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਉੱਪਰੀ ਕਿਨਾਰੇ ਨੂੰ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ।"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ਘੜੀ ਤੇ ਐਪਸ ਦੇਖਣ ਲਈ ਹੇਠਲੇ ਕਿਨਾਰੇ ਨੂੰ ਉੱਪਰ ਸਵਾਈਪ ਕਰੋ।"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ਓਕੇ"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "ਵਾਪਸ ਜਾਣ ਲਈ ਉੱਪਰੀ ਕਿਨਾਰੇ ਨੂੰ ਹੇਠਾਂ ਸਵਾਈਪ ਕਰੋ।"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "ਅਨੁਪ੍ਰਯੋਗਾਂ ਨੂੰ ਸਥਾਪਿਤ ਜਾਂ ਅਣਸਥਾਪਿਤ ਕਰਨ ਲਈ, ਸੈਮਸੰਗ ਗੇਅਰ ਅਨੁਪ੍ਰਯੋਗ ਨੂੰ ਆਪਣੇ ਮੋਬਾਈਲ ਡਿਵਾਈਸ ਉੱਤੇ ਉਪਯੋਗ ਕਰੋ।"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "ਇਹ ਹੋਮ ਸਕ੍ਰੀਨ ਦੀ ਮੁੱਖ ਬਣਤਰ ਹੈ।"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ਖਾਲੀ"
diff --git a/home/res/po/pl.po b/home/res/po/pl.po
new file mode 100755
index 0000000..db6390f
--- /dev/null
+++ b/home/res/po/pl.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikacje"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Dalej"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Nie powt."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Usuń wszystko"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Nie można usunąć."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Dotknij widget, przytrzymaj go, aby przesunąć."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Zmieniono ekran startowy."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Ładuję..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Nie można załadować danych. Dotknij, aby spróbować ponownie."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nie można dodać aplikacji. Na ekranie startowym nie ma już miejsca."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nie można dodać widgetu. Na ekranie startowym nie ma już miejsca."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikacja już istnieje."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget już istnieje."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Anuluj"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Zmieniono układ ekranu startowego."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ta aplikacja zostanie usunięta z ekranu startowego. Nie zostanie ona usunięta z urządzenia."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Usuwanie aplikacji"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Usuwanie widgetów"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ten widget zostanie usunięty z ekranu startowego. Nie zostanie on usunięty z urządzenia."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Tryb b. nis. zuż. energii"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Nie można dodać widgetu. Osiągnięto maksymalną liczbę widgetów (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Nie można dodać aplikacji. Osiągnięto maksymalną liczbę aplikacji (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Nie można dodać strony."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Tryb normalny"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Wyłączono Tryb oszczędzania energii."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Włączono tryb oszczędzania energii."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Ost. aplik."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Nie można dodać aplikacji. Osiągnięto maksymalną liczbę aplikacji (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Nie można dodać widgetu. Osiągnięto maksymalną liczbę widgetów (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Usuń stronę"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Ta strona i jej zawartość zostaną usunięte."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Usuń"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Włóż kartę SIM, aby uzyskać dostęp do usług sieciowych."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Tryb blokowania"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Włączony"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Wyłączony"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Element został przeniesiony."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Dotknij dwukrotnie, aby dodać."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Dodaj widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Dodano element."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Element usunięty."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Strona %1$d z %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Nie można zmienić kolejności elementów na tablicy powiadomień."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Godzina %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Godzina %d:%d rano"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Godzina %d:%d po południu"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "Liczba nowych elementów: %d"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Osiągnięto maksymalną liczbę widgetów (%s). Usuń niektóre widgety i spróbuj ponownie."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Przec. w prawo, aby wrócić do zegara."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Przec. w lewo, aby wyświetlić widgety."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Przec. w lewo, aby wrócić do zegara."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Przec. w prawo, aby wyśw. powiadom."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Odinstalować %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Osiągnięto maksymalną liczbę widgetów (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Dotknij dwukrotnie, aby otworzyć zasobnik aplikacji."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "Nowych elementów: 1"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Dotknij dwukrotnie, aby włączyć."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Zegar"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Temperatura urządzenia jest zbyt wysoka."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Pobierz aplikacje zegarka Gear przy użyciu urządzenia przenośnego."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Podczas snu"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Pobierz więcej aplikacji"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Operacja jest niedostępna przy włączonym trybie Oszczędzanie energii +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Element %s nie jest dostępny, gdy jest włączony jest Czytnik ekranu."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Nie przeszkadzać"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Nie można wł. trans. danych, gdy tryb Offline jest włączony. Wyłącz go i spróbuj ponownie."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Przesuń w górę, aby wrócić do zegara."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Oto zegarek Gear! Daj się oczarować!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Sieci komórkowe"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Przek.poł.do Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Rozpocznij"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Wyjdź"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Witamy! Dotknij przycisku poniżej, aby poznać zegarek Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Zażądano wyłączenia"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Zażądano włączenia"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Aby zobaczyć ikony wskaźników na zegarze, przesuń w dół."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Przesuń w górę od krawędzi, aby wyśw. apl. na zegarze."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Przesuń w dół od górnej krawędzi, aby wrócić."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Aby instalować lub odinstalowywać aplikacje, korzystaj z aplikacji Samsung Gear w urządzeniu przenośnym."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "To jest główna struktura ekranu startowego."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Puste"
diff --git a/home/res/po/pt_BR.po b/home/res/po/pt_BR.po
new file mode 100755
index 0000000..8cec03d
--- /dev/null
+++ b/home/res/po/pt_BR.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplicativos"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Avançar"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Não repetir."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Excluir todos"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Impossível remover."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Toque e mantenha pressionada um widget para movê-lo."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Tela de início alterada."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Carregando..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Não é possível carregar os dados. Toque para tentar novamente."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Não é possível adicionar o aplicativo. Nenhum local na tela de início."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Não é possível adicionar o widget. Nenhum local na tela de início."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "O aplicativo já existe."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "O widget já existe."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cancelar"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Layout da tela de início alterado."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Este aplicativo será removido da tela de início. Ele não será excluído do dispositivo."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Remover aplicativo"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Remover widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Este widget será removido da tela de início. Ele não será excluído do dispositivo."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Modo de Ultra economia"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Não é possível adicionar o widget. Número máximo de widgets (%d) atingido."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Não é possível adicionar aplicativo. Número máximo de aplicativos (%d) atingido."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Não é possível adicionar a página."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Modo normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Modo de Economia desativado."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Modo de economia de energia ativado."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Aplic. rec."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Não é possível adicionar aplicativo. Número máximo de aplicativos (%s) atingido."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Não é possível adicionar o widget. Número máximo de widgets (%s) atingido."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Remover página"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Esta página e seu conteúdo serão removidos."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Remover"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Insira um cartão SIM para acessar serviços de rede."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Modo de bloqueio"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Ativado"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Desativado"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Item movido."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Tocar duas vezes para adicionar."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Adicionar widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Item adicionado."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Item removido."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Página %1$d de %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Não é possível reordenar os itens do painel de notificações."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "São %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "São %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "São %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d itens novos"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "O número máximo de widgets (%s) foi atingido. Excluir alguns widgets e tentar novamente."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Desliz. p/dir. p/voltar p/relógio."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Deslize p/esq. p/visualizar widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Deslize p/esq. p/voltar p/relógio."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Desliz. p/dir. p/exibir notificações."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Desinstalar %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Número máximo de widgets (%s) atingido."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Toque duas vezes para abrir a bandeja do aplicativo."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 novo item"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Tocar duas vezes para ativar."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Relógio"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "A temperatura do dispositivo está muito alta."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Baixar aplicativos do Gear usando o dispositivo móvel."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Durante o sono"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Obter mais aplicativos"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Ação não disponível quando a Economia de energia + estiver ativada."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s não está disponível enquanto o Leitor de tela estiver ativado."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Não perturbar"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Impos. ligar Dados móveis quando o Modo Offline estiver ativado. Desative-o e tente novamente."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Deslizar p/cima p/voltar ao relógio."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "É isso aí! Entre no Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Redes móveis"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Encam. cham. Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Iniciar"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Sair"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Bem-vindo! Toque no botão para aprender a usar seu Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Solicitado para desativar"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Solicitado para ativar"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Deslize a borda sup. p/baixo p/ver ícon. indic. relógio."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Deslize a borda inf. p/cima p/ver os aplic. no relógio."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Deslize a borda superior para baixo para retornar."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Para instalar ou desinstalar aplicativos, usar o aplicativo do Samsung Gear no seu dispositivo móvel."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Esta é a estrutura principal da tela de início."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Vazio"
diff --git a/home/res/po/pt_PT.po b/home/res/po/pt_PT.po
new file mode 100755
index 0000000..999d750
--- /dev/null
+++ b/home/res/po/pt_PT.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplicações"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Seguinte"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Não repetir"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Eliminar tudo"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Impossível remover."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Toque, sem soltar, um widget para o mover."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Ecrã principal alterado."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "A carregar..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Impossível carregar dados. Toque para tentar novamente."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Impossível adicionar aplicação. Já não há espaço no ecrã principal."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Impossível adicionar widget. Já não há espaço no ecrã principal."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplicação já existe."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget já existe."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Cancelar"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "A disposição do ecrã principal foi alterada."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Esta aplicação será removida do ecrã principal. Não será eliminada do dispositivo."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Remover aplicação"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Remover widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Este widget será removido do ecrã principal. Não será eliminada do dispositivo."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Modo ultra-econ. energia"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Impossível adicionar widget. Número máximo de widgets (%d) atingido."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Impossível adicionar aplicação. Número máximo de aplicações (%d) atingido."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Impossível adicionar página."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Modo normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Modo de economia de energia desactivado."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Modo de economia de energia activado."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Apps recentes"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Impossível adicionar aplicação. Número máximo de aplicações (%s) atingido."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Impossível adicionar widget. Número máximo de widgets (%s) atingido."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Remover página"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Esta página e o respectivo conteúdo serão removidos."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Remover"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Insira o cartão SIM para aceder aos serviços de rede."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Modo de Bloqueio"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Ligar"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Desligar"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Item movido."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Toque duas vezes para adicionar."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Adicionar widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Item adicionado."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Item removido."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Página %1$d de %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Não é possível reordenar os itens do painel de notificações."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "São %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "São %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "São %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d novos itens"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "O número máximo de widgets (%s) foi alcançado. Elimine alguns widgets e tente novamente."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Deslize dedo direita voltar relógio."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Deslize dedo p/ esq p/ ver widgets."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Deslize dedo p/ esq p/ voltar relógio."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Deslize dedo direita ver notificações."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Desinstalar %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Número máximo de widgets (%s) atingido."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Toque duas vezes para abrir o tabuleiro de aplicações."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 item novo"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Toque duas vezes para activar."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Relógio"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "A temperatura do dispositivo está demasiado alta."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Transferir aplicações do Gear utilizando o dispositivo móvel."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Ao dormir"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Obter mais aplicações"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Acção indisponível quando Economia de energia + está activado."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s não está disponível enquanto o Leitor de ecrã estiver activado."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Não incomodar"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Impossível ligar Dados móveis qd Modo de voo activo. Desactive Modo de voo e tente de novo."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Deslize para cima para voltar relógio."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Muito bem! Entre no Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Redes móveis"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Reenc. chmds Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Iniciar"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Sair"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Bem-vindo! Para aprender a usar o Gear, toque botão abaixo."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Feito pedido para desactivar"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Feito pedido para activar"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Deslize bordo sup. p/ ver ícones indicadores no relógio."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Para ver apps no relógio, deslize o bordo inferior."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Para voltar, deslize o bordo superior para baixo."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Para instalar ou desinstalar aplicações, utilize a aplicação Samsung Gear no seu dispositivo móvel."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Esta é a estrutura principal do ecrã principal."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Vazio"
diff --git a/home/res/po/ro.po b/home/res/po/ro.po
new file mode 100755
index 0000000..7b300eb
--- /dev/null
+++ b/home/res/po/ro.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplicaţii"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Înainte"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Fără repet."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Şterg. totală"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Imposibil de eliminat"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Ţineţi apăsat pe un widget pentru a-l muta."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Ecranul de pornire s-a modificat."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Încărcare..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Datele nu pot fi încărcate. Atingeţi pentru a reîncerca."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Aplicaţia nu poate fi adăugată. Ecranul de pornire este plin."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Widgetul nu poate fi adăugat. Ecranul de pornire este plin."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplicaţia există deja."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widgetul există deja."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Anulare"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Aspectul ecranului de pornire s-a schimbat."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Aplicaţia va fi eliminată din ecranul de pornire. Aceasta nu va fi ştearsă de pe dispozitiv."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Eliminare aplicaţie"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Eliminare widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Widgetul va fi eliminat din ecranul de pornire. Acesta nu va fi şters de pe dispozitiv."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Mod Econ. maximă energie"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Widgetul nu poate fi adăugat. A fost atins numărul maxim de widgeturi (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Aplicaţia nu poate fi adăugată. A fost atins numărul maxim de aplicaţii (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Pagina nu poate fi adăugată."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Mod normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Modul de economisire a energiei a fost dezactivat."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Modul de economisire a energiei a fost activat."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Apl. recente"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Aplicaţia nu poate fi adăugată. A fost atins numărul maxim de aplicaţii (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Widgetul nu poate fi adăugat. A fost atins numărul maxim de widgeturi (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Eliminare pagină"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Pagina şi conţinutul acesteia va fi şters."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Eliminare"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Introduceţi cartela SIM pentru a accesa serviciile de reţea."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Modul Blocare"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Pornit"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Oprit"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Elementul a fost mutat."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Atingeţi de două ori pentru a adăuga."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Adăugare widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Elementul a fost adăugat."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Elementul a fost eliminat."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Pagina %1$d din %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Nu se pot reordona elementele panoului de notificări."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Este %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Este ora %d:%d a.m."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Este ora %d:%d p.m."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d elemente noi"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "A fost atins numărul maxim de widgeturi (%s). Ştergeţi câteva widgeturi şi încercaţi din nou."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Glis. la dr. pt. a reveni la ceas."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Glis. la stânga pt. a vedea widgeturi."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Glis. la stânga pt. a reveni la ceas."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Glis. la stânga pt. a viz. notificări."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Dezinstalaţi %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "S-a atins numărul maxim de widgeturi (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Atingeţi de două ori pentru a deschide bara de aplicaţii."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 element nou"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Atingeţi de două ori pentru a activa."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Ceas"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Temperatura dispozitivului este prea ridicată."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Descărcaţi aplicaţii pentru Gear utilizând dispozitivul mobil."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Când dormiţi"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Obţineţi m. m. aplicaţii"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Acţiunea nu este disponibilă când este activat modul Economisire energie +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s nu este disponibilă când Cititorul de ecran este activat."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Nu deranjaţi"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Datele mob. nu se pot act. când este activ modul Avion. Dezact. modul Avion şi reîncercaţi."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Glisaţi în sus pt. a reveni la ceas."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Gata! Începeţi utilizarea Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Reţele mobile"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Red. apeluri Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Ieşire"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Bun venit! At. urm. buton pt. a afla cum să utilizaţi Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "S-a solicitat dezactivarea"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "S-a solicitat activarea"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Glis. în jos marg. de sus pt. viz. pe ceas a pictogr. de indicaţii."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Glisaţi în sus marginea de jos pt. a viz. ap. pe ceas."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Glisaţi în jos marginea de sus pentru a reveni."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Pentru a instala sau a dezinstala aplicaţii, utilizaţi aplicaţia Samsung Gear de pe dispozitivul mobil."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Aceasta este structura principală a ecranului Acasă."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Liber"
diff --git a/home/res/po/ru_RU.po b/home/res/po/ru_RU.po
new file mode 100755
index 0000000..4fb51c4
--- /dev/null
+++ b/home/res/po/ru_RU.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Приложения"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Далее"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Виджеты"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Не повторять."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Удалить все"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Невозможно удалить."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Для перемещения виджета нажмите и удерживайте его."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Главный экран изменен."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Загрузка..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Не удалось загрузить данные. Коснитесь для повтора"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Не удалось добавить приложение. Нет места на этом главном экране."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Не удалось добавить виджет. Нет места на этом главном экране."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Приложение уже существует."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Виджет уже существует."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Отмена"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Макет главного экрана изменен."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Это приложение будет удалено с главного экрана. Оно не будет удалено с устройства."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Удалить приложение"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Удалить виджет"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Этот виджет будет удален с главного экрана. Он не будет удален с устройства."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Режим макс. энергосбер."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Не удалось добавить виджет. Достигнуто максимальное количество виджетов (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Не удалось добавить приложение. Достигнуто максимальное количество приложений (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Невозможно добавить страницу."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Обычный режим"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Режим энергосбережения выключен."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Режим энергосбережения включен."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Посл. прил."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Не удалось добавить приложение. Достигнуто максимальное количество приложений (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Не удалось добавить виджет. Достигнуто максимальное количество виджетов (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Удалить страницу"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Эта страница будет удалена вместе со всем содержимым."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Удалить"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Вставьте SIM-карту для доступа к услугам сети."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Режим блокировки"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Включено"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Выключено"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Элемент перемещен."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Дважды нажмите, чтобы добавить."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Добавить виджет"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Элемент добавлен."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Элемент удален."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Страница %1$d из %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Невозможно изменить порядок элементов в области уведомлений."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Сейчас %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Сейчас %d:%d до полудня."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Сейчас %d:%d после полудня."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "Новых элементов: %d"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Достигнуто максимальное число виджетов (%s). Удалите несколько виджетов и повторите попытку."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Проведите вправо для возврата к часам."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Проведите влево для вывода виджетов."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Проведите влево для возврата к часам."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Проведите вправо для просмотра уведомлений."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Удалить %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Достигнуто максимальное количество виджетов (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Дважды нажмите, чтобы открыть область приложений."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 новый элемент"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Дважды нажмите, чтобы включить."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Часы"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Устройство слишком горячее."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Загрузить приложения Gear, используя мобильное устройство."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Во время сна"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Загрузить приложения"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Действие не доступно, если включен режим “Экон. энергии +”."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Если включено чтение с экрана, функция %s недоступна."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Не беспокоить"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Вкл. моб. данные при вкл. автономн. реж. невозм. Откл. автономн. реж. и повторите попытку."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Проведите вверх для возврата к часам."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Все готово! Можно пользоваться Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Мобильные сети"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Пер. выз. на Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Начало"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Выход"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Добро пожаловать! Нажмите кнопку для обучения работе с Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Отправлен запрос на выключение"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Отправлен запрос на включение"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Проведите сверху вниз для отображения панели состояния."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Проведите снизу вверх для перехода в список приложений."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ОК"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Проведите вниз от верхнего края, чтобы вернуться."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Для установки и удаления приложений воспользуйтесь приложением Samsung Gear на мобильном устройстве."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Здесь представлена основная структура главного экрана."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Пусто"
diff --git a/home/res/po/si.po b/home/res/po/si.po
new file mode 100755
index 0000000..47cb2d5
--- /dev/null
+++ b/home/res/po/si.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "යෙදුම්"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "ඊළඟ"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "වි‍ජෙට්ටුව"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "පුනරා.නය නොකර."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "සියල්ල මකන්න"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "ඉවත් කළ නොහැක."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "විජෙට්ටුව චලනය කිරීමට ඊට තට්ටු කර තබා ගන්න."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "මුල් පිටු තිරය වෙනස් කෙරිණි."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "ප්‍රෙව්ශනය කරමින්..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "දත්ත ප්‍රවේශනය කිරීමට නොහැකිය. යළි උත්සාහ කිරීමට තට්ටු කරන්න"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "යෙදුම එක් කිරීමට නොහැකි විය. මුල්පිටු තිරය මත තවත් ඉඩ නැත."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "විජෙට්ටුවක් එක් කළ නොහැක. මුල්පිටු තිරය මත තවත් ඉඩ නැත."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "යෙදුම දැනටමත් තිබේ."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "විජට්ටුව දැනටමත් පවතී."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "අවලංගු කරන්න"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "නිවාස පිටුවේ සැකැස්ම වෙනස් කෙරිණි."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "මෙම යෙදුම මුල්තිරයෙන් ඉවත්වනු ඇත. එය උපාංගයෙන් නොමැකෙනු ඇත."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "යෙදුම ඉවත් කරන්න"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "විජෙට්ටුව ඉවත් කරන්න"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "මෙම කෙටිමඟ මුල්තිරයෙන් ඉවත්වනු ඇත. එය උපාංගයෙන් නොමැකෙනු ඇත."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "අධි බල සුරැකුම් ප්‍රකාරය"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "විජෙට්ටුවක් එක් කළ නොහැක. උපරිම විජෙට්ටු ගණනට (%d) ළඟා විය."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "යෙදුම එක් කළ නොහැක. උපරිම යෙදුම් ගණනට (%d) ළඟා විය."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "පිටුව එක් කළ නොහැක."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "සාමාන්‍ය ප්‍රකාරය"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "බල සුරැකුම් ප්‍රකාරය අක්‍රියයි."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "බල සුරැකුම් ප්‍රකාරය සක්‍රියයි."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "මෑත යෙදුම්"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "යෙදුම එක් කළ නොහැක. උපරිම යෙදුම් ගණන (%s) ළඟා වී ඇත."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "විජට් එක් කළ නොහැක. උපරිම විජට් ගණන (%s) ළඟා වී ඇත."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "පිටුව ඉවත් කරන්න"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "මෙම පිටුව සහ එහි අන්තර්ගතය ඉවත් කෙරෙනු ඇත."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "ඉවත් කරන්න"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "ජාල සේවා වෙත ප්‍රවේශ වීමට SIM කාඩ්පත ඇතුල් කරන්න."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "අවහිර ප්‍රකාරය"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "සක්‍රියයි"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "අක්‍රියයි"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "අයිතමය ගෙන යන ලදී."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "එක් කිරීමට ද්වි තට්ටු කරන්න."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "විජෙට්ටුවක් එක් කරන්න"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "අයිතමය එක් කෙරිණි."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "අයිතමය ඉවත් කෙරිණි."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d න් %1$d වැනි පිටුව"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "දැනුම්දීම් පුවරු අයිතම යළි පිළිවෙළ කළ නොහැකිය."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "එය %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "%d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "%d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "නව අයිතම %d"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "උපරිම විජෙට්ටු ගණන (%s) වෙත ළඟා වී ඇත. විජෙට්ටු කිහිපයක් මකා නැවත උත්සාහ කරන්න."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ඔරලෝසුව වෙත ආපසු යා. දකුණට ස්වයිප් ක."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "විජෙට්ටු බැලීමට වමට ස්වයිප් කරන්න."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ඔරලෝසුව වෙත ආපසු යා. වමට ස්වයිප් ක."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "දැනුම්දීම් බැලීමට දකුණට ස්වයිප් කරන්න."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s අස්ථාපනය කරන්නද?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "උපරිම විජෙට්ටු ගණනට (%s) ළඟා විය."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "යෙදුම් තැටිය විවෘත කිරීමට ද්වි තට්ටු කරන්න."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "නව අයිතම 1"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "සක්‍රිය කිරීමට ද්වි තට්ටු කරන්න."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "ඔරලෝසුව"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "උපාංගයේ උෂ්ණත්වය ඉතා වැඩිය."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "ජංගම උපාංගය භාවිතයෙන් ගියර් යෙදුම් බාගන්න."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "නිදන විට දී"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "තවත් යෙදුම් ලබා ගන්න"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "බල සුරැකුම + සක්‍රිය අතරතුර ක්‍රියාව ලද නොහැකිය."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "තිර කියවනය සක්‍රිය අතරතුර %s ලද නොහැකිය."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "බාධා නොකරන්න"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "පියාසර ප්‍රකාරය සක්‍රිය අතරතුර ජංගම දත්ත ක්‍රියා.ක කළ නොහැක. පියාසර ප්‍රකාරය අක්‍රිය කර නැවත උත්සාහ ක."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ඔරලෝසුව වෙත ආපසු යාමට උඩු අතට ස්ව. ක."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "දැන් නිමයි! ගියරය භාවිතය අරඹන්න!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "ජංගම ජාල"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "ගියරය වෙත ඇමතුම් ඉදිරි. ක."
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "ආරම්භ කරන්න"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "ඉවත් වන්න"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "සාදරයෙන් පිළිග.! ඔබගේ ගියර් භාවිත ක. කෙසේදැයි හැදෑරීමට පහත බොත්තමට තට්ටු ක."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "අක්‍රිය කිරීමට ඉල්ලා සිටින ලදී"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "සක්‍රිය කිරීමට ඉල්ලා සිටින ලදී"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ඔරලෝසුව මත දර්ශක අයිකන බැලීමට ඉහළම මායිම පහළට ස්වයිප් ක."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ඔරලෝසුව මත යෙදුම් බැලීමට පහළ දාරය ඉහළට ස්වයිප් කරන්න."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "හරි"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "ආපසු යාමට පහළට ස්වයිප් කරන්න."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "යෙදුම් ස්ථාපනය හෝ අස්ථාපනය කිරීමට, ඔබගේ ජංගම උපාංගයේ සැම්සුං ගියර් යෙදුම භාවිතා කරන්න."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "මෙය මුල් තිරයේ ප්‍රධාන ව්‍යුහයයි."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "හිස්"
diff --git a/home/res/po/sk.po b/home/res/po/sk.po
new file mode 100755
index 0000000..9ea3bc2
--- /dev/null
+++ b/home/res/po/sk.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikácie"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Ďalej"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Neopakovať"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Odstr. všetky"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Nedá sa odstrániť."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Ťukn. na miniaplikáciu a podržaním ju premiestnite."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Domovská obrazovka sa zmenila."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Načítava sa..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Nemožno načítať údaje. Ťuknutím to môžete skúsiť znova."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Aplikáciu nemožno pridať. Na domovskej obrazovke už nie je voľné miesto."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Miniaplikáciu nemožno pridať. Na domovskej obrazovke už nie je voľné miesto."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikácia už existuje."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Miniaplikácia už existuje."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Zrušiť"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Rozloženie domovskej obrazovky sa zmenilo."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Táto aplikácia sa odstráni z domovskej obrazovky. Neodstráni sa zo zariadenia."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Odstrániť aplikáciu"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Odstrániť miniaplik."
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Táto miniaplikácia sa odstráni z domovskej obrazovky. Neodstráni sa zo zariadenia."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Režim extr. šetr. energie"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Miniaplikácia sa nedá pridať. Dosiahol sa maximálny počet miniaplikácií (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Aplikáciu nemožno pridať. Dosiahol sa maximálny počet aplikácií (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Stránku nemožno pridať."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normálny režim"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Režim šetrenia energie je vypnutý."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Režim šetrenia energie je zapnutý."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Posledné ap."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Aplikácia sa nedá pridať. Dosiahol sa maximálny počet aplikácií (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Miniaplikácia sa nedá pridať. Dosiahol sa maximálny počet miniaplikácií (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Odstrániť stránku"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Táto stránka spolu s jej obsahom sa odstráni."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Odstrániť"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Vložte SIM kartu na prístup k službám siete."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Režim blokovania"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Zap."
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Vyp."
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Položka bola premiestnená."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Dvojitým ťuknutím môžete vykonať pridanie."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Pridať widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Položka bola pridaná."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Položka bola odstránená."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Strana %1$d z %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Poradie položiek na paneli oznámení sa nedá zmeniť."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Je %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Je %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Je %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "Počet nových položiek: %d"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Dosiahol sa maxim. počet miniaplikácií (%s). Odstráňte niektoré miniaplikácie a skúste to znova."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Potiahnutím doprava zobrazíte hodiny."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Potiahnutím doľava zobrazíte widgety."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Potiahnutím doľava zobrazíte hodiny."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Potiahnite doprava pre Oznámenia."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Odinštalovať program %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Dosiahol sa maximálny počet miniaplikácií (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Dvojitým ťuknutím môžete otvoriť panel aplikácií."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nová položka"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Dvojitým ťuknutím môžete vykonať zapnutie."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Hodiny"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Teplota zariadenia je príliš vysoká."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Stiahnite si aplikácie pre zariadenie Gear použitím mobilného zariadenia."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Počas spánku"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Získať ďalšie aplikácie"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Akcia nie je k dispozícii, kým je zapnutá funkcia Šetrenie energie +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s nie je k dispozícii, kým je zapnutá funkcia Čítačka obrazovky."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Nerušiť"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Pri zap. letovom režime sa nedá zap. mobil. pripojenie. Vyp. letový režim a skúste znova."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Potiahnutím nahor sa vrátite na hodiny."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "A to je všetko! Začnite používať zariadenie Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobilné siete"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Presmerovať hovor"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Štart"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Koniec"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Vitajte! Ťuknite na tlačidlo nižšie pre info o ovládaní."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Požiadalo sa o vypnutie"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Požiadalo sa o zapnutie"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Potiahnutím nadol zobrazíte panel indikačných ikon."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Potiahnutím nahor zobrazíte aplikácie."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Potiahnutím od horného okraja nadol sa vrátite späť."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Ak chcete nainštalovať alebo odinštalovať aplikácie, použite aplikáciu Samsung Gear v mobilnom zariadení."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Toto je hlavná štruktúra domovskej obrazovky."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Prázdny"
diff --git a/home/res/po/sl.po b/home/res/po/sl.po
new file mode 100755
index 0000000..fe0176d
--- /dev/null
+++ b/home/res/po/sl.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikacije"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Naprej"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Pripomoček"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ne ponovi"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Izbriši vse"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Ni mogoče odstraniti."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Pritisnite in držite pripomoček, da ga premaknete."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Domači zaslon je spremenjen."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Nalaganje..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Podatkov ni mogoče naložiti. Pritisnite, da poskusite znova."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Aplikacije ni mogoče dodati. Na domačem zaslonu ni več prostora."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Pripomočka ni mogoče dodati. Na domačem zaslonu ni več prostora."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikacija že obstaja."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Pripomoček že obstaja."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Prekliči"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Postavitev domačega zaslona je spremenjena."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ta aplikacija bo odstranjena z domačega zaslona. Aplikacija ne bo izbrisana iz naprave."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Odstran. aplikacijo"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Odstran. pripomoček"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ta pripomoček bo odstranjen z domačega zaslona. Pripomoček ne bo izbrisan iz naprave."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Način izr. varč. z energ."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Pripomočka ni mogoče dodati. Doseženo je največje dovoljeno število pripomočkov (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Aplikacije ni mogoče dodati. Doseženo je največje dovoljeno število aplikacij (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Strani ni mogoče dodati."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Običajen način"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Način varčevanja z energijo je onemogočen."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Način varčevanja z energijo je omogočen."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Nedavne apl."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Aplikacije ni mogoče dodati. Doseženo je največje dovoljeno število aplikacij (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Pripomočka ni mogoče dodati. Doseženo je največje dovoljeno število pripomočkov (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Odstranitev strani"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Ta stran in njena vsebina bosta odstranjeni."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Odstrani"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Za dostop do omrežnih storitev vstavite kartico SIM."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Način blokiranja"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Vključeno"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Izključeno"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Element premaknjen."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Dvakrat pritisnite, da dodate."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Dodaj pripomoček"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Element je dodan."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Element je odstranjen."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Stran %1$d od %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Elementov na plošči z obvestili ni mogoče prerazporediti."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Ura je %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Ura je %d:%d dopoldne."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Ura je %d:%d popoldne."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d novih elementov"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Doseženo je največje dovoljeno št. pripomočkov (%s). Izbrišite nekaj pripomočkov in posk. znova."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Za vrnitev na uro podrsajte v desno."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Za prikaz pripomoč. podrsajte v levo."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Za vrnitev na uro podrsajte v levo."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Za prikaz obvestil podrsajte v desno."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Želite odstraniti %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Doseženo je največje dovoljeno število pripomočkov (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Dvakrat pritisnite, da odprete vrstico z aplikacijami."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nov element"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Dvakrat pritisnite, da omogočite."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Ura"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Temperatura naprave je previsoka."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Z mobilno napravo prenesite aplikacije za napravo Gear."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Med spanjem"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Prenesi več aplikacij"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Dejanje ni na voljo, ko je omogočena funkcija Varčevanje z energijo +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Funkcija %s ni na voljo, ko je omogočena funkcija Bralnik zaslona."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ne moti"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Pren. pod. prek mob. omr. ni mogoče vklopiti. Onemogočite način letenja in poskusite znova."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Za vrnitev na uro podrsajte navzgor."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "To je to! Začnite uporabljati napravo Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobilna omrežja"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Pos. klic. v Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Začetek"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Izhod"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Pozdravljeni! Za navodila o upor. ure Gear prit. spod. gumb."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Zahtevano, da onemogočite"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Zahtevano, da omogočite"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Za ogled ikon indik. na uri podrs. od zg. roba navzdol."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Za prikaz apl. na uri podrsajte od spodn. roba navzgor."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "V redu"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Za vrnitev podrsajte od zgornjega roba navzdol."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Če želite namestiti ali odstraniti aplikacije, uporabite aplikacijo Samsung Gear v mobilni napravi."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "To je glavna struktura domačega zaslona."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Prazno"
diff --git a/home/res/po/sq.po b/home/res/po/sq.po
new file mode 100755
index 0000000..51fb95a
--- /dev/null
+++ b/home/res/po/sq.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikacionet"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Tjetër"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Mini-aplikacion"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Mos përsër."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Hiq të gjitha"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Nuk mund të heqë."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Prek dhe mbaj miniaplikacionin për ta lëvizur."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Ekrani bazë u ndryshua."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Duke ngarkuar..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Nuk mund të ngarkoj të dhëna. Trokit për të riprovuar."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nuk mund të shtoj aplikacionin. Nuk ka më vend në ekranin bazë."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nuk mund të shtoj widget-in. Nuk ka më vend në ekranin bazë."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikacioni ekziston tashmë."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget-i ekziston tashmë."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Anullo"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Struktura e ekranit bazë u ndryshua."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ky aplikacion do të largohet nga ekrani bazë. Nuk do të hiqet nga pajisja."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Largo aplikacionin"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Largo widget-in"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ky widget do të largohet nga ekrani bazë. Nuk do të hiqet nga pajisja."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Regjimi Kurs. ener. ultra"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Nuk mund ta shtoj widget-in. Është arritur numri maksimal i widget-eve (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Nuk mund të shtoj aplikacion. U arrit numri maksimal (%d) i aplikacioneve."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Nuk mund të shtoj faqe."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Regjim normal"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Regjimi kursim energjie u paaftësua."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Regjimi kursim energjie u aftësua."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "App së fundi"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Nuk mund të shtoj aplikacion. U arrit numri maksimal (%s) i aplikacioneve."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Nuk mund ta shtoj widget-in. Është arritur numri maksimal i widget-eve (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Largo faqen"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Kjo faqe dhe materialet që përmban do të hiqen."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Largo"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Fut kartën SIM, për të përdorur shërbime rrjeti."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Regjimi bllokues"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Aktiv"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Fikur"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Artikulli u zhvendos."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Dy-trokit për të shtuar."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Shto mini-aplikacion"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Artikulli u shtua."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Artikulli u hoq."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Faqja %1$d nga %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Nuk mund t'i ri-rendit zërat në tabelën e njoftimeve."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Është %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Është ora %d:%d PD."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Është ora %d:%d MD."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d objekte të reja"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "U arrit numri maksimal i widget-eve (%s). Hiq ndonjë widget dhe provo sërish."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Rrëshqit djathtas për kthim tek ora."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Rrëshqit majtas për të parë widget-et."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Rrëshqit majtas për kthim tek ora."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Rrëshqit djathtas për njoftimet."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Të çinstaloj %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "U arrit numri maksimal i widget-eve (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Dy-trokit për ta hapur tabakanë e app-eve."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 artikull i ri"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Dy-trokit për të aftësuar."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Ora"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Temperatura e pajisjes është tepër e lartë."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Shkarko aplikacione për Gear me anë të pajisjes celulare."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Gjatë gjumit"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Merr app-e të tjera"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Ky veprim nuk mund të kryhet kur është aftësuar Kursim energjie +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s nuk mund të përdoret kur është aftësuar Lexuesi i ekranit."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Mos shqetësoni"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "S'i ndez dot Të dhënat celulare në regjimin Avion. Paaftësoje dhe provo sërish."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Rrëshqit lart për kthim tek ora."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Kaq! Tani fillo me Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Rrj. celulare"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Prc. th. në Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Fillo"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Dil"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Mirë se vjen! Mëso këtu si ta përdorësh Gear-in."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Kërkoi të paaftësohet"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Kërkoi të aftësohet"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Rrëshqit buzën poshtë për ikonat e treguesve tek ora."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Rrëshqit nga poshtë lart për t'i parë app-et tek ora."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Rrëshqit buzën e sipërme poshtë për t'u kthyer."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Për të instaluar ose çinstaluar aplikacione, përdor aplikacionin Samsung Gear në pajisjen tënde celulare."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Kjo është struktura kryesore e ekranit bazë."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Bosh"
diff --git a/home/res/po/sr.po b/home/res/po/sr.po
new file mode 100755
index 0000000..2750c11
--- /dev/null
+++ b/home/res/po/sr.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Aplikacije"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Naredno"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Ne ponavlj."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Izbriši sve"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Nemoguće ukloniti."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Kucni i zadrži widget radi njegovog premeštanja."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Početni ekran je promenjen."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Učitavanje..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Učitavanje podataka nije moguće. Kucni za ponovni pokušaj."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nije moguće dodati aplikaciju. Nema više mesta na početnom ekranu."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Nije moguće dodati widget. Nema više mesta na početnom ekranu."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Aplikacija već postoji."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget već postoji."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Otkaži"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Izgled početnog ekrana je promenjen."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ova aplikacija će biti uklonjena sa početnog ekrana. Ona neće biti izbrisana iz uređaja."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Ukloni aplikaciju"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Ukloni widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ovaj widget će biti uklonjen sa početnog ekrana. On neće biti izbrisan iz uređaja."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Režim izuzetne ušt. ener."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Nije moguće dodati widget. Dostignut je maksimalan broj widget-a (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Nije moguće dodati aplikaciju. Dostignut je maksimalan broj aplikacija (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Nije moguće dodati stranicu."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normalni režim"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Režim štednje energije je onemogućen."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Režim uštede energije je omogućen."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Nedavne apl."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Nije moguće dodati aplikaciju. Dostignut je maksimalan broj aplikacija (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Nije moguće dodati widget. Dostignut je maksimalan broj widget-a (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Ukloni stranicu"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Ova stranica i njen sadržaj će biti uklonjeni."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Ukloni"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Ubaci SIM karticu da bi mogao/la da koristiš mrežne usluge."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Režim blokiranja"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Uključeno"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Isključeno"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Stavka je premeštena."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Dvaput kucni za dodavanje."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Dodaj widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Stavka je dodata."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Stavka je uklonjena."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Strana %1$d od %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Nije moguće promeniti redosled stavki na tabli sa obaveštenjima."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Sada je %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Sad je %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Sad je %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d novih stavki"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Dostignut je maksimalan broj widget-a (%s). Izbriši neke widget-e i pokušaj ponovo."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Prevuci udesno za povratak na sat."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Prevuci ulevo za prikaz widget-a."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Prevuci ulevo za povratak na sat."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Prevuci udesno za prikaz obaveštenja."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Deinstalirati %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Dostignut je maksimalan broj widget-a (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Dvaput kucni radi otvaranja trake sa aplikacijama."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nova stavka"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Dvaput kucni za omogućavanje."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Sat"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Temperatura uređaja je previsoka."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Preuzmi Gear aplikacije koristeći mobilni uređaj."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Tokom spavanja"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Nabavi još aplikacija"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Radnja nije dostupna kada je omogućena opcija Ušteda energije+."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s nije dostupan/na kada je Čitač ekrana omogućen."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ne uznemiravaj"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Nije moguće uklj. mob. pod. kada je omogućen Avionski režim. Onemogući ga i pokušaj ponovo."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Prevuci nagore za povratak na sat."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Vreme je! Počni da koristiš Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobilne mreže"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Pr. poz. na Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Start"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Izađi"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Dobro došli! Kucni na donje dugme da saznaš više o Gear-u."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Zahtev da se onemogući"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Zahtev da se omogući"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Prevuci gornju ivicu nadole za ikone indikatora na satu."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Prevuci nagore od donje ivice za prikaz aplik. na satu."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Prevuci gornju ivicu nadole za povratak."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Da bi instalirao/la ili deinstalirao/la aplikacije, koristi aplikaciju Samsung Gear na mobilnom uređaju."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Ovo je glavna struktura početnog ekrana."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Prazno"
diff --git a/home/res/po/sv.po b/home/res/po/sv.po
new file mode 100755
index 0000000..59f5d58
--- /dev/null
+++ b/home/res/po/sv.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Program"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Nästa"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Uppr. inte."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Radera alla"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Det går inte att ta bort."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Tryck på och håll ned en widget för att flytta den."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Startsidan har ändrats."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Laddar..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Det går inte att läsa in data. Tryck om du vill försöka igen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Kan inte lägga till program. Det finns ingen mer plats på hemskärmen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Kan inte lägga till widget. Det finns ingen mer plats på hemskärmen."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Programmet finns redan."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widgeten finns redan."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Avbryt"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Layouten för hemskärmen har ändrats."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Detta program kommer att tas bort från hemskärmen. Det kommer inte att tas bort från enheten."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Ta bort program"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Ta bort widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Denna widget kommer att tas bort från hemskärmen. Den kommer inte att tas bort från enheten."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultraenergisparläge"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Det går inte att lägga till widget. Högsta antalet widgetar (%d) har uppnåtts."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Det går inte att lägga till program. Högsta antal tillåtna program (%d) har uppnåtts."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Det går inte att lägga till sida."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normalt läge"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Energisparläget har inaktiverats."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Energisparläge aktiverat."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Senaste prog"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Det går inte att lägga till program. Högsta antal tillåtna program (%s) har uppnåtts."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Det går inte att lägga till widget. Högsta antalet widgetar (%s) har uppnåtts."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Ta bort sida"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Den här sidan och dess innehåll kommer att tas bort."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Ta bort"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Sätt in SIM-kort för att få tillgång till nätverkstjänster."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blockerings-\nläge"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "På"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Av"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Objekt har flyttats."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Dubbeltryck för att lägga till."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Lägg till widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Objekt har lagts till."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Objekt har tagits bort."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Sida %1$d av %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Det går inte att ändra ordning på objekt i aviseringspanelen."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Klockan är %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Klockan är %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Klockan är %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d nya objekt"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Det högsta antalet sparade widgetar (%s) har nåtts. Ta bort några widgetar och försök igen."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Gå tillbaka t. klockan med högersvep."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Svep åt vänster för att visa widgetar."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Gå tillb. t. klockan med vänstersvep."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Svep åt höger f. att visa aviseringar."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Avinstallera %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Högsta tillåtna antalet widgetar (%s) har uppnåtts."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Dubbeltryck för att öppna programfacket."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 nytt objekt"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Dubbeltryck för aktivering."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Klocka"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Enhetstemperaturen är för hög."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Hämta program till Gear med hjälp av den mobila enheten."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Vid sömn"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Skaffa fler program"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Åtgärden är inte tillgänglig när Energiläge+ är aktiverat."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s är inte tillgängligt när Skärmläsare är aktiverat."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Stör ej"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Kan inte slå på mobildata när Flygläge är aktiverat. Inaktivera Flygläge och försök igen."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Svep uppåt f. a. gå tillb. t. klockan."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Det är allt! Kom in till Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobilnät"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "V.kop.samt t Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Starta"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Avsluta"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Välkommen! Tryck på knappen nedan och se hur Gear används."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Begäran om att inaktivera"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Begäran om att aktivera"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Svep överkan. nedåt så visas indikatorikoner på klockan."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Svep nederkanten uppåt så visas program på klockan."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Svep överkanten nedåt om du vill gå tillbaka."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Om du vill installera eller avinstallera program använder du programmet Samsung Gear på den mobila enheten."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Detta är huvudstrukturen på hemskärmen."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Tom"
diff --git a/home/res/po/ta.po b/home/res/po/ta.po
new file mode 100755
index 0000000..de898ef
--- /dev/null
+++ b/home/res/po/ta.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "ப.பாடுகள்"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "அடுத்து"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "விட்ஜெட்"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "மீ.காட்ட வேண்டாம்."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "எல்லாம் நீக்கு"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "அகற்ற முடியவில்லை."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "ஒரு விட்ஜெட்டை இதற்கு நகர்த்த டேப் செய்து வைத்திருக்கவும்."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "முகப்புத் திரை மாற்றப்பட்டது."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "லோடிங்..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "தரவை ஏற்ற இயலவில்லை. மீண்டும் முயலவென டேப் செய்க."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "பயன்பாட்டை சேர்க்க இயலவில்லை. முகப்புத் திரையில் இடமில்லை."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "விட்ஜெட்டைச் சேர்க்க இயலவில்லை. முகப்புத் திரையில் இடமில்லை."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "பயன்பாடு முன்பே உள்ளது."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "விட்ஜெட் முன்பே உள்ளது."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "ரத்து"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "முகப்புத் திரை தளவமைப்பு மாற்றப்பட்டது."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "இந்த பயன்பாடு முகப்புத் திரையிலிருந்து நீக்கப்படும். அது சாதனத்திலிருந்து நீக்கப்படாது."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "பயன்பாட்டை நீக்குக"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "விட்ஜெட்டை நீக்குக"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "இந்த விட்ஜெட் முகப்புத் திரையிலிருந்து நீக்கப்படும். அது சாதனத்திலிருந்து நீக்கப்படாது."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "அல்ட்ரா பவர் சேமிப்பு முறை"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "விட்ஜெட்டைச் சேர்க்க இயலவில்லை. விட்ஜெட்களின் அதிகபட்ச எண்ணிக்கையை (%d) அடைந்தது."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "பயன்பாட்டைச் சேர்க்க இயலவில்லை. பயன்பாடுகளின் அதிகபட்ச எண்ணிக்கையை (%d) அடைந்தது."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "பக்கத்தை சேர்க்க இயலவில்லை."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "இயல்பான முறை"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "பவர் சேமிப்பு முறை செயல்நீக்கப்பட்டது."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "பவர் சேமிப்பு முறை செயல்படுத்தப்பட்டது."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "சமீப. பயன்பாடுகள்"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "பயன்பாட்டைச் சேர்க்க இயலவில்லை. அதிகபட்ச பயன்பாடுகளின் எண்ணிக்கை (%s) எட்டப்பட்டது."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "விட்ஜெட்டைச் சேர்க்க இயலவில்லை. அதிகபட்ச விட்ஜெட்களின் எண்ணிக்கை (%s) எட்டப்பட்டது."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "பக்கத்தை அகற்றுக"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "இந்தப் பக்கமும் அதன் உள்ளடக்கமும் அகற்றப்படும்."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "நீக்குக"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "நெட்வர்க் சேவையை அணுக SIM அட்டையை நுழைக்கவும்."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "தடுப்பு முறை"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ஆன்"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "ஆஃப்"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "உருப்படி நகர்த்தப்பட்டது."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "சேர்க்க இருமுறை டேப் செய்யவும்."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "விட்ஜெட் சேர்."
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "உருப்படி சேர்க்கப்பட்டது."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "உருப்படி நீக்கப்பட்டது."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "பக்கம் %2$d என்பதில் %1$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "அறிவிப்பு பலகை உருப்படிகளை மறுஒழுங்குபடுத்த முடியாது."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "அது %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "இப்போது %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "இப்போது %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d புதிய உருப்படிகள்"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "விட்ஜெட்களின் அதிகபட்ச எண்ணிக்கையை (%s) அடைந்தது. சில விட்ஜெட்களை நீக்கி மீண்டும் முயலுக."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "கடிகாரத்திற்குச் செல்ல, வலதுபுறம் ஸ்வைப் செய்யவும்."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "விட்ஜெட்டுகளைக் காண, இடதுபுறம் ஸ்வைப் செய்யவும்."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "கடிகாரத்திற்குச் செல்ல, இடதுபுறம் ஸ்வைப் செய்யவும்."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "அறிவிப்புகளைக் காண வலதுபுறம் ஸ்வைப் செய்யவும்."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s நிறுவல் நீக்கவா?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "விட்ஜெட்களின் அதிகபட்ச எண்ணிக்கை (%s) அடைந்தது."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "பயன்பாட்டு ட்ரேவை திறக்கவென இருமுறை டேப் செய்க."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 புதிய உருப்படி"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "செயல்படுத்த இருமுறை டேப் செய்யவும்."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "கடிகாரம்"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "சாதன வெப்பநிலை மிகவும் அதிகமாகவுள்ளது."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "மொபைல் சாதனத்தை உபயோகித்து கியர் பயன்பாடுகளை பதிவிறக்கவும்."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "உறங்கும்போது"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "மேலும் ப.பாடுகள் பெறவும்"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "பவர் சேமிப்பு + செயல்படுத்தப்பட்டிருக்கும்போது செயல் கிடைக்காது."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "திரை ரீடர் செயல்படுத்தப்பட்டிருக்கும்போது %s கிடைக்காது."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "இடையூறு வேண்டாம்"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ஃப்ளைட் முறை செயல்படுத்தப்பட்டிருக்கும் போது மொபைல் தரவை ஆன் செய்ய இயலாது. ஃப்ளைட் முறையை செயல்நீக்கிவிட்டு மீண்டும் முயலுக."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "கடிகார. திரும்ப மேல்நோ. ஸ்வைப் செய்க."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "முடிந்தது! கியரில் நுழையவும்!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "மொபைல் நெட்வொர்க்குகள்"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "அழைப்புகளை கியருக்குப் பகிர்க"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "துவங்."
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "வெளியே"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "வரவேற்கிறோம்! கியரை ப.படுத்துவது எப்படி என அறிய பொத்தான் டேப் செய்க."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "செயல்நீக்குமாறு கோரப்பட்டுள்ளது"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "செயல்படுத்துமாறு கோரப்பட்டுள்ளது"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "கடிகாரத்தில் சுட்டிகாட்டிச் சின்னங்களைக் காண, மேல் முனையிலிருந்து கீழ்நோக்கி ஸ்வைப் செய்யவும்."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "கடிகாரத்தில் பயன்பாடுகளைக் காண, அடிப்பகுதியின் முனையிலிருந்து மேல்நோக்கி ஸ்வைப் செய்யவும்."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "சரி"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "திரும்பிச் செல்ல, மேல் முனையிலிருந்து கீழ்நோக்கி ஸ்வைப் செய்யவும்."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "பயன்பாடுகளை நிறுவ அல்லது நிறுவல்நீக்க, உங்கள் மொபைல் சாதனத்தில் சாம்சங் கியர் பயன்பாட்டைப் பயன்படுத்தவும்."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "இது முகப்புத் திரையின் முக்கிய கட்டமைப்பாகும்."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "காலி"
diff --git a/home/res/po/te.po b/home/res/po/te.po
new file mode 100755
index 0000000..fadf7f4
--- /dev/null
+++ b/home/res/po/te.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "ఆప్స్"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "తర్వాత"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "విడ్జెట్"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "పునరావృతం చేయవద్దు."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "అన్నింటినీ తొలగించు"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "తీసివేయడం సాధ్యం కాదు."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "దీన్ని తరలించేందుకు ఒక విడ్జెట్‌ను నొక్కి పట్టి ఉంచండి."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "హోమ్ స్క్రీన్ మారింది."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "లోడ్ అవుతోంది..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "డేటాను లోడ్ చేయడం సాధ్యం కాదు. మళ్లీ ప్రయత్నించడానికి ట్యాప్ చేయండి."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "అప్లికేషన్‌ని జోడించడం సాధ్యం కాదు. హోమ్ స్క్రీన్‌లో గది లేదు."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "విడ్జెట్‌ను జోడించడం సాధ్యం కాదు. హోమ్ స్క్రీన్‌లో గది లేదు."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "అప్లికేషన్ ఇప్పటికే ఉంది."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "విడ్జెట్ ఇప్పటికే ఉంది."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "రద్దు"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "హోమ్ స్క్రీన్ లేఅవుట్ మార్చబడింది."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ఈ అప్లికేషన్ హోమ్ స్క్రీన్ నుండి తీసివేయబడుతుంది. ఇది పరికరం నుండి తొలగించబడదు."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "అప్లికేషన్‌ని తీసివేయి"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "విడ్జెట్‌ని తీసివేయి"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "ఈ విడ్జెట్ హోమ్ స్క్రీన్ నుండి తీసివేయబడుతుంది. ఇది పరికరం నుండి తొలగించబడదు."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "అసాధారణ శక్తి ఆదా మోడ్"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "విడ్జెట్‌ను జోడించడం సాధ్యం కాదు. విడ్జెట్‌ల గరిష్ట సంఖ్యను (%d) చేరుకున్నారు."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "అప్లికేషన్‌ని జోడించడం సాధ్యం కాదు. అప్లికేషన్‌ల గరిష్ట సంఖ్యను (%d) చేరుకున్నారు."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "పేజీని జోడించడం సాధ్యం కాదు."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "సాధారణ మోడ్"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "శక్తి ఆదా మోడ్ నిలిపివేయబడింది."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "శక్తి ఆదా మోడ్ ప్రారంభించబడింది."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "ఇటీవలి అప్లికేషన్‌లు"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "అప్లికేషన్‌ని జోడించడం సాధ్యం కాదు. అప్లికేషన్‌ల గరిష్ట సంఖ్యను (%s) చేరుకున్నారు."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "విడ్జెట్‌ను జోడించడం సాధ్యం కాదు. విడ్జెట్‌ల గరిష్ట సంఖ్యను (%s) చేరుకున్నారు."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "పేజీని తీసివేయి"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "ఈ పేజీ మరియు దీని కంటెంట్ తీసివేయబడుతుంది."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "తీసివేయి"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "నెట్వర్క్ సేవలను ప్రాప్తి చేసేందుకు SIM కార్డును చొప్పించండి."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "నిరోధిత మోడ్"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "ఆన్"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "ఆఫ్"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "ఐటెమ్ తరలించబడింది."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "జోడించడానికి రెండుసార్లు నొక్కండి."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "విడ్జెట్‌ను జోడించండి"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "ఐటెమ్ జోడించబడింది."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "ఐటెమ్ తరలించబడింది."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "%2$d లో %1$d పేజీ"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "నోటిఫికేషన్ బోర్డ్ అంశాల క్రమాన్ని మార్చలేరు."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "ఇది %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "ఇప్పుడు %d:%d AM."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "ఇప్పుడు %d:%d PM."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d కొత్త ఐటెమ్‌లు"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "విడ్జెట్‌ల గరిష్ట సంఖ్యను (%s) చేరుకున్నారు. కొన్ని విడ్జెట్‌లను తొలగించి, మళ్లీ ప్రయత్నించండి."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "గడియారానికి తిరిగి వెళ్లడానికి కుడివైపుకి స్వైప్ చేయండి."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "విడ్జెట్‌లను వీక్షించడానికి ఎడమవైపుకి స్వైప్ చేయండి."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "గడియారానికి తిరిగి వెళ్లడానికి ఎడమవైపుకి స్వైప్ చేయండి."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "నోటిఫికేషన్‌లను వీక్షించడానికి కుడివైపుకి స్వైప్ చేయండి."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s వ్యవస్థాపనను తొలగించబడాలా?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "విడ్జెట్‌ల గరిష్ట సంఖ్యను (%s) చేరుకున్నారు."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "అప్లికేషన్ ట్రేని తెరవడానికి డబుల్ ట్యాప్ చేయండి."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 కొత్త ఐటెమ్"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "ప్రారంభించడానికి రెండుసార్లు ట్యాప్ చేయండి."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "గడియారం"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "పరికర ఉష్ణోగ్రత చాలా ఎక్కువగా ఉంది."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "మొబైల్ పరికరాన్ని ఉపయోగించి గేర్ అప్లికేషన్‌లను డౌన్‌లోడ్ చేయండి."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "నిద్రపోతున్నప్పుడు"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "మరిన్ని అప్లికేషన్‌లను పొందండి"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "శక్తి ఆదా + ప్రారంభించబడినప్పుడు చర్య అందుబాటులో ఉండదు."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "స్క్రీన్ రీడర్ ప్రారంభించబడినప్పుడు %s అందుబాటులో ఉండదు."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "అంతరాయం కలిగించవద్దు"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "వైమానిక మోడ్ ప్రారంభించబడినప్పుడు మొబైల్ డేటాని ఆన్ చేయడం సాధ్యం కాదు. వైమానిక మోడ్‌ను నిలిపివేసి, మళ్లీ ప్రయత్నించండి."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "గడియారానికి తిరిగి వెళ్లడానికి ఎగువకు స్వైప్ చేయండి."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "అంతే! గేర్‌లో ప్రవేశించండి!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "మొబైల్ నెట్‌వర్క్‌లు"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "గేర్‌కు కాల్‌లను ఫార్వార్డ్ చేయి"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "మొదలు"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "నిష్క్రమణ"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "స్వాగతం! మీ గేర్‌ను ఎలా ఉపయోగించాలో తెలుసుకోవడానికి దిగువ బటన్‌ను ట్యాప్ చేయండి."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "నిలిపివేయడానికి అభ్యర్థించబడింది"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "ప్రారంభించడానికి అభ్యర్థించబడింది"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "గడియారంలో సూచిక చిహ్నాలను చూడటానికి ఎగువ అంచును దిగువకు స్వైప్ చేయండి."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "గడియారంలో అప్లికేషన్‌లను వీక్షించడానికి దిగువ అంచును ఎగువకు స్వైప్ చేయండి."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "సరే"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "వెనుకకు వెళ్లడానికి ఎగువ అంచును దిగువకు స్వైప్ చేయండి."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "అప్లికేషన్‌లను ఇన్‌స్టాల్ లేదా అన్ఇన్‌స్టాల్ చేయడానికి, మీ మొబైల్ పరికరంలో Samsung Gear అప్లికేషన్‌ను ఉపయోగించండి."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "ఇది హోమ్ స్క్రీన్ యొక్క ప్రధాన నిర్మాణం."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ఖాళీ"
diff --git a/home/res/po/tg_TJ.po b/home/res/po/tg_TJ.po
new file mode 100755
index 0000000..6568ebf
--- /dev/null
+++ b/home/res/po/tg_TJ.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Барномаҳо"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Навбатӣ"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Виҷет"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Такрор нак."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Несткунии ҳама"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Хориҷ карда наметавонад."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Барои ҷумбондани видҷети дилхоҳ, онро зарба зада нигоҳ доред."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Экрани асосӣ тағйир ёфт."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Боркунӣ..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Unable to load data. Tap to retry."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Илова кардани барнома ғайриимкон аст. Дар экрани асосӣ ҷои холӣ намондааст."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Илова кардани видҷеӣ ғайриимкон аст. Дар экрани асосӣ ҷои холӣ намондааст."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Барнома аллакай вуҷуд дорад."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Видҷет аллакай вуҷуд дорад."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Бекор кардан"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Тарҳбандии экрани асосӣ тағйир ёфт."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ин барнома аз экрани асосии шумо нест карда мешавад. Он аз дастгоҳ нест карда намешавад."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Нест кардани барнома"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Нест кардани видҷет"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ин видҷет аз экрани асосии шумо нест карда мешавад. Он аз дастгоҳ нест карда намешавад."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Реҷаи сарфаи мукаммали қувва"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Илова кардани видҷет ғайриимкон аст. Шумораи зиёдтарини видҷетҳо (%d) истифода шуд."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Илова кардани барнома ғайриимкон аст. Шумораи зиёдтарини барномаҳо (%d) афзуда шуд."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Илова кардани саҳифа ғайриимкон аст."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Реҷаи одатӣ"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Реҷаи сарфаи қувва ғайрифаъол карда шуд."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Реҷаи сарфаи қувва фаъол карда шуд."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Барномаҳои охирин"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Илова кардани барнома ғайриимкон аст. Шумораи зиёдтарини барномаҳои иҷозатшуда (%s) илова карда шудаанд."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Илова кардани видҷет ғайриимкон аст. Шумораи зиёдтарини видҷетҳо (%s) истифода шуд."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Нест кардани саҳифа"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Ин саҳифа ва таркиби он нест карда мешавад."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Нест кардан"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Барои дастрас кардани хизматрасониҳои шабака SIM-кортро гузоред."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Реҷаи блоконӣ"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Фаъол"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Ғайрифаъол"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Чиз кӯчонида шуд."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Барои илова кардан, ду маротиба зарба занед."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Илова кардани видҷет"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Чиз илова карда шуд."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Чиз нест карда шуд."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Page %1$d of %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Ҷузъҳои лавҳаи огоҳиро аз нав мураттаб карда наметавонад."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Соат %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Соат %d:%d пеш аз нисфирӯзӣ"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Соат %d:%d баъд аз нисфирӯзӣ"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d ҷузъҳои нав"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Шумораи зиёдтарини видҷетҳо (%s) истифода шуд. Якчанд видҷетро нест карда, кӯшишро такрор кунед."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Барои бозгаштан ба соат ба рост молед."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Барои дидани видҷетҳо ба чап молед."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Барои бозгаштан ба соат ба чап молед."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Барои дидани огоҳиҳо ба рост молед."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Насби %s-ро қатъ мекунед?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Ба шумораи максималии видҷетҳо (%s) расидед."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Барои кушодани лавҳаи барномаҳо ду бор зарба занед."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 объекти нав"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Барои фаъол кардан ду бор зарба занед."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Соат"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Ҳарорати дастгоҳ хеле баланд аст."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Бо истифодаи дастгоҳи мобилӣ барномаҳои Gear-ро боргирӣ кунед."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Ҳангоми хоб"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Барномаҳои бештар"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Амал дастнорас аст, вақте ки сарфаи барқи + фаъол аст."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s ҳангоми фаъол будани Хонандаи экран дастнорас мешавад."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Ташвиш надиҳед"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Вақти фаъ. б реҷаи Парвоз Ит-ти моб-ро ист. б. намет. Реҷаи Парвозро ғайриф, аз нав кӯш. к."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Барои бозгаштан ба соат ба боло молед."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Тамом! Gear пурра аз шумост!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Шабакаҳои мобилӣ"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Бозф. знг ба Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Оғоз"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Хуруҷ"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Марҳабо! Барои тафсилоти Gear, тугмаи зеринро зарба занед."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Барои ғайрифаъолсозӣ дархост шуд"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Барои фаъолсозӣ дархост шуд"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Барои д-ни ни-ҳо дар соат, канори болоиро ба поён молед."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Барои д-ни брнмҳо дар соат, канор поёниро ба боло молед."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Барои ба қафо рафтан, канори болоиро ба поён молед."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Барои насб кардан ё қатъ кардани насби барномаҳо, барномаи Samsung Gear-ро дар дастгоҳи мобилии худ истифода баред."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Ин сохтори асосии экрани асосӣ аст."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Холӣ"
diff --git a/home/res/po/th.po b/home/res/po/th.po
new file mode 100755
index 0000000..96f926a
--- /dev/null
+++ b/home/res/po/th.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "แอพ"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "ถัด​ไป"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "อย่าแสดงซ้ำ"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "ลบทั้งหมด"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "ลบ​ไม่​ได้"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "สัมผัส​ Widget ​ค้าง​ไว้​เพื่อ​เลื่อน"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "เปลี่ยนหน้าจอหลักแล้ว"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "โหลด..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ไม่สามารถโหลดข้อมูลได้ สัมผัสเพื่อลองอีกครั้ง"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ไม่สามารถเพิ่มแอพพลิเคชั่นได้ ไม่มีที่ว่างเพิ่มในหน้าจอหลัก"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ไม่สามารถเพิ่มวิดเจ็ท ไม่มีที่ว่างเพิ่มในหน้าจอหลัก"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "มีแอพพลิเคชั่นอยู่แล้ว"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "มีวิดเจ็ทอยู่แล้ว"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "ยกเลิก"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "เปลี่ยนรูปแบบหน้าจอหลักแล้ว"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "แอพพลิเคชั่นนี้ จะถูกลบออกจากหน้าจอหลัก แต่จะไม่ถูกลบออกจากอุปกรณ์"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "ลบแอพพลิเคชั่นออก"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ลบวิดเจ็ท"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "วิดเจ็ทนี้จะถูกลบออกจากหน้าจอหลัก แต่จะไม่ถูกลบออกจากอุปกรณ์"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "โหมดประหยัดพลังงานสูงสุด"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ไม่สามารถเพิ่ม Widget ถึงจำนวนวิดเจ็ทสูงสุด (%d) แล้ว"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "ไม่สามารถเพิ่มแอพพลิเคชั่นได้ ถึงจำนวนแอพพลิเคชั่นสูงสุด (%d) แล้ว"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "ไม่สามารถเพิ่มหน้าได้"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "โหมด​ปกติ"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "ปิดใช้งานโหมดประหยัดพลังงานแล้ว"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "เปิดใช้งานโหมดประหยัดพลังงานแล้ว"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "แอพล่าสุด"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "ไม่สามารถเพิ่มแอพพลิเคชั่นได้ ถึงจำนวนสูงสุดของแอพพลิเคชั่น (%s) แล้ว"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ไม่สามารถเพิ่มวิดเจ็ท ถึงจำนวนสูงสุดของวิดเจ็ท (%s) แล้ว"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "ลบหน้า"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "หน้านี้และคอนเทนท์ในหน้าจะถูกลบ"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "ลบ"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "ใส่ SIM การ์ด เพื่อใช้งาน\nเครือข่าย"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "โหมดการห้าม"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "เปิด"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "ปิด"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "ย้ายรายการแล้ว"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "สัมผัสสองครั้ง เพื่อเพิ่ม"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "เพิ่ม Widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "เพิ่มรายการแล้ว"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "ย้ายรายการแล้ว"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "หน้า %1$d จาก %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "ไม่สามารถเรียงลำดับรายการบนกระดานการแจ้งเตือนใหม่"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "ขณะนี้เวลา %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "เวลา %d:%d ​AM"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "เวลา %d:%d ​PM"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d ​รายการ​ใหม่"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "ถึงจำนวนสูงสุด ของวิดเจ็ท (%s) แล้ว ลบบางวิดเจ็ท และลองอีกครั้ง"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ปัดขวาเพื่อกลับไปที่นาฬิกา"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ปัดซ้ายเพื่อดูวิดเจ็ท"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "ปัดซ้ายเพื่อกลับไปที่นาฬิกา"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "ปัดขวาเพื่อดูการแจ้งเตือน"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "ถอนการติดตั้ง %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ถึงจำนวนวิดเจ็ทสูงสุด (%s) แล้ว"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "สัมผัสสองครั้งเพื่อเปิดถาดแอพ"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 รายการใหม่"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "สัมผัสสองครั้งเพื่อเปิดใช้งาน"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "นาฬิกา"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "อุณหภูมิอุปกรณ์สูงเกินไป"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "ดาวน์โหลดแอพพลิเคชั่น Gear โดยใช้อุปกรณ์มือถือ"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "ขณะนอนหลับ"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "โหลดแอพพลิเคชั่นเพิ่ม"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "การทำงานไม่พร้อมใช้งาน ขณะเปิดใช้งาน การประหยัดพลังงาน + อยู่"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s ไม่พร้อมใช้งาน ขณะเปิดใช้งาน ตัวอ่านหน้าจอ อยู่"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "ห้ามรบกวน"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "ไม่สามารถเปิดใช้ข้อมูลมือถือได้ ในขณะที่เปิดโหมดการบินอยู่ ปิดใช้งานโหมดการบิน แล้วลองอีกครั้ง"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "ปัดขึ้นด้านบน เพื่อกลับไปยังนาฬิกา"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "นั่นล่ะ! สนุกไปกับ Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "เครือ​ข่าย​มือ​ถือ"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "โอนสายไปยัง Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "เริ่ม"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "ปิด"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "ยินดีต้อนรับ! สัมผัสปุ่มด้านล่าง เพื่อเรียนรู้วิธีใช้งาน Gear"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "ร้องขอให้ปิดการใช้งาน"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "ร้องขอให้เปิดการใช้งาน"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "ปัดขอบบนลงเพื่อดูไอคอนตัวบ่งชี้บนนาฬิกา"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "ปัดขอบล่างขึ้นเพื่อดูแอพบนนาฬิกา"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ตกลง"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "ปัดขอบบนลงเพื่อย้อนกลับ"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "ใช้แอพพลิเคชั่น Samsung Gear บนอุปกรณ์มือถือของคุณ เพื่อติดตั้ง หรือถอนการติดตั้งแอพพลิเคชั่น"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "นี่คือโครงสร้างหลักของหน้าจอหลัก"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "ว่าง"
diff --git a/home/res/po/tk_TM.po b/home/res/po/tk_TM.po
new file mode 100755
index 0000000..a9e57b2
--- /dev/null
+++ b/home/res/po/tk_TM.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Goll"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Indiki"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widjet"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Gaýtalamaň."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Baryny pozuň"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Aýryp bolmaýar."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Widjedi süýşürmek üçin ona basyp sakla."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Öý ekrany üýtgedi."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Ýükleýär..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Unable to load data. Tap to retry."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Amaly programmany goşup bolanok. Baş ekranda başga ýer ýok."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Kömekçi programmany goşup bolanok. Baş ekranda başga ýer ýok."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Amaly programma öňden bar."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Kömekçi programma öňden bar."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Ýatyr"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Baş ekran ýerleşişi üýtgedi."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Bu amaly programma baş ekrandan aýrylar. Ol enjamdan pozulmaz."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Programmany aýyr"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Kömekçi prog. aýyr"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Bu kömekçi programma baş ekrandan aýrylar. Ol enjamdan pozulmaz."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ýokary derejede güýç tygşytlama tertibi"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Widjet goşmak başardanok. Widjetleriň aňrybaş sanyna ýetildi (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Gollanmany açyp bolanok. Golanmalar maksimum sanyna (%d) ýetdi."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Sahypany goşup bolanok."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Adaty režim"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Güýç tygşytlama tertibi işlemeýän edildi."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Güýç tygşytlaýyş režimi işjeňleşdirildi."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Soňky goşundylar"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Gollanmany açyp bolanok. Gollanmalaryň iň köp sanyna (%s) ýetildi."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Widjet goşup bolanok. Widjetleriň iň ýokary sanyna (%s) ýetildi."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Sahypany aýyryň"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Bu sahypa we onuň içindäkiler aýrylar."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Aýyr"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Hyzmatlar toruna girmek üçin SIM karta dakyň"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blokirleme tertibi"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Açyk"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Öçük"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Madda geçirildi."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Goşmak üçin barmagyňyzy iki gezek degriň."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Widjet goşuň"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Madda goşuldy."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Madda aýyryldy."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Page %1$d of %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Habarnama tagtasyndaky elementleri saýhallap bolmaýar."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Bu %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Bu %d:%d günortana çenli"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Bu %d:%d günortandan soň"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d täze zat"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Wijetleriň maksimum sanyna (%s) ýetildi. Käbir wijetleri pozuň we gaýtadan synanyşyň."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Yza sagada gitmek üçin saga syryň."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Widžetleri görmek üçin çepe syryň."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Yza sagada gitmek üçin çepe syryň."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Widžetleri görmek üçin saga syryň."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s aýyrmalymy?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Maksimum wijet sanyna (%s) ýetildi."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Goýma tekjesini açmak üçin iki gezek basyň."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 täze madda"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Işletmek üçin iki gezek basyň."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Sagat"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Enjamyň gyzgynlygy aşa ýokary."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Mobil enjamy ulanmak bilen Gear goýmalaryny göçürip alyň."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Ukudaka"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Goşmaça goýma alyň"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Güýç tygşytlaýjy + işledilen mahaly hereket elýeterli däl."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Ekran okaýjy açykka %s elýeterli däl."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Bimaza etmäň"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Uçuş tertibinde, mobil maglumaty açyp bolmaýar. Uçuş tertibini ýapyp, täzeden synanyşyň."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Sagada dolanmak üçin, ýokaryk syryň."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Ine boldy! Gear-y ulanmaga başlaň!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobil ulgamlar"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Jaňl Gear-e gönk."
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Başla"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Çyk"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Hoş geldiňiz! Gear-i ulanmagy öwrenmek üçin, şu düwmä basyň."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Ýapmak soraldy"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Işletmek soraldy"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Sagatda görkeziji görm. üçin, ýokarky gyrany aşak syryň."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Sagatda goýmalary görm. üçin aşaky gyrany ýokaryk syryň."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Dolanmak üçin ýokarky gyrany aşaklygyna syryň."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Goýmalary gurnamak ýa-da gurnawdan aýyrmak üçin, mobil enjamyňyzda Samsung Gear goýmasyny ulanyň."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Bu öý ekranyň esasy gurluşy."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Boş"
diff --git a/home/res/po/tl.po b/home/res/po/tl.po
new file mode 100755
index 0000000..bb1d81d
--- /dev/null
+++ b/home/res/po/tl.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Apps"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Susunod"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Wag ulitin"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Delete lahat"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Hindi maalis."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Tap and hold a widget to move it."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Pinalitan ang home screen."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Naglo-load..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Hindi ma-load ang data. I-tap upang subukang muli."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Hindi maidagdag ang application. Wala nang espasyo sa home screen."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Hindi maidagdag ang widget. Wala nang espasyo sa home screen."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Umiiral na ang application."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Umiiral na ang widget."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Kanselahin"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Binago ang layout ng home screen."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Aalisin ang application na ito sa home screen. Hindi ito ide-delete sa device."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Alisin application"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Alisin ang widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Aalisin ang widget na ito sa home screen. Hindi ito ide-delete sa device."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra power saving mode"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Hindi makapagdagdag ng widget. Naabot na ang maximum na bilang ng mga widget (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Hindi makapagdagdag ng application. Naabot na ang maximum na bilang ng mga application (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Hindi maidagdag ang pahina."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normal mode"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Hindi pinagana ang Power saving mode."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Pinagana ang Power saving mode."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Recent apps"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Hindi makapagdagdag ng application. Naabot na ang maximum na bilang ng mga application (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Hindi makapagdagdag ng widget. Naabot na ang maximum na bilang ng mga widget (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Alisin ang pahina"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Aalisin ang pahinang ito at ang content nito."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Alisin"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Magpasok ng SIM card upang ma-access ang mga serbisyo sa network."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Blocking mode"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Naka-on"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Naka-off"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Inilipat ang item."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "I-tap nang dalawang beses upang magdagdag."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Magdagdag ng widget."
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Naidagdag na ang item."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Inalis na ang item."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Pahina %1$d ng %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Hindi maisaayos ang mga item sa notification board."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Ito ay %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Alas-%d:%d AM na."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Alas-%d:%d PM na."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d (na) bagong item"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Naabot na ang maximum na bilang ng mga widget (%s). Magtanggal ng ilang widget at subukang muli."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Mag-swipe pakanan bumalik sa orasan."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Mag-swipe pakaliwa tumingin ng widget."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Mag-swipe pakaliwa bumalik sa orasan."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Mag-swipe pakanan tingin notification."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "I-uninstall ang %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Naabot na ang maximum na bilang ng widget (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "I-tap nang dalawang beses para buksan ang app tray."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 bagong item"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "I-tap nang dalawang beses upang paganahin."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Orasan"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Masyadong mainit ang device."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Mag-download ng mga Gear application gamit ang mobile device."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Habang natutulog"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Kumuha pa ng mga application"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Hindi available ang aksyon habang pinapagana ang Power saving +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s ay hindi available habang pinagana ang screen reader."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Huwag istorbohin"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Hindi ma-on ang Mobile data habang pinagana ang Flight mode. Huwag paganahin ang Flight mode at subukang muli."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "I-swipe paitaas para bumalik sa orasan."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Yan iyon! Pumunta sa Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobile network"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "I-fwd ang mga tawag sa Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Simulan"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Lumabas"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Welcome! I-tap ang button sa ibaba upang malaman kung paano gamitin ang iyong Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Hiniling na huwag paganahin"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Hiniling na paganahin"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "I-swipe pababa ang itaas para makita ang mga icon na tagapaghiwatig sa orasan."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "I-swipe pataas ang ilalim na gilid para tingnan ang mga app sa orasan."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "I-swipe pababa ang itaas na gilid para bumalik."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Para mag-install o mag-uninstall ng mga application, gamitin ang application na Samsung Gear sa iyong mobile device."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Ito ang pangunahing istraktura ng home screen."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Walang laman"
diff --git a/home/res/po/tr_TR.po b/home/res/po/tr_TR.po
new file mode 100755
index 0000000..942c1e4
--- /dev/null
+++ b/home/res/po/tr_TR.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Uygulamalar"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "İleri"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Tekrarlama"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Tümünü sil"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Kaldırılamıyor."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Bir widget'ı taşımak için dokunun ve bırakmayın."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Ana ekran değişti."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Yükleniyor..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Veri yüklenemiyor. Tekrar denemek için dokunun."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Uygulama eklenemiyor. Ana sayfa ekranında yer yok."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Widget eklenemiyor. Ana sayfa ekranında yer yok."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Uygulama zaten mevcut."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget zaten mevcut."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "İptal"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Ana ekran düzeni değiştirildi."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Bu uygulama ana ekrandan kaldırılacak. Uygulama cihazdan silinmeyecektir."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Uygulamayı kaldır"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Widget'ı kaldır"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Bu widget ana ekrandan kaldırılacak. Widget cihazdan silinmeyecektir."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra güç tasarrufu modu"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Widget eklenemiyor. Maksimum widget sayısına (%d) ulaşıldı."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Uygulama eklenemiyor. Maksimum uygulama sayısına (%d) ulaşıldı."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Sayfa eklenemiyor."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normal mod"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Güç tasarrufu modu devre dışı."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Güç tasarrufu modu etkin."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Son uygulmlr"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Uygulama eklenemiyor. Maksimum uygulama sayısına (%s) ulaşıldı."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Widget eklenemiyor. Maksimum widget sayısına (%s) ulaşıldı."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Sayfayı kaldır"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Bu sayfa ve içeriği kaldırılacak."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Kaldır"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Şebeke servislerine erişmek için SIM kartını takın."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Engelleme modu"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Açık"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Kapalı"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Öğe taşındı."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Eklemek için çift dokunun."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Widget ekle"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Öğe eklendi."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Öğe kaldırıldı."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Sayfa %1$d / %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Bildirim panosu öğeleri yeniden sıralanamaz."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Saat %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Saat öğleden önce %d:%d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Saat öğleden sonra %d:%d."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d yeni öğe"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Maksimum widget sayısına (%s) ulaşıldı. Bazı widget'ları silip tekrar deneyin."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Saate dönmek için sağa kaydırın."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Widget'ları görmek için sola kaydırın."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Saate dönmek için sola kaydırın."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Bildirimleri görmek için sağa kaydırn."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s kaldırılsın mı?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Maksimum widget sayısına (%s) ulaşıldı."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Uygulama tepsisini açmak için çift dokunun."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 yeni öğe"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Etkinleştirmek için çift dokunun."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Saat"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Cihaz sıcaklığı çok yüksek"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Mobil cihazı kullanarak Gear uygulamalarını indirin."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Uyurken"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Daha fazla uygulama al"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Güç tasarrufu + etkinken eylem kullanılamaz."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s Ekran okuyucu etkinken kullanılamaz."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Rahatsız etmeyin"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Uçuş modu etkinken Mobil verisi açılamaz. Uçuş modunu devre dışı bırakıp tekrar deneyin."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Saate dönmek için yukarı kaydırın."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "İşte bu! Kendinizi Gear'a kaptırın!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobil ağlar"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Ara. Gear'a ynldr"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Başlat"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Çıkış"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Hoş geldnz! Gear'ınzı kullanmyı öğrnmk içn aşğdki tuşa doknn."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Devre dışı bırakılması istendi"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Etkinleştirilmesi istendi"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Göstrge simglrni saatte grmk içn üst kenarı aşağı kydrn."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Uygulamlrı saatte görntlmk için alt kenarı yukarı kydrn."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "Tamam"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Geri dönmek için üst kenarı aşağı kaydırın."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Uygulamaları yüklemek veya kaldırmak için mobil cihazınızda Samsung Gear uygulamasını kullanın."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Bu, ana ekranın temel yapısıdır."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Boş"
diff --git a/home/res/po/uk.po b/home/res/po/uk.po
new file mode 100755
index 0000000..88f9fd9
--- /dev/null
+++ b/home/res/po/uk.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Програми"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Далі"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Віджет"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Не повтор."
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Видалити всі"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Неможливо видалити."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Натисніть і утримуйте віджет, щоб перемістити його."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Головний екран змінено."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Завантаження..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Неможливо завантажити дані. Натисніть, щоб спробувати ще раз"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Неможливо додати програму. На цьому екрані оформлення більше немає місця."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Неможливо додати віджет. На цьому екрані оформлення більше немає місця."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Така програма вже існує."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Такий віджет уже існує."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Скасувати"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Фон екрана оформлення змінено."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Цю програму буде видалено з екрана оформлення. Вона не видалятиметься із пристрою."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Видалити програму"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Видалити віджет"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Цей віджет буде видалено з екрана оформлення. Він не видалятиметься із пристрою."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Удоск. режим енергозб."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Неможливо додати віджет. Досягнуто максимальної кількості віджетів: %d."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Неможливо додати програму. Досягнуто максимальної кількості програм (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Неможливо додати сторінку."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Звичайний режим"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Режим енергозбереження вимкнено."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Режим енергозбереження ввімкнено."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Ост.програми"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Неможливо додати програму. Досягнуто максимальної кількості програм: %s."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Неможливо додати віджет. Досягнуто максимальної кількості віджетів: %s."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Видалити сторінку"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Цю сторінку та її вміст буде видалено."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Видалити"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Щоб отримати доступ до послуг мережі, вставте SIM-карту."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Режим блокування"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Увімкнено"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Вимкнено"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Об'єкт переміщено."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Двічі натисніть, щоб додати."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Додавання віджета"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Об’єкт додано."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Об'єкт видалено."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Сторінка %1$d з %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Не можна упорядкувати об’єкти дошки сповіщень."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Зараз %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Зараз %d:%d до полудня."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Зараз %d:%d після полудня."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "Нових об’єктів: %d"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Досягнуто максимальної кількості віджетів (%s). Видаліть деякі віджети та спробуйте ще раз."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Проведіть праворуч для повернення до годинника."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Проведіть вліво для перегляду віджетів."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Проведіть вліво для повернення до годиника."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Проведіть вправо для перегляду сповіщень."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Видалити %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Досягнуто максимальної кількості віджетів: %s."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Двічі натисніть, щоб відкрити трей програми."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 новий об’єкт"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Двічі торкніться, щоб увімкнути."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Годинник"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Температура пристрою зависока."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Завантажити програми Gear за допомогою мобільного пристрою."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Під час сну"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Отримати інші програми"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Дія недоступна в разі ввімкнення режиму енергозбереження +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s недоступно за ввімкненої програми читання з екрана."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Не турбувати"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Неможливо увімк. викор. моб. даних за увімкн. режиму без зв’язку. Вимкніть і спроб. ще раз."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Проведіть вгору, щоб відкрити годинник."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Все готово! Пристрій Gear готовий до використання!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Мобільні мережі"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Переадр. на Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Запустити"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Вихід"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Вітаємо! Торкніться кнопки нижче, щоб дізнатися про Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Зроблено запит на вимкнення"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Зроблено запит на увімкнення"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Пров. від верх.краю екр.вниз, щоб пер.знач.індик.на год."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Провед.від ниж.краю вгору, щоб перег.прогр.на годиннику."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Провед. від верх. краю екр. вниз, щоб повернутися назад."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Для встановлення та видалення програм використовуйте програму Samsung Gear на мобільному пристрої."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Основна структура головного екрана."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Пусто"
diff --git a/home/res/po/update-po.sh b/home/res/po/update-po.sh
new file mode 100755
index 0000000..dc707ad
--- /dev/null
+++ b/home/res/po/update-po.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+PACKAGE=volume
+SRCROOT=../src
+POTFILES=POTFILES.in
+
+#ALL_LINGUAS= ar bg ca cs da de_DE el_GR en en_GB en_US es_ES fi fr_FR he hi hr hu id it_IT ja_JP ko_KR lt lv ms nl_NL no pl pt_PT ro ru_RU sk sl sr sv th tr_TR uk vi zh_CN zh_HK zh_TW
+ALL_LINGUAS="ar bg ca cs da de_DE el_GR en en_GB en_US es_ES fi fr_FR he hi hr hu id it_IT ja_JP ko_KR lt lv ms nl_NL no pl pt_PT ro ru_RU sk sl sr sv th tr_TR uk vi zh_CN zh_HK zh_TW"
+
+XGETTEXT=/usr/bin/xgettext
+MSGMERGE=/usr/bin/msgmerge
+
+echo -n "Make ${PACKAGE}.pot "
+if [ ! -e $POTFILES ] ; then
+ echo "$POTFILES not found"
+ exit 1
+fi
+
+$XGETTEXT --default-domain=${PACKAGE} --directory=${SRCROOT} \
+ --add-comments --keyword=_ --keyword=N_ --files-from=$POTFILES
+if [ $? -ne 0 ]; then
+ echo "xgettext error"
+ exit 1
+fi
+
+if [ ! -f ${PACKAGE}.po ]; then
+ echo "No such file: ${PACKAGE}.po"
+ exit 1
+fi
+
+rm -f ${PACKAGE}.pot && mv ${PACKAGE}.po ${PACKAGE}.pot
+echo "done"
+
+for LANG in $ALL_LINGUAS; do
+ echo "$LANG : "
+
+ if [ ! -e $LANG.po ] ; then
+ sed 's/CHARSET/UTF-8/g' ${PACKAGE}.pot > ${LANG}.po
+ echo "${LANG}.po created"
+ else
+ if $MSGMERGE ${LANG}.po ${PACKAGE}.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/home/res/po/ur.po b/home/res/po/ur.po
new file mode 100755
index 0000000..3d7aa1d
--- /dev/null
+++ b/home/res/po/ur.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "ایپلیکیشنز"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "اگلا"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "وڈجیٹ"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "نہ دہرائیں"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "سب حذف کریں"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "ہٹانے سے قاصر۔"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "اسے منتقل کرنے کے لیے کسی وجٹ کو دبائیں یا دبا کر رکھیں"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "ہوم اسکرین تبدیل ہوگئی۔"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "لوڈنگ..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "ڈیٹا لوڈ کرنے سے قاصر۔ پھرکوشش کرنے کے لئے تھپتھپائیں۔"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "اپلیکیشن شامل کرنے سے قاصر۔ ہوم اسکرین پر مزید جگہ نہیں ہے۔"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "ویجٹ لوڈ کرنے سے قاصر۔ ہوم اسکرین پر مزید جگہ نہیں ہے۔"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "اپلیکیشن پہلے سے ہی موجود ہے۔"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "ویجٹ پہلے سے ہی موجود ہے۔"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "منسوخ"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "ہوم اسکرین کا خاکہ تبدیل ہوگیا۔"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "یہ اپلیکیشن ہوم اسکرین سے ہٹا دیاجائے گا۔ یہ آلے سے حذف نہیں ہوگا۔"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "اپلیکیشن ہٹائیں"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "ویجٹ ہٹائیں"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "یہ ویجٹ ہوم اسکرین سے ہٹا دیاجائے گا۔ یہ آلے سے حذف نہیں ہوگا۔"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "الٹرا پاور کی بچت کرنے والی وضع"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "ویجیٹ شامل کرنے سے قاصر۔ ویجیٹس کی زیادہ سے زیادہ تعداد (%d) کو پہنچ گیا۔"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "ایپلی کیشن شامل کرنے سے قاصر۔ ایپلی کیشنز کی زیادہ سے زیادہ تعداد (%d) تک پہنچ گئے ہیں۔"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "صفحہ شامل کرنے سے قاصر۔"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "نارمل موڈ"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "پاور بچت وضع غیر فعال ہے۔"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "بچلی کی بچت کی وضع فعال ہے۔"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "حالیہ ایپلیکیشنز"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "ایپلی کیشن شامل کرنے میں ناکامی۔ زیادہ سے زیادہ ایپلی کیشنوں کی حد (%s) پہنچ گئی۔"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "ویجٹ شامل کرنے میں ناکامی۔ زیادہ سے زیادہ ویجٹ کی حد (%s) پہنچ گئی۔"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "صفحہ ہٹائیں"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "یہ صفحہ اور اس کا مواد ہٹا دیا جائے گا۔"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "ہٹائیں"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "نیٹورک سروس استعمال کے لیے SIM کارڈ ڈالیں"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "مسدود کرنے والی وضع"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "آن"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "آف"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "شے منتقل کی گئی۔"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "شامل کرنے کے لیےدوہری تھپکی دیں۔"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "وجیٹ اضافہ کریں"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "شے اضافہ کی گئی۔"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "شے ہٹادی گئی۔"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "صفحہ %1$d از %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "اطلاعاتی بورڈ اشیاء کو دوبارہ ترتیب نہیں دے سکتا۔"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "یہ ہے %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "اب وقت ہوا ہے %d:%d AM"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "اب وقت ہوا ہے %d:%d PM"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d نئی آئٹم"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "وجیٹس کی زیادہ سے زیادہ تعداد (%s) کو پہنچ گیا ہے۔ کچھ وجیٹس حذف کریں اور دوبارہ کوشش کریں۔"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "گھڑی پر واپس جانے کے لیے دائیں سوائپ کریں۔"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "ویجٹس دیکھنے کیلئے بائیں سوائپ کریں۔"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "گھڑی پر واپس جانے کے لیے بائیں سوائپ کریں۔"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "اطلاعات دیکھنے کے لیے دائیں سوائپ کریں۔"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s نا تنصیب کریں؟"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "وجیٹس کی زیادہ سے زیادہ تعداد (%s) کو پہنچ گیا۔"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "ایپ ٹرے کھولنے کیلئے دو بار تھپتھپائیں۔"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1نئی شے"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "اہل کرنے کیلئے دو بار تھپتھپائیں۔"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "گھڑی"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "آلہ کا درجہ حرارت بہت زیادہ ہے"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "موبائل آلے کا استعمال کرتے ہوئے Gear ایپلیکیشن ڈاؤن لوڈ کریں۔"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "سوتے وقت"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "مزید ایپلیکیشن حاصل کریں"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "جب پاور بچت + اہل ہو تو یہ عمل دستیاب نہیں ہے۔"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s اسکرین ریڈر اہل ہونے کے دوران دستیاب نہیں ہے۔"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "پریشان نہ کریں"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "فلائٹ موڈ اہل ہونے کی صورت میں موبائل ڈیٹا چالو کرنے سے قاصر۔ فلائٹ موڈ نااہل کریں اور دوبارہ کوشش کریں۔"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "گھڑی پر واپس جانے کے لیے اوپر کی جانب سوائپ کریں۔"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "بالکل درست! Gear میں داخل ہوں!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "موبائل نیٹ ورکس"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "گیئر کو کالز فارورڈ کریں"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "شروع"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "نکلنا"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "خوش آمدید! اپنا Gear استعمال کرنے کا طریقہ جاننے کے لیے ذیل کے بٹن پر تھپکی دیں۔"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "نااہل کرنے کی درخواست کی گئی"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "اہل بنانے کے لئے درخواست کی گئی"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "گھڑی پر انڈیکیٹر آئیکنز دیکھنے کے لیے اوپری کنارے کو نیچے کی جانب سوائپ کریں۔"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "گھڑی پر ایپس دیکھنے کے لیے نچلے سرے کو اوپر سوائپ کریں۔"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "ٹھیک ہے"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "واپس جانے کے لیے اوپری کنارے کو نیچے جانب سوائپ کریں۔"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "ایپلیکیشنز کی تنصیب یا نا تنصیب کرنے کے لیے، اپنے آلہ پر Samsung Gear ایپلیکیشن کا استعمال کریں۔"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "یہ ہوم اسکرین کی مرکزی بناوٹ ہے۔"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "خالی"
diff --git a/home/res/po/uz.po b/home/res/po/uz.po
new file mode 100755
index 0000000..97da246
--- /dev/null
+++ b/home/res/po/uz.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Ilovalar"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Keyingi"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Vidjet"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Takrorlama"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Barini yo‘q/q"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Olib tashlab bo‘lmaydi."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Vidjetni ko‘chirish uchun uni bosib turing."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Asosiy ekran o‘zgartirildi."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Yuklanmoqda..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Ma’lumotni yuklab bo‘lmaydi. Qayta urinib ko‘rish uchun cherting"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Ilovani qo‘shib bo‘lmaydi. Asosiy ekranda boshqa joy yo‘q."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Vidjetni qo‘shib bo‘lmaydi. Asosiy ekranda boshqa joy yo‘q."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Ilova avvaldan mavjud."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Vidjet oldindan mavjud."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Bekor qilish"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Asosiy ekran tuzilishi o‘zgardi."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ushbu ilova asosiy ekrandan olib tashlanadi. U qurilmadan yo‘q qilinmaydi."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Ilovani olib tashla"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Vidjetni olib tashla"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Ushbu vidjet asosiy ekrandan olib tashlanadi. U qurilmadan yo‘q qilinmaydi."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Ultra quv/tejash rejimi"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Vidjetni qo‘shib bo‘lmaydi. Vidjetlar soni maksimal miqdorga (%d) yetdi."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Ilovani qo‘shib bo‘lmaydi. Ilovalar soni ruxsat etilgan maksimal miqdorga (%d) yetdi."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Sahifa qo‘shib bo‘lmaydi."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Normal rejim"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Quvvat tejash rejimi o‘chirildi."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Quvvat tejash rejimi yoqildi."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Oxirgi ilova"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Ilovani qo‘shib bo‘lmaydi. Ilovalar soni maksimal miqdorga (%s) yetdi."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Vidjetni qo‘shib bo‘lmaydi. Vidjetlar soni maksimal miqdorga (%s) yetdi."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Sahifani olib tashla"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Ushbu sahifa va uning tarkibi olib tashlanadi."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Ol/tashla"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Tarmoq xizmatlariga kirish uchun SIM-karta kiriting."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Bloklash rejimi"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Yoq."
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "O‘ch."
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Element ko‘chirildi."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Qo‘shish uchun ikki marta teging."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Vidjet qo‘shish"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Element qo‘shildi."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Element olib tashlandi."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Sahifa %1$d/%2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Bildirishnoma taxtasi elementlari tartibini o‘zgartirib bo‘lmaydi."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "U %1$d:%2$d"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Bu %d:%d Tushdan avvalgi."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Bu %d:%d Tushdan so‘ng."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d yangi element"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Vidjetlar soni maks. miqdorga (%s) yetdi. Ba’zi vidjetlarni yo‘q qiling va qayta urinib ko‘ring."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Soatga qaytish uchun o‘ngga suring."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Vidjet-ni ko‘rish u-n chapga suring."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Soatga qaytish uchun chapga suring."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Bldrsh-ni ko‘rish u-n o‘ngga suring."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "%s olib tashlansinmi?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Vidjetlar soni maksimal miqdorga (%s) yetdi."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Ilova treyni ochish uchun ikki marta teging."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1ta yangi element"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Yoqish uchun ikki marta teging."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Soat"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Qurilma harorati juda yuqori."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Mobil qurilma yordamida Gear ilovalarini yuklab oling."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Uxlayotganda"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Ko‘proq ilovalar olish"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Quvvat tejash + yoqilgan vaqtda amaldan foydalanib bo‘lmaydi."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "Ekranni o‘qish vositasi yoqilganda, %sdan foydalanib bo‘lmaydi."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Bezovta qilmang"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Uchish rjm yoqilganda Mobil ma’l-ni yoqib bo‘lmaydi. Uchish rjm-ni o‘chir va qayta urin."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Soatga qaytish uchun yuqoriga suring."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Tayyor! Gear-ga o‘ting!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mobil tarmoqlar"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Qo‘n. Gearga ynlt"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Boshlash"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Chiqish"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Marhamat! Gear ishl. haq. ma’l. ol. u-n quy. tgm. teging."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "O‘chirish so‘raldi"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Yoqish so‘raldi"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Soat indktr ikon-ni ko‘rish u-n yuqori chet. pastga sur."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Soatda ilovani ko‘rish u-n quyi chetni yuqoriga suring."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Orqaga qaytish uchun yuqori chetni pastga suring."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Ilovalarni o‘rnatish yoki olib tashlash uchun mobil qurilmangizda Samsung Gear ilovasidan foydalaning."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Bu asosiy ekranning asosiy tuzilishi."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Bo‘sh"
diff --git a/home/res/po/vi.po b/home/res/po/vi.po
new file mode 100755
index 0000000..9a83eeb
--- /dev/null
+++ b/home/res/po/vi.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Ứng dụng"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "Tiếp"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "Không lặp lại"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "Xóa tất cả"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "Không thể xóa."
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "Chạm và giữ để di chuyển widget."
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "Màn hình chờ đã thay đổi."
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "Đang tải…"
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "Không thể tải dữ liệu. Hãy chạm để thử lại."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Không thể thêm ứng dụng. Không còn chỗ trên màn hình chờ."
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "Không thể thêm widget. Không còn chỗ trên màn hình chờ."
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "Ứng dụng đã tồn tại."
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget đã tồn tại."
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "Thoát"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "Bố cục màn hình chờ đã thay đổi."
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Sẽ xóa ứng dụng này khỏi màn hình chờ. Nó sẽ không bị xóa khỏi thiết bị."
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "Xóa ứng dụng"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "Xóa widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "Sẽ xóa widget này khỏi màn hình chờ. Nó sẽ không bị xóa khỏi thiết bị."
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "Chế độ siêu tiết kiệm pin"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Không thể thêm widget. Đã đạt đến số widget tối đa (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "Không thể thêm ứng dụng. Đã đạt số ứng dụng tối đa (%d)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "Không thể thêm trang."
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "Chế độ Bình thường"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "Đã tắt chế độ tiết kiệm pin."
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "Đã bật chế độ tiết kiệm pin."
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "Ứng dụng gần đây"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "Không thể thêm ứng dụng. Đã đạt đến số ứng dụng tối đa (%s)."
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "Không thể thêm widget. Đã đạt đến số widget tối đa (%s)."
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "Xóa trang"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "Trang này và nội dung của trang sẽ bị xóa."
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "Gỡ bỏ"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "Gắn thẻ SIM để truy cập mạng."
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "Chế độ chặn"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "Bật"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "Tắt"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "Đã di chuyển mục."
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "Chạm hai lần để thêm."
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "Thêm widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "Mục đã được thêm."
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "Mục đã bị xóa."
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "Trang %1$d / %2$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "Không thể sắp xếp lại các mục trên bảng thông báo."
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "Bây giờ là %1$d:%2$d."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "Bây giờ là %d:%d SA."
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "Bây giờ là %d:%d CH."
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d mục mới"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "Đã đạt số widget tối đa (%s). Hãy xóa một số widget và thử lại."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Vuốt sang phải để trở về đồng hồ."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "Vuốt sang trái để xem widget."
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "Vuốt sang trái để trở về đồng hồ."
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "Vuốt sang phải để xem thông báo."
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "Gỡ cài đặt %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "Đã đạt số widget tối đa (%s)."
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "Chạm hai lần để mở khay ứng dụng."
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 mục mới"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "Chạm hai lần để bật."
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "Đồng hồ"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "Nhiệt độ thiết bị quá cao."
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "Tải về ứng dụng Gear bằng thiết bị di động."
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "Khi đang ngủ"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "Tải thêm ứng dụng"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "Không có Hành động khi đang bật Tiết kiệm pin +."
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s không khả dụng khi đang bật Trình đọc màn hình."
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "Không làm phiền"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "Không thể bật Dữ liệu di động khi đang bật chế độ Máy bay. Hãy tắt chế độ Máy bay và thử lại."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "Vuốt lên để trở về đồng hồ."
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "Xong rồi! Hãy bắt đầu trải nghiệm Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "Mạng di động"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "Ch.tiếp c.gọi đến Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "Bắt đầu"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "Đóng"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "Chào mừng bạn! Hãy chạm phím bên dưới để học cách sử dụng Gear."
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "Đã yêu cầu tắt"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "Đã yêu cầu bật"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "Vuốt từ cạnh trên cùng xuống để xem các biểu tượng chỉ báo trên đồng hồ."
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "Vuốt từ cạnh dưới cùng lên để xem các ứng dụng trên đồng hồ."
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "OK"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "Vuốt từ cạnh trên cùng xuống để trở về."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "Trên đồng hồ, vuốt xuống từ cạnh trên cùng để đến biểu tượng chỉ báo."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "Trên đồng hồ, vuốt lên từ cạnh dưới cùng để xem ứng dụng."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "Từ đồng hồ, vuốt sang phải để xem thông báo."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Vuốt sang trái để trở về đồng hồ."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "Từ đồng hồ, vuốt sang trái để xem widget."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Vuốt sang phải để trở về đồng hồ."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "Từ đồng hồ, vuốt lên để xem ứng dụng."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Vuốt xuống để trở về đồng hồ."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "Từ đồng hồ, vuốt xuống để xem thanh Khoảnh khắc."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Vuốt lên để trở về đồng hồ."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "Đồng hồ là màn hình chờ của bạn. Chạm vào bên dưới để bắt đầu."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "Để cài đặt hoặc gỡ cài đặt ứng dụng, hãy dùng ứng dụng Samsung Gear trên thiết bị di động."
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "Đây là cấu trúc chính của màn hình chờ."
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "Đây là bố trí màn hình chờ của bạn."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "Trống"
diff --git a/home/res/po/zh_CN.po b/home/res/po/zh_CN.po
new file mode 100755
index 0000000..69579b4
--- /dev/null
+++ b/home/res/po/zh_CN.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "应用程序"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "下一步"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "桌面小组件"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "不重复"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "删除全部"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "无法移除。"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "点击并按住小组件以进行移动"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "主屏已更改。"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "载入中…"
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "无法载入数据。轻敲以重试。"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "无法添加应用程序。主屏幕无更多空间。"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "无法添加小组件。主屏幕无更多空间。"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "应用程序已存在。"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "小组件已存在。"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "取消"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "主屏幕布局已更改。"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "该应用程序将从主屏幕移除。它不会从设备删除。"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "移除应用程序"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "移除小组件"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "该小组件将从主屏幕移除。它不会从设备删除。"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "超级省电模式"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "无法添加小组件。已达到最大小组件数 (%d)。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "无法添加应用程序。已达到最大应用程序数 (%d)。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "无法添加页面。"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "普通模式"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "省电模式已禁用"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "已启动省电模式"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "最近应用程序"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "无法添加应用程序。已达到最大应用程序数 (%s)。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "无法添加小组件。已达到最大小组件数 (%s)。"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "移除页面"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "将移除该页面及其内容。"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "移除"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "插入 SIM 卡以访问网络服务。"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "阻止模式"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "打开"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "关闭"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "项目已移动。"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "双击以添加。"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "添加小组件"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "项目已添加。"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "项目已移除。"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "第 %1$d 页,共 %2$d 页"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "无法重新排列通知板项目"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "现在时间 %1$d:%2$d。"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "上午 %d点 %d分。"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "下午 %d点 %d分。"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d 个新项目"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "已达到最大小组件数量 (%s)。删除部分小组件并重试。"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "向右滑动以返回时钟。"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "向左滑动以查看小组件。"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "向左滑动以返回时钟。"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "向右滑动以查看通知。"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "是否卸载 %s?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "已达到最大小组件数 (%s)"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "双击以打开应用程序托盘。"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 个新项目"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "双击以启用。"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "时钟"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "设备温度过高。"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "使用移动设备下载 Gear 应用程序"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "睡眠时"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "获得更多应用程序"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "省电模式 + 启用时无法使用动作"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "%s 在屏幕阅读器启用时不可用。"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "请勿打扰"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "飞行模式启用时无法打开移动数据。禁用飞行模式并重试。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "向上滑动以返回时钟。"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "就是这样!欢迎使用 Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "移动网络"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "转移呼叫至 Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "开始"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "退出"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "欢迎!点击下方的按钮以了解如何使用您的 Gear。"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "已请求禁用"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "已请求启用"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "向下滑动顶部边缘以在时钟上查看指示图标。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "向上滑动底部边缘以在时钟上查看应用程序。"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "确定"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "向下滑动顶部边缘以返回。"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "在时钟上,从顶部边缘向下滑动以显示指示图标。"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "在时钟上,从底部边缘向上滑动以查看应用程序。"
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "从时钟向右滑动以查看通知。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "向左滑动以返回时钟。"
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "从时钟向左滑动以查看小组件。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "向右滑动以返回时钟。"
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "从时钟向上滑动以查看应用程序。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "向下滑动以返回时钟。"
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "从时钟向下滑动以查看时刻栏。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "向上滑动以返回时钟。"
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "时钟为您的主屏幕。点击下方以开始。"
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "若要安装或卸载应用程序,请在您的移动设备上使用 Samsung Gear 应用程序。"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "这是主屏幕的主要结构。"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "这是您的主屏布局。"
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "空白"
diff --git a/home/res/po/zh_HK.po b/home/res/po/zh_HK.po
new file mode 100755
index 0000000..40bd17d
--- /dev/null
+++ b/home/res/po/zh_HK.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "應用程式"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "下一步"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "不要重複。"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "全部刪除"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "無法移除。"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "輕觸並按住 Widget 以移動。"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "主螢幕已變更。"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "正在載入..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "無法載入數據。輕觸以重試。"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "無法加入應用程式。主螢幕空間不足。"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "無法加入 Widget。主螢幕空間不足。"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "應用程式已存在。"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "Widget 已存在。"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "取消"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "主螢幕配置已變更。"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "此應用程式將從主螢幕移除。它不會從裝置刪除。"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "移除應用程式"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "移除 Widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "此 Widget 將從主螢幕移除。它不會從裝置刪除。"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "超級省電模式"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "無法加入 Widget。已達 Widget 數量上限 (%d)。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "無法加入應用程式。已達應用程式數量上限 (%d)。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "無法加入頁面。"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "正常模式"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "省電模式已停用。"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "省電模式已啟用。"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "最近使用的應用程式"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "無法加入應用程式。已達應用程式數量上限 (%s)。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "無法加入 Widget。已達 Widget 數量上限 (%s)。"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "移除頁面"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "將移除此頁面及其內容。"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "移除"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "插入 SIM 卡以存取網絡服務。"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "封鎖模式"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "開"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "關"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "項目已移動。"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "輕觸兩下以加入。"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "加入widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "項目已加入。"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "項目已移除。"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "第 %2$d 頁,共 %1$d 頁"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "無法重新排序通知板項目。"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "現在時間是 %1$d:%2$d。"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "現在是上午 %d:%d。"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "現在是下午 %d:%d。"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d 個新項目"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "已達 Widget 數量上限 (%s)。刪除部分 Widget 並重試。"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "向右滑動以返回至時鐘。"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "向左滑動以檢視 Widget。"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "向左滑動以返回至時鐘。"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "向右滑動以檢視通知。"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "解除安裝 %s 嗎?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "已達 Widget 數量上限 (%s)。"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "輕觸兩下以開啟應用程式工具列。"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 個新項目"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "輕觸兩下以啟用。"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "時鐘"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "裝置溫度過高。"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "使用流動裝置下載 Gear 應用程式。"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "睡眠時"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "取得更多應用程式"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "省電模式 + 已啟用時無法使用動作。"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "當螢幕閱讀器已啟用時,%s 不可用。"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "請勿打擾"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "飛行模式啟用時無法開啟流動數據。請停用飛行模式並重試。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "向上滑動以返回至時鐘。"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "就是它了!歡迎來到 Gear!"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "流動網絡"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "轉駁來電至 Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "開始"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "退出"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "歡迎!輕觸下方的按鍵以瞭解如何使用您的 Gear。"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "已請求停用"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "已請求啟用"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "向下滑動頂部邊緣以於時鐘查看指示圖示。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "向上滑動底部邊緣以於時鐘檢視應用程式。"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "確定"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "向下滑動頂部邊緣以返回。"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "若要安裝或解除安裝應用程式,請在您的流動裝置上使用 Samsung Gear 應用程式。"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "這是主螢幕的主要結構。"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "空白"
diff --git a/home/res/po/zh_TW.po b/home/res/po/zh_TW.po
new file mode 100755
index 0000000..6f672cb
--- /dev/null
+++ b/home/res/po/zh_TW.po
@@ -0,0 +1,284 @@
+msgid "IDS_IDLE_BODY_APPS"
+msgstr "Apps"
+
+msgid "IDS_ST_BUTTON_NEXT"
+msgstr "下一頁"
+
+msgid "IDS_IDLE_HEADER_WIDGET"
+msgstr "Widget"
+
+msgid "IDS_CLOCK_BODY_DONT_REPEAT_ABB"
+msgstr "不再顯示"
+
+msgid "IDS_WNOTI_BODY_DELETE_ALL_ABB2"
+msgstr "全部刪除"
+
+msgid "IDS_IM_POP_UNABLE_TO_REMOVE"
+msgstr "無法刪除。"
+
+msgid "IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"
+msgstr "輕觸並按住 Widget 以移動。"
+
+msgid "IDS_ST_BODY_HOME_SCREEN_CHANGED_ABB"
+msgstr "主螢幕已變更。"
+
+msgid "IDS_IDLE_POP_LOADING_ING"
+msgstr "正在載入..."
+
+msgid "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"
+msgstr "無法載入資料。輕觸以重試。"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_APPLICATION_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "無法新增應用程式。主螢幕空間不足。"
+
+msgid "IDS_HS_POP_UNABLE_TO_ADD_WIDGET_NO_MORE_ROOM_ON_HOME_SCREEN"
+msgstr "無法新增 widget。主螢幕空間不足。"
+
+msgid "IDS_HS_TPOP_APPLICATION_ALREADY_EXISTS"
+msgstr "應用程式已存在。"
+
+msgid "IDS_HS_TPOP_WIDGET_ALREADY_EXISTS"
+msgstr "widget 已存在。"
+
+msgid "IDS_COM_POP_CANCEL"
+msgstr "取消"
+
+msgid "IDS_HS_TPOP_HOME_SCREEN_LAYOUT_CHANGED"
+msgstr "主螢幕版面配置已變更。"
+
+msgid "IDS_HS_POP_THIS_APPLICATION_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "此應用程式將自主螢幕移除。將不會自裝置刪除。"
+
+msgid "IDS_HS_HEADER_REMOVE_APPLICATION_ABB"
+msgstr "移除應用程式"
+
+msgid "IDS_HS_HEADER_REMOVE_WIDGET_ABB"
+msgstr "移除 widget"
+
+msgid "IDS_HS_POP_THIS_WIDGET_WILL_BE_REMOVED_FROM_THE_HOME_SCREEN_IT_WILL_NOT_BE_DELETED_FROM_THE_DEVICE"
+msgstr "此 widget 將自主螢幕移除。將不會自裝置刪除。"
+
+msgid "IDS_ST_MBODY_ULTRA_POWER_SAVING_MODE"
+msgstr "使用超省電模式"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "無法新增 widget。已達 widget 數量上限 (%d)。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPD_REACHED"
+msgstr "無法新增應用程式。已達應用程式數量上限 (%d)。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_PAGE"
+msgstr "無法新增頁面。"
+
+msgid "IDS_ST_BODY_NORMAL_MODE"
+msgstr "基本模式"
+
+msgid "IDS_SMR_TPOP_POWER_SAVING_MODE_DISABLED"
+msgstr "已停用省電模式。"
+
+msgid "IDS_ST_TPOP_POWER_SAVING_MODE_ENABLED"
+msgstr "省電模式已啟動。"
+
+msgid "IDS_ST_OPT_RECENT_APPS_ABB"
+msgstr "最近的應用程式"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_APPLICATION_MAXIMUM_NUMBER_OF_APPLICATIONS_HPS_REACHED"
+msgstr "無法新增應用程式。已達應用程式數量上限 (%s)。"
+
+msgid "IDS_HS_TPOP_UNABLE_TO_ADD_WIDGET_MAXIMUM_NUMBER_OF_WIDGETS_HPS_REACHED"
+msgstr "無法新增 widget。已達 widget 數量上限 (%s)。"
+
+msgid "IDS_HS_BODY_REMOVE_PAGE"
+msgstr "移除頁面"
+
+msgid "IDS_HS_POP_THIS_PAGE_AND_ITS_CONTENT_WILL_BE_REMOVED"
+msgstr "將移除此頁面與其中內容。"
+
+msgid "IDS_COM_BUTTON_REMOVE_ABB"
+msgstr "移除"
+
+msgid "IDS_ST_POP_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES"
+msgstr "請插入 SIM 卡以存取網路服務。"
+
+msgid "IDS_ST_BUTTON2_BLOCKING_MODE"
+msgstr "封鎖模式"
+
+msgid "IDS_COM_BODY_ON_M_STATUS"
+msgstr "開"
+
+msgid "IDS_COM_BODY_OFF_M_STATUS"
+msgstr "關"
+
+msgid "IDS_TTS_BODY_ITEM_MOVED"
+msgstr "項目已移動。"
+
+msgid "IDS_KM_BODY_DOUBLE_TAP_TO_ADD"
+msgstr "輕觸兩下以新增。"
+
+msgid "IDS_HS_BODY_ADD_WIDGET"
+msgstr "增加 widget"
+
+msgid "IDS_TTS_BODY_ITEM_ADDED"
+msgstr "項目已新增。"
+
+msgid "IDS_TTS_BODY_ITEM_REMOVED"
+msgstr "項目已移除。"
+
+msgid "IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"
+msgstr "頁 %2$d 之 %1$d"
+
+msgid "IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"
+msgstr "無法重新排序通知看板項目。"
+
+msgid "IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"
+msgstr "現在時間是 %1$d:%2$d。"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_AM"
+msgstr "現在是上午 %d:%d。"
+
+msgid "IDS_TTS_BODY_IT_IS_PD_CPD_PM"
+msgstr "現在是下午 %d:%d。"
+
+msgid "IDS_TTS_BODY_PD_NEW_ITEMS"
+msgstr "%d 個新項目"
+
+msgid "IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB"
+msgstr "已達 widget 數量上限 (%s)。請刪除部分 widget 並重試。"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "向右滑動以返回到時鐘。"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"
+msgstr "向左滑動以檢視 widget。"
+
+msgid "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"
+msgstr "向左滑動以返回到時鐘。"
+
+msgid "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"
+msgstr "向右滑動以檢視通知。"
+
+msgid "IDS_AT_POP_UNINSTALL_PS_Q"
+msgstr "解除安裝 %s 嗎?"
+
+msgid "IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"
+msgstr "已達 widget 數量上限 (%s)。"
+
+msgid "IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS"
+msgstr "輕觸兩下來開啟應用程式工具列。"
+
+msgid "IDS_TTS_BODY_1_NEW_ITEM"
+msgstr "1 個新項目"
+
+msgid "IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS"
+msgstr "輕觸兩下來啟用。"
+
+msgid "IDS_ST_BUTTON2_CLOCK"
+msgstr "時鐘"
+
+msgid "IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"
+msgstr "裝置溫度過高。"
+
+msgid "IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"
+msgstr "使用行動裝置下載 Gear 應用程式。"
+
+msgid "IDS_HEALTH_OPT_WHILE_SLEEPING_ABB"
+msgstr "睡覺時"
+
+msgid "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"
+msgstr "取得更多應用程式"
+
+msgid "IDS_ST_TPOP_ACTION_NOT_AVAILABLE_WHILE_POWER_SAVING_PLUS_ENABLED"
+msgstr "啟用省電 + 時無法使用動作。"
+
+msgid "IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"
+msgstr "螢幕閱讀器啟用時無法使用 %s。"
+
+msgid "IDS_ST_MBODY_DO_NOT_DISTURB_ABB"
+msgstr "停用模式"
+
+msgid "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB"
+msgstr "無法在飛航模式啟用時開啟行動數據。停用飛航模式並重試。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"
+msgstr "向上滑動以返回到時鐘。"
+
+msgid "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"
+msgstr "完成了!歡迎使用 Gear !"
+
+msgid "IDS_ST_MBODY_MOBILE_NETWORKS_ABB"
+msgstr "行動網路"
+
+msgid "IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"
+msgstr "轉接來電至 Gear"
+
+msgid "IDS_ST_BUTTON_START"
+msgstr "開啟"
+
+msgid "IDS_ST_BUTTON_EXIT"
+msgstr "退出"
+
+msgid "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"
+msgstr "歡迎!輕觸下方按鈕以瞭解如何使用 Gear。"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_DISABLE"
+msgstr "已要求停用"
+
+msgid "IDS_WMGR_NPBODY_REQUESTED_TO_ENABLE"
+msgstr "已要求啟用"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"
+msgstr "向下滑動頂端邊框來查看時鐘上的指針圖示。"
+
+msgid "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"
+msgstr "從底部邊緣向上滑動以於時鐘上檢視應用程式。"
+
+msgid "IDS_ST_BUTTON_OK"
+msgstr "確認"
+
+msgid "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"
+msgstr "向下滑動頂端邊框來返回。"
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_DOWN_FROM_TOP_EDGE_FOR_INDICATOR_ICONS_VZW"
+msgstr "On clock, swipe down from top edge for indicator icons."
+
+msgid "IDS_WNOTI_BODY_ON_CLOCK_SWIPE_UP_FROM_BOTTOM_EDGE_TO_VIEW_APPS_VZW"
+msgstr "On clock, swipe up from bottom edge to view apps."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_RIGHT_TO_SEE_NOTIFICATIONS_ATNT"
+msgstr "From the clock, swipe right to see notifications."
+
+msgid "IDS_WNOTI_BODY_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe left to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_LEFT_TO_SEE_WIDGETS_ATNT"
+msgstr "From the clock, swipe left to see widgets."
+
+msgid "IDS_WNOTI_BODY_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe right to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_UP_TO_VIEW_APPS_ATNT"
+msgstr "From the clock, swipe up to view apps."
+
+msgid "IDS_WNOTI_BODY_SWIPE_DOWN_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe down to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_FROM_THE_CLOCK_SWIPE_DOWN_TO_SEE_THE_MOMENTS_BAR_ATNT"
+msgstr "From the clock, swipe down to see the Moments bar."
+
+msgid "IDS_WNOTI_BODY_SWIPE_UP_TO_GO_BACK_TO_THE_CLOCK_ATNT"
+msgstr "Swipe up to go back to the clock."
+
+msgid "IDS_WNOTI_BODY_THE_CLOCK_IS_YOUR_HOME_SCREEN_TAP_BELOW_TO_GET_STARTED_ATNT"
+msgstr "The clock is your home screen. Tap below to get started."
+
+msgid "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"
+msgstr "若要安裝或解除安裝應用程式,請在行動裝置上使用三星 Gear 應用程式。"
+
+msgid "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"
+msgstr "這是主螢幕的主要架構。"
+
+msgid "IDS_TTRL_BODY_THIS_IS_YOUR_HOME_SCREEN_LAYOUT_VZW"
+msgstr "This is your home screen layout."
+
+msgid "IDS_ST_BODY_EMPTY"
+msgstr "空白"
diff --git a/home/src/add-viewer.c b/home/src/add-viewer.c
new file mode 100644
index 0000000..fa76001
--- /dev/null
+++ b/home/src/add-viewer.c
@@ -0,0 +1,1118 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <dynamicbox_service.h>
+#include <dynamicbox_errno.h>
+
+#include <dlog.h>
+#include <system_settings.h>
+
+#include <Elementary.h>
+
+#include "add-viewer.h"
+#include "add-viewer_pkgmgr.h"
+#include "add-viewer_ucol.h"
+#include "add-viewer_package.h"
+#include "add-viewer_debug.h"
+#include "add-viewer_util.h"
+#include "conf.h"
+
+#include "bg.h"
+
+#if defined(LOG_TAG)
+#undef LOG_TAG
+#endif
+#define LOG_TAG "ADD_VIEWER"
+#define ADD_VIEWER_CLASS_NAME "add-viewer"
+
+int errno;
+
+static struct {
+ Evas_Smart_Class sc;
+ Evas_Smart *smart;
+ Eina_List *add_viewer_list;
+ int enable_dnd;
+} s_info = {
+ .sc = EVAS_SMART_CLASS_INIT_NAME_VERSION(ADD_VIEWER_CLASS_NAME),
+ .smart = NULL,
+ .add_viewer_list = NULL,
+ .enable_dnd = 0,
+};
+
+struct widget_data {
+ Evas *e;
+ Evas_Object *stage;
+
+ Evas_Object *add_viewer;
+ Evas_Object *parent;
+
+ Evas_Object *scroller;
+
+ Evas_Object *bg;
+};
+
+struct click {
+ struct widget_data *widget_data;
+ struct add_viewer_package *package;
+ int size;
+ Ecore_Timer *long_press_timer;
+ int x;
+ int y;
+
+ struct dnd {
+ Evas_Object *obj;
+ } dnd;
+
+ struct geo {
+ Evas_Object *obj;
+ int x;
+ int y;
+ } geo;
+};
+
+static Evas_Object *winset_preview_add(struct widget_data *widget_data, Evas_Object *parent, struct add_viewer_package *package, const char *name, int type, int no_event);
+
+static inline void append_padding(Evas_Object *box, int padding)
+{
+ Evas_Object *pad;
+
+ pad = elm_box_add(box);
+ if (!pad) {
+ ErrPrint("Failed to create a pad\n");
+ return;
+ }
+
+ evas_object_resize(pad, ADD_VIEWER_PREVIEW_WIDTH, padding);
+ evas_object_size_hint_min_set(pad, ADD_VIEWER_PREVIEW_WIDTH, padding);
+ evas_object_show(pad);
+ elm_box_pack_end(box, pad);
+}
+
+static Eina_Bool normal_loader_cb(struct widget_data *widget_data, void *container)
+{
+ struct add_viewer_package *package;
+ Evas_Object *thumb_item;
+ Eina_List *l;
+ char *name;
+ char *filter;
+
+ l = (Eina_List *)evas_object_data_get(container, "list");
+ if (!l) {
+ l = add_viewer_package_list_handle();
+ if (!l) {
+ goto cancel;
+ }
+
+ evas_object_data_set(container, "list", l);
+ }
+
+ package = add_viewer_package_list_item(l);
+
+ l = add_viewer_package_list_next(l);
+ evas_object_data_set(container, "list", l);
+ if (!package) {
+ ErrPrint("Package list is not valid\n");
+ goto out;
+ }
+
+ filter = evas_object_data_get(container, "filter");
+ if (filter) {
+ name = (char *)add_viewer_package_list_name(package);
+ if (add_viewer_ucol_case_search(name, filter) < 0) {
+ goto out;
+ }
+
+ name = add_viewer_util_highlight_keyword(name, filter);
+ DbgPrint("Filtered: %s\n", name);
+ } else {
+ name = elm_entry_utf8_to_markup(add_viewer_package_list_name(package));
+ }
+
+ thumb_item = winset_preview_add(widget_data, container, package, name, DBOX_SIZE_TYPE_2x2, 0);
+ free(name);
+ evas_object_data_set(thumb_item, "package", package);
+ elm_box_pack_end(container, thumb_item);
+
+out:
+ if (l) {
+ return ECORE_CALLBACK_RENEW;
+ }
+ DbgPrint("Loading is finished\n");
+
+cancel:
+ (void)evas_object_data_del(container, "list");
+ (void)evas_object_data_del(container, "loader");
+
+ l = elm_box_children_get(container);
+ if (!l) {
+ /* TODO: "No content" show */
+ } else {
+ eina_list_free(l);
+ /* TODO: "No content" hide */
+
+ append_padding(container, 96);
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static int reload_list_cb(struct add_viewer_package *package, void *data)
+{
+ Eina_List *children;
+ Eina_List *l;
+ Evas_Object *tmp;
+ Ecore_Timer *timer;
+ Evas_Object *container;
+ struct widget_data *widget_data = data;
+
+ container = elm_object_content_get(widget_data->scroller);
+ if (!container) {
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ /*!
+ * \note
+ * Delete all thumbnail objects
+ */
+ children = elm_box_children_get(container);
+ EINA_LIST_FREE(children, tmp) {
+ elm_box_unpack(container, tmp);
+ evas_object_del(tmp);
+ }
+
+ timer = evas_object_data_del(container, "loader");
+ if (timer) {
+ ecore_timer_del(timer);
+ (void)evas_object_data_del(container, "list");
+ }
+
+ append_padding(container, ADD_VIEWER_PREVIEW_PAD_TOP);
+
+ l = add_viewer_package_list_handle();
+ if (l) {
+ elm_object_part_text_set(widget_data->bg, "empty", "");
+ while (normal_loader_cb(widget_data, container) == ECORE_CALLBACK_RENEW);
+ } else {
+ elm_object_part_text_set(widget_data->bg, "empty", _("IDS_ST_BODY_EMPTY"));
+ }
+
+ /* To set the first focus */
+ evas_object_smart_callback_call(widget_data->scroller, "scroll", NULL);
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static void widget_add(Evas_Object *add_viewer)
+{
+ struct widget_data *widget_data;
+
+ widget_data = calloc(1, sizeof(*widget_data));
+ if (!widget_data) {
+ ErrPrint("Failed to allocate heap: %s\n", strerror(errno));
+ return;
+ }
+
+ widget_data->e = evas_object_evas_get(add_viewer);
+ if (!widget_data->e) {
+ ErrPrint("Failed to get Evas\n");
+ free(widget_data);
+ return;
+ }
+
+ widget_data->stage = evas_object_rectangle_add(widget_data->e);
+ if (!widget_data->stage) {
+ ErrPrint("Failed to create a stage\n");
+ free(widget_data);
+ return;
+ }
+
+ widget_data->add_viewer = add_viewer;
+
+ evas_object_color_set(widget_data->stage, 255, 255, 255, 255);
+ evas_object_smart_data_set(widget_data->add_viewer, widget_data);
+ evas_object_smart_member_add(widget_data->stage, widget_data->add_viewer);
+
+ s_info.add_viewer_list = eina_list_append(s_info.add_viewer_list, widget_data);
+
+ add_viewer_package_list_add_event_callback(NULL, PACKAGE_LIST_EVENT_RELOAD, reload_list_cb, widget_data);
+ /* widget_data->parent is not yet initialized */
+}
+
+/**
+ * \note
+ * This callback can be called while initializing a widget.
+ * It means, the element of a structure could be null.
+ * so we have to validate it before delete it.
+ */
+static void widget_del(Evas_Object *add_viewer)
+{
+ struct widget_data *widget_data;
+
+ widget_data = evas_object_smart_data_get(add_viewer);
+ if (!widget_data) {
+ ErrPrint("Invalid widget\n");
+ return;
+ }
+
+ add_viewer_package_list_del_event_callback(NULL, PACKAGE_LIST_EVENT_RELOAD, reload_list_cb, widget_data);
+
+ s_info.add_viewer_list = eina_list_remove(s_info.add_viewer_list, widget_data);
+
+ if (widget_data->scroller) {
+ evas_object_smart_member_del(widget_data->scroller);
+ evas_object_del(widget_data->scroller);
+ }
+
+ if (widget_data->stage) {
+ evas_object_smart_member_del(widget_data->stage);
+ evas_object_del(widget_data->stage);
+ }
+
+ if (widget_data->bg) {
+ evas_object_smart_member_del(widget_data->bg);
+ evas_object_del(widget_data->bg);
+ }
+
+ free(widget_data);
+}
+
+static void widget_move(Evas_Object *add_viewer, Evas_Coord x, Evas_Coord y)
+{
+ struct widget_data *widget_data;
+
+ widget_data = evas_object_smart_data_get(add_viewer);
+ if (!widget_data) {
+ ErrPrint("Invalid widget\n");
+ return;
+ }
+
+ evas_object_move(widget_data->scroller, x, y);
+ evas_object_move(widget_data->stage, x, y);
+ evas_object_move(widget_data->bg, x, y);
+}
+
+static void widget_resize(Evas_Object *add_viewer, Evas_Coord w, Evas_Coord h)
+{
+ struct widget_data *widget_data;
+
+ widget_data = evas_object_smart_data_get(add_viewer);
+ if (!widget_data) {
+ ErrPrint("Invalid widget\n");
+ return;
+ }
+
+ evas_object_resize(widget_data->scroller, w, h);
+ evas_object_resize(widget_data->stage, w, h);
+ evas_object_resize(widget_data->bg, w, h);
+}
+
+static void widget_show(Evas_Object *add_viewer)
+{
+ struct widget_data *widget_data;
+
+ widget_data = evas_object_smart_data_get(add_viewer);
+ if (!widget_data) {
+ ErrPrint("Invalid widget\n");
+ return;
+ }
+
+ evas_object_show(widget_data->stage);
+}
+
+static void widget_hide(Evas_Object *add_viewer)
+{
+ struct widget_data *widget_data;
+
+ widget_data = evas_object_smart_data_get(add_viewer);
+ if (!widget_data) {
+ ErrPrint("Invalid widget\n");
+ return;
+ }
+
+ evas_object_hide(widget_data->stage);
+}
+
+static void widget_color_set(Evas_Object *add_viewer, int r, int g, int b, int a)
+{
+ struct widget_data *widget_data;
+
+ widget_data = evas_object_smart_data_get(add_viewer);
+ if (!widget_data) {
+ ErrPrint("Invalid widget\n");
+ return;
+ }
+
+ evas_object_color_set(widget_data->stage, r, g, b, a);
+}
+
+static void widget_clip_set(Evas_Object *add_viewer, Evas_Object *clip)
+{
+ struct widget_data *widget_data;
+
+ widget_data = evas_object_smart_data_get(add_viewer);
+ if (!widget_data) {
+ ErrPrint("Invalid widget\n");
+ return;
+ }
+
+ evas_object_clip_set(widget_data->stage, clip);
+}
+
+static void widget_clip_unset(Evas_Object *add_viewer)
+{
+ struct widget_data *widget_data;
+
+ widget_data = evas_object_smart_data_get(add_viewer);
+ if (!widget_data) {
+ ErrPrint("Invalid widget\n");
+ return;
+ }
+
+ evas_object_clip_unset(widget_data->stage);
+}
+
+HAPI void evas_object_add_viewer_init(void)
+{
+ add_viewer_ucol_init();
+ (void)add_viewer_package_init();
+
+}
+
+HAPI void evas_object_add_viewer_fini(void)
+{
+ (void)add_viewer_package_fini();
+ add_viewer_ucol_fini();
+}
+
+static Eina_Bool register_access_object_for_edje_part(Evas_Object *object, const char *part_name)
+{
+ Evas_Object *edje;
+ Evas_Object *content;
+ Elm_Access_Action_Info info;
+ Elm_Access_Action_Type action;
+
+ edje = evas_object_data_get(object, "edje");
+ if (!edje) {
+ return EINA_TRUE;
+ }
+
+ content = elm_object_part_content_get(edje, part_name);
+ if (!content) {
+ return EINA_TRUE;
+ }
+
+ memset(&info, 0, sizeof(info));
+
+ action = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
+ info.highlight_cycle = EINA_FALSE;
+ return elm_access_action(content, action, &info);
+}
+
+static inline int make_clicked_event(Evas_Object *part_obj)
+{
+ Evas_Object *ao;
+ Evas *e;
+ int x;
+ int y;
+ int w;
+ int h;
+ double timestamp;
+
+ ao = evas_object_data_get(part_obj, "access,object");
+ if (!ao) {
+ ErrPrint("Access object is not exists\n");
+ return EINA_FALSE;
+ }
+
+ e = evas_object_evas_get(part_obj);
+ if (!e) {
+ ErrPrint("evas is not valid\n");
+ return EINA_FALSE;
+ }
+
+ evas_object_geometry_get(part_obj, &x, &y, &w, &h);
+ x += w / 2;
+ y += h / 2;
+
+ timestamp = ecore_time_get();
+
+ evas_event_feed_mouse_move(e, x, y, timestamp, NULL);
+ evas_event_feed_mouse_down(e, 1, EVAS_BUTTON_NONE, timestamp + 10, NULL);
+ evas_event_feed_mouse_move(e, x, y, timestamp + 15, NULL);
+ evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, timestamp + 20, NULL);
+
+ return EINA_TRUE;
+}
+
+static Eina_Bool activate_cb(void *part_name, Evas_Object *ao, Elm_Access_Action_Info *action_info)
+{
+ Eina_Bool ret;
+ Evas_Object *part_object;
+
+ part_object = evas_object_data_get(ao, "part,object");
+ if (!part_object) {
+ return EINA_FALSE;
+ }
+
+ if (part_name) {
+ ret = register_access_object_for_edje_part(part_object, part_name);
+ } else {
+ ret = make_clicked_event(part_object);
+ }
+
+ return ret;
+}
+
+static char *_access_tab_to_add_cb(void *data, Evas_Object *obj)
+{
+ char *tmp;
+
+ tmp = strdup(_("IDS_KM_BODY_DOUBLE_TAP_TO_ADD"));
+ if (!tmp) {
+ ErrPrint("tmp is not exist\n");
+ return NULL;
+ }
+
+ return tmp;
+}
+
+
+HAPI void winset_access_object_add(Evas_Object *parent, Evas_Object *layout, const char *size, const char *name)
+{
+ Evas_Object *ao;
+ Evas_Object *part;
+ char *text;
+ int len;
+
+ len = strlen(name) + (size ? strlen(size) : 0) + 2;
+ text = malloc(len);
+ if (!text) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return;
+ }
+
+ strcpy(text, name);
+
+ ao = evas_object_data_get(layout, "access,object");
+ if (ao) {
+ elm_access_info_set(ao, ELM_ACCESS_INFO, text);
+ free(text);
+ return;
+ }
+
+ Evas_Object *edje;
+ edje = elm_layout_edje_get(layout);
+ part = (Evas_Object *)edje_object_part_object_get(edje, "preview,dbg");
+ ao = elm_access_object_register(part, layout);
+ if (!ao) {
+ free(text);
+ return;
+ }
+
+ elm_access_info_set(ao, ELM_ACCESS_INFO, text);
+ free(text);
+
+ elm_access_info_set(ao, ELM_ACCESS_TYPE, _("IDS_IDLE_HEADER_WIDGET"));
+
+ elm_access_info_cb_set(ao, ELM_ACCESS_CONTEXT_INFO, _access_tab_to_add_cb, NULL);
+
+ elm_object_focus_custom_chain_append(layout, ao, NULL);
+
+ evas_object_data_set(ao, "part,object", layout);
+ evas_object_data_set(ao, "parent", parent);
+
+ elm_access_action_cb_set(ao, ELM_ACCESS_ACTION_ACTIVATE, activate_cb, NULL);
+
+ evas_object_data_set(layout, "access,object", ao);
+}
+
+static void _change_focus(Evas_Object *scroller, Evas_Object *focus_widget)
+{
+ Evas_Object *pre_focus = NULL;
+
+ pre_focus = evas_object_data_get(scroller, "focused");
+ if (pre_focus == focus_widget) return;
+
+ elm_object_signal_emit(focus_widget, "show", "line");
+ evas_object_data_set(scroller, "focused", focus_widget);
+
+ if (pre_focus && pre_focus != focus_widget) {
+ elm_object_signal_emit(pre_focus, "hide", "line");
+ }
+}
+
+static void _widget_scroll_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *box = data;
+ Evas_Object *scroller = obj;
+ Evas_Object *focus_widget = NULL;
+ Eina_List *list = NULL;
+ int h_page = 0;
+ Evas_Coord y;
+
+ DbgPrint("========== Widget Scroll CB is called (%p)\n", obj);
+
+ if (!scroller) {
+ ErrPrint("Failed to load the widget scroller\n");
+ return;
+ }
+
+ if (!box) {
+ return;
+ }
+
+ list = elm_box_children_get(box);
+ if (!list) {
+ return;
+ }
+
+ evas_object_geometry_get(box, NULL, &y, NULL, NULL);
+ y -= (ADD_VIEWER_PAGE_HEIGHT >> 1);
+ h_page = -(y / ADD_VIEWER_PAGE_HEIGHT);
+
+ focus_widget = eina_list_nth(list, h_page + 1);
+ eina_list_free(list);
+
+ if (!focus_widget) {
+ ErrPrint("Failed to get the focused page in scroller\n");
+ return;
+ }
+
+ _change_focus(scroller, focus_widget);
+}
+
+static int widget_data_setup(struct widget_data *widget_data, Evas_Object *parent)
+{
+ Evas_Object *box;
+
+ widget_data->parent = parent;
+
+ widget_data->bg = elm_layout_add(widget_data->parent);
+ if (!widget_data->bg) {
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ if (elm_layout_file_set(widget_data->bg, EDJE_FILE, "bg") != EINA_TRUE) {
+ evas_object_del(widget_data->bg);
+ widget_data->bg = NULL;
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ widget_data->scroller = elm_scroller_add(widget_data->parent);
+ if (!widget_data->scroller) {
+ evas_object_del(widget_data->bg);
+ widget_data->bg = NULL;
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ box = elm_box_add(widget_data->scroller);
+ if (!box) {
+ evas_object_del(widget_data->bg);
+ widget_data->bg = NULL;
+
+ evas_object_del(widget_data->scroller);
+ widget_data->scroller = NULL;
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ elm_box_horizontal_set(box, EINA_FALSE);
+ elm_box_homogeneous_set(box, EINA_FALSE);
+ evas_object_size_hint_fill_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_box_padding_set(box, ADD_VIEWER_PREVIEW_PAD_LEFT, ADD_VIEWER_PREVIEW_PAD_TOP);
+ elm_box_align_set(box, 0.0, 0.0);
+ evas_object_show(box);
+
+ elm_scroller_policy_set(widget_data->scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
+ elm_scroller_propagate_events_set(widget_data->scroller, EINA_TRUE);
+ elm_scroller_bounce_set(widget_data->scroller, EINA_FALSE, EINA_TRUE);
+ elm_object_style_set(widget_data->scroller, "effect");
+
+ elm_scroller_page_size_set(widget_data->scroller, ADD_VIEWER_PAGE_WIDTH, ADD_VIEWER_PAGE_HEIGHT);
+
+ elm_object_content_set(widget_data->scroller, box);
+
+ evas_object_smart_callback_add(widget_data->scroller, "scroll", _widget_scroll_cb, box);
+
+ evas_object_show(widget_data->scroller);
+ evas_object_show(widget_data->bg);
+
+ evas_object_smart_member_add(widget_data->bg, widget_data->add_viewer);
+ evas_object_clip_set(widget_data->bg, widget_data->stage);
+
+ evas_object_smart_member_add(widget_data->scroller, widget_data->add_viewer);
+ evas_object_clip_set(widget_data->scroller, widget_data->stage);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static void del_cb(void *data, Evas *e, Evas_Object *container, void *event_info)
+{
+ free(data);
+}
+
+static Eina_Bool long_press_cb(void *data)
+{
+ struct click *cbdata = data;
+ int x;
+ int y;
+
+ evas_object_geometry_get(cbdata->geo.obj, &x, &y, NULL, NULL);
+
+ if (cbdata->geo.x == x && cbdata->geo.y == y) {
+ const char *name;
+ Evas_Coord w;
+ Evas_Coord h;
+ struct add_viewer_event_info info = {
+ .pkg_info = {
+ .dbox_id = add_viewer_package_list_pkgname(cbdata->package),
+ .content = NULL,
+ .size_type = cbdata->size,
+ },
+ .move = {
+ .obj = NULL,
+ },
+ };
+
+ name = add_viewer_package_list_name(cbdata->package);
+
+ info.move.obj = winset_preview_add(cbdata->widget_data, cbdata->geo.obj, cbdata->package, name, cbdata->size, 1);
+ if (!info.move.obj) {
+ ErrPrint("Failed to create a preview object\n");
+ } else {
+ /* Register the DnD object to Click CB Data to move it from move function */
+ cbdata->dnd.obj = info.move.obj;
+
+ evas_object_smart_member_add(cbdata->dnd.obj, cbdata->widget_data->add_viewer);
+ evas_object_clip_set(cbdata->dnd.obj, cbdata->widget_data->stage);
+
+ elm_object_signal_emit(cbdata->geo.obj, "reset", "preview,dbg");
+
+ evas_object_hide(cbdata->widget_data->scroller);
+ evas_object_hide(cbdata->widget_data->bg);
+
+ evas_object_resize(cbdata->dnd.obj, 222, 336);
+ evas_object_geometry_get(cbdata->dnd.obj, NULL, NULL, &w, &h);
+
+ evas_object_move(cbdata->dnd.obj, cbdata->x - (w >> 1), cbdata->y - (h >> 1));
+
+ evas_object_smart_callback_call(cbdata->widget_data->add_viewer, "dnd", &info);
+
+ }
+ } else {
+ DbgPrint("Object is moved\n");
+ }
+
+ cbdata->long_press_timer = NULL;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void add_to_home_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ struct click *cbdata = data;
+ struct add_viewer_event_info info = {
+ .move = {
+ .obj = NULL,
+ },
+
+ .pkg_info = {
+ .dbox_id = add_viewer_package_list_pkgname(cbdata->package),
+ .content = NULL,
+ .size_type = cbdata->size,
+ .duplicated = add_viewer_package_is_skipped(cbdata->package),
+ .image = elm_object_part_content_unset(obj, "preview"),
+ }
+ };
+
+ evas_object_smart_callback_call(cbdata->widget_data->add_viewer, "selected", &info);
+
+ elm_access_say(_("IDS_TTS_BODY_ITEM_ADDED"));
+}
+
+static void preview_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ struct click *cbdata = data;
+ Evas_Event_Mouse_Down *down = event_info;
+
+ evas_object_geometry_get(obj, &cbdata->geo.x, &cbdata->geo.y, NULL, NULL);
+ cbdata->geo.obj = obj;
+
+ if (s_info.enable_dnd) {
+ int delay;
+ double fdelay;
+
+ delay = SYSTEM_SETTINGS_TAP_AND_HOLD_DELAY_SHORT; /* default 0.5 sec */
+ if (system_settings_get_value_int(SYSTEM_SETTINGS_KEY_TAP_AND_HOLD_DELAY, &delay) != 0) {
+ delay = SYSTEM_SETTINGS_TAP_AND_HOLD_DELAY_SHORT;
+ }
+
+ fdelay = ((double)delay / 1000.0f);
+ DbgPrint("Long press: %lf\n", fdelay);
+
+ cbdata->long_press_timer = ecore_timer_add(fdelay, long_press_cb, cbdata);
+ if (!cbdata->long_press_timer) {
+ ErrPrint("Failed to add timer\n");
+ }
+ }
+
+ cbdata->x = down->canvas.x;
+ cbdata->y = down->canvas.y;
+}
+
+static void preview_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ struct click *cbdata = data;
+
+ if (cbdata->long_press_timer) {
+ DbgPrint("Long press timer object found\n");
+ ecore_timer_del(cbdata->long_press_timer);
+ cbdata->long_press_timer = NULL;
+ add_to_home_cb(data, NULL, NULL, NULL);
+ } else {
+ if (cbdata->dnd.obj) {
+ add_to_home_cb(data, NULL, NULL, NULL);
+ evas_object_smart_member_del(cbdata->dnd.obj);
+ evas_object_del(cbdata->dnd.obj);
+ cbdata->dnd.obj = NULL;
+
+ evas_object_show(cbdata->widget_data->scroller);
+ evas_object_show(cbdata->widget_data->bg);
+ }
+ }
+ DbgPrint("Return\n");
+}
+
+static void preview_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ struct click *cbdata = data;
+ Evas_Event_Mouse_Move *move = event_info;
+ int dx;
+ int dy;
+ int x;
+ int y;
+
+ evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+
+ dx = move->cur.canvas.x - move->prev.canvas.x;
+ dy = move->cur.canvas.y - move->prev.canvas.y;
+
+ if ((abs(dx) > 5 || abs(dy) > 2 || cbdata->geo.x != x || cbdata->geo.y != y) && cbdata->long_press_timer) {
+ ecore_timer_del(cbdata->long_press_timer);
+ cbdata->long_press_timer = NULL;
+ }
+
+ cbdata->x = move->cur.canvas.x;
+ cbdata->y = move->cur.canvas.y;
+
+ if (cbdata->dnd.obj) {
+ Evas_Coord w;
+ Evas_Coord h;
+
+ evas_object_geometry_get(cbdata->dnd.obj, NULL, NULL, &w, &h);
+
+ evas_object_move(cbdata->dnd.obj, move->cur.canvas.x - (w >> 1), move->cur.canvas.y - (h >> 1));
+ }
+}
+
+static Evas_Object *winset_preview_add(struct widget_data *widget_data, Evas_Object *parent, struct add_viewer_package *package, const char *name, int type, int no_event)
+{
+ const char *size_str;
+ const char *icon_group;
+ Evas_Object *preview;
+ Evas_Object *thumbnail;
+ int w;
+ int h;
+ int ret;
+ int idx;
+ char *filename;
+ Evas_Object *bg;
+
+ filename = dynamicbox_service_preview(add_viewer_package_list_pkgname(package), type);
+
+ switch (type) {
+ case DBOX_SIZE_TYPE_1x1:
+ size_str = "preview,1x1";
+ icon_group = "default,1x1";
+ idx = 8;
+ break;
+ case DBOX_SIZE_TYPE_2x2:
+ size_str = "preview,2x2";
+ icon_group = "default,2x2";
+ idx = 8;
+ break;
+ case DBOX_SIZE_TYPE_2x1:
+ case DBOX_SIZE_TYPE_4x1:
+ case DBOX_SIZE_TYPE_4x2:
+ case DBOX_SIZE_TYPE_4x3:
+ case DBOX_SIZE_TYPE_4x4:
+ case DBOX_SIZE_TYPE_4x5:
+ case DBOX_SIZE_TYPE_4x6:
+ case DBOX_SIZE_TYPE_EASY_1x1:
+ case DBOX_SIZE_TYPE_EASY_3x1:
+ case DBOX_SIZE_TYPE_EASY_3x3:
+ default:
+ /* Unsupported */
+ free(filename);
+ return NULL;
+ }
+
+ preview = elm_layout_add(parent);
+ if (!preview) {
+ ErrPrint("Failed to add a new layout\n");
+ free(filename);
+ return NULL;
+ }
+
+ ret = elm_layout_file_set(preview, EDJE_FILE, size_str);
+ if (ret != EINA_TRUE) {
+ ErrPrint("Failed to load a layout file\n");
+ evas_object_del(preview);
+ free(filename);
+ return NULL;
+ }
+
+ bg = evas_object_rectangle_add(widget_data->e);
+ if (bg) {
+ elm_object_part_content_set(preview, "bg", bg);
+ bg_register_object(preview);
+ }
+
+ /* Load image */
+ if (filename) {
+ thumbnail = evas_object_image_filled_add(evas_object_evas_get(preview));
+ if (!thumbnail) {
+ ErrPrint("Failed to add an image\n");
+ evas_object_del(preview);
+ free(filename);
+ return NULL;
+ }
+
+ evas_object_image_file_set(thumbnail, filename, NULL);
+ ret = evas_object_image_load_error_get(thumbnail);
+ if (ret != EVAS_LOAD_ERROR_NONE) {
+ ErrPrint("Failed to set file: %s\n", filename);
+ evas_object_image_file_set(thumbnail, UNKNOWN_ICON, NULL);
+ ret = evas_object_image_load_error_get(thumbnail);
+ if (ret != EVAS_LOAD_ERROR_NONE) {
+ ErrPrint("Failed to set file: %s\n", UNKNOWN_ICON);
+ evas_object_del(thumbnail);
+ evas_object_del(preview);
+ free(filename);
+ return NULL;
+ }
+ }
+ evas_object_image_size_get(thumbnail, &w, &h);
+ evas_object_image_fill_set(thumbnail, 0, 0, w, h);
+ free(filename);
+ } else {
+ Evas_Object *icon_image;
+
+ filename = (char *)add_viewer_package_list_icon(package);
+ name = add_viewer_package_list_name(package);
+
+ DbgPrint("Image file: [%s] (%s)\n", filename, name);
+ icon_image = evas_object_image_filled_add(evas_object_evas_get(preview));
+ if (!icon_image) {
+ evas_object_del(preview);
+ return NULL;
+ }
+
+ evas_object_image_file_set(icon_image, filename, NULL);
+ ret = evas_object_image_load_error_get(icon_image);
+ if (ret != EVAS_LOAD_ERROR_NONE) {
+ evas_object_image_file_set(icon_image, UNKNOWN_ICON, NULL);
+ ret = evas_object_image_load_error_get(icon_image);
+ if (ret != EVAS_LOAD_ERROR_NONE) {
+ ErrPrint("Failed to set file\n");
+ evas_object_del(icon_image);
+ evas_object_del(preview);
+ return NULL;
+ }
+ }
+ evas_object_image_size_get(icon_image, &w, &h);
+ evas_object_image_fill_set(icon_image, 0, 0, w, h);
+ //evas_object_image_preload(icon_image, EINA_TRUE);
+
+ thumbnail = elm_layout_add(parent);
+ if (!thumbnail) {
+ evas_object_del(icon_image);
+ evas_object_del(preview);
+ ErrPrint("Failed to create a layout\n");
+ return NULL;
+ }
+
+ if (elm_layout_file_set(thumbnail, EDJE_FILE, icon_group) != EINA_TRUE) {
+ ErrPrint("Failed to load a file\n");
+ evas_object_del(icon_image);
+ evas_object_del(preview);
+ evas_object_del(thumbnail);
+ return NULL;
+ }
+
+ elm_object_part_content_set(thumbnail, "icon", icon_image);
+ elm_object_part_text_set(thumbnail, "text", name);
+ }
+
+ elm_object_part_content_set(preview, "preview", thumbnail);
+
+ if (!name) {
+ name = add_viewer_package_list_name(package);
+ }
+
+ elm_object_part_text_set(preview, "title", name);
+
+ DbgPrint("[%s] Image %dx%d\n", name, w, h);
+ edje_object_size_min_calc(elm_layout_edje_get(preview), &w, &h);
+ evas_object_size_hint_min_set(preview, w, h);
+ DbgPrint("[%s] Image min %dx%d\n", name, w, h);
+
+ if (!no_event) {
+ struct click *click_cbdata;
+
+ click_cbdata = calloc(1, sizeof(*click_cbdata));
+ if (!click_cbdata) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ evas_object_del(thumbnail);
+ evas_object_del(preview);
+ return NULL;
+ }
+
+ click_cbdata->package = package;
+ click_cbdata->size = type;
+ click_cbdata->widget_data = widget_data;
+ elm_object_signal_callback_add(preview, "clicked", "preview", add_to_home_cb, click_cbdata);
+ evas_object_event_callback_add(preview, EVAS_CALLBACK_MOUSE_DOWN, preview_down_cb, click_cbdata);
+ evas_object_event_callback_add(preview, EVAS_CALLBACK_MOUSE_MOVE, preview_move_cb, click_cbdata);
+ evas_object_event_callback_add(preview, EVAS_CALLBACK_MOUSE_UP, preview_up_cb, click_cbdata);
+ evas_object_event_callback_add(preview, EVAS_CALLBACK_DEL, del_cb, click_cbdata);
+
+ winset_access_object_add(parent, preview, size_str + idx, add_viewer_package_list_name(package));
+ }
+ elm_object_signal_emit(preview, "hide,im", "line");
+ elm_object_signal_emit(preview, add_viewer_package_is_skipped(package) ? "show" : "hide", "duplicated");
+ edje_object_message_signal_process(elm_layout_edje_get(preview));
+
+ evas_object_show(preview);
+ return preview;
+}
+
+HAPI Evas_Object *evas_object_add_viewer_add(Evas_Object *parent)
+{
+ struct widget_data *widget_data;
+ Evas_Object *add_viewer;
+ Evas *e;
+
+ if (!s_info.smart) {
+ s_info.sc.add = widget_add;
+ s_info.sc.del = widget_del;
+ s_info.sc.move = widget_move;
+ s_info.sc.resize = widget_resize;
+ s_info.sc.show = widget_show;
+ s_info.sc.hide = widget_hide;
+ s_info.sc.color_set = widget_color_set;
+ s_info.sc.clip_set = widget_clip_set;
+ s_info.sc.clip_unset = widget_clip_unset;
+
+ s_info.smart = evas_smart_class_new(&s_info.sc);
+ if (!s_info.smart) {
+ ErrPrint("Failed to create a new smart class\n");
+ return NULL;
+ }
+ }
+
+ e = evas_object_evas_get(parent);
+ if (!e) {
+ ErrPrint("Failed to get \"Evas\"\n");
+ return NULL;
+ }
+
+ /*
+ * Invoke widget_add callback
+ */
+ add_viewer = evas_object_smart_add(e, s_info.smart);
+ if (!add_viewer) {
+ ErrPrint("Failed to create a new object\n");
+ return NULL;
+ }
+
+ widget_data = evas_object_smart_data_get(add_viewer);
+ if (!widget_data) {
+ ErrPrint("Failed to get smart data\n");
+ evas_object_del(add_viewer);
+ return NULL;
+ }
+
+ if (widget_data_setup(widget_data, parent) < 0) {
+ ErrPrint("Failed to initiate the widget_data\n");
+ evas_object_del(add_viewer);
+ return NULL;
+ }
+
+ reload_list_cb(NULL, widget_data);
+
+ return add_viewer;
+}
+
+HAPI void evas_object_add_viewer_conf_set(int type, int flag)
+{
+ switch (type) {
+ case ADD_VIEWER_CONF_DND:
+ s_info.enable_dnd = flag;
+ break;
+ default:
+ break;
+ }
+}
+
+HAPI int evas_object_add_viewer_access_action(Evas_Object *obj, int type, void *info)
+{
+ struct widget_data *widget_data;
+
+ if (!evas_object_smart_type_check(obj, ADD_VIEWER_CLASS_NAME)) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ widget_data = evas_object_smart_data_get(obj);
+ if (!widget_data) {
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ elm_access_action(widget_data->scroller, type, info);
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+HAPI int evas_object_add_viewer_reload(void)
+{
+ Eina_List *l;
+ Eina_List *n;
+ struct widget_data *widget_data;
+
+ add_viewer_package_reload_name();
+
+ EINA_LIST_FOREACH_SAFE(s_info.add_viewer_list, l, n, widget_data) {
+ reload_list_cb(NULL, widget_data);
+ }
+
+ return 0;
+}
+
+/* End of a file */
diff --git a/home/src/add-viewer_package.c b/home/src/add-viewer_package.c
new file mode 100644
index 0000000..a06282e
--- /dev/null
+++ b/home/src/add-viewer_package.c
@@ -0,0 +1,890 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#include <Evas.h>
+#include <Eina.h>
+#include <dlog.h>
+
+#include <dynamicbox_service.h>
+#include <dynamicbox_errno.h>
+#include <ail.h>
+#if defined(CHECK_PRELOAD)
+#include <pkgmgr-info.h>
+#endif
+
+#if defined(LOG_TAG)
+#undef LOG_TAG
+#endif
+#define LOG_TAG "ADD_VIEWER"
+
+#include "add-viewer_package.h"
+#include "add-viewer_debug.h"
+#include "add-viewer_ucol.h"
+#include "add-viewer_pkgmgr.h"
+
+static struct info {
+ Eina_List *package_list;
+ Eina_List *event_list;
+ int initialized;
+} s_info = {
+ .package_list = NULL,
+ .event_list = NULL,
+ .initialized = 0,
+};
+
+struct package_list_event {
+ enum pkg_evt_type event;
+ struct add_viewer_package *package;
+ int (*cb)(struct add_viewer_package *package, void *data);
+ void *data;
+};
+
+struct add_viewer_preview {
+ int size_type;
+ void *data;
+};
+
+struct add_viewer_package {
+ enum {
+ PACKAGE_VALID = 0xbeefbeef,
+ PACKAGE_INVALID = 0xdeaddead,
+ } valid;
+
+ char *name; /*!< Display name */
+ char *pkgname; /*!< Package name */
+ char *icon;
+ int disabled;
+ int skipped;
+ char *pkgid;
+
+ struct {
+ char *key;
+ char *data;
+ } extra;
+
+ enum package_type type;
+ Eina_List *preview_list;
+
+ void *data;
+};
+
+static inline int sort_cb(const void *a, const void *b)
+{
+ int ret;
+
+ ret = add_viewer_ucol_compare(add_viewer_package_list_name((struct add_viewer_package *)a), add_viewer_package_list_name((struct add_viewer_package *)b));
+ return ret;
+}
+
+#if defined(CHECK_PRELOAD)
+static int is_preloaded(const char *pkgid)
+{
+ int ret;
+ bool preload;
+ pkgmgrinfo_pkginfo_h handle;
+
+ ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
+ if (ret != PMINFO_R_OK) {
+ return 0;
+ }
+
+ ret = pkgmgrinfo_pkginfo_is_preload(handle, &preload);
+ if (ret != PMINFO_R_OK) {
+ pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+ return 0;
+ }
+
+ pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+ return preload == true ? 1 : 0;
+}
+#endif
+
+static int load_name_and_icon(struct add_viewer_package *item)
+{
+ item->name = dynamicbox_service_i18n_name(item->pkgname, NULL);
+ item->icon = dynamicbox_service_i18n_icon(item->pkgname, NULL);
+ if (item->icon && access(item->icon, R_OK) != 0) {
+ char *new_icon;
+ ErrPrint("%s - %s\n", item->icon, strerror(errno));
+ new_icon = strdup(RESDIR"/image/unknown.png");
+ if (new_icon) {
+ free(item->icon);
+ item->icon = new_icon;
+ } else {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ }
+ }
+
+ if (!item->name || !item->icon) {
+ char *pkgname;
+ ail_appinfo_h ai;
+ int ret;
+
+ pkgname = dynamicbox_service_mainappid(item->pkgname);
+ if (!pkgname) {
+ ErrPrint("%s has no appid\n", item->pkgname);
+ return -EINVAL;
+ }
+
+ ret = ail_get_appinfo(pkgname, &ai);
+ free((char *)pkgname);
+
+ if (ret != AIL_ERROR_OK) {
+ ErrPrint("Failed to get appinfo: %s\n", add_viewer_package_list_pkgname(item));
+ if (!item->name) {
+ ret = add_viewer_package_list_set_name(item, add_viewer_package_list_pkgname(item));
+ if (ret != 0) {
+ return ret;
+ }
+ }
+
+ if (!item->icon) {
+ ret = add_viewer_package_list_set_icon(item, RESDIR"/image/unknown.png");
+ if (ret != 0) {
+ return ret;
+ }
+ }
+
+ s_info.package_list = eina_list_sorted_insert(s_info.package_list, sort_cb, item);
+ return 0;
+ }
+
+ if (!item->icon) {
+ char *icon;
+ ret = ail_appinfo_get_str(ai, AIL_PROP_ICON_STR, &icon);
+ if (ret != AIL_ERROR_OK || !icon || access(icon, R_OK) != 0) {
+ ErrPrint("%s - %s\n", icon, strerror(errno));
+ icon = RESDIR"/image/unknown.png";
+ }
+
+ ret = add_viewer_package_list_set_icon(item, icon);
+ if (ret != 0) {
+ ail_destroy_appinfo(ai);
+ return ret;
+ }
+ }
+
+ if (!item->name) {
+ char *name;
+ ret = ail_appinfo_get_str(ai, AIL_PROP_NAME_STR, &name);
+ if (ret != AIL_ERROR_OK || !name) {
+ name = item->pkgname;
+ }
+
+ ret = add_viewer_package_list_set_name(item, name);
+ if (ret != 0) {
+ ail_destroy_appinfo(ai);
+ return ret;
+ }
+ }
+
+ ail_destroy_appinfo(ai);
+ }
+
+ return 0;
+}
+
+static int dynamicbox_list_cb(const char *appid, const char *dbox_id, int is_prime, void *data)
+{
+ struct add_viewer_package *item;
+ int cnt;
+ int size_types[DBOX_NR_OF_SIZE_LIST];
+ int ret;
+ int valid_size;
+ struct add_viewer_preview *preview;
+ Eina_List *preview_list = NULL;
+
+ if (!dbox_id || !appid) {
+ ErrPrint("dbox_id(%p) appid(%p) is not valid", dbox_id, appid);
+ return 0;
+ }
+
+ if (dynamicbox_service_nodisplay(dbox_id) == 1) {
+ DbgPrint("NoDisplay: %s\n", dbox_id);
+ return 0;
+ }
+
+ cnt = DBOX_NR_OF_SIZE_LIST;
+ ret = dynamicbox_service_get_supported_size_types(dbox_id, &cnt, size_types);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ ErrPrint("Size is not valid: %s\n", dbox_id);
+ return 0;
+ }
+
+#if defined(CHECK_PRELOAD)
+ int preloaded = 0;
+ if (cnt > 0) {
+ /*!
+ * If there are small size box,
+ * we should check whether it is preloaded or not.
+ * If it is preloaded packages, we have not to display it on the list.
+ */
+ switch (size_types[0]) {
+ case DBOX_SIZE_TYPE_1x1:
+ case DBOX_SIZE_TYPE_2x1:
+ case DBOX_SIZE_TYPE_2x2:
+ preloaded = is_preloaded(appid);
+ break;
+ default:
+ break;
+ }
+ }
+#endif
+
+ valid_size = 0;
+ while (--cnt >= 0) {
+ preview = NULL;
+
+ switch (size_types[cnt]) {
+ case DBOX_SIZE_TYPE_1x1:
+ case DBOX_SIZE_TYPE_2x1:
+ case DBOX_SIZE_TYPE_2x2:
+#if defined(CHECK_PRELOAD)
+ if (preloaded) {
+ continue;
+ }
+#endif
+ case DBOX_SIZE_TYPE_4x1:
+ case DBOX_SIZE_TYPE_4x2:
+ case DBOX_SIZE_TYPE_4x3:
+ case DBOX_SIZE_TYPE_4x4:
+ case DBOX_SIZE_TYPE_4x5:
+ case DBOX_SIZE_TYPE_4x6:
+ preview = calloc(1, sizeof(*preview));
+ if (!preview) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ EINA_LIST_FREE(preview_list, preview) {
+ free(preview);
+ }
+ return -ENOMEM;
+ }
+
+ valid_size++;
+ preview->size_type = size_types[cnt];
+ preview->data = NULL;
+ preview_list = eina_list_append(preview_list, preview);
+ break;
+ case DBOX_SIZE_TYPE_EASY_1x1:
+ case DBOX_SIZE_TYPE_EASY_3x1:
+ case DBOX_SIZE_TYPE_EASY_3x3:
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (!valid_size) {
+ DbgPrint("Has no valid size: %s\n", dbox_id);
+ return 0;
+ }
+
+ item = calloc(1, sizeof(*item));
+ if (!item) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ EINA_LIST_FREE(preview_list, preview) {
+ free(preview);
+ }
+ return -ENOMEM;
+ }
+
+ item->pkgname = strdup(dbox_id);
+ if (!item->pkgname) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(item);
+ EINA_LIST_FREE(preview_list, preview) {
+ free(preview);
+ }
+ return -ENOMEM;
+ }
+
+ item->pkgid = strdup(appid);
+ if (!item->pkgid) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(item->pkgname);
+ free(item);
+ EINA_LIST_FREE(preview_list, preview) {
+ free(preview);
+ }
+ return -ENOMEM;
+ }
+
+ item->type = PACKAGE_TYPE_BOX;
+ item->preview_list = preview_list;
+ ret = load_name_and_icon(item);
+ if (ret < 0) {
+ free(item->pkgid);
+ free(item->name);
+ free(item->icon);
+ free(item->pkgname);
+ free(item);
+ EINA_LIST_FREE(preview_list, preview) {
+ free(preview);
+ }
+ return ret;
+ }
+ item->valid = PACKAGE_VALID;
+ s_info.package_list = eina_list_sorted_insert(s_info.package_list, sort_cb, item);
+ return 0;
+}
+
+static void invoke_update_event_callback(struct add_viewer_package *package)
+{
+ struct package_list_event *item;
+ Eina_List *l;
+ Eina_List *n;
+
+ EINA_LIST_FOREACH_SAFE(s_info.event_list, l, n, item) {
+ if (item->package == package && item->event == PACKAGE_LIST_EVENT_UPDATE) {
+ if (item->cb(package, item->data) < 0) {
+ s_info.event_list = eina_list_remove(s_info.event_list, item);
+ free(item);
+ }
+ }
+ }
+}
+
+static void invoke_del_event_callback(struct add_viewer_package *package)
+{
+ struct package_list_event *item;
+ Eina_List *l;
+ Eina_List *n;
+
+ EINA_LIST_FOREACH_SAFE(s_info.event_list, l, n, item) {
+ if (item->package == package && item->event == PACKAGE_LIST_EVENT_DEL) {
+ if (item->cb(package, item->data) < 0) {
+ s_info.event_list = eina_list_remove(s_info.event_list, item);
+ free(item);
+ }
+ }
+ }
+}
+
+static void invoke_reload_event_callback(void)
+{
+ struct package_list_event *item;
+ Eina_List *l;
+ Eina_List *n;
+
+ EINA_LIST_FOREACH_SAFE(s_info.event_list, l, n, item) {
+ if (item->event == PACKAGE_LIST_EVENT_RELOAD) {
+ if (item->cb(NULL, item->data) < 0) {
+ s_info.event_list = eina_list_remove(s_info.event_list, item);
+ free(item);
+ }
+ }
+ }
+}
+
+static void package_delete(struct add_viewer_package *package)
+{
+ struct add_viewer_preview *preview;
+
+ s_info.package_list = eina_list_remove(s_info.package_list, package);
+
+ DbgPrint("%s is deleted\n", package->pkgname);
+
+ free(package->name);
+ free(package->pkgid);
+ free(package->pkgname);
+ free(package->icon);
+ free(package->extra.key);
+ free(package->extra.data);
+
+ EINA_LIST_FREE(package->preview_list, preview) {
+ free(preview);
+ }
+
+ free(package);
+}
+
+static int dynamicbox_add_by_pkgid_cb(const char *dbox_id, int is_prime, void *data)
+{
+ Eina_List *l;
+ struct add_viewer_package *item;
+ int exists = 0;
+
+ DbgPrint("Add [%s]\n", dbox_id);
+
+ EINA_LIST_FOREACH(s_info.package_list, l, item) {
+ if (!strcmp(item->pkgname, dbox_id)) {
+ exists = 1;
+ break;
+ }
+ }
+
+ if (!exists) {
+ char *appid;
+
+ appid = dynamicbox_service_package_id(dbox_id);
+ if (appid) {
+ dynamicbox_list_cb(appid, dbox_id, is_prime, NULL);
+ free(appid);
+ }
+
+ EINA_LIST_FOREACH(s_info.package_list, l, item) {
+ if (!strcmp(item->pkgname, dbox_id)) {
+ invoke_update_event_callback(item);
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int dynamicbox_del_by_pkgid_cb(const char *dbox_id, int is_prime, void *data)
+{
+ Eina_List *l;
+ Eina_List *n;
+ struct add_viewer_package *item;
+
+ DbgPrint("Del [%s]\n", dbox_id);
+
+ EINA_LIST_FOREACH_SAFE(s_info.package_list, l, n, item) {
+ if (!strcmp(item->pkgname, dbox_id)) {
+ add_viewer_package_list_del(item);
+ break;
+ }
+ }
+
+ return 0;
+}
+
+static void dynamicbox_del_by_appid(const char *appid)
+{
+ Eina_List *l;
+ Eina_List *n;
+ struct add_viewer_package *item;
+
+ DbgPrint("Del [%s]\n", appid);
+ EINA_LIST_FOREACH_SAFE(s_info.package_list, l, n, item) {
+ if (!strcmp(item->pkgid, appid)) {
+ DbgPrint("> Del [%s]\n", item->pkgname);
+ add_viewer_package_list_del(item);
+ /**
+ * A pakcage can manage the several widgets
+ * So we have to clean them all up
+ * Don't break this loop until clear all of them.
+ */
+ }
+ }
+}
+
+static int pkgmgr_install_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
+{
+ if (status != PKGMGR_STATUS_END) {
+ return 0;
+ }
+
+ dynamicbox_service_get_pkglist_by_pkgid(pkgname, dynamicbox_add_by_pkgid_cb, NULL);
+
+ invoke_reload_event_callback();
+ return 0;
+}
+
+static int pkgmgr_uninstall_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
+{
+ if (status != PKGMGR_STATUS_START) {
+ return 0;
+ }
+
+ if (dynamicbox_service_get_pkglist_by_pkgid(pkgname, dynamicbox_del_by_pkgid_cb, NULL) <= 0) {
+ dynamicbox_del_by_appid(pkgname);
+ }
+
+ invoke_reload_event_callback();
+ return 0;
+}
+
+static int pkgmgr_update_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
+{
+ if (status == PKGMGR_STATUS_START) {
+ dynamicbox_service_get_pkglist_by_pkgid(pkgname, dynamicbox_del_by_pkgid_cb, NULL);
+ } else if (status == PKGMGR_STATUS_END) {
+ dynamicbox_service_get_pkglist_by_pkgid(pkgname, dynamicbox_add_by_pkgid_cb, NULL);
+ }
+
+ invoke_reload_event_callback();
+ return 0;
+}
+
+HAPI int add_viewer_package_init(void)
+{
+ int ret;
+ int cnt = 0;
+
+ if (s_info.initialized) {
+ return 0;
+ }
+
+ s_info.initialized = 1;
+
+ ret = add_viewer_pkgmgr_init();
+ if (ret != DBOX_STATUS_ERROR_NONE && ret != DBOX_STATUS_ERROR_ALREADY) {
+ ErrPrint("Failed to initialize the pkgmgr\n");
+ }
+
+ ret = dynamicbox_service_get_pkglist(dynamicbox_list_cb, NULL);
+ if (ret > 0) {
+ cnt += ret;
+ }
+
+ add_viewer_pkgmgr_add_event_callback(PKGMGR_EVENT_INSTALL, pkgmgr_install_cb, NULL);
+ add_viewer_pkgmgr_add_event_callback(PKGMGR_EVENT_UPDATE, pkgmgr_update_cb, NULL);
+ add_viewer_pkgmgr_add_event_callback(PKGMGR_EVENT_UNINSTALL, pkgmgr_uninstall_cb, NULL);
+
+ return 0;
+}
+
+HAPI int add_viewer_package_fini(void)
+{
+ struct add_viewer_package *item;
+ struct add_viewer_preview *preview;
+
+ if (!s_info.initialized) {
+ return 0;
+ }
+
+ add_viewer_pkgmgr_del_event_callback(PKGMGR_EVENT_INSTALL, pkgmgr_install_cb, NULL);
+ add_viewer_pkgmgr_del_event_callback(PKGMGR_EVENT_UPDATE, pkgmgr_update_cb, NULL);
+ add_viewer_pkgmgr_del_event_callback(PKGMGR_EVENT_UNINSTALL, pkgmgr_uninstall_cb, NULL);
+
+ s_info.initialized = 0;
+
+ EINA_LIST_FREE(s_info.package_list, item) {
+ free(item->name);
+ free(item->pkgid);
+ free(item->pkgname);
+ free(item->icon);
+ free(item->extra.key);
+ free(item->extra.data);
+
+ EINA_LIST_FREE(item->preview_list, preview) {
+ free(preview);
+ }
+
+ item->valid = PACKAGE_INVALID;
+ free(item);
+ }
+
+ (void)add_viewer_pkgmgr_fini();
+
+ return 0;
+}
+
+HAPI void *add_viewer_package_list_handle(void)
+{
+ return s_info.package_list;
+}
+
+HAPI struct add_viewer_package *add_viewer_package_list_item(void *handle)
+{
+ return eina_list_data_get(handle);
+}
+
+HAPI void *add_viewer_package_list_next(void *handle)
+{
+ handle = eina_list_next(handle);
+
+ if (!handle || s_info.package_list == handle) {
+ return NULL;
+ }
+
+ return handle;
+}
+
+HAPI void *add_viewer_package_list_prev(void *handle)
+{
+ if (!handle || handle == s_info.package_list) {
+ return NULL;
+ }
+
+ return eina_list_prev(handle);
+}
+
+HAPI int add_viewer_package_list_add_event_callback(struct add_viewer_package *package, int event, int (*cb)(struct add_viewer_package *package, void *data), void *data)
+{
+ struct package_list_event *item;
+
+ item = calloc(1, sizeof(*item));
+ if (!item) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return -ENOMEM;
+ }
+
+ item->event = event;
+ item->package = package;
+ item->cb = cb;
+ item->data = data;
+
+ s_info.event_list = eina_list_append(s_info.event_list, item);
+ return 0;
+}
+
+HAPI int add_viewer_package_list_del_event_callback(struct add_viewer_package *package, int event, int (*cb)(struct add_viewer_package *package, void *data), void *data)
+{
+ Eina_List *l;
+ Eina_List *n;
+ struct package_list_event *item;
+ int cnt = 0;
+
+ EINA_LIST_FOREACH_SAFE(s_info.event_list, l, n, item) {
+ if (item->package == package && item->cb == cb && item->data == data && item->event == event) {
+ cnt++;
+
+ s_info.event_list = eina_list_remove(s_info.event_list, item);
+ free(item);
+ }
+ }
+
+ return cnt > 0 ? 0 : -ENOENT;
+}
+
+HAPI void add_viewer_package_list_del(struct add_viewer_package *package)
+{
+ invoke_del_event_callback(package);
+ package_delete(package);
+}
+
+HAPI const char *add_viewer_package_list_name(struct add_viewer_package *package)
+{
+ return package->name;
+}
+
+HAPI const char *add_viewer_package_list_pkgname(struct add_viewer_package *package)
+{
+ return package->pkgname;
+}
+
+HAPI const char *add_viewer_package_list_icon(struct add_viewer_package *package)
+{
+ return package->icon;
+}
+
+HAPI int add_viewer_package_list_type(struct add_viewer_package *package)
+{
+ return package->type;
+}
+
+HAPI const char *add_viewer_package_list_extra_key(struct add_viewer_package *package)
+{
+ return package->extra.key;
+}
+
+HAPI const char *add_viewer_package_list_extra_data(struct add_viewer_package *package)
+{
+ return package->extra.data;
+}
+
+HAPI int add_viewer_package_is_valid(struct add_viewer_package *package)
+{
+ return package->valid == PACKAGE_VALID;
+}
+
+HAPI int add_viewer_package_list_set_name(struct add_viewer_package *package, const char *name)
+{
+ char *new_name;
+
+ if (name) {
+ new_name = strdup(name);
+ if (!new_name) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return -ENOMEM;
+ }
+ } else {
+ new_name = NULL;
+ }
+
+ if (package->name) {
+ free(package->name);
+ }
+
+ package->name = new_name;
+ return 0;
+}
+
+HAPI int add_viewer_package_list_set_pkgname(struct add_viewer_package *package, const char *pkgname)
+{
+ char *new_name;
+
+ if (pkgname) {
+ new_name = strdup(pkgname);
+ if (!new_name) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return -ENOMEM;
+ }
+ } else {
+ new_name = NULL;
+ }
+
+ if (package->pkgname) {
+ free(package->pkgname);
+ }
+
+ package->pkgname = new_name;
+ return 0;
+}
+
+HAPI int add_viewer_package_list_set_icon(struct add_viewer_package *package, const char *icon)
+{
+ char *new_name;
+
+ if (icon) {
+ new_name = strdup(icon);
+ if (!new_name) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return -ENOMEM;
+ }
+ } else {
+ new_name = NULL;
+ }
+
+ if (package->icon) {
+ free(package->icon);
+ }
+
+ package->icon = new_name;
+ return 0;
+}
+
+HAPI void *add_viewer_package_list_preview_list(struct add_viewer_package *package)
+{
+ return package->preview_list;
+}
+
+HAPI struct add_viewer_preview *add_viewer_package_list_preview(struct add_viewer_package *package, void *handle)
+{
+ return eina_list_data_get(handle);
+}
+
+HAPI void *add_viewer_package_list_preview_next(struct add_viewer_package *package, void *handle)
+{
+ handle = eina_list_next(handle);
+ if (!handle || handle == package->preview_list) {
+ return NULL;
+ }
+
+ return handle;
+}
+
+HAPI void *add_viewer_package_list_preview_prev(struct add_viewer_package *package, void *handle)
+{
+ if (!handle || handle == package->preview_list) {
+ return NULL;
+ }
+
+ handle = eina_list_prev(handle);
+ return handle;
+}
+
+HAPI int add_viewer_package_list_preview_size(struct add_viewer_preview *preview)
+{
+ return preview->size_type;
+}
+
+HAPI void *add_viewer_package_list_preview_data(struct add_viewer_preview *preview)
+{
+ return preview->data;
+}
+
+HAPI void add_viewer_package_list_preview_set_data(struct add_viewer_preview *preview, void *data)
+{
+ preview->data = data;
+}
+
+HAPI int add_viewer_package_is_disabled(struct add_viewer_package *package)
+{
+ return package->disabled;
+}
+
+HAPI void add_viewer_package_set_disabled(struct add_viewer_package *package, int flag)
+{
+ package->disabled = flag;
+}
+
+HAPI void add_viewer_package_set_skip(struct add_viewer_package *package, int skip)
+{
+ if (skip == 0) {
+ if (package->skipped > 0) {
+ package->skipped--;
+ }
+ } else {
+ package->skipped++;
+ }
+}
+
+HAPI int add_viewer_package_is_skipped(struct add_viewer_package *package)
+{
+ return package->skipped;
+}
+
+HAPI void *add_viewer_package_data(struct add_viewer_package *package)
+{
+ return package->data;
+}
+
+HAPI void add_viewer_package_set_data(struct add_viewer_package *package, void *data)
+{
+ package->data = data;
+}
+
+HAPI struct add_viewer_package *add_viewer_package_find(const char *dbox_id)
+{
+ Eina_List *l;
+ struct add_viewer_package *package;
+
+ EINA_LIST_FOREACH(s_info.package_list, l, package) {
+ if (!strcmp(package->pkgname, dbox_id)) {
+ return package;
+ }
+ }
+
+ return NULL;
+}
+
+HAPI int add_viewer_package_reload_name(void)
+{
+ char *name;
+ char *icon;
+ struct add_viewer_package *package;
+ Eina_List *new_list = NULL;
+
+ EINA_LIST_FREE(s_info.package_list, package) {
+ name = package->name;
+ icon = package->icon;
+ if (load_name_and_icon(package) < 0) {
+ ErrPrint("Unable to reload name: %s\n", package->pkgid);
+ package->name = name;
+ package->icon = icon;
+ } else {
+ free(name);
+ free(icon);
+ }
+
+ new_list = eina_list_sorted_insert(new_list, sort_cb, package);
+ }
+
+ s_info.package_list = new_list;
+ return 0;
+}
+
+/* End of a file */
diff --git a/home/src/add-viewer_pkgmgr.c b/home/src/add-viewer_pkgmgr.c
new file mode 100755
index 0000000..b5b5834
--- /dev/null
+++ b/home/src/add-viewer_pkgmgr.c
@@ -0,0 +1,639 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include <dlog.h>
+#include <package-manager.h>
+#include <dynamicbox_errno.h>
+
+#include <Ecore.h>
+#include <Ecore_X.h> /* util.h */
+#include <Evas.h> /* util.h */
+
+#include "add-viewer_package.h" /* util.h */
+#include "add-viewer_util.h"
+#include "add-viewer_debug.h"
+#include "add-viewer_pkgmgr.h"
+
+#define DbgFree(a) free(a)
+
+#if defined(LOG_TAG)
+#undef LOG_TAG
+#endif
+#define LOG_TAG "ADD_VIEWER"
+
+struct item {
+ char *pkgname;
+ char *icon;
+
+ enum pkgmgr_event_type type;
+ enum pkgmgr_status status;
+};
+
+static struct {
+ pkgmgr_client *listen_pc;
+ Eina_List *item_list;
+
+ Eina_List *install_event;
+ Eina_List *uninstall_event;
+ Eina_List *update_event;
+ Eina_List *download_event;
+ Eina_List *recover_event;
+} s_info = {
+ .listen_pc = NULL,
+ .item_list = NULL,
+
+ .install_event = NULL,
+ .uninstall_event = NULL,
+ .update_event = NULL,
+ .download_event = NULL,
+ .recover_event = NULL,
+};
+
+struct event_item {
+ int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data);
+ void *data;
+};
+
+static inline void invoke_install_event_handler(const char *pkgname, enum pkgmgr_status status, double value)
+{
+ Eina_List *l;
+ struct event_item *item;
+
+ EINA_LIST_FOREACH(s_info.install_event, l, item) {
+ if (item->cb) {
+ item->cb(pkgname, status, value, item->data);
+ }
+ }
+}
+
+static inline void invoke_uninstall_event_handler(const char *pkgname, enum pkgmgr_status status, double value)
+{
+ Eina_List *l;
+ struct event_item *item;
+
+ EINA_LIST_FOREACH(s_info.uninstall_event, l, item) {
+ if (item->cb) {
+ item->cb(pkgname, status, value, item->data);
+ }
+ }
+}
+
+static inline void invoke_update_event_handler(const char *pkgname, enum pkgmgr_status status, double value)
+{
+ Eina_List *l;
+ struct event_item *item;
+
+ EINA_LIST_FOREACH(s_info.update_event, l, item) {
+ if (item->cb) {
+ item->cb(pkgname, status, value, item->data);
+ }
+ }
+}
+
+static inline void invoke_download_event_handler(const char *pkgname, enum pkgmgr_status status, double value)
+{
+ Eina_List *l;
+ struct event_item *item;
+
+ EINA_LIST_FOREACH(s_info.download_event, l, item) {
+ if (item->cb) {
+ item->cb(pkgname, status, value, item->data);
+ }
+ }
+}
+
+static inline void invoke_recover_event_handler(const char *pkgname, enum pkgmgr_status status, double value)
+{
+ Eina_List *l;
+ struct event_item *item;
+
+ EINA_LIST_FOREACH(s_info.recover_event, l, item) {
+ if (item->cb) {
+ item->cb(pkgname, status, value, item->data);
+ }
+ }
+}
+
+static inline void invoke_callback(const char *pkgname, struct item *item, double value)
+{
+ switch (item->type) {
+ case PKGMGR_EVENT_DOWNLOAD:
+ invoke_download_event_handler(pkgname, item->status, value);
+ break;
+ case PKGMGR_EVENT_UNINSTALL:
+ invoke_uninstall_event_handler(pkgname, item->status, value);
+ break;
+ case PKGMGR_EVENT_INSTALL:
+ invoke_install_event_handler(pkgname, item->status, value);
+ break;
+ case PKGMGR_EVENT_UPDATE:
+ invoke_update_event_handler(pkgname, item->status, value);
+ break;
+ case PKGMGR_EVENT_RECOVER:
+ invoke_recover_event_handler(pkgname, item->status, value);
+ break;
+ default:
+ ErrPrint("Unknown type: %d\n", item->type);
+ break;
+ }
+}
+
+static inline int is_valid_status(struct item *item, const char *status)
+{
+ const char *expected_status;
+
+ switch (item->type) {
+ case PKGMGR_EVENT_DOWNLOAD:
+ expected_status = "download";
+ break;
+ case PKGMGR_EVENT_UNINSTALL:
+ expected_status = "uninstall";
+ break;
+ case PKGMGR_EVENT_INSTALL:
+ expected_status = "install";
+ break;
+ case PKGMGR_EVENT_UPDATE:
+ expected_status = "update";
+ break;
+ case PKGMGR_EVENT_RECOVER:
+ expected_status = "recover";
+ break;
+ default:
+ return 0;
+ }
+
+ return !strcasecmp(status, expected_status);
+}
+
+static struct item *find_item(const char *pkgname)
+{
+ Eina_List *l;
+ struct item *item;
+
+ if (!pkgname) {
+ ErrPrint("Package name is not valid\n");
+ return NULL;
+ }
+
+ EINA_LIST_FOREACH(s_info.item_list, l, item) {
+ if (strcmp(item->pkgname, pkgname)) {
+ continue;
+ }
+
+ return item;
+ }
+
+ DbgPrint("Package %s is not found\n", pkgname);
+ return NULL;
+}
+
+static int start_cb(const char *pkgname, const char *val, void *data)
+{
+ struct item *item;
+
+ DbgPrint("[%s] %s\n", pkgname, val);
+
+ item = calloc(1, sizeof(*item));
+ if (!item) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ item->pkgname = strdup(pkgname);
+ if (!item->pkgname) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ DbgFree(item);
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ item->status = PKGMGR_STATUS_START;
+
+ if (!strcasecmp(val, "download")) {
+ item->type = PKGMGR_EVENT_DOWNLOAD;
+ } else if (!strcasecmp(val, "uninstall")) {
+ item->type = PKGMGR_EVENT_UNINSTALL;
+ } else if (!strcasecmp(val, "install")) {
+ item->type = PKGMGR_EVENT_INSTALL;
+ } else if (!strcasecmp(val, "update")) {
+ item->type = PKGMGR_EVENT_UPDATE;
+ } else if (!strcasecmp(val, "recover")) {
+ item->type = PKGMGR_EVENT_RECOVER;
+ } else {
+ DbgFree(item->pkgname);
+ DbgFree(item);
+ ErrPrint("Invalid val: %s\n", val);
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ s_info.item_list = eina_list_append(s_info.item_list, item);
+
+ invoke_callback(pkgname, item, 0.0f);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int icon_path_cb(const char *pkgname, const char *val, void *data)
+{
+ struct item *item;
+
+ DbgPrint("[%s] %s\n", pkgname, val);
+
+ item = find_item(pkgname);
+ if (!item) {
+ return DBOX_STATUS_ERROR_NOT_EXIST;
+ }
+
+ if (item->icon) {
+ DbgFree(item->icon);
+ }
+
+ item->icon = strdup(val);
+ if (!item->icon) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int command_cb(const char *pkgname, const char *val, void *data)
+{
+ struct item *item;
+
+ DbgPrint("[%s] %s\n", pkgname, val);
+
+ item = find_item(pkgname);
+ if (!item) {
+ return DBOX_STATUS_ERROR_NOT_EXIST;
+ }
+
+ if (!is_valid_status(item, val)) {
+ DbgPrint("Invalid status: %d, %s\n", item->type, val);
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ item->status = PKGMGR_STATUS_COMMAND;
+ invoke_callback(pkgname, item, 0.0f);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int error_cb(const char *pkgname, const char *val, void *data)
+{
+ /* val = error */
+ struct item *item;
+
+ DbgPrint("[%s] %s\n", pkgname, val);
+
+ item = find_item(pkgname);
+ if (!item) {
+ return DBOX_STATUS_ERROR_NOT_EXIST;
+ }
+
+ item->status = PKGMGR_STATUS_ERROR;
+ invoke_callback(pkgname, item, 0.0f);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int change_pkgname_cb(const char *pkgname, const char *val, void *data)
+{
+ struct item *item;
+ char *new_pkgname;
+
+ DbgPrint("[%s] %s\n", pkgname, val);
+
+ item = find_item(pkgname);
+ if (!item) {
+ return DBOX_STATUS_ERROR_NOT_EXIST;
+ }
+
+ new_pkgname = strdup(val);
+ if (!new_pkgname) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ DbgFree(item->pkgname);
+ item->pkgname = new_pkgname;
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int download_cb(const char *pkgname, const char *val, void *data)
+{
+ /* val = integer */
+ struct item *item;
+ double value;
+
+ DbgPrint("[%s] %s\n", pkgname, val);
+
+ item = find_item(pkgname);
+ if (!item) {
+ DbgPrint("ITEM is not started from the start_cb\n");
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ if (item->type != PKGMGR_EVENT_DOWNLOAD) {
+ DbgPrint("TYPE is not \"download\" : %d\n", item->type);
+ item->type = PKGMGR_EVENT_DOWNLOAD;
+ }
+
+ switch (item->status) {
+ case PKGMGR_STATUS_START:
+ case PKGMGR_STATUS_COMMAND:
+ item->status = PKGMGR_STATUS_PROCESSING;
+ case PKGMGR_STATUS_PROCESSING:
+ break;
+ default:
+ ErrPrint("Invalid state [%s, %s]\n", pkgname, val);
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ if (val) {
+ if (sscanf(val, "%lf", &value) != 1) {
+ value = (double)DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+ } else {
+ value = (double)DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ invoke_download_event_handler(pkgname, item->status, value);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int progress_cb(const char *pkgname, const char *val, void *data)
+{
+ /* val = integer */
+ struct item *item;
+ double value;
+
+ DbgPrint("[%s] %s\n", pkgname, val);
+
+ item = find_item(pkgname);
+ if (!item) {
+ ErrPrint("ITEM is not started from the start_cb\n");
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ switch (item->status) {
+ case PKGMGR_STATUS_START:
+ case PKGMGR_STATUS_COMMAND:
+ item->status = PKGMGR_STATUS_PROCESSING;
+ case PKGMGR_STATUS_PROCESSING:
+ break;
+ default:
+ ErrPrint("Invalid state [%s, %s]\n", pkgname, val);
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ if (val) {
+ if (sscanf(val, "%lf", &value) != 1) {
+ value = (double)DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+ } else {
+ value = (double)DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ invoke_callback(pkgname, item, value);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int end_cb(const char *pkgname, const char *val, void *data)
+{
+ struct item *item;
+
+ DbgPrint("[%s] %s\n", pkgname, val);
+
+ item = find_item(pkgname);
+ if (!item) {
+ return DBOX_STATUS_ERROR_NOT_EXIST;
+ }
+
+ item->status = !strcasecmp(val, "ok") ? PKGMGR_STATUS_END : PKGMGR_STATUS_ERROR;
+
+ invoke_callback(pkgname, item, 0.0f);
+
+ s_info.item_list = eina_list_remove(s_info.item_list, item);
+ DbgFree(item->icon);
+ DbgFree(item->pkgname);
+ DbgFree(item);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static struct pkgmgr_handler {
+ const char *key;
+ int (*func)(const char *package, const char *val, void *data);
+} handler[] = {
+ { "install_percent", progress_cb },
+ { "download_percent", download_cb },
+ { "start", start_cb },
+ { "end", end_cb },
+ { "change_pkg_name", change_pkgname_cb },
+ { "icon_path", icon_path_cb },
+ { "command", command_cb },
+ { "error", error_cb },
+ { NULL, NULL },
+};
+
+static int pkgmgr_cb(int req_id, const char *type, const char *pkgname, const char *key, const char *val, const void *pmsg, void *data)
+{
+ register int i;
+ int ret;
+
+ for (i = 0; handler[i].key; i++) {
+ if (strcasecmp(key, handler[i].key)) {
+ continue;
+ }
+
+ ret = handler[i].func(pkgname, val, data);
+ if (ret < 0) {
+ DbgPrint("REQ[%d] pkgname[%s], type[%s], key[%s], val[%s], ret = %d\n",
+ req_id, pkgname, type, key, val, ret);
+ }
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+HAPI int add_viewer_pkgmgr_init(void)
+{
+ if (s_info.listen_pc) {
+ return DBOX_STATUS_ERROR_ALREADY;
+ }
+
+ s_info.listen_pc = pkgmgr_client_new(PC_LISTENING);
+ if (!s_info.listen_pc) {
+ ErrPrint("Failed to client_new\n");
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ if (pkgmgr_client_listen_status(s_info.listen_pc, pkgmgr_cb, NULL) != PKGMGR_R_OK) {
+ ErrPrint("Failed to add listener\n");
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+HAPI int add_viewer_pkgmgr_fini(void)
+{
+ struct event_item *item;
+ struct item *ctx;
+
+ if (!s_info.listen_pc) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ if (pkgmgr_client_free(s_info.listen_pc) != PKGMGR_R_OK) {
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ s_info.listen_pc = NULL;
+
+ EINA_LIST_FREE(s_info.download_event, item) {
+ DbgFree(item);
+ }
+
+ EINA_LIST_FREE(s_info.uninstall_event, item) {
+ DbgFree(item);
+ }
+
+ EINA_LIST_FREE(s_info.install_event, item) {
+ DbgFree(item);
+ }
+
+ EINA_LIST_FREE(s_info.update_event, item) {
+ DbgFree(item);
+ }
+
+ EINA_LIST_FREE(s_info.recover_event, item) {
+ DbgFree(item);
+ }
+
+ EINA_LIST_FREE(s_info.item_list, ctx) {
+ DbgFree(ctx->pkgname);
+ DbgFree(ctx->icon);
+ DbgFree(ctx);
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+HAPI int add_viewer_pkgmgr_add_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data)
+{
+ struct event_item *item;
+
+ item = calloc(1, sizeof(*item));
+ if (!item) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ item->cb = cb;
+ item->data = data;
+
+ switch (type) {
+ case PKGMGR_EVENT_DOWNLOAD:
+ s_info.download_event = eina_list_prepend(s_info.download_event, item);
+ break;
+ case PKGMGR_EVENT_UNINSTALL:
+ s_info.uninstall_event = eina_list_prepend(s_info.uninstall_event, item);
+ break;
+ case PKGMGR_EVENT_INSTALL:
+ s_info.install_event = eina_list_prepend(s_info.install_event, item);
+ break;
+ case PKGMGR_EVENT_UPDATE:
+ s_info.update_event = eina_list_prepend(s_info.update_event, item);
+ break;
+ case PKGMGR_EVENT_RECOVER:
+ s_info.recover_event = eina_list_prepend(s_info.recover_event, item);
+ break;
+ default:
+ DbgFree(item);
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+HAPI void *add_viewer_pkgmgr_del_event_callback(enum pkgmgr_event_type type, int (*cb)(const char *pkgname, enum pkgmgr_status status, double value, void *data), void *data)
+{
+ struct event_item *item;
+ Eina_List *l;
+ void *cbdata = NULL;
+
+ switch (type) {
+ case PKGMGR_EVENT_DOWNLOAD:
+ EINA_LIST_FOREACH(s_info.download_event, l, item) {
+ if (item->cb == cb && item->data == data) {
+ s_info.download_event = eina_list_remove(s_info.download_event, item);
+ cbdata = item->data;
+ DbgFree(item);
+ break;
+ }
+ }
+ break;
+ case PKGMGR_EVENT_UNINSTALL:
+ EINA_LIST_FOREACH(s_info.uninstall_event, l, item) {
+ if (item->cb == cb && item->data == data) {
+ s_info.uninstall_event = eina_list_remove(s_info.uninstall_event, item);
+ cbdata = item->data;
+ DbgFree(item);
+ break;
+ }
+ }
+ break;
+ case PKGMGR_EVENT_INSTALL:
+ EINA_LIST_FOREACH(s_info.install_event, l, item) {
+ if (item->cb == cb && item->data == data) {
+ s_info.install_event = eina_list_remove(s_info.install_event, item);
+ cbdata = item->data;
+ DbgFree(item);
+ break;
+ }
+ }
+ break;
+ case PKGMGR_EVENT_UPDATE:
+ EINA_LIST_FOREACH(s_info.update_event, l, item) {
+ if (item->cb == cb && item->data == data) {
+ s_info.update_event = eina_list_remove(s_info.update_event, item);
+ cbdata = item->data;
+ DbgFree(item);
+ break;
+ }
+ }
+ break;
+ case PKGMGR_EVENT_RECOVER:
+ EINA_LIST_FOREACH(s_info.recover_event, l, item) {
+ if (item->cb == cb && item->data == data) {
+ s_info.recover_event = eina_list_remove(s_info.recover_event, item);
+ cbdata = item->data;
+ DbgFree(item);
+ break;
+ }
+ }
+ break;
+ default:
+ ErrPrint("Invalid type\n");
+ break;
+ }
+
+ return cbdata;
+}
+
+/* End of a file */
diff --git a/home/src/add-viewer_ucol.c b/home/src/add-viewer_ucol.c
new file mode 100755
index 0000000..b49671d
--- /dev/null
+++ b/home/src/add-viewer_ucol.c
@@ -0,0 +1,785 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define _GNU_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+
+#include <ctype.h>
+
+#include <Eina.h>
+#include <dlog.h>
+#include <Ecore_X.h>
+#include <Evas.h>
+
+#include <unicode/ucol.h>
+#include <unicode/ustring.h>
+#include <unicode/usearch.h>
+
+#include "add-viewer_debug.h"
+#include "add-viewer_ucol.h"
+#include "add-viewer_package.h"
+#include "add-viewer_util.h"
+
+#if defined(LOG_TAG)
+#undef LOG_TAG
+#endif
+#define LOG_TAG "ADD_VIEWER"
+
+static struct info {
+ UCollator *coll;
+ enum LANGUAGE lang;
+ char *env_lang;
+} s_info = {
+ .coll = NULL,
+ .lang = LANG_ENGLISH,
+ .env_lang = NULL,
+};
+
+HAPI int add_viewer_ucol_init(void)
+{
+ const char *env;
+ UErrorCode status = U_ZERO_ERROR;
+
+ env = getenv("LANG");
+ if (env) {
+ if (!strcasecmp(env, "en_US.utf-8")) {
+ s_info.lang = LANG_ENGLISH;
+ s_info.env_lang = "en_US.utf-8";
+ } else if (!strcasecmp(env, "ja_JP.utf-8")) {
+ s_info.lang = LANG_JAPANESS;
+ s_info.env_lang = "ja_JP.utf-8";
+ } else if (!strcasecmp(env, "ko_KR.utf-8")) {
+ s_info.lang = LANG_KOREAN;
+ s_info.env_lang = "ko_KR.utf-8";
+ }
+ }
+
+ s_info.coll = ucol_open(NULL, &status);
+ if (U_FAILURE(status)) {
+ ErrPrint("Failed to open ucol (%d)\n", status);
+ ucol_close(s_info.coll);
+ s_info.coll = NULL;
+ }
+
+ status = U_ZERO_ERROR;
+ ucol_setAttribute(s_info.coll, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
+ if (U_FAILURE(status)) {
+ ErrPrint("Failed to open ucol (%d)\n", status);
+ ucol_close(s_info.coll);
+ s_info.coll = NULL;
+ }
+
+ ucol_setStrength(s_info.coll, UCOL_PRIMARY);
+ return 0;
+}
+
+static inline UChar *to_UTF16(const char *src, int *out_len)
+{
+ UChar *res;
+ UErrorCode status = U_ZERO_ERROR;
+ int len;
+
+ u_strFromUTF8(NULL, 0, &len, src, -1, &status);
+
+ res = malloc((len + 1) * sizeof(*res));
+ if (!res) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ status = U_ZERO_ERROR;
+ u_strFromUTF8(res, len + 1, &len, src, -1, &status);
+ if (U_FAILURE(status)) {
+ ErrPrint("Unable to convert(%s) to UTF16(%s)\n", src, u_errorName(status));
+ free(res);
+ return NULL;
+ }
+ res[len] = (UChar)0;
+
+ if (out_len) {
+ *out_len = len;
+ }
+ return res;
+}
+
+static inline char *to_UTF8(UChar *src, int *out_len)
+{
+ char *res;
+ UErrorCode status = U_ZERO_ERROR;
+ int len;
+
+ u_strToUTF8(NULL, 0, &len, src, -1, &status);
+
+ res = malloc((len + 1) * sizeof(*res));
+ if (!res) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ status = U_ZERO_ERROR;
+ u_strToUTF8(res, len + 1, &len, src, -1, &status);
+ if (U_FAILURE(status)) {
+ ErrPrint("Unable to convert to UTF8(%s)\n", u_errorName(status));
+ free(res);
+ return NULL;
+ }
+ res[len] = '\0';
+
+ if (out_len) {
+ *out_len = len;
+ }
+
+ return res;
+}
+
+static inline int hangul_to_jamo(const char *index)
+{
+ Eina_Unicode *ret;
+ Eina_Unicode tmp = 0;
+ int base = 0xAC00;
+ int last = 0xD79F;
+ int a;
+ static int table[] = {
+ 0x00003131, 0x00003131,
+ 0x00003134,
+ 0x00003137, 0x00003137,
+ 0x00003139,
+ 0x00003141,
+ 0x00003142, 0x00003142,
+ 0x00003145, 0x00003145,
+ 0x00003147,
+ 0x00003148, 0x00003148,
+ 0x0000314a,
+ 0x0000314b,
+ 0x0000314c,
+ 0x0000314d,
+ 0x0000314e,
+ /*
+ 0xb184e3, 0xb284e3, 0xb484e3, 0xb784e3, 0xb884e3, 0xb984e3,
+ 0x8185e3, 0x8285e3, 0x8385e3, 0x8585e3, 0x8685e3, 0x8785e3,
+ 0x8885e3, 0x8985e3, 0x8a85e3, 0x8b85e3, 0x8c85e3, 0x8d85e3,
+ 0x8e85e3,
+ */
+ };
+
+ ret = eina_unicode_utf8_to_unicode(index, &a);
+ if (ret) {
+ tmp = *ret;
+ free(ret);
+ }
+
+ if (tmp < base || tmp > last) {
+ return tmp;
+ }
+
+ tmp = tmp - base;
+ a = tmp / (21 * 28);
+ return table[a];
+}
+
+#define __isalpha(a) (((a) >= 'a' && (a) <= 'z') || ((a) >= 'A' && (a) <= 'Z'))
+#define __tolower(a) (((a) >= 'A' && (a) <= 'Z') ? (a) + 32 : (a))
+
+HAPI int add_viewer_ucol_compare_first_letters(const char *name, const char *letters)
+{
+ if (!letters) {
+ ErrPrint("letter is NULL");
+ return -1;
+ }
+
+ if (s_info.lang == LANG_KOREAN) {
+ int jamo_name;
+ int jamo_letters = 0;
+ Eina_Unicode *ucs;
+
+ jamo_name = hangul_to_jamo(name);
+
+ ucs = eina_unicode_utf8_to_unicode(letters, &jamo_letters);
+ if (ucs) {
+ jamo_letters = (int)*ucs;
+ free(ucs);
+ }
+
+ if (__isalpha(jamo_letters)) {
+ if (!__isalpha(jamo_name)) {
+ //DbgPrint("%d - %d (%s, %s)\n", jamo_name, jamo_letters, name, letters);
+ return -1;
+ }
+
+ return __tolower(jamo_name) - __tolower(jamo_letters);
+ }
+
+ return jamo_name - jamo_letters;
+ }
+
+ return add_viewer_ucol_ncompare(name, letters, strlen(letters));
+}
+
+HAPI int add_viewer_ucol_is_alpha(const char *name)
+{
+ Eina_Unicode *ucs;
+ int len;
+ int letter = 0;
+
+ ucs = eina_unicode_utf8_to_unicode(name, &len);
+ if (ucs) {
+ letter = (int)*ucs;
+ free(ucs);
+ }
+
+ return __isalpha(letter);
+}
+
+HAPI int add_viewer_ucol_detect_lang(int ch)
+{
+// int result;
+ int lang;
+// int status;
+// int size;
+
+ /*
+ u_strToUpper((UChar *)&ch, 1, (UChar *)&result, -1, NULL, &status);
+ if (U_FAILURE(status)) {
+ ErrPrint("u_strToLower: %s\n", u_errorName(status));
+ return LANG_UNKNOWN;
+ }
+
+ size = unorm_normalize((UChar *)&result, 1, UNORM_NFD, 0, (UChar *)&result, 1, &status);
+ if (U_FAILURE(status)) {
+ ErrPrint("unorm_normalize: %s\n", u_errorName(status));
+ return LANG_UNKNOWN;
+ }
+ */
+
+ lang = ublock_getCode(ch);
+ switch (lang) {
+ case UBLOCK_HIRAGANA:
+ case UBLOCK_KATAKANA:
+ case UBLOCK_KATAKANA_PHONETIC_EXTENSIONS:
+ case UBLOCK_JAVANESE:
+ case UBLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS:
+ lang = LANG_JAPANESS;
+ break;
+ case UBLOCK_HANGUL_JAMO:
+ case UBLOCK_HANGUL_COMPATIBILITY_JAMO:
+ case UBLOCK_HANGUL_SYLLABLES:
+ case UBLOCK_HANGUL_JAMO_EXTENDED_A:
+ case UBLOCK_HANGUL_JAMO_EXTENDED_B:
+ lang = LANG_KOREAN;
+ break;
+ case UBLOCK_BASIC_LATIN: // = 1, /*[0000]*/
+ case UBLOCK_LATIN_1_SUPPLEMENT: // =2, /*[0080]*/
+ case UBLOCK_LATIN_EXTENDED_A: // =3, /*[0100]*/
+ case UBLOCK_LATIN_EXTENDED_B: // =4, /*[0180]*/
+ case UBLOCK_LATIN_EXTENDED_ADDITIONAL: // =38, /*[1E00]*/
+ lang = LANG_ENGLISH;
+ break;
+ case UBLOCK_CJK_RADICALS_SUPPLEMENT: //=58, /*[2E80]*/
+ case UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION: //=61, /*[3000]*/
+ case UBLOCK_ENCLOSED_CJK_LETTERS_AND_MONTHS: //=68, /*[3200]*/
+ case UBLOCK_CJK_STROKES: // =130, /*[31C0]*/
+ case UBLOCK_CJK_COMPATIBILITY: // =69, /*[3300]*/
+ case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A: //=70, /*[3400]*/
+ case UBLOCK_CJK_UNIFIED_IDEOGRAPHS: //=71, /*[4E00]*/
+ case UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS: //=79, /*[F900]*/
+ case UBLOCK_CJK_COMPATIBILITY_FORMS: //=83, /*[FE30]*/
+ case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B : // =94, /*[20000]*/
+ case UBLOCK_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT: // =95, /*[2F800]*/
+ case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C: // =197, /*[2A700]*/
+ case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D: // =209, /*[2B740]*/
+ lang = LANG_CHINESS;
+ break;
+ default:
+ DbgPrint("Detected unknown: %d\n", lang);
+ lang = LANG_UNKNOWN;
+ break;
+ }
+
+ return lang;
+}
+
+static char *ucol_toupper(const char *haystack)
+{
+ UChar *_haystack;
+ UChar *u_haystack;
+ int haystack_len;
+ UErrorCode status = U_ZERO_ERROR;
+ int ret;
+ char *utf8_ret;
+
+ u_haystack = to_UTF16(haystack, &haystack_len);
+ if (!u_haystack) {
+ // Error will be printed by to_UTF16
+ return NULL;
+ }
+
+ haystack_len = u_strToUpper(NULL, 0, u_haystack, -1, NULL, &status);
+
+ _haystack = malloc(sizeof(*_haystack) * (haystack_len + 1));
+ if (!_haystack) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(u_haystack);
+ return NULL;
+ }
+
+ //ret = u_strFoldCase((UChar *)_haystack, haystack_len, (UChar *)haystack, -1, U_FOLD_CASE_DEFAULT, &status);
+ status = U_ZERO_ERROR;
+ ret = u_strToUpper(_haystack, haystack_len + 1, u_haystack, -1, NULL, &status);
+ free(u_haystack);
+ if (U_FAILURE(status)) {
+ ErrPrint("upper: %s\n", u_errorName(status));
+ free(_haystack);
+ return NULL;
+ }
+
+ utf8_ret = to_UTF8(_haystack, &ret);
+ free(_haystack);
+
+ return utf8_ret;
+}
+
+HAPI int add_viewer_ucol_case_ncompare(const char *src, const char *dest, int len)
+{
+ char *_src;
+ char *_dest;
+ int ret;
+
+ if (!src || !dest || len <= 0) {
+ return -EINVAL;
+ }
+
+ if (!s_info.coll) {
+ ErrPrint("Fallback to strncasecmp\n");
+ return strncasecmp(src, dest, len);
+ }
+
+ _src = ucol_toupper(src);
+ if (!_src) {
+ return -EFAULT;
+ }
+
+ _dest = ucol_toupper(dest);
+ if (!_dest) {
+ free(_src);
+ return -EFAULT;
+ }
+
+ ret = add_viewer_ucol_ncompare(_src, _dest, len);
+
+ free(_src);
+ free(_dest);
+ return ret;
+}
+
+HAPI int add_viewer_ucol_ncompare(const char *src, const char *dest, int len)
+{
+ UChar *src_uni;
+ UChar *dest_uni;
+ UCollationResult res;
+ int32_t dest_len;
+ int32_t src_len;
+ char *tmp;
+
+ if (!src || !dest || len <= 0) {
+ return -EINVAL;
+ }
+
+ if (!s_info.coll) {
+ ErrPrint("Fallback to strcmp\n");
+ return strncmp(src, dest, len);
+ }
+
+ tmp = malloc(len + 1);
+ if (!tmp) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return strncmp(src, dest, len);
+ }
+ strncpy(tmp, dest, len);
+ tmp[len] = '\0';
+
+ /* To get the ucs16 len */
+ src_uni = to_UTF16(tmp, &len);
+ free(tmp);
+ if (!src_uni) {
+ ErrPrint("Failed get utf16\n");
+ return strncmp(src, dest, len);
+ }
+ free(src_uni);
+
+ src_uni = to_UTF16(src, &src_len);
+ if (!src_uni) {
+ ErrPrint("SRC: Failed to convert to UTF16\n");
+ return strncmp(src, dest, len);
+ }
+
+ dest_uni = to_UTF16(dest, &dest_len);
+ if (!dest_uni) {
+ ErrPrint("DEST: Failed to convert to UTF16\n");
+ free(src_uni);
+ return strncmp(src, dest, len);
+ }
+
+ switch (s_info.lang) {
+ case LANG_JAPANESS:
+ if (__isalpha(*src_uni) && !__isalpha(*dest_uni)) {
+ res = UCOL_GREATER;
+ } else if (!__isalpha(*src_uni) && __isalpha(*dest_uni)) {
+ res = UCOL_LESS;
+ } else {
+ int src_lang;
+ int dest_lang;
+
+ src_lang = add_viewer_ucol_detect_lang(*src_uni);
+ dest_lang = add_viewer_ucol_detect_lang(*dest_uni);
+
+ if (src_lang == LANG_JAPANESS && dest_lang != LANG_JAPANESS) {
+ res = UCOL_LESS;
+ } else if (src_lang != LANG_JAPANESS && dest_lang == LANG_JAPANESS) {
+ res = UCOL_GREATER;
+ } else {
+ res = ucol_strcoll(s_info.coll, (UChar *)src_uni, len, (UChar *)dest_uni, len);
+ }
+ }
+ break;
+ case LANG_KOREAN:
+ if (__isalpha(*src_uni) && !__isalpha(*dest_uni)) {
+ res = UCOL_GREATER;
+ } else if (!__isalpha(*src_uni) && __isalpha(*dest_uni)) {
+ res = UCOL_LESS;
+ } else {
+ int src_lang;
+ int dest_lang;
+
+ src_lang = add_viewer_ucol_detect_lang(*src_uni);
+ dest_lang = add_viewer_ucol_detect_lang(*dest_uni);
+
+ if (src_lang == LANG_KOREAN && dest_lang != LANG_KOREAN) {
+ res = UCOL_LESS;
+ } else if (src_lang != LANG_KOREAN && dest_lang == LANG_KOREAN) {
+ res = UCOL_GREATER;
+ } else {
+ res = ucol_strcoll(s_info.coll, (UChar *)src_uni, len, (UChar *)dest_uni, len);
+ }
+ }
+ break;
+ case LANG_ENGLISH:
+ default:
+ /*
+ if (__isalpha(*src_uni) && !__isalpha(*dest_uni)) {
+ res = UCOL_LESS;
+ } else if (!__isalpha(*src_uni) && __isalpha(*dest_uni)) {
+ res = UCOL_GREATER;
+ } else {
+ */
+ res = ucol_strcoll(s_info.coll, (UChar *)src_uni, len, (UChar *)dest_uni, len);
+ /*
+ }
+ */
+ }
+
+ free(src_uni);
+ free(dest_uni);
+
+ switch (res) {
+ case UCOL_LESS:
+ return -1;
+
+ case UCOL_EQUAL:
+ return 0;
+
+ case UCOL_GREATER:
+ return 1;
+
+ default:
+ DbgPrint("%s ? %s\n", src, dest);
+ return 0;
+ }
+}
+
+HAPI int add_viewer_ucol_case_compare(const char *src, const char *dest)
+{
+ char *_src;
+ char *_dest;
+ int ret;
+
+ if (!src || !dest) {
+ return -EINVAL;
+ }
+
+ if (!s_info.coll) {
+ ErrPrint("Fallback to strcasecmp\n");
+ return strcasecmp(src, dest);
+ }
+
+ _src = ucol_toupper(src);
+ if (!_src) {
+ return -EFAULT;
+ }
+
+ _dest = ucol_toupper(dest);
+ if (!_dest) {
+ free(_src);
+ return -EFAULT;
+ }
+
+ ret = add_viewer_ucol_compare(_src, _dest);
+ free(_src);
+ free(_dest);
+ return ret;
+}
+
+HAPI int add_viewer_ucol_compare(const char *src, const char *dest)
+{
+ UChar *src_uni;
+ UChar *dest_uni;
+ UCollationResult res;
+ int32_t dest_len;
+ int32_t src_len;
+ int len;
+
+ if (!src || !dest) {
+ return -EINVAL;
+ }
+
+ if (!s_info.coll) {
+ ErrPrint("Fallback to strcmp\n");
+ return strcmp(src, dest);
+ }
+
+ src_uni = to_UTF16(src, &src_len);
+ if (!src_uni) {
+ ErrPrint("SRC: Failed to convert to UTF16\n");
+ return strcmp(src, dest);
+ }
+
+ dest_uni = to_UTF16(dest, &dest_len);
+ if (!dest_uni) {
+ ErrPrint("DEST: Failed to convert to UTF16\n");
+ free(src_uni);
+ return strcmp(src, dest);
+ }
+
+ len = src_len > dest_len ? dest_len : src_len;
+
+ switch (s_info.lang) {
+ case LANG_JAPANESS:
+ if (__isalpha(*src_uni) && !__isalpha(*dest_uni)) {
+ res = UCOL_GREATER;
+ } else if (!__isalpha(*src_uni) && __isalpha(*dest_uni)) {
+ res = UCOL_LESS;
+ } else {
+ int src_lang;
+ int dest_lang;
+
+ src_lang = add_viewer_ucol_detect_lang(*src_uni);
+ dest_lang = add_viewer_ucol_detect_lang(*dest_uni);
+
+ if (src_lang == LANG_JAPANESS && dest_lang != LANG_JAPANESS) {
+ res = UCOL_LESS;
+ } else if (src_lang != LANG_JAPANESS && dest_lang == LANG_JAPANESS) {
+ res = UCOL_GREATER;
+ } else {
+ res = ucol_strcoll(s_info.coll, (UChar *)src_uni, len, (UChar *)dest_uni, len);
+ }
+ }
+ break;
+ case LANG_KOREAN:
+ if (__isalpha(*src_uni) && !__isalpha(*dest_uni)) {
+ res = UCOL_GREATER;
+ } else if (!__isalpha(*src_uni) && __isalpha(*dest_uni)) {
+ res = UCOL_LESS;
+ } else {
+ int src_lang;
+ int dest_lang;
+
+ src_lang = add_viewer_ucol_detect_lang(*src_uni);
+ dest_lang = add_viewer_ucol_detect_lang(*dest_uni);
+
+ if (src_lang == LANG_KOREAN && dest_lang != LANG_KOREAN) {
+ res = UCOL_LESS;
+ } else if (src_lang != LANG_KOREAN && dest_lang == LANG_KOREAN) {
+ res = UCOL_GREATER;
+ } else {
+ res = ucol_strcoll(s_info.coll, (UChar *)src_uni, len, (UChar *)dest_uni, len);
+ }
+ }
+ break;
+ case LANG_ENGLISH:
+ default:
+ if (__isalpha(*src_uni) && !__isalpha(*dest_uni)) {
+ res = UCOL_LESS;
+ } else if (!__isalpha(*src_uni) && __isalpha(*dest_uni)) {
+ res = UCOL_GREATER;
+ } else {
+ res = ucol_strcoll(s_info.coll, (UChar *)src_uni, len, (UChar *)dest_uni, len);
+ }
+ }
+
+ free(src_uni);
+ free(dest_uni);
+
+ switch (res) {
+ case UCOL_LESS:
+ return -1;
+
+ case UCOL_EQUAL:
+ if (src_len > dest_len) {
+ return 1;
+ } else if (src_len == dest_len) {
+ return 0;
+ }
+
+ return -1;
+
+ case UCOL_GREATER:
+ return 1;
+
+ default:
+ DbgPrint("%s ? %s\n", src, dest);
+ return 0;
+ }
+}
+
+HAPI int add_viewer_ucol_case_search(const char *haystack, const char *needle)
+{
+ char *_haystack;
+ char *_needle;
+ const char *ptr;
+ int len;
+ int needle_len;
+ int idx;
+ int ret;
+
+ if (!haystack || !needle) {
+ return -EINVAL;
+ }
+
+ if (!s_info.coll) {
+ ErrPrint("Fallback to strcasestr\n");
+ ptr = strcasestr(haystack, needle);
+ if (!ptr) {
+ return -ENOENT;
+ }
+
+ return (int)(ptr - haystack);
+ }
+
+ _haystack = ucol_toupper(haystack);
+ if (!_haystack) {
+ // Error will be printed by ucol_toupper
+ return -EFAULT;
+ }
+
+ _needle = ucol_toupper(needle);
+ if (!_needle) {
+ // Error will be printed by ucol_toupper
+ free(_haystack);
+ return -EFAULT;
+ }
+
+ needle_len = strlen(_needle);
+ len = strlen(_haystack) - needle_len;
+ if (len == 0) {
+ ret = add_viewer_ucol_compare(_haystack, _needle);
+ free(_needle);
+ free(_haystack);
+ return ret == 0 ? 0 : -ENOENT;
+ } else if (len < 0) {
+ free(_haystack);
+ free(_needle);
+ return -ENOENT;
+ }
+
+ for (idx = 0; idx <= len; ) {
+ ret = add_viewer_ucol_ncompare(_haystack + idx, _needle, needle_len);
+ if (ret == 0) {
+ free(_haystack);
+ free(_needle);
+ return idx;
+ }
+
+ idx += add_viewer_util_get_utf8_len(_haystack[idx]);
+ }
+
+ free(_haystack);
+ free(_needle);
+ return -ENOENT;
+}
+
+HAPI int add_viewer_ucol_search(const char *haystack, const char *needle)
+{
+ int ret;
+ int len;
+ const char *ptr;
+ int idx;
+ int needle_len;
+
+ if (!haystack || !needle) {
+ return -EINVAL;
+ }
+
+ if (!s_info.coll) {
+ ErrPrint("Fallback to strstr\n");
+ ptr = strstr(haystack, needle);
+ if (!ptr) {
+ return -ENOENT;
+ }
+
+ return (int)(ptr - haystack);
+ }
+
+ needle_len = strlen(needle);
+ len = strlen(haystack) - needle_len;
+ if (len == 0) {
+ return add_viewer_ucol_compare(haystack, needle) == 0 ? 0 : -ENOENT;
+ } else if (len < 0) {
+ return -ENOENT;
+ }
+
+ for (idx = 0; idx < len;) {
+ ret = add_viewer_ucol_ncompare(haystack + idx, needle, needle_len);
+ if (ret == 0) {
+ return idx;
+ }
+
+ idx += add_viewer_util_get_utf8_len(haystack[idx]);
+ }
+
+ return -ENOENT;
+}
+
+HAPI int add_viewer_ucol_fini(void)
+{
+ if (s_info.coll) {
+ ucol_close(s_info.coll);
+ s_info.coll = NULL;
+ }
+ return 0;
+}
+
+HAPI const int add_viewer_ucol_current_lang(void)
+{
+ return s_info.lang;
+}
+
+/* End of a file */
diff --git a/home/src/add-viewer_util.c b/home/src/add-viewer_util.c
new file mode 100755
index 0000000..491506a
--- /dev/null
+++ b/home/src/add-viewer_util.c
@@ -0,0 +1,413 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include <Elementary.h>
+#include <dlog.h>
+#include <appsvc.h>
+#include <dynamicbox_service.h>
+#include <app.h>
+#include <vconf.h>
+#if defined(USE_APP_MANAGER)
+#include <app_manager.h>
+#endif
+
+#include <efl_assist.h>
+
+#include "add-viewer_debug.h"
+#include "add-viewer_package.h"
+#include "add-viewer_util.h"
+#include "add-viewer_ucol.h"
+
+#if defined(LOG_TAG)
+#undef LOG_TAG
+#endif
+#define LOG_TAG "ADD_VIEWER"
+
+#define MATCH_COLOR "#ee00eeff"
+
+static struct {
+ char *setup;
+ struct {
+ int r;
+ int g;
+ int b;
+ int a;
+ } matched_color;
+} s_info = {
+ .setup = NULL,
+ .matched_color = {
+ .r = 0xee,
+ .g = 0x00,
+ .b = 0xee,
+ .a = 0xff,
+ },
+};
+
+struct result_data {
+ struct add_viewer_package *package;
+ int size;
+};
+
+extern int appsvc_allow_transient_app(bundle *b, Ecore_X_Window id);
+
+#if defined(USE_APP_MANAGER)
+static void app_ctx_cb(app_context_h app_context, app_context_event_e event, void *user_data)
+{
+ char *pkgname = NULL;
+
+ if (app_context_get_package(app_context, &pkgname) != APP_MANAGER_ERROR_NONE) {
+ ErrPrint("Failed to get pkgname\n");
+ return;
+ }
+
+ if (!pkgname) {
+ ErrPrint("Failed to get package name\n");
+ return;
+ }
+
+ switch (event) {
+ case APP_CONTEXT_EVENT_LAUNCHED:
+ break;
+ case APP_CONTEXT_EVENT_TERMINATED:
+ /*!
+ * \note
+ * This must be called later than response callback
+ */
+ if (s_info.setup && !strcmp(pkgname, s_info.setup)) {
+ ErrPrint("Setup app is terminated [%s]\n", s_info.setup);
+ free(s_info.setup);
+ s_info.setup = NULL;
+ elm_exit();
+ }
+ break;
+ default:
+ break;
+ }
+
+ free(pkgname);
+ return;
+}
+#else
+#include <aul.h>
+
+extern int aul_listen_app_dead_signal(int (*func)(int signal, void *data), void *data);
+
+int _dead_cb(int pid, void *data)
+{
+ char pkgname[256];
+
+ if (aul_app_get_pkgname_bypid(pid, pkgname, sizeof(pkgname)) != AUL_R_OK) {
+ ErrPrint("Failed to get pkgname for %d\n", pid);
+ return 0;
+ }
+
+ if (s_info.setup && !strcmp(pkgname, s_info.setup)) {
+ ErrPrint("Setup app is terminated [%s]\n", s_info.setup);
+ free(s_info.setup);
+ s_info.setup = NULL;
+ elm_exit();
+ }
+
+ return 0;
+}
+#endif
+
+HAPI int add_viewer_util_init(void)
+{
+#if defined(USE_APP_MANAGER)
+ app_manager_set_app_context_event_cb(app_ctx_cb, NULL);
+#else
+ aul_listen_app_dead_signal(_dead_cb, NULL);
+#endif
+ return 0;
+}
+
+HAPI int add_viewer_util_fini(void)
+{
+#if defined(USE_APP_MANAGER)
+ app_manager_unset_app_context_event_cb();
+#endif
+ return 0;
+}
+
+static void response_callback(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
+{
+ struct result_data *res_data = user_data;
+ char *content_info = NULL;
+
+ if (s_info.setup) {
+ free(s_info.setup);
+ s_info.setup = NULL;
+ }
+
+ if (result != APP_CONTROL_RESULT_SUCCEEDED) {
+ ErrPrint("Operation is canceled: %d\n", result);
+ elm_exit();
+ return;
+ }
+
+ app_control_get_extra_data(reply, EXTRA_KEY_CONTENT_INFO , &content_info);
+
+ /**
+ * \TODO
+ * Use this content_info to add a new dynamicbox
+ */
+
+ free(res_data);
+
+ /**
+ * If the box is successfully added, do we need to terminate this?
+ */
+}
+
+HAPI int add_viewer_util_add_to_home(struct add_viewer_package *package, int size, int use_noti)
+{
+ int ret = -EINVAL;
+ char *setup;
+
+ setup = dynamicbox_service_setup_appid(add_viewer_package_list_pkgname(package));
+ if (setup) {
+ char *provider_name;
+ app_control_h service;
+ struct result_data *res_data;
+
+ if (s_info.setup) {
+ ErrPrint("Setup is already launched: %s\n", s_info.setup);
+ free(s_info.setup);
+ s_info.setup = NULL;
+ }
+
+ provider_name = dynamicbox_service_provider_name(add_viewer_package_list_pkgname(package));
+ if (!provider_name) {
+ free(setup);
+ return -EINVAL;
+ }
+
+ DbgPrint("Provider: %s\n", provider_name);
+ DbgPrint("Setup App: %s\n", setup);
+
+ res_data = malloc(sizeof(*res_data));
+ if (!res_data) {
+ free(setup);
+ free(provider_name);
+ return -ENOMEM;
+ }
+
+ res_data->package = package;
+ res_data->size = size;
+
+ ret = app_control_create(&service);
+ if (ret != APP_CONTROL_ERROR_NONE) {
+ free(provider_name);
+ free(setup);
+ free(res_data);
+ return -EFAULT;
+ }
+
+ ret = app_control_set_app_id(service, setup);
+ if (ret != APP_CONTROL_ERROR_NONE) {
+ free(provider_name);
+ free(setup);
+ free(res_data);
+ app_control_destroy(service);
+ return -EFAULT;
+ }
+
+ ret = app_control_set_operation(service, SERVICE_OPERATION_DBOX_SETUP);
+ if (ret != APP_CONTROL_ERROR_NONE) {
+ free(provider_name);
+ free(setup);
+ free(res_data);
+ app_control_destroy(service);
+ return -EFAULT;
+ }
+
+ ret = app_control_add_extra_data(service, EXTRA_KEY_PROVIDER_NAME, provider_name);
+ if (ret != APP_CONTROL_ERROR_NONE) {
+ app_control_destroy(service);
+ free(provider_name);
+ free(setup);
+ free(res_data);
+ return -EFAULT;
+ }
+
+ ret = app_control_send_launch_request(service, response_callback, res_data);
+
+ app_control_destroy(service);
+ free(provider_name);
+
+ if (ret != APP_CONTROL_ERROR_NONE) {
+ free(res_data);
+ free(setup);
+ } else {
+ s_info.setup = setup;
+ }
+ } else {
+ /**
+ * \TODO
+ * Create a new dynamicbox without content_info
+ */
+ }
+
+ return ret;
+}
+
+HAPI int add_viewer_util_is_lcd_off(void)
+{
+ int state;
+
+ if (vconf_get_int(VCONFKEY_PM_STATE, &state) != 0) {
+ ErrPrint("Idle lock state is not valid\n");
+ state = VCONFKEY_PM_STATE_NORMAL; /* UNLOCK */
+ }
+
+ return state == VCONFKEY_PM_STATE_LCDOFF || state == VCONFKEY_PM_STATE_SLEEP;
+}
+
+HAPI char *add_viewer_util_highlight_keyword(const char *name, const char *filter)
+{
+ char *highlighted_name;
+ int filter_len;
+ int name_len;
+ int target_idx = 0;
+ int tag_len;
+ int ret_len;
+ const int amp_len = strlen("&amp;");
+ const char *org_name = name;
+
+ if (!name) {
+ ErrPrint("Cannot get name");
+ return NULL;
+ }
+
+ if (!filter) {
+ ErrPrint("Cannot get filter");
+ return NULL;
+ }
+
+ filter_len = strlen(filter);
+ name_len = strlen(name);
+ tag_len = strlen("<font color="MATCH_COLOR"></font>");
+ ret_len = name_len + 1;
+
+ highlighted_name = malloc(ret_len);
+ if (!highlighted_name) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ while (*name) {
+ if (*name == '&') {
+ char *tmp;
+
+ ret_len += amp_len;
+ tmp = realloc(highlighted_name, ret_len);
+ if (!tmp) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(highlighted_name);
+ return NULL;
+ }
+ highlighted_name = tmp;
+
+ /*!
+ * Manipulate tagging
+ */
+ strncpy(highlighted_name + target_idx, "&amp;", amp_len);
+ target_idx += amp_len;
+ name++;
+ } else if ((name_len - (int)(name - org_name)) < filter_len) {
+ int idx_len;
+
+ idx_len = name_len - (int)(name - org_name);
+
+ strncpy(highlighted_name + target_idx, name, idx_len);
+ target_idx += idx_len;
+ name += idx_len;
+ } else if (!add_viewer_ucol_case_ncompare(name, filter, filter_len)) {
+ char *tmp;
+
+ ret_len += tag_len;
+ tmp = realloc(highlighted_name, ret_len);
+ if (!tmp) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(highlighted_name);
+ return NULL;
+ }
+ highlighted_name = tmp;
+
+ /*!
+ * Manipulate tagging
+ */
+ tmp = malloc(filter_len + 1);
+ if (!tmp) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(highlighted_name);
+ return NULL;
+ }
+ strncpy(tmp, name, filter_len); /* Keep original string */
+ tmp[filter_len] = '\0';
+
+ target_idx += snprintf(highlighted_name + target_idx, ret_len - target_idx,
+ "<font color=#%02x%02x%02x%02x>%s</font>",
+ s_info.matched_color.r,
+ s_info.matched_color.g,
+ s_info.matched_color.b,
+ s_info.matched_color.a,
+ tmp
+ );
+ free(tmp);
+ name += filter_len;
+ } else {
+ int idx_len;
+
+ idx_len = add_viewer_util_get_utf8_len(*name);
+ strncpy(highlighted_name + target_idx, name, idx_len);
+ target_idx += idx_len;
+ name += idx_len;
+ }
+ }
+
+ highlighted_name[target_idx] = '\0';
+ return highlighted_name;
+}
+
+HAPI int add_viewer_util_get_utf8_len(char ch)
+{
+ int idx_len;
+ if ((ch & 0x80) == 0x00) {
+ idx_len = 1;
+ } else if ((ch & 0xE0) == 0xC0) {
+ idx_len = 2;
+ } else if ((ch & 0xF0) == 0xE0) {
+ idx_len = 3;
+ } else if ((ch & 0xFC) == 0xF8) {
+ idx_len = 4;
+ } else if ((ch & 0xFE) == 0xFC) {
+ idx_len = 5;
+ } else if ((ch & 0xFF) == 0xFE) {
+ idx_len = 6;
+ } else {
+ idx_len = 1;
+ }
+
+ return idx_len;
+}
+
+/* End of a file */
diff --git a/home/src/apps/apps_main.c b/home/src/apps/apps_main.c
new file mode 100755
index 0000000..986a486
--- /dev/null
+++ b/home/src/apps/apps_main.c
@@ -0,0 +1,930 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ail.h>
+#include <app.h>
+#include <appcore-efl.h>
+#include <aul.h>
+#include <bundle.h>
+#include <Ecore_X.h>
+#include <efl_assist.h>
+#include <Elementary.h>
+#include <sys/types.h>
+#include <system_settings.h>
+#include <unistd.h>
+#include <utilX.h>
+#include <vconf.h>
+
+#include "log.h"
+#include "util.h"
+#include "tutorial.h"
+#include "apps/bg.h"
+#include "apps/db.h"
+#include "apps/effect.h"
+#include "apps/item_info.h"
+#include "apps/lang.h"
+#include "apps/layout.h"
+#include "apps/list.h"
+#include "apps/apps_main.h"
+#include "apps/pkgmgr.h"
+#include "apps/scroller.h"
+#include "apps/scroller_info.h"
+#include "apps/xml.h"
+#include "wms.h"
+#include "noti_broker.h"
+
+
+#define LAYOUT_EDJE EDJEDIR"/apps_layout.edj"
+#define LAYOUT_GROUP_NAME "layout"
+#define VCONFKEY_APPS_IS_FIRST_BOOT "db/private/org.tizen.w-home/apps_first_boot"
+#define VCONFKEY_SETAPPL_CHANGE_UI_THEME_INT VCONFKEY_SETAPPL_PREFIX"/change_ui/theme"
+
+#define PRIVATE_DATA_KEY_EFFECT_ENABLE_ID "k_ef_en"
+#define PRIVATE_DATA_KEY_EFFECT_POS_ID "k_ef_ps"
+
+#define PRIVATE_DATA_KEY_FOCUS_IN_EVENT_HANDLER "k_fi_ev_hd"
+#define PRIVATE_DATA_KEY_FOCUS_OUT_EVENT_HANDLER "k_fo_ev_hd"
+
+
+static apps_main_s apps_main_info = {
+ .instance_list = NULL,
+ .theme = NULL,
+ .color_theme = NULL,
+ .font_theme = NULL,
+ .first_boot = 0,
+ .tts = 0,
+ .longpress_edit_disable = false,
+};
+
+
+
+typedef struct {
+ apps_error_e (*result_cb)(void *);
+ void *result_data;
+} cb_s;
+
+
+
+static void _init_theme(instance_info_s *info)
+{
+ apps_main_info.theme = elm_theme_new();
+ elm_theme_ref_set(apps_main_info.theme, NULL);
+ elm_theme_extension_add(apps_main_info.theme, EDJEDIR"/apps_grid.edj");
+
+ /* Default Changeable UI State : off */
+ ea_theme_changeable_ui_enabled_set(EINA_FALSE);
+
+ if (!apps_main_info.color_theme) {
+ apps_main_info.color_theme = ea_theme_color_table_new(PREFIX"/shared/res/tables/org.tizen.w-home_apps_ChangeableColorInfo.xml");
+ ret_if (!apps_main_info.color_theme);
+ }
+ /* Default Theme Style : DEFAULT */
+ ea_theme_style_set(EA_THEME_STYLE_DEFAULT);
+ ea_theme_colors_set(apps_main_info.color_theme, EA_THEME_STYLE_DEFAULT);
+
+ if (!apps_main_info.font_theme) {
+ apps_main_info.font_theme = ea_theme_font_table_new(PREFIX"/shared/res/tables/org.tizen.w-home_apps_ChangeableFontInfo.xml");
+ ret_if(!apps_main_info.font_theme);
+ }
+ ea_theme_fonts_set(apps_main_info.font_theme);
+
+ ea_theme_system_colors_apply();
+ ea_theme_system_fonts_apply();
+}
+
+
+
+static void _destroy_theme(instance_info_s *info)
+{
+ elm_theme_extension_del(apps_main_info.theme, EDJEDIR"/apps_grid.edj");
+ elm_theme_free(apps_main_info.theme);
+ apps_main_info.theme = NULL;
+
+ if (apps_main_info.color_theme) {
+ ea_theme_color_table_free(apps_main_info.color_theme);
+ apps_main_info.color_theme = NULL;
+ }
+ if (apps_main_info.font_theme) {
+ ea_theme_font_table_free(apps_main_info.font_theme);
+ apps_main_info.font_theme = NULL;
+ }
+}
+
+
+
+static apps_error_e _rotate_cb(instance_info_s *info, int angle)
+{
+ Evas_Object *layout = NULL;
+
+ _APPS_D("Enter _rotate_cb, angle is %d", angle);
+ info->angle = angle;
+
+ switch (angle) {
+ case 0:
+ _APPS_D("Portrait normal");
+ info->is_rotated = 0;
+ break;
+ case 90:
+ _APPS_D("Landscape reverse");
+ info->is_rotated = 1;
+ break;
+ case 180:
+ _APPS_D("Portrait reverse");
+ info->is_rotated = 0;
+ break;
+ case 270:
+ _APPS_D("Landscape normal");
+ info->is_rotated = 1;
+ break;
+ default:
+ _APPS_E("Cannot reach here, angle is %d", angle);
+ }
+
+ layout = evas_object_data_get(info->win, DATA_KEY_LAYOUT);
+ retv_if(NULL == layout, APPS_ERROR_FAIL);
+ apps_layout_rotate(layout, info->is_rotated);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+static void _rotation_changed_cb(void *data, Evas_Object *obj, void *event)
+{
+ instance_info_s *info = data;
+ int changed_ang = elm_win_rotation_get(info->win);
+
+ _APPS_D("Angle: %d", changed_ang);
+
+ if (changed_ang != info->angle) {
+ _rotate_cb(info, changed_ang);
+ }
+}
+
+
+
+static apps_error_e _init_layout(instance_info_s *info)
+{
+ Evas_Object *bg = NULL;
+ int angle;
+
+ retv_if(!info, APPS_ERROR_INVALID_PARAMETER);
+
+ info->layout = evas_object_data_get(info->win, DATA_KEY_LAYOUT);
+ retv_if(info->layout, APPS_ERROR_FAIL);
+
+ info->layout = apps_layout_create(info->win, LAYOUT_EDJE, LAYOUT_GROUP_NAME);
+ retv_if(!info->layout, APPS_ERROR_FAIL);
+
+ evas_object_data_set(info->win, DATA_KEY_LAYOUT, info->layout);
+ evas_object_resize(info->layout, info->root_w, info->root_h);
+ evas_object_show(info->layout);
+
+ if (APPS_ERROR_FAIL == apps_effect_init()) {
+ _APPS_E("Failed to init effect sound");
+ }
+
+ bg = apps_bg_create(info->win, info->root_w, info->root_h);
+ if (!bg) {
+ _APPS_E("Cannot create bg");
+ }
+
+ angle = elm_win_rotation_get(info->win);
+ _APPS_D("Angle: %d\n", angle);
+
+ if (APPS_ERROR_NONE != _rotate_cb(info, angle)) {
+ _APPS_E("Rotate error.");
+ }
+ evas_object_smart_callback_add(info->win, "wm,rotation,changed", _rotation_changed_cb, info);
+
+ info->state = APPS_APP_STATE_RESET;
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+static void _destroy_layout(instance_info_s *info)
+{
+ evas_object_smart_callback_del(info->win, "wm,rotation,changed", _rotation_changed_cb);
+
+ apps_bg_destroy(info->win);
+
+ apps_effect_fini();
+ evas_object_data_del(info->win, DATA_KEY_LAYOUT);
+ if (info->layout) apps_layout_destroy(info->layout);
+}
+
+
+
+#if 0 /* EFL private features */
+static void _apps_slide_down_effect_add(instance_info_s *info)
+{
+ Evas_Object *win = NULL;
+ int xwin;
+ int angle = 0;
+ int size = 0;
+ char *buf = NULL;
+ int id = 0;
+
+ win = info->win;
+ ret_if(!win);
+
+ xwin = elm_win_xwindow_get(win);
+
+ id = elm_win_aux_hint_add(win, "wm.comp.win.effect.enable", "1");
+ if (-1 == id) _APPS_E("Failed to get effect enable id");
+ else evas_object_data_set(win, PRIVATE_DATA_KEY_EFFECT_ENABLE_ID, (void *)id);
+
+ id = 0;
+ angle = elm_win_rotation_get(win);
+ size = snprintf(NULL, 0, "%x.%d.%d.%d.%d.%d", xwin, angle, 0, info->root_h, info->root_w, info->root_h) + 1;
+ buf = (char *)malloc(sizeof(char) * size);
+ if (buf) {
+ snprintf(buf, size, "%x.%d.%d.%d.%d.%d", xwin, angle, 0, info->root_h, info->root_w, info->root_h);
+ id = elm_win_aux_hint_add(win, "wm.comp.win.effect.launch.pos", buf);
+ if (-1 == id) _APPS_E("Failed to get effect id");
+ else evas_object_data_set(win, PRIVATE_DATA_KEY_EFFECT_POS_ID, (void *)id);
+
+ free(buf);
+ }
+}
+
+
+
+static void _apps_slide_down_effect_del(instance_info_s *info)
+{
+ int id;
+
+ id = (int) evas_object_data_get(info->win, PRIVATE_DATA_KEY_EFFECT_ENABLE_ID);
+ elm_win_aux_hint_del(info->win, id);
+ id = (int) evas_object_data_get(info->win, PRIVATE_DATA_KEY_EFFECT_POS_ID);
+ elm_win_aux_hint_del(info->win, id);
+}
+#endif
+
+
+
+static Eina_Bool _window_focus_in_cb(void *data, int type, void *event)
+{
+ instance_info_s *info = data;
+ Ecore_X_Event_Window_Focus_In *ev = event;
+
+ Ecore_X_Window xWin = elm_win_xwindow_get(info->win);
+ if(xWin == ev->win) {
+ _APPS_D("focus in");
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_VIEW, EVENT_TYPE_APPS_SHOW, NULL);
+ apps_main_resume();
+ }
+ else {
+ _APPS_E("win[%d], ev->win[%d]", xWin, ev->win);
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+
+
+static Eina_Bool _window_focus_out_cb(void *data, int type, void *event)
+{
+ instance_info_s *info = data;
+ Ecore_X_Event_Window_Focus_Out *ev = event;
+
+ Ecore_X_Window xWin = elm_win_xwindow_get(info->win);
+ if(xWin == ev->win) {
+ _APPS_D("focus out");
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_VIEW, EVENT_TYPE_APPS_HIDE, NULL);
+ apps_main_pause();
+ }
+ else {
+ _APPS_E("win[%d], ev->win[%d]", xWin, ev->win);
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+
+
+#define ROTATION_TYPE_NUMBER 1
+static apps_error_e _init_app_win(instance_info_s *info, const char *name, const char *title)
+{
+ unsigned int opaque_val = 0;
+ Ecore_X_Atom opaque_atom;
+ Ecore_X_Window xwin;
+ Ecore_X_Window root_win;
+
+ retv_if(!name, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(!title, APPS_ERROR_INVALID_PARAMETER);
+
+ /* Open GL backend */
+ elm_config_preferred_engine_set("opengl_x11");
+
+ root_win = ecore_x_window_root_first_get();
+ ecore_x_window_size_get(root_win, &info->root_w, &info->root_h);
+
+ info->win = elm_win_add(NULL, name, ELM_WIN_BASIC);
+ retv_if(!info->win, APPS_ERROR_FAIL);
+ apps_main_info.instance_list = eina_list_append(apps_main_info.instance_list, info);
+
+ elm_win_alpha_set(info->win, EINA_FALSE); // This order is important
+ elm_win_role_set(info->win, "no-effect");
+
+#if 0 /* EFL private features */
+ _apps_slide_down_effect_add(info);
+#endif
+
+ opaque_atom = ecore_x_atom_get("_E_ILLUME_WINDOW_REGION_OPAQUE");
+ xwin = elm_win_xwindow_get(info->win);
+ ecore_x_window_prop_card32_set(xwin, opaque_atom, &opaque_val, 1);
+ ecore_x_vsync_animator_tick_source_set(xwin);
+
+ if (elm_win_wm_rotation_supported_get(info->win)) {
+ const int rots[ROTATION_TYPE_NUMBER] = {0};
+ elm_win_wm_rotation_available_rotations_set(info->win, rots, ROTATION_TYPE_NUMBER);
+ }
+
+ evas_object_color_set(info->win, 0, 0, 0, 0);
+ evas_object_resize(info->win, info->root_w, info->root_h);
+ evas_object_hide(info->win);
+ evas_object_data_set(info->win, DATA_KEY_INSTANCE_INFO, info);
+
+ elm_win_title_set(info->win, title);
+ elm_win_borderless_set(info->win, EINA_TRUE);
+
+ info->e = evas_object_evas_get(info->win);
+ if (!info->e) {
+ _APPS_E("[%s] Failed to get the e object", __func__);
+ }
+
+ info->ee = ecore_evas_ecore_evas_get(info->e);
+ if (!info->ee) {
+ _APPS_E("[%s] Failed to get ecore_evas object", __func__);
+ }
+
+ Ecore_Event_Handler *handler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _window_focus_in_cb, info);
+ evas_object_data_set(info->win, PRIVATE_DATA_KEY_FOCUS_IN_EVENT_HANDLER, handler);
+
+ handler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, _window_focus_out_cb, info);
+ evas_object_data_set(info->win, PRIVATE_DATA_KEY_FOCUS_OUT_EVENT_HANDLER, handler);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+static void _destroy_app_win(instance_info_s *info)
+{
+ ret_if(!info);
+
+ evas_object_data_del(info->win, DATA_KEY_INSTANCE_INFO);
+
+ Ecore_Event_Handler *handler = evas_object_data_del(info->win, PRIVATE_DATA_KEY_FOCUS_IN_EVENT_HANDLER);
+ if (handler) ecore_event_handler_del(handler);
+
+ handler = evas_object_data_del(info->win, PRIVATE_DATA_KEY_FOCUS_OUT_EVENT_HANDLER);
+ if (handler) ecore_event_handler_del(handler);
+
+#if 0 /* EFL private features */
+ _apps_slide_down_effect_del(info);
+#endif
+
+ evas_object_del(info->win);
+ info->win = NULL;
+ apps_main_info.instance_list = eina_list_remove(apps_main_info.instance_list, info);
+}
+
+
+
+HAPI apps_main_s *apps_main_get_info(void)
+{
+ return &apps_main_info;
+}
+
+
+HAPI apps_error_e apps_main_register_cb(
+ instance_info_s *info,
+ int state,
+ apps_error_e (*result_cb)(void *), void *result_data)
+{
+ cb_s *cb = NULL;
+
+ retv_if(NULL == result_cb, APPS_ERROR_INVALID_PARAMETER);
+
+ cb = calloc(1, sizeof(cb_s));
+ retv_if(NULL == cb, APPS_ERROR_FAIL);
+
+ cb->result_cb = result_cb;
+ cb->result_data = result_data;
+
+ info->cbs_list[state] = eina_list_append(info->cbs_list[state], cb);
+ retv_if(NULL == info->cbs_list[state], APPS_ERROR_FAIL);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI void apps_main_unregister_cb(
+ instance_info_s *info,
+ int state,
+ apps_error_e (*result_cb)(void *))
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(info->cbs_list[state], l, n, cb) {
+ continue_if(NULL == cb);
+ if (result_cb != cb->result_cb) continue;
+ info->cbs_list[state] = eina_list_remove(info->cbs_list[state], cb);
+ free(cb);
+ return;
+ }
+}
+
+
+
+static void _execute_cbs(instance_info_s *info, int state)
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(info->cbs_list[state], l, n, cb) {
+ continue_if(NULL == cb);
+ continue_if(NULL == cb->result_cb);
+
+ if (APPS_ERROR_NONE != cb->result_cb(cb->result_data)) _APPS_E("There are some problems");
+ }
+}
+
+
+HAPI void apps_main_init()
+{
+ _APPS_D("APPS INIT");
+
+ /* Data set */
+ instance_info_s *info = NULL;
+ if(eina_list_count(apps_main_info.instance_list) == 0) {
+ info = calloc(1, sizeof(instance_info_s));
+ ret_if(NULL == info);
+ }
+ else {
+ _APPS_E("");
+ return;
+ }
+
+ info->state = APPS_APP_STATE_CREATE;
+
+ appcore_measure_start();
+
+ apps_pkgmgr_init();
+
+ if (vconf_get_int(VCONFKEY_APPS_IS_FIRST_BOOT, &apps_main_info.first_boot) < 0) {
+ _APPS_E("Cannot get the vconf for %s", VCONFKEY_APPS_IS_FIRST_BOOT);
+ }
+ vconf_set_int(VCONFKEY_APPS_IS_FIRST_BOOT, 0);
+
+ apps_main_info.scale = elm_config_scale_get();
+
+ if (vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &apps_main_info.tts) < 0) {
+ _APPS_E("Cannot get the vconf for %s", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS);
+ }
+
+ apps_main_info.longpress_edit_disable = true;
+
+ _execute_cbs(info, APPS_APP_STATE_CREATE);
+ appcore_set_i18n(PROJECT, LOCALEDIR);
+
+ ret_if(APPS_ERROR_FAIL == _init_app_win(info, "__APPS__", "__APPS__"));
+ ret_if(APPS_ERROR_FAIL == _init_layout(info));
+
+ /* After creating a window */
+ _init_theme(info);
+
+ return;
+}
+
+HAPI void apps_main_fini()
+{
+ instance_info_s *info = eina_list_nth(apps_main_get_info()->instance_list, 0);
+ ret_if(NULL == info);
+
+ info->state = APPS_APP_STATE_TERMINATE;
+ _execute_cbs(info, APPS_APP_STATE_TERMINATE);
+
+ _destroy_layout(info);
+ _destroy_app_win(info);
+ _destroy_theme(info);
+}
+
+
+
+static void _toast_popup_destroy_cb(Evas_Object *parent, Evas_Object *popup)
+{
+ ret_if(!popup);
+ ret_if(!parent);
+
+ evas_object_del(popup);
+ evas_object_data_del(parent, DATA_KEY_CHECK_POPUP);
+}
+
+
+
+static Eina_Bool _destroy_animator_cb(void *data)
+{
+ Evas_Object *parent = data;
+ Evas_Object *popup = NULL;
+
+ retv_if(!parent, ECORE_CALLBACK_CANCEL);
+
+ popup = evas_object_data_get(parent, DATA_KEY_CHECK_POPUP);
+ retv_if(!popup, ECORE_CALLBACK_CANCEL);
+
+ _toast_popup_destroy_cb(parent, popup);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static void _popup_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *popup = NULL;
+ Evas_Object *check = NULL;
+ Evas_Object *parent = NULL;
+ int state = 0;
+
+ parent = data;
+ ret_if(!parent);
+
+ popup = evas_object_data_get(parent, DATA_KEY_CHECK_POPUP);
+ ret_if(!popup);
+ check = evas_object_data_del(popup, DATA_KEY_CHECK);
+ ret_if(!check);
+
+ state = (int)elm_check_state_get(check);
+ _D("check state is %d", state);
+
+ if (state) vconf_set_int(VCONFKEY_APPS_IS_INITIAL_POPUP, 0);
+
+ ecore_animator_add(_destroy_animator_cb, parent);
+}
+
+
+
+HAPI void apps_main_launch(int launch_type)
+{
+ _APPS_D("APPS LAUNCH");
+
+ if(eina_list_count(apps_main_info.instance_list) == 0) {
+ apps_main_init();
+ }
+ instance_info_s *info = eina_list_nth(apps_main_get_info()->instance_list, 0);
+
+ if (launch_type == APPS_LAUNCH_EDIT) {
+ _APPS_D("Edit the Apps");
+
+ apps_layout_edit(info->layout);
+
+ if (APPS_ERROR_FAIL == apps_layout_show(info->win, EINA_TRUE)) {
+ _APPS_E("Cannot show tray");
+ }
+ } else if (launch_type == APPS_LAUNCH_HIDE) {
+ _APPS_D("Hide the Apps");
+ if (info->win) {
+ _APPS_D("There is a window already");
+ apps_layout_show(info->win, EINA_FALSE);
+ return;
+ }
+
+ /* Standalone */
+ if (APPS_ERROR_FAIL == apps_layout_show(info->win, EINA_FALSE)) {
+ _APPS_E("Cannot show tray");
+ }
+ } else if (launch_type == APPS_LAUNCH_SHOW) {
+ int initial_popup;
+ _APPS_D("Show the Apps");
+ if (vconf_get_int(VCONFKEY_APPS_IS_INITIAL_POPUP, &initial_popup) < 0) {
+ _APPS_E("Cannot get the vconf for %s", VCONFKEY_APPS_IS_INITIAL_POPUP);
+ initial_popup = 1;
+ }
+
+ if (info->win) {
+ _APPS_D("There is a window already");
+ apps_layout_show(info->win, EINA_TRUE);
+ if (!tutorial_is_exist() && initial_popup) {
+ util_create_check_popup(info->win, NULL, _popup_clicked_cb);
+ }
+ return;
+ }
+
+ /* Standalone */
+ if (APPS_ERROR_FAIL == apps_layout_show(info->win, EINA_TRUE)) {
+ _APPS_E("Cannot show tray");
+ }
+ if (!tutorial_is_exist() && initial_popup) {
+ util_create_check_popup(info->win, NULL, _popup_clicked_cb);
+ }
+ }
+
+ _execute_cbs(info, APPS_APP_STATE_RESET);
+}
+
+
+HAPI void apps_main_pause()
+{
+ if(eina_list_count(apps_main_info.instance_list) == 0) {
+ _APPS_E("Pause starts");
+ return;
+ }
+
+ instance_info_s *info = eina_list_nth(apps_main_get_info()->instance_list, 0);
+
+ _APPS_D("Pause starts");
+ if(info->state == APP_STATE_PAUSE) {
+ _APPS_E("paused already");
+ return;
+ }
+
+ if (apps_layout_is_edited(info->layout)) {
+ apps_layout_unedit(info->layout);
+ }
+
+ info->state = APPS_APP_STATE_PAUSE;
+ _execute_cbs(info, APPS_APP_STATE_PAUSE);
+
+
+ int isOrderChange = (int)evas_object_data_get(info->win, DATA_KEY_IS_ORDER_CHANGE);
+ if(isOrderChange) {
+ wms_change_apps_order(W_HOME_WMS_BACKUP);
+ evas_object_data_set(info->win, DATA_KEY_IS_ORDER_CHANGE, (void*)0);
+ }
+
+ _APPS_D("Pause done");
+
+ return;
+}
+
+
+
+HAPI void apps_main_resume()
+{
+ if(eina_list_count(apps_main_info.instance_list) == 0) {
+ _APPS_E("Resume starts");
+ return;
+ }
+
+ instance_info_s *info = eina_list_nth(apps_main_get_info()->instance_list, 0);
+
+ _APPS_D("Resume starts");
+ if(info->state == APP_STATE_RESUME) {
+ _APPS_E("resumed already");
+ return;
+ }
+
+ info->state = APPS_APP_STATE_RESUME;
+ _execute_cbs(info, APPS_APP_STATE_RESUME);
+
+ return;
+}
+
+
+HAPI void apps_main_language_chnage()
+{
+ const Eina_List *l, *ln;
+ char *lang = NULL;
+ instance_info_s *info;
+
+ _APPS_D("Language is changed");
+
+ EINA_LIST_FOREACH_SAFE(apps_main_info.instance_list, l, ln, info) {
+ Evas_Object *scroller = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ continue_if(!info);
+ continue_if(!info->layout);
+
+ scroller = evas_object_data_get(info->layout, DATA_KEY_SCROLLER);
+ continue_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ continue_if(!scroller_info);
+
+ apps_item_info_list_change_language(scroller_info->list);
+ apps_scroller_change_language(scroller);
+ }
+
+ lang = vconf_get_str(VCONFKEY_LANGSET);
+ if (!lang) {
+ return;
+ }
+ elm_language_set(lang);
+ free(lang);
+
+ return;
+}
+
+
+HAPI void apps_main_theme_chnage()
+{
+ ea_theme_style_set(EA_THEME_STYLE_DEFAULT);
+ ret_if (!apps_main_info.color_theme);
+ ea_theme_colors_set(apps_main_info.color_theme, EA_THEME_STYLE_DEFAULT);
+}
+
+
+
+HAPI Eina_Bool apps_main_is_visible()
+{
+ instance_info_s *info = eina_list_nth(apps_main_get_info()->instance_list, 0);
+ retv_if(NULL == info, EINA_FALSE);
+
+ Eina_Bool bShow = evas_object_visible_get(info->win);
+ _APPS_D("bShow:[%d]", bShow);
+
+ return bShow;
+}
+
+#define APPS_ORDER_XML_PATH DATADIR"/apps_order.xml"
+HAPI void apps_main_list_backup()
+{
+ instance_info_s *info = eina_list_nth(apps_main_get_info()->instance_list, 0);
+ ret_if(!info);
+
+ Evas_Object *layout = evas_object_data_get(info->win, DATA_KEY_LAYOUT);
+ ret_if(!layout);
+
+ Evas_Object *scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+
+ apps_scroller_write_list(scroller);
+
+ scroller_info_s *scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ if(APPS_ERROR_NONE != apps_db_read_list(scroller_info->list)) {
+ _APPS_E("");
+ }
+
+ if(APPS_ERROR_NONE != apps_xml_read_list(APPS_ORDER_XML_PATH, scroller_info->list)) {
+ _APPS_E("");
+ }
+}
+
+
+static int _sort_by_order_cb(const void *d1, const void *d2)
+{
+ const item_info_s *v1 = d1;
+ const item_info_s *v2 = d2;
+
+ if (v1->ordering < 0) return 1;
+ else if (v2->ordering < 0) return -1;
+
+ if(v1->ordering > v2->ordering)
+ return 1;
+ else if(v1->ordering < v2->ordering)
+ return -1;
+ else
+ return 0;
+}
+
+
+HAPI void apps_main_list_restore()
+{
+ instance_info_s *info = eina_list_nth(apps_main_get_info()->instance_list, 0);
+ ret_if(!info);
+
+ Evas_Object *layout = evas_object_data_get(info->win, DATA_KEY_LAYOUT);
+ ret_if(!layout);
+
+ if(apps_layout_is_edited(layout)) {
+ _APPS_E("Apps is editing");
+ return;
+ }
+
+ Evas_Object *scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+
+ Eina_List *restore_list = apps_xml_write_list(APPS_ORDER_XML_PATH);
+ ret_if(!restore_list);
+
+ restore_list = eina_list_sort(restore_list, eina_list_count(restore_list), _sort_by_order_cb);
+ ret_if(!restore_list);
+
+ if(APPS_ERROR_NONE != apps_scroller_read_list(scroller, restore_list)) {
+ _APPS_E("");
+ }
+
+ apps_scroller_write_list(scroller);
+
+ scroller_info_s *scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ Eina_List *layout_list = evas_object_data_get(layout, DATA_KEY_LIST);
+ eina_list_free(layout_list);
+ layout_list = eina_list_clone(scroller_info->list);
+ evas_object_data_set(layout, DATA_KEY_LIST, layout_list);
+
+ if(APPS_ERROR_NONE != apps_db_read_list(scroller_info->list)) {
+ _APPS_E("");
+ }
+
+ if(APPS_ERROR_NONE != apps_xml_read_list(APPS_ORDER_XML_PATH, scroller_info->list)) {
+ _APPS_E("");
+ }
+}
+
+
+HAPI void apps_main_list_reset()
+{
+ instance_info_s *info = eina_list_nth(apps_main_get_info()->instance_list, 0);
+ ret_if(!info);
+
+ Evas_Object *layout = evas_object_data_get(info->win, DATA_KEY_LAYOUT);
+ ret_if(!layout);
+
+ if(apps_layout_is_edited(layout)) {
+ _APPS_E("Apps is editing");
+ return;
+ }
+
+ Evas_Object *scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+
+ Eina_List *reset_list = apps_item_info_list_create(ITEM_INFO_LIST_TYPE_XML);
+ ret_if(!reset_list);
+
+ if(APPS_ERROR_NONE != apps_scroller_read_list(scroller, reset_list)) {
+ _APPS_E("");
+ }
+
+ apps_scroller_write_list(scroller);
+
+ scroller_info_s *scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ Eina_List *layout_list = evas_object_data_get(layout, DATA_KEY_LIST);
+ eina_list_free(layout_list);
+ layout_list = eina_list_clone(scroller_info->list);
+ evas_object_data_set(layout, DATA_KEY_LIST, layout_list);
+
+ if(APPS_ERROR_NONE != apps_db_read_list(scroller_info->list)) {
+ _APPS_E("");
+ }
+
+ if(APPS_ERROR_NONE != apps_xml_read_list(APPS_ORDER_XML_PATH, scroller_info->list)) {
+ _APPS_E("");
+ }
+}
+
+
+HAPI void apps_main_list_tts(int is_tts)
+{
+ _D("tts is [%d]", is_tts);
+
+ apps_main_get_info()->tts = is_tts;
+}
+
+
+#define VCONKEY_HOME_APPS_SHOW_COUNT "db/private/org.tizen.w-home/apps_flickup_count"
+HAPI void apps_main_show_count_add(void)
+{
+ int val = 0;
+
+ if (vconf_get_int(VCONKEY_HOME_APPS_SHOW_COUNT, &val) == 0) {
+ val++;
+ if (vconf_set_int(VCONKEY_HOME_APPS_SHOW_COUNT, val) != 0) {
+ _E("Failed to set apps show count vconf");
+ }
+ } else {
+ _E("Failed to get apps show count vconf");
+ }
+}
+
+
+HAPI int apps_main_show_count_get(void)
+{
+ int val = 0, ret = 99;
+
+ if (vconf_get_int(VCONKEY_HOME_APPS_SHOW_COUNT, &val) == 0) {
+ ret = val;
+ } else {
+ _E("Failed to get apps show count vconf");
+ }
+
+ return ret;
+}
+// End of a file
diff --git a/home/src/apps/bg.c b/home/src/apps/bg.c
new file mode 100755
index 0000000..690cd86
--- /dev/null
+++ b/home/src/apps/bg.c
@@ -0,0 +1,217 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <vconf.h>
+
+#include "log.h"
+#include "util.h"
+
+
+
+#define VCONFKEY_WMS_BG_MODE "db/wms/home_bg_mode"
+#define VCONFKEY_WMS_BG_PALETTE "db/wms/home_bg_palette"
+#define BG_TYPE_COLOR 0
+#define BG_TYPE_IMAGE 1
+#define BG_TYPE_GALLERY 2
+
+#if 0 // There is no conformant in the wearable.
+static Evas_Object *_create_conformant(Evas_Object *win)
+{
+ Evas_Object *conformant = NULL;
+ conformant = (Evas_Object *) app_get_preinitialized_conformant();
+ if (!conformant) conformant = elm_conformant_add(win);
+ retv_if(NULL == conformant, NULL);
+
+ evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, conformant);
+
+ elm_object_signal_emit(conformant, "elm,state,indicator,overlap", "elm");
+ elm_object_signal_emit(conformant, "elm,state,virtualkeypad,disable", "");
+ elm_object_signal_emit(conformant, "elm,state,clipboard,disable", "");
+
+ evas_object_data_set(conformant, DATA_KEY_WIN, win);
+ evas_object_data_set(win, DATA_KEY_CONFORMANT, conformant);
+ evas_object_show(conformant);
+
+ return conformant;
+}
+
+
+
+void _destroy_conformant(Evas_Object *win)
+{
+ Evas_Object *conformant = NULL;
+ ret_if(!win);
+
+ conformant = evas_object_data_del(win, DATA_KEY_CONFORMANT);
+ ret_if(!conformant);
+
+ evas_object_data_del(conformant, DATA_KEY_WIN);
+ evas_object_del(conformant);
+}
+#endif
+
+
+
+#define DEFAULT_HOME_BG_PATH "/opt/share/settings/Wallpapers/Home_default.png"
+char *_bg_filename(void)
+{
+ char *buf;
+
+ buf = vconf_get_str(VCONFKEY_BGSET);
+ if (!buf) {
+ buf = strdup(DEFAULT_HOME_BG_PATH);
+ }
+
+ return buf;
+}
+
+
+static int _get_bg_type(void)
+{
+ /* 0 : Color, 1 : Image, 2 : Gallery */
+ int val = -1;
+
+ if(vconf_get_int(VCONFKEY_WMS_BG_MODE, &val) < 0) {
+ _APPS_E("Failed to get WMS_HOME_BG_MODE");
+ return BG_TYPE_IMAGE;
+ }
+
+ return val;
+}
+
+
+
+static void _change_bg(keynode_t *node, void *data)
+{
+ int bg_type = BG_TYPE_IMAGE;
+ Evas_Object *bg = data;
+ char *buf = NULL;
+
+ ret_if(!bg);
+
+ bg_type = _get_bg_type();
+ _APPS_D("bg_type:%d", bg_type);
+ switch(bg_type)
+ {
+ case BG_TYPE_COLOR:
+ {
+ buf = vconf_get_str(VCONFKEY_WMS_BG_PALETTE);
+
+ if (buf) {
+ int rgb = strtoul(buf, NULL, 16);
+ elm_bg_color_set(bg,
+ (rgb >> 16) & 0xFF,
+ (rgb >> 8) & 0xFF,
+ (rgb) & 0xFF);
+ elm_bg_file_set(bg, NULL, NULL);
+ }
+ }
+ break;
+ case BG_TYPE_IMAGE:
+ case BG_TYPE_GALLERY:
+ {
+ buf = _bg_filename();
+ ret_if(!buf);
+
+ _APPS_D("Change the background[%s]", buf);
+
+ elm_bg_file_set(bg, buf, NULL);
+ }
+ break;
+ default:
+ _APPS_E("bg_type[%d] is unknown", bg_type);
+ break;
+ }
+
+ free(buf);
+}
+
+
+
+static void _bg_down_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ _APPS_D("BG is pressed");
+}
+
+
+
+static void _bg_up_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ _APPS_D("BG is released");
+}
+
+
+
+Evas_Object *apps_bg_create(Evas_Object *win, int w, int h)
+{
+ Evas_Object *layout = NULL;
+ Evas_Object *bg = NULL;
+
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ retv_if(!layout, NULL);
+
+#if 0
+ bg = app_get_preinitialized_background();
+ if (!bg) bg = elm_bg_add(win);
+#else
+ bg = elm_bg_add(win);
+#endif
+ retv_if(!bg, NULL);
+
+ elm_bg_option_set(bg, ELM_BG_OPTION_SCALE);
+ elm_object_part_content_set(layout, "container", bg);
+
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(bg, w, h);
+ evas_object_show(bg);
+
+ evas_object_data_set(win, DATA_KEY_BG, bg);
+ evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_DOWN, _bg_down_cb, NULL);
+ evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_UP, _bg_up_cb, NULL);
+
+ if (vconf_notify_key_changed(VCONFKEY_WMS_BG_MODE, _change_bg, bg) < 0) {
+ _APPS_E("Failed to register the VCONFKEY_WMS_BG_MODE callback");
+ }
+
+ /* Changing the bg after setting DATA_KEY_BG */
+ _change_bg(NULL, bg);
+
+ return bg;
+}
+
+
+
+void apps_bg_destroy(Evas_Object *win)
+{
+ Evas_Object *bg = NULL;
+
+ if (vconf_ignore_key_changed(VCONFKEY_WMS_BG_MODE, _change_bg) < 0) {
+ _APPS_E("Failed to ignore the VCONFKEY_WMS_BG_MODE callback");
+ }
+
+ evas_object_event_callback_del(bg, EVAS_CALLBACK_MOUSE_DOWN, _bg_down_cb);
+ evas_object_event_callback_del(bg, EVAS_CALLBACK_MOUSE_UP, _bg_up_cb);
+ bg = evas_object_data_del(win, DATA_KEY_BG);
+ ret_if(!bg);
+ evas_object_del(bg);
+}
+
+
+
+// End of a file
diff --git a/home/src/apps/db.c b/home/src/apps/db.c
new file mode 100755
index 0000000..0b52689
--- /dev/null
+++ b/home/src/apps/db.c
@@ -0,0 +1,836 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <db-util.h>
+#include <sqlite3.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/db.h"
+#include "apps/item_info.h"
+#include "apps/list.h"
+
+
+
+
+#define retv_with_dbmsg_if(expr, val) do { \
+ if (expr) { \
+ _APPS_E("%s", sqlite3_errmsg(db_info.db)); \
+ return (val); \
+ } \
+} while (0)
+
+static struct {
+ sqlite3 *db;
+} db_info = {
+ .db = NULL,
+};
+
+struct stmt {
+ sqlite3_stmt *stmt;
+};
+
+
+
+HAPI apps_error_e apps_db_open(const char *db_file)
+{
+ int ret;
+
+ retv_if(NULL == db_file, APPS_ERROR_INVALID_PARAMETER);
+ if (db_info.db) {
+ return APPS_ERROR_NONE;
+ }
+
+ ret = db_util_open(db_file, &db_info.db, DB_UTIL_REGISTER_HOOK_METHOD);
+ if (ret != SQLITE_OK) _APPS_E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, APPS_ERROR_FAIL);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI stmt_h *apps_db_prepare(const char *query)
+{
+ int ret;
+ stmt_h *handle;
+
+ retv_if(NULL == query, NULL);
+
+ handle = calloc(1, sizeof(stmt_h));
+ retv_if(NULL == handle, NULL);
+
+ ret = sqlite3_prepare_v2(db_info.db, query, strlen(query), &(handle->stmt), NULL);
+ if (ret != SQLITE_OK) {
+ free(handle);
+ _APPS_E("%s, %s", query, sqlite3_errmsg(db_info.db));
+ return NULL;
+ }
+
+ return handle;
+}
+
+
+
+HAPI apps_error_e apps_db_bind_bool(stmt_h *handle, int idx, bool value)
+{
+ int ret;
+
+ retv_if(NULL == handle, APPS_ERROR_FAIL);
+
+ ret = sqlite3_bind_int(handle->stmt, idx, (int) value);
+ if (ret != SQLITE_OK) _APPS_E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, APPS_ERROR_FAIL);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI apps_error_e apps_db_bind_int(stmt_h *handle, int idx, int value)
+{
+ int ret;
+
+ retv_if(NULL == handle, APPS_ERROR_FAIL);
+
+ ret = sqlite3_bind_int(handle->stmt, idx, value);
+ if (ret != SQLITE_OK) _APPS_E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, APPS_ERROR_FAIL);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI apps_error_e apps_db_bind_str(stmt_h *handle, int idx, const char *str)
+{
+ int ret;
+
+ retv_if(NULL == handle, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == str, APPS_ERROR_INVALID_PARAMETER);
+
+ ret = sqlite3_bind_text(handle->stmt, idx, str, strlen(str), SQLITE_TRANSIENT);
+ if (ret != SQLITE_OK) _APPS_E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, APPS_ERROR_FAIL);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI apps_error_e apps_db_next(stmt_h *handle)
+{
+ int ret;
+
+ retv_if(NULL == handle, APPS_ERROR_FAIL);
+
+ ret = sqlite3_step(handle->stmt);
+ switch (ret) {
+ case SQLITE_ROW:
+ return APPS_ERROR_NONE;
+ case SQLITE_DONE:
+ return APPS_ERROR_NO_DATA;
+ default:
+ _APPS_E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(1, APPS_ERROR_FAIL);
+ }
+}
+
+
+
+HAPI bool apps_db_get_bool(stmt_h *handle, int index)
+{
+ retv_if(NULL == handle, false);
+ return (bool) sqlite3_column_int(handle->stmt, index);
+}
+
+
+
+HAPI int apps_db_get_int(stmt_h *handle, int index)
+{
+ retv_if(NULL == handle, 0);
+ return sqlite3_column_int(handle->stmt, index);
+}
+
+
+HAPI const char *apps_db_get_str(stmt_h *handle, int index)
+{
+ retv_if(NULL == handle, NULL);
+ return (const char *) sqlite3_column_text(handle->stmt, index);
+}
+
+
+
+HAPI apps_error_e apps_db_reset(stmt_h *handle)
+{
+ int ret;
+
+ retv_if(NULL == handle, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == handle->stmt, APPS_ERROR_INVALID_PARAMETER);
+
+ ret = sqlite3_reset(handle->stmt);
+ if (ret != SQLITE_OK) _APPS_E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, APPS_ERROR_FAIL);
+
+ sqlite3_clear_bindings(handle->stmt);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI apps_error_e apps_db_finalize(stmt_h *handle)
+{
+ int ret;
+
+ retv_if(NULL == handle, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == handle->stmt, APPS_ERROR_INVALID_PARAMETER);
+
+ ret = sqlite3_finalize(handle->stmt);
+ if (ret != SQLITE_OK) _APPS_E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, APPS_ERROR_FAIL);
+ free(handle);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI apps_error_e apps_db_exec(const char *query)
+{
+ retv_if(NULL == query, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == db_info.db, APPS_ERROR_FAIL);
+
+ stmt_h *handle = apps_db_prepare(query);
+ retv_if(NULL == handle, APPS_ERROR_FAIL);
+
+ goto_if(APPS_ERROR_FAIL == apps_db_next(handle), ERROR);
+ if (APPS_ERROR_NONE != apps_db_finalize(handle)) return APPS_ERROR_FAIL;
+
+ return APPS_ERROR_NONE;
+
+ERROR:
+ if (handle) apps_db_finalize(handle);
+ return APPS_ERROR_FAIL;
+}
+
+
+
+HAPI void apps_db_close(void)
+{
+ ret_if(!db_info.db);
+ sqlite3_close(db_info.db);
+ db_info.db = NULL;
+}
+
+
+
+HAPI apps_error_e apps_db_begin_transaction(void)
+{
+ int ret = -1;
+
+ ret = sqlite3_exec(db_info.db, "BEGIN IMMEDIATE TRANSACTION", NULL, NULL, NULL);
+
+ while (SQLITE_BUSY == ret) {
+ sleep(1);
+ ret = sqlite3_exec(db_info.db, "BEGIN IMMEDIATE TRANSACTION", NULL, NULL, NULL);
+ }
+
+ if (SQLITE_OK != ret) {
+ _APPS_E("sqlite3_exec() Failed(%d)", ret);
+ return APPS_ERROR_FAIL;
+ }
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+#define COMMIT_TRY_MAX 3
+HAPI apps_error_e apps_db_end_transaction(bool success)
+{
+ int ret = -1;
+ int i = 0;
+ char *errmsg = NULL;
+
+ if (success) {
+ ret = sqlite3_exec(db_info.db, "COMMIT TRANSACTION", NULL, NULL, &errmsg);
+ if (SQLITE_OK != ret) {
+ _APPS_E("sqlite3_exec(COMMIT) Failed(%d, %s)", ret, errmsg);
+ sqlite3_free(errmsg);
+
+ while (SQLITE_BUSY == ret && i < COMMIT_TRY_MAX) {
+ i++;
+ sleep(1);
+ ret = sqlite3_exec(db_info.db, "COMMIT TRANSACTION", NULL, NULL, NULL);
+ }
+
+ if (SQLITE_OK != ret) {
+ _APPS_E("sqlite3_exec() Failed(%d)", ret);
+ ret = sqlite3_exec(db_info.db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
+ if (SQLITE_OK != ret) {
+ _APPS_E("sqlite3_exec() Failed(%d)", ret);
+ }
+
+ return APPS_ERROR_FAIL;
+ }
+ }
+ } else {
+ ret = sqlite3_exec(db_info.db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
+ if (SQLITE_OK != ret) {
+ _APPS_E("sqlite3_exec() Failed(%d)", ret);
+ return APPS_ERROR_FAIL;
+ }
+ }
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+#define APPS_DB_FILE DATADIR"/.apps.db"
+#define APPS_TABLE "apps"
+#define QUERY_CREATE_TABLE "CREATE TABLE IF NOT EXISTS "APPS_TABLE" ("\
+ "id TEXT NOT NULL PRIMARY KEY, "\
+ "ordering INTEGER "\
+ ");"
+
+#define QUERY_INSERT_ITEM "INSERT INTO "APPS_TABLE" "\
+ "(id, ordering) "\
+ "VALUES "\
+ "('%s', %d);"
+
+HAPI apps_error_e apps_db_init(void)
+{
+ char *query = NULL;
+
+ retv_if(APPS_ERROR_NONE !=
+ apps_db_open(APPS_DB_FILE), -1);
+
+ query = sqlite3_mprintf(QUERY_CREATE_TABLE);
+ retv_if(query == NULL, -1);
+
+ if (apps_db_exec(query) != APPS_ERROR_NONE) {
+ _APPS_E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return APPS_ERROR_DB_FAILED;
+ }
+
+ return APPS_ERROR_NONE;
+}
+
+HAPI int apps_db_insert_item(const char *id, int ordering)
+{
+ char *query = NULL;
+
+ retv_if(!id, -1);
+ _APPS_D("Insert the item[%s:%d]", id, ordering);
+
+ retv_if(APPS_ERROR_NONE !=
+ apps_db_open(APPS_DB_FILE), -1);
+
+ query = sqlite3_mprintf(QUERY_INSERT_ITEM, id, ordering);
+ retv_if(query == NULL, -1);
+
+ if (apps_db_exec(query) != APPS_ERROR_NONE) {
+ _APPS_E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return -1;
+ }
+
+ sqlite3_free(query);
+
+ /* keep the home DB opened */
+
+ return 0;
+}
+
+
+
+#define QUERY_UPDATE_ITEM "UPDATE "APPS_TABLE" SET ordering=%d WHERE id='%s'"
+HAPI int apps_db_update_item(const char *id, int ordering)
+{
+ char *query = NULL;
+
+ retv_if(!id, -1);
+ _APPS_D("Update the item[%s:%d]", id, ordering);
+
+ retv_if(APPS_ERROR_NONE !=
+ apps_db_open(APPS_DB_FILE), -1);
+
+ query = sqlite3_mprintf(QUERY_UPDATE_ITEM, ordering, id);
+ retv_if(query == NULL, -1);
+
+ if (apps_db_exec(query) != APPS_ERROR_NONE) {
+ _APPS_E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return -1;
+ }
+
+ sqlite3_free(query);
+
+ /* keep the home DB opened */
+
+ return 0;
+}
+
+
+
+#define QUERY_REMOVE_ITEM "DELETE FROM "APPS_TABLE" WHERE id='%s'"
+HAPI int apps_db_remove_item(const char *id)
+{
+ char *query = NULL;
+
+ retv_if(!id, -1);
+
+ _APPS_D("Remove the item[%s]", id);
+
+ retv_if(APPS_ERROR_NONE !=
+ apps_db_open(APPS_DB_FILE), -1);
+
+ query = sqlite3_mprintf(QUERY_REMOVE_ITEM, id);
+ retv_if(query == NULL, -1);
+
+ if (apps_db_exec(query) != APPS_ERROR_NONE) {
+ _APPS_E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return -1;
+ }
+
+ sqlite3_free(query);
+
+ /* keep the home DB opened */
+
+ return 0;
+}
+
+
+
+#define QUERY_COUNT_ITEM "SELECT COUNT(*) FROM "APPS_TABLE" WHERE id=?"
+HAPI int apps_db_count_item(const char *id)
+{
+ stmt_h *st;
+ int count;
+
+ retv_if(id == NULL, -1);
+
+ retv_if(APPS_ERROR_NONE !=
+ apps_db_open(APPS_DB_FILE), -1);
+
+ st = apps_db_prepare(QUERY_COUNT_ITEM);
+ retv_if(st == NULL, -1);
+
+ if (apps_db_bind_str(st, 1, id) != APPS_ERROR_NONE) {
+ _APPS_E("db_bind_str error");
+ apps_db_finalize(st);
+ return -1;
+ }
+
+ if (apps_db_next(st) == APPS_ERROR_FAIL) {
+ _APPS_E("db_next error");
+ apps_db_finalize(st);
+ return -1;
+ }
+
+ count = apps_db_get_int(st, 0);
+ apps_db_finalize(st);
+
+ /* keep the home DB opened */
+
+ return count;
+}
+
+
+
+HAPI apps_error_e apps_db_read_list(Eina_List *item_info_list)
+{
+ const Eina_List *l, *ln;
+ item_info_s *item_info = NULL;
+
+ retv_if(!item_info_list, APPS_ERROR_INVALID_PARAMETER);
+
+ EINA_LIST_FOREACH_SAFE(item_info_list, l, ln, item_info) {
+ int count;
+ continue_if(!item_info);
+ continue_if(!item_info->appid);
+ count = apps_db_count_item(item_info->appid);
+ if (count > 0) {
+ apps_db_update_item(item_info->appid, item_info->ordering);
+ } else {
+ apps_db_init();
+ apps_db_insert_item(item_info->appid, item_info->ordering);
+ }
+ }
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+#define QUERY_SELECT_ORDERING_ITEM "SELECT id, ordering FROM "APPS_TABLE" ORDER BY ordering ASC"
+HAPI Eina_List *apps_db_write_list(void)
+{
+ stmt_h *st = NULL;
+ Eina_List *list = NULL;
+
+ retv_if(APPS_ERROR_NONE !=
+ apps_db_open(APPS_DB_FILE), NULL);
+
+ st = apps_db_prepare(QUERY_SELECT_ORDERING_ITEM);
+ if (!st) {
+ _APPS_E("Cannot prepare the DB");
+ apps_db_finalize(st);
+ return NULL;
+ }
+
+ while (APPS_ERROR_NONE == apps_db_next(st)) {
+ item_info_s *item_info = NULL;
+ char *appid = (char *) apps_db_get_str(st, 0);
+ continue_if(!appid);
+
+ item_info = apps_item_info_create(appid);
+ continue_if(!item_info);
+ item_info->ordering = apps_db_get_int(st, 1);
+
+ list = eina_list_append(list, item_info);
+ }
+
+ apps_db_finalize(st);
+
+ return list;
+}
+
+
+
+#define QUERY_SELECT_ORDERING_ITEM "SELECT id, ordering FROM "APPS_TABLE" ORDER BY ordering ASC"
+static Eina_List *_db_write_list_direct(void)
+{
+ stmt_h *st = NULL;
+ Eina_List *list = NULL;
+
+ retv_if(APPS_ERROR_NONE !=
+ apps_db_open(APPS_DB_FILE), NULL);
+
+ st = apps_db_prepare(QUERY_SELECT_ORDERING_ITEM);
+ if (!st) {
+ _APPS_E("Cannot prepare the DB");
+ apps_db_finalize(st);
+ return NULL;
+ }
+
+ while (APPS_ERROR_NONE == apps_db_next(st)) {
+ item_info_s *item_info = NULL;
+ char *appid = (char *) apps_db_get_str(st, 0);
+ continue_if(!appid);
+
+ item_info = calloc(1, sizeof(item_info_s));
+ continue_if(!item_info);
+
+ item_info->appid = strdup(appid);
+ if (!item_info->appid) {
+ _E("Cannot copy appid");
+ free(item_info);
+ continue;
+ }
+ item_info->ordering = apps_db_get_int(st, 1);
+
+ list = eina_list_append(list, item_info);
+ }
+
+ apps_db_finalize(st);
+
+ return list;
+}
+
+
+
+static int _sort_by_name_cb(const void *d1, const void *d2)
+{
+ const item_info_s *info1 = d1;
+ const item_info_s *info2 = d2;
+
+ if (NULL == info1 || NULL == info1->name) return 1;
+ else if (NULL == info2 || NULL == info2->name) return -1;
+
+ return strcmp(info1->name, info2->name);
+}
+
+
+
+#define QUERY_SELECT_ITEM "SELECT id, ordering FROM "APPS_TABLE""
+HAPI Eina_List *apps_db_write_list_by_name(void)
+{
+ stmt_h *st = NULL;
+ Eina_List *list = NULL;
+
+ retv_if(APPS_ERROR_NONE !=
+ apps_db_open(APPS_DB_FILE), NULL);
+
+ st = apps_db_prepare(QUERY_SELECT_ITEM);
+ if (!st) {
+ _APPS_E("Cannot prepare the DB");
+ apps_db_finalize(st);
+ return NULL;
+ }
+
+ while (APPS_ERROR_NONE == apps_db_next(st)) {
+ item_info_s *item_info = NULL;
+ char *appid = (char *) apps_db_get_str(st, 0);
+ continue_if(!appid);
+
+ item_info = apps_item_info_create(appid);
+ continue_if(!item_info);
+ item_info->ordering = apps_db_get_int(st, 1);
+
+ list = eina_list_append(list, item_info);
+ }
+
+ apps_db_finalize(st);
+
+ list = eina_list_sort(list, eina_list_count(list), _sort_by_name_cb);
+
+ return list;
+}
+
+
+
+#define QUERY_SELECT_ITEM_ORDER_BY_ASC "SELECT id, ordering FROM "APPS_TABLE" ORDER BY id ASC"
+HAPI Eina_List *_db_write_list_direct_by_name(void)
+{
+ stmt_h *st = NULL;
+ Eina_List *list = NULL;
+
+ retv_if(APPS_ERROR_NONE !=
+ apps_db_open(APPS_DB_FILE), NULL);
+
+ st = apps_db_prepare(QUERY_SELECT_ITEM_ORDER_BY_ASC);
+ if (!st) {
+ _APPS_E("Cannot prepare the DB");
+ apps_db_finalize(st);
+ return NULL;
+ }
+
+ while (APPS_ERROR_NONE == apps_db_next(st)) {
+ item_info_s *item_info = NULL;
+ char *appid = (char *) apps_db_get_str(st, 0);
+ continue_if(!appid);
+
+ item_info = calloc(1, sizeof(item_info_s));
+ continue_if(!item_info);
+
+ item_info->appid = strdup(appid);
+ if (!item_info->appid) {
+ _E("Cannot copy appid");
+ free(item_info);
+ continue;
+ }
+ item_info->ordering = apps_db_get_int(st, 1);
+
+ list = eina_list_append(list, item_info);
+ }
+
+ apps_db_finalize(st);
+
+ return list;
+}
+
+
+
+#define QUERY_ITEM_COUNT_ITEM "SELECT COUNT(*) FROM "APPS_TABLE
+HAPI int apps_db_count_item_in(void)
+{
+ stmt_h *st = NULL;
+ int count = 0;
+
+ retv_if(APPS_ERROR_NONE != apps_db_open(APPS_DB_FILE), -1);
+ st = apps_db_prepare(QUERY_ITEM_COUNT_ITEM);
+ retv_if(!st, -1);
+
+ if (APPS_ERROR_FAIL == apps_db_next(st)) {
+ _APPS_E("db_next error");
+ apps_db_finalize(st);
+ return -1;
+ }
+ count = apps_db_get_int(st, 0);
+ apps_db_finalize(st);
+
+ return count;
+}
+
+
+
+#define QUERY_ITEM_GET_MAX_POSITION "SELECT MAX(ordering) FROM "APPS_TABLE
+HAPI apps_error_e apps_db_find_empty_position(int *pos)
+{
+ stmt_h *st = NULL;
+ *pos = 0;
+
+ if (0 == apps_db_count_item_in()) {
+ return APPS_ERROR_NONE;
+ }
+
+ retv_if(APPS_ERROR_NONE != apps_db_open(APPS_DB_FILE), APPS_ERROR_FAIL);
+
+ st = apps_db_prepare(QUERY_ITEM_GET_MAX_POSITION);
+ retv_if(!st, APPS_ERROR_FAIL);
+
+ if (APPS_ERROR_FAIL == apps_db_next(st)) {
+ _APPS_E("db_next error");
+ apps_db_finalize(st);
+ return -1;
+ }
+
+ *pos = apps_db_get_int(st, 0) +1;
+
+ apps_db_finalize(st);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static void _free_list(Eina_List *list)
+{
+ item_info_s *data;
+
+ if (NULL == list) return;
+ EINA_LIST_FREE(list, data) {
+ if (data) apps_item_info_destroy(data);
+ }
+}
+
+
+
+HAPI apps_error_e apps_db_trim(void)
+{
+ Eina_List *list = NULL;
+ item_info_s *item = NULL;
+ register int i;
+ int position = 0;
+
+ list = _db_write_list_direct();
+ retv_if (!list, APPS_ERROR_FAIL);
+
+ for (i = 0; true; i++) {
+ item = eina_list_nth(list, i);
+ if (!item) break;
+ if (item->ordering == position) {
+ position ++;
+ continue;
+ }
+
+ if (APPS_ERROR_NONE != apps_db_update_item(item->appid, position)) {
+ _APPS_E("cannot set an item(%s)'s position(%d)", item->appid, position);
+ _free_list(list);
+ return APPS_ERROR_FAIL;
+ }
+ _APPS_D("Trim the DB : %s (%d->%d)", item->appid, item->ordering, position);
+ position ++;
+ }
+ _free_list(list);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI apps_error_e apps_db_sync(void)
+{
+ int pos = 0;
+ app_list *pkg_list = NULL;
+ Eina_List *db_list = NULL;
+ item_info_s *db_item = NULL;
+ item_info_s *pkg_item = NULL;
+
+ _APPS_D("apps db sync");
+
+ pkg_list = list_create_by_appid();
+ retv_if(!pkg_list, APPS_ERROR_FAIL);
+
+ db_list = _db_write_list_direct_by_name();
+ goto_if(!db_list, ERROR);
+
+ pkg_item = eina_list_nth(pkg_list->list, 0);
+ db_item = eina_list_nth(db_list, 0);
+
+ while (1) {
+ int serial = 0;
+
+ if (pkg_item && !db_item) {
+ goto_if(!pkg_item->appid, ERROR);
+ serial = -1;
+ } else if (!pkg_item && db_item) {
+ goto_if(!db_item->appid, ERROR);
+ serial = 1;
+ } else if (!pkg_item && !db_item) {
+ break;
+ } else {
+ goto_if(!pkg_item->appid, ERROR);
+ goto_if(!db_item->appid, ERROR);
+ serial = strcmp(pkg_item->appid, db_item->appid);
+ }
+
+ if (serial < 0) {
+ if (APPS_ERROR_NONE != apps_db_find_empty_position(&pos)) {
+ _APPS_E("Cannot find an empty position.");
+ break;
+ }
+
+ if (APPS_ERROR_NONE != apps_db_insert_item(pkg_item->appid, pos)) {
+ _APPS_E("Cannot add a package.");
+ break;
+ }
+
+ pkg_list->list = eina_list_next(pkg_list->list);
+ pkg_item = eina_list_data_get(pkg_list->list);
+ } else if (serial > 0) {
+ if (APPS_ERROR_NONE != apps_db_remove_item(db_item->appid)) {
+ _APPS_E("Cannot remove a package.");
+ break;
+ }
+
+ db_list = eina_list_next(db_list);
+ db_item = eina_list_data_get(db_list);
+ } else {
+ pkg_list->list = eina_list_next(pkg_list->list);
+ pkg_item = eina_list_data_get(pkg_list->list);
+
+ db_list = eina_list_next(db_list);
+ db_item = eina_list_data_get(db_list);
+ }
+ }
+
+ list_destroy(pkg_list);
+ _free_list(db_list);
+
+ retv_if(APPS_ERROR_NONE != apps_db_trim(), APPS_ERROR_FAIL);
+
+ return APPS_ERROR_NONE;
+
+ERROR:
+ if (pkg_list) list_destroy(pkg_list);
+ if (db_list) _free_list(db_list);
+
+ return APPS_ERROR_FAIL;
+}
+
+
+
+// End of file.
diff --git a/home/src/apps/effect.c b/home/src/apps/effect.c
new file mode 100755
index 0000000..49b3fa0
--- /dev/null
+++ b/home/src/apps/effect.c
@@ -0,0 +1,103 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <feedback.h>
+#include <vconf.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/apps_main.h"
+
+
+
+static struct {
+ int sound_status;
+ int is_feedback_initialized;
+} effect_info = {
+ .sound_status = 0,
+ .is_feedback_initialized = 0,
+};
+
+
+
+HAPI inline void apps_effect_set_sound_status(int status)
+{
+ effect_info.sound_status = status;
+}
+
+
+
+HAPI inline int apps_effect_get_sound_status(void)
+{
+ return effect_info.sound_status;
+}
+
+
+
+HAPI apps_error_e apps_effect_init(void)
+{
+ retv_if(1 == effect_info.is_feedback_initialized, APPS_ERROR_NONE);
+ retv_if(0 != feedback_initialize(), APPS_ERROR_FAIL);
+ retv_if(vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &effect_info.sound_status) < 0, APPS_ERROR_FAIL);
+
+ effect_info.is_feedback_initialized = 1;
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI void apps_effect_fini(void)
+{
+ ret_if(0 == effect_info.is_feedback_initialized);
+ ret_if(0 != feedback_deinitialize());
+
+ effect_info.is_feedback_initialized = 0;
+}
+
+
+
+HAPI void apps_effect_play_sound(void)
+{
+ if (effect_info.is_feedback_initialized == 0) {
+ apps_effect_init();
+ }
+
+ ret_if(vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &effect_info.sound_status) < 0);
+
+ if (effect_info.sound_status) {
+ feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TOUCH_TAP);
+ }
+ else {
+ _APPS_E("effect_info.sound_status: [%d]", effect_info.sound_status);
+ }
+}
+
+
+
+HAPI void apps_effect_play_vibration(void)
+{
+ if (effect_info.is_feedback_initialized == 0) {
+ apps_effect_init();
+ }
+
+ feedback_play_type(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_HOLD);
+}
+
+
+
+// End of a file
diff --git a/home/src/apps/grid.c b/home/src/apps/grid.c
new file mode 100755
index 0000000..d144841
--- /dev/null
+++ b/home/src/apps/grid.c
@@ -0,0 +1,408 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/apps_conf.h"
+#include "apps/grid.h"
+#include "apps/layout.h"
+#include "apps/list.h"
+#include "apps/apps_main.h"
+
+#define PRIVATE_DATA_KEY_ITEM_INFO_LIST_APPENDED "p_iil_and"
+#define PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX "p_iil_idx"
+#define PRIVATE_DATA_KEY_ITEM_INFO_LIST_TIMER "p_iil_tm"
+
+
+HAPI void grid_destroy(Evas_Object *win, Evas_Object *grid)
+{
+ Ecore_Timer *timer = NULL;
+ Elm_Gengrid_Item_Class *gic = NULL;
+
+ evas_object_data_del(grid, DATA_KEY_WIN);
+ evas_object_data_del(grid, DATA_KEY_LAYOUT);
+ evas_object_data_del(grid, DATA_KEY_INSTANCE_INFO);
+ evas_object_data_del(grid, DATA_KEY_ITEM_ICON_WIDTH);
+ evas_object_data_del(grid, DATA_KEY_ITEM_ICON_HEIGHT);
+ evas_object_data_del(grid, DATA_KEY_ITEM_WIDTH);
+ evas_object_data_del(grid, DATA_KEY_ITEM_HEIGHT);
+ evas_object_data_del(grid, DATA_KEY_CURRENT_ITEM);
+ evas_object_data_del(grid, DATA_KEY_LIST_INDEX);
+ evas_object_data_del(grid, DATA_KEY_LIST);
+ gic = evas_object_data_del(grid, DATA_KEY_GIC);
+ if (gic) elm_gengrid_item_class_free(gic);
+
+ timer = evas_object_data_del(grid, DATA_KEY_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ timer = NULL;
+ }
+
+ evas_object_data_del(win, DATA_KEY_GRID);
+
+ ret_if(NULL == grid);
+ evas_object_del(grid);
+}
+
+
+
+static char *_text_get(void *data, Evas_Object *obj, const char *part)
+{
+ item_info_s *item_info = data;
+ retv_if(NULL == item_info, NULL);
+
+ if (!strcmp(part, "txt")) {
+ retv_if(!item_info->name, NULL);
+ return strdup(item_info->name);
+ }
+
+ return NULL;
+}
+
+
+
+static Evas_Object *_add_icon(Evas_Object *parent, const char *file)
+{
+ const char *real_icon_file = NULL;
+ Evas_Object *icon = NULL;
+ int w, h;
+
+ real_icon_file = file;
+ if (access(real_icon_file, R_OK) != 0) {
+ _APPS_E("Failed to access an icon(%s)", real_icon_file);
+ real_icon_file = DEFAULT_ICON;
+ }
+
+ icon = elm_icon_add(parent);
+ retv_if(NULL == icon, NULL);
+
+ if (elm_image_file_set(icon, real_icon_file, NULL) == EINA_FALSE) {
+ _APPS_E("Icon file is not accessible (%s)", real_icon_file);
+ evas_object_del(icon);
+ return NULL;
+ }
+
+ w = (int) evas_object_data_get(parent, DATA_KEY_ITEM_ICON_WIDTH);
+ h = (int) evas_object_data_get(parent, DATA_KEY_ITEM_ICON_HEIGHT);
+ evas_object_size_hint_min_set(icon, w, h);
+
+ elm_image_preload_disabled_set(icon, EINA_TRUE);
+ elm_image_smooth_set(icon, EINA_TRUE);
+ elm_image_no_scale_set(icon, EINA_FALSE);
+
+ return icon;
+}
+
+
+static Evas_Object *_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ Evas_Object *bg = NULL;
+
+ item_info_s *item_info = data;
+ retv_if(NULL == item_info, NULL);
+
+ if (!strcmp(part, "bg")) {
+ bg = evas_object_rectangle_add(evas_object_evas_get(obj));
+ retv_if(NULL == bg, NULL);
+
+ int w = (int) evas_object_data_get(obj, DATA_KEY_ITEM_WIDTH);
+ int h = (int) evas_object_data_get(obj, DATA_KEY_ITEM_HEIGHT);
+
+ evas_object_size_hint_min_set(bg, w, h);
+ evas_object_color_set(bg, 0, 0, 0, 0);
+ evas_object_show(bg);
+ return bg;
+ } else if (!strcmp(part, "icon_image")) {
+ retv_if(NULL == item_info->icon, NULL);
+
+ return _add_icon(obj, item_info->icon);
+ }
+
+ return NULL;
+}
+
+
+
+static void _item_selected(void *data, Evas_Object *obj, void *event_info)
+{
+ item_info_s *item_info = data;
+
+ ret_if(NULL == data);
+
+ _APPS_D("Selected an item[%s]", item_info->appid);
+
+ util_launch_main_operation(NULL, item_info->appid, item_info->name);
+ elm_gengrid_item_selected_set(item_info->item, EINA_FALSE);
+}
+
+
+
+static void _del(void *data, Evas_Object *obj)
+{
+ _APPS_D("Delete an item[%p]", obj);
+}
+
+
+
+Eina_Bool _init_timer_cb(void *data)
+{
+ Evas_Object *grid = data;
+ Elm_Gengrid_Item_Class *gic = NULL;
+ Eina_List *list = NULL;
+ item_info_s *item_info = NULL;
+ int index, count;
+
+ retv_if(!grid, ECORE_CALLBACK_CANCEL);
+
+ list = evas_object_data_get(grid, DATA_KEY_LIST);
+ retv_if(!list, ECORE_CALLBACK_CANCEL);
+
+ index = (int) evas_object_data_get(grid, DATA_KEY_LIST_INDEX);
+ count = eina_list_count(list);
+ if (index == count) goto OUT;
+
+ gic = evas_object_data_get(grid, DATA_KEY_GIC);
+ goto_if(!gic, OUT);
+
+ item_info = eina_list_nth(list, index);
+ goto_if(!item_info, OUT);
+
+ item_info->item = elm_gengrid_item_append(grid, gic, item_info, _item_selected, item_info);
+ item_info->ordering = index;
+
+ index ++;
+ if (index == count) goto OUT;
+ evas_object_data_set(grid, DATA_KEY_LIST_INDEX, (void *) index);
+
+ return ECORE_CALLBACK_RENEW;
+
+OUT:
+ _APPS_D("Loading apps is done");
+
+ Elm_Object_Item *first_it = elm_gengrid_first_item_get(grid);
+ if (first_it) {
+ elm_gengrid_item_bring_in(first_it, ELM_GENGRID_ITEM_SCROLLTO_TOP);
+ evas_object_data_set(grid, DATA_KEY_CURRENT_ITEM, first_it);
+ }
+ evas_object_data_del(grid, DATA_KEY_LIST_INDEX);
+ evas_object_data_del(grid, DATA_KEY_TIMER);
+
+ index = 0;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+#define ITEM_STYLE "recent-apps"
+HAPI Evas_Object *grid_create(Evas_Object *win, Evas_Object *parent)
+{
+ Evas_Object *grid = NULL;
+ Elm_Gengrid_Item_Class *gic = NULL;
+ Ecore_Timer *timer = NULL;
+ instance_info_s *info = NULL;
+ Eina_List *list = evas_object_data_get(parent, DATA_KEY_LIST);
+ int count = eina_list_count(list);
+ double scale = elm_config_scale_get();
+ int w = (int)(ITEM_WIDTH * scale);
+ int h = (int)(ITEM_HEIGHT * scale);
+ int icon_w = (int)(ITEM_ICON_WIDTH * scale);
+ int icon_h = (int)(ITEM_ICON_HEIGHT * scale);
+
+ if (0 == count) return NULL;
+
+ info = evas_object_data_get(win, DATA_KEY_INSTANCE_INFO);
+ retv_if(!info, NULL);
+
+ grid = elm_gengrid_add(parent);
+ goto_if(NULL == grid, ERROR);
+ elm_object_theme_set(grid, apps_main_get_info()->theme);
+
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_min_set(grid, info->root_w, GRID_EDIT_HEIGHT);
+ evas_object_resize(grid, info->root_w, info->root_h);
+
+ elm_gengrid_item_size_set(grid, w, h);
+ elm_gengrid_align_set(grid, 0.5, 0.0);
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_gengrid_multi_select_set(grid, EINA_FALSE);
+
+ evas_object_data_set(grid, DATA_KEY_WIN, win);
+ evas_object_data_set(grid, DATA_KEY_LAYOUT, parent);
+ evas_object_data_set(grid, DATA_KEY_INSTANCE_INFO, info);
+ evas_object_data_set(grid, DATA_KEY_ITEM_ICON_WIDTH, (void *) icon_w);
+ evas_object_data_set(grid, DATA_KEY_ITEM_ICON_HEIGHT, (void *) icon_h);
+ evas_object_data_set(grid, DATA_KEY_ITEM_WIDTH, (void *) w);
+ evas_object_data_set(grid, DATA_KEY_ITEM_HEIGHT, (void *) h);
+ evas_object_data_set(grid, DATA_KEY_LIST, list);
+ evas_object_data_set(grid, DATA_KEY_LIST_INDEX, NULL);
+
+ gic = elm_gengrid_item_class_new();
+ goto_if(NULL == gic, ERROR);
+ gic->item_style = ITEM_STYLE;
+ gic->func.text_get = _text_get;
+ gic->func.content_get = _content_get;
+ gic->func.state_get = NULL;
+ gic->func.del = _del;
+ evas_object_data_set(grid, DATA_KEY_GIC, gic);
+
+ timer = ecore_timer_add(0.02f, _init_timer_cb, grid);
+ goto_if(NULL == timer, ERROR);
+
+ evas_object_data_set(grid, DATA_KEY_TIMER, timer);
+ evas_object_data_set(win, DATA_KEY_GRID, grid);
+
+ return grid;
+
+ERROR:
+ if (grid) grid_destroy(win, grid);
+ return NULL;
+}
+
+
+
+HAPI void grid_refresh(Evas_Object *grid)
+{
+ Ecore_Timer *timer;
+
+ ret_if(!grid);
+
+ /* 1. Clear all items in the gengrid */
+ elm_gengrid_clear(grid);
+
+ /* 2. Append items to the gengrid */
+ timer = evas_object_data_get(grid, DATA_KEY_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ evas_object_data_set(grid, DATA_KEY_TIMER, NULL);
+ }
+
+ timer = ecore_timer_add(0.02f, _init_timer_cb, grid);
+ ret_if(!timer);
+ evas_object_data_set(grid, DATA_KEY_TIMER, timer);
+}
+
+
+
+HAPI void grid_show_top(Evas_Object *grid)
+{
+ Elm_Object_Item *item;
+
+ ret_if(!grid);
+
+ item = elm_gengrid_first_item_get(grid);
+ ret_if(!item);
+
+ elm_gengrid_item_show(item, ELM_GENGRID_ITEM_SCROLLTO_TOP);
+}
+
+
+
+Eina_Bool _append_items_timer_cb(void *data)
+{
+ Evas_Object *grid = data;
+ Elm_Gengrid_Item_Class *gic = NULL;
+ Eina_List *list = NULL;
+ item_info_s *item_info = NULL;
+ int index, count;
+
+ retv_if(!grid, ECORE_CALLBACK_CANCEL);
+
+ list = evas_object_data_get(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_APPENDED);
+ retv_if(!list, ECORE_CALLBACK_CANCEL);
+
+ index = (int) evas_object_data_get(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX);
+ count = eina_list_count(list);
+ if (index == count) goto OUT;
+
+ gic = evas_object_data_get(grid, DATA_KEY_GIC);
+ goto_if(!gic, OUT);
+
+ item_info = eina_list_nth(list, index);
+ goto_if(!item_info, OUT);
+
+ item_info->item = elm_gengrid_item_append(grid, gic, item_info, _item_selected, item_info);
+ item_info->ordering = index;
+
+ index ++;
+ if (index == count) goto OUT;
+ evas_object_data_set(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX, (void *) index);
+
+ return ECORE_CALLBACK_RENEW;
+
+OUT:
+ _APPS_D("Loading apps is done");
+
+ Elm_Object_Item *first_it = elm_gengrid_first_item_get(grid);
+ if (first_it) {
+ elm_gengrid_item_bring_in(first_it, ELM_GENGRID_ITEM_SCROLLTO_TOP);
+ evas_object_data_set(grid, DATA_KEY_CURRENT_ITEM, first_it);
+ }
+ evas_object_data_del(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_TIMER);
+ evas_object_data_del(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX);
+ evas_object_data_del(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_APPENDED);
+
+ index = 0;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void grid_append_list(Evas_Object *grid, Eina_List *list)
+{
+ Ecore_Timer *timer = NULL;
+
+ ret_if(!grid);
+ ret_if(!list);
+
+ timer = evas_object_data_del(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ timer = ecore_timer_add(0.01f, _append_items_timer_cb, grid);
+ ret_if(!timer);
+ evas_object_data_set(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_TIMER, timer);
+ evas_object_data_set(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX, NULL);
+ evas_object_data_set(grid, PRIVATE_DATA_KEY_ITEM_INFO_LIST_APPENDED, list);
+}
+
+
+
+HAPI void grid_remove_list(Evas_Object *grid, Eina_List *list)
+{
+ const Eina_List *l, *ln;
+ item_info_s *item_info = NULL;
+
+ ret_if(!grid);
+ ret_if(!list);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, item_info) {
+ continue_if(!item_info);
+ if (item_info->item) elm_object_item_del(item_info->item);
+ item_info->item = NULL;
+ }
+}
+
+
+
+// End of a file
diff --git a/home/src/apps/item.c b/home/src/apps/item.c
new file mode 100755
index 0000000..bc1580b
--- /dev/null
+++ b/home/src/apps/item.c
@@ -0,0 +1,1095 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <efl_assist.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/apps_conf.h"
+#include "apps/effect.h"
+#include "apps/item.h"
+#include "apps/item_badge.h"
+#include "apps/item_info.h"
+#include "apps/layout.h"
+#include "apps/apps_main.h"
+#include "apps/pkgmgr.h"
+#include "apps/scroller.h"
+#include "apps/scroller_info.h"
+#include "apps/page.h"
+
+#define PRIVATE_DATA_KEY_CALL_X_FOR_MOVING "p_c_x_mv"
+#define PRIVATE_DATA_KEY_CALL_Y_FOR_MOVING "p_c_y_mv"
+#define PRIVATE_DATA_KEY_ITEM_LONGPRESS_TIMER "p_i_lp_t"
+#define PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING "p_it_ani_mv"
+#define PRIVATE_DATA_KEY_ITEM_PRESSED "p_i_p"
+#define PRIVATE_DATA_KEY_ITEM_DOWN_X "p_i_dx"
+#define PRIVATE_DATA_KEY_ITEM_DOWN_Y "p_i_dy"
+#define PRIVATE_DATA_KEY_ITEM_X_FOR_MOVING "p_i_x_mv"
+#define PRIVATE_DATA_KEY_ITEM_Y_FOR_MOVING "p_i_y_mv"
+#define PRIVATE_DATA_KEY_ITEM_X_FOR_ANIM "p_i_x"
+#define PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM "p_i_y"
+#define PRIVATE_DATA_KEY_ITEM_W "p_i_w"
+#define PRIVATE_DATA_KEY_ITEM_H "p_i_h"
+#define PRIVATE_DATA_KEY_ITEM_INNER "p_i_i"
+#define PRIVATE_DATA_KEY_SCROLLER_PRESS_ITEM "p_sc_p"
+#define PRIVATE_DATA_KEY_SCROLLER_Y "p_sc_y"
+#define PRIVATE_DATA_KEY_ITEM_IS_LONGPRESS "p_i_lp"
+#define PRIVATE_DATA_KEY_IS_VIRTUAL_ITEM "p_is_vi"
+#define PRIVATE_DATA_KEY_ITEM_ANIM_FOR_DIMMING "p_anim_dm"
+
+#define MOVE_THRESHOLD 5
+#define CALL_THRESHOLD 50
+
+
+
+static void _clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *item = data;
+ item_info_s *item_info = NULL;
+
+ _APPS_E("Clicked");
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ int isEdit = apps_layout_is_edited(item_info->layout);
+ if(isEdit) {
+ _APPS_E("Do not launch because of edit mode");
+ return;
+ }
+
+ /* Widget has to be launched by aul_launch_app */
+
+ if (!evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_IS_LONGPRESS)) {
+ apps_effect_play_sound();
+
+ if (apps_main_get_info()->tts && !item_info->tts) {
+ char tmp[NAME_LEN] = {0,};
+ snprintf(tmp, sizeof(tmp), _("IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"), item_info->name);
+ char *text = strdup(tmp);
+ util_create_toast_popup(item_info->layout, text);
+ return;
+ }
+
+ if (item_info->open_app) {
+ _APPS_D("item(%s) launched to aul_open", item_info->type);
+ apps_util_launch(item_info->win, item_info->appid, item_info->name);
+ } else {
+ _APPS_D("item(%s) launched to aul_launch", item_info->type);
+ apps_util_launch_main_operation(item_info->win, item_info->appid, item_info->name);
+ }
+ } else {
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_IS_LONGPRESS, (void*)0);
+ }
+}
+
+
+
+static Evas_Object *_content_set_item_inner(Evas_Object *item)
+{
+ Evas_Object *item_inner = NULL;
+ item_info_s *item_info = NULL;
+
+ item_inner = evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_INNER);
+ retv_if(!item_inner, NULL);
+
+ elm_object_part_content_set(item, "item_inner", item_inner);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, NULL);
+ apps_scroller_unfreeze(item_info->scroller);
+
+ return item;
+}
+
+
+
+static Evas_Object *_content_unset_item_inner(Evas_Object *item)
+{
+ Evas_Object *item_inner = NULL;
+ item_info_s *item_info = NULL;
+
+ item_inner = elm_object_part_content_unset(item, "item_inner");
+ retv_if(!item_inner, NULL);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_INNER, item_inner);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, NULL);
+
+ apps_scroller_freeze(item_info->scroller);
+
+ return item;
+}
+
+
+
+#define ANIM_RATE 3
+#define ANIM_RATE_SPARE ANIM_RATE - 1
+static Eina_Bool _anim_move_item_to_empty_position(void *data)
+{
+ Evas_Object *item = data;
+ item_info_s *item_info = NULL;
+ Evas_Object *scroller = NULL;
+ Evas_Object *item_inner = evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_INNER);
+ int cur_x, cur_y, end_x, end_y;
+ int vec_x, vec_y;
+
+ goto_if(!data, ERROR);
+ if(!item_inner) {
+ _APPS_D("item_inner was not unset");
+ goto ERROR;
+ }
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ goto_if(!item_info, ERROR);
+ scroller = item_info->scroller;
+
+ evas_object_geometry_get(item_inner, &cur_x, &cur_y, NULL, NULL);
+ end_x = (int)evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_X_FOR_ANIM);
+ end_y = (int)evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM);
+
+ if (cur_y == end_y && cur_x == end_x) {
+ goto_if (NULL == _content_set_item_inner(item), ERROR);
+ /* unfreeze the scroller after setting the content */
+ if (scroller) apps_scroller_unfreeze(scroller);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_X_FOR_ANIM);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
+
+ if (apps_layout_is_edited(item_info->layout) && !apps_main_get_info()->longpress_edit_disable) {
+ apps_layout_unedit(item_info->layout);
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ vec_y = (end_y - cur_y)/ANIM_RATE;
+ if (0 == vec_y) {
+ if (end_y - cur_y < 0) vec_y = -1;
+ else if (end_y - cur_y > 0) vec_y = 1;
+ }
+ cur_y += vec_y;
+
+ vec_x = (end_x - cur_x)/ANIM_RATE;
+ if (0 == vec_x) {
+ if (end_x - cur_x < 0) vec_x = -1;
+ else if (end_x - cur_x > 0) vec_x = 1;
+ }
+ cur_x += vec_x;
+
+ evas_object_move(item_inner, cur_x, cur_y);
+
+ return ECORE_CALLBACK_RENEW;
+
+ERROR:
+ if (item) {
+ if (scroller) apps_scroller_unfreeze(scroller);
+
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_IS_LONGPRESS, (void *) 0);
+
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_X_FOR_ANIM);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM);
+
+ }
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Eina_Bool _longpress_timer_cb(void *data)
+{
+ Evas_Object *item = NULL;
+ item_info_s *item_info = NULL;
+ Ecore_Timer *timer;
+
+ item = data;
+ retv_if(!item, ECORE_CALLBACK_CANCEL);
+
+ _APPS_D("longpress start");
+
+ apps_effect_play_vibration();
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, ECORE_CALLBACK_CANCEL);
+
+ if (!apps_layout_is_edited(item_info->layout)) {
+ apps_layout_edit(item_info->layout);
+ }
+
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_IS_LONGPRESS, (void *) 1);
+
+ timer = evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_LONGPRESS_TIMER);
+ if (timer) ecore_timer_del(timer);
+ else return ECORE_CALLBACK_CANCEL;
+
+ retv_if(!evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_PRESSED), ECORE_CALLBACK_CANCEL);
+ retv_if(!_content_unset_item_inner(item), ECORE_CALLBACK_CANCEL);
+
+ elm_object_signal_emit(item_info->item_inner, "name,hide", "item_inner");
+ elm_object_signal_emit(item_info->layout, "show", "checker");
+
+ return ECORE_CALLBACK_CANCEL;
+
+}
+
+
+
+static Eina_Bool _move_timer_cb(void *data)
+{
+ Evas_Object *item = data;
+ Evas_Object *pressed_item = NULL;
+ item_info_s *item_info = NULL;
+ int idx_above_item = -1;
+ int idx_below_item = -1;
+ int x, y, w, h, sy;
+
+ retv_if(!item, ECORE_CALLBACK_CANCEL);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, ECORE_CALLBACK_CANCEL);
+
+ idx_below_item = apps_scroller_seek_item_position(item_info->scroller, item);
+ retv_if(-1 == idx_below_item, ECORE_CALLBACK_CANCEL);
+
+ pressed_item = evas_object_data_get(item_info->scroller, PRIVATE_DATA_KEY_SCROLLER_PRESS_ITEM);
+ retv_if(!pressed_item, ECORE_CALLBACK_CANCEL);
+
+ idx_above_item = apps_scroller_seek_item_position(item_info->scroller, pressed_item);
+ retv_if(-1 == idx_above_item, ECORE_CALLBACK_CANCEL);
+
+ evas_object_geometry_get(item_info->center, &x, &y, &w, &h);
+ x = x + (w /2);
+ y = y + (h /2);
+
+ evas_object_data_set(pressed_item, PRIVATE_DATA_KEY_ITEM_X_FOR_ANIM, (void *) x);
+ evas_object_data_set(pressed_item, PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM, (void *) y);
+
+ elm_scroller_region_get(item_info->scroller, NULL, &sy, NULL, NULL);
+ sy += y;
+ evas_object_data_set(item_info->scroller, PRIVATE_DATA_KEY_SCROLLER_Y, (void *) sy);
+
+ if (idx_above_item < idx_below_item) {
+ apps_scroller_move_item_prev(item_info->scroller, pressed_item, item, pressed_item);
+ } else {
+ apps_scroller_move_item_next(item_info->scroller, item, pressed_item, pressed_item);
+ }
+
+ _APPS_D("Move an item(%s, %d) to (%d)", item_info->name, idx_below_item, idx_above_item);
+ evas_object_data_del(item_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+#define TIME_MOVE_ITEM 0.1f
+static void _upper_start_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *item = data;
+ Ecore_Timer *timer = NULL;
+ item_info_s *item_info = NULL;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ _APPS_D("Upper start : %s", item_info->name);
+
+ timer = evas_object_data_del(item_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ timer = ecore_timer_add(TIME_MOVE_ITEM, _move_timer_cb, item);
+ if (timer) evas_object_data_set(item_info->scroller, DATA_KEY_EVENT_UPPER_TIMER, timer);
+ else _APPS_E("Cannot add a timer");
+}
+
+
+
+static void _upper_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *item = data;
+ item_info_s *item_info = NULL;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+}
+
+
+
+static void _upper_end_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *item = data;
+ item_info_s *item_info = NULL;
+ Ecore_Timer *timer = NULL;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ _APPS_D("Upper end : %s", item_info->name);
+
+ timer = evas_object_data_del(item_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+}
+
+
+
+static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *item = NULL;
+ Evas_Object *item_inner = NULL;
+ Evas_Event_Mouse_Down *ei = event_info;
+ int x = ei->output.x;
+ int y = ei->output.y;
+ int center_x, center_y, center_w, center_h;
+ int sy;
+ Ecore_Timer *timer = NULL;
+ Ecore_Animator *move_anim = NULL;
+ Ecore_Animator *dim_anim = NULL;
+ item_info_s *item_info = NULL;
+
+ item = data;
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ int pos_x, pos_y, width, height;
+ evas_object_geometry_get(item, &pos_x, &pos_y, &width, &height);
+ _APPS_D("Down (%s,%p) (%d, %d), item pos(%d,%d,%d,%d)", item_info->name, obj, x, y, pos_x, pos_y, width, height);
+
+ if (apps_scroller_is_scrolling(item_info->scroller)) return;
+
+ dim_anim = evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_DIMMING);
+ if (dim_anim) return;
+
+ move_anim = evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
+ if (move_anim) return;
+
+ item_inner = elm_object_part_content_get(item, "item_inner");
+ if (!item_inner) {
+ item_inner = evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_INNER);
+ ret_if(!item_inner);
+ elm_object_part_content_set(item, "item_inner", item_inner);
+ }
+
+ evas_object_data_set(item_info->scroller, PRIVATE_DATA_KEY_SCROLLER_PRESS_ITEM, item);
+
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_PRESSED, (void *) 1);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_DOWN_X, (void *) x);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_DOWN_Y, (void *) y);
+
+ evas_object_data_set(item, PRIVATE_DATA_KEY_CALL_X_FOR_MOVING, (void *)x);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_CALL_Y_FOR_MOVING, (void *)y);
+
+ evas_object_geometry_get(item_info->center, &center_x, &center_y, &center_w, &center_h);
+ center_x += (center_w /2);
+ center_y += (center_h /2);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_X_FOR_ANIM, (void *) center_x);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM, (void *) center_y);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_X_FOR_MOVING, (void *) center_x);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_MOVING, (void *) center_y);
+
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_W, (void *) center_w);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_H, (void *) center_h);
+
+ elm_scroller_region_get(item_info->scroller, NULL, &sy, NULL, NULL);
+ sy += center_y;
+ evas_object_data_set(item_info->scroller, PRIVATE_DATA_KEY_SCROLLER_Y, (void *) sy);
+
+ item_is_pressed(item);
+
+ if(apps_main_get_info()->longpress_edit_disable) {
+ _APPS_E("longpress edit mode disable");
+ int isEdit = apps_layout_is_edited(item_info->layout);
+ if(isEdit) {
+ timer = ecore_timer_add(LONGPRESS_TIME, _longpress_timer_cb, item);
+ if (timer) evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_LONGPRESS_TIMER, timer);
+ else _APPS_E("Cannot add a timer");
+ }
+ }
+ else {
+ timer = ecore_timer_add(LONGPRESS_TIME, _longpress_timer_cb, item);
+ if (timer) evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_LONGPRESS_TIMER, timer);
+ else _APPS_E("Cannot add a timer");
+ }
+}
+
+
+
+static void _call_object(Evas_Object *item, int cur_x, int cur_y)
+{
+ Evas_Object *scroller = NULL;
+ Evas_Object *parent = NULL;
+ Evas_Object *tmp = NULL;
+ item_info_s *item_info = NULL;
+ Eina_List *obj_list = NULL;
+ const Eina_List *l, *ln;
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+ scroller = item_info->scroller;
+
+ evas_object_data_set(item_info->win, DATA_KEY_IS_ORDER_CHANGE, (void*)1);
+
+ obj_list = evas_tree_objects_at_xy_get(item_info->instance_info->e, NULL, cur_x, cur_y);
+ ret_if(!obj_list);
+
+ EINA_LIST_FOREACH_SAFE(obj_list, l, ln, tmp) {
+ parent = tmp;
+ while (parent) {
+ if (evas_object_data_get(parent, DATA_KEY_EVENT_UPPER_IS_ON)) {
+ Evas_Object *old_obj = evas_object_data_get(scroller, DATA_KEY_EVENT_UPPER_ITEM);
+ if (old_obj != parent) {
+ evas_object_smart_callback_call(old_obj, "upper_end", NULL);
+ evas_object_smart_callback_call(parent, "upper_start", NULL);
+ evas_object_data_set(scroller, DATA_KEY_EVENT_UPPER_ITEM, parent);
+ } else {
+ evas_object_smart_callback_call(parent, "upper", NULL);
+ }
+ return;
+ }
+
+ parent = evas_object_smart_parent_get(parent);
+ if (parent == scroller) {
+ Evas_Object *old_obj = evas_object_data_get(scroller, DATA_KEY_EVENT_UPPER_ITEM);
+ if (old_obj != scroller) evas_object_smart_callback_call(old_obj, "upper_end", NULL);
+ evas_object_data_set(scroller, DATA_KEY_EVENT_UPPER_ITEM, parent);
+ break;
+ }
+ }
+ }
+
+ eina_list_free(obj_list);
+}
+
+
+
+static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ei = event_info;
+ Evas_Object *item = data;
+ Evas_Object *item_inner = NULL;
+ Ecore_Timer *timer = NULL;
+ item_info_s *item_info = NULL;
+
+ int down_x, down_y, center_x, center_y;
+ int cur_x, cur_y, vec_x, vec_y;
+ int move_x, move_y;
+
+ ret_if(!item);
+ if (!evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_PRESSED)) {
+ return;
+ }
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ cur_x = ei->cur.output.x;
+ cur_y = ei->cur.output.y;
+
+ down_x = (int) evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_DOWN_X);
+ down_y = (int) evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_DOWN_Y);
+
+ center_x = (int) evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_X_FOR_MOVING);
+ center_y = (int) evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_MOVING);
+
+ move_x = (int) evas_object_data_get(item, PRIVATE_DATA_KEY_CALL_X_FOR_MOVING);
+ move_y = (int) evas_object_data_get(item, PRIVATE_DATA_KEY_CALL_Y_FOR_MOVING);
+
+ vec_x = cur_x - down_x;
+ vec_y = cur_y - down_y;
+
+ center_x += vec_x;
+ center_y += vec_y;
+
+ timer = evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_LONGPRESS_TIMER);
+ if (timer && (abs(vec_x) >= 20 || abs(vec_y) >= 20)) {
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_LONGPRESS_TIMER);
+ ecore_timer_del(timer);
+ return;
+ }
+ item_inner = evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_INNER);
+ if (!item_inner) return;
+
+ evas_object_move(item_inner, center_x, center_y);
+
+ vec_x = cur_x - move_x;
+ vec_y = cur_y - move_y;
+
+ if (abs(vec_x) >= CALL_THRESHOLD || abs(vec_y) >= CALL_THRESHOLD) {
+ _call_object(item, cur_x, cur_y);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_CALL_X_FOR_MOVING, (void *)cur_x);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_CALL_Y_FOR_MOVING, (void *)cur_y);
+ }
+}
+
+
+
+static void _up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *item = data;
+ Evas_Object *old_obj;
+ Evas_Event_Mouse_Up *ei = event_info;
+ Ecore_Timer *timer = NULL;
+ item_info_s *item_info = NULL;
+ Ecore_Animator *move_anim = NULL;
+ Ecore_Animator *dim_anim = NULL;
+
+ int x = ei->output.x;
+ int y = ei->output.y;
+ int down_sy, sy, sh;
+ int center_x, center_y;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ int pos_x, pos_y, width, height;
+ evas_object_geometry_get(item, &pos_x, &pos_y, &width, &height);
+ _APPS_D("Up (%s,%p) (%d, %d), item pos(%d,%d,%d,%d)", item_info->name, obj, x, y, pos_x, pos_y, width, height);
+
+ item_is_released(item);
+
+ //after apps_scroller_move_item_prev(), up_cb is comming again why???
+ if(evas_object_data_get(item, PRIVATE_DATA_KEY_IS_VIRTUAL_ITEM)) {
+ evas_object_data_del(item, PRIVATE_DATA_KEY_IS_VIRTUAL_ITEM);
+ return;
+ }
+
+ dim_anim = evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_DIMMING);
+ if (dim_anim) {
+ ecore_animator_del(dim_anim);
+ dim_anim = NULL;
+ }
+
+ move_anim = evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
+ if (move_anim) return;
+
+ evas_object_data_del(item_info->scroller, PRIVATE_DATA_KEY_SCROLLER_PRESS_ITEM);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_PRESSED);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_DOWN_X);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_DOWN_Y);
+ center_x = (int) evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_X_FOR_MOVING);
+ center_y = (int) evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_MOVING);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_CALL_X_FOR_MOVING);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_CALL_Y_FOR_MOVING);
+
+
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_W);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_H);
+
+ old_obj = evas_object_data_del(item_info->scroller, DATA_KEY_EVENT_UPPER_ITEM);
+ if (old_obj) {
+ evas_object_smart_callback_call(old_obj, "upper_end", NULL);
+ }
+
+ timer = evas_object_data_del(item_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_IS_LONGPRESS, (void *) 0);
+ timer = evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_LONGPRESS_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ timer = NULL;
+ return;
+ }
+
+ elm_scroller_region_get(item_info->scroller, NULL, &sy, NULL, &sh);
+ down_sy = (int)evas_object_data_del(item_info->scroller, PRIVATE_DATA_KEY_SCROLLER_Y);
+
+ if (down_sy <= sy){
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM, (void *)-200);
+ } else if (down_sy >= (sy + sh)) {
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM, (void *)1000);
+ } else {
+ int cur_x, cur_y, cur_w, cur_h;
+ evas_object_geometry_get(item_info->center, &cur_x, &cur_y, &cur_w, &cur_h);
+ cur_x += (cur_w /2);
+ cur_y += (cur_h /2);
+ if (cur_x != center_x || cur_y != center_y) {
+ _APPS_D("cur_x,cur_y: [%d, %d]", cur_x, cur_y);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_X_FOR_ANIM, (void *)cur_x);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM, (void *)cur_y);
+ }
+ }
+
+ //Check the virtual item
+ Evas_Object *virtual_item = apps_page_get_item_at(item_info->page, 0);
+ if(virtual_item != item)
+ {
+ int bIsVirtual = (int)evas_object_data_get(virtual_item, DATA_KEY_IS_VIRTUAL_ITEM);
+ if(bIsVirtual)
+ {
+ item_info_s *virtual_item_info = evas_object_data_get(virtual_item, DATA_KEY_ITEM_INFO);
+ int cur_x, cur_y, cur_w, cur_h;
+ evas_object_geometry_get(virtual_item_info->center, &cur_x, &cur_y, &cur_w, &cur_h);
+ cur_x += (cur_w /2);
+ cur_y += (cur_h /2);
+ _APPS_D("cur_x,cur_y: [%d, %d]", cur_x, cur_y);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_X_FOR_ANIM, (void *)cur_x);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_Y_FOR_ANIM, (void *)cur_y);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_IS_VIRTUAL_ITEM, (void *)EINA_TRUE);
+
+ apps_scroller_move_item_prev(item_info->scroller, virtual_item, item, virtual_item);
+ }
+ }
+#if 0
+ move_anim = evas_object_data_del(item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING);
+ if (move_anim) {
+ ecore_animator_del(move_anim);
+ move_anim = NULL;
+ }
+#endif
+ move_anim = ecore_animator_add(_anim_move_item_to_empty_position, item);
+ ret_if(!move_anim);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_MOVING, move_anim);
+
+ elm_object_signal_emit(item_info->item_inner, "name,show", "item_inner");
+ elm_object_signal_emit(item_info->layout, "hide", "checker");
+}
+
+
+HAPI void item_destroy(Evas_Object *item)
+{
+ Evas_Object *icon = NULL;
+ item_info_s *item_info = NULL;
+
+ ret_if(!item);
+
+ item_badge_destroy(item);
+
+ item_info = evas_object_data_del(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ if (APPS_ERROR_NONE != apps_pkgmgr_item_list_remove_item(item_info->pkgid, item_info->appid, item)) {
+ _APPS_E("Cannot remove item in the item_list");
+ }
+
+ icon = elm_object_part_content_unset(item_info->item_inner, "icon");
+ if (icon) evas_object_del(icon);
+ if (item_info->center) {
+ evas_object_data_del(item_info->center, DATA_KEY_EVENT_UPPER_IS_ON);
+ evas_object_del(item_info->center);
+ }
+ evas_object_del(item_info->item_inner);
+ evas_object_del(item);
+}
+
+
+
+static char *_access_info_cb(void *data, Evas_Object *obj)
+{
+ Evas_Object *item = data;
+ item_info_s *item_info = NULL;
+ char *tmp = NULL;
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, NULL);
+
+ tmp = strdup(item_info->name);
+ retv_if(!tmp, NULL);
+ return tmp;
+}
+
+
+
+static char *_access_item_badge_cb(void *data, Evas_Object *obj)
+{
+ Evas_Object *item = data;
+ char *tmp = NULL;
+ char number[BUFSZE];
+
+ int nBadgeCount = item_badge_count(item);
+ if(nBadgeCount == 1) {
+ snprintf(number, sizeof(number), _("IDS_TTS_BODY_1_NEW_ITEM"));
+ }
+ else if(nBadgeCount > 1) {
+ snprintf(number, sizeof(number), _("IDS_TTS_BODY_PD_NEW_ITEMS"), nBadgeCount);
+ }
+ else {
+ return NULL;
+ }
+
+ tmp = strdup(number);
+ retv_if(!tmp, NULL);
+
+ return tmp;
+}
+
+
+#define ITEM_EDJE_FILE EDJEDIR"/apps_item.edj"
+HAPI Evas_Object *item_create(Evas_Object *scroller, item_info_s *item_info)
+{
+ Evas_Object *item = NULL;
+ Evas_Object *item_inner = NULL;
+ Evas_Object *icon = NULL;
+ Evas_Object *center = NULL;
+ Evas_Object *focus = NULL;
+
+ scroller_info_s *scroller_info = NULL;
+ instance_info_s *instance_info = NULL;
+
+ double scale = elm_config_scale_get();
+ int w = (int)(ITEM_WIDTH * scale);
+ int h = (int)(ITEM_HEIGHT * scale);
+ int w_ef, h_ef;
+
+ retv_if(!scroller, NULL);
+ retv_if(!item_info, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+ instance_info = scroller_info->instance_info;
+
+ /* Item outer */
+ item = elm_layout_add(scroller);
+ retv_if(NULL == item, NULL);
+ elm_layout_file_set(item, ITEM_EDJE_FILE, "item");
+ evas_object_repeat_events_set(item, EINA_TRUE);
+ evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(item);
+
+ /* Item inner */
+ item_inner = elm_layout_add(scroller);
+ goto_if(NULL == item_inner, ERROR);
+ elm_layout_file_set(item_inner, ITEM_EDJE_FILE, "item_inner");
+ evas_object_repeat_events_set(item_inner, EINA_TRUE);
+ evas_object_size_hint_weight_set(item_inner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(item_inner);
+ elm_object_part_content_set(item, "item_inner", item_inner);
+
+ /* Center */
+ center = elm_layout_add(scroller);
+ retv_if(NULL == center, NULL);
+ elm_layout_file_set(center, ITEM_EDJE_FILE, "center");
+ evas_object_size_hint_min_set(center, w, h);
+ evas_object_show(center);
+ evas_object_smart_callback_add(center, "upper_start", _upper_start_cb, item);
+ evas_object_smart_callback_add(center, "upper", _upper_cb, item);
+ evas_object_smart_callback_add(center, "upper_end", _upper_end_cb, item);
+// evas_object_event_callback_add(center, EVAS_CALLBACK_MOUSE_DOWN, _center_down_cb, item);
+// evas_object_event_callback_add(center, EVAS_CALLBACK_MOUSE_UP, _center_up_cb, item);
+ evas_object_data_set(center, DATA_KEY_EVENT_UPPER_IS_ON, (void *) 1);
+
+ /* Icon & Text */
+ icon = evas_object_image_add(instance_info->e);
+ goto_if(NULL == icon, ERROR);
+ evas_object_repeat_events_set(icon, EINA_TRUE);
+ evas_object_image_file_set(icon, item_info->icon, NULL);
+ evas_object_image_filled_set(icon, EINA_TRUE);
+ evas_object_show(icon);
+
+ //Apply image effect
+ ea_effect_h *ea_effect_stroke = ea_image_effect_create();
+ ea_image_effect_add_outer_shadow(ea_effect_stroke, 0, 1.0, 1.5, 0x4C000000);
+ ea_object_image_effect_set(icon, ea_effect_stroke);
+ ea_image_effect_destroy(ea_effect_stroke);
+
+ ea_effect_h *ea_effect = ea_image_effect_create();
+ ea_image_effect_add_outer_shadow(ea_effect, -90, 4.0, 1.5, 0x4C000000);
+ ea_object_image_effect_set(icon, ea_effect);
+ ea_image_effect_destroy(ea_effect);
+
+ /* We have to check the icon size after ea_effect */
+ evas_object_image_size_get(icon, &w_ef, &h_ef);
+ _APPS_D("Icon size after ea_effect (%d:%d)", w_ef, h_ef);
+
+ elm_object_part_content_set(item_inner, "icon", icon);
+ elm_object_part_text_set(item_inner, "name", item_info->name);
+
+ focus = elm_button_add(item);
+ retv_if(NULL == focus, NULL);
+
+ elm_object_style_set(focus, "focus");
+ elm_object_part_content_set(item, "focus", focus);
+ elm_access_info_cb_set(focus, ELM_ACCESS_INFO, _access_info_cb, item);
+ elm_access_info_cb_set(focus, ELM_ACCESS_TYPE, NULL, NULL);
+ elm_access_info_cb_set(focus, ELM_ACCESS_STATE, _access_item_badge_cb, item);
+ elm_object_focus_allow_set(focus, EINA_FALSE);
+ evas_object_smart_callback_add(focus, "clicked", _clicked_cb, item);
+ evas_object_event_callback_add(focus, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, item);
+ evas_object_event_callback_add(focus, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, item);
+ evas_object_event_callback_add(focus, EVAS_CALLBACK_MOUSE_UP, _up_cb, item);
+
+ /* Item info */
+ item_info->win = scroller_info->win;
+ item_info->layout = scroller_info->layout;
+ item_info->instance_info = instance_info;
+
+ item_info->scroller = scroller;
+ item_info->box = scroller_info->box;
+
+ item_info->item = item;
+ item_info->item_inner = item_inner;
+ item_info->center = center;
+
+ evas_object_data_set(item, DATA_KEY_ITEM_INFO, item_info);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_IS_LONGPRESS, (void *) 0);
+
+ if (APPS_ERROR_NONE != item_badge_init(item)) _APPS_E("Cannot register badge");
+ if (APPS_ERROR_NONE != apps_pkgmgr_item_list_append_item(item_info->pkgid, item_info->appid, item)) {
+ _APPS_E("Cannot append item into the item_list");
+ }
+
+ return item;
+
+ERROR:
+ item_destroy(item);
+ return NULL;
+}
+
+
+
+HAPI Evas_Object *item_virtual_create(Evas_Object *scroller)
+{
+ Evas_Object *item = NULL;
+ Evas_Object *item_inner = NULL;
+ Evas_Object *center = NULL;
+
+ scroller_info_s *scroller_info = NULL;
+ instance_info_s *instance_info = NULL;
+
+ double scale = elm_config_scale_get();
+ int w = (int)(ITEM_WIDTH * scale);
+ int h = (int)(ITEM_HEIGHT * scale);
+
+ retv_if(!scroller, NULL);
+
+ item_info_s *item_info = calloc(1, sizeof(item_info_s));
+ retv_if(!item_info, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ if (!scroller_info) {
+ _E("cannot get the scroller_info");
+ free(item_info);
+ return NULL;
+ }
+ instance_info = scroller_info->instance_info;
+
+ /* Item outer */
+ item = elm_layout_add(scroller);
+ if (NULL == item) {
+ _E("cannot add a layout");
+ free(item_info);
+ return NULL;
+ }
+ elm_layout_file_set(item, ITEM_EDJE_FILE, "item");
+ evas_object_repeat_events_set(item, EINA_TRUE);
+ evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(item);
+ evas_object_data_set(item, DATA_KEY_ITEM_INFO, item_info);
+
+ /* Item inner */
+ item_inner = elm_layout_add(scroller);
+ goto_if(NULL == item_inner, ERROR);
+ elm_layout_file_set(item_inner, ITEM_EDJE_FILE, "item_inner");
+ evas_object_repeat_events_set(item_inner, EINA_TRUE);
+ evas_object_size_hint_weight_set(item_inner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(item_inner);
+ elm_object_part_content_set(item, "item_inner", item_inner);
+
+ /* Center */
+ center = elm_layout_add(scroller);
+ goto_if(NULL == center, ERROR);
+ elm_layout_file_set(center, ITEM_EDJE_FILE, "center");
+ evas_object_size_hint_min_set(center, w, h);
+ evas_object_show(center);
+ evas_object_smart_callback_add(center, "upper_start", _upper_start_cb, item);
+ evas_object_smart_callback_add(center, "upper", _upper_cb, item);
+ evas_object_smart_callback_add(center, "upper_end", _upper_end_cb, item);
+// evas_object_event_callback_add(center, EVAS_CALLBACK_MOUSE_DOWN, _center_down_cb, item);
+// evas_object_event_callback_add(center, EVAS_CALLBACK_MOUSE_UP, _center_up_cb, item);
+ evas_object_data_set(center, DATA_KEY_EVENT_UPPER_IS_ON, (void *) 1);
+
+ /* Item info */
+ item_info->icon = NULL;
+ item_info->name = NULL;
+
+ item_info->win = scroller_info->win;
+ item_info->layout = scroller_info->layout;
+ item_info->instance_info = instance_info;
+
+ item_info->scroller = scroller;
+ item_info->box = scroller_info->box;
+
+ item_info->item = item;
+ item_info->item_inner = item_inner;
+ item_info->center = center;
+
+ return item;
+
+ERROR:
+ item_virtual_destroy(item);
+ return NULL;
+}
+
+
+
+HAPI void item_virtual_destroy(Evas_Object *item)
+{
+ item_info_s *item_info = NULL;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_del(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ if (item_info->center) {
+ evas_object_data_del(item_info->center, DATA_KEY_EVENT_UPPER_IS_ON);
+ evas_object_del(item_info->center);
+ }
+ evas_object_del(item_info->item_inner);
+ evas_object_del(item);
+ free(item_info);
+}
+
+
+
+HAPI void item_change_language(Evas_Object *item)
+{
+ item_info_s *item_info = NULL;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+ ret_if(!item_info->item_inner);
+
+ elm_object_part_text_set(item_info->item_inner, "name", item_info->name);
+}
+
+
+
+HAPI void item_edit(Evas_Object *item)
+{
+ item_info_s *item_info = NULL;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+ ret_if(!item_info->item_inner);
+
+// elm_object_signal_emit(item_info->item, "edit", "item");
+// elm_object_signal_emit(item_info->item_inner, "edit", "item_inner");
+}
+
+
+
+HAPI void item_unedit(Evas_Object *item)
+{
+ item_info_s *item_info = NULL;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+ ret_if(!item_info->item_inner);
+
+// elm_object_signal_emit(item_info->item, "unedit", "item");
+// elm_object_signal_emit(item_info->item_inner, "unedit", "item_inner");
+}
+
+
+
+HAPI Evas_Object* item_get_press_item(Evas_Object *scroller)
+{
+ retv_if(!scroller, NULL);
+ return (Evas_Object*) evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_PRESS_ITEM);
+}
+
+
+
+HAPI int item_is_longpressed(Evas_Object *item)
+{
+ retv_if(!item, 0);
+ return (int) evas_object_data_get(item, PRIVATE_DATA_KEY_ITEM_IS_LONGPRESS);
+}
+
+
+static Eina_Bool _anim_item_pressed_cb(void *data)
+{
+ item_info_s *item_info = data;
+ retv_if(!item_info, ECORE_CALLBACK_CANCEL);
+ retv_if(!item_info->scroller, ECORE_CALLBACK_CANCEL);
+ retv_if(!item_info->item_inner, ECORE_CALLBACK_CANCEL);
+
+ if (apps_scroller_is_scrolling(item_info->scroller)) {
+ _APPS_E("apps_scroller_is_scrolling");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ _APPS_W("item is pressed");
+
+ elm_object_signal_emit(item_info->item_inner, "item,pressed", "item_inner");
+ edje_message_signal_process();
+
+ evas_object_data_del(item_info->item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_DIMMING);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+HAPI void item_is_pressed(Evas_Object *item)
+{
+ ret_if(!item);
+
+ item_info_s *item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ Ecore_Animator *dim_anim = ecore_animator_add(_anim_item_pressed_cb, item_info);
+ ret_if(!dim_anim);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_ITEM_ANIM_FOR_DIMMING, dim_anim);
+}
+
+
+static Eina_Bool _anim_item_released_cb(void *data)
+{
+ item_info_s *item_info = data;
+ retv_if(!item_info, ECORE_CALLBACK_CANCEL);
+ retv_if(!item_info->item_inner, ECORE_CALLBACK_CANCEL);
+
+ _APPS_W("item is released");
+
+ elm_object_signal_emit(item_info->item_inner, "item,released", "item_inner");
+ edje_message_signal_process();
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+HAPI void item_is_released(Evas_Object *item)
+{
+ ret_if(!item);
+
+ item_info_s *item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ Ecore_Animator *dim_anim = ecore_animator_add(_anim_item_released_cb, item_info);
+ ret_if(!dim_anim);
+}
+
+// End of this file
diff --git a/home/src/apps/item_badge.c b/home/src/apps/item_badge.c
new file mode 100755
index 0000000..6b25cf7
--- /dev/null
+++ b/home/src/apps/item_badge.c
@@ -0,0 +1,311 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <badge.h>
+#include <Elementary.h>
+#include <stdbool.h>
+#include <unicode/unum.h>
+#include <unicode/ustring.h>
+#include <vconf.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/scroller_info.h"
+#include "apps/item_badge.h"
+#include "apps/item_info.h"
+#include "apps/apps_main.h"
+
+
+#define PRIVATE_DATA_KEY_IDLE_TIMER "p_it"
+
+
+
+HAPI int item_badge_count(Evas_Object *item)
+{
+ item_info_s *item_info = NULL;
+ unsigned int is_display = 0;
+ unsigned int count = 0;
+ badge_error_e err = BADGE_ERROR_NONE;
+
+ retv_if(!item, 0);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, 0);
+
+ err = badge_get_display(item_info->appid, &is_display);
+ if (BADGE_ERROR_NONE != err) _APPS_E("cannot get badge display");
+
+ if (!is_display) return 0;
+
+ err = badge_get_count(item_info->appid, &count);
+ if (BADGE_ERROR_NONE != err) _APPS_E("cannot get badge count");
+
+ _APPS_SD("Badge for app %s : %u", item_info->appid, count);
+
+ return (int) count;
+}
+
+
+
+HAPI int item_badge_is_registered(const char *appid)
+{
+ bool existing = 0;
+ badge_error_e err = BADGE_ERROR_NONE;
+
+ retv_if(!appid, 0);
+
+ err = badge_is_existing(appid, &existing);
+ if (BADGE_ERROR_NONE != err) _APPS_E("cannot know whether the badge for %s is or not.", appid);
+
+ return existing? 1 : 0;
+}
+
+
+
+static Eina_Bool _idler_cb(void *data)
+{
+ Evas_Object *item = data;
+ int count;
+
+ retv_if(!item, ECORE_CALLBACK_CANCEL);
+
+ count = item_badge_count(item);
+ if (count) item_badge_show(item, count);
+ else item_badge_hide(item);
+
+ evas_object_data_del(item, PRIVATE_DATA_KEY_IDLE_TIMER);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI apps_error_e item_badge_init(Evas_Object *item)
+{
+ Ecore_Idler *idle_timer = NULL;
+ item_info_s *item_info = NULL;
+ int is_registered;
+
+ retv_if(!item, APPS_ERROR_INVALID_PARAMETER);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, APPS_ERROR_FAIL);
+
+ is_registered = item_badge_is_registered(item_info->appid);
+ if (!is_registered) {
+ return APPS_ERROR_NONE;
+ }
+
+ idle_timer = evas_object_data_get(item, PRIVATE_DATA_KEY_IDLE_TIMER);
+ if (idle_timer) {
+ ecore_idler_del(idle_timer);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_IDLE_TIMER);
+ }
+
+ idle_timer = ecore_idler_add(_idler_cb, item);
+ retv_if(NULL == idle_timer, APPS_ERROR_FAIL);
+ evas_object_data_set(item, PRIVATE_DATA_KEY_IDLE_TIMER, idle_timer);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI void item_badge_destroy(Evas_Object *item)
+{
+ Ecore_Idler *idle_timer = NULL;
+ item_info_s *item_info = NULL;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ idle_timer = evas_object_data_get(item, PRIVATE_DATA_KEY_IDLE_TIMER);
+ if (idle_timer) {
+ _APPS_D("Badge handler for app %s is not yet ready", item_info->appid);
+ evas_object_data_del(item, PRIVATE_DATA_KEY_IDLE_TIMER);
+ ecore_idler_del(idle_timer);
+ return;
+ }
+
+ item_badge_hide(item);
+}
+
+
+
+static void _badge_change_cb(unsigned int action, const char *appid, unsigned int count, void *data)
+{
+ Evas_Object *layout = data;
+ Evas_Object *item = NULL;
+ unsigned int is_display = 0;
+ badge_error_e err = BADGE_ERROR_NONE;
+
+ _APPS_SD("Badge changed, action : %u, appid : %s, count : %u", action, appid, count);
+
+ ret_if(!layout);
+ ret_if(!appid);
+
+ Evas_Object *scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+
+ scroller_info_s *scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ ret_if(!scroller_info->list);
+
+ item = apps_item_info_list_get_item(scroller_info->list, appid);
+ if (NULL == item) return;
+
+ if (BADGE_ACTION_REMOVE == action) {
+ count = 0;
+ is_display = 0;
+ } else {
+ err = badge_get_display(appid, &is_display);
+ if (BADGE_ERROR_NONE != err) _APPS_E("cannot get badge display");
+ if (!is_display) count = 0;
+ }
+
+ if (count) item_badge_show(item, count);
+ else item_badge_hide(item);
+}
+
+
+
+HAPI void item_badge_register_changed_cb(Evas_Object *layout)
+{
+ badge_error_e err;
+
+ err = badge_register_changed_cb(_badge_change_cb, layout);
+ ret_if(BADGE_ERROR_NONE != err);
+}
+
+
+
+HAPI void item_badge_unregister_changed_cb(void)
+{
+ badge_error_e err;
+
+ err = badge_unregister_changed_cb(_badge_change_cb);
+ ret_if(BADGE_ERROR_NONE != err);
+}
+
+
+
+static char *_get_count_str_from_icu(int count)
+{
+ char *p = NULL;
+ char *locale = NULL;
+
+ char *ret_str = NULL;
+ UErrorCode status = U_ZERO_ERROR;
+ uint32_t number = count;
+ UNumberFormat *num_fmt;
+ UChar result[20] = { 0, };
+ char res[20] = { 0, };
+ int32_t len = (int32_t) (sizeof(result) / sizeof((result)[0]));
+
+ locale = vconf_get_str(VCONFKEY_REGIONFORMAT);
+ retv_if(!locale, NULL);
+
+ if(locale[0] != '\0') {
+ p = strstr(locale, ".UTF-8");
+ if (p) *p = 0;
+ }
+
+ num_fmt = unum_open(UNUM_DEFAULT, NULL, -1, locale, NULL, &status);
+ unum_format(num_fmt, number, result, len, NULL, &status);
+ u_austrcpy(res, result);
+ unum_close(num_fmt);
+
+ ret_str = strdup(res);
+ free(locale);
+ return ret_str;
+}
+
+
+
+#define BADGE_SIGNAL_LEN 16
+#define MAX_BADGE_COUNT 999
+HAPI void item_badge_show(Evas_Object *item, int count)
+{
+ item_info_s *item_info = NULL;
+ char *str = NULL;
+ char badge_signal[16];
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ if (count > MAX_BADGE_COUNT) count = MAX_BADGE_COUNT;
+
+ str = _get_count_str_from_icu(count);
+ elm_object_part_text_set(item_info->item_inner, "badge_txt", str);
+
+ if (count <= 0) {
+ snprintf(badge_signal, sizeof(badge_signal), "badge,off");
+ } else if (count < 10) {
+ snprintf(badge_signal, sizeof(badge_signal), "badge,on,1");
+ } else if (count < 100) {
+ snprintf(badge_signal, sizeof(badge_signal), "badge,on,2");
+ } else {
+ snprintf(badge_signal, sizeof(badge_signal), "badge,on,3");
+ }
+ elm_object_signal_emit(item_info->item_inner, badge_signal, "item");
+
+ free(str);
+}
+
+
+
+HAPI void item_badge_hide(Evas_Object *item)
+{
+ item_info_s *item_info = NULL;
+
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+ elm_object_signal_emit(item_info->item_inner, "badge,off", "item");
+}
+
+
+
+HAPI void item_badge_change_language(Evas_Object *item)
+{
+ int count = 0;
+
+ ret_if(!item);
+
+ count = item_badge_count(item);
+ if (count) item_badge_show(item, count);
+ else item_badge_hide(item);
+}
+
+
+
+HAPI void item_badge_remove(const char *pkgid)
+{
+ ret_if(!pkgid);
+
+ _APPS_SD("pkgid: [%s]", pkgid);
+
+ badge_remove(pkgid);
+}
+
+
+// End of a file
diff --git a/home/src/apps/item_info.c b/home/src/apps/item_info.c
new file mode 100755
index 0000000..80cd10e
--- /dev/null
+++ b/home/src/apps/item_info.c
@@ -0,0 +1,483 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/stat.h>
+#include <pkgmgr-info.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/db.h"
+#include "apps/item_info.h"
+#include "apps/list.h"
+#include "apps/apps_main.h"
+#include "apps/xml.h"
+
+#define APP_TYPE_WGT "wgt"
+
+
+
+HAPI void apps_item_info_destroy(item_info_s *item_info)
+{
+ ret_if(!item_info);
+
+ if (item_info->pkgid) free(item_info->pkgid);
+ if (item_info->appid) free(item_info->appid);
+ if (item_info->name) free(item_info->name);
+ if (item_info->icon) free(item_info->icon);
+ if (item_info->type) free(item_info->type);
+ if (item_info) free(item_info);
+}
+
+
+
+HAPI item_info_s *apps_item_info_create(const char *appid)
+{
+ item_info_s *item_info = NULL;
+ pkgmgrinfo_appinfo_h appinfo_h = NULL;
+ pkgmgrinfo_pkginfo_h pkghandle = NULL;
+ char *pkgid = NULL;
+ char *name = NULL;
+ char *icon = NULL;
+ char *type = NULL;
+ bool nodisplay = false;
+ bool enabled = false;
+
+ retv_if(!appid, NULL);
+
+ item_info = calloc(1, sizeof(item_info_s));
+ if (NULL == item_info) {
+ return NULL;
+ }
+
+ goto_if(0 > pkgmgrinfo_appinfo_get_appinfo(appid, &appinfo_h), ERROR);
+
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_get_label(appinfo_h, &name), ERROR);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_get_icon(appinfo_h, &icon), ERROR);
+
+ do {
+ break_if(PMINFO_R_OK != pkgmgrinfo_appinfo_get_pkgid(appinfo_h, &pkgid));
+ break_if(NULL == pkgid);
+
+ break_if(0 > pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &pkghandle));
+ break_if(NULL == pkghandle);
+ } while (0);
+
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_is_nodisplay(appinfo_h, &nodisplay), ERROR);
+ if (nodisplay) goto ERROR;
+
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_is_enabled(appinfo_h, &enabled), ERROR);
+ if (!enabled) goto ERROR;
+
+ goto_if(PMINFO_R_OK != pkgmgrinfo_pkginfo_get_type(pkghandle, &type), ERROR);
+#ifdef RUN_ON_DEVICE
+ int support_mode = 0;
+ goto_if(PMINFO_R_OK != pkgmgrinfo_pkginfo_get_support_mode(pkghandle, &support_mode), ERROR);
+#endif
+
+ if (pkgid) {
+ item_info->pkgid = strdup(pkgid);
+ goto_if(NULL == item_info->pkgid, ERROR);
+ }
+
+ item_info->appid = strdup(appid);
+ goto_if(NULL == item_info->appid, ERROR);
+
+ if (name) {
+ item_info->name = strdup(name);
+ goto_if(NULL == item_info->name, ERROR);
+ }
+
+ if (type) {
+ item_info->type = strdup(type);
+ goto_if(NULL == item_info->type, ERROR);
+ if (!strncmp(item_info->type, APP_TYPE_WGT, strlen(APP_TYPE_WGT))) {
+ item_info->open_app = 1;
+ } else {
+ item_info->open_app = 0;
+ }
+ }
+
+ if (icon) {
+ if (strlen(icon) > 0) {
+ item_info->icon = strdup(icon);
+ goto_if(NULL == item_info->icon, ERROR);
+ } else {
+ item_info->icon = strdup(DEFAULT_ICON);
+ goto_if(NULL == item_info->icon, ERROR);
+ }
+ } else {
+ item_info->icon = strdup(DEFAULT_ICON);
+ goto_if(NULL == item_info->icon, ERROR);
+ }
+
+#ifdef RUN_ON_DEVICE
+ if (support_mode & PMINFO_MODE_PROP_SCREEN_READER)
+ item_info->tts = 1;
+ else
+ item_info->tts = 0;
+#else
+ item_info->tts = 1;
+#endif
+
+ pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ if (pkghandle) pkgmgrinfo_pkginfo_destroy_pkginfo(pkghandle);
+
+ return item_info;
+
+ERROR:
+ apps_item_info_destroy(item_info);
+ if (appinfo_h) pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ if (pkghandle) pkgmgrinfo_pkginfo_destroy_pkginfo(pkghandle);
+
+ return NULL;
+}
+
+
+
+HAPI item_info_s *apps_item_info_get(Evas_Object *win, const char *appid)
+{
+ Evas_Object *layout = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ item_info_s *info = NULL;
+
+ retv_if(!win, NULL);
+ retv_if(!appid, NULL);
+
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ retv_if(!layout, NULL);
+
+ list = evas_object_data_get(layout, DATA_KEY_LIST);
+ retv_if(!list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, info) {
+ continue_if(!info);
+ continue_if(!info->appid);
+ if (!strncmp(info->appid, appid, strlen(appid))) {
+ return info;
+ }
+ }
+
+ return NULL;
+}
+
+
+
+static int _apps_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+ Eina_List **list = user_data;
+ char *appid = NULL;
+ item_info_s *item_info = NULL;
+
+ retv_if(NULL == handle, 0);
+ retv_if(NULL == user_data, 0);
+
+ pkgmgrinfo_appinfo_get_appid(handle, &appid);
+ retv_if(NULL == appid, 0);
+
+ if (apps_db_count_item(appid)) {
+ _APPS_D("%s is Top 4", appid);
+ return 0;
+ }
+
+ item_info = apps_item_info_create(appid);
+ if (NULL == item_info) {
+ _APPS_D("%s does not have the item_info", appid);
+ return 0;
+ }
+
+ *list = eina_list_append(*list, item_info);
+
+ return 0;
+}
+
+
+
+static int _apps_sort_cb(const void *d1, const void *d2)
+{
+ item_info_s *tmp1 = (item_info_s *) d1;
+ item_info_s *tmp2 = (item_info_s *) d2;
+
+ if (NULL == tmp1 || NULL == tmp1->name) return 1;
+ else if (NULL == tmp2 || NULL == tmp2->name) return -1;
+
+ return strcmp(tmp1->name, tmp2->name);
+}
+
+
+
+static Eina_List *_read_all_except_top4(Eina_List **list)
+{
+ pkgmgrinfo_appinfo_filter_h handle = NULL;
+
+ retv_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_create(&handle), NULL);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_NODISPLAY, 0), ERROR);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, _apps_cb, list), ERROR);
+
+ *list = eina_list_sort(*list, eina_list_count(*list), _apps_sort_cb);
+
+ERROR:
+ if (handle) pkgmgrinfo_appinfo_filter_destroy(handle);
+
+ return *list;
+}
+
+
+
+static int _apps_all_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+ Eina_List **list = user_data;
+ char *appid = NULL;
+ item_info_s *item_info = NULL;
+
+ retv_if(NULL == handle, 0);
+ retv_if(NULL == user_data, 0);
+
+ pkgmgrinfo_appinfo_get_appid(handle, &appid);
+ retv_if(NULL == appid, 0);
+
+ item_info = apps_item_info_create(appid);
+ if (NULL == item_info) {
+ _APPS_D("%s does not have the item_info", appid);
+ return 0;
+ }
+
+ *list = eina_list_append(*list, item_info);
+
+ return 0;
+}
+
+
+
+static Eina_List *_read_all_apps(Eina_List **list)
+{
+ pkgmgrinfo_appinfo_filter_h handle = NULL;
+
+ retv_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_create(&handle), NULL);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_NODISPLAY, 0), ERROR);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, _apps_all_cb, list), ERROR);
+
+ *list = eina_list_sort(*list, eina_list_count(*list), _apps_sort_cb);
+
+ERROR:
+ if (handle) pkgmgrinfo_appinfo_filter_destroy(handle);
+
+ return *list;
+}
+
+
+
+static int _find_appid_cb(const void *d1, const void *d2)
+{
+ item_info_s *tmp1 = (item_info_s *) d1;
+ item_info_s *tmp2 = (item_info_s *) d2;
+
+ if (NULL == tmp1 || NULL == tmp1->appid) return 1;
+ else if (NULL == tmp2 || NULL == tmp2->appid) return -1;
+
+ return strcmp(tmp1->appid, tmp2->appid);
+}
+
+
+
+#define APPS_DEFAULT_ITEM_XML_FILE RESDIR"/apps_default_items.xml"
+HAPI Eina_List *apps_item_info_list_create(item_info_list_type_e list_type)
+{
+ Eina_List *list = NULL;
+
+ switch (list_type) {
+ case ITEM_INFO_LIST_TYPE_ALL:
+ /* It doesn't care whether the list is NULL or not */
+ list = apps_db_write_list();
+ list = _read_all_except_top4(&list);
+ break;
+ case ITEM_INFO_LIST_TYPE_XML:
+ {
+ Eina_List *xml_list = NULL;
+ Eina_List *pkgmgr_list = NULL;
+
+ xml_list = apps_xml_write_list(APPS_DEFAULT_ITEM_XML_FILE);
+ _read_all_apps(&pkgmgr_list);
+
+ const Eina_List *l, *ln;
+ item_info_s *item_info = NULL;
+ EINA_LIST_FOREACH_SAFE(xml_list, l, ln, item_info) {
+ item_info_s *data = eina_list_search_unsorted(pkgmgr_list, _find_appid_cb, item_info);
+ if(data) {
+ _APPS_D("remove apps[%s] from pkg list", data->appid);
+ pkgmgr_list = eina_list_remove(pkgmgr_list, data);
+ apps_item_info_destroy(data);
+ }
+ }
+
+ int nPkgListCount = eina_list_count(pkgmgr_list);
+ _APPS_D("pkg list count[%d]", nPkgListCount);
+ if(nPkgListCount) {
+ list = eina_list_merge(xml_list, pkgmgr_list);
+ }
+ else {
+ eina_list_free(pkgmgr_list);
+ list = xml_list;
+ }
+ }
+ break;
+ default:
+ _APPS_E("Cannot reach here");
+ break;
+ }
+
+ return list;
+}
+
+
+
+HAPI void apps_item_info_list_destroy(Eina_List *item_info_list)
+{
+ item_info_s *item_info = NULL;
+
+ ret_if(!item_info_list);
+
+ EINA_LIST_FREE(item_info_list, item_info) {
+ continue_if(!item_info);
+ apps_item_info_destroy(item_info);
+ }
+}
+
+
+
+HAPI Evas_Object *apps_item_info_list_get_item(Eina_List *item_info_list, const char *appid)
+{
+ const Eina_List *l, *ln;
+ item_info_s *item_info = NULL;
+
+ retv_if(!item_info_list, NULL);
+ retv_if(!appid, NULL);
+
+ EINA_LIST_FOREACH_SAFE(item_info_list, l, ln, item_info) {
+ continue_if(!item_info);
+ continue_if(!item_info->appid);
+ _APPS_SD("item_info->appid[%s]", item_info->appid);
+ if (strncmp(item_info->appid, appid, strlen(appid))) continue;
+
+ return item_info->item;
+ }
+
+ return NULL;
+}
+
+
+
+HAPI int apps_item_info_list_get_ordering(Eina_List *item_info_list, const char *appid)
+{
+ const Eina_List *l, *ln;
+ item_info_s *item_info = NULL;
+
+ retv_if(!item_info_list, -1);
+ retv_if(!appid, -1);
+
+ EINA_LIST_FOREACH_SAFE(item_info_list, l, ln, item_info) {
+ continue_if(!item_info);
+ continue_if(!item_info->appid);
+ if (strncmp(item_info->appid, appid, strlen(appid))) continue;
+
+ return item_info->ordering;
+ }
+
+ return -1;
+}
+
+
+
+static char *_get_app_name(const char *appid)
+{
+ pkgmgrinfo_appinfo_h appinfo_h = NULL;
+ char *tmp = NULL;
+ char *name = NULL;
+
+ retv_if(0 > pkgmgrinfo_appinfo_get_appinfo(appid, &appinfo_h), NULL);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_get_label(appinfo_h, &tmp), ERROR);
+
+ if (tmp) {
+ name = strdup(tmp);
+ goto_if(NULL == name, ERROR);
+ }
+
+ pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ return name;
+
+ERROR:
+ pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ return NULL;
+}
+
+
+
+HAPI void apps_item_info_list_change_language(Eina_List *item_info_list)
+{
+ item_info_s *item_info = NULL;
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+
+ ret_if(!item_info_list);
+
+ EINA_LIST_FOREACH_SAFE(item_info_list, l, ln, item_info) {
+ continue_if(!item_info);
+ free(item_info->name);
+ item_info->name = _get_app_name(item_info->appid);
+ }
+}
+
+
+HAPI int apps_item_info_is_support_tts(const char *appid)
+{
+ pkgmgrinfo_appinfo_h appinfo_h = NULL;
+ pkgmgrinfo_pkginfo_h pkghandle = NULL;
+ char *pkgid = NULL;
+ int support_mode = 0;
+ int istts = 0;
+
+ retv_if(!appid, 0);
+
+ goto_if(0 > pkgmgrinfo_appinfo_get_appinfo(appid, &appinfo_h), ERROR);
+
+ do {
+ break_if(PMINFO_R_OK != pkgmgrinfo_appinfo_get_pkgid(appinfo_h, &pkgid));
+ break_if(NULL == pkgid);
+
+ break_if(0 > pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &pkghandle));
+ break_if(NULL == pkghandle);
+ } while (0);
+
+ goto_if(PMINFO_R_OK != pkgmgrinfo_pkginfo_get_support_mode(pkghandle, &support_mode), ERROR);
+
+ if (support_mode & PMINFO_MODE_PROP_SCREEN_READER)
+ istts = 1;
+ else
+ istts = 0;
+
+ pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ if (pkghandle) pkgmgrinfo_pkginfo_destroy_pkginfo(pkghandle);
+
+ return istts;
+
+ERROR:
+ if (appinfo_h) pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ if (pkghandle) pkgmgrinfo_pkginfo_destroy_pkginfo(pkghandle);
+
+ return istts;
+}
+// End of a file
diff --git a/home/src/apps/lang.c b/home/src/apps/lang.c
new file mode 100755
index 0000000..0b3904c
--- /dev/null
+++ b/home/src/apps/lang.c
@@ -0,0 +1,150 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+
+#include "log.h"
+#include "util.h"
+
+
+
+static Eina_List *lang_list;
+static Eina_List *cbs_list;
+
+typedef struct {
+ Evas_Object *obj;
+ const char *group;
+ const char *id;
+ int domain;
+} lang_element;
+
+
+
+HAPI apps_error_e apps_lang_add_id(Evas_Object *obj, const char *group, const char *id, int domain)
+{
+ lang_element *le;
+
+ retv_if(NULL == obj, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == group, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == id, APPS_ERROR_INVALID_PARAMETER);
+
+ le = malloc(sizeof(lang_element));
+ retv_if(NULL == le, APPS_ERROR_FAIL);
+
+ le->obj = obj;
+ le->group = group;
+ le->id = id;
+ le->domain = domain;
+
+ lang_list = eina_list_append(lang_list, le);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI void apps_lang_remove_id(Evas_Object *obj, const char *group)
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ lang_element *le;
+
+ ret_if(NULL == obj);
+ ret_if(NULL == group);
+
+ EINA_LIST_FOREACH_SAFE(lang_list, l, n, le) {
+ if (le->obj == obj && !strcmp(group, le->group)) {
+ lang_list = eina_list_remove(lang_list, le);
+ free(le);
+ return;
+ }
+ }
+}
+
+
+
+typedef struct {
+ apps_error_e (*result_cb)(void *);
+ void *result_data;
+} cb_s;
+
+
+
+HAPI apps_error_e apps_lang_register_cb(apps_error_e (*result_cb)(void *), void *result_data)
+{
+ cb_s *cb = NULL;
+
+ retv_if(NULL == result_cb, APPS_ERROR_INVALID_PARAMETER);
+
+ cb = calloc(1, sizeof(cb_s));
+ retv_if(NULL == cb, APPS_ERROR_FAIL);
+
+ cb->result_cb = result_cb;
+ cb->result_data = result_data;
+
+ cbs_list = eina_list_append(cbs_list, cb);
+ retv_if(NULL == cbs_list, APPS_ERROR_FAIL);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI void apps_lang_unregister_cb(apps_error_e (*result_cb)(void *))
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ cb_s *cb;
+
+ EINA_LIST_FOREACH_SAFE(cbs_list, l, n, cb) {
+ continue_if(NULL == cb);
+ if (result_cb != cb->result_cb) continue;
+ cbs_list = eina_list_remove(cbs_list, cb);
+ free(cb);
+ return;
+ }
+}
+
+
+
+HAPI void apps_lang_refresh_ids(void)
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ lang_element *le;
+ char *temp;
+
+ EINA_LIST_FOREACH_SAFE(lang_list, l, n, le) {
+ if (le->domain) {
+ temp = D_(le->id);
+ } else {
+ temp = _(le->id);
+ }
+
+ elm_object_part_text_set(le->obj, le->group, temp);
+ }
+
+ cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(cbs_list, l, n, cb) {
+ continue_if(NULL == cb);
+ continue_if(NULL == cb->result_cb);
+
+ if (APPS_ERROR_NONE != cb->result_cb(cb->result_data)) _APPS_E("There are some problems");
+ }
+}
+
+// End of a file
diff --git a/home/src/apps/layout.c b/home/src/apps/layout.c
new file mode 100755
index 0000000..42cf328
--- /dev/null
+++ b/home/src/apps/layout.c
@@ -0,0 +1,695 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Ecore_X.h>
+#include <app_control.h>
+#include <efl_assist.h>
+
+#include "log.h"
+#include "util.h"
+#include "key.h"
+#include "main.h"
+#include "layout_info.h"
+#include "tutorial.h"
+#include "apps/apps_conf.h"
+#include "apps/db.h"
+#include "apps/item_badge.h"
+#include "apps/item_info.h"
+#include "apps/layout.h"
+#include "apps/list.h"
+#include "apps/apps_main.h"
+#include "apps/scroller.h"
+#include "apps/scroller_info.h"
+#include "apps/item.h"
+
+
+#define PRIVATE_DATA_KEY_CHECKER_TYPE "ck_tp"
+#define PRIVATE_DATA_KEY_DOWN_X "dw_x"
+#define PRIVATE_DATA_KEY_DOWN_Y "dw_y"
+#define PRIVATE_DATA_KEY_TOP_CHECKER "top_ck"
+#define PRIVATE_DATA_KEY_BOTTOM_CHECKER "bt_ck"
+#define PRIVATE_DATA_KEY_LAYOUT_IS_EDITED "p_ly_ed"
+
+#define MOVE_UP -2
+#define MOVE_DOWN 2
+
+
+
+static void _bg_down_cb(void *data, Evas_Object *obj, const char* emission, const char* source)
+{
+ _APPS_D("BG is pressed");
+}
+
+
+
+static void _bg_up_cb(void *data, Evas_Object *obj, const char* emission, const char* source)
+{
+ _APPS_D("BG is released");
+}
+
+
+static key_cb_ret_e _back_key_cb(void *data)
+{
+ _APPS_D("Back key cb");
+ Evas_Object *win = data;
+ Evas_Object *popup = NULL;
+
+ popup = evas_object_data_del(win, DATA_KEY_CHECK_POPUP);
+ if (popup) {
+ evas_object_del(popup);
+ }
+
+ Eina_Bool bVisible = evas_object_visible_get(win);
+ _APPS_D("apps status:[%d]", bVisible);
+ if(bVisible) {
+ if (APPS_ERROR_FAIL == apps_layout_show(win, EINA_FALSE)) {
+ _APPS_E("Cannot show tray");
+ }
+ return KEY_CB_RET_STOP;
+ }
+ else {
+ return KEY_CB_RET_CONTINUE;
+ }
+}
+
+
+static apps_error_e _pause_result_cb(void *data)
+{
+ instance_info_s *info = data;
+
+ retv_if(!info, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(!info->layout, APPS_ERROR_FAIL);
+
+ Evas_Object *popup = evas_object_data_get(info->layout, DATA_KEY_POPUP);
+ if(popup) {
+ evas_object_del(popup);
+ }
+
+ popup = evas_object_data_del(info->win, DATA_KEY_CHECK_POPUP);
+ if (popup) {
+ evas_object_del(popup);
+ }
+
+ evas_object_data_set(info->layout, DATA_KEY_POPUP, NULL);
+ evas_object_data_set(info->layout, DATA_KEY_LAYOUT_IS_PAUSED, (void *) 1);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _resume_result_cb(void *data)
+{
+ instance_info_s *info = data;
+
+ retv_if(!info, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(!info->layout, APPS_ERROR_FAIL);
+
+ evas_object_data_set(info->layout, DATA_KEY_LAYOUT_IS_PAUSED, NULL);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _reset_result_cb(void *data)
+{
+ instance_info_s *info = data;
+ Evas_Object *layout = NULL;
+
+ retv_if(!info, APPS_ERROR_INVALID_PARAMETER);
+
+ layout = evas_object_data_get(info->win, DATA_KEY_LAYOUT);
+ retv_if(!layout, APPS_ERROR_FAIL);
+ evas_object_data_set(layout, DATA_KEY_LAYOUT_IS_PAUSED, NULL);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+static Eina_Bool _move_timer_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ int checker_type = 0;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+ checker_type = (int)evas_object_data_get(scroller, PRIVATE_DATA_KEY_CHECKER_TYPE);
+
+ apps_scroller_unfreeze(scroller);
+ apps_scroller_bring_in_region_by_vector(scroller, checker_type);
+ apps_scroller_freeze(scroller);
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+
+
+#define TIME_MOVE_SCROLLER 1.0f
+static void _upper_start_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *checker = obj;
+ Evas_Object *layout = data;
+ Evas_Object *scroller = NULL;
+ Ecore_Timer *timer = NULL;
+ int checker_type = 0;
+
+ _APPS_D("checker upper start");
+
+ ret_if(!checker);
+ ret_if(!layout);
+ scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+ checker_type = (int)evas_object_data_get(checker, PRIVATE_DATA_KEY_CHECKER_TYPE);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_CHECKER_TYPE, (void *)checker_type);
+
+ timer = evas_object_data_del(scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ timer = ecore_timer_add(TIME_MOVE_SCROLLER, _move_timer_cb, scroller);
+ if (timer) evas_object_data_set(scroller, DATA_KEY_EVENT_UPPER_TIMER, timer);
+ else _APPS_E("Cannot add a timer");
+}
+
+
+
+static void _upper_end_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *checker = obj;
+ Evas_Object *layout = data;
+ Evas_Object *scroller = NULL;
+ Ecore_Timer *timer = NULL;
+
+ _APPS_D("checker upper end");
+
+ ret_if(!checker);
+ ret_if(!layout);
+ scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+
+ timer = evas_object_data_del(scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ }
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_CHECKER_TYPE);
+}
+
+
+
+static Evas_Object *_create_checker(Evas_Object *layout, int type)
+{
+ Evas_Object *checker;
+
+ retv_if(!layout, NULL);
+
+ checker = elm_button_add(layout);
+ evas_object_size_hint_weight_set(checker, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(checker, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_color_set(checker, 0, 0, 0, 0);
+ if (MOVE_UP == type) {
+ elm_object_part_content_set(layout, "top_checker", checker);
+ evas_object_data_set(checker, PRIVATE_DATA_KEY_CHECKER_TYPE, (void *)MOVE_UP);
+ } else if (MOVE_DOWN == type) {
+ elm_object_part_content_set(layout, "bottom_checker", checker);
+ evas_object_data_set(checker, PRIVATE_DATA_KEY_CHECKER_TYPE, (void *)MOVE_DOWN);
+ }
+ evas_object_data_set(checker, DATA_KEY_EVENT_UPPER_IS_ON, (void *) 1);
+
+ evas_object_smart_callback_add(checker, "upper_start", _upper_start_cb, layout);
+ evas_object_smart_callback_add(checker, "upper_end", _upper_end_cb, layout);
+ evas_object_show(checker);
+
+ return checker;
+}
+
+
+
+static void _destroy_checker(Evas_Object *checker)
+{
+ evas_object_data_del(checker, DATA_KEY_EVENT_UPPER_IS_ON);
+ evas_object_data_del(checker, PRIVATE_DATA_KEY_CHECKER_TYPE);
+ evas_object_del(checker);
+}
+
+
+
+static Eina_Bool _push_items_cb(void *layout)
+{
+ Evas_Object *scroller = NULL;
+ Eina_List *item_info_list = NULL;
+ instance_info_s *info = NULL;
+ int count = 0;
+
+ retv_if(!layout, ECORE_CALLBACK_CANCEL);
+
+ info = evas_object_data_get(layout, DATA_KEY_INSTANCE_INFO);
+ retv_if(!info, ECORE_CALLBACK_CANCEL);
+
+ /* scroller */
+ scroller = apps_scroller_create(layout);
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+ evas_object_data_set(layout, DATA_KEY_SCROLLER, scroller);
+ evas_object_show(scroller);
+
+ elm_object_part_content_set(layout, "scroller", scroller);
+
+ if (apps_main_get_info()->first_boot) {
+ item_info_list = apps_item_info_list_create(ITEM_INFO_LIST_TYPE_XML);
+ apps_db_read_list(item_info_list);
+ apps_db_sync();
+ item_info_list = apps_db_write_list();
+ } else {
+ apps_db_sync();
+ item_info_list = apps_db_write_list();
+ }
+ apps_main_get_info()->first_boot = 0;
+
+ /* Retry to write a list */
+ if (item_info_list) {
+ count = eina_list_count(item_info_list);
+ }
+ if (!item_info_list || !count) {
+ _APPS_E("Cannot read the DB, normally");
+ item_info_list = apps_item_info_list_create(ITEM_INFO_LIST_TYPE_XML);
+ }
+ retv_if(!item_info_list, ECORE_CALLBACK_CANCEL);
+
+ count = eina_list_count(item_info_list);
+ if (0 == count) {
+ _APPS_D("There are no apps");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ evas_object_data_set(layout, DATA_KEY_LIST, item_info_list);
+ evas_object_data_del(layout, DATA_KEY_IDLE_TIMER);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+static char *_access_info_cb(void *data, Evas_Object *obj)
+{
+ retv_if(!data, NULL);
+
+ char *tmp = strdup(data);
+ retv_if(!tmp, NULL);
+
+ return tmp;
+}
+
+
+HAPI Evas_Object *apps_layout_create(Evas_Object *win, const char *file, const char *group)
+{
+ Evas_Object *layout;
+ Ecore_Idler *idle_timer = NULL;
+ instance_info_s *info = NULL;
+
+ retv_if(!win, NULL);
+
+ info = evas_object_data_get(win, DATA_KEY_INSTANCE_INFO);
+ retv_if(!info, NULL);
+
+ layout = apps_layout_load_edj(win, file, group);
+ retv_if(!layout, NULL);
+
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_resize(layout, info->root_w, info->root_h);
+ evas_object_show(layout);
+
+ //box focus
+ Evas_Object *focus = elm_button_add(layout);
+ retv_if(!focus, NULL);
+
+ elm_object_style_set(focus, "focus");
+ elm_object_part_content_set(layout, "focus", focus);
+ elm_access_info_cb_set(focus, ELM_ACCESS_INFO, _access_info_cb, _("IDS_IDLE_BODY_APPS"));
+ elm_access_info_cb_set(focus, ELM_ACCESS_TYPE, NULL, NULL);
+ elm_object_focus_allow_set(focus, EINA_FALSE);
+
+ evas_object_data_set(layout, DATA_KEY_WIN, win);
+ evas_object_data_set(layout, DATA_KEY_INSTANCE_INFO, info);
+ evas_object_data_set(layout, DATA_KEY_LAYOUT_FOCUS_ON, NULL);
+ evas_object_data_set(layout, DATA_KEY_LAYOUT_IS_PAUSED, (void *) 1);
+ evas_object_data_set(layout, DATA_KEY_POPUP, NULL);
+
+ elm_object_signal_callback_add(layout,
+ "bg,down", "bg", _bg_down_cb, NULL);
+ elm_object_signal_callback_add(layout,
+ "bg,up", "bg", _bg_up_cb, NULL);
+
+ if (APPS_ERROR_NONE != apps_main_register_cb(info, APPS_APP_STATE_PAUSE, _pause_result_cb, info)) {
+ _APPS_E("Cannot register the pause callback");
+ }
+
+ if (APPS_ERROR_NONE != apps_main_register_cb(info, APPS_APP_STATE_RESUME, _resume_result_cb, info)) {
+ _APPS_E("Cannot register the pause callback");
+ }
+
+ if (APPS_ERROR_NONE != apps_main_register_cb(info, APPS_APP_STATE_RESET, _reset_result_cb, info)) {
+ _APPS_E("Cannot register the pause callback");
+ }
+
+ item_badge_register_changed_cb(layout);
+
+ idle_timer = ecore_idler_add(_push_items_cb, layout);
+ if (NULL == idle_timer) {
+ _APPS_E("Cannot push items");
+ } else evas_object_data_set(layout, DATA_KEY_IDLE_TIMER, idle_timer);
+
+ return layout;
+}
+
+
+
+HAPI void apps_layout_destroy(Evas_Object *layout)
+{
+ Ecore_Idler *idle_timer = NULL;
+ Evas_Object *scroller = NULL;
+ Eina_List *list = NULL;
+ instance_info_s *info = NULL;
+
+ ret_if(!layout);
+
+ idle_timer = evas_object_data_del(layout, DATA_KEY_IDLE_TIMER);
+ if (idle_timer) {
+ ecore_idler_del(idle_timer);
+ }
+
+ scroller = evas_object_data_del(layout, DATA_KEY_SCROLLER);
+ if (scroller) {
+ apps_scroller_destroy(layout);
+ }
+
+ list = evas_object_data_del(layout, DATA_KEY_LIST);
+ if (list) {
+ apps_item_info_list_destroy(list);
+ }
+
+ item_badge_unregister_changed_cb();
+
+ info = evas_object_data_del(layout, DATA_KEY_INSTANCE_INFO);
+ if (info) {
+ apps_main_unregister_cb(info, APPS_APP_STATE_PAUSE, _pause_result_cb);
+ apps_main_unregister_cb(info, APPS_APP_STATE_RESUME, _resume_result_cb);
+ apps_main_unregister_cb(info, APPS_APP_STATE_RESET, _reset_result_cb);
+ }
+
+ edje_object_signal_callback_del(_EDJ(layout),
+ "bg,down", "bg", _bg_down_cb);
+ edje_object_signal_callback_del(_EDJ(layout),
+ "bg,up", "bg", _bg_up_cb);
+
+ evas_object_data_del(layout, DATA_KEY_WIN);
+ evas_object_data_del(layout, DATA_KEY_LAYOUT_FOCUS_ON);
+ evas_object_data_del(layout, DATA_KEY_LAYOUT_IS_PAUSED);
+
+ apps_layout_unload_edj(layout);
+}
+
+
+static Eina_Bool _show_anim_cb(void *data)
+{
+ Evas_Object *win = data;
+
+ retv_if(NULL == data, ECORE_CALLBACK_CANCEL);
+
+ elm_win_activate(win);
+ evas_object_show(win);
+
+ layout_info_s *layout_info = evas_object_data_get(main_get_info()->layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(NULL == layout_info, ECORE_CALLBACK_CANCEL);
+
+ Evas_Object *layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ retv_if(NULL == layout, ECORE_CALLBACK_CANCEL);
+
+ Evas_Object *scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ retv_if(NULL == scroller, ECORE_CALLBACK_CANCEL);
+
+ scroller_info_s *scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(NULL == scroller_info, ECORE_CALLBACK_CANCEL);
+
+ if (main_get_info()->is_tts
+ && !layout_info->tutorial) {
+
+ //box focus
+ Evas_Object *focus = elm_object_part_content_get(layout, "focus");
+ if(focus) {
+ elm_access_highlight_set(focus);
+ }
+ }
+
+ elm_object_signal_emit(scroller, "show", "");
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI apps_error_e apps_layout_show(Evas_Object *win, Eina_Bool show)
+{
+ Evas_Object *layout = NULL;
+ Ecore_Timer *timer = NULL;
+
+ retv_if(NULL == win, APPS_ERROR_FAIL);
+
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ retv_if(NULL == layout, APPS_ERROR_FAIL);
+
+ timer = evas_object_data_del(layout, DATA_KEY_LAYOUT_HIDE_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ _APPS_D("(%p) %s the tray", win, show? "Show":"Hide");
+
+ if (show) {
+ Ecore_Idler *animator = ecore_idler_add(_show_anim_cb, win);
+ retv_if(NULL == animator, APPS_ERROR_FAIL);
+
+ if (W_HOME_ERROR_NONE != key_register_cb(KEY_TYPE_BACK, _back_key_cb, win)) {
+ _APPS_E("Cannot register the key callback");
+ }
+ } else {
+ if(apps_main_get_info()->longpress_edit_disable && apps_layout_is_edited(layout)) {
+ apps_layout_unedit(layout);
+ }
+
+ evas_object_hide(win);
+ key_unregister_cb(KEY_TYPE_BACK, _back_key_cb);
+
+ Evas_Object *scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ retv_if(NULL == scroller, APPS_ERROR_FAIL);
+ apps_scroller_region_show(scroller, 0, 0);
+ }
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI Evas_Object* apps_layout_load_edj(Evas_Object *parent, const char *edjname, const char *grpname)
+{
+ Evas_Object *layout = NULL;
+
+ retv_if(NULL == parent, NULL);
+
+ layout = elm_layout_add(parent);
+ retv_if(NULL == layout, NULL);
+ retv_if(EINA_FALSE == elm_layout_file_set(layout, edjname, grpname), NULL);
+
+ Evas_Object *edje_object = _EDJ(layout);
+ if (edje_object != NULL) {
+ evas_object_data_set(edje_object, DATA_KEY_EVAS_OBJECT, layout);
+ evas_object_data_set(layout, DATA_KEY_EDJE_OBJECT, edje_object);
+ }
+ evas_object_show(layout);
+
+ return layout;
+}
+
+
+
+HAPI void apps_layout_unload_edj(Evas_Object *layout)
+{
+ Evas_Object *edje_object = NULL;
+
+ ret_if(NULL == layout);
+
+ edje_object = evas_object_data_del(layout, DATA_KEY_EDJE_OBJECT);
+ if (edje_object) evas_object_data_del(edje_object, DATA_KEY_EVAS_OBJECT);
+ else _APPS_E("Cannot get edje object");
+
+ evas_object_del(layout);
+}
+
+
+
+HAPI void apps_layout_rotate(Evas_Object *layout, int is_rotated)
+{
+ const char *edje_signal;
+
+ ret_if(NULL == layout);
+
+ if (is_rotated) { // ROTATE
+ edje_signal = STR_SIGNAL_EMIT_SIGNAL_ROTATE;
+ } else { // UNROTATE
+ edje_signal = STR_SIGNAL_EMIT_SIGNAL_UNROTATE;
+ }
+
+ elm_object_signal_emit(layout, edje_signal, "tray");
+}
+
+
+
+HAPI void apps_layout_focus_on(Evas_Object *layout)
+{
+ ret_if(NULL == layout);
+ evas_object_data_set(layout, DATA_KEY_LAYOUT_FOCUS_ON, (void *) 1);
+ elm_object_tree_focus_allow_set(layout, EINA_TRUE);
+}
+
+
+
+HAPI void apps_layout_focus_off(Evas_Object *layout)
+{
+ ret_if(NULL == layout);
+ evas_object_data_set(layout, DATA_KEY_LAYOUT_FOCUS_ON, (void *) 0);
+ elm_object_tree_focus_allow_set(layout, EINA_FALSE);
+}
+
+
+
+HAPI void apps_layout_block(Evas_Object *layout)
+{
+ ret_if(NULL == layout);
+ elm_object_signal_emit(layout, "block", "layout");
+}
+
+
+
+HAPI void apps_layout_unblock(Evas_Object *layout)
+{
+ ret_if(NULL == layout);
+ elm_object_signal_emit(layout, "unblock", "layout");
+}
+
+
+
+HAPI int apps_layout_is_edited(Evas_Object *layout)
+{
+ retv_if(!layout, 0);
+ return (int) evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_IS_EDITED);
+}
+
+
+
+HAPI void apps_layout_edit(Evas_Object *layout)
+{
+ Evas_Object *scroller = NULL;
+ Evas_Object *checker = NULL;
+
+ ret_if(!layout);
+
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_LAYOUT_IS_EDITED, (void *) 1);
+ /* checker : it checkes whether or not scrolling the scroller */
+ checker = _create_checker(layout, MOVE_UP);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_TOP_CHECKER, checker);
+
+ checker = _create_checker(layout, MOVE_DOWN);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_BOTTOM_CHECKER, checker);
+
+ scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ apps_scroller_edit(scroller);
+}
+
+
+static Eina_Bool _update_list_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+
+ apps_scroller_write_list(scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+ apps_db_read_list(scroller_info->list);
+
+ /* Currently, update every times after going out from the edit mode */
+ apps_main_get_info()->updated = 1;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void apps_layout_unedit(Evas_Object *layout)
+{
+ Ecore_Timer *unedit_timer = NULL;
+ Evas_Object *scroller = NULL;
+ Evas_Object *checker = NULL;
+ Evas_Object *reserve_item = NULL;
+ item_info_s *item_info = NULL;
+
+ ret_if(!layout);
+
+ evas_object_data_del(layout, PRIVATE_DATA_KEY_LAYOUT_IS_EDITED);
+
+ checker = evas_object_data_del(layout, PRIVATE_DATA_KEY_TOP_CHECKER);
+ if (checker) {
+ _destroy_checker(checker);
+ }
+
+ checker = evas_object_data_del(layout, PRIVATE_DATA_KEY_BOTTOM_CHECKER);
+ if (checker) {
+ _destroy_checker(checker);
+ }
+ scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+
+ apps_scroller_unedit(scroller);
+
+ char *appid = (char*)evas_object_data_get(scroller, DATA_KEY_ITEM_UNINSTALL_RESERVED);
+ if(appid) {
+ reserve_item = apps_scroller_get_item_by_appid(scroller, appid);
+ ret_if(!reserve_item);
+
+ item_info = evas_object_data_get(reserve_item, DATA_KEY_ITEM_INFO);
+
+ apps_scroller_remove_item(scroller, reserve_item);
+ apps_db_remove_item(appid);
+ item_destroy(reserve_item);
+
+ if (item_info) {
+ _APPS_SD("appid[%s], name[%s]", item_info->appid, item_info->name);
+ item_badge_remove(item_info->appid);
+ item_badge_remove(item_info->pkgid);
+ apps_item_info_destroy(item_info);
+ }
+ }
+ apps_scroller_trim(scroller);
+ evas_object_data_set(scroller, DATA_KEY_ITEM_UNINSTALL_RESERVED, (void*)NULL);
+
+ unedit_timer = ecore_timer_add(0.5, _update_list_cb, scroller);
+ if (NULL == unedit_timer) {
+ _E("Cannot update list");
+ }
+}
+
+
+
+// End of file
diff --git a/home/src/apps/list.c b/home/src/apps/list.c
new file mode 100644
index 0000000..2ed07bf
--- /dev/null
+++ b/home/src/apps/list.c
@@ -0,0 +1,229 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <ail.h>
+#include <package-manager.h>
+#include <pkgmgr-info.h>
+
+#include "log.h"
+#include "apps/item_info.h"
+#include "apps/list.h"
+
+
+
+static int _is_included_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+ bool enabled = false;
+
+ retv_if(NULL == handle, 0);
+ retv_if(NULL == user_data, 0);
+ retv_if(PMINFO_R_OK != pkgmgrinfo_appinfo_is_enabled(handle, &enabled), 0);
+
+ * (bool *) user_data = enabled;
+
+ return 0;
+}
+
+
+
+HAPI bool list_is_included(const char *appid)
+{
+ pkgmgrinfo_appinfo_filter_h handle = NULL;
+ bool is_included = false;
+
+ retv_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_create(&handle), NULL);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_add_string(handle, PMINFO_APPINFO_PROP_APP_ID, appid), ERROR);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, _is_included_cb, &is_included), ERROR);
+
+ pkgmgrinfo_appinfo_filter_destroy(handle);
+
+ _APPS_SD("%s is included ? [%d]", appid, is_included);
+ return is_included;
+
+ERROR:
+ if (handle) pkgmgrinfo_appinfo_filter_destroy(handle);
+
+ _APPS_SD("%s is not included.", appid);
+ return false;
+}
+
+
+
+static int _apps_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+ app_list *list = user_data;
+ char *appid = NULL;
+ item_info_s *item_info = NULL;
+
+ retv_if(NULL == handle, 0);
+ retv_if(NULL == user_data, 0);
+
+ pkgmgrinfo_appinfo_get_appid(handle, &appid);
+ retv_if(NULL == appid, 0);
+
+ item_info = apps_item_info_create(appid);
+ if (NULL == item_info) {
+ _APPS_D("%s does not have the item_info", appid);
+ return 0;
+ }
+
+ list->list = eina_list_append(list->list, item_info);
+
+ return 0;
+}
+
+
+
+static int _apps_sort_cb(const void *d1, const void *d2)
+{
+ item_info_s *tmp1 = (item_info_s *) d1;
+ item_info_s *tmp2 = (item_info_s *) d2;
+
+ if (NULL == tmp1 || NULL == tmp1->name) return 1;
+ else if (NULL == tmp2 || NULL == tmp2->name) return -1;
+
+ return strcmp(tmp1->name, tmp2->name);
+}
+
+
+
+HAPI app_list *list_create(void)
+{
+ pkgmgrinfo_appinfo_filter_h handle = NULL;
+ app_list *list = calloc(1, sizeof(app_list));
+
+ retv_if(NULL == list, NULL);
+
+ if (PMINFO_R_OK != pkgmgrinfo_appinfo_filter_create(&handle)) {
+ free(list);
+ return NULL;
+ }
+
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_NODISPLAY, 0), ERROR);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, _apps_cb, list), ERROR);
+
+ list->list = eina_list_sort(list->list, eina_list_count(list->list), _apps_sort_cb);
+
+ERROR:
+ if (handle) pkgmgrinfo_appinfo_filter_destroy(handle);
+
+ return list;
+}
+
+
+
+static int _sort_by_appid_cb(const void *d1, const void *d2)
+{
+ const item_info_s *info1 = d1;
+ const item_info_s *info2 = d2;
+
+ if (NULL == info1 || NULL == info1->appid) return 1;
+ else if (NULL == info2 || NULL == info2->appid) return -1;
+
+ return strcmp(info1->appid, info2->appid);
+}
+
+
+
+HAPI app_list *list_create_by_appid(void)
+{
+ pkgmgrinfo_appinfo_filter_h handle = NULL;
+ app_list *list = calloc(1, sizeof(app_list));
+
+ retv_if(NULL == list, NULL);
+
+ if (PMINFO_R_OK != pkgmgrinfo_appinfo_filter_create(&handle)) {
+ free(list);
+ return NULL;
+ }
+
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_add_bool(handle, PMINFO_APPINFO_PROP_APP_NODISPLAY, 0), ERROR);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, _apps_cb, list), ERROR);
+
+ list->list = eina_list_sort(list->list, eina_list_count(list->list), _sort_by_appid_cb);
+
+ERROR:
+ if (handle) pkgmgrinfo_appinfo_filter_destroy(handle);
+
+ return list;
+}
+
+
+
+HAPI void list_destroy(app_list *list)
+{
+ item_info_s *item_info = NULL;
+
+ ret_if(NULL == list);
+ ret_if(NULL == list->list);
+
+ EINA_LIST_FREE(list->list, item_info) {
+ if (NULL == item_info) break;
+ apps_item_info_destroy(item_info);
+ }
+
+ eina_list_free(list->list);
+ free(list);
+}
+
+
+
+static char *_get_app_name(const char *appid)
+{
+ pkgmgrinfo_appinfo_h appinfo_h = NULL;
+ char *tmp = NULL;
+ char *name = NULL;
+
+ retv_if(0 > pkgmgrinfo_appinfo_get_appinfo(appid, &appinfo_h), NULL);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_get_label(appinfo_h, &tmp), ERROR);
+
+ if (tmp) {
+ name = strdup(tmp);
+ goto_if(NULL == name, ERROR);
+ }
+
+ pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ return name;
+
+ERROR:
+ pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ return NULL;
+}
+
+
+
+HAPI void list_change_language(app_list *list)
+{
+ item_info_s *item_info = NULL;
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+
+ ret_if(NULL == list);
+ ret_if(NULL == list->list);
+
+ EINA_LIST_FOREACH_SAFE(list->list, l, ln, item_info) {
+ continue_if(!item_info);
+ free(item_info->name);
+ item_info->name = _get_app_name(item_info->appid);
+ }
+ list->list = eina_list_sort(list->list, eina_list_count(list->list), _apps_sort_cb);
+}
+
+
+
+// End of a file
diff --git a/home/src/apps/page.c b/home/src/apps/page.c
new file mode 100755
index 0000000..e08fb6c
--- /dev/null
+++ b/home/src/apps/page.c
@@ -0,0 +1,599 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/apps_conf.h"
+#include "apps/item.h"
+#include "apps/item_badge.h"
+#include "apps/apps_main.h"
+#include "apps/page.h"
+#include "apps/page_info.h"
+#include "apps/scroller_info.h"
+
+
+
+HAPI void apps_page_destroy(Evas_Object *page)
+{
+ page_info_s *prev_page_info = NULL;
+ page_info_s *page_info = NULL;
+ page_info_s *next_page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_del(page, DATA_KEY_PAGE_INFO);
+
+ if (page_info->prev_page) {
+ prev_page_info = evas_object_data_get(page_info->prev_page, DATA_KEY_PAGE_INFO);
+ if (prev_page_info) prev_page_info->next_page = NULL;
+ }
+
+ if (page_info->next_page) {
+ next_page_info = evas_object_data_get(page_info->next_page, DATA_KEY_PAGE_INFO);
+ if (next_page_info) next_page_info->prev_page = NULL;
+ }
+
+ if (prev_page_info && next_page_info) {
+ prev_page_info->next_page = next_page_info->page;
+ next_page_info->prev_page = prev_page_info->page;
+ }
+
+ evas_object_del(page_info->page_rect);
+ free(page_info);
+ evas_object_del(page);
+}
+
+
+
+#define PAGE_OUTER_EDJE_FILE EDJEDIR"/apps_page.edj"
+HAPI Evas_Object *apps_page_create(Evas_Object *scroller, Evas_Object *prev_page, Evas_Object *next_page)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *page_rect = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *prev_page_info = NULL;
+ page_info_s *next_page_info = NULL;
+ page_info_s *page_info = NULL;
+
+ retv_if(!scroller, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ page = elm_layout_add(scroller);
+ retv_if(!page, NULL);
+ elm_layout_file_set(page, PAGE_OUTER_EDJE_FILE, "page");
+ evas_object_size_hint_weight_set(page, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(page);
+
+ page_rect = evas_object_rectangle_add(scroller_info->instance_info->e);
+ goto_if(!page_rect, ERROR);
+ evas_object_size_hint_min_set(page_rect, scroller_info->instance_info->root_w, ITEM_HEIGHT);
+ evas_object_color_set(page_rect, 0, 0, 0, 0);
+ evas_object_show(page_rect);
+ elm_object_part_content_set(page, "bg", page_rect);
+
+ page_info = calloc(1, sizeof(page_info_s));
+ if (!page_info) {
+ _APPS_E("Cannot calloc for page_info");
+ apps_page_destroy(page);
+ return NULL;
+ }
+ page_info->win = scroller_info->win;
+ page_info->instance_info = scroller_info->instance_info;
+ page_info->scroller = scroller;
+ page_info->page_rect = page_rect;
+ page_info->prev_page = prev_page;
+ page_info->page = page;
+ page_info->next_page = next_page;
+ evas_object_data_set(page, DATA_KEY_PAGE_INFO, page_info);
+
+ if (prev_page) {
+ prev_page_info = evas_object_data_get(prev_page, DATA_KEY_PAGE_INFO);
+ if (prev_page_info) {
+ prev_page_info->next_page = page;
+ }
+ }
+
+ if (next_page) {
+ next_page_info = evas_object_data_get(next_page, DATA_KEY_PAGE_INFO);
+ if (next_page_info) {
+ next_page_info->prev_page = page;
+ }
+ }
+
+ return page;
+
+ERROR:
+ apps_page_destroy(page);
+ return NULL;
+}
+
+
+
+HAPI apps_error_e apps_page_pack_item(Evas_Object *page, Evas_Object *item)
+{
+ item_info_s *item_info = NULL;
+ register int i = 0;
+ char part_name[PART_NAME_SIZE] = {0, };
+ char center_name[PART_NAME_SIZE] = {0, };
+
+ retv_if(!page, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(!item, APPS_ERROR_INVALID_PARAMETER);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, APPS_ERROR_FAIL);
+
+ for (; i < APPS_PER_PAGE; i++) {
+ Evas_Object *tmp = NULL;
+
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ tmp = elm_object_part_content_get(page, part_name);
+ if (tmp) continue;
+
+ /* We have to pack item & item_center together and to set the info */
+ elm_object_part_content_set(page, part_name, item);
+ if (item_info->center) {
+ snprintf(center_name, sizeof(part_name), "item_center_%d", i);
+ elm_object_part_content_set(page, center_name, item_info->center);
+ }
+
+ item_info->page = page;
+
+ return APPS_ERROR_NONE;
+ }
+
+ return APPS_ERROR_FAIL;
+}
+
+
+
+HAPI apps_error_e apps_page_unpack_item(Evas_Object *page, Evas_Object *item)
+{
+ item_info_s *item_info = NULL;
+ register int i = 0;
+ char part_name[PART_NAME_SIZE] = {0, };
+ char center_name[PART_NAME_SIZE] = {0, };
+
+ retv_if(!page, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(!item, APPS_ERROR_INVALID_PARAMETER);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, APPS_ERROR_FAIL);
+
+ for (; i < APPS_PER_PAGE; i++) {
+ Evas_Object *tmp = NULL;
+
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ tmp = elm_object_part_content_get(page, part_name);
+ if (tmp != item) continue;
+
+ /* We have to unpack item & item_center together and to set the info */
+ elm_object_part_content_unset(page, part_name);
+ if (item_info->center) {
+ snprintf(center_name, sizeof(part_name), "item_center_%d", i);
+ elm_object_part_content_unset(page, center_name);
+ }
+
+ item_info->page = NULL;
+
+ return APPS_ERROR_NONE;
+ }
+
+ return APPS_ERROR_FAIL;
+}
+
+
+
+HAPI int apps_page_count_item(Evas_Object *page)
+{
+ int count = 0;
+ register int i = 0;
+ char part_name[PART_NAME_SIZE];
+
+ retv_if(!page, -1);
+
+ for (; i < APPS_PER_PAGE; i++) {
+ Evas_Object *item = NULL;
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ item = elm_object_part_content_get(page, part_name);
+ if (!item) continue;
+ count++;
+ }
+
+ return count;
+}
+
+
+
+HAPI Evas_Object *apps_page_get_item_at(Evas_Object *page, int position)
+{
+ Evas_Object *tmp = NULL;
+ char part_name[PART_NAME_SIZE];
+
+ retv_if(!page, NULL);
+ retv_if(position < -1, NULL);
+
+ snprintf(part_name, sizeof(part_name), "item_%d", position);
+ tmp = elm_object_part_content_get(page, part_name);
+
+ return tmp;
+}
+
+
+
+HAPI apps_error_e apps_page_pack_nth(Evas_Object *page, Evas_Object *item, int position)
+{
+ Evas_Object *tmp = NULL;
+ item_info_s *item_info = NULL;
+ char part_name[PART_NAME_SIZE] = {0, };
+ char center_name[PART_NAME_SIZE] = {0, };
+
+ retv_if(!page, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(!item, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(position < -1, APPS_ERROR_INVALID_PARAMETER);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, APPS_ERROR_FAIL);
+
+ snprintf(part_name, sizeof(part_name), "item_%d", position);
+ tmp = elm_object_part_content_get(page, part_name);
+ if (tmp) {
+ _APPS_E("Error : Already has an item");\
+ return APPS_ERROR_FAIL;
+ }
+
+ elm_object_part_content_set(page, part_name, item);
+ if (item_info->center) {
+ snprintf(center_name, sizeof(part_name), "item_center_%d", position);
+ elm_object_part_content_set(page, center_name, item_info->center);
+ }
+
+ item_info->page = page;
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI Evas_Object *apps_page_unpack_nth(Evas_Object *page, int position)
+{
+ Evas_Object *tmp = NULL;
+ item_info_s *item_info = NULL;
+ char part_name[PART_NAME_SIZE] = {0, };
+ char center_name[PART_NAME_SIZE] = {0, };
+
+ retv_if(!page, NULL);
+ retv_if(position < -1, NULL);
+
+ snprintf(part_name, sizeof(part_name), "item_%d", position);
+ tmp = elm_object_part_content_unset(page, part_name);
+ if (!tmp) return NULL;
+
+ item_info = evas_object_data_get(tmp, DATA_KEY_ITEM_INFO);
+ retv_if(!item_info, NULL);
+
+ if (item_info->center) {
+ snprintf(center_name, sizeof(part_name), "item_center_%d", position);
+ elm_object_part_content_unset(page, center_name);
+ }
+
+ item_info->page = NULL;
+
+ return tmp;
+}
+
+
+
+HAPI void apps_page_change_language(Evas_Object *page)
+{
+ register int i = 0;
+
+ ret_if(!page);
+
+ for (; i < APPS_PER_PAGE; i++) {
+ Evas_Object *item = NULL;
+ char part_name[PART_NAME_SIZE];
+
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ item = elm_object_part_content_get(page, part_name);
+ if (!item) continue;
+
+ item_change_language(item);
+ item_badge_change_language(item);
+ }
+}
+
+
+
+HAPI int apps_page_has_item(Evas_Object *page, Evas_Object *item)
+{
+ register int i = 0;
+ int has_item = 0;
+
+ retv_if(!page, 0);
+
+ for (; i < APPS_PER_PAGE; i++) {
+ Evas_Object *tmp = NULL;
+ char part_name[PART_NAME_SIZE];
+
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ tmp = elm_object_part_content_get(page, part_name);
+ if (tmp != item) continue;
+
+ has_item = 1;
+ break;
+ }
+
+ return has_item;
+}
+
+
+
+HAPI Evas_Object *apps_page_move_item_prev(Evas_Object *page, Evas_Object *from_item, Evas_Object *to_item, Evas_Object *append_item)
+{
+ Evas_Object *tmp = NULL;
+ Evas_Object *tmp_next = append_item;
+ item_info_s *item_info = NULL;
+ register int i;
+ int from_idx = -1;
+ int to_idx = -1;
+ char part_name[PART_NAME_SIZE];
+ char center_name[PART_NAME_SIZE];
+
+ retv_if(!page, NULL);
+
+ if (from_item || to_item) {
+ for (i = 0; i < APPS_PER_PAGE; ++i) {
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ tmp = elm_object_part_content_get(page, part_name);
+
+ if (tmp && tmp == from_item) from_idx = i;
+ if (tmp && tmp == to_item) to_idx = i;
+ }
+ }
+ _APPS_D("Move item to the prev, from_idx:%d, to_idx:%d", from_idx, to_idx);
+
+ if (-1 == from_idx) from_idx = 0;
+ if (-1 == to_idx) to_idx = APPS_PER_PAGE - 1;
+
+ for (i = to_idx; i >= from_idx; --i) {
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ snprintf(center_name, sizeof(part_name), "item_center_%d", i);
+
+ /* We have to unset item & item_center together. */
+ tmp = elm_object_part_content_get(page, part_name);
+ if (tmp) {
+ elm_object_part_content_unset(page, part_name);
+ item_info = evas_object_data_get(tmp, DATA_KEY_ITEM_INFO);
+ continue_if(!item_info);
+ item_info->page = NULL;
+
+ if (item_info->center) {
+ elm_object_part_content_unset(page, center_name);
+ }
+ }
+
+ if (tmp_next) {
+ /* We have to set item & item_center together. */
+ elm_object_part_content_set(page, part_name, tmp_next);
+
+ item_info = evas_object_data_get(tmp_next, DATA_KEY_ITEM_INFO);
+ continue_if(!item_info);
+ item_info->page = page;
+
+ if (item_info->center) {
+ elm_object_part_content_set(page, center_name, item_info->center);
+ }
+
+ elm_object_signal_emit(page, "next", part_name);
+ edje_object_message_signal_process(elm_layout_edje_get(page));
+ elm_object_signal_emit(page, "return", part_name);
+ }
+ tmp_next = tmp;
+ }
+
+ return tmp;
+}
+
+
+
+HAPI Evas_Object *apps_page_move_item_next(Evas_Object *page, Evas_Object *from_item, Evas_Object *to_item, Evas_Object *insert_item)
+{
+ Evas_Object *tmp = NULL;
+ Evas_Object *tmp_prev = insert_item;
+ item_info_s *item_info = NULL;
+ register int i;
+ int from_idx = -1;
+ int to_idx = -1;
+ char part_name[PART_NAME_SIZE];
+ char center_name[PART_NAME_SIZE];
+
+ retv_if(!page, NULL);
+
+ if (from_item || to_item) {
+ for (i = 0; i < APPS_PER_PAGE; ++i) {
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ tmp = elm_object_part_content_get(page, part_name);
+
+ if (tmp && tmp == from_item) from_idx = i;
+ if (tmp && tmp == to_item) to_idx = i;
+ }
+ }
+ _APPS_D("Move item to the next, from_idx:%d, to_idx:%d", from_idx, to_idx);
+
+ if (-1 == from_idx) from_idx = 0;
+ if (-1 == to_idx) to_idx = APPS_PER_PAGE - 1;
+
+ for (i = from_idx; i <= to_idx; ++i) {
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ snprintf(center_name, sizeof(part_name), "item_center_%d", i);
+
+ /* We have to unset item & item_center together. */
+ tmp = elm_object_part_content_get(page, part_name);
+ if (tmp) {
+ elm_object_part_content_unset(page, part_name);
+ item_info = evas_object_data_get(tmp, DATA_KEY_ITEM_INFO);
+ continue_if(!item_info);
+ item_info->page = NULL;
+
+ if (item_info->center) {
+ elm_object_part_content_unset(page, center_name);
+ }
+ }
+
+ if (tmp_prev) {
+ /* We have to set item & item_center together. */
+ elm_object_part_content_set(page, part_name, tmp_prev);
+
+ item_info = evas_object_data_get(tmp_prev, DATA_KEY_ITEM_INFO);
+ continue_if(!item_info);
+ item_info->page = page;
+
+ if (item_info->center) {
+ elm_object_part_content_set(page, center_name, item_info->center);
+ }
+
+ elm_object_signal_emit(page, "prev", part_name);
+ edje_object_message_signal_process(elm_layout_edje_get(page));
+ elm_object_signal_emit(page, "return", part_name);
+ }
+ tmp_prev = tmp;
+ }
+
+ return tmp;
+}
+
+
+
+HAPI int apps_page_seek_item_position(Evas_Object *page, Evas_Object *item)
+{
+ register int i = 0;
+
+ retv_if(!page, -1);
+ retv_if(!item, -1);
+
+ for (; i < APPS_PER_PAGE; i++) {
+ Evas_Object *tmp = NULL;
+ char part_name[PART_NAME_SIZE];
+
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ tmp = elm_object_part_content_get(page, part_name);
+ if (tmp == item) return i;
+ }
+
+ return -1;
+}
+
+
+
+HAPI void apps_page_print_item(Evas_Object *page)
+{
+ item_info_s *item_info = NULL;
+ register int i = 0;
+
+ ret_if(!page);
+
+ for (; i < APPS_PER_PAGE; i++) {
+ Evas_Object *tmp = NULL;
+ char part_name[PART_NAME_SIZE];
+
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ tmp = elm_object_part_content_get(page, part_name);
+ continue_if(!tmp);
+
+ item_info = evas_object_data_get(tmp, DATA_KEY_ITEM_INFO);
+ continue_if(!item_info);
+
+ _APPS_D("%s, %s", part_name, item_info->appid);
+ }
+}
+
+
+
+HAPI void apps_page_edit(Evas_Object *page)
+{
+ register int i = 0;
+ item_info_s *item_info = NULL;
+
+ ret_if(!page);
+
+// elm_object_signal_emit(page, "edit", "item_center_-1");
+// elm_object_signal_emit(page, "edit", "item_center_0");
+// elm_object_signal_emit(page, "edit", "item_center_1");
+// elm_object_signal_emit(page, "edit", "item_center_2");
+
+ for (; i < APPS_PER_PAGE; i++) {
+ Evas_Object *tmp = NULL;
+ char part_name[PART_NAME_SIZE];
+
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ tmp = elm_object_part_content_get(page, part_name);
+ if (!tmp) {
+ continue_if(!item_info);
+
+ page_info_s *page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ Evas_Object *scroller = page_info->scroller;
+ continue_if(!scroller);
+
+ Evas_Object *virtual_item = item_virtual_create(scroller);
+ evas_object_data_set(virtual_item, DATA_KEY_IS_VIRTUAL_ITEM, (void*)1);
+ apps_page_pack_item(page, virtual_item);
+ continue;
+ }
+ item_info = evas_object_data_get(tmp, DATA_KEY_ITEM_INFO);
+ item_edit(tmp);
+ }
+}
+
+
+
+HAPI void apps_page_unedit(Evas_Object *page)
+{
+ register int i = 0;
+
+ ret_if(!page);
+
+// elm_object_signal_emit(page, "unedit", "item_center_-1");
+// elm_object_signal_emit(page, "unedit", "item_center_0");
+// elm_object_signal_emit(page, "unedit", "item_center_1");
+// elm_object_signal_emit(page, "unedit", "item_center_2");
+
+ for (; i < APPS_PER_PAGE; i++) {
+ Evas_Object *tmp = NULL;
+ char part_name[PART_NAME_SIZE];
+
+ snprintf(part_name, sizeof(part_name), "item_%d", i);
+ tmp = elm_object_part_content_get(page, part_name);
+ if (!tmp) continue;
+
+ int bIsVirtual = (int)evas_object_data_get(tmp, DATA_KEY_IS_VIRTUAL_ITEM);
+ if(bIsVirtual) {
+ apps_page_unpack_item(page, tmp);
+ item_virtual_destroy(tmp);
+ }
+ else {
+ item_unedit(tmp);
+ }
+ }
+}
+
+
+
+// End of this file
diff --git a/home/src/apps/pkgmgr.c b/home/src/apps/pkgmgr.c
new file mode 100755
index 0000000..88a8006
--- /dev/null
+++ b/home/src/apps/pkgmgr.c
@@ -0,0 +1,745 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <package-manager.h>
+#include <pkgmgr-info.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/db.h"
+#include "apps/item.h"
+#include "apps/list.h"
+#include "apps/apps_main.h"
+#include "apps/pkgmgr.h"
+#include "apps/scroller.h"
+#include "apps/scroller_info.h"
+#include "apps/item_badge.h"
+#include "apps/layout.h"
+
+
+
+struct pkgmgr_handler {
+ const char *key;
+ int (*func)(const char *package, const char *val, void *data);
+};
+
+typedef struct {
+ char* package;
+ char* key;
+ char* val;
+} pkgmgr_reserve_s;
+
+typedef struct {
+ char* package;
+ char* status;
+} pkgmgr_request_s;
+
+typedef struct {
+ char* pkgid;
+ char* app_id;
+ Evas_Object *item;
+} pkgmgr_install_s;
+
+static struct {
+ pkgmgr_client *listen_pc;
+ Eina_List *reserve_list;
+ Eina_List *request_list;
+ Eina_List *item_list;
+} pkg_mgr_info = {
+ .listen_pc = NULL,
+ .reserve_list = NULL,
+ .request_list = NULL,
+ .item_list = NULL,
+};
+
+
+
+static apps_error_e _append_request_in_list(const char *package, const char *status)
+{
+ char *tmp_pkg = NULL;
+ char *tmp_st = NULL;
+
+ retv_if(NULL == package, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == status, APPS_ERROR_INVALID_PARAMETER);
+
+ pkgmgr_request_s *rt = calloc(1, sizeof(pkgmgr_request_s));
+ retv_if(NULL == rt, APPS_ERROR_FAIL);
+
+ tmp_pkg = strdup(package);
+ goto_if(NULL == tmp_pkg, ERROR);
+
+ tmp_st = strdup(status);
+ goto_if(NULL == tmp_st, ERROR);
+
+ rt->package = tmp_pkg;
+ rt->status = tmp_st;
+
+ pkg_mgr_info.request_list = eina_list_append(pkg_mgr_info.request_list, rt);
+ goto_if(NULL == pkg_mgr_info.request_list, ERROR);
+
+ return APPS_ERROR_NONE;
+
+ERROR:
+ if (rt) {
+ free(rt->status);
+ free(rt->package);
+ free(rt);
+ }
+
+ return APPS_ERROR_FAIL;
+}
+
+
+
+static apps_error_e _remove_request_in_list(const char *package)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_request_s *rt = NULL;
+
+ retv_if(NULL == package, APPS_ERROR_INVALID_PARAMETER);
+
+ if (NULL == pkg_mgr_info.request_list) return APPS_ERROR_NONE;
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.request_list, l, ln, rt) {
+ if (!rt) continue;
+ if (!rt->package) continue;
+ if (strcmp(rt->package, package)) continue;
+
+ pkg_mgr_info.request_list = eina_list_remove(pkg_mgr_info.request_list, rt);
+ free(rt->package);
+ free(rt->status);
+ free(rt);
+ return APPS_ERROR_NONE;
+ }
+
+ return APPS_ERROR_FAIL;
+}
+
+
+
+static int _exist_request_in_list(const char *package)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_request_s *rt = NULL;
+
+ retv_if(NULL == package, 0);
+
+ if (NULL == pkg_mgr_info.request_list) return 0;
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.request_list, l, ln, rt) {
+ if (!rt) continue;
+ if (!rt->package) continue;
+ if (strcmp(rt->package, package)) continue;
+ return 1;
+ }
+
+ return 0;
+}
+
+
+
+static pkgmgr_request_s *_get_request_in_list(const char *package)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_request_s *rt = NULL;
+
+ retv_if(NULL == package, NULL);
+
+ if (NULL == pkg_mgr_info.request_list) return NULL;
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.request_list, l, ln, rt) {
+ if (!rt) continue;
+ if (!rt->package) continue;
+ if (strcmp(rt->package, package)) continue;
+ return rt;
+ }
+
+ return NULL;
+}
+
+
+
+HAPI apps_error_e apps_pkgmgr_item_list_append_item(const char *pkgid, const char *app_id, Evas_Object *item)
+{
+ char *tmp_pkg_id = NULL;
+ char *tmp_app_id = NULL;
+ pkgmgr_install_s *pi = NULL;
+
+ retv_if(NULL == pkgid, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == app_id, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == item, APPS_ERROR_INVALID_PARAMETER);
+
+ pi = calloc(1, sizeof(pkgmgr_install_s));
+ goto_if(NULL == pi, ERROR);
+
+ tmp_pkg_id = strdup(pkgid);
+ goto_if(NULL == tmp_pkg_id, ERROR);
+
+ tmp_app_id = strdup(app_id);
+ goto_if(NULL == tmp_app_id, ERROR);
+
+ pi->pkgid = tmp_pkg_id;
+ pi->app_id = tmp_app_id;
+ pi->item = item;
+
+ pkg_mgr_info.item_list = eina_list_append(pkg_mgr_info.item_list, pi);
+ goto_if(NULL == pkg_mgr_info.item_list, ERROR);
+
+ return APPS_ERROR_NONE;
+
+ERROR:
+ free(tmp_app_id);
+ free(tmp_pkg_id);
+ free(pi);
+
+ return APPS_ERROR_FAIL;
+}
+
+
+
+HAPI apps_error_e apps_pkgmgr_item_list_remove_item(const char *pkgid, const char *app_id, Evas_Object *item)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_install_s *pi = NULL;
+
+ retv_if(NULL == pkgid, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == app_id, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == item, APPS_ERROR_INVALID_PARAMETER);
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.item_list, l, ln, pi) {
+ continue_if(NULL == pi);
+ continue_if(NULL == pi->pkgid);
+ continue_if(NULL == pi->app_id);
+ continue_if(NULL == pi->item);
+
+ if (strcmp(pi->pkgid, pkgid)) continue;
+ if (strcmp(pi->app_id, app_id)) continue;
+ if (pi->item != item) continue;
+
+ pkg_mgr_info.item_list = eina_list_remove(pkg_mgr_info.item_list, pi);
+
+ free(pi->app_id);
+ free(pi->pkgid);
+ free(pi);
+
+ return APPS_ERROR_NONE;
+ }
+
+ return APPS_ERROR_FAIL;
+}
+
+
+
+HAPI void apps_pkgmgr_item_list_affect_pkgid(const char *pkgid, Eina_Bool (*_affected_cb)(const char *, Evas_Object *, void *), void *data)
+{
+ const Eina_List *l;
+ const Eina_List *ln;
+ pkgmgr_install_s *pi;
+
+ ret_if(NULL == pkg_mgr_info.item_list);
+ ret_if(NULL == pkgid);
+ ret_if(NULL == _affected_cb);
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.item_list, l, ln, pi) {
+ continue_if(NULL == pi);
+ continue_if(NULL == pi->app_id);
+ continue_if(NULL == pi->item);
+
+ if (strcmp(pkgid, pi->pkgid)) continue;
+ /* It's possible that many items with the same package name are in the install list */
+ continue_if(EINA_TRUE != _affected_cb(pi->app_id, pi->item, data));
+ }
+}
+
+
+
+HAPI void apps_pkgmgr_item_list_affect_appid(const char *app_id, Eina_Bool (*_affected_cb)(const char *, Evas_Object *, void *), void *data)
+{
+ const Eina_List *l;
+ const Eina_List *ln;
+ pkgmgr_install_s *pi;
+
+ ret_if(NULL == pkg_mgr_info.item_list);
+ ret_if(NULL == app_id);
+ ret_if(NULL == _affected_cb);
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.item_list, l, ln, pi) {
+ continue_if(NULL == pi);
+ continue_if(NULL == pi->app_id);
+ continue_if(NULL == pi->item);
+
+ if (strcmp(app_id, pi->app_id)) continue;
+ /* It's possible that many items with the same package name are in the install list */
+ continue_if(EINA_TRUE != _affected_cb(pi->app_id, pi->item, data));
+ }
+}
+
+
+
+static Eina_Bool _enable_item(const char *appid, Evas_Object *item, void *data)
+{
+ void (*_func_item_enable)(Evas_Object *);
+ Evas_Object *grid = evas_object_data_get(item, DATA_KEY_GRID);
+ retv_if(NULL == grid, EINA_FALSE);
+
+ _func_item_enable = evas_object_data_get(grid, DATA_KEY_FUNC_ENABLE_ITEM);
+ retv_if(NULL == _func_item_enable, EINA_FALSE);
+
+ _func_item_enable(item);
+
+ return EINA_TRUE;
+}
+
+
+
+
+static int _enable_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+ char *appid = NULL;
+ pkgmgrinfo_appinfo_get_appid(handle, &appid);
+ apps_pkgmgr_item_list_affect_appid(appid, _enable_item, NULL);
+ return 0;
+}
+
+
+
+HAPI apps_error_e apps_pkgmgr_item_list_enable_mounted_item(void)
+{
+ retv_if(PMINFO_R_OK != pkgmgrinfo_appinfo_get_mounted_list(_enable_cb, NULL), APPS_ERROR_FAIL);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static Eina_Bool _disable_item(const char *appid, Evas_Object *item, void *data)
+{
+ void (*_func_item_disable)(Evas_Object *);
+ Evas_Object *grid = evas_object_data_get(item, DATA_KEY_GRID);
+ retv_if(NULL == grid, EINA_FALSE);
+
+ _func_item_disable = evas_object_data_get(grid, DATA_KEY_FUNC_DISABLE_ITEM);
+ retv_if(NULL == _func_item_disable, EINA_FALSE);
+
+ _func_item_disable(item);
+
+ return EINA_TRUE;
+}
+
+
+
+
+static int _disable_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+ char *appid = NULL;
+ pkgmgrinfo_appinfo_get_appid(handle, &appid);
+ apps_pkgmgr_item_list_affect_appid(appid, _disable_item, NULL);
+ return 0;
+}
+
+
+
+HAPI apps_error_e apps_pkgmgr_item_list_disable_unmounted_item(void)
+{
+ retv_if(PMINFO_R_OK != pkgmgrinfo_appinfo_get_unmounted_list(_disable_cb, NULL), APPS_ERROR_FAIL);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _start_download(const char *package, void *data)
+{
+ _APPS_D("Start downloading for the package(%s)", package);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _start_uninstall(const char *package, void *data)
+{
+ _APPS_D("Start uninstalling for the package(%s)", package);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _start_update(const char *package, void *data)
+{
+ _APPS_D("Start updating for the package(%s)", package);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _start_recover(const char *package, void *data)
+{
+ _APPS_D("Start recovering for the package(%s)", package);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _start_install(const char *package, void *data)
+{
+ _APPS_D("Start installing for the package(%s)", package);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _start(const char *package, const char *val, void *data)
+{
+ register unsigned int i;
+ struct start_cb_set {
+ const char *name;
+ int (*handler)(const char *package, void *data);
+ } start_cb[] = {
+ {
+ .name = "download",
+ .handler = _start_download,
+ },
+ {
+ .name = "uninstall",
+ .handler = _start_uninstall,
+ },
+ {
+ .name = "install",
+ .handler = _start_install,
+ },
+ {
+ .name = "update",
+ .handler = _start_update,
+ },
+ {
+ .name = "recover",
+ .handler = _start_recover,
+ },
+ {
+ .name = NULL,
+ .handler = NULL,
+ },
+ };
+
+ _APPS_D("package [%s], val [%s]", package, val);
+ retv_if(_exist_request_in_list(package), APPS_ERROR_FAIL);
+ retv_if(APPS_ERROR_NONE != _append_request_in_list(package, val), APPS_ERROR_FAIL);
+
+ for (i = 0; start_cb[i].name; i ++) {
+ if (strcasecmp(val, start_cb[i].name)) continue;
+ break_if(NULL == start_cb[i].handler);
+ return start_cb[i].handler(package, data);
+ }
+
+ _APPS_E("Unknown status for starting phase signal'd from package manager");
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _icon_path(const char *package, const char *val, void *data)
+{
+ _APPS_D("package(%s) with %s", package, val);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _download_percent(const char *package, const char *val, void *data)
+{
+ _APPS_D("package(%s) with %s", package, val);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _install_percent(const char *package, const char *val, void *data)
+{
+ _APPS_D("package(%s) with %s", package, val);
+ if (_exist_request_in_list(package)) return APPS_ERROR_NONE;
+ retv_if(APPS_ERROR_NONE != _append_request_in_list(package, "install"), APPS_ERROR_FAIL);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _error(const char *package, const char *val, void *data)
+{
+ _APPS_D("package(%s) with %s", package, val);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static void _install_app(Evas_Object *scroller, const char *appid)
+{
+ Evas_Object *item = NULL;
+ item_info_s *item_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!appid);
+
+ item_info = apps_item_info_create(appid);
+ ret_if(!item_info);
+
+ _APPS_SD("appid[%s], name[%s]", item_info->appid, item_info->name);
+ item = item_create(scroller, item_info);
+ if (!item) {
+ _APPS_E("Cannot create an item");
+ apps_item_info_destroy(item_info);
+ return;
+ }
+
+ apps_scroller_append_item(scroller, item);
+}
+
+
+
+static void _uninstall_app(Evas_Object *scroller, const char *appid)
+{
+ Evas_Object *item = NULL;
+ item_info_s *item_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!appid);
+
+ item = apps_scroller_get_item_by_appid(scroller, appid);
+ ret_if(!item);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ /* We have to try to destroy an item even if there is no item_info */
+
+ int longpressed = item_is_longpressed(item);
+ int is_edit = apps_layout_is_edited(item_info->layout);
+ if(is_edit && longpressed) {
+ evas_object_data_set(scroller, DATA_KEY_ITEM_UNINSTALL_RESERVED, (void*)appid);
+ }
+ else {
+ apps_scroller_remove_item(scroller, item);
+ apps_db_remove_item(appid);
+ item_destroy(item);
+
+ if (item_info) {
+ _APPS_SD("appid[%s], name[%s]", item_info->appid, item_info->name);
+ item_badge_remove(item_info->appid);
+ item_badge_remove(item_info->pkgid);
+ apps_item_info_destroy(item_info);
+ }
+
+ apps_scroller_trim(scroller);
+ }
+}
+
+
+
+static void _update_app(Evas_Object *scroller, const char *appid)
+{
+ _uninstall_app(scroller, appid);
+ _install_app(scroller, appid);
+}
+
+
+
+static void _manage_package(void (*_func)(Evas_Object *, const char *), const char *appid)
+{
+ Evas_Object *scroller = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ instance_info_s *info = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!_func);
+ ret_if(!appid);
+
+ list = apps_main_get_info()->instance_list;
+ ret_if(!list);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, info) {
+ continue_if(!info);
+ continue_if(!info->layout);
+
+ scroller = evas_object_data_get(info->layout, DATA_KEY_SCROLLER);
+ continue_if(!scroller);
+
+ _func(scroller, appid);
+ }
+
+ ret_if(!scroller);
+ apps_scroller_write_list(scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ ret_if(!scroller_info->layout);
+ ret_if(!scroller_info->list);
+
+ Eina_List *layout_list = evas_object_data_get(scroller_info->layout, DATA_KEY_LIST);
+ eina_list_free(layout_list);
+ layout_list= eina_list_clone(scroller_info->list);
+ evas_object_data_set(scroller_info->layout, DATA_KEY_LIST, layout_list);
+
+ apps_db_read_list(scroller_info->list);
+}
+
+
+
+static int _end_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+ char *appid = NULL;
+ pkgmgr_request_s *rt = user_data;
+
+ retv_if(NULL == handle, -1);
+ retv_if(NULL == user_data, -1);
+
+ pkgmgrinfo_appinfo_get_appid(handle, &appid);
+
+ _APPS_SD("status[%s], appid[%s]", rt->status, appid);
+
+ if (!strcmp(rt->status, "install")) {
+ _manage_package(_install_app, appid);
+ } else if (!strcmp(rt->status, "update")) {
+ _manage_package(_update_app, appid);
+ } else {
+ _APPS_E("No routines for this status (%s:%s)", rt->package, rt->status);
+ }
+
+ return 0;
+}
+
+
+
+static Eina_Bool _uninstall_cb(const char *appid, Evas_Object *item, void *data)
+{
+ retv_if(!appid, EINA_FALSE);
+
+ _manage_package(_uninstall_app, appid);
+
+ return EINA_TRUE;
+}
+
+
+
+static apps_error_e _end(const char *package, const char *val, void *data)
+{
+ pkgmgr_request_s *rt = NULL;
+ pkgmgrinfo_pkginfo_h handle = NULL;
+
+ retv_if(!_exist_request_in_list(package), APPS_ERROR_FAIL);
+
+ rt = _get_request_in_list(package);
+ retv_if(NULL == rt, APPS_ERROR_FAIL);
+ retv_if(strcasecmp(val, "ok"), APPS_ERROR_FAIL);
+
+ _APPS_D("Package(%s) : key(%s) - val(%s)", package, rt->status, val);
+
+ /* Criteria : pkgid */
+ if (!strcasecmp("uninstall", rt->status)) {
+ apps_pkgmgr_item_list_affect_pkgid(package, _uninstall_cb, data);
+ goto OUT;
+ }
+
+ retv_if(PMINFO_R_OK != pkgmgrinfo_pkginfo_get_pkginfo(package, &handle), APPS_ERROR_FAIL);
+
+ /* Criteria : appid */
+ if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_list(handle, PMINFO_UI_APP, _end_cb, rt)) {
+ if (APPS_ERROR_NONE != _remove_request_in_list(package))
+ _APPS_E("cannot remove a request(%s:%s)", rt->package, rt->status);
+ pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+ return APPS_ERROR_FAIL;
+ }
+
+OUT:
+ if (APPS_ERROR_NONE != _remove_request_in_list(package))
+ _APPS_E("cannot remove a request(%s:%s)", rt->package, rt->status);
+ if (handle) pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+static apps_error_e _change_pkg_name(const char *package, const char *val, void *data)
+{
+ _APPS_D("package(%s) with %s", package, val);
+ return APPS_ERROR_NONE;
+}
+
+
+
+static struct pkgmgr_handler pkgmgr_cbs[] = {
+ { "start", _start },
+ { "icon_path", _icon_path },
+ { "download_percent", _download_percent },
+ { "command", NULL },
+ { "install_percent", _install_percent },
+ { "error", _error },
+ { "end", _end },
+ { "change_pkg_name", _change_pkg_name },
+};
+
+
+
+static apps_error_e _pkgmgr_cb(int req_id, const char *pkg_type, const char *package, const char *key, const char *val, const void *pmsg, void *data)
+{
+ register unsigned int i;
+
+ _APPS_D("pkgmgr request [%s:%s] for %s", key, val, package);
+
+ for (i = 0; i < sizeof(pkgmgr_cbs) / sizeof(struct pkgmgr_handler); i++) {
+ if (strcasecmp(pkgmgr_cbs[i].key, key)) continue;
+ break_if(!pkgmgr_cbs[i].func);
+
+ if (APPS_ERROR_NONE != pkgmgr_cbs[i].func(package, val, data)) {
+ _APPS_E("pkgmgr_cbs[%u].func has errors.", i);
+ }
+ }
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI apps_error_e apps_pkgmgr_init(void)
+{
+ if (NULL != pkg_mgr_info.listen_pc) {
+ return APPS_ERROR_NONE;
+ }
+
+ pkg_mgr_info.listen_pc = pkgmgr_client_new(PC_LISTENING);
+ retv_if(NULL == pkg_mgr_info.listen_pc, APPS_ERROR_FAIL);
+ retv_if(pkgmgr_client_listen_status(pkg_mgr_info.listen_pc,
+ _pkgmgr_cb, NULL) != PKGMGR_R_OK, APPS_ERROR_FAIL);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI void apps_pkgmgr_fini(void)
+{
+ ret_if(NULL == pkg_mgr_info.listen_pc);
+ if (pkgmgr_client_free(pkg_mgr_info.listen_pc) != PKGMGR_R_OK) {
+ _APPS_E("cannot free pkgmgr_client for listen.");
+ }
+ pkg_mgr_info.listen_pc = NULL;
+}
+
+
+
+// End of a file
diff --git a/home/src/apps/scroller.c b/home/src/apps/scroller.c
new file mode 100755
index 0000000..a7674d8
--- /dev/null
+++ b/home/src/apps/scroller.c
@@ -0,0 +1,1498 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <app_control.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/apps_conf.h"
+#include "apps/effect.h"
+#include "apps/item.h"
+#include "apps/item_info.h"
+#include "apps/layout.h"
+#include "apps/apps_main.h"
+#include "apps/page.h"
+#include "apps/scroller.h"
+#include "apps/scroller_info.h"
+#include "wms.h"
+
+
+#define BOX_EDJE EDJEDIR"/apps_box.edj"
+#define BOX_GROUP_NAME "box"
+#if 0 /* Do not need buttons */
+#define BOX_TOP_BTN_GROUP_NAME "top_button"
+#define BOX_BOTTOM_BTN_GROUP_NAME "bottom_button"
+#endif
+
+#define PRIVATE_DATA_KEY_SCROLLER_MOUSE_DOWN "p_sc_m_dn"
+#define PRIVATE_DATA_KEY_SCROLLER_DRAG "p_sc_dr"
+#define PRIVATE_DATA_KEY_IS_SCROLLING "p_is_scr"
+#define PRIVATE_DATA_KEY_SCROLLER_REVERSE_LIST "p_sc_re_lt"
+#define PRIVATE_DATA_KEY_SCROLLER_POP_ALL_TIMER "p_sc_p_tm"
+#define PRIVATE_DATA_KEY_SCROLLER_PUSH_ALL_TIMER "p_p_tm"
+#define PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER "p_sc_tmer"
+#define PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ITH "p_sc_ith"
+
+#define PRIVATE_DATA_KEY_ITEM_INFO_LIST_APPENDED "p_iil_and"
+#define PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX "p_iil_idx"
+#define PRIVATE_DATA_KEY_ITEM_INFO_LIST_TIMER "p_iil_tm"
+
+
+
+
+static void _mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ei = event_info;
+ ret_if(!ei);
+
+ _APPS_D("Mouse is down [%d,%d]", ei->output.x, ei->output.y);
+ evas_object_data_set(obj, PRIVATE_DATA_KEY_SCROLLER_MOUSE_DOWN, (void *) 1);
+}
+
+
+
+static void _mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up *ei = event_info;
+ ret_if(!ei);
+
+ _APPS_D("Mouse is up [%d,%d]", ei->output.x, ei->output.y);
+ evas_object_data_del(obj, PRIVATE_DATA_KEY_SCROLLER_MOUSE_DOWN);
+
+ if (evas_object_data_get(obj, PRIVATE_DATA_KEY_SCROLLER_DRAG)) return;
+ evas_object_data_del(obj, PRIVATE_DATA_KEY_IS_SCROLLING);
+}
+
+
+
+static void _anim_start_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ _APPS_D("start the scroller animation");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_IS_SCROLLING, (void *) 1);
+
+ Evas_Object *item = item_get_press_item(scroller);
+ if(item) {
+ if(item_is_longpressed(item)) {
+ _APPS_D("longressed");
+ }
+ else {
+ item_is_released(item);
+ }
+ }
+}
+
+
+
+static void _anim_stop_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ _APPS_D("stop the scroller animation");
+ if (evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_MOUSE_DOWN)) return;
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_IS_SCROLLING);
+}
+
+
+
+static void _drag_start_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ _APPS_D("start to drag the scroller animation");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG, (void *) 1);
+ /* _drag_start_cb is called even if the scroller is not moved. */
+ //evas_object_data_set(scroller, PRIVATE_DATA_KEY_IS_SCROLLING, (void *) 1);
+
+ Evas_Object *item = item_get_press_item(scroller);
+ if(item) {
+ if(item_is_longpressed(item)) {
+ _APPS_D("longressed");
+ }
+ else {
+ item_is_released(item);
+ }
+ }
+}
+
+
+
+static void _drag_stop_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ _APPS_D("stop to drag the scroller animation");
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_DRAG);
+}
+
+
+
+static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_IS_SCROLLING, (void *) 1);
+}
+
+
+
+HAPI void apps_scroller_destroy(Evas_Object *layout)
+{
+ Evas_Object *scroller = NULL;
+ Evas_Object *page = NULL;
+ Eina_List *box_list = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!layout);
+
+ scroller = elm_object_part_content_unset(layout, "scroller");
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ box_list = elm_box_children_get(scroller_info->box);
+ ret_if(!box_list);
+
+ /* FIXME : We don't need to remove items? */
+ EINA_LIST_FREE(box_list, page) {
+ if (!page) break;
+ apps_page_destroy(page);
+ }
+
+ evas_object_del(scroller_info->box);
+ evas_object_del(scroller_info->box_layout);
+
+ evas_object_event_callback_del(scroller, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb);
+ evas_object_event_callback_del(scroller, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb);
+ evas_object_smart_callback_del(scroller, "scroll,anim,start", _anim_start_cb);
+ evas_object_smart_callback_del(scroller, "scroll,anim,stop", _anim_stop_cb);
+ evas_object_smart_callback_del(scroller, "scroll,drag,start", _drag_start_cb);
+ evas_object_smart_callback_del(scroller, "scroll,drag,stop", _drag_stop_cb);
+ evas_object_smart_callback_del(scroller, "scroll", _scroll_cb);
+
+ free(scroller_info);
+ evas_object_del(scroller);
+}
+
+
+
+Eina_Bool _init_timer_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+ item_info_s *item_info = NULL;
+ int index, count;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ list = evas_object_data_get(scroller_info->layout, DATA_KEY_LIST);
+ retv_if(!list, ECORE_CALLBACK_CANCEL);
+
+ index = (int) evas_object_data_get(scroller, DATA_KEY_LIST_INDEX);
+ count = eina_list_count(list);
+ if (index == count) goto OUT;
+
+ item_info = eina_list_nth(list, index);
+ goto_if(!item_info, OUT);
+
+ item_info->item = item_create(scroller, item_info);
+ item_info->ordering = index;
+ apps_scroller_append_item(scroller, item_info->item);
+
+ index ++;
+ if (index == count) goto OUT;
+ evas_object_data_set(scroller, DATA_KEY_LIST_INDEX, (void *) index);
+
+ return ECORE_CALLBACK_RENEW;
+
+OUT:
+ _APPS_D("Loading apps is done");
+
+ /* FIXME : Bring into the top */
+
+ evas_object_data_del(scroller, DATA_KEY_LIST_INDEX);
+ evas_object_data_del(scroller, DATA_KEY_TIMER);
+
+ index = 0;
+
+ wms_change_apps_order(W_HOME_WMS_BACKUP);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+#if 0 /* Do not need buttons */
+static void _top_btn_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *top_btn_layout = data;
+ ret_if(!top_btn_layout);
+
+ Evas_Event_Mouse_Down *ei = event_info;
+ ret_if(!ei);
+
+ _APPS_D("Mouse is down [%d,%d]", ei->output.x, ei->output.y);
+
+ Evas_Object *btn_text_layout = elm_object_part_content_get(top_btn_layout, "button,txt");
+ ret_if(!btn_text_layout);
+
+ elm_object_signal_emit(btn_text_layout, "press,button", "button");
+}
+
+
+
+static void _top_btn_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *top_btn_layout = data;
+ ret_if(!top_btn_layout);
+
+ Evas_Event_Mouse_Up *ei = event_info;
+ ret_if(!ei);
+
+ _APPS_D("Mouse is up [%d,%d]", ei->output.x, ei->output.y);
+
+ Evas_Object *btn_text_layout = elm_object_part_content_get(top_btn_layout, "button,txt");
+ ret_if(!btn_text_layout);
+
+ elm_object_signal_emit(btn_text_layout, "release,button", "button");
+}
+
+#define APPS_W_TASKMGR_PKGNAME "org.tizen.w-taskmanager"
+static void _top_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ _APPS_D("Clicked");
+
+ Evas_Object *layout = (Evas_Object*)data;
+ ret_if(!layout);
+
+ if(apps_layout_is_edited(layout)) {
+ _APPS_D("Edit mode");
+ return;
+ }
+
+ apps_effect_play_sound();
+
+ int isttsmode = apps_item_info_is_support_tts(APPS_W_TASKMGR_PKGNAME);
+ if(apps_main_get_info()->tts && !isttsmode) {
+ char tmp[NAME_LEN] = {0,};
+ snprintf(tmp, sizeof(tmp), _("IDS_SCR_POP_PS_IS_NOT_AVAILABLE_WHILE_SCREEN_READER_IS_ENABLED"), _("IDS_ST_OPT_RECENT_APPS_ABB"));
+ char *text = strdup(tmp);
+ util_create_toast_popup(layout, text);
+ }
+ else {
+ util_launch_app(APPS_W_TASKMGR_PKGNAME, NULL, NULL);
+ }
+}
+
+
+
+#define APPS_SAMSUNGAPPS_MAIN_CATEGORY_LIST "samsungapps://MainCategoryList/"
+static void _bottom_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ _APPS_D("Clicked");
+
+ Evas_Object *layout = (Evas_Object*)data;
+ ret_if(!layout);
+
+ if(apps_layout_is_edited(layout)) {
+ _APPS_D("Edit mode");
+ return;
+ }
+
+ apps_effect_play_sound();
+ wms_launch_gear_manager(data, APPS_SAMSUNGAPPS_MAIN_CATEGORY_LIST);
+}
+#endif
+
+
+
+static char *_access_info_cb(void *data, Evas_Object *obj)
+{
+ retv_if(!data, NULL);
+
+ char *tmp = strdup(data);
+ retv_if(!tmp, NULL);
+
+ return tmp;
+}
+
+
+
+HAPI Evas_Object *apps_scroller_create(Evas_Object *layout)
+{
+ Evas_Object *win = NULL;
+ Evas_Object *scroller = NULL;
+ Evas_Object *box_layout = NULL;
+ Evas_Object *box = NULL;
+ Ecore_Timer *timer = NULL;
+ instance_info_s *instance_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ int height;
+
+ win = evas_object_data_get(layout, DATA_KEY_WIN);
+ retv_if(!win, NULL);
+
+ instance_info = evas_object_data_get(win, DATA_KEY_INSTANCE_INFO);
+ retv_if(!instance_info, NULL);
+
+ Evas_Object *layout_focus = elm_object_part_content_get(layout, "focus");
+ retv_if(!layout_focus, NULL);
+
+ scroller = elm_scroller_add(layout);
+ retv_if(!scroller, NULL);
+
+ elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE);
+ elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
+#if 0 /* Scroll to move pages at a time */
+ elm_scroller_page_size_set(scroller, instance_info->root_w, ITEM_HEIGHT * apps_main_get_info()->scale);
+ elm_scroller_page_scroll_limit_set(scroller, 0, 3);
+#endif
+ elm_scroller_content_min_limit(scroller, EINA_FALSE, EINA_FALSE);
+ elm_scroller_single_direction_set(scroller, ELM_SCROLLER_SINGLE_DIRECTION_HARD);
+
+ elm_object_style_set(scroller, "effect");
+ elm_object_part_content_set(layout, "scroller", scroller);
+
+ height = (double) instance_info->root_h * apps_main_get_info()->scale;
+
+ evas_object_size_hint_min_set(scroller, instance_info->root_w, height);
+ evas_object_size_hint_max_set(scroller, instance_info->root_w, height);
+ evas_object_show(scroller);
+
+ evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, NULL);
+ evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, NULL);
+ evas_object_smart_callback_add(scroller, "scroll,anim,start", _anim_start_cb, NULL);
+ evas_object_smart_callback_add(scroller, "scroll,anim,stop", _anim_stop_cb, NULL);
+ evas_object_smart_callback_add(scroller, "scroll,drag,start", _drag_start_cb, NULL);
+ evas_object_smart_callback_add(scroller, "scroll,drag,stop", _drag_stop_cb, NULL);
+ evas_object_smart_callback_add(scroller, "scroll", _scroll_cb, NULL);
+
+ /* Use the layout between box and scroller because of alignment of a page in the box. */
+ box_layout = elm_layout_add(scroller);
+ goto_if(!box_layout, ERROR);
+
+ elm_layout_file_set(box_layout, BOX_EDJE, BOX_GROUP_NAME);
+ evas_object_show(box_layout);
+ elm_object_content_set(scroller, box_layout);
+
+ box = elm_box_add(box_layout);
+ goto_if(!box, ERROR);
+
+ elm_box_horizontal_set(box, EINA_FALSE);
+ evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(box);
+ elm_object_part_content_set(box_layout, "box", box);
+
+ //Recent apps
+#if 0 /* Do not need buttons */
+ Evas_Object *top_btn_layout = elm_layout_add(scroller);
+ goto_if(!top_btn_layout, ERROR);
+
+ elm_layout_file_set(top_btn_layout, BOX_EDJE, BOX_TOP_BTN_GROUP_NAME);
+ evas_object_size_hint_min_set(top_btn_layout, BASE_WIDTH, BOX_TOP_MENU_HEIGHT);
+
+ Evas_Object *top_btn_text = elm_layout_add(top_btn_layout);
+ goto_if(!top_btn_text, ERROR);
+
+ elm_layout_file_set(top_btn_text, BOX_EDJE, "top_button_text");
+
+ elm_object_part_text_set(top_btn_text, "txt", _("IDS_ST_OPT_RECENT_APPS_ABB"));
+ elm_object_domain_translatable_part_text_set(top_btn_text, "txt", PROJECT, "IDS_ST_OPT_RECENT_APPS_ABB");
+ evas_object_show(top_btn_text);
+ elm_object_part_content_set(top_btn_layout, "button,txt", top_btn_text);
+
+ evas_object_show(top_btn_layout);
+ elm_object_part_content_set(box_layout, "top_button", top_btn_layout);
+
+ Evas_Object *top_focus = elm_button_add(top_btn_layout);
+ goto_if(!top_focus, ERROR);
+
+ elm_object_style_set(top_focus, "focus");
+ elm_object_part_content_set(top_btn_layout, "focus", top_focus);
+ elm_access_info_cb_set(top_focus, ELM_ACCESS_INFO, _access_info_cb, _("IDS_ST_OPT_RECENT_APPS_ABB"));
+ elm_object_focus_allow_set(top_focus, EINA_FALSE);
+ evas_object_smart_callback_add(top_focus, "clicked", _top_btn_clicked_cb, layout);
+ evas_object_event_callback_add(top_focus, EVAS_CALLBACK_MOUSE_DOWN, _top_btn_down_cb, top_btn_layout);
+ evas_object_event_callback_add(top_focus, EVAS_CALLBACK_MOUSE_UP, _top_btn_up_cb, top_btn_layout);
+
+ //Go to Samsung Gear Apps
+ Evas_Object *bottom_btn_layout = elm_layout_add(scroller);
+ goto_if(!bottom_btn_layout, ERROR);
+
+ elm_layout_file_set(bottom_btn_layout, BOX_EDJE, BOX_BOTTOM_BTN_GROUP_NAME);
+ evas_object_size_hint_min_set(bottom_btn_layout, BASE_WIDTH, BOX_BOTTOM_MENU_HEIGHT);
+
+ elm_object_part_text_set(bottom_btn_layout, "button,txt", _("IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"));
+ elm_object_domain_translatable_part_text_set(bottom_btn_layout, "button,txt", PROJECT, "IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2");
+ evas_object_show(bottom_btn_layout);
+ elm_object_part_content_set(box_layout, "bottom_button", bottom_btn_layout);
+
+ Evas_Object *bottom_focus = elm_button_add(bottom_btn_layout);
+ goto_if(!bottom_focus, ERROR);
+
+ elm_object_style_set(bottom_focus, "focus");
+ elm_object_part_content_set(bottom_btn_layout, "focus", bottom_focus);
+ elm_access_info_cb_set(bottom_focus, ELM_ACCESS_INFO, _access_info_cb, _("IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"));
+ elm_object_focus_allow_set(bottom_focus, EINA_FALSE);
+ evas_object_smart_callback_add(bottom_focus, "clicked", _bottom_btn_clicked_cb, layout);
+#endif
+
+ timer = ecore_timer_add(0.01f, _init_timer_cb, scroller);
+ if (!timer) {
+ _APPS_E("Cannot add a timer");
+ apps_scroller_destroy(layout);
+ return NULL;
+ }
+ evas_object_data_set(scroller, DATA_KEY_TIMER, timer);
+
+ scroller_info = calloc(1, sizeof(scroller_info_s));
+ if (!scroller_info) {
+ _APPS_E("Cannot calloc for the scroller_info");
+ apps_scroller_destroy(layout);
+ return NULL;
+ }
+
+ scroller_info->win = win;
+ scroller_info->instance_info = instance_info;
+ scroller_info->layout = layout;
+ scroller_info->box_layout = box_layout;
+ scroller_info->box = box;
+ scroller_info->layout_focus = layout_focus;
+#if 0 /* Do not need buttons */
+ scroller_info->top_focus = top_focus;
+ scroller_info->bottom_focus = bottom_focus;
+#endif
+ scroller_info->list = NULL;
+ scroller_info->list_index = 0;
+
+ evas_object_data_set(scroller, DATA_KEY_SCROLLER_INFO, scroller_info);
+
+#if 0 /* Do not need buttons */
+ elm_object_focus_next_object_set(layout_focus, top_focus, ELM_FOCUS_NEXT);
+ elm_access_highlight_next_set(layout_focus, ELM_HIGHLIGHT_DIR_NEXT, top_focus);
+
+ elm_access_chain_end_set(bottom_focus, ELM_HIGHLIGHT_DIR_NEXT);
+#endif
+
+ return scroller;
+
+ERROR:
+ if(box_layout) evas_object_del(box_layout);
+ if(box) evas_object_del(box);
+ if(scroller) evas_object_del(scroller);
+#if 0 /* Do not need buttons */
+ if(top_btn_layout) evas_object_del(top_btn_layout);
+ if(bottom_btn_layout) evas_object_del(bottom_btn_layout);
+#endif
+
+ return NULL;
+}
+
+
+
+HAPI int apps_scroller_count_page(Evas_Object *scroller)
+{
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+ int count = 0;
+
+ retv_if(!scroller, 0);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, 0);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, 0);
+
+ count = eina_list_count(list);
+ eina_list_free(list);
+
+ return count;
+}
+
+
+
+HAPI int apps_scroller_count_item(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ Evas_Object *page = NULL;
+ int count = 0;
+
+ retv_if(!scroller, -1);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, -1);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, -1);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ count += apps_page_count_item(page);
+ }
+
+ eina_list_free(list);
+
+ return count;
+}
+
+
+
+HAPI Eina_Bool apps_scroller_is_scrolling(Evas_Object *scroller)
+{
+ return evas_object_data_get(scroller, PRIVATE_DATA_KEY_IS_SCROLLING)? EINA_TRUE:EINA_FALSE;
+}
+
+
+
+HAPI void apps_scroller_freeze(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ elm_object_scroll_freeze_push(scroller_info->box);
+}
+
+
+
+HAPI void apps_scroller_unfreeze(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ while (elm_object_scroll_freeze_get(scroller_info->box)) {
+ elm_object_scroll_freeze_pop(scroller_info->box);
+ }
+}
+
+
+
+static Eina_Bool _bring_in_timer_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ int i = 0;
+
+ i = (int) evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ITH);
+ elm_scroller_page_bring_in(scroller, i, 0);
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void apps_scroller_bring_in(Evas_Object *scroller, int page_no)
+{
+ Ecore_Timer *timer = NULL;
+
+ ret_if(!scroller);
+
+ /* 1. Remove the old timer */
+ timer = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ /* 2. Append the new timer */
+ timer = ecore_timer_add(0.01f, _bring_in_timer_cb, scroller);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER, timer);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ITH, (void *) page_no);
+}
+
+
+
+HAPI void apps_scroller_bring_in_page(Evas_Object *scroller, Evas_Object *page)
+{
+ Evas_Object *tmp = NULL;
+ Eina_List *list = NULL;
+ Ecore_Timer *timer = NULL;
+ scroller_info_s *scroller_info = NULL;
+ const Eina_List *l;
+ const Eina_List *n;
+ int i = -1;
+
+ ret_if(!scroller);
+ ret_if(!page);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FOREACH_SAFE(list, l, n, tmp) {
+ i++;
+ break_if(!tmp);
+ if (tmp != page) continue;
+
+ /* 1. Remove the old timer */
+ timer = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ /* 2. Append the new timer */
+ timer = ecore_timer_add(0.01f, _bring_in_timer_cb, scroller);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER, timer);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ITH, (void *) i);
+ break;
+ }
+ eina_list_free(list);
+}
+
+
+
+HAPI void apps_scroller_region_show(Evas_Object *scroller, int x, int y)
+{
+ scroller_info_s *scroller_info = NULL;
+ instance_info_s *instance_info = NULL;
+ int w, h;
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ instance_info = scroller_info->instance_info;
+ ret_if(!instance_info);
+
+ evas_object_geometry_get(scroller, NULL, NULL, &w, &h);
+ elm_scroller_region_show(scroller, x, y, w, h);
+}
+
+
+
+HAPI void apps_scroller_append_item(Evas_Object *scroller, Evas_Object *item)
+{
+ Evas_Object *last_page = NULL;
+ Eina_List *list, *last;
+ scroller_info_s *scroller_info = NULL;
+ item_info_s *item_info = NULL;
+ int items_per_page = 0;
+
+ ret_if(!scroller);
+ ret_if(!item);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ list = elm_box_children_get(scroller_info->box);
+ if (list) {
+ last = eina_list_last(list);
+ goto_if(!last, ERROR);
+
+ last_page = eina_list_data_get(last);
+ goto_if(!last_page, ERROR);
+
+ eina_list_free(list);
+
+ items_per_page = apps_page_count_item(last_page);
+ } else {
+ /* If there is no list, then we have to create a page */
+ items_per_page = APPS_PER_PAGE;
+ }
+
+ if (items_per_page < APPS_PER_PAGE) {
+ apps_page_pack_item(last_page, item);
+ } else {
+ Evas_Object *page = apps_page_create(scroller, last_page, NULL);
+ ret_if(!page);
+ elm_box_pack_end(scroller_info->box, page);
+ apps_page_pack_item(page, item);
+ }
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ scroller_info->list = eina_list_append(scroller_info->list, item_info);
+
+ return;
+
+ERROR:
+ _APPS_E("Find an error on appending an item");
+ if (list) eina_list_free(list);
+}
+
+
+
+HAPI void apps_scroller_remove_item(Evas_Object *scroller, Evas_Object *item)
+{
+ Evas_Object *page = NULL;
+ Eina_List *list;
+ const Eina_List *l, *ln;
+ scroller_info_s *scroller_info = NULL;
+ item_info_s *item_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!item);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ if (APPS_ERROR_NONE == apps_page_unpack_item(page, item)) {
+ break;
+ }
+ }
+
+ eina_list_free(list);
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ ret_if(!item_info);
+
+ scroller_info->list = eina_list_remove(scroller_info->list, item_info);
+}
+
+
+
+HAPI apps_error_e apps_scroller_pack_nth(Evas_Object *scroller, Evas_Object *item, int ordering)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *last_page = NULL;
+ Evas_Object *tmp = NULL;
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ Eina_List *last = NULL;
+ int cur_count, more_page_count;
+ register int i;
+
+ retv_if(!scroller, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(!item, APPS_ERROR_INVALID_PARAMETER);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, APPS_ERROR_FAIL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, APPS_ERROR_FAIL);
+
+ cur_count = eina_list_count(list);
+ more_page_count = (ordering / APPS_PER_PAGE + 1) - cur_count;
+
+ if (more_page_count > 0) {
+ last = eina_list_last(list);
+ if (last) last_page = eina_list_data_get(last);
+ }
+
+ for (i = 0; i < more_page_count; i++) {
+ Evas_Object *new_page = apps_page_create(scroller, last_page, NULL);
+ retv_if(!new_page, APPS_ERROR_FAIL);
+ last_page = new_page;
+ }
+
+ page = eina_list_nth(list, ordering / APPS_PER_PAGE);
+ retv_if(!page, APPS_ERROR_FAIL);
+
+ tmp = apps_page_unpack_nth(page, ordering % APPS_PER_PAGE);
+ if (tmp) {
+ item_info_s *item_info = evas_object_data_get(tmp, DATA_KEY_ITEM_INFO);
+ if (item_info && item_info->appid) {
+ _APPS_D("Destroy an item[%s]", item_info->appid);
+ }
+ }
+ apps_page_pack_nth(page, item, ordering % APPS_PER_PAGE);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+static Eina_Bool _append_items_timer_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ Eina_List *list = NULL;
+ item_info_s *item_info = NULL;
+ int index, count;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+
+ list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_APPENDED);
+ retv_if(!list, ECORE_CALLBACK_CANCEL);
+
+ index = (int) evas_object_data_get(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX);
+ count = eina_list_count(list);
+ if (index == count) goto OUT;
+
+ item_info = eina_list_nth(list, index);
+ goto_if(!item_info, OUT);
+
+ item_info->item = item_create(scroller, item_info);
+ item_info->ordering = index;
+ apps_scroller_append_item(scroller, item_info->item);
+
+ index ++;
+ if (index == count) goto OUT;
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX, (void *) index);
+
+ return ECORE_CALLBACK_RENEW;
+
+OUT:
+ _APPS_D("Loading apps is done");
+
+ /* FIXME : Scroller into the top */
+
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_TIMER);
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX);
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_APPENDED);
+
+ index = 0;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void apps_scroller_append_list(Evas_Object *scroller, Eina_List *list)
+{
+ Ecore_Timer *timer = NULL;
+
+ ret_if(!scroller);
+ ret_if(!list);
+
+ timer = evas_object_data_del(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ timer = ecore_timer_add(0.01f, _append_items_timer_cb, scroller);
+ ret_if(!timer);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_TIMER, timer);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_INDEX, NULL);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_ITEM_INFO_LIST_APPENDED, list);
+}
+
+
+
+HAPI void apps_scroller_remove_list(Evas_Object *scroller, Eina_List *list)
+{
+ const Eina_List *l, *ln;
+ item_info_s *item_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!list);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, item_info) {
+ continue_if(!item_info);
+ if (item_info->item) {
+ apps_scroller_remove_item(scroller, item_info->item);
+ item_destroy(item_info->item);
+ }
+ item_info->item = NULL;
+ }
+}
+
+
+
+HAPI void apps_scroller_trim(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *cur_list = NULL;
+ Eina_List *page_list = NULL;
+ Eina_List *item_list = NULL;
+ const Eina_List *l, *ln;
+
+ Evas_Object *page = NULL;
+ Evas_Object *item = NULL;
+
+ int i, count = 0, index = 0, pull = 0;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ cur_list = elm_box_children_get(scroller_info->box);
+ ret_if(!cur_list);
+
+ // 1. Unpack all untrimmed items
+ EINA_LIST_FOREACH_SAFE(cur_list, l, ln, page) {
+ continue_if(!page);
+
+ if(!pull) {
+ count = apps_page_count_item(page);
+ if (APPS_PER_PAGE == count) continue;
+ }
+
+ pull = 1;
+
+ for (i = 0; i < APPS_PER_PAGE; i++) {
+ item = apps_page_unpack_nth(page, i);
+ if (!item) continue;
+ item_list = eina_list_append(item_list, item);
+ }
+
+ page_list = eina_list_append(page_list, page);
+ }
+ eina_list_free(cur_list);
+ count = eina_list_count(item_list);
+
+ // 2. Pack all items
+ EINA_LIST_FOREACH_SAFE(page_list, l, ln, page) {
+ for (i = 0; item_list && i < APPS_PER_PAGE; i++) {
+ item = eina_list_nth(item_list, index);
+ index++;
+ continue_if(!item);
+
+ break_if(APPS_ERROR_NONE != apps_page_pack_nth(page, item, i));
+ }
+ }
+
+ eina_list_free(item_list);
+
+ // 3. Remove empty page
+ EINA_LIST_FREE(page_list, page) {
+ if (apps_page_count_item(page) == 0) {
+ apps_page_destroy(page);
+ }
+ }
+}
+
+
+
+HAPI void apps_scroller_change_language(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ Evas_Object *page = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ elm_access_info_cb_set(scroller_info->layout_focus, ELM_ACCESS_INFO, _access_info_cb, _("IDS_IDLE_BODY_APPS"));
+#if 0 /* Do not need buttons */
+ elm_access_info_cb_set(scroller_info->top_focus, ELM_ACCESS_INFO, _access_info_cb, _("IDS_ST_OPT_RECENT_APPS_ABB"));
+ elm_access_info_cb_set(scroller_info->bottom_focus, ELM_ACCESS_INFO, _access_info_cb, _("IDS_HS_BUTTON_GET_MORE_APPLICATIONS_ABB2"));
+#endif
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+ apps_page_change_language(page);
+ }
+
+ eina_list_free(list);
+}
+
+
+
+/* return a page that has the item */
+HAPI Evas_Object *apps_scroller_has_item(Evas_Object *scroller, Evas_Object *item)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ Evas_Object *page = NULL;
+
+ retv_if(!scroller, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+ if (apps_page_has_item(page, item)) {
+ eina_list_free(list);
+ return page;
+ }
+ }
+
+ eina_list_free(list);
+ return NULL;
+}
+
+
+
+HAPI Evas_Object *apps_scroller_move_item_prev(Evas_Object *scroller, Evas_Object *from_item, Evas_Object *to_item, Evas_Object *append_item)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ Eina_List *l;
+ Evas_Object *page = NULL;
+ Evas_Object *tmp_page = NULL;
+ Evas_Object *tmp_next;
+ item_info_s *from_info = NULL;
+ item_info_s *to_info = NULL;
+
+ retv_if(!scroller, NULL);
+ retv_if(!append_item, NULL);
+ retv_if(!from_item, NULL);
+ retv_if(!to_item, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ /* 1. Remove the nodes before from_info->page */
+ from_info = evas_object_data_get(from_item, DATA_KEY_ITEM_INFO);
+ retv_if(!from_info, NULL);
+
+ EINA_LIST_FOREACH(list, l, page) {
+ if (page != from_info->page) {
+ list = eina_list_remove_list(list, l);
+ } else break;
+ }
+
+ /* 2. Remove the nodes after to_info->page */
+ list = eina_list_reverse(list);
+ retv_if(!list, NULL);
+
+ to_info = evas_object_data_get(to_item, DATA_KEY_ITEM_INFO);
+ retv_if(!to_info, NULL);
+
+ EINA_LIST_FOREACH(list, l, page) {
+ if (page != to_info->page) {
+ list = eina_list_remove_list(list, l);
+ } else break;
+ }
+
+ tmp_next = append_item;
+ /* 3. Move items */
+ EINA_LIST_FOREACH(list, l, page) {
+ Evas_Object *tmp_from = NULL;
+ Evas_Object *tmp_to = NULL;
+
+ continue_if(!page);
+
+ if (apps_page_has_item(page, from_item)) tmp_from = from_item;
+ else tmp_from = NULL;
+
+ if (apps_page_has_item(page, to_item)) tmp_to = to_item;
+ else tmp_to = NULL;
+
+ tmp_next = apps_page_move_item_prev(page, tmp_from, tmp_to, tmp_next);
+ tmp_page = page;
+ }
+ if (tmp_next) apps_page_pack_item(tmp_page, tmp_next);
+
+ eina_list_free(list);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI Evas_Object *apps_scroller_move_item_next(Evas_Object *scroller, Evas_Object *from_item, Evas_Object *to_item, Evas_Object *insert_item)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ Eina_List *l;
+ Evas_Object *page = NULL;
+ Evas_Object *tmp_page = NULL;
+ Evas_Object *tmp_next;
+ item_info_s *from_info = NULL;
+ item_info_s *to_info = NULL;
+
+ retv_if(!scroller, NULL);
+ retv_if(!insert_item, NULL);
+ retv_if(!from_item, NULL);
+ retv_if(!to_item, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ from_info = evas_object_data_get(from_item, DATA_KEY_ITEM_INFO);
+ retv_if(!from_info, NULL);
+
+ /* 1. Remove the nodes before from_info->page */
+ from_info = evas_object_data_get(from_item, DATA_KEY_ITEM_INFO);
+ retv_if(!from_info, NULL);
+
+ EINA_LIST_FOREACH(list, l, page) {
+ if (page != from_info->page) {
+ list = eina_list_remove_list(list, l);
+ } else break;
+ }
+
+ /* 2. Remove the nodes after to_info->page */
+ list = eina_list_reverse(list);
+ retv_if(!list, NULL);
+
+ to_info = evas_object_data_get(to_item, DATA_KEY_ITEM_INFO);
+ retv_if(!to_info, NULL);
+
+ EINA_LIST_FOREACH(list, l, page) {
+ if (page != to_info->page) {
+ list = eina_list_remove_list(list, l);
+ } else break;
+ }
+
+ list = eina_list_reverse(list);
+ retv_if(!list, NULL);
+
+ tmp_next = insert_item;
+ /* 3. Move items */
+ EINA_LIST_FOREACH(list, l, page) {
+ Evas_Object *tmp_from = NULL;
+ Evas_Object *tmp_to = NULL;
+
+ continue_if(!page);
+
+ if (apps_page_has_item(page, from_item)) tmp_from = from_item;
+ else tmp_from = NULL;
+
+ if (apps_page_has_item(page, to_item)) tmp_to = to_item;
+ else tmp_to = NULL;
+
+ tmp_next = apps_page_move_item_next(page, tmp_from, tmp_to, tmp_next);
+ tmp_page = page;
+ }
+ if (tmp_next) apps_page_pack_item(tmp_page, tmp_next);
+
+ eina_list_free(list);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+HAPI int apps_scroller_seek_item_position(Evas_Object *scroller, Evas_Object *item)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ Evas_Object *page = NULL;
+ int position = 0;
+
+ retv_if(!scroller, -1);
+ retv_if(!item, -1);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, -1);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, -1);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ int idx;
+ continue_if(!page);
+ idx = apps_page_seek_item_position(page, item);
+ if (idx < 0) {
+ position += APPS_PER_PAGE;
+ } else if (idx >= 0 && idx < APPS_PER_PAGE) {
+ position += idx;
+ break;
+ } else {
+ _APPS_E("Is this a valid value? idx [%d]", idx);
+ }
+ }
+
+ eina_list_free(list);
+ return position;
+}
+
+
+
+HAPI void apps_scroller_bring_in_region_by_vector(Evas_Object *scroller, int vector)
+{
+ int position = 0;
+ int count = 0;
+ int max = 0;
+
+ elm_scroller_region_get(scroller, NULL, &position, NULL, NULL);
+ vector = vector * ITEM_HEIGHT;
+ position += vector;
+
+ count = apps_scroller_count_page(scroller);
+ max = (count - 3) * ITEM_HEIGHT + 150;
+
+ if (position < 0) position = 1;
+ else if (position > max) position = max - 1;
+
+ elm_scroller_region_bring_in(scroller, 0, position, BASE_WIDTH, BASE_HEIGHT-1);
+}
+
+
+static item_info_s *_find_item_from_list(Eina_List *list, const char *appid)
+{
+ Eina_List *l = NULL;
+ Eina_List *l_next = NULL;
+ item_info_s *item_info = NULL;
+ EINA_LIST_FOREACH_SAFE(list, l, l_next, item_info) {
+ if(!strcmp(item_info->appid, appid)) {
+ return item_info;
+ }
+ }
+ return NULL;
+}
+
+
+/* item_info_list must have all the items */
+HAPI apps_error_e apps_scroller_read_list(Evas_Object *scroller, Eina_List *item_info_list)
+{
+ scroller_info_s *scroller_info = NULL;
+ item_info_s *item_info, *cur_item_info;
+ Eina_List *cur_list = NULL;
+ Eina_List *cur_item_list = NULL;
+
+ Evas_Object *page = NULL;
+ Evas_Object *cur_item = NULL;
+
+ int i = 0;
+
+ retv_if(!scroller, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(!item_info_list, APPS_ERROR_INVALID_PARAMETER);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, APPS_ERROR_FAIL);
+
+ cur_list = elm_box_children_get(scroller_info->box);
+ retv_if(!cur_list, APPS_ERROR_FAIL);
+
+ /* Unpack all the items those don't match with item_info_list */
+ EINA_LIST_FREE(cur_list, page) {
+ continue_if(!page);
+
+ for (i = 0; i < APPS_PER_PAGE; i++) {
+
+ cur_item = apps_page_get_item_at(page, i);
+ if (!cur_item) continue;
+
+ cur_item_info = evas_object_data_get(cur_item, DATA_KEY_ITEM_INFO);
+ retv_if(!cur_item_info, APPS_ERROR_FAIL);
+ retv_if(!cur_item_info->appid, APPS_ERROR_FAIL);
+
+ apps_scroller_remove_item(scroller, cur_item);
+ _APPS_D("remove item[%s]", cur_item_info->appid);
+ item_destroy(cur_item);
+ cur_item_list = eina_list_append(cur_item_list, cur_item_info);
+ }
+ apps_page_destroy(page);
+ }
+
+ //Append apps in item_info_list
+ EINA_LIST_FREE(item_info_list, item_info) {
+ continue_if(!item_info);
+ _APPS_D("Pack an item[%s] into [%d]", item_info->appid, item_info->ordering);
+
+ cur_item_info = _find_item_from_list(cur_item_list, item_info->appid);
+ if(cur_item_info) {
+ cur_item_list = eina_list_remove(cur_item_list, cur_item_info);
+
+ item_info->item = item_create(scroller, cur_item_info);
+ }
+ else {
+ item_info->item = item_create(scroller, item_info);
+ }
+
+ apps_scroller_append_item(scroller, item_info->item);
+ }
+
+ //if cur_item_list is not NULL. append items
+ EINA_LIST_FREE(cur_item_list, cur_item_info) {
+ continue_if(!cur_item_info);
+ _APPS_D("Pack an item[%s] into [%d] tts [%d]", cur_item_info->appid, cur_item_info->ordering, cur_item_info->tts);
+
+ cur_item_info->item = item_create(scroller, cur_item_info);
+ apps_scroller_append_item(scroller, cur_item_info->item);
+ }
+
+ return APPS_ERROR_NONE;
+}
+
+
+HAPI void apps_scroller_write_list(Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *item = NULL;
+ scroller_info_s *scroller_info = NULL;
+ item_info_s *item_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+
+ int i = 0;
+ int ordering = 0;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+
+ for (i = 0; i < APPS_PER_PAGE; i++) {
+ item = apps_page_get_item_at(page, i);
+ if (!item) continue;
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ continue_if(!item_info);
+
+ item_info->ordering = ordering;
+ _APPS_SD("[%s]'s ordering : %d", item_info->appid, item_info->ordering);
+ ordering++;
+ }
+ }
+
+ eina_list_free(list);
+}
+
+
+
+HAPI Evas_Object *apps_scroller_get_item_by_pkgid(Evas_Object *scroller, const char *pkgid)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *item = NULL;
+ scroller_info_s *scroller_info = NULL;
+ item_info_s *item_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ int i = 0;
+
+ retv_if(!scroller, NULL);
+ retv_if(!pkgid, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+
+ for (i = 0; i < APPS_PER_PAGE; i++) {
+ item = apps_page_get_item_at(page, i);
+ if (!item) continue;
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ continue_if(!item_info);
+ continue_if(!item_info->pkgid);
+
+ if (strcmp(item_info->pkgid, pkgid)) continue;
+ _APPS_SD("Get [%s]'s item object", item_info->pkgid);
+ return item;
+ }
+ }
+
+ eina_list_free(list);
+ return NULL;
+}
+
+
+
+HAPI Evas_Object *apps_scroller_get_item_by_appid(Evas_Object *scroller, const char *appid)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *item = NULL;
+ scroller_info_s *scroller_info = NULL;
+ item_info_s *item_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ int i = 0;
+
+ retv_if(!scroller, NULL);
+ retv_if(!appid, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+
+ for (i = 0; i < APPS_PER_PAGE; i++) {
+ item = apps_page_get_item_at(page, i);
+ if (!item) continue;
+
+ item_info = evas_object_data_get(item, DATA_KEY_ITEM_INFO);
+ continue_if(!item_info);
+ continue_if(!item_info->appid);
+
+ if (strcmp(item_info->appid, appid)) continue;
+ _APPS_SD("Get [%s]'s item object", item_info->appid);
+ return item;
+ }
+ }
+
+ eina_list_free(list);
+ return NULL;
+}
+
+
+
+HAPI void apps_scroller_edit(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ Evas_Object *page = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ elm_object_signal_emit(scroller_info->layout, "show,zoom", "scroller");
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+ apps_page_edit(page);
+ }
+ eina_list_free(list);
+}
+
+
+
+HAPI void apps_scroller_unedit(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ Evas_Object *page = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ elm_object_signal_emit(scroller_info->layout, "reset,zoom", "scroller");
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+ apps_page_unedit(page);
+ }
+ eina_list_free(list);
+}
+
+
+
+// End of this file
diff --git a/home/src/apps/xml.c b/home/src/apps/xml.c
new file mode 100755
index 0000000..7bcc9ab
--- /dev/null
+++ b/home/src/apps/xml.c
@@ -0,0 +1,323 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <aul.h>
+#include <Eina.h>
+
+#include <libxml/encoding.h>
+#include <libxml/xmlwriter.h>
+#include <libxml/xmlreader.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+#include "log.h"
+#include "util.h"
+#include "apps/item_info.h"
+#include "apps/xml.h"
+
+const char *APPS_XML_ENCODING = "utf-8";
+const char *ITEM_TYPE_IDLE_CLOCK_STR = "idle-clock";
+const char *ITEM_TYPE_FAVORITE_STR = "favorite";
+const char *ITEM_TYPE_APP_WIDGET_STR = "appwidget";
+const char *ITEM_TYPE_MORE_APPS_STR = "apps";
+const int APPS_DBOX_PER_PAGE = 2;
+
+static void _get_position_by_order(int ordering, int *row, int *cell)
+{
+ ret_if(!row);
+ ret_if(!cell);
+
+ *row = ordering / 2;
+
+ switch(ordering % 2) {
+ case 0:
+ *cell = 0;
+ break;
+ case 1:
+ *cell = 1;
+ break;
+/*
+ case 2:
+ *cell = 2;
+ break;
+ case 3:
+ *cell = 3;
+ break;
+*/
+ default:
+ _APPS_E("Failed to get cellx & celly");
+ *cell = -1;
+ break;
+ }
+}
+
+
+
+static xmlTextWriterPtr _init_writer(const char *xml_file)
+{
+ xmlTextWriterPtr writer;
+ int ret = 0;
+
+ writer = xmlNewTextWriterFilename(xml_file, 0);
+ retv_if(!writer, NULL);
+
+ ret = xmlTextWriterStartDocument(writer, NULL, APPS_XML_ENCODING, NULL);
+ if (ret < 0) {
+ _APPS_E("Failed to start xmlTextWriterStartDocument");
+ xmlFreeTextWriter(writer);
+ return NULL;
+ }
+
+ ret = xmlTextWriterStartElement(writer, BAD_CAST "data");
+ if (ret < 0) {
+ _APPS_E("Failed to start xmlTextWriterStartElement");
+ xmlFreeTextWriter(writer);
+ return NULL;
+ }
+
+ return writer;
+}
+
+
+
+static void _destroy_writer(xmlTextWriterPtr writer)
+{
+ int ret = 0;
+
+ ret = xmlTextWriterEndElement(writer);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterEndDocument(writer);
+ if (ret < 0) {
+ _APPS_E("Cannot end the document");
+ }
+
+END:
+ xmlFreeTextWriter(writer);
+}
+
+
+
+HAPI apps_error_e apps_xml_read_list(const char *xml_file, Eina_List *item_info_list)
+{
+ xmlTextWriterPtr writer;
+ Eina_List *l = NULL;
+ item_info_s *info = NULL;
+ int ret = 0;
+ int row = -1;
+ int cell = -1;
+
+ retv_if(!xml_file, APPS_ERROR_INVALID_PARAMETER);
+ retv_if(!item_info_list, APPS_ERROR_INVALID_PARAMETER);
+
+ writer = _init_writer(xml_file);
+ retv_if(!writer, APPS_ERROR_FAIL);
+
+ EINA_LIST_FOREACH(item_info_list, l, info) {
+ continue_if(!info);
+
+ _get_position_by_order(info->ordering, &row, &cell);
+
+ ret = xmlTextWriterStartElement(writer, BAD_CAST ITEM_TYPE_MORE_APPS_STR);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "packageName", "%s", info->pkgid);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "className", "%s", info->appid);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "screen", "%d", row);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "cell", "%d", cell);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterEndElement(writer);
+ goto_if(ret < 0, END);
+ }
+
+END:
+ _destroy_writer(writer);
+
+ return APPS_ERROR_NONE;
+}
+
+
+
+static xmlTextReaderPtr _init_reader(const char *xml_file)
+{
+ xmlTextReaderPtr reader = NULL;
+
+ retv_if(!xml_file, NULL);
+
+ reader = xmlReaderForFile(xml_file, NULL, 0);
+ retv_if(!reader, NULL);
+
+ return reader;
+}
+
+
+
+static void _destroy_reader(xmlTextReaderPtr reader)
+{
+ ret_if(!reader);
+ xmlFreeTextReader(reader);
+}
+
+
+
+static inline void _destroy_list(Eina_List *list)
+{
+ item_info_s *info = NULL;
+
+ if (!list) return;
+
+ EINA_LIST_FREE(list, info) {
+ continue_if(!info);
+ apps_item_info_destroy(info);
+ }
+}
+
+
+
+HAPI Eina_List *apps_xml_write_list(const char *xml_file)
+{
+ xmlTextReaderPtr reader = NULL;
+ Eina_List *list = NULL;
+ item_info_s *info = NULL;
+ const char *name, *value;
+ char *element = NULL;
+ int ret = -1;
+
+ retv_if(!xml_file, NULL);
+
+ reader = _init_reader(xml_file);
+ retv_if(!reader, NULL);
+
+ while ((ret = xmlTextReaderRead(reader)) == 1) {
+ int dep = 0;
+ int node_type = 0;
+ static int cell = 0;
+ static int page_no = 0;
+
+ dep = xmlTextReaderDepth(reader);
+ node_type = xmlTextReaderNodeType(reader);
+ continue_if(-1 == dep || -1 == node_type);
+
+ name = (const char*) xmlTextReaderConstName(reader);
+ continue_if(!name);
+
+ value = (const char*) xmlTextReaderConstValue(reader);
+ /* value can be NULL in case of 'category' */
+
+ // Category, element is 1
+ if ((1 == dep) && (1 == node_type)) {
+ if (info) {
+ apps_item_info_destroy(info);
+ info = NULL;
+ }
+
+ if (strcasecmp(ITEM_TYPE_MORE_APPS_STR, name)) {
+ _APPS_E("Type(%s) is wrong. But, go through with it.", name);
+ }
+ continue;
+ }
+
+ // Element name
+ if ((2 == dep) && (1 == node_type)) {
+ if (element) {
+ _APPS_E("The element name is NOT NULL");
+ free(element);
+ element = NULL;
+ }
+
+ element = strdup(name);
+ goto_if(!element, CRITICAL_ERROR);
+ continue;
+ }
+
+ // Element value, textfield is 3
+ if ((3 == dep) && (3 == node_type)) {
+ continue_if(!element);
+
+ if (!strcasecmp("packageName", element)) {
+ /* Do nothing */
+ } else if (!strcasecmp("className", element)) {
+ info = apps_item_info_create(value);
+ if(!info) _E("info of [%s] is NULL", value);
+ } else if(!strcasecmp("screen", element)) {
+ page_no = atoi(value);
+ } else if(!strcasecmp("cell", element)) {
+ cell = atoi(value);
+ }
+ continue;
+ }
+
+ // End of the Element
+ if ((2 == dep) && (15 == node_type)) {
+ if (!element) {
+ apps_item_info_destroy(info);
+ info = NULL;
+ continue;
+ }
+
+ free(element);
+ element = NULL;
+ continue;
+ }
+
+ // End of the category
+ if ((1 == dep) && (15 == node_type)) { // End of the category
+ if(info) {
+ info->ordering = page_no * APPS_DBOX_PER_PAGE + cell;
+ list = eina_list_append(list, info);
+ _APPS_D("Append a package into the list : (%s:%s:%d) (%d:%d)"
+ , info->pkgid, info->appid, info->ordering
+ , page_no, cell);
+ }
+
+ info = NULL;
+ page_no = 0;
+ cell = 0;
+ }
+ }
+
+ if(element) {
+ _APPS_E("An element is not appended properly");
+ free(element);
+ }
+
+ if(info) {
+ _APPS_E("A node(%s:%s) is not appended into the list", info->pkgid, info->appid);
+ apps_item_info_destroy(info);
+ }
+ goto_if(ret, CRITICAL_ERROR);
+
+ _destroy_reader(reader);
+ return list;
+
+CRITICAL_ERROR:
+ apps_item_info_destroy(info);
+ _destroy_list(list);
+ _destroy_reader(reader);
+ return NULL;
+}
+
+
+
+// End of a file
diff --git a/home/src/bg.c b/home/src/bg.c
new file mode 100755
index 0000000..531045f
--- /dev/null
+++ b/home/src/bg.c
@@ -0,0 +1,210 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <vconf.h>
+#include <efl_assist.h>
+#include <dlog.h>
+#include <bundle.h>
+
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "bg.h"
+#include "dbus.h"
+
+#define VCONFKEY_WMS_BG_MODE "db/wms/home_bg_mode"
+#define VCONFKEY_WMS_BG_PALETTE "db/wms/home_bg_palette"
+#define VCONFKEY_WMS_BG_GALLERY "db/wms/home_bg_gallery"
+#define BG_DEFAULT_ALPHA 127
+
+
+
+typedef enum {
+ BG_TYPE_COLOR = 0,
+ BG_TYPE_IMAGE,
+ BG_TYPE_GALLERY,
+ BG_TYPE_MAX,
+} bg_type_e;
+
+
+
+static bg_type_e _get_bg_type(void)
+{
+ /* 0 : Color, 1 : Image, 2 : Gallery */
+ int val = -1;
+
+ if(vconf_get_int(VCONFKEY_WMS_BG_MODE, &val) < 0) {
+ _E("Failed to get WMS_HOME_BG_MODE");
+ return BG_TYPE_IMAGE;
+ }
+
+ return val;
+}
+
+
+
+HAPI void bg_set_rgb(Evas_Object *bg, const char *buf)
+{
+ int rgb;
+ int r;
+ int g;
+ int b;
+
+ ret_if(!bg);
+ ret_if(!buf);
+
+ rgb = strtoul(buf, NULL, 16);
+
+ r = (rgb & 0x00FF0000) >> 16;
+ g = (rgb & 0x0000FF00) >> 8;
+ b = rgb & 0x000000FF;
+
+ elm_bg_color_set(bg, r, g, b);
+ elm_bg_file_set(bg, NULL, NULL);
+}
+
+
+
+#define DEFAULT_BG_PATH "/opt/share/settings/Wallpapers/Home_default.png"
+static void _change_bg(keynode_t *node, void *data)
+{
+ bg_type_e bg_type = BG_TYPE_IMAGE;
+ Evas_Object *win = data;
+ Evas_Object *bg;
+ char *buf = NULL;
+
+ if (node) {
+ _D("BG is changed by vconf");
+ }
+
+ bg = evas_object_data_get(win, DATA_KEY_BG);
+ if (!bg) {
+ _E("Cannot get bg");
+ return;
+ }
+
+ bg_type = _get_bg_type();
+ switch (bg_type) {
+ case BG_TYPE_COLOR:
+ buf = vconf_get_str(VCONFKEY_WMS_BG_PALETTE);
+ break_if(!buf);
+
+ bg_set_rgb(bg, buf);
+ break;
+ case BG_TYPE_IMAGE:
+ case BG_TYPE_GALLERY:
+ buf = vconf_get_str(VCONFKEY_BGSET);
+ buf = (buf == NULL) ? strdup(DEFAULT_BG_PATH) : buf;
+ break_if(!buf);
+
+ if (elm_bg_file_set(bg, buf, NULL) == EINA_FALSE) {
+ _E("Failed to set BG file:%s", buf);
+ } else {
+ _D("BG is changed to %s", buf);
+ }
+ _W("file size:%lld", ecore_file_size(buf));
+ break;
+ default:
+ _E("Cannot reach here");
+ break;
+ }
+ _W("BG : [%d, %s]", bg_type, buf);
+ free(buf);
+
+ home_dbus_lcd_on_signal_send(EINA_FALSE);
+}
+
+
+
+static void _bg_down_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ _D("BG is pressed");
+}
+
+
+
+static void _bg_up_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ _D("BG is released");
+}
+
+
+
+HAPI Evas_Object *bg_create(Evas_Object *win)
+{
+ Evas_Object *bg = NULL;
+
+#if 0
+ bg = app_get_preinitialized_background();
+ if (!bg) bg = elm_bg_add(win);
+#else
+ bg = elm_bg_add(win);
+#endif
+ retv_if(!bg, NULL);
+
+ elm_bg_option_set(bg, ELM_BG_OPTION_SCALE);
+ elm_win_resize_object_add(win, bg);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(bg);
+ evas_object_data_set(win, DATA_KEY_BG, bg);
+ evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_DOWN, _bg_down_cb, NULL);
+ evas_object_event_callback_add(bg, EVAS_CALLBACK_MOUSE_UP, _bg_up_cb, NULL);
+
+ if (vconf_notify_key_changed(VCONFKEY_WMS_BG_MODE, _change_bg, win) < 0) {
+ _E("Failed to register the VCONFKEY_WMS_BG_MODE callback");
+ }
+
+ /* Changing the bg after setting DATA_KEY_BG */
+ _change_bg(NULL, win);
+
+ return bg;
+}
+
+
+
+HAPI void bg_destroy(Evas_Object *win)
+{
+ Evas_Object *bg = NULL;
+
+ if (vconf_ignore_key_changed(VCONFKEY_WMS_BG_MODE, _change_bg) < 0) {
+ _E("Failed to ignore the VCONFKEY_WMS_BG_MODE callback");
+ }
+
+ evas_object_event_callback_del(bg, EVAS_CALLBACK_MOUSE_DOWN, _bg_down_cb);
+ evas_object_event_callback_del(bg, EVAS_CALLBACK_MOUSE_UP, _bg_up_cb);
+ bg = evas_object_data_del(win, DATA_KEY_BG);
+ ret_if(!bg);
+ evas_object_del(bg);
+}
+
+
+
+HAPI void bg_register_object(Evas_Object *obj)
+{
+ Evas_Object *bg;
+
+ bg = elm_object_part_content_get(obj, "bg");
+ if (bg) {
+ evas_object_color_set(bg, 0, 0, 0, 0);
+ }
+}
+
+
+
+// End of a file
diff --git a/home/src/clock_event.c b/home/src/clock_event.c
new file mode 100755
index 0000000..932fd3e
--- /dev/null
+++ b/home/src/clock_event.c
@@ -0,0 +1,558 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <aul.h>
+#include <vconf.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#ifdef ENABLE_MODEM_INDICATOR
+#include <tapi_common.h>
+#include <ITapiModem.h>
+#include <TapiUtility.h>
+#endif
+
+#include <pkgmgr-info.h>
+#include <package-manager.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "layout.h"
+#include "dbus.h"
+#include "key.h"
+#include "clock_service.h"
+#include "power_mode.h"
+#include "edit.h"
+
+typedef struct _pkg_event {
+ char *pkgname;
+ int is_done;
+} Pkg_Event;
+
+#define PKGMGR_STR_START "start"
+#define PKGMGR_STR_END "end"
+#define PKGMGR_STR_OK "ok"
+#define PKGMGR_STR_UNINSTALL "uninstall"
+#define SAP_BT 0x01
+
+#define VCONFKEY_SAP_CONNECTION_STATUS "memory/private/sap/conn_type"
+
+static struct {
+ pkgmgr_client *pkg_client;
+ Eina_List *pkg_event_list;
+
+#ifdef ENABLE_MODEM_INDICATOR
+ TapiHandle *tapi_handle;
+#endif
+} s_info = {
+ .pkg_client = NULL,
+ .pkg_event_list = NULL,
+
+#ifdef ENABLE_MODEM_INDICATOR
+ .tapi_handle = NULL,
+#endif
+};
+
+static Evas_Object *_layout_get(void)
+{
+ Evas_Object *win = main_get_info()->win;
+ retv_if(win == NULL, NULL);
+
+ return evas_object_data_get(win, DATA_KEY_LAYOUT);
+}
+
+static void _pkg_event_item_del(Pkg_Event *item_event)
+{
+ if (item_event != NULL) {
+ free(item_event->pkgname);
+ }
+
+ free(item_event);
+}
+
+static int _is_pkg_event_item_exist(const char *pkgid, int remove_if_exist)
+{
+ int ret = 0;
+ Eina_List *l = NULL;
+ Pkg_Event *event_item = NULL;
+ retv_if(pkgid == NULL, 0);
+
+ EINA_LIST_FOREACH(s_info.pkg_event_list, l, event_item) {
+ if (event_item != NULL) {
+ if (strcmp(event_item->pkgname, pkgid) == 0) {
+ ret = 1;
+ break;
+ }
+ }
+ }
+
+ if (ret == 1 && remove_if_exist == 1) {
+ s_info.pkg_event_list = eina_list_remove(s_info.pkg_event_list, event_item);
+ _pkg_event_item_del(event_item);
+ }
+
+ return ret;
+}
+
+static int _pkgmgr_event_cb(int req_id, const char *pkg_type, const char *pkgid,
+ const char *key, const char *val, const void *pmsg, void *priv_data)
+{
+ if (pkgid == NULL) return 0;
+
+ _D("pkg:%s key:%s val:%s", pkgid, key, val);
+
+ if (key != NULL && val != NULL) {
+ if (strcasecmp(key, PKGMGR_STR_START) == 0 &&
+ strcasecmp(val, PKGMGR_STR_UNINSTALL) == 0) {
+ _W("Pkg:%s is being uninstalled", pkgid);
+
+ Pkg_Event *event = calloc(1, sizeof(Pkg_Event));
+ if (event != NULL) {
+ event->pkgname = strdup(pkgid);
+ s_info.pkg_event_list = eina_list_append(s_info.pkg_event_list, event);
+ } else {
+ _E("failed to create event item");
+ }
+
+ return 0;
+ } else if (strcasecmp(key, PKGMGR_STR_END) == 0 &&
+ strcasecmp(val, PKGMGR_STR_OK) == 0) {
+ if (_is_pkg_event_item_exist(pkgid, 1) == 1) {
+ _W("Pkg:%s is uninstalled, delete related resource", pkgid);
+
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ if (clock != NULL && clock->pkgname != NULL) {
+ _W("attacheck clock:%s", clock->pkgname);
+ if (strcmp(clock->pkgname, pkgid) == 0) {
+ _W("clock %s is uninstalled, it will be replaced to default clock");
+ clock_service_event_handler(clock, CLOCK_EVENT_APP_PROVIDER_ERROR_FATAL);
+ }
+ }
+ //badge_remove(pkgid);
+ }
+ }
+ }
+
+ return 0;
+}
+
+static void _home_editing_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ int editing_disabled = (int)data;
+
+ if (editing_disabled == 1) {
+ clock_service_request(-1);
+ }
+}
+
+static key_cb_ret_e _back_key_cb(void *data)
+{
+ _W("");
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ retv_if(clock == NULL, KEY_CB_RET_CONTINUE);
+
+ clock_view_event_handler(clock, CLOCK_EVENT_DEVICE_BACK_KEY, clock->need_event_relay);
+
+ return KEY_CB_RET_CONTINUE;
+}
+
+static void _pm_state_cb(keynode_t * node, void *data)
+{
+ int val = -1;
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ static int state_prev = VCONFKEY_PM_STATE_LCDOFF;
+ ret_if(clock == NULL);
+
+ if(vconf_get_int(VCONFKEY_PM_STATE, &val) < 0) {
+ _E("Failed to get VCONFKEY_PM_STATE");
+ return;
+ }
+
+ if (state_prev == VCONFKEY_PM_STATE_LCDOFF
+ && val == VCONFKEY_PM_STATE_NORMAL) {
+ _D("LCD: off->on");
+ clock_view_event_handler(clock, CLOCK_EVENT_DEVICE_LCD_ON, clock->need_event_relay);
+ } else if (val == VCONFKEY_PM_STATE_LCDOFF) {
+ _D("LCD: on->off");
+ clock_view_event_handler(clock, CLOCK_EVENT_DEVICE_LCD_OFF, clock->need_event_relay);
+ }
+
+ state_prev = val;
+}
+
+static int _pm_state_get(void)
+{
+ int val = -1;
+
+ if(vconf_get_int(VCONFKEY_PM_STATE, &val) < 0) {
+ _E("Failed to get VCONFKEY_PM_STATE");
+ return CLOCK_EVENT_DEVICE_LCD_OFF;
+ }
+
+ if (val == VCONFKEY_PM_STATE_NORMAL || val == VCONFKEY_PM_STATE_LCDDIM) {
+ return CLOCK_EVENT_DEVICE_LCD_ON;
+ } else {
+ return CLOCK_EVENT_DEVICE_LCD_OFF;
+ }
+}
+
+static int _blockingmode_get(void)
+{
+ int b_mode = 0;
+
+ if(vconf_get_bool(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, &b_mode) < 0) {
+ _E("Failed to get VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL:%s", VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL);
+ }
+
+ _D("b_mode : %d", b_mode);
+
+ if(b_mode) {
+ return CLOCK_EVENT_DND_ON;
+ } else {
+ return CLOCK_EVENT_DND_OFF;
+ }
+}
+
+static void _blockingmode_cb(keynode_t * node, void *data)
+{
+ int event = CLOCK_EVENT_SCREEN_READER_OFF;
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(clock == NULL);
+
+ event = _blockingmode_get();
+ clock_view_event_handler(clock, event, clock->need_event_relay);
+}
+
+static int _screen_reader_get(void)
+{
+ if (clock_util_screen_reader_enabled_get() == 1) {
+ return CLOCK_EVENT_SCREEN_READER_ON;
+ } else {
+ return CLOCK_EVENT_SCREEN_READER_OFF;
+ }
+}
+
+static void _screen_reader_cb(keynode_t * node, void *data)
+{
+ int event = CLOCK_EVENT_SCREEN_READER_OFF;
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(clock == NULL);
+
+ event = _screen_reader_get();
+ clock_view_event_handler(clock, event, clock->need_event_relay);
+}
+
+static int _app_status_get(void)
+{
+ main_s *main_info = main_get_info();
+ retv_if(main_info == NULL, CLOCK_EVENT_APP_PAUSE);
+
+ if(main_info->state == APP_STATE_RESUME) {
+ return CLOCK_EVENT_APP_RESUME;
+ } else if (main_info->state == APP_STATE_PAUSE) {
+ return CLOCK_EVENT_APP_PAUSE;
+ }
+
+ return CLOCK_EVENT_APP_PAUSE;
+}
+
+#ifdef ENABLE_MODEM_INDICATOR
+static int _bt_state_get(void)
+{
+ int val = -1;
+
+ if(vconf_get_int(VCONFKEY_SAP_CONNECTION_STATUS, &val) < 0) {
+ _E("Failed to get VCONFKEY_SAP_CONNECTION_STATUS");
+ return CLOCK_EVENT_DEVICE_LCD_OFF;
+ }
+
+ if ((val & SAP_BT) == SAP_BT) {
+ return CLOCK_EVENT_SAP_ON;
+ } else {
+ return CLOCK_EVENT_SAP_OFF;
+ }
+}
+
+static void _bt_state_cb(keynode_t * node, void *data)
+{
+ int event = CLOCK_EVENT_SAP_OFF;
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(clock == NULL);
+
+ event = _bt_state_get();
+ clock_view_event_handler(clock, event, clock->need_event_relay);
+}
+
+static int _modem_state_get(void)
+{
+ int ret = 0;
+ int current = 0;
+ retv_if(s_info.tapi_handle == NULL, CLOCK_EVENT_MODEM_OFF);
+
+ if ((ret = tel_get_property_int(s_info.tapi_handle, TAPI_PROP_MODEM_POWER, &current)) != TAPI_API_SUCCESS) {
+ _E("Failed to get modem power property:%d", ret);
+ }
+
+ /*
+ * (0=on,1=off,2=err)
+ */
+ _D("current:%d", current);
+
+ if (current == 0) {
+ return CLOCK_EVENT_MODEM_ON;
+ } else {
+ return CLOCK_EVENT_MODEM_OFF;
+ }
+}
+
+static void _on_noti_modem_power(TapiHandle *handle, const char *noti_id, void *data, void *user_data)
+{
+ int *status = data;
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(clock == NULL);
+
+ _W("status:%x of event:%s receive", TAPI_NOTI_MODEM_POWER);
+
+ if (status == 0) {
+ clock_view_event_handler(clock, CLOCK_EVENT_MODEM_ON, clock->need_event_relay);
+ } else {
+ clock_view_event_handler(clock, CLOCK_EVENT_MODEM_OFF, clock->need_event_relay);
+ }
+}
+#endif
+
+static int _event_app_dead_cb(int pid)
+{
+ clock_h clock = NULL;
+
+ clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ if (clock != NULL) {
+ if (clock->pid == pid) {
+ _E("clock %s is closed unexpectedly", clock->pkgname);
+ clock_service_event_handler(clock, CLOCK_EVENT_APP_PROVIDER_ERROR);
+ }
+ }
+
+ return 0;
+}
+
+static w_home_error_e _event_app_language_changed_cb(void *data)
+{
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ retv_if(clock == NULL, W_HOME_ERROR_FAIL);
+
+ clock_view_event_handler(clock, CLOCK_EVENT_APP_LANGUAGE_CHANGED, clock->need_event_relay);
+
+ return W_HOME_ERROR_NONE;
+}
+
+static int _power_mode_state_get(void)
+{
+ if (emergency_mode_enabled_get() == 1) {
+ return CLOCK_EVENT_POWER_ENHANCED_MODE_ON;
+ } else {
+ return CLOCK_EVENT_POWER_ENHANCED_MODE_OFF;
+ }
+}
+
+static void _enhanced_power_mode_on_cb(void *user_data, void *event_info)
+{
+ _D("");
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(clock == NULL);
+
+ clock_view_event_handler(clock, CLOCK_EVENT_POWER_ENHANCED_MODE_ON, clock->need_event_relay);
+}
+
+static void _enhanced_power_mode_off_cb(void *user_data, void *event_info)
+{
+ _D("");
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(clock == NULL);
+
+ clock_view_event_handler(clock, CLOCK_EVENT_POWER_ENHANCED_MODE_OFF, clock->need_event_relay);
+}
+
+static int _simcard_state_get(void) {
+ int ret = 0;
+ int sim_status = VCONFKEY_TELEPHONY_SIM_UNKNOWN;
+
+ ret = vconf_get_int(VCONFKEY_TELEPHONY_SIM_SLOT, &sim_status);
+ if (ret == 0 && sim_status == VCONFKEY_TELEPHONY_SIM_INSERTED) {
+ return CLOCK_EVENT_SIM_INSERTED;
+ } else {
+ _E("Failed to get simcard status");
+ }
+
+ return CLOCK_EVENT_SIM_NOT_INSERTED;
+}
+
+static void _simcard_state_cb(keynode_t * node, void *data)
+{
+ int event = CLOCK_EVENT_SIM_INSERTED;
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(clock == NULL);
+
+ event = _simcard_state_get();
+
+ clock_view_event_handler(clock, event, clock->need_event_relay);
+}
+
+HAPI void clock_service_event_app_dead_cb(int pid)
+{
+ _event_app_dead_cb(pid);
+ clock_shortcut_app_dead_cb(pid);
+}
+
+HAPI void clock_service_event_register(void)
+{
+ int ret = 0;
+ Evas_Object *layout = _layout_get();
+ if (layout != NULL) {
+ evas_object_smart_callback_add(layout, LAYOUT_SMART_SIGNAL_EDIT_OFF,
+ _home_editing_cb, (void *)1);
+ }
+
+ main_register_cb(APP_STATE_LANGUAGE_CHANGED, _event_app_language_changed_cb, NULL);
+
+ key_register_cb(KEY_TYPE_BACK, _back_key_cb, NULL);
+
+ power_mode_register_cb(POWER_MODE_ENHANCED_ON, _enhanced_power_mode_on_cb, NULL);
+ power_mode_register_cb(POWER_MODE_ENHANCED_OFF, _enhanced_power_mode_off_cb, NULL);
+
+ if(vconf_notify_key_changed(VCONFKEY_PM_STATE, _pm_state_cb, NULL) < 0) {
+ _E("Failed to register the pm status callback");
+ }
+ if(vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, _screen_reader_cb, NULL) < 0) {
+ _E("Failed to register the screen reader status callback");
+ }
+#ifdef ENABLE_MODEM_INDICATOR
+ if(vconf_notify_key_changed(VCONFKEY_SAP_CONNECTION_STATUS, _bt_state_cb, NULL) < 0) {
+ _E("Failed to register sap status callback");
+ }
+ TapiHandle *handle = tel_init(NULL);
+ if (handle != NULL) {
+ ret = tel_register_noti_event(handle, TAPI_NOTI_MODEM_POWER, _on_noti_modem_power, NULL);
+ if (ret != TAPI_API_SUCCESS) {
+ _E("event register failed(%d)", ret);
+ }
+ s_info.tapi_handle = handle;
+ } else {
+ _E("Failed to create tapi handle");
+ }
+#endif
+ if (vconf_notify_key_changed(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL,
+ _blockingmode_cb, NULL) < 0) {
+ _E("Failed to get notification from VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL");
+ }
+
+ pkgmgr_client *client = pkgmgr_client_new(PC_LISTENING);
+ if (client != NULL) {
+ if ((ret = pkgmgr_client_listen_status(client, _pkgmgr_event_cb, NULL)) != PKGMGR_R_OK) {
+ _E("Failed to listen pkgmgr event:%d", ret);
+ }
+ s_info.pkg_client = client;
+ } else {
+ _E("Failed to create package manager client");
+ }
+ if(vconf_notify_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT, _simcard_state_cb, NULL) < 0) {
+ _E("Failed to register simcard status callback");
+ }
+}
+
+HAPI void clock_service_event_deregister(void)
+{
+ Evas_Object *layout = _layout_get();
+ if (layout != NULL) {
+ evas_object_smart_callback_del(layout, LAYOUT_SMART_SIGNAL_EDIT_OFF,
+ _home_editing_cb);
+ }
+
+ main_unregister_cb(APP_STATE_LANGUAGE_CHANGED, _event_app_language_changed_cb);
+
+ key_unregister_cb(KEY_TYPE_BACK, _back_key_cb);
+
+ power_mode_unregister_cb(POWER_MODE_ENHANCED_ON, _enhanced_power_mode_on_cb);
+ power_mode_unregister_cb(POWER_MODE_ENHANCED_OFF, _enhanced_power_mode_off_cb);
+
+ if(vconf_ignore_key_changed(VCONFKEY_PM_STATE, _pm_state_cb) < 0) {
+ _E("Failed to ignore the pm status callback");
+ }
+ if(vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, _screen_reader_cb) < 0) {
+ _E("Failed to ignore the screen reader callback");
+ }
+#ifdef ENABLE_MODEM_INDICATOR
+ if(vconf_ignore_key_changed(VCONFKEY_SAP_CONNECTION_STATUS, _bt_state_cb) < 0) {
+ _E("Failed to ignore the sap status callback");
+ }
+ if (s_info.tapi_handle != NULL) {
+ tel_deinit(s_info.tapi_handle);
+ s_info.tapi_handle = NULL;
+ }
+#endif
+ if (vconf_ignore_key_changed(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL,
+ _blockingmode_cb) < 0) {
+ _E("Failed to ignore the VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL callback");
+ }
+ if(vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT, _simcard_state_cb) < 0) {
+ _E("Failed to ignore the simcard status callback");
+ }
+
+ int ret = 0;
+ Pkg_Event *event_item = NULL;
+ if (s_info.pkg_client != NULL) {
+ if ((ret = pkgmgr_client_free(s_info.pkg_client)) != PKGMGR_R_OK) {
+ _E("Failed to free pkgmgr client:%d", ret);
+ }
+ s_info.pkg_client = NULL;
+ }
+ EINA_LIST_FREE(s_info.pkg_event_list, event_item) {
+ _pkg_event_item_del(event_item);
+ }
+ s_info.pkg_event_list = NULL;
+}
+
+HAPI int clock_service_event_state_get(int event_source)
+{
+ switch (event_source) {
+ case CLOCK_EVENT_SCREEN_READER:
+ return _screen_reader_get();
+ case CLOCK_EVENT_APP:
+ return _app_status_get();
+ case CLOCK_EVENT_DEVICE_LCD:
+ return _pm_state_get();
+#ifdef ENABLE_MODEM_INDICATOR
+ case CLOCK_EVENT_MODEM:
+ return _modem_state_get();
+ case CLOCK_EVENT_SAP:
+ return _bt_state_get();
+#endif
+ case CLOCK_EVENT_DND:
+ return _blockingmode_get();
+ case CLOCK_EVENT_POWER:
+ return _power_mode_state_get();
+ case CLOCK_EVENT_SIM:
+ return _simcard_state_get();
+ }
+
+ return event_source;
+}
diff --git a/home/src/clock_inf_dbox.c b/home/src/clock_inf_dbox.c
new file mode 100755
index 0000000..edc1e64
--- /dev/null
+++ b/home/src/clock_inf_dbox.c
@@ -0,0 +1,654 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <vconf.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <dlog.h>
+#include <dynamicbox_service.h>
+#include <dynamicbox_errno.h>
+#include <dynamicbox.h>
+#include <aul.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "page.h"
+#include "key.h"
+#include "dbus.h"
+#include "dynamicbox_evas.h"
+#include "dbox.h"
+#include "clock_service.h"
+
+#define DEFAULT_INIT_REFRESH 5
+#define DEFAULT_INIT_TIMER 2.5f
+#define TAG_FORCE "c.f" // Clock Force
+#define TAG_REFRESH "c.r" // Clock Refresh
+#define TAG_RETRY "c.t" // Clock reTry
+
+static struct info {
+ int initialized; /* Initialize the event callback */
+ Eina_List *pkg_list; /* Deleted package list */
+ Eina_List *create_list;
+ Eina_List *freeze_list;
+ Evas_Object *first_clock;
+} s_info = {
+ .initialized = 0,
+ .pkg_list = NULL,
+ .create_list = NULL,
+ .freeze_list = NULL,
+ .first_clock = NULL,
+};
+
+static Evas_Object *_scroller_get(void)
+{
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ if (layout != NULL) {
+ scroller = elm_object_part_content_get(layout, "scroller");
+ }
+ }
+
+ return scroller;
+}
+
+static void pumping_clock(Evas_Object *obj)
+{
+ clock_h clock;
+
+ clock = clock_manager_clock_get(CLOCK_CANDIDATE);
+ if (clock && clock->interface == CLOCK_INF_DBOX && clock->state == CLOCK_STATE_WAITING) {
+ clock_service_event_handler(clock, CLOCK_EVENT_VIEW_READY);
+ } else {
+ /**
+ * Clock is created, but it is not my favor,
+ * Destroy it
+ */
+ s_info.create_list = eina_list_remove(s_info.create_list, obj);
+ evas_object_del(obj);
+ }
+}
+
+static Eina_Bool force_updated_cb(void *data)
+{
+ Evas_Object *obj = data;
+
+ evas_object_data_del(obj, TAG_REFRESH);
+ evas_object_data_del(obj, TAG_FORCE);
+
+ dbox_set_update_callback(obj, NULL);
+
+ pumping_clock(obj);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static int updated_cb(Evas_Object *obj)
+{
+ int refresh;
+
+ refresh = (int)evas_object_data_get(obj, TAG_REFRESH);
+ refresh--;
+
+ if (refresh <= 0) {
+ Ecore_Timer *force_timer;
+
+ evas_object_data_del(obj, TAG_REFRESH);
+ force_timer = evas_object_data_del(obj, TAG_FORCE);
+ if (force_timer) {
+ ecore_timer_del(force_timer);
+ }
+
+ pumping_clock(obj);
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ evas_object_data_set(obj, TAG_REFRESH, (void *)refresh);
+ return ECORE_CALLBACK_RENEW;
+}
+
+static int scroll_cb(Evas_Object *obj, int hold)
+{
+ _W("Scroll control: %s", hold ? "hold" : "release");
+
+ if (hold) {
+ clock_service_event_handler(NULL, CLOCK_EVENT_SCROLLER_FREEZE_ON);
+ } else {
+ clock_service_event_handler(NULL, CLOCK_EVENT_SCROLLER_FREEZE_OFF);
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void user_create_cb(struct dynamicbox_evas_raw_event_info *info, void *data)
+{
+ Eina_List *l;
+ Eina_List *n;
+ Evas_Object *obj;
+ const char *dbox_id;
+
+ EINA_LIST_FOREACH_SAFE(s_info.create_list, l, n, obj) {
+ dbox_id = evas_object_dynamicbox_dbox_id(obj);
+ if (!dbox_id) {
+ /* This is not possible */
+ continue;
+ }
+
+ if (strcmp(dbox_id, info->pkgname)) {
+ continue;
+ }
+
+ if (info->error != DBOX_STATUS_ERROR_NONE) {
+ /* Failed to create a new clock */
+ /* TODO: Feeds fault event to clock service */
+ _E("Failed to create a new clock: %s (%x)", info->pkgname, info->error);
+ s_info.create_list = eina_list_remove(s_info.create_list, obj);
+ evas_object_del(obj);
+ } else {
+ evas_object_dynamicbox_resume(obj);
+ }
+
+ break;
+ }
+}
+
+static char *remove_from_pkglist(const char *pkgname)
+{
+ char *item;
+ Eina_List *l;
+ Eina_List *n;
+
+ if (!pkgname) {
+ return NULL;
+ }
+
+ item = NULL;
+ EINA_LIST_FOREACH_SAFE(s_info.pkg_list, l, n, item) {
+ if (item && !strcmp(item, pkgname)) {
+ s_info.pkg_list = eina_list_remove(s_info.pkg_list, item);
+ _D("Manually cleared from package list (%s)", item);
+ break;
+ }
+ item = NULL;
+ }
+
+ return item;
+}
+
+static void user_del_cb(struct dynamicbox_evas_raw_event_info *info, void *data)
+{
+ clock_h clock;
+ char *pkgname;
+
+ clock = clock_manager_clock_get(CLOCK_CANDIDATE);
+
+ if (info->error == DBOX_STATUS_ERROR_FAULT && !clock) {
+ const char *dbox_id = NULL;
+
+ if (info->dynamicbox) {
+ dbox_id = evas_object_dynamicbox_dbox_id(info->dynamicbox);
+ }
+ _D("Faulted: %s, Current: %s", info->pkgname, dbox_id);
+
+ clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ if (clock) {
+ if (clock->view_id && dbox_id && !strcmp(dbox_id, clock->view_id)) {
+ int retry;
+
+ retry = (int)evas_object_data_get(info->dynamicbox, TAG_RETRY);
+ retry--;
+ if (retry <= 0) {
+ // No more recovery count remained
+ clock_service_event_handler(clock, CLOCK_EVENT_APP_PROVIDER_ERROR_FATAL);
+ } else {
+ evas_object_dynamicbox_activate(info->dynamicbox);
+ evas_object_data_set(info->dynamicbox, TAG_RETRY, (void *)retry);
+ _D("There is no waiting clock. Try to recover from fault (%d)", retry);
+ }
+ return;
+ }
+
+ pkgname = remove_from_pkglist(info->pkgname);
+ if (!pkgname) {
+ _D("Unknown Box");
+ } else {
+ free(pkgname);
+ }
+ } else {
+ _E("There is no attached clock");
+ }
+
+ return;
+ }
+
+ _D("%s is deleted", info->pkgname);
+ pkgname = remove_from_pkglist(info->pkgname);
+ if (!pkgname) {
+ return;
+ }
+
+ if (clock && clock->interface == CLOCK_INF_DBOX && clock->state == CLOCK_STATE_WAITING) {
+ if (clock->view_id && !strcmp(pkgname, clock->view_id)) {
+ clock_service_event_handler(clock, CLOCK_EVENT_VIEW_READY);
+ }
+ }
+
+ free(pkgname);
+}
+
+static void del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ _D("Remove from freeze list");
+ s_info.freeze_list = eina_list_remove(s_info.freeze_list, obj);
+}
+
+static w_home_error_e home_resumed_cb(void *data)
+{
+ Evas_Object *obj;
+
+ _D("Thaw all freezed objects");
+ EINA_LIST_FREE(s_info.freeze_list, obj) {
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, del_cb);
+ evas_object_dynamicbox_thaw_visibility(obj);
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+static int _prepare(clock_h clock)
+{
+ char *dbox_id = dynamicbox_service_dbox_id(clock->pkgname);
+ Eina_List *l;
+ char *pkgname;
+ int ret = CLOCK_RET_OK;
+
+ retv_if(dbox_id == NULL, CLOCK_RET_FAIL);
+
+ clock->view_id = dbox_id;
+
+ if (!s_info.initialized) {
+ /* When could we delete these callbacks? */
+ if (main_register_cb(APP_STATE_RESUME, home_resumed_cb, NULL) != W_HOME_ERROR_NONE) {
+ _E("Unable to register app state change callback");
+ }
+ evas_object_dynamicbox_set_raw_event_callback(DYNAMICBOX_EVAS_RAW_DELETE, user_del_cb, NULL);
+ evas_object_dynamicbox_set_raw_event_callback(DYNAMICBOX_EVAS_RAW_CREATE, user_create_cb, NULL);
+ s_info.initialized = 1;
+ }
+
+ /**
+ * If the previous one is already installed,
+ * Wait for destroying previous one first.
+ */
+ EINA_LIST_FOREACH(s_info.pkg_list, l, pkgname) {
+ if (!strcmp(pkgname, clock->view_id)) {
+ ret = CLOCK_RET_ASYNC;
+ clock_h clock_attached = clock_manager_clock_get(CLOCK_ATTACHED);
+ if (clock_attached) {
+ if (clock_attached->interface == CLOCK_INF_DBOX) {
+ _D("Need detroying previous one");
+ ret |= CLOCK_RET_NEED_DESTROY_PREVIOUS;
+ }
+ }
+ _D("Async loading enabled");
+ break;
+ }
+ }
+
+ if (ret == CLOCK_RET_OK) {
+ bundle *b;
+ clock_h clock_attached;
+ int pid = -1;
+
+ /**
+ * Launch a clock process first to save the preparation time for 3D clock
+ */
+ b = bundle_create();
+ if (b) {
+ bundle_add(b, "__APP_SVC_OP_TYPE__", APP_CONTROL_OPERATION_MAIN);
+ clock_util_setting_conf_bundle_add(b, clock->configure);
+
+ /**
+ * Add more bundles to prepare setup screen of style clock
+ */
+ home_dbus_cpu_booster_signal_send();
+ pid = aul_launch_app(clock->view_id, b);
+ if (pid < 0) {
+ _E("Failed to do pre-launch for clock %s", clock->view_id);
+ /**
+ * Even if we failed to launch a clock,
+ * The master will launch it for us.
+ * So from here, we don't need to care regarding this failure
+ */
+ } else {
+ _D("Clock pre-launched: %s", clock->view_id);
+ }
+
+ bundle_free(b);
+ }
+
+ clock_attached = clock_manager_clock_get(CLOCK_ATTACHED);
+ if (clock_attached /* && clock_attached->interface == CLOCK_INF_DBOX */) {
+ Evas_Object *scroller;
+ /**
+ * Try to create a new box first.
+ * If it is created, then replace it with the old clock.
+ * If we fails to create a new clock from here,
+ * Take normal path.
+ *
+ * @TODO
+ * Do I have to care the previously create clock here? is it possible?
+ */
+ scroller = _scroller_get();
+ if (scroller) {
+ Evas_Object *obj = NULL;
+
+ if (s_info.first_clock) {
+ const char *first_dbox_id;
+ first_dbox_id = evas_object_dynamicbox_dbox_id(s_info.first_clock);
+ if (!first_dbox_id || strcmp(clock->view_id, first_dbox_id)) {
+ _D("LBID is not matched: %s", first_dbox_id);
+ evas_object_del(s_info.first_clock);
+ } else {
+ _D("Use the first clock");
+ obj = s_info.first_clock;
+ }
+ s_info.first_clock = NULL;
+ }
+ if (!obj) {
+ const char *content;
+ content = clock_util_setting_conf_content(clock->configure);
+ obj = dbox_create(scroller, clock->view_id, content, DYNAMICBOX_EVAS_DEFAULT_PERIOD);
+ if (obj) {
+ Ecore_Timer *force_refresh_timer;
+
+ if (content) {
+ evas_object_dynamicbox_freeze_visibility(obj, DBOX_SHOW);
+ }
+ evas_object_data_set(obj, TAG_REFRESH, (void *)DEFAULT_INIT_REFRESH);
+ evas_object_data_set(obj, TAG_RETRY, (void *)clock_service_get_retry_count());
+
+ dbox_set_update_callback(obj, updated_cb);
+ dbox_set_scroll_callback(obj, scroll_cb);
+
+ force_refresh_timer = ecore_timer_add(DEFAULT_INIT_TIMER, force_updated_cb, obj);
+ if (!force_refresh_timer) {
+ _E("Failed to create refresh timer\n");
+ }
+ evas_object_data_set(obj, TAG_FORCE, force_refresh_timer);
+ evas_object_dynamicbox_disable_preview(obj);
+ evas_object_dynamicbox_disable_loading(obj);
+ evas_object_resize(obj, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_size_hint_min_set(obj, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_show(obj);
+ }
+ }
+ if (obj) {
+ /* Move this to out of screen */
+ evas_object_move(obj, main_get_info()->root_w, main_get_info()->root_h);
+
+ s_info.create_list = eina_list_append(s_info.create_list, obj);
+ ret = CLOCK_RET_ASYNC;
+ } else {
+ /* Failed to create a clock */
+ if (pid > 0) {
+ _E("Terminate: %d", pid);
+ aul_terminate_pid(pid);
+ }
+ }
+ } else {
+ if (pid > 0) {
+ _E("Terminate: %d", pid);
+ aul_terminate_pid(pid);
+ }
+ }
+ }
+ }
+
+ _D("Prepared: %s", clock->view_id);
+ return ret;
+}
+
+static int _config(clock_h clock, int configure)
+{
+ int pid = 0;
+ int ret;
+
+ ret = dynamicbox_service_trigger_update(clock->view_id, NULL, NULL, NULL, clock_util_setting_conf_content(configure), 1);
+ if (ret == DBOX_STATUS_ERROR_NONE) {
+ _D("Trigger update with content string");
+ }
+
+ clock_util_provider_launch(clock->view_id, &pid, configure);
+ if (pid >= 0) {
+ _E("configured, %d", pid);
+ return CLOCK_RET_OK;
+ }
+
+ return CLOCK_RET_FAIL;
+}
+
+static int _create(clock_h clock)
+{
+ int ret = CLOCK_RET_FAIL;
+ Evas_Object *obj = NULL;
+ Evas_Object *scroller;
+ const char *dbox_id;
+ Eina_List *l;
+ Eina_List *n;
+
+ scroller = _scroller_get();
+ if (!scroller) {
+ _E("Failed to get current scroller");
+ return CLOCK_RET_FAIL;
+ }
+
+ obj = NULL;
+ EINA_LIST_FOREACH_SAFE(s_info.create_list, l, n, obj) {
+ dbox_id = evas_object_dynamicbox_dbox_id(obj);
+ if (dbox_id) {
+ if (!strcmp(dbox_id, clock->view_id)) {
+ _D("Prepared clock found (%s)", dbox_id);
+ s_info.create_list = eina_list_remove(s_info.create_list, obj);
+ break;
+ }
+ }
+
+ obj = NULL;
+ }
+
+ /**
+ * In this case, try to a new clock from here again.
+ * There is something problem, but we have to care this too.
+ */
+ if (!obj) {
+ _D("Prepare stage is skipped");
+ if (s_info.first_clock) {
+ const char *first_dbox_id;
+ first_dbox_id = evas_object_dynamicbox_dbox_id(s_info.first_clock);
+ if (!first_dbox_id || strcmp(clock->view_id, first_dbox_id)) {
+ _D("LBID is not matched: %s", first_dbox_id);
+ evas_object_del(s_info.first_clock);
+ } else {
+ _D("Use the first clock");
+ obj = s_info.first_clock;
+ }
+ s_info.first_clock = NULL;
+ }
+
+ if (!obj) {
+ const char *content;
+ content = clock_util_setting_conf_content(clock->configure);
+ obj = dbox_create(scroller, clock->view_id, content, DYNAMICBOX_EVAS_DEFAULT_PERIOD);
+ if (obj) {
+ if (content) {
+ evas_object_dynamicbox_freeze_visibility(obj, DBOX_SHOW);
+ }
+ evas_object_data_set(obj, TAG_RETRY, (void *)clock_service_get_retry_count());
+ dbox_set_scroll_callback(obj, scroll_cb);
+ evas_object_dynamicbox_disable_preview(obj);
+ evas_object_dynamicbox_disable_loading(obj);
+ evas_object_resize(obj, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_size_hint_min_set(obj, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_show(obj);
+ }
+ }
+
+ if (obj) {
+ evas_object_move(obj, 0, 0);
+ }
+ }
+
+ if (obj != NULL) {
+ Evas_Object *page;
+
+ _D("Create clock: %s", clock->view_id);
+ page = clock_view_add(scroller, obj);
+ if (page != NULL) {
+ char *pkgname;
+
+ clock->view = (void *)page;
+ ret = CLOCK_RET_OK;
+
+ pkgname = strdup(clock->view_id);
+ if (pkgname) {
+ s_info.pkg_list = eina_list_append(s_info.pkg_list, pkgname);
+ } else {
+ _E("strdup: %s\n", strerror(errno));
+ }
+
+ if (evas_object_dynamicbox_visibility_is_freezed(obj)) {
+ if (main_get_info()->state == APP_STATE_RESUME) {
+ _D("Thaw freezed object: %s", pkgname);
+ evas_object_dynamicbox_thaw_visibility(obj);
+ } else {
+ _D("Push freezed object: %s", pkgname);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, del_cb, NULL);
+ s_info.freeze_list = eina_list_append(s_info.freeze_list, obj);
+ }
+ }
+ } else {
+ evas_object_del(obj);
+ }
+ } else {
+ _E("Failed to add clock - %s", clock->view_id);
+ }
+
+ return ret;
+}
+
+static int _destroy(clock_h clock)
+{
+ Evas_Object *page;
+ Evas_Object *item;
+
+ page = clock->view;
+ if (!page) {
+ _E("Clock doesn't have a view");
+ return CLOCK_RET_FAIL;
+ }
+
+ _D("Delete clock: %s", clock->view_id);
+ item = clock_view_get_item(page);
+ if (item) {
+ if (evas_object_dynamicbox_is_faulted(item)) {
+ char *pkgname;
+
+ _D("Faulted box: Clean up pkg_list manually");
+ pkgname = remove_from_pkglist(clock->view_id);
+ if (pkgname) {
+ _D("Faulted box(%s) is removed", pkgname);
+ free(pkgname);
+ }
+ }
+ } else {
+ _D("Item is not exists");
+ }
+
+ page_destroy(page);
+
+ return CLOCK_RET_OK;
+}
+
+clock_inf_s clock_inf_dbox = {
+ .async = 0,
+ .use_dead_monitor = 0,
+ .prepare = _prepare,
+ .config = _config,
+ .create = _create,
+ .destroy = _destroy,
+};
+
+int clock_inf_prepare_first_clock(const char *pkgname)
+{
+ char *dbox_id;
+ Evas_Object *scroller;
+
+ if (!pkgname) {
+ _D("pkgname is NULL");
+ return CLOCK_RET_OK;
+ }
+
+ if (s_info.first_clock) {
+ // Already created
+ _D("Already created");
+ return CLOCK_RET_OK;
+ }
+
+ scroller = _scroller_get();
+ if (!scroller) {
+ _D("Scroller is NIL");
+ return CLOCK_RET_FAIL;
+ }
+
+ dbox_id = dynamicbox_service_dbox_id(pkgname);
+ if (!dbox_id) {
+ _D("Dynamicbox Package id is not valid: %s", pkgname);
+ return CLOCK_RET_OK;
+ }
+
+ s_info.first_clock = dbox_create(scroller, dbox_id, NULL, DYNAMICBOX_EVAS_DEFAULT_PERIOD);
+ free(dbox_id);
+ if (!s_info.first_clock) {
+ _E("Failed to create a dbox (%s)", dbox_id);
+ return CLOCK_RET_FAIL;
+ }
+
+ //evas_object_dynamicbox_disable_preview(s_info.first_clock);
+ dbox_set_scroll_callback(s_info.first_clock, scroll_cb);
+ evas_object_data_set(s_info.first_clock, TAG_RETRY, (void *)clock_service_get_retry_count());
+ evas_object_dynamicbox_disable_overlay_text(s_info.first_clock);
+ evas_object_move(s_info.first_clock, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_resize(s_info.first_clock, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_size_hint_min_set(s_info.first_clock, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_show(s_info.first_clock);
+ _D("First clock is prepared");
+ return CLOCK_RET_OK;
+}
+
+/* End of a file */
diff --git a/home/src/clock_inf_minictrl.c b/home/src/clock_inf_minictrl.c
new file mode 100755
index 0000000..714f00a
--- /dev/null
+++ b/home/src/clock_inf_minictrl.c
@@ -0,0 +1,380 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <vconf.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "page.h"
+#include "key.h"
+#include "minictrl.h"
+#include "dbus.h"
+#include "clock_service.h"
+
+static struct info {
+ Ecore_Timer *waiting_timer;
+} s_info = {
+ .waiting_timer = NULL,
+};
+
+#define MINICTRL_PRIVATE_KEY_STATE "mc_pr_k_s"
+#define MINICTRL_STATE_PAUSE 0xDEAD0040
+#define MINICTRL_STATE_RESUME 0xCAFE0080
+
+static Evas_Object *_scroller_get(void)
+{
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ if (layout != NULL) {
+ scroller = elm_object_part_content_get(layout, "scroller");
+ }
+ }
+
+ return scroller;
+}
+
+static void _size_set(Evas_Object *minictrl_obj, int width, int height)
+{
+ evas_object_resize(minictrl_obj, width, height);
+ evas_object_size_hint_min_set(minictrl_obj, width, height);
+ evas_object_size_hint_max_set(minictrl_obj, width, height);
+}
+
+static void _pause_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *minictrl = data;
+ ret_if(minictrl == NULL);
+
+ int state = (int)evas_object_data_get(minictrl, MINICTRL_PRIVATE_KEY_STATE);
+ if (state == MINICTRL_STATE_PAUSE) {
+ return ;
+ }
+
+ if (minicontrol_message_send(minictrl, MINICTRL_EVENT_APP_PAUSE) == 1) {
+ _D("minictrl %p is paused", minictrl);
+ evas_object_data_set(minictrl, MINICTRL_PRIVATE_KEY_STATE, (void*)MINICTRL_STATE_PAUSE);
+ } else {
+ _E("failed to pause %p", minictrl);
+ }
+}
+
+static void _resume_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *minictrl = data;
+ ret_if(minictrl == NULL);
+
+ int state = (int)evas_object_data_get(minictrl, MINICTRL_PRIVATE_KEY_STATE);
+ if (state == MINICTRL_STATE_RESUME) {
+ return ;
+ }
+
+ if (minicontrol_message_send(minictrl, MINICTRL_EVENT_APP_RESUME) == 1) {
+ _D("minictrl %p is resumed", minictrl);
+ evas_object_data_set(minictrl, MINICTRL_PRIVATE_KEY_STATE, (void*)MINICTRL_STATE_RESUME);
+ } else {
+ _E("failed to resume %p", minictrl);
+ }
+}
+
+static int _prepare(clock_h clock)
+{
+ int pid = 0;
+
+ clock_util_provider_launch(clock->pkgname, &pid, clock->configure);
+ _W("pid:%d", pid);
+
+ if (pid >= 0) {
+ clock->pid = pid;
+ return CLOCK_RET_OK;
+ }
+
+ return CLOCK_RET_FAIL;
+}
+
+static int _config(clock_h clock, int configure)
+{
+ int pid = 0;
+
+ clock_util_provider_launch(clock->pkgname, &pid, configure);
+ if (pid >= 0) {
+ if (clock->pid != pid) {
+ _E("pid is changed, %d %d", clock->pid, pid);
+ }
+ clock->pid = pid;
+ return CLOCK_RET_OK;
+ }
+
+ return CLOCK_RET_FAIL;
+}
+
+static int _create(clock_h clock)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *obj = NULL;
+ Evas_Object *scroller = _scroller_get();
+
+ if (clock->view) {
+ Evas_Object *mini_obj = clock_view_get_item(clock->view);
+ if (mini_obj) {
+ _size_set(mini_obj, clock->w, clock->h);
+ evas_object_show(mini_obj);
+ }
+ return CLOCK_RET_OK;
+ }
+
+ obj = minicontrol_viewer_add(scroller, clock->view_id);
+ if (obj != NULL) {
+ _size_set(obj, clock->w, clock->h);
+ evas_object_show(obj);
+
+ page = clock_view_add(scroller, obj);
+ if (page != NULL) {
+ clock->view = (void *)page;
+
+ evas_object_smart_callback_add(page, CLOCK_SMART_SIGNAL_PAUSE, _pause_cb, obj);
+ evas_object_smart_callback_add(page, CLOCK_SMART_SIGNAL_RESUME, _resume_cb, obj);
+
+ return CLOCK_RET_OK;
+ }
+ } else {
+ _E("Failed to add viewer - %s", clock->view_id);
+ }
+
+ return CLOCK_RET_FAIL;
+}
+
+static int _attached_cb(clock_h clock)
+{
+ Evas_Object *page = clock->view;
+
+ int visibility = 1;
+ if (clock_service_event_state_get(CLOCK_EVENT_DEVICE_LCD) == CLOCK_EVENT_DEVICE_LCD_OFF) {
+ visibility = 0;
+ }
+ if (clock_service_event_state_get(CLOCK_EVENT_APP) == CLOCK_EVENT_APP_PAUSE) {
+ visibility = 0;
+ }
+
+ if (visibility == 1) {
+ evas_object_smart_callback_call(page, CLOCK_SMART_SIGNAL_RESUME, page_get_item(page));
+ } else {
+ if (clock->configure != CLOCK_CONF_CLOCK_CONFIGURATION) {
+ evas_object_smart_callback_call(page, CLOCK_SMART_SIGNAL_PAUSE, page_get_item(page));
+ }
+ }
+
+ return CLOCK_RET_OK;
+}
+
+static int _destroy(clock_h clock)
+{
+ Evas_Object *page = clock->view;
+
+ if (page != NULL) {
+ evas_object_smart_callback_del(page, CLOCK_SMART_SIGNAL_PAUSE, _pause_cb);
+ evas_object_smart_callback_del(page, CLOCK_SMART_SIGNAL_RESUME, _resume_cb);
+ page_destroy(page);
+ clock->view = NULL;
+ }
+
+ clock_util_terminate_clock_by_pid(clock->pid);
+
+ return CLOCK_RET_OK;
+}
+
+clock_inf_s clock_inf_minictrl = {
+ .async = 1,
+ .use_dead_monitor = 1,
+ .prepare = _prepare,
+ .config = _config,
+ .create = _create,
+ .attached_cb = _attached_cb,
+ .destroy = _destroy,
+};
+
+static Eina_Bool _view_ready_idler_cb(void *data)
+{
+ _D("");
+
+ if (s_info.waiting_timer != NULL) {
+ s_info.waiting_timer = NULL;
+ }
+
+ clock_h clock = data;
+ retv_if(clock == NULL, ECORE_CALLBACK_CANCEL);
+
+ clock_service_event_handler(clock, CLOCK_EVENT_VIEW_READY);
+
+ _D("");
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+HAPI void clock_inf_minictrl_event_hooker(int action, int pid, const char *minictrl_id, int is_realized, int width, int height)
+{
+ clock_h clock = NULL;
+ ret_if(minictrl_id == NULL);
+
+ switch (action) {
+ case MINICONTROL_ACTION_START:
+ clock = clock_manager_clock_get(CLOCK_CANDIDATE);
+ if (clock != NULL) {
+ if (clock->pid == pid) {
+ _D("candidate clock:%s is now ready", clock->pkgname);
+
+ if (clock->view_id == NULL) {
+ clock->view_id = strdup(minictrl_id);
+ }
+ clock->w = width;
+ clock->h = height;
+
+ //ecore_idler_add(_view_ready_idler_cb, clock);
+ if (s_info.waiting_timer != NULL) {
+ ecore_timer_del(s_info.waiting_timer);
+ s_info.waiting_timer = NULL;
+ }
+ if (is_realized == 1) {
+ _W("clock is already realized");
+ clock_service_event_handler(clock, CLOCK_EVENT_VIEW_READY);
+ } else {
+ _W("not realized, waiting 1.0 sec");
+ /*
+ * To load minicontrol ASAP
+ */
+ if (clock->app_type != CLOCK_APP_TYPE_WEBAPP) {
+ _create(clock);
+ }
+ s_info.waiting_timer = ecore_timer_add(1.0f, _view_ready_idler_cb, clock);
+ }
+ } else {
+ _E("the clock isn't what we want:%d %s", pid, minictrl_id);
+ }
+ } else {
+ _E("[Exceptional, no candiate clock");
+ }
+ break;
+ case MINICONTROL_ACTION_REALIZE:
+ clock = clock_manager_clock_get(CLOCK_CANDIDATE);
+ if (clock != NULL) {
+ if (clock->pid == pid) {
+ _D("candidate clock:%s is now realized", clock->pkgname);
+
+ if (clock->view_id == NULL) {
+ clock->view_id = strdup(minictrl_id);
+ }
+ clock->w = width;
+ clock->h = height;
+
+ if (s_info.waiting_timer != NULL) {
+ ecore_timer_del(s_info.waiting_timer);
+ s_info.waiting_timer = NULL;
+ }
+ clock_service_event_handler(clock, CLOCK_EVENT_VIEW_READY);
+ } else {
+ _E("the clock isn't what we want:%d %s", pid, minictrl_id);
+ }
+ } else {
+ _E("[Exceptional, no candiate clock");
+ }
+ break;
+ case MINICONTROL_ACTION_RESIZE:
+ clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ if (clock != NULL) {
+ if (clock->view_id == NULL) {
+ /**
+ * THIS CASE MUST HAS NOT TO BE HAPPEND.
+ * But for the safety, I just handled this too.
+ */
+ _E("Attached clock: has no view ID(%s)", clock->pkgname);
+ if (clock->pid == pid) {
+ _D("But, PID is matched: %d", clock->pid);
+ clock->view_id = strdup(minictrl_id);
+ if (!clock->view_id) {
+ _E("strdup: %s", strerror(errno));
+ } else {
+ clock->w = width;
+ clock->h = height;
+
+ clock_service_event_handler(clock, CLOCK_EVENT_VIEW_RESIZED);
+ }
+ }
+ } else if (strcmp(clock->view_id, minictrl_id) == 0) {
+ _D("Attached clock: %s is updated", clock->pkgname);
+
+ clock->w = width;
+ clock->h = height;
+
+ clock_service_event_handler(clock, CLOCK_EVENT_VIEW_RESIZED);
+ }
+ } else {
+ _W("clock: %s isn't attached yet", minictrl_id);
+ }
+ clock = clock_manager_clock_get(CLOCK_CANDIDATE);
+ if (clock != NULL) {
+ if (clock->view_id == NULL) {
+ if (clock->pid == pid) {
+ _D("Clock has no view ID, but PID is matched: %d %s", clock->pid, clock->pkgname);
+ clock->view_id = strdup(minictrl_id);
+ if (!clock->view_id) {
+ _E("strdup: %s", strerror(errno));
+ } else {
+ clock->w = width;
+ clock->h = height;
+ }
+ } else {
+ _D("Candidate PID is not matched? %d", clock->pid);
+ }
+ } else if (strcmp(clock->view_id, minictrl_id) == 0) {
+ _D("candidate clock:%s is updated", clock->pkgname);
+ clock->w = width;
+ clock->h = height;
+ }
+ }
+ break;
+ case MINICONTROL_ACTION_STOP:
+ break;
+ case MINICONTROL_ACTION_REQUEST:
+ if (width == MINICONTROL_REQ_FREEZE_SCROLL_VIEWER) {
+ clock_service_event_handler(NULL, CLOCK_EVENT_SCROLLER_FREEZE_ON);
+ } else if (width == MINICONTROL_REQ_UNFREEZE_SCROLL_VIEWER) {
+ clock_service_event_handler(NULL, CLOCK_EVENT_SCROLLER_FREEZE_OFF);
+ } else {
+ _W("Not a case");
+ }
+ break;
+ default:
+ break;
+ }
+}
diff --git a/home/src/clock_manager.c b/home/src/clock_manager.c
new file mode 100755
index 0000000..5e5a49f
--- /dev/null
+++ b/home/src/clock_manager.c
@@ -0,0 +1,297 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+#include <aul.h>
+#include <efl_assist.h>
+#include <stdio.h>
+#include <vconf.h>
+#include <dlog.h>
+#include <dynamicbox_service.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "layout.h"
+#include "clock_service.h"
+#include "power_mode.h"
+
+#define TIZEN_CLOCK_CATEGORY "org.tizen.wmanager.WATCH_CLOCK"
+
+extern clock_inf_s clock_inf_minictrl;
+extern clock_inf_s clock_inf_dbox;
+
+static struct _s_info {
+ clock_h attached_clock;
+ clock_h candidate_clock;
+} s_info = {
+ .attached_clock = NULL,
+ .candidate_clock = NULL,
+};
+
+static clock_inf_s *_get_clock_inf(int inf_type)
+{
+ if (inf_type == CLOCK_INF_MINICONTROL) {
+ return &clock_inf_minictrl;
+ } else if (inf_type == CLOCK_INF_DBOX) {
+ return &clock_inf_dbox;
+ }
+
+ return NULL;
+}
+
+static int _get_inf_type_by_pkgname(const char *pkgname)
+{
+ int ret = CLOCK_INF_MINICONTROL;
+ char *dbox_id = NULL;
+ retv_if(pkgname == NULL, ret);
+
+ dbox_id = dynamicbox_service_dbox_id(pkgname);
+ if (dbox_id != NULL) {
+ char *category = NULL;
+ category = dynamicbox_service_category(dbox_id);
+
+ if (category != NULL) {
+ if (!strcmp(category, TIZEN_CLOCK_CATEGORY)) {
+ ret = CLOCK_INF_DBOX;
+ }
+ free(category);
+ }
+ free(dbox_id);
+ }
+
+ return ret;
+}
+
+HAPI clock_h clock_new(const char *pkgname)
+{
+ clock_h clock = NULL;
+ retv_if(pkgname == NULL, NULL);
+
+ clock = (clock_h)calloc(1, sizeof(clock_s));
+ if (clock != NULL) {
+ clock->appid = util_get_appid_by_pkgname(pkgname);
+ goto_if(clock->appid == NULL, ERR);
+ clock->pkgname = strdup(pkgname);
+ goto_if(clock->pkgname == NULL, ERR);
+ clock->app_type = util_get_app_type(clock->appid);
+
+ int inf_type = _get_inf_type_by_pkgname(pkgname);
+ clock_inf_s *inf = _get_clock_inf(inf_type);
+ goto_if(inf == NULL, ERR);
+
+ clock->use_dead_monitor = inf->use_dead_monitor;
+ clock->async = inf->async;
+ clock->state = CLOCK_STATE_IDLE;
+ clock->interface = inf_type;
+ clock->view = NULL;
+ } else {
+ _E("failed to allocate memory");
+ goto ERR;
+ }
+ return clock;
+
+ERR:
+ if (clock) {
+ free(clock->appid);
+ free(clock->pkgname);
+ free(clock);
+ }
+ return NULL;
+}
+
+HAPI void clock_del(clock_h clock)
+{
+ ret_if(clock == NULL);
+
+ free(clock->view_id);
+ clock->view_id = NULL;
+ free(clock->appid);
+ clock->appid = NULL;
+ free(clock->pkgname);
+ clock->pkgname = NULL;
+ free(clock);
+}
+
+HAPI int clock_manager_view_prepare(clock_h clock)
+{
+ int ret = CLOCK_RET_FAIL;
+ retv_if(clock == NULL, CLOCK_RET_FAIL);
+ clock_inf_s *inf = _get_clock_inf(clock->interface);
+
+ if (inf != NULL && inf->prepare != NULL) {
+ ret = inf->prepare(clock);
+ }
+
+ return ret;
+}
+
+HAPI int clock_manager_view_configure(clock_h clock, int type)
+{
+ int ret = CLOCK_RET_FAIL;
+ retv_if(clock == NULL, CLOCK_RET_FAIL);
+ clock_inf_s *inf = _get_clock_inf(clock->interface);
+
+ if (inf != NULL && inf->config != NULL) {
+ ret = inf->config(clock, type);
+ }
+
+ return ret;
+}
+
+HAPI int clock_manager_view_create(clock_h clock)
+{
+ int ret = CLOCK_RET_FAIL;
+ retv_if(clock == NULL, CLOCK_RET_FAIL);
+ clock_inf_s *inf = _get_clock_inf(clock->interface);
+
+ if (inf != NULL && inf->create != NULL) {
+ ret = inf->create(clock);
+ }
+
+ return ret;
+}
+
+HAPI int clock_manager_view_attach(clock_h clock)
+{
+ int mode = 0;
+ int need_show_clock = 0;
+ int ret = CLOCK_RET_FAIL;
+ retv_if(clock == NULL, CLOCK_RET_FAIL);
+ clock_inf_s *inf = _get_clock_inf(clock->interface);
+
+ mode = clock_service_mode_get();
+ if (clock_manager_clock_get(CLOCK_ATTACHED) == NULL
+ || mode == CLOCK_SERVICE_MODE_EMERGENCY
+ || mode == CLOCK_SERVICE_MODE_COOLDOWN) {
+ /*
+ * Maybe this is first time which the function is called
+ */
+ need_show_clock = 1;
+ }
+
+ if (clock->view != NULL) {
+ ret = clock_view_attach(clock->view);
+ if (ret == CLOCK_RET_OK) {
+ if (need_show_clock == 1) {
+ clock_view_show(clock->view);
+ }
+ if (inf != NULL && inf->attached_cb != NULL) {
+ inf->attached_cb(clock);
+ }
+ }
+ } else {
+ _E("clock view of %s isn't created yet", clock->pkgname);
+ }
+
+ return ret;
+}
+
+HAPI int clock_manager_view_deattach(clock_h clock)
+{
+ int ret = CLOCK_RET_FAIL;
+ retv_if(clock == NULL, CLOCK_RET_FAIL);
+
+ if (clock->view != NULL) {
+ ret = clock_view_deattach(clock->view);
+ } else {
+ _E("clock view of %s isn't created yet", clock->pkgname);
+ }
+
+ return ret;
+}
+
+HAPI int clock_manager_view_destroy(clock_h clock)
+{
+ int ret = CLOCK_RET_FAIL;
+ clock_inf_s *inf = _get_clock_inf(clock->interface);
+
+ if (inf != NULL && inf->create != NULL) {
+ ret = inf->destroy(clock);
+ }
+
+ return ret;
+}
+
+HAPI int clock_manager_view_exchange(clock_h clock, void *view)
+{
+ int ret = CLOCK_RET_FAIL;
+ clock_inf_s *inf = _get_clock_inf(clock->interface);
+ retv_if(view == NULL, CLOCK_RET_FAIL);
+
+ clock_view_attach(view);
+
+ if (inf != NULL && inf->create != NULL) {
+ ret = inf->destroy(clock);
+ }
+
+ clock->view = view;
+
+ return ret;
+}
+
+HAPI void clock_manager_clock_set(int type, clock_h clock)
+{
+ if (type == CLOCK_ATTACHED) {
+ if (s_info.attached_clock != NULL && clock != NULL) {
+ _W("attached clock isn't cleaned-up, yet");
+ }
+
+ s_info.attached_clock = clock;
+ if (clock != NULL) {
+ _D("attached clock:%s(%d)", clock->pkgname, clock->pid);
+ }
+ } else if (type == CLOCK_CANDIDATE) {
+ if (s_info.candidate_clock != NULL && clock != NULL) {
+ _W("candidate clock isn't cleaned-up, yet");
+ }
+
+ s_info.candidate_clock = clock;
+ if (clock != NULL) {
+ _D("candidate clock:%s(%d)", clock->pkgname, clock->pid);
+ }
+ }
+}
+
+HAPI clock_h clock_manager_clock_get(int type)
+{
+ if (type == CLOCK_ATTACHED) {
+ return s_info.attached_clock;
+ } else if (type == CLOCK_CANDIDATE) {
+ return s_info.candidate_clock;
+ }
+
+ return NULL;
+}
+
+HAPI int clock_manager_clock_inf_type_get(const char *pkgname)
+{
+ return _get_inf_type_by_pkgname(pkgname);
+}
+
+HAPI int clock_manager_view_state_get(int view_type)
+{
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ if (clock != NULL) {
+ return clock_view_display_state_get(clock->view, view_type);
+ }
+
+ return 0;
+}
diff --git a/home/src/clock_service.c b/home/src/clock_service.c
new file mode 100755
index 0000000..6231506
--- /dev/null
+++ b/home/src/clock_service.c
@@ -0,0 +1,799 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <aul.h>
+#include <vconf.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "layout.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "page.h"
+#include "dbus.h"
+#include "key.h"
+#include "clock_service.h"
+#include "power_mode.h"
+#include "edit.h"
+
+#define ERROR_RETRY_COUNT 20
+#define ERROR_ACTION_NEED_TO_RETRY 1
+#define ERROR_ACTION_NEED_TO_CHANGE_PKGNAME_AND_RETRY 2
+#define ERROR_ACTION_NEED_TO_RESET_CLOCK_VCONF 3
+#define ERROR_ACTION_NEED_TO_KEEP_CURRENT_STATUS 4
+
+#define CLOCK_SERVICE_STATE_NOT_INITIALIZED 0
+#define CLOCK_SERVICE_STATE_READY 1
+#define CLOCK_SERVICE_STATE_WAITING 2
+
+#define CLOCK_VIEW_ACTIVATE_WAIT_TIME 0.30
+#define CLOCK_VIEW_CONF_RESET_TIME 0.3
+#define CLOCK_PUMP_WAIT_TIME 1.0
+#define CLOCK_VIEW_WAITING_TIME 5.0
+
+static struct _s_info {
+ int mode;
+ int state;
+ int is_pump_ignored;
+ int is_scroller_screezed;
+
+ int error_count;
+ int error_pid;
+ char *error_pkgname;
+
+ Ecore_Timer *waiting_timer;
+ Ecore_Timer *pump_timer;
+ Ecore_Timer *activate_timer;
+ Ecore_Timer *conf_reset_timer;
+} s_info = {
+ .mode = CLOCK_SERVICE_MODE_NORMAL,
+ .state = CLOCK_SERVICE_STATE_NOT_INITIALIZED,
+ .is_pump_ignored = 0,
+ .is_scroller_screezed = 0,
+
+ .error_count = 0,
+ .error_pkgname = NULL,
+
+ .waiting_timer = NULL,
+ .pump_timer = NULL,
+ .activate_timer = NULL,
+ .conf_reset_timer = NULL,
+};
+
+static void _clock_service_heartbeat_pump(void);
+
+static const char *_get_state_str(int state)
+{
+ if (state == CLOCK_SERVICE_STATE_NOT_INITIALIZED) {
+ return "state not initialized";
+ }
+ if (state == CLOCK_SERVICE_STATE_READY) {
+ return "state ready";
+ }
+ if (state == CLOCK_SERVICE_STATE_WAITING) {
+ return "state waiting";
+ }
+
+ return "invalid state";
+}
+
+static void _scroller_freeze(int is_freeze)
+{
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+ ret_if(win == NULL);
+
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ ret_if(layout == NULL);
+ scroller = elm_object_part_content_get(layout, "scroller");
+ ret_if(scroller == NULL);
+
+ if (is_freeze == 1) {
+ s_info.is_scroller_screezed = 1;
+ scroller_freeze(scroller);
+ scroller_region_show_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_ANIMATOR);
+ } else if (is_freeze == 0) {
+ s_info.is_scroller_screezed = 0;
+ scroller_unfreeze(scroller);
+ } else {
+ _E("not a case");
+ }
+}
+
+static Eina_Bool _conf_reset_timer_cb(void *data)
+{
+ s_info.conf_reset_timer = NULL;
+
+ clock_util_setting_conf_set(CLOCK_CONF_NONE);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool _setting_conf_apply_timer_cb(void *data)
+{
+ int configure = (int)data;
+ s_info.activate_timer = NULL;
+
+ util_activate_home_window();
+ if (configure == 2) {
+ clock_service_event_handler(NULL, CLOCK_EVENT_SCROLLER_FREEZE_ON);
+ }
+
+ if (s_info.conf_reset_timer != NULL) {
+ ecore_timer_del(s_info.conf_reset_timer);
+ s_info.conf_reset_timer = NULL;
+ }
+ s_info.conf_reset_timer = ecore_timer_add(CLOCK_VIEW_CONF_RESET_TIME,
+ _conf_reset_timer_cb, NULL);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void _setting_conf_apply(int configure)
+{
+ if (s_info.activate_timer != NULL) {
+ ecore_timer_del(s_info.activate_timer);
+ s_info.activate_timer = NULL;
+ }
+
+ if (configure > 0) {
+ s_info.activate_timer = ecore_timer_add(CLOCK_VIEW_ACTIVATE_WAIT_TIME,
+ _setting_conf_apply_timer_cb, (void*)configure);
+ }
+}
+
+static int _state_get(void)
+{
+ return s_info.state;
+}
+
+static void _state_set(int state)
+{
+ _D("state %s --> %s ", _get_state_str(s_info.state), _get_state_str(state));
+ s_info.state = state;
+}
+
+static void _clock_destroy(clock_h clock)
+{
+ ret_if(clock == NULL);
+
+ _D("destroying clock:%s", clock->pkgname);
+ //clock_manager_view_deattach(clock);
+ clock_manager_view_destroy(clock);
+ clock_del(clock);
+}
+
+static int _clock_error_action_get(char *pkgname)
+{
+ retv_if(pkgname == NULL, ERROR_ACTION_NEED_TO_KEEP_CURRENT_STATUS);
+
+ if (s_info.error_pkgname != NULL) {
+ if (strcmp(s_info.error_pkgname, pkgname) == 0) {
+ s_info.error_count++;
+
+ _E("error count:%d", s_info.error_count);
+ if (s_info.error_count >= ERROR_RETRY_COUNT) {
+ return ERROR_ACTION_NEED_TO_RESET_CLOCK_VCONF;
+ } else {
+ return ERROR_ACTION_NEED_TO_RETRY;
+ }
+ } else {
+ return ERROR_ACTION_NEED_TO_CHANGE_PKGNAME_AND_RETRY;
+ }
+ }
+
+ return ERROR_ACTION_NEED_TO_CHANGE_PKGNAME_AND_RETRY;
+}
+
+static void _clock_error_pkgname_set(char *pkgname)
+{
+ char *pkgname_clone = NULL;
+ ret_if(pkgname == NULL);
+
+ if (s_info.error_pkgname != NULL) {
+ free(s_info.error_pkgname);
+ s_info.error_pkgname = NULL;
+ }
+
+ if (pkgname != NULL) {
+ pkgname_clone = strdup(pkgname);
+ if (pkgname_clone != NULL) {
+ s_info.error_pkgname = pkgname_clone;
+ } else {
+ _E("failed to strdup pkgname");
+ }
+ }
+}
+
+static void _clock_error_report(char *pkgname, int is_fatal_error)
+{
+ int treat = 0;
+ ret_if(pkgname == NULL);
+
+ if (is_fatal_error == 0) {
+ treat = _clock_error_action_get(pkgname);
+ } else {
+ treat = ERROR_ACTION_NEED_TO_RESET_CLOCK_VCONF;
+ }
+ switch (treat) {
+ case ERROR_ACTION_NEED_TO_RETRY:
+ clock_service_request(CLOCK_SERVICE_MODE_NORMAL_RECOVERY);
+ break;
+ case ERROR_ACTION_NEED_TO_CHANGE_PKGNAME_AND_RETRY:
+ _clock_error_pkgname_set(pkgname);
+ s_info.error_count = 1;
+ clock_service_request(CLOCK_SERVICE_MODE_NORMAL_RECOVERY);
+ break;
+ case ERROR_ACTION_NEED_TO_RESET_CLOCK_VCONF:
+ clock_util_wms_configuration_set(CLOCK_APP_RECOVERY);
+ clock_service_request(CLOCK_SERVICE_MODE_RECOVERY);
+ s_info.error_count = 0;
+ break;
+ case ERROR_ACTION_NEED_TO_KEEP_CURRENT_STATUS:
+ _E("");
+ break;
+ }
+
+ _E("error:%s treat:%d", pkgname, treat);
+}
+
+static Eina_Bool _pump_timer_cb(void *data)
+{
+ _W("restart clock service, pump it again");
+ s_info.pump_timer = NULL;
+
+ _state_set(CLOCK_SERVICE_STATE_READY);
+ _clock_service_heartbeat_pump();
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool _waiting_timer_cb(void *data)
+{
+ _D("clock waiting timer is expired");
+ s_info.waiting_timer = NULL;
+
+ clock_h clock = clock_manager_clock_get(CLOCK_CANDIDATE);
+ retv_if(clock == NULL, ECORE_CALLBACK_CANCEL);
+
+ if (clock->state == CLOCK_STATE_WAITING) {
+ _E("provider:%s didn't provide anything, we will ignore it", clock->pkgname);
+
+ _setting_conf_apply(clock->configure);
+
+ clock_manager_clock_set(CLOCK_CANDIDATE, NULL);
+ _clock_destroy(clock);
+
+ if (s_info.pump_timer != NULL) {
+ ecore_timer_del(s_info.pump_timer);
+ s_info.pump_timer = NULL;
+ }
+ s_info.pump_timer = ecore_timer_add(CLOCK_PUMP_WAIT_TIME, _pump_timer_cb, NULL);
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void _del_waiting_timer(void)
+{
+ _E("clock waiting timer is deleted");
+ if (s_info.waiting_timer != NULL) {
+ ecore_timer_del(s_info.waiting_timer);
+ s_info.waiting_timer = NULL;
+ }
+}
+
+static void _set_waiting_timer(void)
+{
+ _E("clock waiting timer is started");
+ if (s_info.waiting_timer != NULL) {
+ _del_waiting_timer();
+ }
+
+ s_info.waiting_timer = ecore_timer_add(CLOCK_VIEW_WAITING_TIME,
+ _waiting_timer_cb, NULL);
+}
+
+static char *_clock_pkg_get(int mode)
+{
+ char *clock_pkgname = NULL;
+
+ switch (mode) {
+ case CLOCK_SERVICE_MODE_NORMAL:
+ case CLOCK_SERVICE_MODE_NORMAL_RECOVERY:
+ clock_pkgname = clock_util_wms_configuration_get();
+ break;
+ case CLOCK_SERVICE_MODE_EMERGENCY:
+ clock_pkgname = strdup(CLOCK_APP_EMERGENCY);
+ break;
+ case CLOCK_SERVICE_MODE_COOLDOWN:
+ clock_pkgname = strdup(CLOCK_APP_COOLDOWN);
+ break;
+ case CLOCK_SERVICE_MODE_RECOVERY:
+ clock_pkgname = strdup(CLOCK_APP_RECOVERY);
+ break;
+ }
+
+ return clock_pkgname;
+}
+
+static int _clock_provider_change(char *clock_pkgname, clock_h *clock_ret, int configure)
+{
+ clock_h clock = NULL;
+ clock_h prev_clock = NULL;
+ retv_if(clock_pkgname == NULL, CLOCK_RET_FAIL);
+ retv_if(clock_ret == NULL, CLOCK_RET_FAIL);
+ int ret;
+
+ _E("clock will be changed to %s", clock_pkgname);
+
+ clock = clock_new(clock_pkgname);
+ retv_if(clock == NULL, CLOCK_RET_FAIL);
+
+ clock->configure = configure;
+
+ ret = clock_manager_view_prepare(clock);
+ switch (ret & ~CLOCK_RET_NEED_DESTROY_PREVIOUS) {
+ case CLOCK_RET_ASYNC:
+ clock->async = 1;
+ if ((ret & CLOCK_RET_NEED_DESTROY_PREVIOUS) == CLOCK_RET_NEED_DESTROY_PREVIOUS) {
+ prev_clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ if (prev_clock != NULL) {
+ Evas_Object *empty_view = clock_view_empty_add();
+ if (empty_view != NULL) {
+ clock_manager_view_exchange(prev_clock, empty_view);
+ }
+ }
+ }
+ break;
+ case CLOCK_RET_OK:
+ break;
+ case CLOCK_RET_FAIL:
+ default:
+ goto ERR;
+ }
+
+ if (clock->async == 1) {
+ *clock_ret = clock;
+ return CLOCK_RET_OK;
+ }
+
+ if (clock_manager_view_create(clock) != CLOCK_RET_OK) {
+ _E("Failed to create view");
+ goto ERR;
+ }
+
+ prev_clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ if (clock_manager_view_attach(clock) != CLOCK_RET_OK) {
+ _E("Failed to attach view");
+ goto ERR;
+ }
+
+ clock->state = CLOCK_STATE_RUNNING;
+ clock_manager_clock_set(CLOCK_ATTACHED, clock);
+ _setting_conf_apply(clock->configure);
+
+ *clock_ret = clock;
+
+ /*
+ * sequence is meaningful
+ */
+ if (prev_clock != NULL) {
+ _D("destroying previous attached clock:%s", prev_clock->pkgname);
+ _clock_destroy(prev_clock);
+ }
+
+ return CLOCK_RET_OK;
+
+ERR:
+ _E("Failed to change clock provider");
+
+ clock_del(clock);
+
+ return CLOCK_RET_FAIL;
+}
+
+static void _clock_service_heartbeat_pump(void)
+{
+ int ret = CLOCK_RET_OK;
+ clock_h clock = NULL;
+ clock_h prev_clock = NULL;
+ clock_h candidate_clock = NULL;
+ char *pkgname = _clock_pkg_get(s_info.mode);
+ ret_if(pkgname == NULL);
+
+ prev_clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ candidate_clock = clock_manager_clock_get(CLOCK_CANDIDATE);
+
+ int configure = 0;
+ int check_duplication = 1;
+ int ignore_state = 0;
+ int destroy_candidate = 0;
+
+ switch (s_info.mode) {
+ case CLOCK_SERVICE_MODE_NORMAL:
+ check_duplication = 1;
+ ignore_state = 0;
+ destroy_candidate = 0;
+ configure = clock_util_setting_conf_get();
+ clock_service_event_handler(NULL, CLOCK_EVENT_SCROLLER_FREEZE_OFF);
+ break;
+ case CLOCK_SERVICE_MODE_NORMAL_RECOVERY:
+ check_duplication = 0;
+ ignore_state = 1;
+ destroy_candidate = 1;
+ configure = clock_util_setting_conf_get();
+ clock_service_event_handler(NULL, CLOCK_EVENT_SCROLLER_FREEZE_OFF);
+ break;
+ case CLOCK_SERVICE_MODE_EMERGENCY:
+ case CLOCK_SERVICE_MODE_COOLDOWN:
+ check_duplication = 1;
+ ignore_state = 1;
+ destroy_candidate = 1;
+ configure = 0;
+ _setting_conf_apply(configure);
+ if (s_info.mode == CLOCK_SERVICE_MODE_EMERGENCY) {
+ clock_service_event_handler(NULL, CLOCK_EVENT_SCROLLER_FREEZE_OFF);
+ }
+ break;
+ case CLOCK_SERVICE_MODE_RECOVERY:
+ check_duplication = 0;
+ ignore_state = 1;
+ destroy_candidate = 1;
+ configure = 0;
+ _setting_conf_apply(configure);
+ clock_service_event_handler(NULL, CLOCK_EVENT_SCROLLER_FREEZE_OFF);
+ break;
+ }
+
+ /*
+ * this modes are oneshot mode
+ */
+ if (s_info.mode == CLOCK_SERVICE_MODE_NORMAL_RECOVERY || s_info.mode == CLOCK_SERVICE_MODE_RECOVERY) {
+ s_info.mode = CLOCK_SERVICE_MODE_NORMAL;
+ }
+
+ _W("clock service pump: %s %d %d %d %d", pkgname, check_duplication, ignore_state, destroy_candidate, configure);
+
+ if (configure == CLOCK_CONF_CLOCK_CONFIGURATION) {
+ if (prev_clock != NULL && prev_clock->pkgname != NULL) {
+ if (strcmp(prev_clock->pkgname, pkgname) == 0) {
+ _E("%s is already attached to home, just configure it", pkgname);
+ if (clock_manager_view_configure(prev_clock, configure) != CLOCK_RET_OK) {
+ _E("Failed to configure %s", pkgname);
+ goto ERR;
+ }
+ _setting_conf_apply(configure);
+ return;
+ }
+ }
+ }
+ if (ignore_state == 0) {
+ if (_state_get() != CLOCK_SERVICE_STATE_READY) {
+ _E("not ready to create a new clock:%s", pkgname);
+ s_info.is_pump_ignored = 1;
+ return;
+ }
+ } else {
+ if (_state_get() != CLOCK_SERVICE_STATE_READY &&
+ candidate_clock != NULL) {
+ if (candidate_clock->pkgname != NULL) {
+ if (strcmp(candidate_clock->pkgname, pkgname) == 0 &&
+ s_info.waiting_timer != NULL) {
+ _W("we already requested a view to clock(%s)", pkgname);
+ return;
+ }
+ }
+ }
+ }
+ if (check_duplication == 1) {
+ if (prev_clock != NULL && prev_clock->pkgname != NULL) {
+ if (strcmp(prev_clock->pkgname, pkgname) == 0) {
+ _E("%s is already attached to home", pkgname);
+ _setting_conf_apply(configure);
+ return;
+ }
+ }
+ }
+ if (destroy_candidate == 1) {
+ if (candidate_clock != NULL) {
+ if (candidate_clock->pkgname != NULL) {
+ if (strcmp(candidate_clock->pkgname, pkgname) != 0) {
+ _W("destroying candicate clock:%s", candidate_clock->pkgname);
+ clock_manager_clock_set(CLOCK_CANDIDATE, NULL);
+ _clock_destroy(candidate_clock);
+ }
+ }
+ }
+ }
+
+ _state_set(CLOCK_SERVICE_STATE_WAITING);
+ _del_waiting_timer();
+ ret = _clock_provider_change(pkgname, &clock, configure);
+ if (ret == CLOCK_RET_FAIL) {
+ _E("Failed to create clock: %s", pkgname);
+ _state_set(CLOCK_SERVICE_STATE_READY);
+ goto ERR;
+ }
+
+ if (clock->async == 1) {
+ clock->state = CLOCK_STATE_WAITING;
+ clock_manager_clock_set(CLOCK_CANDIDATE, clock);
+
+ _del_waiting_timer();
+ _set_waiting_timer();
+ _D("%s will be created with async manner", pkgname);
+ } else {
+ _state_set(CLOCK_SERVICE_STATE_READY);
+ _D("%s will be created with sync manner", pkgname);
+ }
+
+ return ;
+
+ERR:
+ if (clock == NULL) {
+ _E("Failed create clock of %s", pkgname);
+ _clock_error_report(pkgname, 0);
+ }
+ _setting_conf_apply(configure);
+}
+
+static void _wms_clock_vconf_cb(keynode_t *node, void *data)
+{
+ if (util_feature_enabled_get(FEATURE_CLOCK_CHANGE) == 1) {
+ home_dbus_lcd_on_signal_send(EINA_FALSE);
+ _clock_service_heartbeat_pump();
+ } else {
+ _E("Editing is in progress, delaying changing a clock");
+ }
+}
+
+HAPI void clock_service_init(void)
+{
+ int ret = 0;
+
+ if((ret = vconf_notify_key_changed(VCONFKEY_WMS_CLOCKS_SET_IDLE, _wms_clock_vconf_cb, NULL)) < 0) {
+ _E("Failed to register the vconf callback(WMS_CLOCKS_SET_IDLE) : %d", ret);
+ }
+
+ _state_set(CLOCK_SERVICE_STATE_READY);
+
+ /*
+ * workaround, prevent to apply invalid mode
+ */
+ if (s_info.mode == CLOCK_SERVICE_MODE_EMERGENCY) {
+ if (emergency_mode_enabled_get() == 0) {
+ s_info.mode = CLOCK_SERVICE_MODE_NORMAL;
+ }
+ }
+ if (s_info.mode == CLOCK_SERVICE_MODE_COOLDOWN) {
+ if (cooldown_mode_enabled_get() == 0) {
+ s_info.mode = CLOCK_SERVICE_MODE_NORMAL;
+ }
+ }
+
+ _clock_service_heartbeat_pump();
+ clock_shortcut_init();
+}
+
+HAPI void clock_service_fini(void)
+{
+ int ret = 0;
+
+ if((ret = vconf_ignore_key_changed(VCONFKEY_WMS_CLOCKS_SET_IDLE,
+ _wms_clock_vconf_cb)) < 0) {
+ _E("Failed to ignore the vconf callback(WMS_CLOCKS_SET_IDLE) : %d", ret);
+ }
+
+ _state_set(CLOCK_SERVICE_STATE_NOT_INITIALIZED);
+ clock_shortcut_fini();
+}
+
+HAPI char *clock_service_clock_pkgname_get(void)
+{
+ return _clock_pkg_get(s_info.mode);
+}
+
+HAPI void clock_service_mode_set(int mode)
+{
+ if (mode == CLOCK_SERVICE_MODE_NORMAL_RECOVERY) {
+ if (s_info.mode == CLOCK_SERVICE_MODE_EMERGENCY ||
+ s_info.mode == CLOCK_SERVICE_MODE_COOLDOWN) {
+ return ;
+ }
+ }
+
+ s_info.mode = mode;
+}
+
+HAPI int clock_service_mode_get(void)
+{
+ return s_info.mode;
+}
+
+HAPI void clock_service_request(int mode)
+{
+ if (mode >= 0) {
+ clock_service_mode_set(mode);
+ }
+
+ if (_state_get() != CLOCK_SERVICE_STATE_NOT_INITIALIZED) {
+ _clock_service_heartbeat_pump();
+ }
+}
+
+HAPI void clock_service_pause(void)
+{
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(clock == NULL);
+
+ clock_view_event_handler(clock, CLOCK_EVENT_APP_PAUSE, clock->need_event_relay);
+}
+
+HAPI void clock_service_resume(void)
+{
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(clock == NULL);
+
+ clock_view_event_handler(clock, CLOCK_EVENT_APP_RESUME, clock->need_event_relay);
+}
+
+HAPI void clock_service_event_handler(clock_h clock, int event)
+{
+ int need_pump = 0;
+ clock_h prev_clock = NULL;
+ clock_h candicate_clock = NULL;
+
+ switch (event) {
+ case CLOCK_EVENT_VIEW_READY:
+ ret_if(clock == NULL);
+ candicate_clock = clock_manager_clock_get(CLOCK_CANDIDATE);
+ if (clock != candicate_clock) {
+ _E("clock %s isn't candidate clock", clock->pkgname);
+ return ;
+ }
+
+ if (clock->state == CLOCK_STATE_WAITING) {
+ if (s_info.is_pump_ignored == 1) {
+ need_pump = 1;
+ s_info.is_pump_ignored = 0;
+ }
+
+ _del_waiting_timer();
+ clock_manager_clock_set(CLOCK_CANDIDATE, NULL);
+
+ if (clock_manager_view_create(clock) != CLOCK_RET_OK) {
+ _E("failed to create view");
+ clock_del(clock);
+ _state_set(CLOCK_SERVICE_STATE_READY);
+ if (need_pump == 1) {
+ _clock_service_heartbeat_pump();
+ }
+ return ;
+ }
+
+ prev_clock = clock_manager_clock_get(CLOCK_ATTACHED);
+
+ if (clock_manager_view_attach(clock) != CLOCK_RET_OK) {
+ _E("Failed to attach view");
+ clock_manager_view_destroy(clock);
+ clock_del(clock);
+ _state_set(CLOCK_SERVICE_STATE_READY);
+ if (need_pump == 1) {
+ _clock_service_heartbeat_pump();
+ }
+ return ;
+ }
+
+ clock->state = CLOCK_STATE_RUNNING;
+
+ clock_manager_clock_set(CLOCK_ATTACHED, clock);
+ clock_manager_clock_set(CLOCK_CANDIDATE, NULL);
+ _setting_conf_apply(clock->configure);
+
+ /*
+ * sequence is meaningful
+ */
+ if (prev_clock != NULL) {
+ _clock_destroy(prev_clock);
+ }
+
+ _state_set(CLOCK_SERVICE_STATE_READY);
+ if (need_pump == 1) {
+ _clock_service_heartbeat_pump();
+ }
+ } else {
+ _E("Not a async clock: %s ", clock->appid);
+ }
+ break;
+ case CLOCK_EVENT_VIEW_RESIZED:
+ ret_if(clock == NULL);
+
+ if (clock->view != NULL) {
+ clock_view_event_handler(clock, CLOCK_EVENT_VIEW_RESIZED, 0);
+ }
+ break;
+ case CLOCK_EVENT_SCROLLER_FREEZE_ON:
+ _W("scroller freeze on");
+ _scroller_freeze(1);
+ break;
+ case CLOCK_EVENT_SCROLLER_FREEZE_OFF:
+ _W("scroller freeze off");
+ _scroller_freeze(0);
+ break;
+ case CLOCK_EVENT_APP_PROVIDER_ERROR:
+ ret_if(clock == NULL);
+ _scroller_freeze(0);
+
+ _clock_error_report(clock->pkgname, 0);
+ break;
+ case CLOCK_EVENT_APP_PROVIDER_ERROR_FATAL:
+ ret_if(clock == NULL);
+ _scroller_freeze(0);
+
+ _clock_error_report(clock->pkgname, 1);
+ break;
+ }
+}
+
+#define CLOCK_SELECTOR_PKGNAME "org.tizen.clocksetting.clock"
+HAPI int clock_service_clock_selector_launch(void)
+{
+ int pid = 0;
+ bundle *b = bundle_create();
+ if (b != NULL) {
+ bundle_add(b, "__APP_SVC_OP_TYPE__", APP_CONTROL_OPERATION_MAIN);
+ bundle_add(b, "launch_type", "home");
+
+ home_dbus_cpu_booster_signal_send();
+ pid = aul_launch_app(CLOCK_SELECTOR_PKGNAME, b);
+ _D("aul_launch_app: %s(%d)", CLOCK_SELECTOR_PKGNAME, pid);
+
+ if (pid < 0) {
+ _E("Failed to launch %s(%d)", CLOCK_SELECTOR_PKGNAME, pid);
+ }
+ }
+
+ return pid;
+}
+
+HAPI void clock_service_scroller_freezed_set(int is_freeze)
+{
+ _W("clock freeze set:%d", is_freeze);
+
+ _scroller_freeze(is_freeze);
+}
+
+HAPI int clock_service_scroller_freezed_get(void)
+{
+ return s_info.is_scroller_screezed;
+}
+
+HAPI const int const clock_service_get_retry_count(void)
+{
+ return ERROR_RETRY_COUNT;
+}
+
diff --git a/home/src/clock_shortcut.c b/home/src/clock_shortcut.c
new file mode 100755
index 0000000..b48d772
--- /dev/null
+++ b/home/src/clock_shortcut.c
@@ -0,0 +1,589 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <bundle.h>
+#include <aul.h>
+#include <vconf.h>
+#include <efl_assist.h>
+#include <dlog.h>
+#include <message_port.h>
+#include <pkgmgr-info.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "effect.h"
+#include "clock_service.h"
+#include "page_info.h"
+#include "page.h"
+
+#define MUSIC_PLAYER_APPID "org.tizen.w-music-player"
+#define MUSIC_PLAYER_VCONF_STATE "memory/private/org.tizen.w-music-player/player_state"
+#define CLOCK_SHORTCUT_EDJ_FILE EDJEDIR"/clock_shortcut.edj"
+#define CLOCK_SHORTCUT_DATA_KEY_APPID "c_s_d_i"
+#define CLOCK_SHORTCUT_MESSAGE_PORT_ID "Home.Clock.Shortcut.Music"
+#define CLOCK_SHORTCUT_MESSAGE_KEY_STATE "state"
+#define CLOCK_SHORTCUT_MESSAGE_KEY_ICON "icon"
+#define CLOCK_SHORTCUT_MESSAGE_STATE_SHOW "show"
+#define CLOCK_SHORTCUT_MESSAGE_STATE_HIDE "hide"
+
+typedef struct {
+ int type;
+ char *appid;
+ char *icon;
+} shortcut_info_s;
+
+static struct {
+ int local_port_id;
+ Eina_List *list;
+} s_info = {
+ .local_port_id = -1,
+ .list = NULL,
+};
+
+static Evas_Object *_attached_clock_view_get(void)
+{
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ retv_if(clock == NULL, NULL);
+
+ return clock->view;
+}
+
+static Evas_Object *_shortcut_layout_get(Evas_Object *page_a) {
+ Evas_Object *page = (page_a == NULL) ? _attached_clock_view_get() : page_a;
+ retv_if(page == NULL, NULL);
+
+ Evas_Object *item = page_get_item(page);
+ if (item != NULL) {
+ return elm_object_part_content_get(item, "shortcut");
+ }
+
+ return NULL;
+}
+
+static void _info_free(shortcut_info_s *info)
+{
+ ret_if(info == NULL);
+
+ free(info->appid);
+ free(info->icon);
+}
+
+static shortcut_info_s *_list_lastest_info_get(void)
+{
+ retv_if(s_info.list == NULL, NULL);
+
+ return eina_list_nth(s_info.list, 0);
+}
+
+static shortcut_info_s * _list_info_get(const char *appid)
+{
+ Eina_List *l = NULL;
+ shortcut_info_s *info = NULL;
+ retv_if(appid == NULL, NULL);
+
+ EINA_LIST_FOREACH(s_info.list, l, info) {
+ if (info != NULL) {
+ if (info->appid != NULL) {
+ if (strcmp(info->appid, appid) == 0) {
+ return info;
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static void _list_info_add(shortcut_info_s *info)
+{
+ s_info.list = eina_list_prepend(s_info.list, info);
+}
+
+static void _list_info_del(shortcut_info_s *info)
+{
+ s_info.list = eina_list_remove(s_info.list, info);
+ _info_free(info);
+}
+
+static void _list_clean(void)
+{
+ shortcut_info_s *info = NULL;
+
+ EINA_LIST_FREE(s_info.list, info) {
+ if (info != NULL) {
+ _info_free(info);
+ }
+ }
+}
+
+static char *_get_app_name(const char *appid)
+{
+ pkgmgrinfo_appinfo_h appinfo_h = NULL;
+ char *tmp = NULL;
+ char *name = NULL;
+
+ retv_if(0 > pkgmgrinfo_appinfo_get_appinfo(appid, &appinfo_h), NULL);
+ goto_if(PMINFO_R_OK != pkgmgrinfo_appinfo_get_label(appinfo_h, &tmp), ERROR);
+
+ if (tmp) {
+ name = strdup(tmp);
+ goto_if(NULL == name, ERROR);
+ }
+
+ pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ return name;
+
+ERROR:
+ pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h);
+ return NULL;
+}
+
+/*!
+ * preload music player state
+ */
+static int _mp_state_get(void)
+{
+ int val = -1;
+
+ if(vconf_get_int(MUSIC_PLAYER_VCONF_STATE, &val) < 0) {
+ _E("Failed to get MUSIC_PLAYER_VCONF_STATE");
+ return 0;
+ }
+ retv_if(val != 1, 0);
+
+ retv_if(aul_app_is_running(MUSIC_PLAYER_APPID) <= 0, 0);
+
+ return 1;
+}
+
+/*!
+ * shortcut icon
+ */
+static char *_shortcut_icon_owner_get(Evas_Object *shortcut_layout)
+{
+ char *owner_appid = NULL;
+ Evas_Object *icon = NULL;
+ retv_if(shortcut_layout == NULL, NULL);
+
+ icon = elm_object_part_content_get(shortcut_layout, "shortcut,icon");
+ retv_if(icon == NULL, NULL);
+
+ owner_appid = (char *)evas_object_data_get(icon, CLOCK_SHORTCUT_DATA_KEY_APPID);
+
+ return owner_appid;
+}
+
+static int _shortcut_icon_is_owner_same(Evas_Object *shortcut_layout, const char *appid)
+{
+ Evas_Object *icon = NULL;
+ retv_if(shortcut_layout == NULL, 0);
+ retv_if(appid == NULL, 0);
+
+ icon = elm_object_part_content_get(shortcut_layout, "shortcut,icon");
+ retv_if(icon == NULL, 0);
+
+ char *owner_appid = (char *)evas_object_data_get(icon, CLOCK_SHORTCUT_DATA_KEY_APPID);
+ if (owner_appid != NULL) {
+ if (strcmp(owner_appid, appid) == 0) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static void _shortcut_icon_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ char *owner_appid = (char *)evas_object_data_del(obj, CLOCK_SHORTCUT_DATA_KEY_APPID);
+ free(owner_appid);
+}
+
+static Evas_Object *_shortcut_icon_create(Evas_Object *parent, const char *file_a)
+{
+ _D("");
+ const char *file = NULL;;
+ Evas_Object *icon = NULL;
+
+ if (file_a != NULL) {
+ if (access(file_a, R_OK) != 0) {
+ _E("Failed to access an icon(%s)", file_a);
+ } else {
+ file = file_a;
+ }
+ }
+
+ if (file == NULL) {
+ icon = elm_layout_add(parent);
+ retv_if(icon == NULL, NULL);
+
+ if (elm_layout_file_set(icon, CLOCK_SHORTCUT_EDJ_FILE, "shortcut_default_icon") != EINA_TRUE) {
+ _E("failed to set default icon file");
+ }
+ evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(icon);
+ } else {
+ icon = elm_image_add(parent);
+ retv_if(icon == NULL, NULL);
+
+ elm_image_resizable_set(icon, EINA_TRUE, EINA_TRUE);
+ if (elm_image_file_set(icon, file, NULL) == EINA_FALSE) {
+ _E("Failed to set image file:%s", file);
+ }
+ evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(icon);
+ }
+
+ return icon;
+}
+
+/*!
+ * shortcut layout
+ */
+static void _shortcut_layout_icon_set(Evas_Object *shortcut_layout, Evas_Object *icon)
+{
+ Evas_Object *tmp = NULL;
+ ret_if(shortcut_layout == NULL);
+ ret_if(icon == NULL);
+
+ tmp = elm_object_part_content_unset(shortcut_layout, "shortcut,icon");
+ if (tmp != NULL) {
+ evas_object_del(tmp);
+ }
+
+ elm_object_part_content_set(shortcut_layout, "shortcut,icon", icon);
+}
+
+#define MUSIC_STATUS_PLAY "play"
+#define MUSIC_STATUS_STOP "stop"
+static void _shortcut_layout_vconf_set(int is_visible)
+{
+ char *appid = NULL;
+ char value[BUFSZE] = { 0, };
+
+ Evas_Object *shortcut_layout = _shortcut_layout_get(NULL);
+ ret_if(shortcut_layout == NULL);
+
+ if ((appid = _shortcut_icon_owner_get(shortcut_layout)) == NULL) {
+ _E("Failed to get appid");
+ }
+
+ if (is_visible) {
+ snprintf(value, sizeof(value), "%s;%s", appid, MUSIC_STATUS_PLAY);
+ } else {
+ snprintf(value, sizeof(value), "%s;%s", appid, MUSIC_STATUS_STOP);
+ }
+
+ if (vconf_set_str(VCONFKEY_MUSIC_STATUS, value) != 0) {
+ _E("Failed to set the vconfkey, %s", value);
+ }
+}
+
+static void _shortcut_layout_visible_set(Evas_Object *shortcut_layout, int is_visible)
+{
+ if (is_visible == 1) {
+ elm_object_signal_emit(shortcut_layout, "icon,show", "prog");
+ _D("clock shortcut become visible");
+ } else {
+ elm_object_signal_emit(shortcut_layout, "icon,hide", "prog");
+ _D("clock shortcut become invisible");
+ }
+}
+
+static void _shortcut_layout_clicked_cb(void *cbdata, Evas_Object *obj, void *event_info)
+{
+ int pid = 0;
+ int app_type = APP_TYPE_NATIVE;
+ bundle *b = NULL;
+ Evas_Object *shortcut_layout = cbdata;
+ ret_if(shortcut_layout == NULL);
+
+ Evas_Object *icon = elm_object_part_content_get(shortcut_layout, "shortcut,icon");
+ ret_if(icon == NULL);
+
+ char *owner_appid = (char *)evas_object_data_get(icon, CLOCK_SHORTCUT_DATA_KEY_APPID);
+ ret_if(owner_appid == NULL);
+
+ app_type = util_get_app_type(owner_appid);
+
+ if (app_type == APP_TYPE_NATIVE) {
+ b = bundle_create();
+ if (b != NULL) {
+ bundle_add(b, "__APP_SVC_OP_TYPE__", APP_CONTROL_OPERATION_MAIN);
+
+ pid = aul_launch_app(owner_appid, b);
+ _D("aul_launch_app: %s(%d)", owner_appid, pid);
+
+ bundle_free(b);
+ }
+ } else if (app_type == APP_TYPE_WEB) {
+ pid = aul_open_app(owner_appid);
+ }
+
+ if (pid < 0) {
+ _E("Failed to launch %s(%d)", owner_appid, pid);
+ }
+
+ effect_play_sound();
+}
+
+static char *_access_info_cb(void *data, Evas_Object *obj)
+{
+ Evas_Object *shortcut_layout = data;
+ retv_if(shortcut_layout == NULL, NULL);
+
+ Evas_Object *icon = elm_object_part_content_get(shortcut_layout, "shortcut,icon");
+ retv_if(icon == NULL, NULL);
+
+ char *owner_appid = (char *)evas_object_data_get(icon, CLOCK_SHORTCUT_DATA_KEY_APPID);
+ retv_if(owner_appid == NULL, NULL);
+
+ char *name = _get_app_name(owner_appid);
+ if (name == NULL) {
+ return strdup(owner_appid);
+ }
+
+ return name;
+}
+
+static void _shortcut_layout_create(Evas_Object *clock_layout)
+{
+ _D("");
+ Evas_Object *shortcut_layout = NULL;
+ ret_if(clock_layout == NULL);
+
+ shortcut_layout = elm_layout_add(clock_layout);
+ ret_if(shortcut_layout == NULL);
+
+ if (elm_layout_file_set(shortcut_layout, CLOCK_SHORTCUT_EDJ_FILE, "shortcut") == EINA_TRUE) {
+ evas_object_size_hint_weight_set(clock_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_part_content_set(clock_layout, "shortcut", shortcut_layout);
+
+ Evas_Object *focus = elm_button_add(shortcut_layout);
+ if (focus != NULL) {
+ elm_object_style_set(focus, "focus");
+ elm_access_info_cb_set(focus, ELM_ACCESS_INFO, _access_info_cb, shortcut_layout);
+ evas_object_smart_callback_add(focus, "clicked",
+ _shortcut_layout_clicked_cb, shortcut_layout);
+ elm_object_part_content_set(shortcut_layout, "focus", focus);
+ }
+ evas_object_show(clock_layout);
+ } else {
+ _E("Failed to add shortcut layout");
+ }
+}
+
+static void _shortcut_layout_destroy(Evas_Object *clock_layout)
+{
+ ret_if(clock_layout == NULL);
+
+ Evas_Object *obj = elm_object_part_content_unset(clock_layout, "shortcut");
+ ret_if(obj == NULL);
+
+ evas_object_del(obj);
+}
+
+static Evas_Object *_shortcut_add(Evas_Object *page, shortcut_info_s *info)
+{
+ retv_if(info == NULL, NULL);
+ retv_if(info->appid == NULL, NULL);
+ Evas_Object *shortcut_layout = _shortcut_layout_get(page);
+ retv_if(shortcut_layout == NULL, NULL);
+
+ Evas_Object *icon = _shortcut_icon_create(shortcut_layout, info->icon);
+ if (icon != NULL) {
+ evas_object_data_set(icon, CLOCK_SHORTCUT_DATA_KEY_APPID, strdup(info->appid));
+ evas_object_event_callback_add(icon, EVAS_CALLBACK_DEL,
+ _shortcut_icon_del_cb, shortcut_layout);
+ _shortcut_layout_icon_set(shortcut_layout, icon);
+ _shortcut_layout_vconf_set(1);
+ _shortcut_layout_visible_set(shortcut_layout, 1);
+
+ return icon;
+ }
+
+ return NULL;
+}
+
+static void _clock_shortcut_message_received_cb(int local_port_id, const char *remote_app_id, const char *remote_port, bool trusted_port, bundle* msg, void *user_data)
+{
+ const char *state = NULL;
+ const char *icon_path = NULL;
+ ret_if(remote_app_id == NULL);
+ ret_if(msg == NULL);
+ Evas_Object *shortcut_layout = _shortcut_layout_get(NULL);
+ ret_if(shortcut_layout == NULL);
+
+ state = bundle_get_val(msg, CLOCK_SHORTCUT_MESSAGE_KEY_STATE);
+ ret_if(state == NULL);
+ icon_path = bundle_get_val(msg, CLOCK_SHORTCUT_MESSAGE_KEY_ICON);
+
+ _W("%s %s %s", remote_app_id, state, icon_path);
+
+ shortcut_info_s *info = NULL;
+
+ if (strcmp(state, CLOCK_SHORTCUT_MESSAGE_STATE_SHOW) == 0) {
+ info = (shortcut_info_s *)calloc(1, sizeof(shortcut_info_s));
+ ret_if(!info);
+ info->appid = strdup(remote_app_id);
+ goto_if(!info->appid, ERROR);
+ if (icon_path != NULL) {
+ info->icon = strdup(icon_path);
+ goto_if(!info->icon, ERROR);
+ }
+ if (_list_info_get(remote_app_id) == NULL) {
+ _list_info_add(info);
+ _shortcut_add(NULL, _list_lastest_info_get());
+ } else {
+ goto ERROR;
+ }
+ } else {
+ if (_shortcut_icon_is_owner_same(shortcut_layout, remote_app_id) == 1) {
+ _shortcut_layout_vconf_set(0);
+ _shortcut_layout_visible_set(shortcut_layout, 0);
+ }
+ _list_info_del(_list_info_get(remote_app_id));
+ }
+ return;
+
+ERROR:
+ if (info->icon) free(info->icon);
+ if (info->appid) free(info->appid);
+ if (info) free(info);
+}
+
+static void _mp_state_vconf_changed_cb(keynode_t *node, void *data)
+{
+ Evas_Object *shortcut_layout = _shortcut_layout_get(data);
+ ret_if(shortcut_layout == NULL);
+
+ shortcut_info_s *info = NULL;
+
+ if (_mp_state_get() == 1) {
+ info = (shortcut_info_s *)calloc(1, sizeof(shortcut_info_s));
+ ret_if(!info);
+ info->appid = strdup(MUSIC_PLAYER_APPID);
+ goto_if(!info->appid, ERROR);
+ info->icon = NULL;
+ if (_list_info_get(MUSIC_PLAYER_APPID) == NULL) {
+ _list_info_add(info);
+ _shortcut_add(data, _list_lastest_info_get());
+ } else {
+ goto ERROR;
+ }
+ } else {
+ if (_shortcut_icon_is_owner_same(shortcut_layout, MUSIC_PLAYER_APPID) == 1) {
+ _shortcut_layout_vconf_set(0);
+ _shortcut_layout_visible_set(shortcut_layout, 0);
+ }
+ _list_info_del(_list_info_get(MUSIC_PLAYER_APPID));
+ }
+ return;
+
+ERROR:
+ if (info->appid) free(info->appid);
+ if (info) free(info);
+ return;
+}
+
+HAPI void clock_shortcut_view_add(Evas_Object *page)
+{
+ ret_if(page == NULL);
+
+ Evas_Object *clock_layout = page_get_item(page);
+
+ _shortcut_layout_destroy(clock_layout);
+ _shortcut_layout_create(clock_layout);
+
+ shortcut_info_s *info = NULL;
+ if (_mp_state_get() == 1) {
+ info = (shortcut_info_s *)calloc(1, sizeof(shortcut_info_s));
+ ret_if (!info);
+ info->appid = strdup(MUSIC_PLAYER_APPID);
+ goto_if(!info->appid, ERROR);
+ info->icon = NULL;
+ if (_list_info_get(MUSIC_PLAYER_APPID) == NULL) {
+ _list_info_add(info);
+ } else {
+ goto ERROR;
+ }
+ }
+
+ info = _list_lastest_info_get();
+ if (info != NULL) {
+ _shortcut_add(page, info);
+ }
+ return;
+
+ERROR:
+ if (info->appid) free(info->appid);
+ if (info) free(info);
+ return;
+}
+
+HAPI void clock_shortcut_init(void)
+{
+ int port_id = 0;
+
+ if(vconf_notify_key_changed(MUSIC_PLAYER_VCONF_STATE, _mp_state_vconf_changed_cb, NULL) < 0) {
+ _E("Failed to register the music player state vconf cb");
+ }
+
+ if (s_info.local_port_id < 0) {
+ if ((port_id = message_port_register_local_port(CLOCK_SHORTCUT_MESSAGE_PORT_ID,
+ _clock_shortcut_message_received_cb, NULL)) <= 0) {
+ _E("Failed to register clock shortcut message port cb");
+ }
+ _E("port_id:%d", port_id);
+ s_info.local_port_id = port_id;
+ }
+}
+
+HAPI void clock_shortcut_fini(void)
+{
+ if(vconf_notify_key_changed(MUSIC_PLAYER_VCONF_STATE, _mp_state_vconf_changed_cb, NULL) < 0) {
+ _E("Failed to unregister the music player state vconf cb");
+ }
+
+ if (s_info.local_port_id >= 0) {
+ if (message_port_unregister_local_port(s_info.local_port_id) != MESSAGE_PORT_ERROR_NONE) {
+ _E("Failed to unregister clock shortcut message port cb");
+ }
+ }
+
+ _list_clean();
+}
+
+HAPI void clock_shortcut_app_dead_cb(int pid)
+{
+ char *appid = NULL;
+ Evas_Object *shortcut_layout = _shortcut_layout_get(NULL);
+ ret_if(shortcut_layout == NULL);
+
+ if ((appid = _shortcut_icon_owner_get(shortcut_layout)) != NULL) {
+ if (aul_app_is_running(appid) <= 0) {
+ _E("%s is dead, hiding shortcut", appid);
+ _shortcut_layout_vconf_set(0);
+ _shortcut_layout_visible_set(shortcut_layout, 0);
+ _list_info_del(_list_info_get(appid));
+ }
+ }
+}
diff --git a/home/src/clock_util.c b/home/src/clock_util.c
new file mode 100755
index 0000000..8504ee9
--- /dev/null
+++ b/home/src/clock_util.c
@@ -0,0 +1,248 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <aul.h>
+#include <pkgmgr-info.h>
+#include <vconf.h>
+#include <dlog.h>
+#include <efl_assist.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "dbus.h"
+#include "clock_service.h"
+
+#define CLOCK_LAUNCH_WAITING_TERMINATE_TIME 3.0
+#define CLOCK_LAUNCH_RETRY_COUNT_NATIVE 10
+#define CLOCK_LAUNCH_RETRY_COUNT_WEBAPP 20
+#define CLOCK_LAUNCH_RETRY_DELAY 100000
+
+extern int aul_kill_pid(int pid);
+
+static int _app_kill_by_pid(int pid)
+{
+ int ret = aul_kill_pid(pid);
+
+ _D("app kill pid:%d(ret:%d)", pid, ret);
+
+ return ret;
+}
+
+static int _app_terminate_by_pid(int pid)
+{
+ int ret = aul_terminate_pid(pid);
+
+ _D("app terminate pid:%d(ret:%d)", pid, ret);
+
+ return ret;
+}
+
+
+
+static int _clock_launch(char *appid, int *pid_a, int *pkgtype_a, int conf)
+{
+ _D("%s", __func__);
+ int i = 0, pid = 0;
+ int ret = W_HOME_ERROR_FAIL;
+ retv_if(appid == NULL, ret);
+
+ int pkgtype = util_get_app_type(appid);
+
+ if (pkgtype == APP_TYPE_WEB) {
+ _D("Webapp clock:%s", appid);
+ for (i = 0; i < CLOCK_LAUNCH_RETRY_COUNT_WEBAPP; i++) {
+ home_dbus_cpu_booster_signal_send();
+ pid = aul_open_app(appid);
+ _E("[retry] aul_open_app : %s(%d) - %d", appid, pid, i);
+ if (pid >= AUL_R_OK) {
+ ret = W_HOME_ERROR_NONE;
+ break;
+ }
+ usleep(CLOCK_LAUNCH_RETRY_DELAY);
+ }
+ } else if (pkgtype == APP_TYPE_NATIVE) {
+ _D("App clock:%s", appid);
+ bundle *b = bundle_create();
+ if (b != NULL) {
+ bundle_add(b, "__APP_SVC_OP_TYPE__", APP_CONTROL_OPERATION_MAIN);
+ clock_util_setting_conf_bundle_add(b, conf);
+
+ home_dbus_cpu_booster_signal_send();
+ pid = aul_launch_app((const char *)appid, b);
+ _D("aul_launch_app[%d] : %s(%d)", pkgtype, appid, pid);
+
+ if (pid == AUL_R_ECOMM || pid == AUL_R_ETERMINATING) {
+ for (i = 0; i < CLOCK_LAUNCH_RETRY_COUNT_NATIVE; i++) {
+ home_dbus_cpu_booster_signal_send();
+ pid = aul_launch_app(appid, b);
+ _E("[retry] aul_launch_app : %s(%d) - %d", appid, pid, i);
+ if (pid >= AUL_R_OK) {
+ ret = W_HOME_ERROR_NONE;
+ break;
+ }
+ usleep(CLOCK_LAUNCH_RETRY_DELAY);
+ }
+ } else if (pid < AUL_R_OK) {
+ _E("Failed to launch APP : %s(%d)", appid, pid);
+ } else {
+ ret = W_HOME_ERROR_NONE;
+ }
+
+ bundle_free(b);
+ } else {
+ _E("failed to create a bundle");
+ }
+ } else {
+ _E("invalid package type:%d", pkgtype);
+ }
+
+ if (pid_a != NULL) {
+ *pid_a = pid;
+ }
+
+ if (pkgtype_a != NULL) {
+ *pkgtype_a = pkgtype;
+ }
+
+ return ret;
+}
+
+HAPI char *clock_util_wms_configuration_get(void)
+{
+ return vconf_get_str(VCONFKEY_WMS_CLOCKS_SET_IDLE);
+}
+
+HAPI int clock_util_wms_configuration_set(const char *pkgname)
+{
+ int ret = 0;
+ retv_if(pkgname == NULL, W_HOME_ERROR_FAIL);
+
+ if ((ret = vconf_set_str(VCONFKEY_WMS_CLOCKS_SET_IDLE, pkgname)) != 0) {
+ _E("Failed to set %s:%d", VCONFKEY_WMS_CLOCKS_SET_IDLE, ret);
+ return W_HOME_ERROR_FAIL;
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+HAPI int clock_util_provider_launch(const char *clock_pkgname, int *pid_a, int conf)
+{
+ int pid = 0;
+ int ret = W_HOME_ERROR_FAIL;
+ char *appid = NULL;
+ retv_if(clock_pkgname == NULL, W_HOME_ERROR_FAIL);
+
+ appid = util_get_appid_by_pkgname(clock_pkgname);
+ ret = _clock_launch(appid, &pid, NULL, conf);
+ free(appid);
+
+ if (ret == W_HOME_ERROR_FAIL) {
+ _E("Launching app pid:%d(%d)", pid, ret);
+ if (strncmp(clock_pkgname, CLOCK_APP_RECOVERY, strlen(clock_pkgname)) != 0) {
+ _E("try to recovery: %s", clock_pkgname);
+ clock_util_wms_configuration_set(CLOCK_APP_RECOVERY);
+ } else {
+ _E("It's already set to recovery clock, give up");
+ }
+ }
+
+ if (pid_a != NULL) {
+ *pid_a = pid;
+ }
+
+ return ret;
+}
+
+static Eina_Bool _clock_service_terminate_timeout_cb(void *data)
+{
+ int pid = (int)data;
+
+ if (pid > 0) {
+ _app_kill_by_pid(pid);
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+HAPI void clock_util_terminate_clock_by_pid(int pid)
+{
+ if (_app_terminate_by_pid(pid) != AUL_R_OK) {
+ if (_app_kill_by_pid(pid) != AUL_R_OK) {
+ _E("Failed to terminate clock, we will kill it(%d) after %d seconds",
+ pid, CLOCK_LAUNCH_WAITING_TERMINATE_TIME);
+ ecore_timer_add(CLOCK_LAUNCH_WAITING_TERMINATE_TIME,
+ _clock_service_terminate_timeout_cb, (void *)pid);
+ }
+ }
+}
+
+HAPI int clock_util_screen_reader_enabled_get(void)
+{
+ int val = 0;
+
+ if (vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &val) == 0) {
+ return val;
+ }
+
+ return 0;
+}
+
+#define VCONFKEY_CLOCK_SETTING_CONF_KEY "db/setting/idle_clock_show"
+HAPI int clock_util_setting_conf_get(void)
+{
+ int ret = 0;
+ int val = 0;
+
+ if ((ret = vconf_get_int(VCONFKEY_CLOCK_SETTING_CONF_KEY, &val)) < 0) {
+ _E("Failed to get %s(%d)", VCONFKEY_CLOCK_SETTING_CONF_KEY, ret);
+ }
+
+ return val;
+}
+
+HAPI void clock_util_setting_conf_set(int value)
+{
+ int ret = 0;
+
+ if ((ret = vconf_set_int(VCONFKEY_CLOCK_SETTING_CONF_KEY, value)) < 0) {
+ _E("Failed to set %s(%d)", VCONFKEY_CLOCK_SETTING_CONF_KEY, ret);
+ }
+}
+
+HAPI void clock_util_setting_conf_bundle_add(bundle *b, int type)
+{
+ ret_if(b == NULL);
+
+ if (type == CLOCK_CONF_CLOCK_CONFIGURATION) {
+ bundle_add(b, "view_type", "setting");
+ }
+}
+
+HAPI const char *clock_util_setting_conf_content(int type)
+{
+ if (type == CLOCK_CONF_CLOCK_CONFIGURATION) {
+ return "view_type=setting;";
+ }
+
+ return NULL;
+}
+
diff --git a/home/src/clock_view.c b/home/src/clock_view.c
new file mode 100755
index 0000000..9ab3d21
--- /dev/null
+++ b/home/src/clock_view.c
@@ -0,0 +1,926 @@
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+#include <vconf.h>
+#include <bundle.h>
+#include <aul.h>
+#include <efl_assist.h>
+#include <dlog.h>
+#include <appcore-common.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "page.h"
+#include "key.h"
+#include "effect.h"
+#include "dbus.h"
+#include "tutorial.h"
+#include "clock_service.h"
+#include "apps/apps_main.h"
+
+#define CLOCK_PRIVATE_DATA_KEY_VISIBILITY "cl_p_v_d_v"
+#define CLOCK_PRIVATE_DATA_KEY_HIDDEN_BUTTON "cl_p_c_hb"
+#define CLOCK_PRIVATE_DATA_KEY_HIDDEN_BUTTON_DISPLAY_STATE "cl_p_c_hb_ds_st"
+#define CLOCK_PRIVATE_DATA_KEY_DOWN_X "cl_p_c_d_x"
+#define CLOCK_PRIVATE_DATA_KEY_DOWN_Y "cl_p_c_d_y"
+#define CLOCK_PRIVATE_DATA_KEY_DISPLAY_CUE "cl_p_c_di_cu"
+#define CLOCK_PRIVATE_DATA_KEY_HIDING_TIMER "cl_p_c_hi_ti"
+
+#define DRAWER_HIDING_TIME 3.0f
+
+struct evet_handler_s {
+ int event;
+ void (*process) (Evas_Object *, int , void *data);
+};
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+static void _mouse_flickup_cb(void *data, Evas_Object *scroller, void *event_info);
+#endif
+static void _drawer_hide(Evas_Object *page, int is_show);
+
+static Evas_Object *_layout_get(void)
+{
+ Evas_Object *win = main_get_info()->win;
+ retv_if(win == NULL, NULL);
+
+ return evas_object_data_get(win, DATA_KEY_LAYOUT);
+}
+
+static Evas_Object *_scroller_get(void)
+{
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ if (layout != NULL) {
+ scroller = elm_object_part_content_get(layout, "scroller");
+ }
+ }
+
+ return scroller;
+}
+
+void clock_view_indicator_show(int is_show)
+{
+ int pid = 0;
+ bundle *b = bundle_create();
+ if (b != NULL) {
+ if (is_show >= INDICATOR_SHOW) {
+ bundle_add(b, "__WINDICATOR_OP__", "__SHOW_MOMENT_VIEW__");
+ if(is_show == INDICATOR_SHOW_WITH_EFFECT) {
+ bundle_add(b, "__EFFECT__", "ON");
+ }
+ } else {
+ bundle_add(b, "__WINDICATOR_OP__", "__HIDE_MOMENT_VIEW__");
+ if(is_show == INDICATOR_HIDE_WITH_EFFECT) {
+ bundle_add(b, "__EFFECT__", "ON");
+ }
+ }
+
+ pid = aul_launch_app("org.tizen.windicator", b);
+ _D("aul_launch_app: %s(%d)", "org.tizen.windicator", pid);
+ }
+}
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+static void _drawer_hiding_timer_del(Evas_Object *page)
+{
+ Ecore_Timer *tm = evas_object_data_del(page, CLOCK_PRIVATE_DATA_KEY_HIDING_TIMER);
+ if (tm != NULL) {
+ ecore_timer_del(tm);
+ }
+}
+
+Eina_Bool _drawer_hiding_timer_cb(void *data)
+{
+ Evas_Object *page = data;
+ retv_if(page == NULL, ECORE_CALLBACK_CANCEL);
+
+ _drawer_hiding_timer_del(page);
+ _drawer_hide(page, INDICATOR_HIDE);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+void _drawer_hiding_timer_set(Evas_Object *page)
+{
+ ret_if(page == NULL);
+
+ _drawer_hiding_timer_del(page);
+
+ Ecore_Timer *tm = ecore_timer_add(DRAWER_HIDING_TIME, _drawer_hiding_timer_cb, page);
+ evas_object_data_set(page, CLOCK_PRIVATE_DATA_KEY_HIDING_TIMER, tm);
+}
+
+static int _is_drawer_displayed(Evas_Object *page)
+{
+ retv_if(page == NULL, 0);
+
+ return (int)evas_object_data_get(page, CLOCK_PRIVATE_DATA_KEY_HIDDEN_BUTTON);
+}
+
+static void _drawer_displayed_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Evas_Object *page = data;
+ ret_if(page == NULL);
+
+ evas_object_data_set(page, CLOCK_PRIVATE_DATA_KEY_HIDDEN_BUTTON_DISPLAY_STATE, (void*)1);
+}
+
+static void _drawer_hided_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Evas_Object *page = data;
+ ret_if(page == NULL);
+
+ evas_object_data_del(page, CLOCK_PRIVATE_DATA_KEY_HIDDEN_BUTTON_DISPLAY_STATE);
+}
+#endif
+
+static void _drawer_show(Evas_Object *page, int indicator_show)
+{
+ ret_if(page == NULL);
+ Evas_Object *item = page_get_item(page);
+ ret_if(item == NULL);
+ Evas_Object *layout = _layout_get();
+ ret_if(layout == NULL);
+
+#ifdef ENABLE_INDICATOR_BRIEFING_VIEW
+ clock_view_indicator_show(indicator_show);
+#else
+ if (clock_service_event_state_get(CLOCK_EVENT_SIM) == CLOCK_EVENT_SIM_NOT_INSERTED) {
+ elm_object_signal_emit(item , "hidden.show.short", "clock_bg");
+ } else {
+ elm_object_signal_emit(item , "hidden.show", "clock_bg");
+ }
+ evas_object_data_set(page, CLOCK_PRIVATE_DATA_KEY_HIDDEN_BUTTON, (void*)1);
+ evas_object_smart_callback_del(layout, LAYOUT_SMART_SIGNAL_FLICK_UP, _mouse_flickup_cb);
+ evas_object_smart_callback_add(layout, LAYOUT_SMART_SIGNAL_FLICK_UP, _mouse_flickup_cb, page);
+ clock_view_indicator_show(indicator_show);
+
+ if (util_feature_enabled_get(FEATURE_CLOCK_HIDDEN_BUTTON_TIMER) == 1) {
+ _drawer_hiding_timer_set(page);
+ }
+ clock_view_hidden_event_handler(page, CLOCK_EVENT_VIEW_HIDDEN_SHOW);
+#endif
+}
+
+static void _drawer_hide(Evas_Object *page, int indicator_show)
+{
+ ret_if(page == NULL);
+ Evas_Object *item = page_get_item(page);
+ ret_if(item == NULL);
+ Evas_Object *layout = _layout_get();
+ ret_if(layout == NULL);
+
+#ifdef ENABLE_INDICATOR_BRIEFING_VIEW
+ clock_view_indicator_show(indicator_show);
+#else
+ evas_object_data_del(page, CLOCK_PRIVATE_DATA_KEY_HIDDEN_BUTTON);
+ evas_object_smart_callback_del(layout, LAYOUT_SMART_SIGNAL_FLICK_UP, _mouse_flickup_cb);
+ elm_object_signal_emit(item , "hidden.hide", "clock_bg");
+ clock_view_indicator_show(indicator_show);
+ _drawer_hiding_timer_del(page);
+ clock_view_hidden_event_handler(page, CLOCK_EVENT_VIEW_HIDDEN_HIDE);
+#endif
+}
+
+static void _screen_reader_enable_set(Evas_Object *page, int is_on)
+{
+ ret_if(page == NULL);
+ Evas_Object *item = page_get_item(page);
+ ret_if(item == NULL);
+
+ if (is_on == 1) {
+ elm_object_signal_emit(item, "screenreader,on", "clock_bg");
+ if (util_feature_enabled_get(FEATURE_APPS) == 1) {
+ elm_object_signal_emit(item, "screenreader,apps,on", "clock_bg");
+ }
+ } else {
+ elm_object_signal_emit(item, "screenreader,off", "clock_bg");
+ elm_object_signal_emit(item, "screenreader,apps,off", "clock_bg");
+ }
+}
+
+static int _visibility_get(Evas_Object *page)
+{
+ retv_if(page == NULL, 0);
+
+ return (int)evas_object_data_get(page, CLOCK_PRIVATE_DATA_KEY_VISIBILITY);
+}
+
+static void _visibility_set(Evas_Object *page, int visibility)
+{
+ ret_if(page == NULL);
+
+ evas_object_data_set(page, CLOCK_PRIVATE_DATA_KEY_VISIBILITY, (void *)visibility);
+}
+
+
+static void _visibility_vconf_set(int visibility)
+{
+ if (main_get_info()->state == APP_STATE_PAUSE) {
+ visibility = 0;
+ }
+}
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+static void _mouse_flickup_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ _D("flickup");
+ Evas_Object *page = data;
+ ret_if(page == NULL);
+
+ if (_is_drawer_displayed(page) == 1) {
+ _drawer_hide(page, INDICATOR_HIDE);
+ }
+}
+
+static void _mouse_down_cb(void *data, Evas * evas, Evas_Object * obj, void *event_info)
+{
+ Evas_Object *page = obj;
+ Evas_Object *layout = data;
+ Evas_Event_Mouse_Down *ev = event_info;
+ ret_if(page == NULL);
+ ret_if(layout == NULL);
+ ret_if(ev == NULL);
+
+ if (_is_drawer_displayed(page) == 1) {
+ Evas_Object *drawer = elm_object_part_content_get(layout, "hidden_item");
+ if (drawer != NULL) {
+ int drawer_y = 0;
+ int drawer_h = 0;
+ evas_object_geometry_get(drawer, NULL, &drawer_y, NULL, &drawer_h);
+
+ if (ev->canvas.y > (drawer_h + drawer_y)) {
+ _drawer_hide(page, INDICATOR_HIDE);
+ } else {
+ if (util_feature_enabled_get(FEATURE_CLOCK_HIDDEN_BUTTON_TIMER) == 1) {
+ _drawer_hiding_timer_set(page);
+ }
+ }
+ }
+ }
+}
+#endif
+
+static void _mouse_up_cb(void *data, Evas * evas, Evas_Object * obj, void *event_info)
+{
+ Evas_Object *page = obj;
+ Evas_Event_Mouse_Up *ev = event_info;
+ ret_if(page == NULL);
+ ret_if(ev == NULL);
+
+ if ((int)evas_object_data_get(page, DATA_KEY_PAGE_ONHOLD_COUNT) == 1) {
+ evas_object_data_del(page, DATA_KEY_PAGE_ONHOLD_COUNT);
+ ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+ _E("event onhold flag set on clock page");
+ }
+}
+
+static void _mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ static int is_first_call = -1;
+ int x = 0, visibility = 0;
+ int win_w = 0;
+ Evas_Object *page = obj;
+ Evas_Object *item = page_get_item(obj);
+ ret_if(page == NULL);
+ ret_if(item == NULL);
+
+ if (is_first_call == -1) {
+ Evas_Object *scroller = _scroller_get();
+ if (scroller != NULL) {
+ scroller_region_show_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT);
+ }
+ is_first_call = 1;
+ }
+
+ if (obj != NULL) {
+ win_w = main_get_info()->root_w;
+ evas_object_geometry_get(obj, &x, NULL, NULL, NULL);
+
+ if ((x >= 0 && x < win_w) || (x <= 0 && x > -win_w)) {
+ visibility = 1;
+ } else {
+ visibility = 0;
+ }
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ if(x >= 10 || x <= -10) {
+ if (_is_drawer_displayed(page) == 1) {
+ _drawer_hide(page, INDICATOR_HIDE);
+ }
+ }
+#endif
+
+ if (_visibility_get(page) != visibility) {
+ _D("clock page:%p visibility changed:%s", obj, (visibility == 1) ? "show" : "hide");
+
+ _visibility_vconf_set(visibility);
+ _visibility_set(page, visibility);
+
+ if (clock_service_event_state_get(CLOCK_EVENT_DEVICE_LCD) == CLOCK_EVENT_DEVICE_LCD_OFF) {
+ visibility = 0;
+ return;
+ }
+ if (clock_service_event_state_get(CLOCK_EVENT_APP) == CLOCK_EVENT_APP_PAUSE) {
+ visibility = 0;
+ return;
+ }
+
+ if (visibility == 0) {
+ evas_object_smart_callback_call(page, CLOCK_SMART_SIGNAL_PAUSE, item);
+ } else if (visibility == 1) {
+ if (evas_object_data_get(page, CLOCK_PRIVATE_DATA_KEY_DISPLAY_CUE) != NULL) {
+ clock_view_cue_display_set(page, 1, 0);
+ evas_object_data_del(page, CLOCK_PRIVATE_DATA_KEY_DISPLAY_CUE);
+ }
+ evas_object_smart_callback_call(page, CLOCK_SMART_SIGNAL_RESUME, item);
+ }
+ }
+ }
+}
+
+static void _view_request_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int idx_request = (int)event_info;
+ Evas_Object *page = obj;
+
+ if (idx_request == CLOCK_VIEW_REQUEST_DRAWER_HIDE) {
+ _drawer_hide(page, INDICATOR_HIDE);
+ } else if (idx_request == CLOCK_VIEW_REQUEST_DRAWER_SHOW) {
+ _drawer_show(page, INDICATOR_SHOW);
+ }
+}
+
+static void _event_handler_view_resized(Evas_Object *page, int event, void *data)
+{
+ clock_h clock = data;
+ ret_if(data == NULL);
+
+ Evas_Object *layout = page_get_item(page);
+ ret_if(layout == NULL);
+
+ Evas_Object *item = elm_object_part_content_get(layout, "item");
+ ret_if(item == NULL);
+
+ evas_object_resize(item, clock->w, clock->h);
+ evas_object_size_hint_min_set(item, clock->w, clock->h);
+ evas_object_size_hint_max_set(item, clock->w, clock->h);
+}
+
+static void _event_handler_app_state(Evas_Object *page, int event, void *data)
+{
+ int visibility = 0;
+ Evas_Object *item = page_get_item(page);
+
+ visibility = _visibility_get(page);
+ _visibility_vconf_set(visibility);
+
+ if (event == CLOCK_EVENT_APP_RESUME) {
+ if (_visibility_get(page) == 0) {
+ evas_object_data_set(page, CLOCK_PRIVATE_DATA_KEY_DISPLAY_CUE, (void*)1);
+ } else {
+ clock_view_cue_display_set(page, 1, 0);
+ evas_object_smart_callback_call(page, CLOCK_SMART_SIGNAL_RESUME, item);
+ }
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ if (_is_drawer_displayed(page) == 1) {
+ if (tutorial_is_exist() == 1) {
+ clock_view_indicator_show(INDICATOR_SHOW);
+ }
+ }
+#endif
+ } else if (event == CLOCK_EVENT_APP_PAUSE) {
+ evas_object_smart_callback_call(page, CLOCK_SMART_SIGNAL_PAUSE, item);
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ if (_is_drawer_displayed(page) == 1) {
+ if (tutorial_is_exist() == 0) {
+ _drawer_hide(page, INDICATOR_HIDE);
+ } else {
+ clock_view_indicator_show(INDICATOR_HIDE);
+ }
+ }
+#endif
+ } else if (event == CLOCK_EVENT_APP_LANGUAGE_CHANGED) {
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ clock_view_hidden_event_handler(page, CLOCK_EVENT_APP_LANGUAGE_CHANGED);
+#endif
+ }
+}
+
+static void _event_handler_lcd(Evas_Object *page, int event, void *data)
+{
+ if (_visibility_get(page) == 1 && event == CLOCK_EVENT_DEVICE_LCD_ON) {
+ clock_view_cue_display_set(page, 1, 0);
+ evas_object_data_del(page, CLOCK_PRIVATE_DATA_KEY_DISPLAY_CUE);
+ } else if (event == CLOCK_EVENT_DEVICE_LCD_ON) {
+ evas_object_data_set(page, CLOCK_PRIVATE_DATA_KEY_DISPLAY_CUE, (void*)1);
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ if (_is_drawer_displayed(page) == 1) {
+ clock_view_indicator_show(INDICATOR_SHOW);
+ }
+#endif
+ } else if (event == CLOCK_EVENT_DEVICE_LCD_OFF) {
+ clock_view_cue_display_set(page, 0, 0);
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ if (_is_drawer_displayed(page) == 1) {
+ if (tutorial_is_exist() == 0) {
+ _drawer_hide(page, INDICATOR_HIDE);
+ } else {
+ clock_view_indicator_show(INDICATOR_HIDE);
+ }
+ }
+#endif
+ }
+}
+
+static void _event_handler_backkey(Evas_Object *page, int event, void *data)
+{
+ Evas_Object *scroller = _scroller_get();
+ ret_if(scroller == NULL);
+
+ int clock_visibility = _visibility_get(page);
+
+ if (clock_visibility == 0) {
+ _D("show a clock");
+ scroller_bring_in_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+ } else {
+ if (util_feature_enabled_get(FEATURE_CLOCK_HIDDEN_BUTTON) == 0) {
+ return;
+ }
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ _D("show a hidden button");
+ if (_is_drawer_displayed(page) == 1) {
+ return;
+ }
+#endif
+
+ _drawer_show(page, INDICATOR_SHOW);
+ }
+
+ return;
+}
+
+static void _event_handler_screen_reader(Evas_Object *page, int event, void *data)
+{
+ if (event == CLOCK_EVENT_SCREEN_READER_ON) {
+ _screen_reader_enable_set(page, 1);
+ } else if (event == CLOCK_EVENT_SCREEN_READER_OFF) {
+ _screen_reader_enable_set(page, 0);
+ }
+}
+
+static void _event_handler_modem_status(Evas_Object *page, int event, void *data)
+{
+ clock_view_indicator_event_handler(page, event);
+}
+
+static void _event_handler_blocking_status(Evas_Object *page, int event, void *data)
+{
+ clock_view_indicator_event_handler(page, event);
+}
+
+static void _event_handler_sim_status(Evas_Object *page, int event, void *data)
+{
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ clock_view_hidden_event_handler(page, event);
+#endif
+}
+
+static char *_access_info_clock_cb(void *data, Evas_Object *obj)
+{
+ int hour = 0;
+ int minutes = 0;
+ time_t tt;
+ struct tm st;
+ char buf[256] = {0,};
+
+ enum appcore_time_format timeformat = APPCORE_TIME_FORMAT_UNKNOWN;
+
+ tt = time(NULL);
+ localtime_r(&tt, &st);
+
+ if(appcore_get_timeformat(&timeformat) != 0) {
+ timeformat = APPCORE_TIME_FORMAT_24;
+ }
+
+ if(timeformat == APPCORE_TIME_FORMAT_24) {
+ hour = st.tm_hour;
+ minutes = st.tm_min;
+
+ snprintf(buf, sizeof(buf) - 1, _("IDS_LCKSCN_BODY_IT_IS_P1SD_CP2SD_T_TTS"), hour, minutes);
+ } else {
+ strftime(buf, sizeof(buf), "%l", &st);
+ hour = atoi(buf);
+ minutes = st.tm_min;
+
+ if(st.tm_hour >= 0 && st.tm_hour < 12) {
+ snprintf(buf, sizeof(buf) - 1, _("IDS_TTS_BODY_IT_IS_PD_CPD_AM"), hour, minutes);
+ } else {
+ snprintf(buf, sizeof(buf) - 1, _("IDS_TTS_BODY_IT_IS_PD_CPD_PM"), hour, minutes);
+ }
+ }
+
+ _D("TTS current time : %s", buf);
+
+ return strdup(buf);
+}
+
+static void _apps_clicked_cb(void *cbdata, Evas_Object *obj, void *event_info)
+{
+ if (util_feature_enabled_get(FEATURE_APPS) == 1) {
+ apps_main_launch(APPS_LAUNCH_SHOW);
+ }
+
+ effect_play_sound();
+}
+
+static char *_access_info_apps_cb(void *data, Evas_Object *obj)
+{
+ char *info = _("IDS_IDLE_BODY_APPS");
+
+ if (info != NULL) {
+ return strdup(info);
+ }
+
+ return NULL;
+}
+
+static char *_access_context_apps_cb(void *data, Evas_Object *obj)
+{
+ char *info = _("IDS_HELP_BODY_DOUBLE_TAP_TO_OPEN_APP_TRAY_TTS");
+
+ if (info != NULL) {
+ return strdup(info);;
+ }
+
+ return NULL;
+}
+
+static void _del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *page = obj;
+ Evas_Object *layout = data;
+ Evas_Object *obj_sub = NULL;
+ ret_if(page == NULL);
+ ret_if(layout == NULL);
+
+ /*
+ * clean-up event callback
+ */
+ evas_object_event_callback_del(page
+ , EVAS_CALLBACK_MOVE, _mouse_move_cb);
+ evas_object_event_callback_del(page
+ , EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb);
+ evas_object_smart_callback_del(page
+ , CLOCK_SMART_SIGNAL_VIEW_REQUEST, _view_request_cb);
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ evas_object_event_callback_del(page
+ , EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb);
+ evas_object_smart_callback_del(layout, LAYOUT_SMART_SIGNAL_FLICK_UP, _mouse_flickup_cb);
+ elm_object_signal_callback_del(layout, "drawer,displayed", "clock_bg", _drawer_displayed_cb);
+ elm_object_signal_callback_del(layout, "drawer,hided", "clock_bg", _drawer_hided_cb);
+#endif
+ clock_view_indicator_show(INDICATOR_HIDE);
+
+ obj_sub = elm_object_part_content_get(layout, "clock_bg");
+ if (obj_sub != NULL) {
+ evas_object_del(obj_sub);
+ }
+ obj_sub = elm_object_part_content_get(layout, "event_blocker");
+ if (obj_sub != NULL) {
+ evas_object_del(obj_sub);
+ }
+}
+
+Evas_Object *clock_view_add(Evas_Object *parent, Evas_Object *item)
+{
+ Eina_Bool ret = EINA_TRUE;
+ Evas_Object *page = NULL;
+ Evas_Object *layout = NULL;
+ Evas_Object *bg = NULL;
+ Evas_Object *evb = NULL;
+ retv_if(parent == NULL, NULL);
+
+ layout = elm_layout_add(parent);
+ goto_if(layout == NULL, ERR);
+ ret = elm_layout_file_set(layout, PAGE_CLOCK_EDJE_FILE, "clock_page");
+ goto_if(ret == EINA_FALSE, ERR);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(layout);
+
+ bg = evas_object_rectangle_add(main_get_info()->e);
+ goto_if(bg == NULL, ERR);
+ evas_object_size_hint_min_set(bg, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_size_hint_max_set(bg, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_color_set(bg, 0, 0, 0, 0);
+ evas_object_show(bg);
+ elm_object_part_content_set(layout, "clock_bg", bg);
+
+ evb = evas_object_rectangle_add(main_get_info()->e);
+ goto_if(evb == NULL, ERR);
+ evas_object_size_hint_min_set(evb, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_size_hint_weight_set(evb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_repeat_events_set(evb, 1);
+ evas_object_color_set(evb, 0, 0, 0, 0);
+ evas_object_show(evb);
+ elm_object_part_content_set(layout, "event_blocker", evb);
+
+ if (item != NULL) {
+ elm_access_object_unregister(item);
+ }
+
+ Evas_Object *focus_apps = elm_button_add(layout);
+ if (focus_apps != NULL) {
+ elm_object_style_set(focus_apps, "focus");
+ elm_access_info_cb_set(focus_apps, ELM_ACCESS_INFO, _access_info_apps_cb, NULL);
+ elm_access_info_cb_set(focus_apps, ELM_ACCESS_CONTEXT_INFO, _access_context_apps_cb, NULL);
+ evas_object_smart_callback_add(focus_apps, "clicked", _apps_clicked_cb, NULL);
+ elm_object_part_content_set(layout, "focus.bottom.cue", focus_apps);
+ }
+
+ if (item != NULL) {
+ elm_object_part_content_set(layout, "item", item);
+ }
+
+ page = page_create(parent
+ , layout
+ , NULL, NULL
+ , main_get_info()->root_w, main_get_info()->root_h
+ , PAGE_CHANGEABLE_BG_OFF, PAGE_REMOVABLE_OFF);
+ goto_if(page == NULL, ERR);
+
+ _visibility_set(page, 1);
+ _visibility_vconf_set(1);
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+#ifdef RUN_ON_DEVICE
+ Evas_Object *hidden_button = clock_view_hidden_add(page);
+ if (hidden_button != NULL) {
+ elm_object_part_content_set(layout, "hidden_item", hidden_button);
+ } else {
+ _E("Failed to add top hidden object");
+ }
+#endif
+#endif
+
+ Evas_Object *cue = clock_view_cue_add(page);
+ if (cue != NULL) {
+ elm_object_part_content_set(layout, "bottom_cue", cue);
+ } else {
+ _E("failed to add bottom cue");
+ }
+
+ clock_shortcut_view_add(page);
+ clock_view_indicator_add(page);
+
+ page_set_effect(page, page_effect_none, page_effect_none);
+ evas_object_event_callback_add(page
+ , EVAS_CALLBACK_DEL, _del_cb, layout);
+ evas_object_event_callback_add(page
+ , EVAS_CALLBACK_MOVE, _mouse_move_cb, layout);
+ evas_object_event_callback_add(page
+ , EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, layout);
+
+ evas_object_smart_callback_add(page
+ , CLOCK_SMART_SIGNAL_VIEW_REQUEST, _view_request_cb, layout);
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ evas_object_event_callback_add(page
+ , EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, layout);
+ elm_object_signal_callback_add(layout, "drawer,displayed", "clock_bg", _drawer_displayed_cb, page);
+ elm_object_signal_callback_add(layout, "drawer,hided", "clock_bg", _drawer_hided_cb, page);
+#endif
+
+ if (clock_service_event_state_get(CLOCK_EVENT_SCREEN_READER) == CLOCK_EVENT_SCREEN_READER_ON) {
+ _screen_reader_enable_set(page, 1);
+ } else {
+ _screen_reader_enable_set(page, 0);
+ }
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ clock_view_hidden_event_handler(page, clock_service_event_state_get(CLOCK_EVENT_POWER));
+#endif
+
+ clock_view_indicator_event_handler(page, CLOCK_EVENT_CATEGORY(CLOCK_EVENT_MODEM));
+
+ page_info_s *page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (page_info != NULL && page_info->focus != NULL) {
+ elm_access_info_cb_set(page_info->focus, ELM_ACCESS_INFO, _access_info_clock_cb, NULL);
+
+ elm_object_focus_next_object_set(page_info->focus, focus_apps, ELM_FOCUS_PREVIOUS);
+ elm_access_highlight_next_set(page_info->focus, ELM_HIGHLIGHT_DIR_PREVIOUS, focus_apps);
+
+ elm_object_focus_next_object_set(page_info->focus, focus_apps, ELM_FOCUS_NEXT);
+ elm_access_highlight_next_set(page_info->focus, ELM_HIGHLIGHT_DIR_NEXT, focus_apps);
+
+ elm_object_focus_next_object_set(focus_apps, page_info->focus, ELM_FOCUS_PREVIOUS);
+ elm_access_highlight_next_set(focus_apps, ELM_HIGHLIGHT_DIR_PREVIOUS, page_info->focus);
+
+ elm_object_focus_next_object_set(focus_apps, page_info->focus, ELM_FOCUS_NEXT);
+ elm_access_highlight_next_set(focus_apps, ELM_HIGHLIGHT_DIR_NEXT, page_info->focus);
+
+ page_info->focus_prev = focus_apps;
+ page_info->focus_next = focus_apps;
+ }
+
+ return page;
+
+ERR:
+ if (bg != NULL) evas_object_del(bg);
+ if (evb != NULL) evas_object_del(evb);
+ if (layout != NULL) evas_object_del(layout);
+
+ return NULL;
+}
+
+Evas_Object *clock_view_get_item(Evas_Object *view)
+{
+ Evas_Object *layout;
+ Evas_Object *item;
+
+ layout = page_get_item(view);
+ if (!layout) {
+ return NULL;
+ }
+
+ item = elm_object_part_content_get(layout, "item");
+ return item;
+}
+
+int clock_view_attach(Evas_Object *page)
+{
+ int ret = CLOCK_RET_FAIL;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(page == NULL, CLOCK_RET_FAIL);
+ retv_if(scroller == NULL, CLOCK_RET_FAIL);
+
+ page_info_s *page_info = NULL;
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(page_info == NULL, CLOCK_RET_FAIL);
+
+ if (scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER) == W_HOME_ERROR_NONE) {
+ ret = CLOCK_RET_OK;
+ }
+
+ if (clock_service_event_state_get(CLOCK_EVENT_SCREEN_READER) == CLOCK_EVENT_SCREEN_READER_ON) {
+ if (page_info->focus != NULL) {
+ elm_object_focus_set(page_info->focus, EINA_TRUE);
+ elm_access_highlight_set(page_info->focus);
+ }
+ }
+
+ return ret;
+}
+
+int clock_view_deattach(Evas_Object *page)
+{
+ Evas_Object *scroller = _scroller_get();
+ retv_if(page == NULL, CLOCK_RET_FAIL);
+ retv_if(scroller == NULL, CLOCK_RET_FAIL);
+
+ if (scroller_pop_page(scroller, page) != NULL) {
+ return CLOCK_RET_OK;
+ }
+
+ return CLOCK_RET_FAIL;
+}
+
+void clock_view_show(Evas_Object *page)
+{
+ Evas_Object *scroller = _scroller_get();
+ ret_if(page == NULL);
+ ret_if(scroller == NULL);
+
+ scroller_region_show_page(scroller, page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT);
+}
+
+Evas_Object *clock_view_empty_add(void)
+{
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NULL);
+
+ Evas_Object *page = clock_view_add(scroller, NULL);
+
+ return page;
+}
+
+void clock_view_event_handler(clock_h clock, int event, int need_relay)
+{
+ ret_if(clock == NULL);
+ Evas_Object *page = clock->view;
+
+ _D("event:%x received", event);
+
+ static struct evet_handler_s fn_table[] = {
+ {
+ .event = CLOCK_EVENT_VIEW_RESIZED,
+ .process = _event_handler_view_resized,
+ },
+ {
+ .event = CLOCK_EVENT_DEVICE_BACK_KEY,
+ .process = _event_handler_backkey,
+ },
+ {
+ .event = CLOCK_EVENT_DEVICE_LCD_ON,
+ .process = _event_handler_lcd,
+ },
+ {
+ .event = CLOCK_EVENT_DEVICE_LCD_OFF,
+ .process = _event_handler_lcd,
+ },
+ {
+ .event = CLOCK_EVENT_APP_PAUSE,
+ .process = _event_handler_app_state,
+ },
+ {
+ .event = CLOCK_EVENT_APP_RESUME,
+ .process = _event_handler_app_state,
+ },
+ {
+ .event = CLOCK_EVENT_APP_LANGUAGE_CHANGED,
+ .process = _event_handler_app_state,
+ },
+ {
+ .event = CLOCK_EVENT_SCREEN_READER_ON,
+ .process = _event_handler_screen_reader,
+ },
+ {
+ .event = CLOCK_EVENT_SCREEN_READER_OFF,
+ .process = _event_handler_screen_reader,
+ },
+ {
+ .event = CLOCK_EVENT_SAP_ON,
+ .process = _event_handler_modem_status,
+ },
+ {
+ .event = CLOCK_EVENT_SAP_OFF,
+ .process = _event_handler_modem_status,
+ },
+ {
+ .event = CLOCK_EVENT_MODEM_ON,
+ .process = _event_handler_modem_status,
+ },
+ {
+ .event = CLOCK_EVENT_MODEM_OFF,
+ .process = _event_handler_modem_status,
+ },
+ {
+ .event = CLOCK_EVENT_DND_ON,
+ .process = _event_handler_blocking_status,
+ },
+ {
+ .event = CLOCK_EVENT_DND_OFF,
+ .process = _event_handler_blocking_status,
+ },
+ {
+ .event = CLOCK_EVENT_SIM_INSERTED,
+ .process = _event_handler_sim_status,
+ },
+ {
+ .event = CLOCK_EVENT_SIM_NOT_INSERTED,
+ .process = _event_handler_sim_status,
+ },
+ {
+ .event = 0,
+ .process = NULL,
+ },
+ };
+ ret_if(page == NULL);
+
+ int i = 0;
+ for (i = 0; fn_table[i].process != NULL; i++) {
+ if (event == fn_table[i].event && fn_table[i].process != NULL) {
+ fn_table[i].process(page, fn_table[i].event, clock);
+ }
+ }
+}
+
+int clock_view_display_state_get(Evas_Object *page, int view_type)
+{
+ retv_if(page == NULL, 0);
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ if (view_type == CLOCK_VIEW_TYPE_DRAWER) {
+ if (evas_object_data_get(page, CLOCK_PRIVATE_DATA_KEY_HIDDEN_BUTTON_DISPLAY_STATE) != NULL) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+#endif
+
+ return 0;
+}
diff --git a/home/src/clock_view_cue.c b/home/src/clock_view_cue.c
new file mode 100644
index 0000000..7de2552
--- /dev/null
+++ b/home/src/clock_view_cue.c
@@ -0,0 +1,90 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+#include <vconf.h>
+#include <bundle.h>
+#include <aul.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "page.h"
+#include "scroller.h"
+#include "key.h"
+#include "effect.h"
+#include "clock_service.h"
+
+static Evas_Object *_cue_layout_add(Evas_Object *page)
+{
+ Eina_Bool ret = EINA_TRUE;
+ Evas_Object *item = page_get_item(page);
+ retv_if(item == NULL, NULL);
+
+ Evas_Object *layout = elm_layout_add(item);
+ retv_if(layout == NULL, NULL);
+ ret = elm_layout_file_set(layout, PAGE_CLOCK_EDJE_FILE, "bottom_cue");
+ retv_if(ret == EINA_FALSE, NULL);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(layout);
+
+ return layout;
+}
+
+HAPI Evas_Object *clock_view_cue_add(Evas_Object *page)
+{
+ Evas_Object *cue_layout = NULL;
+ retv_if(page == NULL, NULL);
+
+ cue_layout = _cue_layout_add(page);
+ retv_if(cue_layout == NULL, NULL);
+
+ return cue_layout;
+}
+
+HAPI void clock_view_cue_display_set(Evas_Object *page, int is_display, int is_need_vi)
+{
+ Evas_Object *item = NULL;
+ Evas_Object *cue = NULL;
+ ret_if(page == NULL);
+
+ _D("Cue for Apps, is_display:%d, is_need_vi:%d", is_display, is_need_vi);
+
+ if (util_feature_enabled_get(FEATURE_CLOCK_VISUAL_CUE) == 0 && is_display == 1) {
+ return;
+ }
+
+ item = page_get_item(page);
+ ret_if(item == NULL);
+
+ cue = elm_object_part_content_get(item, "bottom_cue");
+ ret_if(cue == NULL);
+
+ if (is_display == 1) {
+ elm_object_signal_emit(cue, "cue,enable", "prog");
+ } else {
+ elm_object_signal_emit(cue, "cue,disable", "prog");
+ }
+}
diff --git a/home/src/clock_view_hidden.c b/home/src/clock_view_hidden.c
new file mode 100755
index 0000000..5b8afd6
--- /dev/null
+++ b/home/src/clock_view_hidden.c
@@ -0,0 +1,506 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+#include <vconf.h>
+#include <bundle.h>
+#include <app.h>
+#include <aul.h>
+#include <efl_assist.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "page.h"
+#include "scroller.h"
+#include "key.h"
+#include "effect.h"
+#include "minictrl.h"
+#include "clock_service.h"
+#include "power_mode.h"
+#include "dbus.h"
+#include "tutorial.h"
+
+#define PRIVATE_DATA_KEY_VISIBLE "p_d_k_v"
+
+#ifdef RUN_ON_DEVICE
+
+#define VCONFKEY_CALL_FW_REQUEST_TYPE "db/ciss/request_type"
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+static Evas_Object *_hidden_layout_get(Evas_Object *page)
+{
+ retv_if(page == NULL, NULL);
+ Evas_Object *item = page_get_item(page);
+ retv_if(item == NULL, NULL);
+ Evas_Object *layout = elm_object_part_content_get(item, "hidden_item");
+
+ return layout;
+}
+#endif
+
+static int _is_blockingmode_enabled(void)
+{
+ int b_mode = 0;
+
+ if(vconf_get_bool(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, &b_mode) < 0) {
+ _E("Failed to get VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL:%s", VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL);
+ }
+
+ _D("b_mode : %d", b_mode);
+
+ if(b_mode) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+static int _is_flight_mode(void)
+{
+ int ret = 0;
+ int m_mode = VCONFKEY_TELEPHONY_MODEM_ALWAYS_OFF;
+
+ if((ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &m_mode)) < 0) {
+ _E("Failed to get VCONFKEY_TELEPHONY_FLIGHT_MODE:%s %d", VCONFKEY_TELEPHONY_FLIGHT_MODE, ret);
+ }
+
+ _D("m_mode : %d", m_mode);
+
+ return m_mode;
+}
+
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+static int _call_fwd_state_get(void)
+{
+ int ret = 0;
+ int m_mode = 0;
+
+ if((ret = vconf_get_int(VCONFKEY_CALL_FW_REQUEST_TYPE, &m_mode)) < 0) {
+ _E("Failed to get VCONFKEY_CALL_FW_REQUEST_TYPE:%s %d", VCONFKEY_CALL_FW_REQUEST_TYPE, ret);
+ }
+
+ _D("m_mode : %d", m_mode);
+
+ return m_mode;
+}
+#endif
+
+static void _text_update(Evas_Object *layout)
+{
+ Evas_Object *button = NULL;
+ ret_if(layout == NULL);
+
+ button = elm_object_part_content_get(layout, "button.1");
+ if (button != NULL) {
+ elm_object_part_text_set(button, "contents", _("IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB"));
+ }
+
+ button = elm_object_part_content_get(layout, "button.2");
+ if (button != NULL) {
+ elm_object_part_text_set(button, "name", _("IDS_ST_MBODY_DO_NOT_DISTURB_ABB"));
+ }
+}
+
+static void _status_update(Evas_Object *layout)
+{
+ ret_if(layout == NULL);
+
+ Evas_Object *button1 = elm_object_part_content_get(layout, "button.1");
+ if (button1 != NULL) {
+ if (_is_flight_mode() == 1) {
+ elm_object_signal_emit(button1, "icon,disable", "prog");
+ } else {
+ elm_object_signal_emit(button1, "icon,enable", "prog");
+ }
+ }
+
+ Evas_Object *button2 = elm_object_part_content_get(layout, "button.2");
+ if (button2 != NULL) {
+ if (_is_blockingmode_enabled() == 1) {
+ elm_object_signal_emit(button2, "icon,enable", "prog");
+ } else {
+ elm_object_signal_emit(button2, "icon,disable", "prog");
+ }
+ }
+
+ _text_update(layout);
+}
+
+static void _vconf_cb(keynode_t *node, void *data)
+{
+ _status_update((Evas_Object*)data);
+}
+
+#define CALLSETTING_APP "org.tizen.w-call-setting"
+#define CALLSETTING_KEY "type"
+#define CALLSETTING_VALUE "fwd_call"
+static void _icon_1_clicked_cb(void *cbdata, Evas_Object *obj, void *event_info)
+{
+ _D("");
+
+ effect_play_sound();
+
+ if (_is_flight_mode() == 1) {
+#if 0
+ Evas_Object *win = main_get_info()->win;
+ if (win != NULL) {
+ util_create_toast_popup(win,
+ "IDS_ST_TPOP_UNABLE_TO_TURN_ON_MOBILE_DATA_WHILE_FLIGHT_MODE_ENABLED_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN_ABB");
+ }
+#endif
+ return;
+ }
+
+ int ret = 0;
+ app_control_h ac = NULL;
+ if ((ret = app_control_create(&ac)) != APP_CONTROL_ERROR_NONE) {
+ _E("Failed to create app control:%d", ret);
+ }
+ ret_if(ac == NULL);
+
+ app_control_set_operation(ac, APP_CONTROL_OPERATION_VIEW);
+ app_control_set_app_id(ac, CALLSETTING_APP);
+ app_control_add_extra_data(ac, CALLSETTING_KEY, CALLSETTING_VALUE);
+ home_dbus_cpu_booster_signal_send();
+ if ((ret = app_control_send_launch_request(ac, NULL, NULL)) != APP_CONTROL_ERROR_NONE) {
+ _E("Failed to launch %s(%d)", CALLSETTING_APP, ret);
+ }
+ app_control_destroy(ac);
+}
+
+#define BLOCKINGMODE_APP "org.tizen.clocksetting.blockingmode"
+#define BLOCKINGMODE_KEY "viewtype"
+static void _icon_2_clicked_cb(void *cbdata, Evas_Object *obj, void *event_info)
+{
+ int ret = 0;
+
+ _D("blockingmode");
+ if (_is_blockingmode_enabled() == 1) {
+ if((ret = vconf_set_bool(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, 0)) < 0) {
+ _E("Failed to get VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL:%s %d", VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, ret);
+ }
+ } else {
+ if((ret = vconf_set_bool(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, 1)) < 0) {
+ _E("Failed to get VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL:%s %d", VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL, ret);
+ }
+ }
+
+#if 0 //TBD
+ app_control_h ac = NULL;
+ if ((ret = app_control_create(&ac)) != APP_CONTROL_ERROR_NONE) {
+ _E("Failed to create app control:%d", ret);
+ }
+ ret_if(ac == NULL);
+
+ app_control_set_operation(ac, APP_CONTROL_OPERATION_VIEW);
+ app_control_set_app_id(ac, BLOCKINGMODE_APP);
+ app_control_add_extra_data(ac, BLOCKINGMODE_KEY, value);
+ home_dbus_cpu_booster_signal_send();
+ if ((ret = app_control_send_launch_request(ac, NULL, NULL)) != APP_CONTROL_ERROR_NONE) {
+ _E("Failed to launch %s(%d)", BLOCKINGMODE_APP, ret);
+ }
+ app_control_destroy(ac);
+#endif
+
+ effect_play_sound();
+}
+
+static char *_button_2_access_info_cb(void *data, Evas_Object *obj)
+{
+ int index = (int)data;
+ char *info = NULL;
+
+ if (index == 1) {
+ info = _("IDS_ST_MBODY_DO_NOT_DISTURB_ABB");
+ }
+
+ if (info != NULL) {
+ return strdup(info);
+ }
+
+ return NULL;
+}
+
+static char *_button_2_access_state_cb(void *data, Evas_Object *obj)
+{
+ int index = (int)data;
+ char *state = NULL;
+ int is_enabled = 0;
+
+ if (index == 1) {
+ is_enabled = _is_blockingmode_enabled();
+ }
+ if (is_enabled == 1) {
+ state = _("IDS_COM_BODY_ON_M_STATUS");
+ } else {
+ state = _("IDS_COM_BODY_OFF_M_STATUS");
+ }
+
+ if (state) {
+ return strdup(state);
+ }
+
+ return NULL;
+
+}
+
+static char *_button_2_access_context_cb(void *data, Evas_Object *obj)
+{
+ int index = (int)data;
+ char *state = NULL;
+ int is_enabled = 0;
+
+ if (index == 1) {
+ is_enabled = _is_blockingmode_enabled();
+ }
+ if (is_enabled == 0) {
+ state = _("IDS_HS_BODY_DOUBLE_TAP_TO_ENABLE_TTS");
+ }
+
+ if (state) {
+ return strdup(state);
+ }
+
+ return NULL;
+}
+
+static char *_button_1_access_info_cb(void *data, Evas_Object *obj)
+{
+ int index = (int)data;
+ char *info = NULL;
+
+ if (index == 1) {
+ info = _("IDS_CST_OPT_FWD_CALLS_TO_GEAR_ABB");
+ }
+
+ if (info != NULL) {
+ return strdup(info);
+ }
+
+ return NULL;
+}
+
+static Evas_Object *_view_create(Evas_Object *page)
+{
+ Evas_Object *focus = NULL;
+ Eina_Bool ret = EINA_TRUE;
+ Evas_Object *item = page_get_item(page);
+ retv_if(item == NULL, NULL);
+
+ Evas_Object *layout = elm_layout_add(item);
+ retv_if(layout == NULL, NULL);
+ ret = elm_layout_file_set(layout, PAGE_CLOCK_EDJE_FILE, "blockingmode");
+ retv_if(ret == EINA_FALSE, NULL);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(layout);
+
+ Evas_Object *button1 = elm_layout_add(layout);
+ if (button1 != NULL) {
+ ret = elm_layout_file_set(button1, PAGE_CLOCK_EDJE_FILE, "hidden_item_call_fwd");
+ if (ret == EINA_TRUE) {
+ evas_object_size_hint_weight_set(button1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ focus = elm_button_add(button1);
+ if (focus != NULL) {
+ elm_object_style_set(focus, "focus");
+ elm_access_info_cb_set(focus, ELM_ACCESS_INFO, _button_1_access_info_cb, (void*)1);
+ evas_object_smart_callback_add(focus, "clicked", _icon_1_clicked_cb, page);
+ elm_access_object_unregister(focus);
+ elm_object_part_content_set(button1, "focus", focus);
+ }
+
+ elm_object_part_content_set(layout, "button.1", button1);
+ evas_object_show(button1);
+ } else {
+ _E("Failed to set file");
+ evas_object_del(button1);
+ }
+ }
+
+ Evas_Object *button2 = elm_layout_add(layout);
+ if (button2 != NULL) {
+ ret = elm_layout_file_set(button2, PAGE_CLOCK_EDJE_FILE, "hidden_item_blocking_mode");
+ if (ret == EINA_TRUE) {
+ evas_object_size_hint_weight_set(button2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ focus = elm_button_add(button2);
+ if (focus != NULL) {
+ elm_object_style_set(focus, "focus");
+ elm_access_info_cb_set(focus, ELM_ACCESS_STATE, _button_2_access_state_cb, (void*)1);
+ elm_access_info_cb_set(focus, ELM_ACCESS_INFO, _button_2_access_info_cb, (void*)1);
+ elm_access_info_cb_set(focus, ELM_ACCESS_CONTEXT_INFO, _button_2_access_context_cb, (void*)1);
+ evas_object_smart_callback_add(focus, "clicked", _icon_2_clicked_cb, page);
+ elm_access_object_unregister(focus);
+ elm_object_part_content_set(button2, "focus", focus);
+ }
+
+ elm_object_part_content_set(layout, "button.2", button2);
+ evas_object_show(button2);
+ } else {
+ _E("Failed to set file");
+ evas_object_del(button2);
+ }
+ }
+
+ if (clock_service_event_state_get(CLOCK_EVENT_SIM) == CLOCK_EVENT_SIM_NOT_INSERTED) {
+ elm_object_signal_emit(layout, "button.1.hide", "prog");
+ }
+
+ return layout;
+}
+
+HAPI Evas_Object *clock_view_hidden_add(Evas_Object *page)
+{
+ Evas_Object *view = NULL;
+ retv_if(page == NULL, NULL);
+
+ view = _view_create(page);
+ retv_if(view == NULL, NULL);
+
+ _status_update(view);
+
+ if (vconf_ignore_key_changed(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL,
+ _vconf_cb) < 0) {
+ _E("Failed to ignore the VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL callback");
+ }
+ if (vconf_notify_key_changed(VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL,
+ _vconf_cb, view) < 0) {
+ _E("Failed to get notification from VCONFKEY_SETAPPL_BLOCKMODE_WEARABLE_BOOL");
+ }
+ if (vconf_ignore_key_changed(VCONFKEY_TELEPHONY_MODEM_ALWAYS_ON_STATE,
+ _vconf_cb) < 0) {
+ _E("Failed to ignore the VCONFKEY_TELEPHONY_MODEM_ALWAYS_ON_STATE callback");
+ }
+ if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_MODEM_ALWAYS_ON_STATE,
+ _vconf_cb, view) < 0) {
+ _E("Failed to get notification from VCONFKEY_TELEPHONY_MODEM_ALWAYS_ON_STATE");
+ }
+ if (vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT,
+ _vconf_cb) < 0) {
+ _E("Failed to ignore the VCONFKEY_TELEPHONY_SIM_SLOT callback");
+ }
+ if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT,
+ _vconf_cb, view) < 0) {
+ _E("Failed to get notification from VCONFKEY_TELEPHONY_SIM_SLOT");
+ }
+ if (vconf_ignore_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
+ _vconf_cb) < 0) {
+ _E("Failed to ignore the VCONFKEY_TELEPHONY_FLIGHT_MODE callback");
+ }
+ if (vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE,
+ _vconf_cb, view) < 0) {
+ _E("Failed to get notification from VCONFKEY_TELEPHONY_FLIGHT_MODE");
+ }
+
+ return view;
+}
+#endif
+
+HAPI void clock_view_hidden_event_handler(Evas_Object *page, int event)
+{
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+#ifdef RUN_ON_DEVICE
+ ret_if(page == NULL);
+ Evas_Object *layout = _hidden_layout_get(page);
+ ret_if(layout == NULL);
+ Evas_Object *focus = NULL;
+ Evas_Object *button = NULL;
+
+ switch (event) {
+ case CLOCK_EVENT_VIEW_HIDDEN_SHOW:
+ if (clock_service_event_state_get(CLOCK_EVENT_SCREEN_READER) == CLOCK_EVENT_SCREEN_READER_ON) {
+ if (tutorial_is_exist() == 0) {
+ button = elm_object_part_content_get(layout, "button.1");
+ if (button != NULL) {
+ focus = elm_object_part_content_get(button, "focus");
+ if (focus != NULL) {
+ elm_access_object_register(focus, layout);
+ }
+ }
+ button = elm_object_part_content_get(layout, "button.2");
+ if (button != NULL) {
+ focus = elm_object_part_content_get(button, "focus");
+ if (focus != NULL) {
+ elm_access_object_register(focus, layout);
+ }
+ }
+ }
+ }
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_VISIBLE, (void*)1);
+ break;
+ case CLOCK_EVENT_VIEW_HIDDEN_HIDE:
+ button = elm_object_part_content_get(layout, "button.1");
+ if (button != NULL) {
+ focus = elm_object_part_content_get(button, "focus");
+ if (focus != NULL) {
+ elm_access_object_unregister(focus);
+ }
+ }
+ button = elm_object_part_content_get(layout, "button.2");
+ if (button != NULL) {
+ focus = elm_object_part_content_get(button, "focus");
+ if (focus != NULL) {
+ elm_access_object_unregister(focus);
+ }
+ }
+
+ evas_object_data_del(layout, PRIVATE_DATA_KEY_VISIBLE);
+ break;
+ case CLOCK_EVENT_APP_LANGUAGE_CHANGED:
+ _status_update(layout);
+ break;
+ case CLOCK_EVENT_POWER_ENHANCED_MODE_ON:
+ button = elm_object_part_content_get(layout, "button.1");
+ if (button != NULL) {
+ //elm_object_signal_emit(button, "gray,enable", "prog");
+ }
+ button = elm_object_part_content_get(layout, "button.2");
+ if (button != NULL) {
+ //elm_object_signal_emit(button, "gray,enable", "prog");
+ }
+ break;
+ case CLOCK_EVENT_POWER_ENHANCED_MODE_OFF:
+ button = elm_object_part_content_get(layout, "button.1");
+ if (button != NULL) {
+ //elm_object_signal_emit(button, "gray,disable", "prog");
+ }
+ button = elm_object_part_content_get(layout, "button.2");
+ if (button != NULL) {
+ //elm_object_signal_emit(button, "gray,disable", "prog");
+ }
+ break;
+ case CLOCK_EVENT_SIM_NOT_INSERTED:
+ elm_object_signal_emit(layout, "button.1.hide", "prog");
+ break;
+ case CLOCK_EVENT_SIM_INSERTED:
+ elm_object_signal_emit(layout, "button.1.show", "prog");
+ break;
+ }
+#endif
+#endif
+}
diff --git a/home/src/clock_view_indicator.c b/home/src/clock_view_indicator.c
new file mode 100644
index 0000000..88606ca
--- /dev/null
+++ b/home/src/clock_view_indicator.c
@@ -0,0 +1,369 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+#include <vconf.h>
+#include <bundle.h>
+#include <app.h>
+#include <aul.h>
+#include <efl_assist.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "page.h"
+#include "scroller.h"
+#include "key.h"
+#include "effect.h"
+#include "minictrl.h"
+#include "clock_service.h"
+#include "power_mode.h"
+#include "dbus.h"
+
+#define ICON_TYPE_NONE 0
+#define ICON_TYPE_MODEM_OFF 1
+#define ICON_TYPE_DND_ON 2
+#define ICON_TYPE_CALLFW 3
+
+#define ENABLE_AUTO_CALL_FWD
+#define PRIVATE_DATA_KEY_INDICATOR_ICON_TYPE "p_d_k_iit"
+
+static void _view_type_set(Evas_Object *view, int type)
+{
+ ret_if(view == NULL);
+
+ evas_object_data_set(view, PRIVATE_DATA_KEY_INDICATOR_ICON_TYPE, (void*)type);
+}
+
+static int _view_type_get(Evas_Object *view)
+{
+ retv_if(view == NULL, ICON_TYPE_NONE);
+
+ return (int)evas_object_data_get(view, PRIVATE_DATA_KEY_INDICATOR_ICON_TYPE);
+}
+
+#define MODEM_SETTING_APPID "org.tizen.clocksetting.network"
+static void _modem_off_icon_clicked_cb(void *cbdata, Evas_Object *obj, void *event_info)
+{
+ _D("");
+
+ int ret = 0;
+
+ app_control_h ac = NULL;
+ if ((ret = app_control_create(&ac)) != APP_CONTROL_ERROR_NONE) {
+ _E("Failed to create app control:%d", ret);
+ }
+ ret_if(ac == NULL);
+
+ app_control_set_operation(ac, APP_CONTROL_OPERATION_VIEW);
+ app_control_set_app_id(ac, MODEM_SETTING_APPID);
+ if ((ret = app_control_send_launch_request(ac, NULL, NULL)) != APP_CONTROL_ERROR_NONE) {
+ _E("Failed to launch %s(%d)", MODEM_SETTING_APPID, ret);
+ }
+ app_control_destroy(ac);
+
+ effect_play_sound();
+}
+
+static Evas_Object *_view_modem_icon(Evas_Object *parent, int type)
+{
+
+ int ret = 0;
+ Evas_Object *layout = NULL;
+ Evas_Object *focus = NULL;
+
+ if (type == ICON_TYPE_MODEM_OFF) {
+ layout = elm_layout_add(parent);
+ retv_if(layout == NULL, NULL);
+ ret = elm_layout_file_set(layout, PAGE_CLOCK_EDJE_FILE, "modem_off_icon");
+ retv_if(ret == EINA_FALSE, NULL);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ focus = elm_button_add(layout);
+ if (focus != NULL) {
+ elm_object_style_set(focus, "focus");
+ evas_object_smart_callback_add(focus, "clicked", _modem_off_icon_clicked_cb, NULL);
+ elm_object_part_content_set(layout, "focus", focus);
+ }
+
+ evas_object_show(layout);
+ }
+
+ return layout;
+}
+
+static int _view_modem_icon_type_get(void)
+{
+ int sap = clock_service_event_state_get(CLOCK_EVENT_SAP);
+ int modem = clock_service_event_state_get(CLOCK_EVENT_MODEM);
+
+ _D("sap:0x%x modem:0x%x", sap, modem);
+
+ if (sap == CLOCK_EVENT_SAP_OFF && modem == CLOCK_EVENT_MODEM_OFF) {
+ return ICON_TYPE_MODEM_OFF;
+ } else if (sap == CLOCK_EVENT_SAP_ON || modem == CLOCK_EVENT_MODEM_ON) {
+ return ICON_TYPE_NONE;
+ }
+
+ return ICON_TYPE_NONE;
+}
+
+#define BLOCKINGMODE_APP "org.tizen.clocksetting.blockingmode"
+#define BLOCKINGMODE_KEY "viewtype"
+static void _dnd_clicked_cb(void *cbdata, Evas_Object *obj, void *event_info)
+{
+#if 0
+ int ret = 0;
+ const char *value = "disable";
+ _D("blockingmode");
+
+ app_control_h ac = NULL;
+ if ((ret = app_control_create(&ac)) != APP_CONTROL_ERROR_NONE) {
+ _E("Failed to create app control:%d", ret);
+ }
+ ret_if(ac == NULL);
+
+ app_control_set_operation(ac, APP_CONTROL_OPERATION_VIEW);
+ app_control_set_app_id(ac, BLOCKINGMODE_APP);
+ app_control_add_extra_data(ac, BLOCKINGMODE_KEY, value);
+ home_dbus_cpu_booster_signal_send();
+ if ((ret = app_control_send_launch_request(ac, NULL, NULL)) != APP_CONTROL_ERROR_NONE) {
+ _E("Failed to launch %s(%d)", BLOCKINGMODE_APP, ret);
+ }
+ app_control_destroy(ac);
+#endif
+
+ if (util_feature_enabled_get(FEATURE_CLOCK_HIDDEN_BUTTON) == 0) {
+ return ;
+ }
+
+ clock_h clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ ret_if(!clock);
+ ret_if(!clock->view);
+
+ /* Hide indicator */
+ evas_object_smart_callback_call(clock->view, CLOCK_SMART_SIGNAL_VIEW_REQUEST, (void*)CLOCK_VIEW_REQUEST_DRAWER_SHOW);
+
+ effect_play_sound();
+}
+
+static char *_dnd_access_info_cb(void *data, Evas_Object *obj)
+{
+ int index = (int)data;
+ char *info = NULL;
+
+ if (index == 1) {
+ info = _("IDS_ST_MBODY_DO_NOT_DISTURB_ABB");
+ }
+
+ if (info != NULL) {
+ return strdup(info);
+ }
+
+ return NULL;
+}
+
+static char *_dnd_access_state_cb(void *data, Evas_Object *obj)
+{
+ char *state = NULL;
+ int is_enabled = 0;
+
+ if (clock_service_event_state_get(CLOCK_EVENT_DND) == CLOCK_EVENT_DND_ON) {
+ is_enabled = 1;
+ }
+
+ if (is_enabled == 1) {
+ state = _("IDS_COM_BODY_ON_M_STATUS");
+ } else {
+ state = _("IDS_COM_BODY_OFF_M_STATUS");
+ }
+
+ if (state) {
+ return strdup(state);
+ }
+
+ return NULL;
+}
+
+static Evas_Object *_view_dnd_icon(Evas_Object *parent, int type)
+{
+
+ int ret = 0;
+ Evas_Object *layout = NULL;
+ Evas_Object *focus = NULL;
+
+ if (type == ICON_TYPE_DND_ON) {
+ layout = elm_layout_add(parent);
+ retv_if(layout == NULL, NULL);
+ ret = elm_layout_file_set(layout, PAGE_CLOCK_EDJE_FILE, "dnd_icon");
+ retv_if(ret == EINA_FALSE, NULL);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ focus = elm_button_add(layout);
+ if (focus != NULL) {
+ elm_object_style_set(focus, "focus");
+ elm_access_info_cb_set(focus, ELM_ACCESS_INFO, _dnd_access_info_cb, (void*)1);
+ elm_access_info_cb_set(focus, ELM_ACCESS_STATE, _dnd_access_state_cb, (void*)1);
+ evas_object_smart_callback_add(focus, "clicked", _dnd_clicked_cb, NULL);
+ elm_object_part_content_set(layout, "focus", focus);
+ }
+
+ evas_object_show(layout);
+ }
+
+ return layout;
+}
+
+static int _view_dnd_icon_type_get(void)
+{
+ int dnd = clock_service_event_state_get(CLOCK_EVENT_DND);
+
+ _D("dnd:0x%x", dnd);
+
+ if (dnd == CLOCK_EVENT_DND_ON) {
+ return ICON_TYPE_DND_ON;
+ }
+
+ return ICON_TYPE_NONE;
+}
+
+#define VCONFKEY_MODEM_ON_OFF_ENABLED "file/private/weconn/modem_onoff_control"
+static Evas_Object *_view_create_by_type(Evas_Object *page, int type)
+{
+ Evas_Object *view = NULL;
+ Evas_Object *item = page_get_item(page);
+ retv_if(item == NULL, NULL);
+
+ _D("%x", type);
+
+ int is_feature_enabled = 0;
+
+ switch (type) {
+ case ICON_TYPE_MODEM_OFF:
+ if (vconf_get_int(VCONFKEY_MODEM_ON_OFF_ENABLED, &is_feature_enabled) != 0) {
+ _E("Failed to get %s", VCONFKEY_MODEM_ON_OFF_ENABLED);
+ }
+
+ if (is_feature_enabled == 1) {
+ _E("modem on/off feature isn't enabled");
+ view = _view_modem_icon(item, ICON_TYPE_MODEM_OFF);
+ } else {
+ view = NULL;
+ }
+ break;
+ case ICON_TYPE_DND_ON:
+ view = _view_dnd_icon(item, ICON_TYPE_DND_ON);
+ break;
+ }
+
+ _view_type_set(view, type);
+
+ return view;
+}
+
+static void _view_remove_by_type(Evas_Object *page, int type)
+{
+ Evas_Object *slot1 = NULL;
+ Evas_Object *slot2 = NULL;
+ Evas_Object *item = page_get_item(page);
+ ret_if(item == NULL);
+
+ slot1 = elm_object_part_content_get(item, "indicator.1");
+ slot2 = elm_object_part_content_get(item, "indicator.2");
+
+ if (_view_type_get(slot1) == type) {
+ elm_object_part_content_unset(item, "indicator.1");
+ evas_object_del(slot1);
+ elm_object_part_content_unset(item, "indicator.2");
+ elm_object_part_content_set(item, "indicator.1", slot2);
+ } else if (_view_type_get(slot2) == type) {
+ elm_object_part_content_unset(item, "indicator.2");
+ evas_object_del(slot2);
+ }
+}
+
+static void _view_add_by_type(Evas_Object *page, int type)
+{
+ Evas_Object *slot1 = NULL;
+ Evas_Object *slot2 = NULL;
+ Evas_Object *item = page_get_item(page);
+ ret_if(item == NULL);
+
+ slot1 = elm_object_part_content_get(item, "indicator.1");
+ if (_view_type_get(slot1) == type) {
+ return;
+ }
+ slot2 = elm_object_part_content_get(item, "indicator.2");
+ if (_view_type_get(slot2) == type) {
+ return;
+ }
+
+ //view create
+ Evas_Object *view = _view_create_by_type(page, type);
+ if (view != NULL) {
+ if (slot1 == NULL) {
+ elm_object_part_content_set(item, "indicator.1", view);
+ } else if (slot1 != NULL && slot2 == NULL) {
+ elm_object_part_content_set(item, "indicator.2", view);
+ } else {
+ _E("it can't be..");
+ }
+ }
+}
+
+HAPI void clock_view_indicator_add(Evas_Object *page)
+{
+ ret_if(page == NULL);
+
+ _view_add_by_type(page, _view_modem_icon_type_get());
+ _view_add_by_type(page, _view_dnd_icon_type_get());
+#ifdef ENABLE_AUTO_CALL_FWD
+ _view_add_by_type(page, ICON_TYPE_CALLFW);
+#endif
+}
+
+HAPI void clock_view_indicator_event_handler(Evas_Object *page, int event)
+{
+ ret_if(page == NULL);
+
+ _D("%p %x", page, event);
+
+ if (((event & CLOCK_EVENT_CATEGORY(CLOCK_EVENT_SAP)) == CLOCK_EVENT_CATEGORY(CLOCK_EVENT_SAP)) ||
+ ((event & CLOCK_EVENT_CATEGORY(CLOCK_EVENT_MODEM)) == CLOCK_EVENT_CATEGORY(CLOCK_EVENT_MODEM))) {
+ if (_view_modem_icon_type_get() == ICON_TYPE_MODEM_OFF) {
+ _view_add_by_type(page, ICON_TYPE_MODEM_OFF);
+ } else {
+ _view_remove_by_type(page, ICON_TYPE_MODEM_OFF);
+ }
+ } else if (event & CLOCK_EVENT_CATEGORY(CLOCK_EVENT_DND)) {
+ if (_view_dnd_icon_type_get() == ICON_TYPE_DND_ON) {
+ _view_add_by_type(page, ICON_TYPE_DND_ON);
+ } else {
+ _view_remove_by_type(page, ICON_TYPE_DND_ON);
+ }
+ }
+}
diff --git a/home/src/critical_log.c b/home/src/critical_log.c
new file mode 100755
index 0000000..fe84dd2
--- /dev/null
+++ b/home/src/critical_log.c
@@ -0,0 +1,233 @@
+/*
+ * Copyright 2013 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <string.h>
+#include <libgen.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include <dlog.h>
+#include <Eina.h>
+#include <dynamicbox_errno.h>
+
+#include "util.h"
+#include "critical_log.h"
+
+#if !defined(SECURE_LOGD)
+#define SECURE_LOGD LOGD
+#endif
+
+#if !defined(SECURE_LOGW)
+#define SECURE_LOGW LOGW
+#endif
+
+#if !defined(SECURE_LOGE)
+#define SECURE_LOGE LOGE
+#endif
+
+#if !defined(DbgPrint)
+#define DbgPrint(format, arg...) SECURE_LOGD(format, ##arg)
+#endif
+
+#if !defined(ErrPrint)
+#define ErrPrint(format, arg...) SECURE_LOGE(format, ##arg)
+#endif
+
+#if !defined(WarnPrint)
+#define WarnPrint(format, arg...) SECURE_LOGW(format, ##arg)
+#endif
+
+#define DbgFree(a) free(a)
+
+#define SLAVE_LOG_PATH "/tmp/.w-home_log/"
+#define MAX_LOG_LINE 80
+#define MAX_LOG_FILE 3
+
+#define CRITICAL_SECTION_BEGIN(handle) \
+do { \
+ int ret; \
+ ret = pthread_mutex_lock(handle); \
+ if (ret != 0) \
+ ErrPrint("Failed to lock: %s\n", strerror(ret)); \
+} while (0)
+
+#define CRITICAL_SECTION_END(handle) \
+do { \
+ int ret; \
+ ret = pthread_mutex_unlock(handle); \
+ if (ret != 0) \
+ ErrPrint("Failed to unlock: %s\n", strerror(ret)); \
+} while (0)
+
+static struct {
+ FILE *fp;
+ int file_id;
+ int nr_of_lines;
+ char *filename;
+ pthread_mutex_t cri_lock;
+} s_info = {
+ .fp = NULL,
+ .file_id = 0,
+ .nr_of_lines = 0,
+ .filename = NULL,
+ .cri_lock = PTHREAD_MUTEX_INITIALIZER,
+};
+
+
+
+static inline void rotate_log(void)
+{
+ char *filename;
+ int namelen;
+
+ if (s_info.nr_of_lines < MAX_LOG_LINE) {
+ return;
+ }
+
+ if (!s_info.filename) {
+ return;
+ }
+
+ s_info.file_id = (s_info.file_id + 1) % MAX_LOG_FILE;
+
+ namelen = strlen(s_info.filename) + strlen(SLAVE_LOG_PATH) + 30;
+ filename = malloc(namelen);
+ if (filename) {
+ snprintf(filename, namelen, "%s/%d_%s.%d", SLAVE_LOG_PATH, s_info.file_id, s_info.filename, getpid());
+
+ if (s_info.fp) {
+ if (fclose(s_info.fp) != 0) {
+ ErrPrint("fclose: %s\n", strerror(errno));
+ }
+ }
+
+ s_info.fp = fopen(filename, "w+");
+ if (!s_info.fp) {
+ ErrPrint("Failed to open a file: %s\n", filename);
+ }
+
+ DbgFree(filename);
+ }
+
+ s_info.nr_of_lines = 0;
+}
+
+
+
+HAPI int critical_log(const char *func, int line, const char *fmt, ...)
+{
+ va_list ap;
+ int ret;
+
+ if (!s_info.fp) {
+ return DBOX_STATUS_ERROR_IO_ERROR;
+ }
+
+ CRITICAL_SECTION_BEGIN(&s_info.cri_lock);
+
+ fprintf(s_info.fp, "%lf [%s:%d] ", util_timestamp(), util_basename((char *)func), line);
+
+ va_start(ap, fmt);
+ ret = vfprintf(s_info.fp, fmt, ap);
+ va_end(ap);
+
+ fflush(s_info.fp);
+
+ s_info.nr_of_lines++;
+ rotate_log();
+
+ CRITICAL_SECTION_END(&s_info.cri_lock);
+ return ret;
+}
+
+
+
+HAPI int critical_log_init(const char *name)
+{
+ int namelen;
+ char *filename;
+
+ if (!name) {
+ ErrPrint("name is NULL");
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ if (mkdir(SLAVE_LOG_PATH, 0755) < 0) {
+ ErrPrint("mkdir(%s) returns: %s\n", SLAVE_LOG_PATH, strerror(errno));
+ }
+
+ if (s_info.fp) {
+ return DBOX_STATUS_ERROR_NONE;
+ }
+
+ s_info.filename = strdup(name);
+ if (!s_info.filename) {
+ ErrPrint("Failed to create a log file\n");
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ namelen = strlen(name) + strlen(SLAVE_LOG_PATH) + 30;
+
+ filename = malloc(namelen);
+ if (!filename) {
+ ErrPrint("Failed to create a log file\n");
+ DbgFree(s_info.filename);
+ s_info.filename = NULL;
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ snprintf(filename, namelen, "%s/%d_%s.%d", SLAVE_LOG_PATH, s_info.file_id, name, getpid());
+
+ s_info.fp = fopen(filename, "w+");
+ if (!s_info.fp) {
+ ErrPrint("Failed to open log: %s\n", strerror(errno));
+ DbgFree(s_info.filename);
+ s_info.filename = NULL;
+ DbgFree(filename);
+ return DBOX_STATUS_ERROR_IO_ERROR;
+ }
+
+ DbgFree(filename);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+
+
+HAPI void critical_log_fini(void)
+{
+ if (s_info.filename) {
+ DbgFree(s_info.filename);
+ s_info.filename = NULL;
+ }
+
+ if (s_info.fp) {
+ if (fclose(s_info.fp) != 0) {
+ ErrPrint("fclose: %s\n", strerror(errno));
+ }
+ s_info.fp = NULL;
+ }
+}
+
+
+
+/* End of a file */
diff --git a/home/src/db.c b/home/src/db.c
new file mode 100644
index 0000000..92d8476
--- /dev/null
+++ b/home/src/db.c
@@ -0,0 +1,715 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <bundle.h>
+#include <Evas.h>
+#include <db-util.h>
+#include <sqlite3.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <Eina.h>
+#include <dlog.h>
+#include <vconf.h>
+
+#include "util.h"
+#include "db.h"
+#include "log.h"
+#include "page_info.h"
+#include "dynamicbox_evas.h" // DYNAMICBOX_EVAS_DEFAULT_PERIOD
+#define HOME_DB_FILE DATADIR"/.home.db"
+#define HOME_DB_TTS_FILE DATADIR"/.home_tts.db"
+
+
+#define retv_with_dbmsg_if(expr, val) do { \
+ if (expr) { \
+ _E("%s", sqlite3_errmsg(db_info.db)); \
+ return (val); \
+ } \
+} while (0)
+
+
+
+static struct {
+ sqlite3 *db;
+ char *db_file;
+} db_info = {
+ .db = NULL,
+ .db_file = HOME_DB_FILE,
+};
+
+struct stmt {
+ sqlite3_stmt *stmt;
+};
+
+
+
+HAPI w_home_error_e db_init(db_file_e db_file)
+{
+ retv_if(!db_file, W_HOME_ERROR_FAIL);
+
+ db_close();
+
+ switch (db_file) {
+ case DB_FILE_NORMAL:
+ db_info.db_file = HOME_DB_FILE;
+ break;
+ case DB_FILE_TTS:
+ db_info.db_file = HOME_DB_TTS_FILE;
+ break;
+ default:
+ _E("Invalid db_file");
+ }
+
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), -1);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI w_home_error_e db_open(const char *db_file)
+{
+ int ret;
+
+ retv_if(!db_file, W_HOME_ERROR_INVALID_PARAMETER);
+ if (db_info.db) {
+ return W_HOME_ERROR_NONE;
+ }
+
+ ret = db_util_open(db_file, &db_info.db, DB_UTIL_REGISTER_HOOK_METHOD);
+ if (ret != SQLITE_OK)
+ _E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI stmt_h *db_prepare(const char *query)
+{
+ stmt_h *handle;
+ int ret;
+
+ retv_if(!query, NULL);
+
+ handle = calloc(1, sizeof(stmt_h));
+ retv_if(!handle, NULL);
+
+ ret = sqlite3_prepare_v2(db_info.db, query, strlen(query), &(handle->stmt), NULL);
+ if (ret != SQLITE_OK) {
+ free(handle);
+ _E("%s, %s", query, sqlite3_errmsg(db_info.db));
+ return NULL;
+ }
+
+ return handle;
+}
+
+
+
+HAPI w_home_error_e db_bind_bool(stmt_h *handle, int idx, bool value)
+{
+ int ret;
+
+ retv_if(!handle, W_HOME_ERROR_FAIL);
+
+ ret = sqlite3_bind_int(handle->stmt, idx, (int) value);
+ if (ret != SQLITE_OK)
+ _E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI w_home_error_e db_bind_int(stmt_h *handle, int idx, int value)
+{
+ int ret;
+
+ retv_if(!handle, W_HOME_ERROR_FAIL);
+
+ ret = sqlite3_bind_int(handle->stmt, idx, value);
+ if (ret != SQLITE_OK)
+ _E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI w_home_error_e db_bind_str(stmt_h *handle, int idx, const char *str)
+{
+ int ret;
+
+ retv_if(!handle, W_HOME_ERROR_FAIL);
+ retv_if(!str, W_HOME_ERROR_FAIL);
+
+ ret = sqlite3_bind_text(handle->stmt, idx, str, strlen(str), SQLITE_TRANSIENT);
+ if (ret != SQLITE_OK)
+ _E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI w_home_error_e db_next(stmt_h *handle)
+{
+ int ret;
+
+ retv_if(!handle, W_HOME_ERROR_FAIL);
+
+ ret = sqlite3_step(handle->stmt);
+ switch (ret) {
+ case SQLITE_ROW:
+ return W_HOME_ERROR_NONE;
+ case SQLITE_DONE:
+ return W_HOME_ERROR_NO_DATA;
+ default:
+ _E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(1, W_HOME_ERROR_FAIL);
+ }
+}
+
+
+
+HAPI bool db_get_bool(stmt_h *handle, int index)
+{
+ retv_if(!handle, false);
+ return (bool) sqlite3_column_int(handle->stmt, index);
+}
+
+
+
+HAPI int db_get_int(stmt_h *handle, int index)
+{
+ retv_if(!handle, 0);
+ return sqlite3_column_int(handle->stmt, index);
+}
+
+
+HAPI const char *db_get_str(stmt_h *handle, int index)
+{
+ retv_if(!handle, NULL);
+ return (const char *) sqlite3_column_text(handle->stmt, index);
+}
+
+
+
+HAPI w_home_error_e db_reset(stmt_h *handle)
+{
+ int ret;
+
+ retv_if(!handle, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(!handle->stmt, W_HOME_ERROR_INVALID_PARAMETER);
+
+ ret = sqlite3_reset(handle->stmt);
+ if (ret != SQLITE_OK)
+ _E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, W_HOME_ERROR_FAIL);
+
+ sqlite3_clear_bindings(handle->stmt);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI w_home_error_e db_finalize(stmt_h *handle)
+{
+ int ret;
+
+ retv_if(!handle, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(!handle->stmt, W_HOME_ERROR_INVALID_PARAMETER);
+
+ ret = sqlite3_finalize(handle->stmt);
+ if (ret != SQLITE_OK)
+ _E("%s", sqlite3_errmsg(db_info.db));
+ retv_with_dbmsg_if(ret != SQLITE_OK, W_HOME_ERROR_FAIL);
+ free(handle);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI w_home_error_e db_exec(const char *query)
+{
+ retv_if(!query, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(!db_info.db, W_HOME_ERROR_FAIL);
+
+ stmt_h *handle = db_prepare(query);
+ retv_if(!handle, W_HOME_ERROR_FAIL);
+
+ goto_if(W_HOME_ERROR_FAIL == db_next(handle), ERROR);
+ if (W_HOME_ERROR_NONE != db_finalize(handle))
+ return W_HOME_ERROR_FAIL;
+
+ return W_HOME_ERROR_NONE;
+
+ERROR:
+ if (handle) db_finalize(handle);
+ return W_HOME_ERROR_FAIL;
+}
+
+
+
+HAPI void db_close(void)
+{
+ if (!db_info.db) {
+ _D("DB is already NULL");
+ return;
+ }
+ sqlite3_close(db_info.db);
+ db_info.db = NULL;
+}
+
+
+
+HAPI w_home_error_e db_begin_transaction(void)
+{
+ int ret = -1;
+
+ ret = sqlite3_exec(db_info.db, "BEGIN IMMEDIATE TRANSACTION", NULL, NULL, NULL);
+
+ while (SQLITE_BUSY == ret) {
+ sleep(1);
+ ret = sqlite3_exec(db_info.db, "BEGIN IMMEDIATE TRANSACTION", NULL, NULL, NULL);
+ }
+
+ if (SQLITE_OK != ret) {
+ _E("sqlite3_exec() Failed(%d)", ret);
+ return W_HOME_ERROR_FAIL;
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+#define COMMIT_TRY_MAX 3
+HAPI w_home_error_e db_end_transaction(bool success)
+{
+ int ret = -1;
+ int i = 0;
+ char *errmsg = NULL;
+
+ if (success) {
+ ret = sqlite3_exec(db_info.db, "COMMIT TRANSACTION", NULL, NULL, &errmsg);
+ if (ret != SQLITE_OK) {
+ _E("sqlite3_exec(COMMIT) Failed(%d, %s)", ret, errmsg);
+ sqlite3_free(errmsg);
+
+ while (SQLITE_BUSY == ret && i < COMMIT_TRY_MAX) {
+ i++;
+ sleep(1);
+ ret = sqlite3_exec(db_info.db, "COMMIT TRANSACTION", NULL, NULL, NULL);
+ }
+
+ if (ret != SQLITE_OK) {
+ _E("sqlite3_exec() Failed(%d)", ret);
+ ret = sqlite3_exec(db_info.db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
+ if (ret != SQLITE_OK) {
+ _E("sqlite3_exec() Failed(%d)", ret);
+ }
+
+ return W_HOME_ERROR_FAIL;
+ }
+ }
+ } else {
+ ret = sqlite3_exec(db_info.db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
+ if (ret != SQLITE_OK) {
+ _E("sqlite3_exec() Failed(%d)", ret);
+ return W_HOME_ERROR_FAIL;
+ }
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+#define HOME_DB_FILE DATADIR"/.home.db"
+#define HOME_TABLE "home"
+#define QUERY_INSERT_ITEM "INSERT INTO "HOME_TABLE" "\
+ "(id, subid, ordering) "\
+ "VALUES "\
+ "('%s', '%s', %d);"
+HAPI int db_insert_item(const char *id, const char *subid, int ordering)
+{
+ char *query;
+
+ retv_if(!id, -1);
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), -1);
+
+ if (subid) {
+ _D("Insert the item[%s:%s:%d]", id, subid, ordering);
+ query = sqlite3_mprintf(QUERY_INSERT_ITEM, id, subid, ordering);
+ } else {
+ _D("Insert the item[%s:%d]", id, ordering);
+ query = sqlite3_mprintf(QUERY_INSERT_ITEM, id, "", ordering);
+ }
+ retv_if(query == NULL, -1);
+
+ if (db_exec(query) != W_HOME_ERROR_NONE) {
+ _E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return -1;
+ }
+
+ sqlite3_free(query);
+
+ /* keep the home DB opened */
+
+ return 0;
+}
+
+
+
+#define QUERY_UPDATE_ITEM "UPDATE "HOME_TABLE" SET ordering=%d WHERE id='%s' and subid='%s'"
+HAPI int db_update_item(const char *id, const char *subid, int ordering)
+{
+ char *query;
+
+ retv_if(!id, -1);
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), -1);
+
+ if (subid) {
+ _D("Update the item[%s:%s:%d]", id, subid, ordering);
+ query = sqlite3_mprintf(QUERY_UPDATE_ITEM, ordering, id, subid);
+ } else {
+ _D("Update the item[%s:%d]", id, ordering);
+ query = sqlite3_mprintf(QUERY_UPDATE_ITEM, ordering, id, "");
+ }
+ retv_if(query == NULL, -1);
+
+ if (db_exec(query) != W_HOME_ERROR_NONE) {
+ _E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return -1;
+ }
+
+ sqlite3_free(query);
+
+ /* keep the home DB opened */
+
+ return 0;
+}
+
+
+
+#define QUERY_UPDATE_ITEM_BY_ORDERING "UPDATE "HOME_TABLE" SET id='%s', subid='%s' WHERE ordering=%d"
+HAPI int db_update_item_by_ordering(const char *id, const char *subid, int ordering)
+{
+ char *query = NULL;
+
+ retv_if(!id, -1);
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), -1);
+
+ if (subid) {
+ _SD("Update the item[%s:%s:%d]", id, subid, ordering);
+ query = sqlite3_mprintf(QUERY_UPDATE_ITEM_BY_ORDERING, id, subid, ordering);
+ } else {
+ _SD("Update the item[%s:%d]", id, ordering);
+ query = sqlite3_mprintf(QUERY_UPDATE_ITEM_BY_ORDERING, id, "", ordering);
+ }
+ retv_if(query == NULL, -1);
+
+ if (db_exec(query) != W_HOME_ERROR_NONE) {
+ _E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return -1;
+ }
+
+ sqlite3_free(query);
+
+ /* keep the home DB opened */
+
+ return 0;
+}
+
+
+
+#define QUERY_REMOVE_ITEM "DELETE FROM "HOME_TABLE" WHERE id='%s' and subid='%s'"
+HAPI int db_remove_item(const char *id, const char *subid)
+{
+ char *query;
+
+ retv_if(!id, -1);
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), -1);
+
+ if (subid) {
+ _D("Remove the item[%s:%s]", id, subid);
+ query = sqlite3_mprintf(QUERY_REMOVE_ITEM, id, subid);
+ } else {
+ _D("Remove the item[%s]", id);
+ query = sqlite3_mprintf(QUERY_REMOVE_ITEM, id, "");
+ }
+ retv_if(query == NULL, -1);
+
+ if (db_exec(query) != W_HOME_ERROR_NONE) {
+ _E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return -1;
+ }
+
+ sqlite3_free(query);
+
+ /* keep the home DB opened */
+
+ return 0;
+}
+
+
+
+#define QUERY_REMOVE_ITEM_AFTER_MAX "DELETE FROM "HOME_TABLE" WHERE ordering > %d"
+HAPI int db_remove_item_after_max(int max)
+{
+ char *query;
+
+ _D("Remove the item after max[%d]", max);
+
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), -1);
+
+ query = sqlite3_mprintf(QUERY_REMOVE_ITEM_AFTER_MAX, max);
+ retv_if(query == NULL, -1);
+
+ if (db_exec(query) != W_HOME_ERROR_NONE) {
+ _E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return -1;
+ }
+
+ sqlite3_free(query);
+
+ /* keep the home DB opened */
+
+ return 0;
+}
+
+
+
+#define QUERY_REMOVE_ALL_ITEM "DELETE FROM "HOME_TABLE
+HAPI int db_remove_all_item(void)
+{
+ char *query;
+
+ _D("Remove all the item");
+
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), -1);
+
+ query = sqlite3_mprintf(QUERY_REMOVE_ALL_ITEM);
+ retv_if(query == NULL, -1);
+
+ if (db_exec(query) != W_HOME_ERROR_NONE) {
+ _E("Cannot execute query.[%s]", query);
+ sqlite3_free(query);
+ return -1;
+ }
+
+ sqlite3_free(query);
+
+ if (vconf_set_str(VCONF_KEY_HOME_LOGGING, ";") != 0) {
+ _SE("Failed to set %s as NULL", VCONF_KEY_HOME_LOGGING);
+ } else {
+ _SD("Set %s as ';'", VCONF_KEY_HOME_LOGGING);
+ }
+
+ /* keep the home DB opened */
+
+ return 0;
+}
+
+
+
+#define QUERY_COUNT_ITEM "SELECT COUNT(*) FROM "HOME_TABLE" WHERE id=? and subid=?"
+HAPI int db_count_item(const char *id, const char *subid)
+{
+ stmt_h *st;
+ int count;
+
+ retv_if(id == NULL, -1);
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), -1);
+
+ st = db_prepare(QUERY_COUNT_ITEM);
+ retv_if(st == NULL, -1);
+
+ if (db_bind_str(st, 1, id) != W_HOME_ERROR_NONE) {
+ _E("db_bind_str error");
+ db_finalize(st);
+ return -1;
+ }
+
+ if (subid) {
+ if (db_bind_str(st, 2, subid) != W_HOME_ERROR_NONE) {
+ _E("db_bind_str error");
+ db_finalize(st);
+ return -1;
+ }
+ } else {
+ if (db_bind_str(st, 2, "") != W_HOME_ERROR_NONE) {
+ _E("db_bind_str error");
+ db_finalize(st);
+ return -1;
+ }
+ }
+
+ if (db_next(st) == W_HOME_ERROR_FAIL) {
+ _E("db_next error");
+ db_finalize(st);
+ return -1;
+ }
+
+ count = db_get_int(st, 0);
+ db_finalize(st);
+
+ /* keep the home DB opened */
+
+ return count;
+}
+
+
+
+#define QUERY_COUNT_ORDERING "SELECT COUNT(*) FROM "HOME_TABLE" WHERE ordering=?"
+HAPI int db_count_ordering(int ordering)
+{
+ stmt_h *st;
+ int count;
+
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), -1);
+
+ st = db_prepare(QUERY_COUNT_ORDERING);
+ retv_if(st == NULL, -1);
+
+ if (db_bind_int(st, 1, ordering) != W_HOME_ERROR_NONE) {
+ _E("db_bind_str error");
+ db_finalize(st);
+ return -1;
+ }
+
+ if (db_next(st) == W_HOME_ERROR_FAIL) {
+ _E("db_next error");
+ db_finalize(st);
+ return -1;
+ }
+
+ count = db_get_int(st, 0);
+ db_finalize(st);
+
+ /* keep the home DB opened */
+
+ return count;
+}
+
+
+
+#define QUERY_SELECT_PAGE "SELECT id, subid, ordering FROM "HOME_TABLE" ORDER BY ordering ASC"
+HAPI Eina_List *db_write_list(void)
+{
+ stmt_h *st = NULL;
+ Eina_List *page_info_list = NULL;
+ page_info_s *page_info = NULL;
+ const char *id;
+ const char *subid;
+
+ retv_if(W_HOME_ERROR_NONE !=
+ db_open(db_info.db_file), NULL);
+
+ st = db_prepare(QUERY_SELECT_PAGE);
+ goto_if(NULL == st, ERROR);
+
+ while (W_HOME_ERROR_NONE == db_next(st)) {
+ id = db_get_str(st, 0);
+ subid = db_get_str(st, 1);
+
+ page_info = page_info_create(id, subid, DYNAMICBOX_EVAS_DEFAULT_PERIOD);
+ goto_if(!page_info, ERROR);
+
+ page_info->ordering = db_get_int(st, 2);
+ page_info->removable = page_info_is_removable(id);
+ page_info_list = eina_list_append(page_info_list, page_info);
+ }
+
+ db_finalize(st);
+
+ return page_info_list;
+
+ERROR:
+ page_info_list_destroy(page_info_list);
+ db_finalize(st);
+
+ return NULL;
+}
+
+
+
+HAPI w_home_error_e db_read_list(Eina_List *page_info_list)
+{
+ const char *logging = NULL;
+ const Eina_List *l, *ln;
+ Eina_Strbuf *strbuf = NULL;
+ page_info_s *page_info = NULL;
+ int ordering = 0;
+
+ retv_if(!page_info_list, W_HOME_ERROR_INVALID_PARAMETER);
+
+ _W("push all the pages into the DB");
+
+ db_remove_all_item();
+ strbuf = eina_strbuf_new();
+ retv_if(!strbuf, W_HOME_ERROR_FAIL);
+
+ EINA_LIST_FOREACH_SAFE(page_info_list, l, ln, page_info) {
+ continue_if(!page_info);
+ if (!page_info->id) continue;
+
+ db_insert_item(page_info->id, page_info->subid, ordering);
+ if (ordering) {
+ eina_strbuf_append_char(strbuf, ';');
+ }
+ eina_strbuf_append(strbuf, page_info->id);
+ ordering++;
+ }
+
+ logging = eina_strbuf_string_get(strbuf);
+ _SD("Logging : [%s]", logging);
+ if (vconf_set_str(VCONF_KEY_HOME_LOGGING, logging) != 0) {
+ _E("Failed to set %s as %s", VCONF_KEY_HOME_LOGGING, logging);
+ }
+ eina_strbuf_free(strbuf);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+// End of file.
diff --git a/home/src/dbox.c b/home/src/dbox.c
new file mode 100644
index 0000000..7147aca
--- /dev/null
+++ b/home/src/dbox.c
@@ -0,0 +1,1095 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <dynamicbox_service.h>
+#include <dynamicbox_errno.h>
+#include <stdbool.h>
+#include <dlog.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <Ecore_X.h>
+#include <dynamicbox.h>
+#include <vconf.h>
+
+#include "util.h"
+#include "db.h"
+#include "index.h"
+#include "layout_info.h"
+#include "dynamicbox_evas.h"
+#include "log.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "page.h"
+#include "edit.h"
+#include "add-viewer_package.h"
+#include "add-viewer_pkgmgr.h"
+
+
+static struct info {
+ Eina_Bool is_scrolling;
+ Eina_List *pended_event_list;
+} s_info = {
+ .is_scrolling = EINA_FALSE,
+ .pended_event_list = NULL,
+};
+
+
+
+#define MAX_TTL 10
+#define TAG_SCROLL "l.s" // Scroller
+#define TAG_UPDATED "l.u" // Dynamicbox Updated
+#define TAG_FAULT_HL "f.h" // Faulted Highlight (emulate)
+#define FAULTED_HL_TIMER 0.00001f
+
+
+
+struct pended_access_event {
+ Evas_Object *dynamicbox;
+ Elm_Access_Action_Info info;
+ void (*cb)(Evas_Object *obj, int ret, void *data);
+ void *data;
+ int ttl;
+};
+
+
+
+static const char *action_type_string(int type)
+{
+ switch (type) {
+ case ELM_ACCESS_ACTION_HIGHLIGHT:
+ return "HL";
+ case ELM_ACCESS_ACTION_UNHIGHLIGHT:
+ return "UNHL";
+ case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
+ return "NEXT";
+ case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
+ return "PREV";
+ case ELM_ACCESS_ACTION_VALUE_CHANGE:
+ return "VALUE_CHANGE";
+ case ELM_ACCESS_ACTION_MOUSE:
+ return "MOUSE";
+ case ELM_ACCESS_ACTION_BACK:
+ return "BACK";
+ case ELM_ACCESS_ACTION_OVER:
+ return "OVER";
+ case ELM_ACCESS_ACTION_READ:
+ return "READ";
+ case ELM_ACCESS_ACTION_ENABLE:
+ return "ENABLE";
+ case ELM_ACCESS_ACTION_DISABLE:
+ return "DISABLE";
+ case ELM_ACCESS_ACTION_ACTIVATE:
+ return "ACTIVATE";
+ case ELM_ACCESS_ACTION_SCROLL:
+ return "SCROLL";
+ default:
+ return "Unknown";
+ }
+}
+
+static void push_pended_event_list(Evas_Object *obj, Elm_Access_Action_Info *info, void (*cb)(Evas_Object *obj, int ret, void *data), void *data)
+{
+ struct pended_access_event *_info;
+
+ _info = malloc(sizeof(*_info));
+ if (!_info) {
+ _E("malloc:%s\n", strerror(errno));
+ return;
+ }
+
+ memcpy(&_info->info, info, sizeof(*info));
+ _info->dynamicbox = obj;
+ _info->cb = cb;
+ _info->data = data;
+ _info->ttl = MAX_TTL;
+
+ s_info.pended_event_list = eina_list_append(s_info.pended_event_list, _info);
+}
+
+
+
+static void try_again_send_event(struct pended_access_event *info)
+{
+ if (info->ttl < 0) {
+ _E("Event TTL reach to the end");
+ free(info);
+ return;
+ }
+
+ s_info.pended_event_list = eina_list_prepend(s_info.pended_event_list, info);
+}
+
+
+
+static struct pended_access_event *pop_pended_event_list(void)
+{
+ struct pended_access_event *info;
+
+ info = eina_list_nth(s_info.pended_event_list, 0);
+ if (info) {
+ s_info.pended_event_list = eina_list_remove(s_info.pended_event_list, info);
+ info->ttl--;
+ }
+
+ return info;
+}
+
+
+
+static void dbox_pended_event_consumer(Evas_Object *obj, int ret, void *data)
+{
+ struct pended_access_event *info;
+
+ info = pop_pended_event_list();
+ if (info) {
+ int ret;
+ ret = evas_object_dynamicbox_access_action(info->dynamicbox, info->info.action_type, &info->info, info->cb, info->data);
+ if (ret == DBOX_STATUS_ERROR_BUSY) {
+ _E("Failed to send pended event (%s), %X", action_type_string(info->info.action_type), ret);
+ try_again_send_event(info);
+ } else {
+ free(info);
+ }
+ }
+}
+
+
+
+static void send_access_event(Evas_Object *dynamicbox, Elm_Access_Action_Info *info, int must_be_sent, void (*cb)(Evas_Object *obj, int ret, void *data), void *data)
+{
+ int ret;
+
+ ret = evas_object_dynamicbox_access_action(dynamicbox, info->action_type, info, cb, data);
+ if (ret == DBOX_STATUS_ERROR_BUSY && must_be_sent) {
+ _D("Pending event (%s)", action_type_string(info->action_type));
+ push_pended_event_list(dynamicbox, info, cb, data);
+ }
+}
+
+
+
+static void del_cb(void *data, Evas *e, Evas_Object *dynamicbox, void *event_info)
+{
+ const char *dbox_id;
+ struct pended_access_event *info;
+ Eina_List *l;
+ Eina_List *n;
+
+ EINA_LIST_FOREACH_SAFE(s_info.pended_event_list, l, n, info) {
+ if (info->dynamicbox == dynamicbox) {
+ s_info.pended_event_list = eina_list_remove(s_info.pended_event_list, info);
+ free(info);
+ }
+ }
+
+ dbox_id = evas_object_dynamicbox_dbox_id(dynamicbox);
+ if (dbox_id) {
+ struct add_viewer_package *pkginfo;
+
+ pkginfo = add_viewer_package_find(dbox_id);
+ if (!pkginfo) {
+ _E("Add viewer has no info: %s", dbox_id);
+ } else {
+ add_viewer_package_set_skip(pkginfo, 0);
+ }
+ } else {
+ _E("Has no dbox_id?");
+ }
+}
+
+
+
+static void _dbox_created_cb(void *data, Evas_Object *obj, void *event_info)
+{
+}
+
+
+
+static void _dbox_updated_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int (*updated)(Evas_Object *obj);
+
+ updated = evas_object_data_get(obj, TAG_UPDATED);
+ if (!updated) {
+ return;
+ }
+
+ if (updated(obj) == ECORE_CALLBACK_CANCEL) {
+ evas_object_data_del(obj, TAG_UPDATED);
+ }
+}
+
+
+
+static void _dbox_control_scroll_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ struct dynamicbox_evas_event_info *ev = event_info;
+ int (*scroll)(Evas_Object *obj, int hold);
+
+ scroll = evas_object_data_get(obj, TAG_SCROLL);
+ if (!scroll) {
+ return;
+ }
+
+ if (scroll(obj, (ev->error == DBOX_STATUS_ERROR_NONE && ev->event == DBOX_EVENT_HOLD_SCROLL)) == ECORE_CALLBACK_CANCEL) {
+ evas_object_data_del(obj, TAG_SCROLL);
+ }
+}
+
+
+
+HAPI Evas_Object *dbox_create(Evas_Object *parent, const char *id, const char *subid, double period)
+{
+ Evas_Object *dynamicbox = NULL;
+ char *pkgname = NULL;
+ struct add_viewer_package *pkginfo;
+
+ retv_if(!id, NULL);
+
+ pkgname = dynamicbox_service_dbox_id(id);
+ if (pkgname) {
+ free(pkgname);
+ } else {
+ _D("%s is not installed in the pkgmgr DB", id);
+ return NULL;
+ }
+
+ dynamicbox = evas_object_dynamicbox_add(parent, id, subid, NULL, NULL, period);
+ retv_if(!dynamicbox, NULL);
+
+ pkginfo = add_viewer_package_find(id);
+ if (!pkginfo) {
+ _E("add-viewer info none: %s", id);
+ } else {
+ if (add_viewer_package_is_skipped(pkginfo)) {
+ _E("Package marked as skip");
+ }
+
+ add_viewer_package_set_skip(pkginfo, 1);
+ _D("Mark added: %s", id);
+ }
+
+ evas_object_event_callback_add(dynamicbox, EVAS_CALLBACK_DEL, del_cb, NULL);
+ evas_object_smart_callback_add(dynamicbox, DYNAMICBOX_SMART_SIGNAL_DBOX_CREATED, _dbox_created_cb, NULL);
+ evas_object_smart_callback_add(dynamicbox, DYNAMICBOX_SMART_SIGNAL_UPDATED, _dbox_updated_cb, NULL);
+ evas_object_smart_callback_add(dynamicbox, DYNAMICBOX_SMART_SIGNAL_CONTROL_SCROLLER, _dbox_control_scroll_cb, NULL);
+ return dynamicbox;
+}
+
+
+
+HAPI void dbox_destroy(Evas_Object *dynamicbox)
+{
+ ret_if(!dynamicbox);
+
+ evas_object_smart_callback_del(dynamicbox, DYNAMICBOX_SMART_SIGNAL_DBOX_CREATED, _dbox_created_cb);
+ evas_object_smart_callback_del(dynamicbox, DYNAMICBOX_SMART_SIGNAL_UPDATED, _dbox_updated_cb);
+ evas_object_smart_callback_del(dynamicbox, DYNAMICBOX_SMART_SIGNAL_CONTROL_SCROLLER, _dbox_control_scroll_cb);
+ evas_object_del(dynamicbox);
+}
+
+
+
+/* The content is updated */
+static void _dbox_extra_updated_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *page = data;
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ const char *content_info = NULL;
+
+ int center_index = 0;
+ int page_index = 0;
+ int ordering;
+
+ ret_if(!page);
+
+ _D("Dynamicbox is updated");
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->item);
+
+ layout_info = evas_object_data_get(page_info->layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ content_info = evas_object_dynamicbox_content(page_info->item);
+ ret_if(!content_info);
+
+ free(page_info->subid);
+ page_info->subid = strdup(content_info);
+ ret_if(!page_info->subid);
+
+ /* do not need to update DB on the edit mode */
+ if (layout_info->edit) return;
+
+ scroller_info = evas_object_data_get(page_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ center_index = scroller_seek_page_position(page_info->scroller, scroller_info->center);
+ page_index = scroller_seek_page_position(page_info->scroller, page);
+ ordering = page_index - center_index - 1;
+
+ db_update_item_by_ordering(page_info->id, content_info, ordering);
+
+ _SD("Dynamicbox is updated to [%s:%s:%d]", page_info->id, content_info, ordering);
+}
+
+
+
+static void _dbox_remove(Evas_Object *page)
+{
+ Evas_Object *proxy_page = NULL;
+ Evas_Object *page_current = NULL;
+ Evas_Object *scroller = NULL;
+ page_info_s *page_info = NULL;
+
+ /* We have to delete a proxy page on the edit mode */
+ proxy_page = evas_object_data_get(page, DATA_KEY_PROXY_PAGE);
+ if (proxy_page) {
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *proxy_page_info = NULL;
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!proxy_page_info);
+
+ scroller = proxy_page_info->scroller;
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ ret_if(!scroller_info->parent);
+
+ scroller_pop_page(proxy_page_info->scroller, proxy_page);
+ edit_destroy_proxy_page(proxy_page);
+
+ page_current = scroller_get_focused_page(scroller);
+ ret_if(!page_current);
+
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_RIGHT], page_current);
+ edit_change_focus(scroller, page_current);
+ edit_arrange_plus_page(scroller_info->parent);
+ }
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ _D("Dynamicbox(%s) is removed", page_info->id);
+
+ scroller = page_info->scroller;
+ ret_if(!scroller);
+
+ scroller_pop_page(page_info->scroller, page);
+ page_destroy(page);
+ if (!main_get_info()->is_tts) {
+ page_arrange_plus_page(scroller, 0);
+ }
+}
+
+
+
+static void _dbox_create_aborted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ struct dynamicbox_evas_event_info *ev = event_info;
+ Evas_Object *page = data;
+ Eina_List *page_info_list = NULL;
+ layout_info_s *layout_info = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ _D("Dynamicbox is aborted to create");
+
+ /* We have to get the page_info before removing it */
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ layout_info = evas_object_data_get(page_info->layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ if (ev->error == DBOX_STATUS_ERROR_EXIST) {
+ _SW("Already exists %s", ev->pkgname);
+ _dbox_remove(page);
+ } else if (ev->error == DBOX_STATUS_ERROR_DISABLED) {
+ _SW("Disable %s", ev->pkgname);
+ _dbox_remove(page);
+ page_info_list = scroller_write_list(layout_info->scroller);
+ if (page_info_list) {
+ db_read_list(page_info_list);
+ page_info_list_destroy(page_info_list);
+ } else {
+ db_remove_all_item();
+ }
+ }
+}
+
+
+
+static void _dbox_period_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ struct dynamicbox_evas_event_info *ev = event_info;
+ _SD("Period changed: %s -> %lf", ev->pkgname, evas_object_dynamicbox_period(obj));
+ /*
+ * TODO: Update the period information - Sync with DB?
+ */
+}
+
+
+
+static void _dbox_faulted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ struct dynamicbox_evas_event_info *ev = event_info;
+
+ _SD("Dynamicbox is faulted - %s", ev->pkgname);
+}
+
+
+
+static void _dbox_deleted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ struct dynamicbox_evas_event_info *ev = event_info;
+ Evas_Object *page = data;
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ _D("Dynamicbox is deleted");
+
+ if (ev->error == DBOX_STATUS_ERROR_FAULT) {
+ /* DBox is faulted. */
+ _SE("Dynamicbox is faulted - %s", ev->pkgname);
+ return;
+ }
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ if (!evas_object_dynamicbox_is_faulted(page_info->item)) {
+ _dbox_remove(page);
+ }
+}
+
+
+
+static void _dbox_access_action_ret_cb(Evas_Object *obj, int ret, void *data)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ switch (ret) {
+ case DYNAMICBOX_ACCESS_FIRST:
+ case DYNAMICBOX_ACCESS_LAST:
+ {
+ Elm_Access_Action_Info action_info;
+ memset(&action_info, 0, sizeof(action_info));
+ action_info.action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT;
+ push_pended_event_list(page_info->item, &action_info, dbox_pended_event_consumer, NULL);
+ }
+ case DYNAMICBOX_ACCESS_ERROR: /* In case of error, we have to set focus on our page */
+ page_info->need_to_unhighlight = EINA_FALSE;
+ page_info->highlight_changed = EINA_FALSE;
+ page_info->need_to_read = EINA_TRUE;
+
+ /* Update highlight */
+ _D("The result of access action is (%d) %s", ret, page_info->highlighted ? "hl" : "unhl");
+ elm_access_highlight_set(page_info->focus);
+ break;
+ case DYNAMICBOX_ACCESS_DONE:
+ case DYNAMICBOX_ACCESS_READ:
+ default:
+ if (page_info->highlighted) {
+ page_info->need_to_unhighlight = EINA_TRUE;
+ if (!page_info->highlight_changed) {
+ page_info->highlight_changed = EINA_TRUE;
+ _D("Need to unhighlight");
+ elm_access_highlight_set(page_info->focus);
+ } else {
+ _D("Do not change the highlight");
+ }
+ } else {
+ _D("page_info->highlight EINA_FALSE");
+ }
+ }
+
+ dbox_pended_event_consumer(obj, ret, data);
+}
+
+
+
+static Eina_Bool _highlight_action_cb(void *data, Evas_Object *focus, Elm_Access_Action_Info *action_info)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) {
+ _E("Page info is not valid\n");
+ return EINA_FALSE;
+ }
+
+ if (page_info->highlighted == EINA_FALSE) {
+ page_info->highlighted = EINA_TRUE;
+ page_info->need_to_read = EINA_TRUE;
+ _D("Turn on highlight");
+ return EINA_FALSE;
+ }
+
+ if (page_info->need_to_unhighlight) {
+ page_info->need_to_unhighlight = EINA_FALSE;
+ _D("Turn off highlight");
+ return EINA_TRUE;
+ } else {
+ _D("Turn on highlight");
+ return EINA_FALSE;
+ }
+}
+
+
+
+static Eina_Bool _unhighlight_action_cb(void *data, Evas_Object *focus, Elm_Access_Action_Info *action_info)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) {
+ _E("Page info is not valid\n");
+ return EINA_FALSE;
+ }
+
+ if (page_info->highlighted == EINA_TRUE) {
+ Elm_Access_Action_Info _action_info;
+
+ _D("Reset highlight flags");
+ page_info->highlighted = EINA_FALSE;
+ page_info->highlight_changed = EINA_FALSE;
+
+ memset(&_action_info, 0, sizeof(_action_info));
+ if (s_info.is_scrolling) {
+ if (page_info->is_scrolled_object) {
+ page_info->is_scrolled_object = EINA_FALSE;
+
+ if (evas_object_dynamicbox_is_faulted(page_info->item)) {
+ _D("Faulted");
+ return EINA_FALSE;
+ }
+
+ // We have to cancelate the scroll event.
+ _action_info.mouse_type = 2; // MOUSE_UP
+ _action_info.action_type = ELM_ACCESS_ACTION_SCROLL;
+ send_access_event(page_info->item, &_action_info, 1, dbox_pended_event_consumer, NULL);
+
+ _action_info.mouse_type = 0;
+ _action_info.action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT;
+ send_access_event(page_info->item, &_action_info, 1, dbox_pended_event_consumer, NULL);
+ _D("Reset scroll event");
+ }
+ } else {
+ // Need to turn of highlight
+ _action_info.action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT;
+ send_access_event(page_info->item, &_action_info, 1, dbox_pended_event_consumer, NULL);
+ }
+ return EINA_FALSE;
+ }
+
+ _D("Unhighlighted");
+ return EINA_TRUE;
+}
+
+
+
+static Eina_Bool _access_action_activate_cb(void *data, Evas_Object *focus, Elm_Access_Action_Info *action_info)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) {
+ _E("Page info is not valid\n");
+ /* Do not change the highlight in this case, so return EINA_TRUE */
+ return EINA_FALSE;
+ }
+
+ if (page_info->highlighted == EINA_FALSE) {
+ _D("Highlight is not exists");
+ return EINA_FALSE;
+ }
+
+ if (evas_object_dynamicbox_is_faulted(page_info->item)) {
+ _D("Activate Dynamicbox\n");
+ evas_object_dynamicbox_activate(page_info->item);
+ } else {
+ _D("Access action(%s) for focus(%p <> %p) is called", action_type_string(action_info->action_type), focus, page_info->focus);
+ send_access_event(page_info->item, action_info, 1, _dbox_access_action_ret_cb, page);
+ /* Highligh off and then reset highlight from return callback _dbox_access_action_ret_cb() */
+ }
+
+ return EINA_TRUE;
+}
+
+
+
+static Eina_Bool _access_action_scroll_cb(void *data, Evas_Object *focus, Elm_Access_Action_Info *action_info)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info;
+ int must = 0;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) {
+ _E("Page info is not valid\n");
+ /* Do not change the highlight in this case, so return EINA_TRUE */
+ return EINA_FALSE;
+ }
+
+ if (page_info->highlighted == EINA_FALSE) {
+ _D("Highlight is not exists");
+ return EINA_FALSE;
+ }
+
+ if (action_info->mouse_type == 0) { // MOUSE_DOWN
+ s_info.is_scrolling = EINA_TRUE;
+ page_info->is_scrolled_object = EINA_TRUE;
+ must = 1;
+ } else if (action_info->mouse_type == 2) { // MOUSE_UP
+ s_info.is_scrolling = EINA_FALSE;
+
+ if (!page_info->is_scrolled_object) {
+ return EINA_FALSE;
+ }
+
+ page_info->is_scrolled_object = EINA_FALSE;
+ must = 1;
+ } else if (s_info.is_scrolling != EINA_TRUE) {
+ return EINA_FALSE;
+ }
+
+ if (evas_object_dynamicbox_is_faulted(page_info->item)) {
+ _D("Faulted box, do not send any events");
+ return EINA_FALSE;
+ }
+
+ send_access_event(page_info->item, action_info, must, dbox_pended_event_consumer, NULL);
+
+ /* Highligh off and then reset highlight from return callback _dbox_access_action_ret_cb() */
+ return EINA_FALSE;
+}
+
+
+
+static Eina_Bool delayed_faulted_action_cb(void *data)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info;
+ Elm_Access_Action_Info action_info;
+ int ret = ECORE_CALLBACK_RENEW;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) {
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ memset(&action_info, 0, sizeof(action_info));
+
+ if ((int)evas_object_data_get(page, TAG_FAULT_HL) == 1) {
+ action_info.action_type = ELM_ACCESS_ACTION_HIGHLIGHT;
+ /**
+ * Call elm_access_action with "HIGHLIGHT", will invoke the ELM_ACCESS_ACTION_READ callback.
+ * It will invoke the _access_action_forward_cb,
+ */
+ elm_access_action(page_info->focus, action_info.action_type, &action_info);
+
+ evas_object_data_del(page, TAG_FAULT_HL);
+ page_info->faulted_hl_timer = NULL;
+ ret = ECORE_CALLBACK_CANCEL;
+ } else if ((int)evas_object_data_get(page, TAG_FAULT_HL) == 0) {
+ action_info.action_type = ELM_ACCESS_ACTION_UNHIGHLIGHT;
+ elm_access_action(page_info->focus, action_info.action_type, &action_info);
+
+ evas_object_data_set(page, TAG_FAULT_HL, (void *)1);
+ }
+
+ return ret;
+}
+
+
+
+/**
+ * ELM_ACCESS_ACTION_HIGHLIGHT_NEXT
+ * ELM_ACCESS_ACTION_HIGHLIGHT_PREV
+ * ELM_ACCESS_ACTION_VALUE_CHANGE
+ * ELM_ACCESS_ACTION_BACK
+ * ELM_ACCESS_ACTION_READ
+ * ELM_ACCESS_ACTION_ENABLE
+ * ELM_ACCESS_ACTION_DISABLE
+ */
+static Eina_Bool _access_action_forward_cb(void *data, Evas_Object *focus, Elm_Access_Action_Info *action_info)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info;
+ Evas_Coord x, y;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) {
+ _E("Page info is not valid\n");
+ /* Do not change the highlight in this case, so return EINA_TRUE */
+ return EINA_FALSE;
+ }
+
+ if (page_info->highlighted == EINA_FALSE) {
+ _D("Highlight is not exists");
+ return EINA_FALSE;
+ }
+
+ evas_object_geometry_get(page_info->item, &x, &y, NULL, NULL);
+
+ if (s_info.is_scrolling || x || y) {
+ _D("I don't want to do anything! %dx%d", x, y);
+ return EINA_FALSE;
+ }
+
+ if (evas_object_dynamicbox_is_faulted(page_info->item)) {
+ switch (action_info->action_type) {
+ case ELM_ACCESS_ACTION_READ:
+ break;
+ case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
+ case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
+ if (!page_info->faulted_hl_timer) {
+ page_info->faulted_hl_timer = ecore_timer_add(FAULTED_HL_TIMER, delayed_faulted_action_cb, page);
+ if (!page_info->faulted_hl_timer) {
+ _E("Faulted box, faulted timer failed");
+ } else {
+ _D("Faulted box, Add highlight emulate timer");
+ }
+ } else {
+ _D("Faulted box, Keep highlight emulate timer");
+ }
+ break;
+ default:
+ break;
+ }
+ page_info->need_to_read = EINA_TRUE;
+
+ return EINA_TRUE;
+ }
+
+ _D("Access action(%s) for focus(%p <> %p) is called, by(%d)", action_type_string(action_info->action_type), focus, page_info->focus, action_info->action_by);
+ send_access_event(page_info->item, action_info, 1, _dbox_access_action_ret_cb, page);
+
+ /* Highligh off and then reset highlight from return callback _dbox_access_action_ret_cb() */
+ return EINA_TRUE;
+}
+
+
+
+static Eina_Bool _access_action_mouse_cb(void *data, Evas_Object *focus, Elm_Access_Action_Info *action_info)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info;
+ int must;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) {
+ _E("Page info is not valid\n");
+ /* Do not change the highlight in this case, so return EINA_TRUE */
+ return EINA_FALSE;
+ }
+
+ if (page_info->highlighted == EINA_FALSE) {
+ _D("Highlight is not exists");
+ return EINA_FALSE;
+ }
+
+ if (evas_object_dynamicbox_is_faulted(page_info->item)) {
+ _D("Faulted box, do not send any events");
+ return EINA_FALSE;
+ }
+
+ if (s_info.is_scrolling) {
+ _D("I don't want to do anything!");
+ return EINA_FALSE;
+ }
+
+ must = action_info->mouse_type != 1;
+
+ _D("Access action(%s) for focus(%p <> %p) is called", action_type_string(action_info->action_type), focus, page_info->focus);
+ send_access_event(page_info->item, action_info, must, dbox_pended_event_consumer, NULL);
+
+ /* Highligh off and then reset highlight from return callback _dbox_access_action_ret_cb() */
+ return EINA_TRUE;
+}
+
+
+
+static char *_access_widget_read_cb(void *data, Evas_Object *obj)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info = NULL;
+ char *tmp;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ if (evas_object_dynamicbox_is_dynamicbox(page_get_item(page)) == 1) {
+ if (page_info->need_to_read == EINA_FALSE) {
+ /*
+ * need_to_read will be toggled by _access_page_num_cb function
+ * so this function should not touch it.
+ */
+ return NULL;
+ }
+
+ if (page_info->need_to_unhighlight == EINA_TRUE) {
+ return NULL;
+ }
+ }
+
+ tmp = strdup(_("IDS_IDLE_HEADER_WIDGET"));
+ retv_if(!tmp, NULL);
+ return tmp;
+}
+
+
+static char *_access_page_name_cb(void *data, Evas_Object *obj)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info = NULL;
+ char *title;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ if (evas_object_dynamicbox_is_dynamicbox(page_get_item(page)) == 1) {
+ if (page_info->need_to_read == EINA_FALSE) {
+ /*
+ * need_to_read will be toggled by _access_page_num_cb function
+ * so this function should not touch it.
+ */
+ return NULL;
+ }
+
+ if (page_info->need_to_unhighlight == EINA_TRUE) {
+ return NULL;
+ }
+ }
+
+ if (page_info->title) {
+ title = strdup(page_info->title);
+ retv_if(!title, NULL);
+ return title;
+ }
+
+ /* EFL will free this title. */
+ title = page_read_title(page);
+ retv_if(!title, NULL);
+
+ return title;
+}
+
+
+
+static char *_access_context_info_cb(void *data, Evas_Object *obj)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info = NULL;
+ char *ctx = NULL;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ if (evas_object_dynamicbox_is_faulted(page_info->item)) {
+ if (page_info->need_to_read == EINA_FALSE) {
+ return NULL;
+ }
+
+ if (page_info->need_to_unhighlight == EINA_TRUE) {
+ return NULL;
+ }
+ page_info->need_to_read = EINA_FALSE;
+ ctx = strdup(_("IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"));
+ }
+
+ return ctx;
+}
+
+
+
+HAPI void dbox_add_callback(Evas_Object *dynamicbox, Evas_Object *page)
+{
+ page_info_s *page_info = NULL;
+
+ ret_if(!dynamicbox);
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ /* Only handling the focus set operation to page_focus */
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_HIGHLIGHT, _highlight_action_cb, page);
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_UNHIGHLIGHT, _unhighlight_action_cb, page);
+
+ /* Deliever events to the dynamicbox */
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, _access_action_forward_cb, page);
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, _access_action_forward_cb, page);
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_VALUE_CHANGE, _access_action_forward_cb, page);
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_BACK, _access_action_forward_cb, page);
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_READ, _access_action_forward_cb, page);
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_ENABLE, _access_action_forward_cb, page);
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_DISABLE, _access_action_forward_cb, page);
+
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_ACTIVATE, _access_action_activate_cb, page);
+
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_SCROLL, _access_action_scroll_cb, page);
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_MOUSE, _access_action_mouse_cb, page);
+ elm_access_action_cb_set(page_info->focus, ELM_ACCESS_ACTION_OVER, _access_action_mouse_cb, page);
+
+ elm_access_info_cb_set(page_info->focus, ELM_ACCESS_INFO, _access_page_name_cb, page);
+ elm_access_info_cb_set(page_info->focus, ELM_ACCESS_TYPE, _access_widget_read_cb, page);
+ elm_access_info_cb_set(page_info->focus, ELM_ACCESS_CONTEXT_INFO, _access_context_info_cb, page);
+
+ evas_object_smart_callback_add(dynamicbox, DYNAMICBOX_SMART_SIGNAL_EXTRA_INFO_UPDATED, _dbox_extra_updated_cb, page);
+ evas_object_smart_callback_add(dynamicbox, DYNAMICBOX_SMART_SIGNAL_DBOX_DELETED, _dbox_deleted_cb, page);
+ evas_object_smart_callback_add(dynamicbox, DYNAMICBOX_SMART_SIGNAL_DBOX_FAULTED, _dbox_faulted_cb, page);
+ evas_object_smart_callback_add(dynamicbox, DYNAMICBOX_SMART_SIGNAL_PERIOD_CHANGED, _dbox_period_changed_cb, page);
+ evas_object_smart_callback_add(dynamicbox, DYNAMICBOX_SMART_SIGNAL_DBOX_CREATE_ABORTED, _dbox_create_aborted_cb, page);
+}
+
+
+
+HAPI void dbox_del_callback(Evas_Object *dynamicbox)
+{
+ ret_if(!dynamicbox);
+
+ evas_object_smart_callback_del(dynamicbox, DYNAMICBOX_SMART_SIGNAL_EXTRA_INFO_UPDATED, _dbox_extra_updated_cb);
+ evas_object_smart_callback_del(dynamicbox, DYNAMICBOX_SMART_SIGNAL_DBOX_DELETED, _dbox_deleted_cb);
+ evas_object_smart_callback_del(dynamicbox, DYNAMICBOX_SMART_SIGNAL_DBOX_FAULTED, _dbox_faulted_cb);
+ evas_object_smart_callback_del(dynamicbox, DYNAMICBOX_SMART_SIGNAL_PERIOD_CHANGED, _dbox_period_changed_cb);
+ evas_object_smart_callback_del(dynamicbox, DYNAMICBOX_SMART_SIGNAL_DBOX_CREATE_ABORTED, _dbox_create_aborted_cb);
+}
+
+
+
+HAPI void dbox_set_update_callback(Evas_Object *obj, int (*updated)(Evas_Object *obj))
+{
+ evas_object_data_set(obj, TAG_UPDATED, updated);
+}
+
+
+
+HAPI void dbox_set_scroll_callback(Evas_Object *obj, int (*scroll)(Evas_Object *obj, int hold))
+{
+ evas_object_data_set(obj, TAG_SCROLL, scroll);
+}
+
+
+
+static int uninstall_cb(const char *pkgname, enum pkgmgr_status status, double value, void *data)
+{
+ layout_info_s *layout_info;
+ scroller_info_s *scroller_info;
+ page_info_s *page_info;
+ Eina_List *page_list;
+ Evas_Object *page;
+
+ if (status != PKGMGR_STATUS_START) {
+ return 0;
+ }
+
+ if (!main_get_info()->layout) {
+ return 0;
+ }
+
+ layout_info = evas_object_data_get(main_get_info()->layout, DATA_KEY_LAYOUT_INFO);
+ if (!layout_info) {
+ return 0;
+ }
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ if (!scroller_info) {
+ return 0;
+ }
+
+ if (!scroller_info->box) {
+ return 0;
+ }
+
+ page_list = elm_box_children_get(scroller_info->box);
+ EINA_LIST_FREE(page_list, page) {
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) {
+ continue;
+ }
+
+ if (page_info->direction != PAGE_DIRECTION_RIGHT) {
+ continue;
+ }
+
+ if (!page_info->item) {
+ continue;
+ }
+
+ if (!evas_object_dynamicbox_is_faulted(page_info->item)) {
+ continue;
+ }
+
+ _D("Faulted package: %s", evas_object_dynamicbox_dbox_id(page_info->item));
+ _dbox_remove(page);
+ }
+
+ return 0;
+}
+
+
+
+HAPI void dbox_init(Evas_Object *win)
+{
+ int val;
+
+ add_viewer_pkgmgr_add_event_callback(PKGMGR_EVENT_UNINSTALL, uninstall_cb, NULL);
+
+ evas_object_dynamicbox_conf_set(DYNAMICBOX_EVAS_AUTO_RENDER_SELECTION, 1);
+
+ if (vconf_get_int("memory/private/org.tizen.w-home/auto_feed", &val) >= 0) {
+ evas_object_dynamicbox_conf_set(DYNAMICBOX_EVAS_EVENT_AUTO_FEED, val);
+ }
+
+ if (vconf_get_int("memory/private/org.tizen.w-home/sensitive_move", &val) >= 0) {
+ evas_object_dynamicbox_conf_set(DYNAMICBOX_EVAS_SENSITIVE_MOVE, val);
+ }
+
+ evas_object_dynamicbox_init(win, 0);
+ evas_object_dynamicbox_conf_set(DYNAMICBOX_EVAS_SCROLL_X, 1);
+}
+
+
+
+HAPI void dbox_fini(void)
+{
+ evas_object_dynamicbox_fini();
+ add_viewer_pkgmgr_del_event_callback(PKGMGR_EVENT_UNINSTALL, uninstall_cb, NULL);
+}
+
+
+
+// End of a file
diff --git a/home/src/dbus.c b/home/src/dbus.c
new file mode 100755
index 0000000..7410ce2
--- /dev/null
+++ b/home/src/dbus.c
@@ -0,0 +1,451 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Ecore.h>
+#include <Ecore_X.h>
+#include <Ecore_Evas.h>
+#include <Elementary.h>
+#include <utilX.h>
+#include <dd-display.h>
+#include <aul.h>
+#include <syspopup_caller.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
+#include <efl_assist.h>
+#include <dlog.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+
+#include "util.h"
+#include "main.h"
+#include "log.h"
+#include "dbus.h"
+#include "gesture.h"
+#include "minictrl.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "apps/apps_main.h"
+
+static struct _info {
+ DBusConnection *connection;
+ Eina_List *cbs_list[DBUS_EVENT_MAX];
+} s_info = {
+ .connection = NULL,
+ .cbs_list = {NULL, },
+};
+
+typedef struct {
+ void (*result_cb)(void *, void *);
+ void *result_data;
+} dbus_cb_s;
+
+HAPI int home_dbus_register_cb(
+ int type,
+ void (*result_cb)(void *, void *), void *result_data)
+{
+ retv_if(result_cb == NULL, W_HOME_ERROR_INVALID_PARAMETER);
+
+ dbus_cb_s *cb = calloc(1, sizeof(dbus_cb_s));
+ retv_if(cb == NULL, W_HOME_ERROR_FAIL);
+
+ cb->result_cb = result_cb;
+ cb->result_data = result_data;
+
+ s_info.cbs_list[type] = eina_list_prepend(s_info.cbs_list[type], cb);
+ retv_if(s_info.cbs_list[type] == NULL, W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+HAPI void home_dbus_unregister_cb(
+ int type,
+ void (*result_cb)(void *, void *))
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ dbus_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(s_info.cbs_list[type], l, n, cb) {
+ continue_if(cb == NULL);
+ if (result_cb != cb->result_cb) continue;
+ s_info.cbs_list[type] = eina_list_remove(s_info.cbs_list[type], cb);
+ free(cb);
+ return;
+ }
+}
+
+static void _execute_cbs(int type, void *event_info)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *n = NULL;
+ dbus_cb_s *cb = NULL;
+ EINA_LIST_FOREACH_SAFE(s_info.cbs_list[type], l, n, cb) {
+ continue_if(cb == NULL);
+ continue_if(cb->result_cb == NULL);
+
+ cb->result_cb(cb->result_data, event_info);
+ }
+}
+
+static Evas_Object *_scroller_get(void) {
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ if (layout != NULL) {
+ scroller = elm_object_part_content_get(layout, "scroller");
+ }
+ }
+
+ return scroller;
+}
+
+static DBusConnection *_dbus_connection_get(void) {
+
+ if (s_info.connection == NULL) {
+ DBusError derror;
+ DBusConnection *connection = NULL;
+
+ dbus_error_init(&derror);
+ connection = dbus_bus_get_private(DBUS_BUS_SYSTEM, &derror);
+ if (connection == NULL) {
+ _E("Failed to get dbus connection:%s", derror.message);
+ dbus_error_free(&derror);
+ return NULL;
+ }
+ dbus_connection_setup_with_g_main(connection, NULL);
+ dbus_error_free(&derror);
+
+ s_info.connection = connection;
+ }
+
+ return s_info.connection;
+}
+
+static Eina_Bool _procsweep_idler_cb(void *data)
+{
+ home_dbus_procsweep_signal_send();
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool _home_raise_idler_cb(void *data)
+{
+ home_dbus_home_raise_signal_send();
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static int _is_window_on_top(void)
+{
+ int pid = -1;
+ char *cmd = NULL;
+
+ pid = util_find_top_visible_window(&cmd);
+ if(pid == -1) {
+ _E("Failed to get top visible window pid");
+ }
+
+ if(pid == getpid()) {
+ free(cmd);
+ return 1;
+ }
+
+ free(cmd);
+
+ return 0;
+}
+
+/* DBus message handler callback */
+static DBusHandlerResult _dbus_message_recv_cb(DBusConnection *connection, DBusMessage *message, void *data)
+{
+ Ecore_X_GC gc;
+ unsigned int foreground;
+ int wristup_setting = 0;
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *scroller = _scroller_get();
+
+ if (win == NULL || scroller == NULL) {
+ _E("win or scroller is NULL, give up");
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+
+ if (dbus_message_is_signal(message, DBUS_WAKEUP_GESTURE_INTERFACE, DBUS_WAKEUP_GESTURE_MEMBER_WAKEUP)) {
+ wristup_setting = home_gesture_wristup_setting_get();
+ _E("WristUp:%d", wristup_setting);
+
+ if (wristup_setting == HOME_GESTURE_WRISTUP_CLOCK) {
+ int is_clock_displayed = 0;
+ int is_window_on_top = _is_window_on_top();
+ is_window_on_top = (apps_main_is_visible() == EINA_TRUE) ? 0 : is_window_on_top;
+
+ if (scroller_get_current_page_direction(scroller) == PAGE_DIRECTION_CENTER) {
+ is_clock_displayed = 1;
+ }
+
+ if (is_clock_displayed == 0 || is_window_on_top == 0) {
+ scroller_bring_in_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+
+ int w, h;
+ Evas *e;
+ Ecore_Evas *ee;
+ ee = ecore_evas_ecore_evas_get(evas_object_evas_get(main_get_info()->win));
+ e = ecore_evas_get(ee);
+ evas_output_viewport_get(e, NULL, NULL, &w, &h);
+ evas_obscured_clear(e);
+ evas_damage_rectangle_add(e, 0, 0, w, h);
+ ecore_evas_manual_render(ee);
+
+ gc = ecore_x_gc_new(0, ECORE_X_GC_VALUE_MASK_FOREGROUND, &foreground);
+ ecore_x_pixmap_paste(elm_win_xwindow_get(main_get_info()->win)
+ , ecore_x_window_root_first_get(), gc, 0, 0, main_get_info()->root_w, main_get_info()->root_h, 0, 0);
+ ecore_x_sync();
+
+ if (is_window_on_top == 0) {
+ elm_win_raise(main_get_info()->win);
+ }
+ home_dbus_lcd_on_signal_send(EINA_TRUE);
+ } else {
+ home_dbus_lcd_on_signal_send(EINA_TRUE);
+ }
+ home_dbus_lcd_on_signal_send(EINA_TRUE);
+ } else if (wristup_setting == HOME_GESTURE_WRISTUP_LASTVIEW) {
+ home_dbus_lcd_on_signal_send(EINA_TRUE);
+ }
+ } else if (dbus_message_is_signal(message, DBUS_LOW_BATTERY_INTERFACE, DBUS_LOW_BATTERY_MEMBER_EXTREME_LEVEL)) {
+ _D("Low Battery signal received : %p", message);
+
+ if (main_get_info()->win) {
+ elm_win_activate(main_get_info()->win);
+ scroller_bring_in_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+ ecore_idler_add(_home_raise_idler_cb, NULL);
+ ecore_idler_add(_procsweep_idler_cb, NULL);
+ }
+ } else if (dbus_message_is_signal(message, DBUS_DEVICED_DISPLAY_INTERFACE, DBUS_DEVICED_DISPLAY_MEMBER_LCD_ON)) {
+ _W("LCD on");
+ int ret = 0;
+ DBusError derror;
+ const char *state = NULL;
+ dbus_error_init(&derror);
+ ret = dbus_message_get_args(message, &derror, DBUS_TYPE_STRING, &state, DBUS_TYPE_INVALID);
+ if (!ret) {
+ _E("Failed to get reply (%s:%s)", derror.name, derror.message);
+ }
+ _execute_cbs(DBUS_EVENT_LCD_ON, (void*)state);
+ dbus_error_free(&derror);
+ } else if (dbus_message_is_signal(message, DBUS_DEVICED_DISPLAY_INTERFACE, DBUS_DEVICED_DISPLAY_MEMBER_LCD_OFF)) {
+ _W("LCD on");
+ int ret = 0;
+ DBusError derror;
+ const char *state = NULL;
+ dbus_error_init(&derror);
+ ret = dbus_message_get_args(message, &derror, DBUS_TYPE_STRING, &state, DBUS_TYPE_INVALID);
+ if (!ret) {
+ _E("Failed to get reply (%s:%s)", derror.name, derror.message);
+ }
+ _execute_cbs(DBUS_EVENT_LCD_OFF, (void*)state);
+ dbus_error_free(&derror);
+ } else if (dbus_message_is_signal(message, DBUS_DEVICED_SYSNOTI_INTERFACE, DBUS_DEVICED_SYSNOTI_MEMBER_COOLDOWN_CHANGED)) {
+ _E("Cooldown status message received");
+ int ret = 0;
+ DBusError derror;
+ const char *state = NULL;
+ dbus_error_init(&derror);
+ ret = dbus_message_get_args(message, &derror, DBUS_TYPE_STRING, &state, DBUS_TYPE_INVALID);
+ if (!ret) {
+ _E("Failed to get reply (%s:%s)", derror.name, derror.message);
+ }
+ _execute_cbs(DBUS_EVENT_COOLDOWN_STATE_CHANGED, (void *)state);
+ dbus_error_free(&derror);
+ } else if (dbus_message_is_signal(message, DBUS_ALPM_MANAGER_INTERFACE, DBUS_ALPM_MANAGER_MEMBER_STATUS)) {
+ _E("ALPM manager status message received");
+ int ret = 0;
+ DBusError derror;
+ const char *state = NULL;
+ dbus_error_init(&derror);
+ ret = dbus_message_get_args(message, &derror, DBUS_TYPE_STRING, &state, DBUS_TYPE_INVALID);
+ if (!ret) {
+ _E("Failed to get reply (%s:%s)", derror.name, derror.message);
+ }
+ _execute_cbs(DBUS_EVENT_ALPM_MANAGER_STATE_CHANGED, (void *)state);
+ dbus_error_free(&derror);
+ }
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static w_home_error_e _dbus_sig_attach(char *path, char *interface, char *member)
+{
+ DBusError derror;
+ DBusConnection *connection = NULL;
+ retv_if(path == NULL, W_HOME_ERROR_FAIL);
+ retv_if(interface == NULL, W_HOME_ERROR_FAIL);
+
+ /* DBUS */
+ connection = _dbus_connection_get();
+ if (connection == NULL) {
+ _E("failed to get DBUS connection");
+ return W_HOME_ERROR_FAIL;
+ }
+
+ dbus_error_init(&derror);
+
+ /* Set the DBus rule for the wakeup gesture signal */
+ char rules[512] = {0,};
+ sprintf(rules, "path='%s',type='signal',interface='%s',member='%s'", path, interface, member);
+ dbus_bus_add_match(connection, rules, &derror);
+ if (dbus_error_is_set(&derror)) {
+ _E("D-BUS rule adding error: %s", derror.message);
+ dbus_error_free(&derror);
+ return W_HOME_ERROR_FAIL;
+ }
+
+ /* Set the callback function */
+ if(dbus_connection_add_filter(connection, _dbus_message_recv_cb, NULL, NULL) == FALSE) {
+ _E("Failed to add dbus filter : %s", derror.message);
+ dbus_error_free(&derror);
+ return W_HOME_ERROR_FAIL;
+ }
+
+ dbus_error_free(&derror);
+
+ return W_HOME_ERROR_NONE;
+}
+
+static void _dbus_sig_dettach(const char *path, const char *interface, const char *member)
+{
+ DBusError err;
+ DBusConnection *connection = NULL;
+ ret_if(path == NULL);
+ ret_if(interface == NULL);
+
+ connection = _dbus_connection_get();
+ if (connection == NULL) {
+ _E("failed to get DBUS connection");
+ return ;
+ }
+
+ dbus_error_init(&err);
+ dbus_connection_remove_filter(connection, _dbus_message_recv_cb, NULL);
+
+ char rules[512] = {0,};
+
+ snprintf(rules, sizeof(rules), "path='%s',type='signal',interface='%s',member='%s'", path, interface, member);
+ dbus_bus_remove_match(connection, rules, &err);
+ if(dbus_error_is_set(&err)) {
+ _E("Failed to dbus_bus_remove_match : %s", err.message);
+ }
+
+ dbus_error_free(&err);
+}
+
+HAPI void *home_dbus_connection_get(void)
+{
+ return (void *)_dbus_connection_get();
+}
+
+HAPI void home_dbus_init(void *data)
+{
+#if 0
+ if(_dbus_sig_attach(
+ DBUS_WAKEUP_GESTURE_PATH,
+ DBUS_WAKEUP_GESTURE_INTERFACE,
+ DBUS_WAKEUP_GESTURE_MEMBER_WAKEUP) != W_HOME_ERROR_NONE) {
+ _E("Failed to attach gesture signal filter");
+ }
+#endif
+
+ if(_dbus_sig_attach(
+ DBUS_LOW_BATTERY_PATH,
+ DBUS_LOW_BATTERY_INTERFACE,
+ DBUS_LOW_BATTERY_MEMBER_EXTREME_LEVEL) != W_HOME_ERROR_NONE) {
+ _E("Failed to attach low battery signal filter");
+ }
+
+ if(_dbus_sig_attach(
+ DBUS_DEVICED_DISPLAY_PATH,
+ DBUS_DEVICED_DISPLAY_INTERFACE,
+ DBUS_DEVICED_DISPLAY_MEMBER_LCD_ON) != W_HOME_ERROR_NONE) {
+ _E("Failed to attach LCD on signal filter");
+ }
+
+ if(_dbus_sig_attach(
+ DBUS_DEVICED_DISPLAY_PATH,
+ DBUS_DEVICED_DISPLAY_INTERFACE,
+ DBUS_DEVICED_DISPLAY_MEMBER_LCD_OFF) != W_HOME_ERROR_NONE) {
+ _E("Failed to attach LCD off signal filter");
+ }
+
+ if(_dbus_sig_attach(
+ DBUS_DEVICED_SYSNOTI_PATH,
+ DBUS_DEVICED_SYSNOTI_INTERFACE,
+ DBUS_DEVICED_SYSNOTI_MEMBER_COOLDOWN_CHANGED) != W_HOME_ERROR_NONE) {
+ _E("Failed to attach cooldown mode signal filter");
+ }
+
+ if(_dbus_sig_attach(
+ DBUS_ALPM_MANAGER_PATH,
+ DBUS_ALPM_MANAGER_INTERFACE,
+ DBUS_ALPM_MANAGER_MEMBER_STATUS) != W_HOME_ERROR_NONE) {
+ _E("Failed to attach alpm manager signal filter");
+ }
+}
+
+HAPI void home_dbus_fini(void *data)
+{
+#if 0
+ _dbus_sig_dettach(
+ DBUS_WAKEUP_GESTURE_PATH,
+ DBUS_WAKEUP_GESTURE_INTERFACE,
+ DBUS_WAKEUP_GESTURE_MEMBER_WAKEUP);
+#endif
+ _dbus_sig_dettach(
+ DBUS_LOW_BATTERY_PATH,
+ DBUS_LOW_BATTERY_INTERFACE,
+ DBUS_LOW_BATTERY_MEMBER_EXTREME_LEVEL);
+
+ _dbus_sig_dettach(
+ DBUS_DEVICED_DISPLAY_PATH,
+ DBUS_DEVICED_DISPLAY_INTERFACE,
+ DBUS_DEVICED_DISPLAY_MEMBER_LCD_ON);
+
+ _dbus_sig_dettach(
+ DBUS_DEVICED_DISPLAY_PATH,
+ DBUS_DEVICED_DISPLAY_INTERFACE,
+ DBUS_DEVICED_DISPLAY_MEMBER_LCD_OFF);
+
+ _dbus_sig_dettach(
+ DBUS_DEVICED_SYSNOTI_PATH,
+ DBUS_DEVICED_SYSNOTI_INTERFACE,
+ DBUS_DEVICED_SYSNOTI_MEMBER_COOLDOWN_CHANGED);
+
+ _dbus_sig_dettach(
+ DBUS_ALPM_MANAGER_PATH,
+ DBUS_ALPM_MANAGER_INTERFACE,
+ DBUS_ALPM_MANAGER_MEMBER_STATUS);
+
+ if(s_info.connection != NULL) {
+ dbus_connection_close(s_info.connection);
+ dbus_connection_unref(s_info.connection);
+ s_info.connection = NULL;
+
+ _D("DBUS connection is closed");
+ }
+}
diff --git a/home/src/dbus_util.c b/home/src/dbus_util.c
new file mode 100755
index 0000000..3fc9c70
--- /dev/null
+++ b/home/src/dbus_util.c
@@ -0,0 +1,330 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Ecore.h>
+#include <utilX.h>
+#include <dd-display.h>
+#include <aul.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
+#include <syspopup_caller.h>
+#include <Evas.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "util.h"
+#include "main.h"
+#include "log.h"
+#include "dbus.h"
+
+#define DBUS_CPU_BOOSTER_SEC 200
+#define DBUS_LCD_ON_SEC 10000
+#define DBUS_REPLY_TIMEOUT (120 * 1000)
+
+static int _append_variant(DBusMessageIter *iter, const char *sig, char *param[])
+{
+ char *ch;
+ int i;
+ int int_type;
+ uint64_t int64_type;
+
+ if (!sig || !param)
+ return 0;
+
+ for (ch = (char*)sig, i = 0; *ch != '\0'; ++i, ++ch) {
+ switch (*ch) {
+ case 'i':
+ int_type = atoi(param[i]);
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_INT32, &int_type);
+ break;
+ case 'u':
+ int_type = atoi(param[i]);
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &int_type);
+ break;
+ case 't':
+ int64_type = atoi(param[i]);
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT64, &int64_type);
+ break;
+ case 's':
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &param[i]);
+ break;
+ default:
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
+static int _dbus_message_send(const char *path, const char *interface, const char *member)
+{
+ int ret = 0;
+ DBusMessage *msg = NULL;
+ DBusConnection *conn = NULL;
+
+ conn = (DBusConnection *)home_dbus_connection_get();
+ if (!conn) {
+ _E("dbus_bus_get error");
+ return -1;
+ }
+
+ msg = dbus_message_new_signal(path, interface, member);
+ if (!msg) {
+ _E("dbus_message_new_signal(%s:%s-%s)", path, interface, member);
+ return -1;
+ }
+
+ ret = dbus_connection_send(conn, msg, NULL); //async call
+ dbus_message_unref(msg);
+ if (ret != TRUE) {
+ _E("dbus_connection_send error(%s:%s-%s)", path, interface, member);
+ return -ECOMM;
+ }
+ _D("dbus_connection_send, ret=%d", ret);
+ return 0;
+}
+
+static int _dbus_method_async_call(const char *dest, const char *path,
+ const char *interface, const char *method,
+ const char *sig, char *param[])
+{
+ int ret = 0;
+ DBusConnection *conn = NULL;
+ DBusMessage *msg = NULL;
+ DBusMessageIter iter;
+ DBusError err;
+
+ conn = home_dbus_connection_get();
+ if (!conn) {
+ _E("dbus_bus_get error");
+ return -1;
+ }
+
+ msg = dbus_message_new_method_call(dest, path, interface, method);
+ if (!msg) {
+ _D("dbus_message_new_method_call(%s:%s-%s)", path, interface, method);
+ return -1;
+ }
+
+ dbus_message_iter_init_append(msg, &iter);
+ ret = _append_variant(&iter, sig, param);
+ if (ret < 0) {
+ _E("append_variant error(%d)", ret);
+ dbus_message_unref(msg);
+ return -1;
+ }
+
+ dbus_error_init(&err);
+
+ ret = dbus_connection_send(conn, msg, NULL); //async call
+ dbus_message_unref(msg);
+ if (ret != TRUE) {
+ _E("dbus_connection_send error(%s:%s:%s-%s)", dest, path, interface, method);
+ _E("dbus_connection_send error(%s:%s)", err.name, err.message);
+ return -ECOMM;
+ }
+
+ _D("dbus_connection_send, ret=%d", ret);
+ dbus_error_free(&err);
+
+ return 0;
+}
+
+
+static DBusMessage *_dbus_method_sync_call(const char *dest, const char *path,
+ const char *interface, const char *method,
+ const char *sig, char *param[])
+{
+ int ret = 0;
+ DBusConnection *conn = NULL;
+ DBusMessage *msg = NULL;
+ DBusMessageIter iter;
+ DBusMessage *reply = NULL;
+ DBusError err;
+
+ conn = home_dbus_connection_get();
+ if (!conn) {
+ _E("dbus_bus_get error");
+ return NULL;
+ }
+
+ msg = dbus_message_new_method_call(dest, path, interface, method);
+ if (!msg) {
+ _D("dbus_message_new_method_call(%s:%s-%s)", path, interface, method);
+ return NULL;
+ }
+
+ dbus_message_iter_init_append(msg, &iter);
+ ret = _append_variant(&iter, sig, param);
+ if (ret < 0) {
+ _E("append_variant error(%d)", ret);
+ return NULL;
+ }
+
+ dbus_error_init(&err);
+
+ reply = dbus_connection_send_with_reply_and_block(conn, msg, DBUS_REPLY_TIMEOUT, &err);
+ if (!reply) {
+ _E("dbus_connection_send error(No reply): (%s:%s:%s:%s)", dest, path, interface, method);
+ }
+
+ if (dbus_error_is_set(&err)) {
+ _E("dbus_connection_send error(%s:%s)", err.name, err.message);
+ reply = NULL;
+ }
+
+ dbus_message_unref(msg);
+ dbus_error_free(&err);
+
+ return reply;
+}
+
+HAPI void home_dbus_lcd_on_signal_send(Eina_Bool wristup)
+{
+ int ret = 0;
+ char *param[1];
+
+ if (wristup == EINA_TRUE) {
+ char val[32];
+ snprintf(val, sizeof(val), "%d", DBUS_LCD_ON_SEC);
+ param[0] = val;
+
+ ret = _dbus_method_async_call(
+ DBUS_DEVICED_BUS_NAME,
+ DBUS_DEVICED_DISPLAY_PATH,
+ DBUS_DEVICED_DISPLAY_INTERFACE,
+ DBUS_DEVICED_DISPLAY_METHOD_CUSTOM_LCD_ON,
+ "i",
+ param);
+ } else {
+ param[0] = DBUS_DEVICED_DISPLAY_COMMAND_LCD_ON;
+
+ ret = _dbus_method_async_call(
+ DBUS_DEVICED_BUS_NAME,
+ DBUS_DEVICED_DISPLAY_PATH,
+ DBUS_DEVICED_DISPLAY_INTERFACE,
+ DBUS_DEVICED_DISPLAY_METHOD_CHANGE_STATE,
+ "s",
+ param);
+ }
+ _E("Sending LCD ON request signal wristup:%d result:%d", wristup, ret);
+}
+
+HAPI void home_dbus_lcd_off_signal_send(void)
+{
+ int ret = 0;
+
+ ret = _dbus_method_async_call(
+ DBUS_DEVICED_BUS_NAME,
+ DBUS_DEVICED_DISPLAY_PATH,
+ DBUS_DEVICED_DISPLAY_INTERFACE,
+ DBUS_DEVICED_DISPLAY_METHOD_LCD_OFF,
+ NULL, NULL);
+ _E("Sending LCD OFF request signal, result:%d", ret);
+}
+
+HAPI void home_dbus_procsweep_signal_send(void)
+{
+ int ret = 0;
+
+ ret = _dbus_message_send(
+ DBUS_PROCSWEEP_PATH,
+ DBUS_PROCSWEEP_INTERFACE,
+ DBUS_PROCSWEEP_METHOD);
+ _E("Sending PROCSWEEP signal, result:%d", ret);
+}
+
+HAPI void home_dbus_home_raise_signal_send(void)
+{
+ int ret = 0;
+
+ ret = _dbus_message_send(
+ DBUS_HOME_RAISE_PATH,
+ DBUS_HOME_RAISE_INTERFACE,
+ DBUS_HOME_RAISE_MEMBER);
+ _E("Sending HOME RAISE signal, result:%d", ret);
+}
+
+HAPI void home_dbus_cpu_booster_signal_send(void)
+{
+ int ret = 0;
+ char *param[1] = {NULL, };
+ char val[32] = {0, };
+
+ snprintf(val, sizeof(val), "%d", DBUS_CPU_BOOSTER_SEC);
+ param[0] = val;
+
+ ret = _dbus_method_async_call(
+ DBUS_DEVICED_BUS_NAME,
+ DBUS_DEVICED_CPU_BOOSTER_PATH,
+ DBUS_DEVICED_CPU_BOOSTER_INTERFACE,
+ DBUS_DEVICED_CPU_BOOSTER_METHOD_HOME_LAUNCH,
+ "i",
+ param);
+ _D("Sending cpu booster call:%d result:%d", DBUS_CPU_BOOSTER_SEC, ret);
+}
+
+HAPI void home_dbus_scroll_booster_signal_send(int sec)
+{
+ int ret = 0;
+ char *param[1] = {NULL, };
+ char val[32] = {0, };
+
+ snprintf(val, sizeof(val), "%d", sec);
+ param[0] = val;
+
+ _dbus_method_async_call(
+ DBUS_DEVICED_BUS_NAME,
+ DBUS_DEVICED_CPU_BOOSTER_PATH,
+ DBUS_DEVICED_CPU_BOOSTER_INTERFACE,
+ DBUS_DEVICED_CPU_BOOSTER_METHOD_HOME,
+ "i", param);
+ _D("Sending scroll booster for %d sec result:%d", sec, ret);
+}
+
+HAPI char *home_dbus_cooldown_status_get(void)
+{
+ int ret = 0;
+ DBusError err;
+ DBusMessage *msg = NULL;
+ const char *data = NULL;
+ char *ret_val = NULL;
+
+ msg = _dbus_method_sync_call(
+ DBUS_DEVICED_BUS_NAME,
+ DBUS_DEVICED_SYSNOTI_PATH,
+ DBUS_DEVICED_SYSNOTI_INTERFACE,
+ DBUS_DEVICED_SYSNOTI_METHOD_COOLDOWN_STATUS,
+ NULL, NULL);
+ retv_if(msg == NULL, NULL);
+
+ dbus_error_init(&err);
+
+ ret = dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &data, DBUS_TYPE_INVALID);
+ if (!ret) {
+ _E("Failed to get reply (%s:%s)", err.name, err.message);
+ } else {
+ if (data != NULL) {
+ ret_val = strdup(data);
+ }
+ }
+
+ dbus_message_unref(msg);
+ dbus_error_free(&err);
+
+ return ret_val;
+}
diff --git a/home/src/dynamicbox_evas.c b/home/src/dynamicbox_evas.c
new file mode 100644
index 0000000..926e957
--- /dev/null
+++ b/home/src/dynamicbox_evas.c
@@ -0,0 +1,4963 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <libintl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <Elementary.h>
+#include <Ecore.h>
+#include <Ecore_X.h>
+#include <Ecore_Evas.h>
+#include <Evas.h>
+#include <Edje.h>
+
+#include <ail.h>
+
+#include <dynamicbox.h>
+#include <dynamicbox_service.h>
+#include <dynamicbox_errno.h>
+#include <dynamicbox_buffer.h>
+
+#if defined(LOG_TAG)
+#undef LOG_TAG
+#endif
+#define LOG_TAG "DYNAMICBOX_EVAS"
+#include <dlog.h>
+
+#include "dynamicbox_evas.h"
+
+#if !defined(SECURE_LOGD)
+#define SECURE_LOGD LOGD
+#endif
+
+#if !defined(SECURE_LOGW)
+#define SECURE_LOGW LOGW
+#endif
+
+#if !defined(SECURE_LOGE)
+#define SECURE_LOGE LOGE
+#endif
+
+#if !defined(S_)
+#define S_(str) dgettext("sys_string", str)
+#endif
+
+#if !defined(T_)
+#define T_(str) dgettext(PACKAGE, str)
+#endif
+
+#if !defined(N_)
+#define N_(str) (str)
+#endif
+
+#if !defined(_)
+#define _(str) gettext(str)
+#endif
+
+
+#if !defined(DbgPrint)
+#define DbgPrint(format, arg...) SECURE_LOGD(format, ##arg)
+#endif
+
+#if !defined(ErrPrint)
+#define ErrPrint(format, arg...) SECURE_LOGE(format, ##arg)
+#endif
+
+#if !defined(WarnPrint)
+#define WarnPrint(format, arg...) SECURE_LOGW(format, ##arg)
+#endif
+
+#if !defined(DYNAMICBOX_EVAS_RESOURCE_EDJ)
+#define DYNAMICBOX_EVAS_RESOURCE_EDJ "/usr/share/dynamicbox-evas/res/edje/dynamicbox.edj"
+#endif
+
+#if !defined(DYNAMICBOX_EVAS_UNKNOWN)
+#define DYNAMICBOX_EVAS_UNKNOWN "/usr/apps/org.tizen.w-home/res/images/unknown.png"
+#endif
+
+#if !defined(DYNAMICBOX_EVAS_RESOURCE_GBAR)
+#define DYNAMICBOX_EVAS_RESOURCE_GBAR "gbar"
+#endif
+
+#if !defined(DYNAMICBOX_EVAS_RESOURCE_LB)
+#define DYNAMICBOX_EVAS_RESOURCE_LB "dynamicbox"
+#endif
+
+#if !defined(DYNAMICBOX_EVAS_RESOURCE_IMG)
+#define DYNAMICBOX_EVAS_RESOURCE_IMG "dynamicbox,image"
+#endif
+
+#if !defined(DYNAMICBOX_EVAS_RESOURCE_OVERLAY_LOADING)
+#define DYNAMICBOX_EVAS_RESOURCE_OVERLAY_LOADING "overlay"
+#endif
+
+#define DEFAULT_OVERLAY_COUNTER 2
+#define DEFAULT_OVERLAY_WAIT_TIME 1.0f
+
+#define DBOX_CLASS_NAME "dynamicbox"
+
+#define DBOX_KEEP_BUFFER -2
+
+#define DEFAULT_CLUSTER "user,created"
+#define DEFAULT_CATEGORY "default"
+
+int errno;
+
+/*!
+ * \note
+ * Detect click event if the pointer does moved in this region (x , y < 5 pixels)
+ */
+#define CLICK_REGION 22
+
+static struct {
+ Evas_Smart_Class sc;
+ Evas_Smart *smart;
+ Eina_List *list;
+ struct {
+ Eina_List *delete_list;
+ Eina_List *create_list;
+ } raw_event;
+ int screen_width;
+ int screen_height;
+
+ union _conf {
+ struct _field {
+ unsigned int user_view_port: 1;
+ unsigned int force_to_buffer: 1;
+ unsigned int support_gbar: 1;
+ unsigned int manual_pause_resume: 1;
+ unsigned int use_fixed_size: 1;
+ unsigned int easy_mode: 1;
+ unsigned int is_scroll_x: 1;
+ unsigned int is_scroll_y: 1;
+ unsigned int auto_feed: 1;
+ unsigned int delayed_pause_resume: 1;
+ unsigned int sensitive_move: 1;
+ unsigned int render_animator: 1;
+ unsigned int auto_render_selector: 1;
+
+ unsigned int reserved: 19;
+ } field;
+ unsigned int mask;
+ } conf;
+
+ Evas_Object *win;
+ Ecore_Animator *renderer;
+ Eina_List *dbox_dirty_objects;
+ Eina_List *gbar_dirty_objects;
+} s_info = {
+ .sc = EVAS_SMART_CLASS_INIT_NAME_VERSION(DBOX_CLASS_NAME),
+ .smart = NULL,
+ .list = NULL,
+ .raw_event = {
+ .delete_list = NULL,
+ .create_list = NULL,
+ },
+ .conf = {
+ .mask = 0,
+ },
+ .screen_width = 720,
+ .screen_height = 1280,
+ .win = NULL,
+ .renderer = NULL,
+ .dbox_dirty_objects = NULL,
+ .gbar_dirty_objects = NULL,
+};
+
+struct access_ret_cb_data {
+ Evas_Object *obj;
+ void (*ret_cb)(Evas_Object *, int, void *);
+ void *data;
+};
+
+struct acquire_data {
+ struct widget_data *data;
+ Evas_Object *content;
+ int w;
+ int h;
+};
+
+enum CANCEL_CLICK {
+ CANCEL_DISABLED = 0x0,
+ CANCEL_USER = 0x01,
+ CANCEL_PROCESSED = 0x02
+};
+
+struct widget_data {
+ enum {
+ WIDGET_DATA_CREATED = 0x00beef00,
+ WIDGET_DATA_DELETED = 0x0d0e0a0d,
+ } state;
+ struct dynamicbox *handle;
+ Evas *e;
+ Evas_Object *stage; /*!< Do not resize thie directly, it should be resized via XX_update_geometry */
+ Evas_Object *parent;
+
+ Evas_Object *dbox_layout; /*!< Layout of Dynamicbox content part */
+ Evas_Object *gbar_layout; /*!< Layout of GBAR content part */
+
+ Evas_Object *dynamicbox; /*!< Container object */
+
+ struct view_port {
+ int x;
+ int y;
+ int w;
+ int h;
+ } view_port;
+
+ char *dbox_id;
+ char *content;
+ char *cluster;
+ char *category;
+ double period;
+
+ void *dbox_fb;
+ void *gbar_fb;
+
+ unsigned int gbar_pixmap;
+ unsigned int dbox_pixmap;
+
+ unsigned int *gbar_extra;
+ unsigned int *dbox_extra;
+ int gbar_extra_cnt;
+ int dbox_extra_cnt;
+
+ int dbox_latest_idx; /* -1 = primary buffer, 0 ~ = extra buffer */
+ int gbar_latest_idx; /* -1 = primary buffer, 0 ~ = extra buffer */
+
+ struct down {
+ int x;
+ int y;
+
+ struct {
+ int x;
+ int y;
+ int w;
+ int h;
+ } geo;
+ } down;
+
+ int x;
+ int y;
+
+ int dbox_width;
+ int dbox_height;
+ int size_type;
+
+ union {
+ struct {
+ unsigned int pressed: 1; /**< Mouse is pressed */
+ unsigned int touch_effect: 1; /**< Requires to play touch effect */
+ unsigned int mouse_event: 1; /**< Requires to feed mouse event */
+ unsigned int scroll_x: 1; /**< */
+ unsigned int scroll_y: 1;
+ unsigned int faulted: 1;
+ unsigned int flick_down: 1;
+ unsigned int gbar_created: 1;
+
+ unsigned int created: 1;
+ unsigned int deleted: 1;
+ unsigned int dbox_pixmap_acquire_requested: 1;
+ unsigned int gbar_pixmap_acquire_requested: 1;
+ unsigned int cancel_scroll_x: 1;
+ unsigned int cancel_scroll_y: 1;
+ unsigned int cancel_click: 2;
+ unsigned int disable_preview: 1;
+ unsigned int disable_loading: 1;
+ unsigned int disable_text: 1;
+ unsigned int dbox_overlay_loaded: 1;
+ unsigned int gbar_overlay_loaded: 1;
+
+ unsigned int freeze_visibility: 1;
+
+ unsigned int dbox_dirty: 1;
+ unsigned int gbar_dirty: 1;
+
+ unsigned int send_delete: 1;
+ unsigned int permanent_delete: 1;
+
+ unsigned int reserved: 5;
+ } field; /* Do we really has performance loss? */
+
+ unsigned int flags;
+ } is;
+
+ int refcnt;
+ int overlay_update_counter;
+ Ecore_Timer *overlay_timer;
+ int freezed_visibility;
+};
+
+enum EFFECT_MASK {
+ EFFECT_NONE = 0x0,
+ EFFECT_WIDTH = 0x01,
+ EFFECT_HEIGHT = 0x02,
+ EFFECT_BOTH = 0x03,
+ EFFECT_MOVE = 0x10
+};
+
+struct animation_data {
+ Ecore_Timer *timer;
+ Evas_Object *obj;
+
+ unsigned int effect_mask;
+ int w;
+ int h;
+ int x;
+ int y;
+};
+
+struct raw_event_cbdata {
+ void (*cb)(struct dynamicbox_evas_raw_event_info *info, void *data);
+ void *data;
+};
+
+static int dynamicbox_fault_handler(enum dynamicbox_fault_type fault, const char *pkgname, const char *filename, const char *funcname, void *data);
+static int dynamicbox_event_handler(struct dynamicbox *handle, enum dynamicbox_event_type event, void *data);
+
+static void dbox_created_cb(struct dynamicbox *handle, int ret, void *cbdata);
+static void dbox_overlay_loading(struct widget_data *data);
+static void dbox_overlay_faulted(struct widget_data *data);
+static void dbox_overlay_disable(struct widget_data *data, int no_timer);
+
+static void gbar_overlay_loading(struct widget_data *data);
+static void gbar_overlay_disable(struct widget_data *data);
+
+static void update_dbox_geometry(struct acquire_data *acquire_data);
+static void update_gbar_geometry(struct acquire_data *acquire_data);
+static void update_stage_geometry(struct acquire_data *acquire_data);
+static void animator_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info);
+
+static void remove_dbox_dirty_object_list(struct widget_data *data);
+static void remove_gbar_dirty_object_list(struct widget_data *data);
+static void append_dbox_dirty_object_list(struct widget_data *data, int idx);
+static void append_gbar_dirty_object_list(struct widget_data *data, int idx);
+static void dynamicbox_event_dbox_updated(struct widget_data *data);
+static void dynamicbox_event_gbar_updated(struct widget_data *data);
+
+static struct widget_data *get_smart_data(Evas_Object *dynamicbox)
+{
+ if (dynamicbox && evas_object_smart_type_check(dynamicbox, DBOX_CLASS_NAME)) {
+ struct widget_data *data;
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (data) {
+ if (data->state == WIDGET_DATA_CREATED) {
+ return data;
+ }
+
+ ErrPrint("smart data is not valid\n");
+ } else {
+ ErrPrint("smart data is not exists\n");
+ }
+ }
+
+ return NULL;
+}
+
+static inline void reset_scroller(struct widget_data *data)
+{
+ Evas_Object *scroller;
+
+ if (!data->dbox_layout) {
+ return;
+ }
+
+ scroller = elm_object_part_content_get(data->dbox_layout, "scroller");
+ if (!scroller) {
+ return;
+ }
+
+ elm_scroller_region_show(scroller, 0, data->dbox_height >> 1, data->dbox_width, data->dbox_height);
+}
+
+static void invoke_raw_event_callback(enum dynamicbox_evas_raw_event_type type, const char *pkgname, Evas_Object *dynamicbox, int error)
+{
+ struct dynamicbox_evas_raw_event_info info;
+ struct raw_event_cbdata *cbdata;
+ Eina_List *l;
+ Eina_List *n;
+
+ info.pkgname = pkgname;
+ info.dynamicbox = dynamicbox;
+ info.error = error;
+ info.type = type;
+
+ switch (type) {
+ case DYNAMICBOX_EVAS_RAW_DELETE:
+ EINA_LIST_FOREACH_SAFE(s_info.raw_event.delete_list, l, n, cbdata) {
+ if (cbdata->cb) {
+ cbdata->cb(&info, cbdata->data);
+ }
+ }
+ break;
+ case DYNAMICBOX_EVAS_RAW_CREATE:
+ EINA_LIST_FOREACH_SAFE(s_info.raw_event.create_list, l, n, cbdata) {
+ if (cbdata->cb) {
+ cbdata->cb(&info, cbdata->data);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static int find_size_type(struct widget_data *data, int w, int h)
+{
+ int cnt = DBOX_NR_OF_SIZE_LIST;
+ int i;
+ int _w[DBOX_NR_OF_SIZE_LIST];
+ int _h[DBOX_NR_OF_SIZE_LIST];
+ int type = DBOX_SIZE_TYPE_UNKNOWN;
+ int find;
+ int ret_type = DBOX_SIZE_TYPE_UNKNOWN;
+ int delta;
+
+ if (dynamicbox_service_get_supported_sizes(data->dbox_id, &cnt, _w, _h) < 0) {
+ ErrPrint("No available sizes: %s\n", data->dbox_id);
+ return DBOX_SIZE_TYPE_UNKNOWN;
+ }
+
+ find = 0x7FFFFFFF;
+ for (i = 0; i < cnt; i++) {
+ type = dynamicbox_service_size_type(_w[i], _h[i]);
+
+ if (!s_info.conf.field.easy_mode) {
+ switch (type) {
+ case DBOX_SIZE_TYPE_EASY_1x1:
+ case DBOX_SIZE_TYPE_EASY_3x1:
+ case DBOX_SIZE_TYPE_EASY_3x3:
+ continue;
+ default:
+ break;
+ }
+ } else {
+ switch (type) {
+ case DBOX_SIZE_TYPE_EASY_1x1:
+ case DBOX_SIZE_TYPE_EASY_3x1:
+ case DBOX_SIZE_TYPE_EASY_3x3:
+ break;
+ default:
+ continue;
+ }
+ }
+
+ delta = abs(_w[i] - w) + abs(_h[i] - h);
+ if (delta < find) {
+ find = delta;
+ ret_type = type;
+ }
+ }
+
+ return ret_type;
+}
+
+static Eina_Bool effect_animator_cb(void *_data)
+{
+ struct animation_data *data = _data;
+ int w;
+ int h;
+ int x;
+ int y;
+ int move_x = 0;
+ int move_y = 0;
+
+ evas_object_geometry_get(data->obj, &x, &y, &w, &h);
+ if (data->w == w && data->h == h) {
+ evas_object_event_callback_del(data->obj, EVAS_CALLBACK_DEL, animator_del_cb);
+ evas_object_data_del(data->obj, "animation");
+ free(data);
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ if (data->effect_mask & EFFECT_WIDTH) {
+ if (w < data->w) {
+ if (data->w - w > 100) {
+ w += 20;
+ move_x = 20;
+ } else if (data->w - w > 10) {
+ w += 8;
+ move_x = 8;
+ } else {
+ w++;
+ move_x = 1;
+ }
+ } else if (w > data->w) {
+ if (w - data->w > 100) {
+ w -= 20;
+ move_x = -20;
+ } else if (w - data->w > 10) {
+ w -= 8;
+ move_x = -8;
+ } else {
+ w--;
+ move_x = -1;
+ }
+ }
+ } else {
+ w = data->w;
+ }
+
+ if (data->effect_mask & EFFECT_HEIGHT) {
+ if (h < data->h) {
+ if (data->h - h > 100) {
+ h += 20;
+ move_y = 20;
+ } else if (data->h - h > 10) {
+ h += 8;
+ move_y = 8;
+ } else {
+ h++;
+ move_y = 1;
+ }
+ } else if (h > data->h) {
+ if (h - data->h > 100) {
+ h -= 20;
+ move_y = -20;
+ } else if (h - data->h > 10) {
+ h -= 8;
+ move_y = -8;
+ } else {
+ h--;
+ move_y = -1;
+ }
+ }
+ } else {
+ h = data->h;
+ }
+
+ if (data->effect_mask & EFFECT_MOVE) {
+ if (move_x) {
+ x -= move_x;
+ }
+ if (move_y) {
+ y -= move_y;
+ }
+ evas_object_move(data->obj, x, y);
+ }
+
+ evas_object_resize(data->obj, w, h);
+ return ECORE_CALLBACK_RENEW;
+}
+
+static void animator_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ struct animation_data *data;
+
+ data = evas_object_data_del(obj, "animation");
+ if (data) {
+ ecore_timer_del(data->timer);
+ free(data);
+ }
+}
+
+static void effect_size_get(Evas_Object *obj, int *w, int *h)
+{
+ struct animation_data *data;
+
+ data = evas_object_data_get(obj, "animation");
+ if (data) {
+ *w = data->w;
+ *h = data->h;
+ } else {
+ evas_object_geometry_get(obj, NULL, NULL, w, h);
+ }
+}
+
+static void effect_resize(Evas_Object *obj, int w, int h, unsigned int effect_mask)
+{
+ struct animation_data *data;
+ int ow;
+ int oh;
+ int ox;
+ int oy;
+
+ evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
+
+ data = evas_object_data_get(obj, "animation");
+ if (data) {
+ if (ow == w && oh == h) {
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, animator_del_cb);
+ evas_object_data_del(obj, "animation");
+ free(data);
+ return;
+ }
+ /*!
+ * \note
+ * Update to new size
+ */
+ data->w = w;
+ data->h = h;
+ return;
+ } else if (ow == w && oh == h) {
+ return;
+ }
+
+ data = malloc(sizeof(*data));
+ if (!data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return;
+ }
+
+ data->obj = obj;
+ data->w = w;
+ data->h = h;
+ data->x = ox;
+ data->y = oy;
+ data->effect_mask = effect_mask;
+
+ data->timer = ecore_timer_add(1.0f/60.0f, effect_animator_cb, data);
+ if (!data->timer) {
+ free(data);
+ return;
+ }
+
+ evas_object_data_set(obj, "animation", data);
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, animator_del_cb, data);
+}
+
+struct widget_data *widget_ref(struct widget_data *data)
+{
+ data->refcnt++;
+ return data;
+}
+
+static void dump_handle_list(void)
+{
+ Eina_List *l = NULL;
+ Eina_List *n;
+ Evas_Object *dynamicbox;
+ struct widget_data *data;
+
+ DbgPrint("============== DUMP ===============");
+ EINA_LIST_FOREACH_SAFE(s_info.list, l, n, dynamicbox) {
+ data = evas_object_smart_data_get(dynamicbox);
+ if (!data) {
+ continue;
+ }
+
+ DbgPrint("data[%p] %s (%s)\n", data, data->dbox_id, data->is.field.faulted ? "faulted" : "loaded");
+ }
+ DbgPrint("===================================");
+}
+
+struct widget_data *widget_unref(struct widget_data *data)
+{
+ data->refcnt--;
+ DbgPrint("refcnt: %d (%s)\n", data->refcnt, data->dbox_id);
+ if (data->refcnt != 0) {
+ return data;
+ }
+
+ DbgPrint("Destroy widget data %p(%s)\n", data, data->dbox_id);
+ free(data->content);
+ free(data->dbox_id);
+ free(data->cluster);
+ free(data->category);
+
+ if (data->overlay_timer) {
+ ecore_timer_del(data->overlay_timer);
+ data->overlay_timer = NULL;
+ }
+
+ if (data->stage) {
+ DbgPrint("Remove Stage\n");
+ evas_object_del(data->stage);
+ }
+
+ if (data->dbox_layout) {
+ Evas_Object *content;
+
+ content = elm_object_part_content_unset(data->dbox_layout, "dynamicbox,content");
+ if (content) {
+ Evas_Object *front;
+
+ front = elm_object_part_content_unset(content, "front,content");
+ if (front) {
+ DbgPrint("Front image object is deleted\n");
+ evas_object_del(front);
+ }
+
+ DbgPrint("Content object deleted\n");
+ evas_object_del(content);
+ }
+
+ content = elm_object_part_content_unset(data->dbox_layout, "overlay,content");
+ if (content) {
+ DbgPrint("Overlay is deleted\n");
+ evas_object_del(content);
+ }
+
+
+ DbgPrint("Remove DBOX Layout\n");
+ evas_object_del(data->dbox_layout);
+ }
+
+ if (data->gbar_layout) {
+ Evas_Object *content;
+ content = elm_object_part_content_get(data->gbar_layout, "gbar,content");
+ if (content) {
+ Evas_Object *overlay;
+ overlay = elm_object_part_content_unset(content, "overlay,content");
+ if (overlay) {
+ DbgPrint("Overlay is deleted\n");
+ evas_object_del(overlay);
+ }
+ }
+ DbgPrint("Remove GBAR Layout\n");
+ evas_object_del(data->gbar_layout);
+ }
+
+ if (data->dbox_fb) {
+ dynamicbox_release_buffer(data->dbox_fb);
+ data->dbox_fb = NULL;
+ }
+
+ if (data->gbar_fb) {
+ dynamicbox_release_buffer(data->gbar_fb);
+ data->gbar_fb = NULL;
+ }
+
+ data->state = WIDGET_DATA_DELETED;
+ free(data);
+ dump_handle_list();
+ return NULL;
+}
+
+static void gbar_down_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *down = event_info;
+ struct widget_data *data = cbdata;
+ struct dynamicbox_mouse_event_info minfo;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ evas_object_geometry_get(obj, &data->down.geo.x, &data->down.geo.y, &data->down.geo.w, &data->down.geo.h);
+
+ data->x = data->down.x = down->canvas.x;
+ data->y = data->down.y = down->canvas.y;
+ data->is.field.pressed = 1;
+ if (s_info.conf.field.auto_render_selector) {
+ DbgPrint("Change to direct render\n");
+ s_info.conf.field.render_animator = 0;
+ }
+
+ if (s_info.conf.field.auto_feed) {
+ minfo.x = (double)data->down.geo.x;
+ minfo.y = (double)data->down.geo.y;
+ dynamicbox_feed_mouse_event(data->handle, DBOX_GBAR_MOUSE_SET, &minfo);
+ } else {
+ minfo.x = (double)(down->canvas.x - data->down.geo.x) / (double)data->down.geo.w;
+ minfo.y = (double)(down->canvas.y - data->down.geo.y) / (double)data->down.geo.h;
+ dynamicbox_feed_mouse_event(data->handle, DBOX_GBAR_MOUSE_ENTER, &minfo);
+ dynamicbox_feed_mouse_event(data->handle, DBOX_GBAR_MOUSE_DOWN, &minfo);
+ }
+}
+
+static void gbar_move_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *move = event_info;
+ struct widget_data *data = cbdata;
+ Evas_Coord x, y, w, h;
+ struct dynamicbox_mouse_event_info minfo;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (!data->is.field.pressed) {
+ return;
+ }
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+ data->x = move->cur.canvas.x;
+ data->y = move->cur.canvas.y;
+
+ if (data->is.field.cancel_click != CANCEL_DISABLED || !s_info.conf.field.auto_feed) {
+ minfo.x = (double)(move->cur.canvas.x - x) / (double)w;
+ minfo.y = (double)(move->cur.canvas.y - y) / (double)h;
+
+ if (data->is.field.cancel_click == CANCEL_USER) {
+ dynamicbox_feed_mouse_event(data->handle, DBOX_GBAR_MOUSE_ON_HOLD, &minfo);
+ data->is.field.cancel_click = CANCEL_PROCESSED;
+ }
+
+ if (!s_info.conf.field.auto_feed) {
+ dynamicbox_feed_mouse_event(data->handle, DBOX_GBAR_MOUSE_MOVE, &minfo);
+ }
+
+ if (s_info.conf.field.auto_render_selector) {
+ DbgPrint("Change to direct render\n");
+ s_info.conf.field.render_animator = 0;
+ }
+ }
+
+}
+
+static void dbox_pixmap_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ struct widget_data *data = cbdata;
+
+ if (data->dbox_pixmap) {
+ dynamicbox_release_resource_id(data->handle, 0, data->dbox_pixmap);
+ data->dbox_pixmap = 0;
+ }
+
+ if (data->dbox_extra) {
+ int idx;
+
+ for (idx = 0; idx < dynamicbox_option(DBOX_OPTION_EXTRA_BUFFER_CNT); idx++) {
+ if (data->dbox_extra[idx] != 0u) {
+ if (dynamicbox_release_resource_id(data->handle, 0, data->dbox_extra[idx]) < 0) {
+ ErrPrint("Failed to release %u\n", data->dbox_extra[idx]);
+ }
+ data->dbox_extra[idx] = 0u;
+ }
+ }
+
+ free(data->dbox_extra);
+ data->dbox_extra = NULL;
+ }
+}
+
+static void gbar_pixmap_del_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ struct widget_data *data = cbdata;
+
+ if (data->gbar_pixmap) {
+ dynamicbox_release_resource_id(data->handle, 1, data->gbar_pixmap);
+ data->gbar_pixmap = 0;
+ }
+
+ if (data->gbar_extra) {
+ int idx;
+
+ for (idx = 0; idx < dynamicbox_option(DBOX_OPTION_EXTRA_BUFFER_CNT); idx++) {
+ if (data->gbar_extra[idx] != 0u) {
+ if (dynamicbox_release_resource_id(data->handle, 0, data->gbar_extra[idx]) < 0) {
+ ErrPrint("Failed to release %u\n", data->gbar_extra[idx]);
+ }
+ data->gbar_extra[idx] = 0u;
+ }
+ }
+
+ free(data->gbar_extra);
+ data->gbar_extra = NULL;
+ }
+}
+
+static void gbar_up_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up *up = event_info;
+ struct widget_data *data = cbdata;
+ Evas_Coord x, y, w, h;
+ struct dynamicbox_mouse_event_info minfo;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (!data->is.field.pressed) {
+ return;
+ }
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+ if (s_info.conf.field.auto_feed) {
+ minfo.x = (double)x / (double)w;
+ minfo.y = (double)y / (double)h;
+ dynamicbox_feed_mouse_event(data->handle, DBOX_GBAR_MOUSE_UNSET, &minfo);
+ } else {
+ minfo.x = (double)(up->canvas.x - x) / (double)w;
+ minfo.y = (double)(up->canvas.y - y) / (double)h;
+
+ if (data->down.geo.x != x || data->down.geo.y != y || data->is.field.cancel_click == CANCEL_USER) {
+ dynamicbox_feed_mouse_event(data->handle, DBOX_GBAR_MOUSE_ON_HOLD, &minfo);
+ data->is.field.cancel_click = CANCEL_PROCESSED;
+ }
+
+ dynamicbox_feed_mouse_event(data->handle, DBOX_GBAR_MOUSE_UP, &minfo);
+ dynamicbox_feed_mouse_event(data->handle, DBOX_GBAR_MOUSE_LEAVE, &minfo);
+ }
+
+ data->is.field.cancel_click = CANCEL_DISABLED;
+}
+
+static void dbox_down_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *down = event_info;
+ struct widget_data *data = cbdata;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (s_info.conf.field.support_gbar && !data->is.field.gbar_created) {
+ data->is.field.flick_down = 1;
+ }
+
+ data->down.x = data->x = down->canvas.x;
+ data->down.y = data->y = down->canvas.y;
+ data->is.field.pressed = 1;
+ data->is.field.scroll_x = 0;
+ data->is.field.scroll_y = 0;
+ data->is.field.cancel_scroll_x = 0;
+ data->is.field.cancel_scroll_y = 0;
+
+ if (s_info.conf.field.auto_render_selector) {
+ DbgPrint("Change to direct render\n");
+ s_info.conf.field.render_animator = 0;
+ }
+
+ evas_object_geometry_get(obj, &data->down.geo.x, &data->down.geo.y, &data->down.geo.w, &data->down.geo.h);
+
+ if (s_info.conf.field.sensitive_move && (data->down.geo.x != data->view_port.x || data->down.geo.y != data->view_port.y)) {
+ data->is.field.pressed = 0;
+ if (s_info.conf.field.auto_render_selector) {
+ DbgPrint("Change to render animator\n");
+ s_info.conf.field.render_animator = 1;
+ }
+ return;
+ }
+
+ if (data->handle && !data->is.field.faulted) {
+ struct dynamicbox_mouse_event_info minfo;
+
+ if (s_info.conf.field.auto_feed && data->is.field.mouse_event) {
+ minfo.x = (double)data->down.geo.x;
+ minfo.y = (double)data->down.geo.y;
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_SET, &minfo);
+ } else {
+ minfo.x = (double)(data->x - data->down.geo.x) / (double)data->down.geo.w;
+ minfo.y = (double)(data->y - data->down.geo.y) / (double)data->down.geo.h;
+
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_ENTER, &minfo);
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_DOWN, &minfo);
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_MOVE, &minfo);
+ }
+ }
+}
+
+static void smart_callback_call(struct widget_data *data, const char *signal, void *cbdata)
+{
+ if (data->is.field.deleted || !data->dynamicbox) {
+ DbgPrint("Dynamicbox is deleted, ignore smart callback call\n");
+ return;
+ }
+
+ evas_object_smart_callback_call(data->dynamicbox, signal, cbdata);
+}
+
+static void dbox_destroy_gbar_cb(struct dynamicbox *handle, int ret, void *cbdata)
+{
+ struct widget_data *data = cbdata;
+ Evas_Object *gbar_content;
+ struct dynamicbox_evas_event_info info;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ data->is.field.gbar_created = 0;
+
+ info.error = ret;
+ info.event = DBOX_EVENT_GBAR_DESTROYED;
+ info.pkgname = data->dbox_id;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_GBAR_DESTROYED, &info);
+
+ DbgPrint("ret: %d\n", ret);
+ gbar_content = elm_object_part_content_unset(data->gbar_layout, "gbar,content");
+ if (gbar_content) {
+ Evas_Native_Surface *surface;
+ unsigned int pixmap;
+
+ switch (dynamicbox_type(data->handle, 1)) {
+ case DBOX_CONTENT_TYPE_RESOURCE_ID:
+ if (!s_info.conf.field.force_to_buffer) {
+ surface = evas_object_image_native_surface_get(gbar_content);
+ if (!surface) {
+ ErrPrint("surface is NULL\n");
+ evas_object_del(gbar_content);
+ break;
+ }
+
+ pixmap = surface->data.x11.pixmap;
+ evas_object_del(gbar_content);
+
+ dynamicbox_release_resource_id(data->handle, 1, (int)pixmap);
+ if (pixmap == data->gbar_pixmap) {
+ data->gbar_pixmap = 0;
+ }
+ break;
+ }
+ case DBOX_CONTENT_TYPE_BUFFER:
+ if (data->gbar_fb) {
+ dynamicbox_release_buffer(data->gbar_fb);
+ data->gbar_fb = NULL;
+ }
+ evas_object_del(gbar_content);
+ break;
+ case DBOX_CONTENT_TYPE_TEXT:
+ break;
+ case DBOX_CONTENT_TYPE_UIFW:
+ break;
+ case DBOX_CONTENT_TYPE_INVALID:
+ default:
+ break;
+ }
+ }
+
+ if (data->gbar_layout) {
+ evas_object_del(data->gbar_layout);
+ data->gbar_layout = NULL;
+ }
+
+ remove_gbar_dirty_object_list(data);
+ widget_unref(data);
+}
+
+static void gbar_animation_done_cb(void *cbdata, Evas_Object *obj, const char *emission, const char *source)
+{
+ Evas_Object *rect;
+ struct widget_data *data = cbdata;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ rect = elm_object_part_content_unset(obj, "overlay,content");
+ if (rect) {
+ evas_object_del(rect);
+ }
+}
+
+static void gbar_create_buffer_object(struct widget_data *data)
+{
+ Evas_Object *gbar_content;
+
+ gbar_content = evas_object_image_filled_add(data->e);
+ if (!gbar_content) {
+ ErrPrint("Failed to create an image object\n");
+ } else {
+ evas_object_image_colorspace_set(gbar_content, EVAS_COLORSPACE_ARGB8888);
+ evas_object_image_alpha_set(gbar_content, EINA_TRUE);
+
+ elm_object_part_content_set(data->gbar_layout, "gbar,content", gbar_content);
+ }
+}
+
+static void gbar_create_text_object(struct widget_data *data)
+{
+ ErrPrint("Unsupported\n");
+ /*!
+ * \todo
+ */
+}
+
+static void gbar_create_pixmap_object(struct widget_data *data)
+{
+ Evas_Object *gbar_content;
+
+ gbar_content = evas_object_image_filled_add(data->e);
+ if (!gbar_content) {
+ ErrPrint("Failed to create an image object\n");
+ return;
+ }
+
+ evas_object_image_colorspace_set(gbar_content, EVAS_COLORSPACE_ARGB8888);
+ evas_object_image_alpha_set(gbar_content, EINA_TRUE);
+ elm_object_part_content_set(data->gbar_layout, "gbar,content", gbar_content);
+
+ evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_MOUSE_DOWN, gbar_down_cb, data);
+ evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_MOUSE_MOVE, gbar_move_cb, data);
+ evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_MOUSE_UP, gbar_up_cb, data);
+ evas_object_event_callback_add(gbar_content, EVAS_CALLBACK_DEL, gbar_pixmap_del_cb, data);
+}
+
+static void dbox_create_gbar_cb(struct dynamicbox *handle, int ret, void *cbdata)
+{
+ struct widget_data *data = cbdata;
+ struct dynamicbox_evas_event_info info;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ DbgPrint("Create GBAR: 0x%X\n", ret);
+ info.error = ret;
+ info.event = DBOX_EVENT_GBAR_CREATED;
+ info.pkgname = data->dbox_id;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_GBAR_ABORTED, &info);
+ widget_unref(data);
+ return;
+ }
+
+ if (data->is.field.deleted) {
+ /**
+ * Evas Object is deleted.
+ * Do not proceed this process anymore and destroy GBAR too
+ */
+ dynamicbox_destroy_glance_bar(data->handle, NULL, NULL);
+ return;
+ }
+
+ DbgPrint("GBAR is created\n");
+
+ if (!data->gbar_layout) {
+ data->gbar_layout = elm_layout_add(data->parent);
+ if (!data->gbar_layout) {
+ ErrPrint("Failed to add an edje\n");
+ info.error = DBOX_STATUS_ERROR_FAULT;
+ info.event = DBOX_EVENT_GBAR_CREATED;
+ info.pkgname = data->dbox_id;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_GBAR_ABORTED, &info);
+
+ ret = dynamicbox_destroy_glance_bar(data->handle, dbox_destroy_gbar_cb, widget_ref(data));
+ if (ret < 0) {
+ /*!
+ * \note
+ * PREVENT detect this. but it is FALSE POSITIVE
+ *
+ * widget_ref will increase the refcnt of data.
+ * and it is called when calling the dynamicbox_destroy_glance_bar function (via the last param)
+ * So this function call will not release the data.
+ */
+ widget_unref(data);
+ }
+
+ widget_unref(data);
+ return;
+ }
+
+ if (elm_layout_file_set(data->gbar_layout, DYNAMICBOX_EVAS_RESOURCE_EDJ, DYNAMICBOX_EVAS_RESOURCE_GBAR) == EINA_FALSE) {
+ ErrPrint("Failed to load edje object: %s(%s)\n", DYNAMICBOX_EVAS_RESOURCE_EDJ, DYNAMICBOX_EVAS_RESOURCE_GBAR);
+ evas_object_del(data->gbar_layout);
+ data->gbar_layout = NULL;
+
+ info.error = DBOX_STATUS_ERROR_IO_ERROR;
+ info.event = DBOX_EVENT_GBAR_CREATED;
+ info.pkgname = data->dbox_id;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_GBAR_ABORTED, &info);
+
+ ret = dynamicbox_destroy_glance_bar(data->handle, dbox_destroy_gbar_cb, widget_ref(data));
+ if (ret < 0) {
+ /*!
+ * \note
+ * PREVENT detect this. but it is FALSE POSITIVE
+ *
+ * widget_ref will increase the refcnt of data.
+ * and it is called when calling the dynamicbox_destroy_glance_bar function (via the last param)
+ * So this function call will not release the data.
+ */
+ widget_unref(data);
+ }
+
+ widget_unref(data);
+ return;
+ }
+
+ evas_object_smart_member_add(data->gbar_layout, data->dynamicbox);
+ evas_object_clip_set(data->gbar_layout, data->stage);
+ elm_object_signal_callback_add(data->gbar_layout, "finished", "animation", gbar_animation_done_cb, data);
+ evas_object_show(data->gbar_layout);
+ }
+ gbar_overlay_loading(data);
+
+ switch (dynamicbox_type(data->handle, 1)) {
+ case DBOX_CONTENT_TYPE_RESOURCE_ID:
+ if (!s_info.conf.field.force_to_buffer) {
+ gbar_create_pixmap_object(data);
+ break;
+ }
+ case DBOX_CONTENT_TYPE_BUFFER:
+ gbar_create_buffer_object(data);
+ break;
+ case DBOX_CONTENT_TYPE_TEXT:
+ gbar_create_text_object(data);
+ break;
+ case DBOX_CONTENT_TYPE_UIFW:
+ break;
+ default:
+ info.error = DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ info.event = DBOX_EVENT_GBAR_CREATED;
+ info.pkgname = data->dbox_id;
+ ret = dynamicbox_destroy_glance_bar(data->handle, dbox_destroy_gbar_cb, widget_ref(data));
+ if (ret < 0) {
+ /*!
+ * \note
+ * PREVENT detect this. but it is FALSE POSITIVE
+ *
+ * widget_ref will increase the refcnt of data.
+ * and it is called when calling the dynamicbox_destroy_glance_bar function (via the last param)
+ * So this function call will not release the data.
+ */
+ widget_unref(data);
+ }
+ ErrPrint("Failed to create a GBAR, unknown type\n");
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_GBAR_ABORTED, &info);
+ widget_unref(data);
+ return;
+ }
+
+ data->is.field.gbar_created = 1;
+ info.error = DBOX_STATUS_ERROR_NONE;
+ info.event = DBOX_EVENT_GBAR_CREATED;
+ info.pkgname = data->dbox_id;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_GBAR_CREATED, &info);
+ widget_unref(data);
+}
+
+static void update_scroll_flag(struct widget_data *data, int x, int y)
+{
+ if (s_info.conf.field.is_scroll_x && !s_info.conf.field.is_scroll_y) {
+ if (!data->is.field.scroll_x && abs(y - data->down.y) > CLICK_REGION && (abs(x - data->down.x) <= CLICK_REGION)) {
+ data->is.field.cancel_scroll_x = 1;
+ }
+ }
+
+ if (s_info.conf.field.is_scroll_y && !s_info.conf.field.is_scroll_x) {
+ if (!data->is.field.scroll_y && abs(x - data->down.x) > CLICK_REGION && (abs(y - data->down.y) <= CLICK_REGION)) {
+ data->is.field.cancel_scroll_y = 1;
+ }
+ }
+
+ data->is.field.scroll_x = s_info.conf.field.is_scroll_x && (!!(data->is.field.scroll_x || (abs(x - data->down.x) > CLICK_REGION)));
+ data->is.field.scroll_y = s_info.conf.field.is_scroll_y && (!!(data->is.field.scroll_y || (abs(y - data->down.y) > CLICK_REGION)));
+ data->is.field.scroll_x = !data->is.field.cancel_scroll_x && data->is.field.scroll_x;
+ data->is.field.scroll_y = !data->is.field.cancel_scroll_y && data->is.field.scroll_y;
+}
+
+static void dbox_up_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up *up = event_info;
+ struct dynamicbox_evas_event_info info;
+ struct widget_data *data = cbdata;
+ Evas_Coord x, y, w, h;
+ int ret = 0;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (!data->is.field.pressed) {
+ return;
+ }
+
+ update_scroll_flag(data, up->canvas.x, up->canvas.y);
+
+ data->x = up->canvas.x;
+ data->y = up->canvas.y;
+ data->is.field.pressed = 0;
+
+ if (s_info.conf.field.auto_render_selector) {
+ DbgPrint("Change to render animator\n");
+ s_info.conf.field.render_animator = 1;
+ }
+
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_GBAR_CREATED;
+
+ if (s_info.conf.field.support_gbar && data->is.field.flick_down && data->y - data->down.y < CLICK_REGION) {
+ DbgPrint("Flick down is canceled\n");
+ data->is.field.flick_down = 0;
+ info.error = DBOX_STATUS_ERROR_CANCEL;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info);
+ }
+
+ evas_object_geometry_get(data->dynamicbox, &x, &y, &w, &h);
+
+ if (data->is.field.flick_down) {
+ data->is.field.flick_down = 0;
+ if (!data->handle || data->is.field.faulted || !dynamicbox_has_glance_bar(data->handle)) {
+ if (!data->is.field.gbar_created && s_info.conf.field.support_gbar) {
+ elm_object_signal_emit(data->dbox_layout, "tilt", "content");
+ }
+ DbgPrint("Flick down is canceled\n");
+ info.error = DBOX_STATUS_ERROR_CANCEL;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info);
+ } else if (s_info.conf.field.support_gbar && !data->is.field.gbar_created) {
+ double rx;
+ double ry;
+ int gbar_w;
+ int gbar_h;
+
+ if (dynamicbox_get_glance_bar_size(data->handle, &gbar_w, &gbar_h) != DBOX_STATUS_ERROR_NONE) {
+ gbar_w = 0;
+ gbar_h = 0;
+ }
+
+ elm_object_signal_emit(data->dbox_layout, "move,down", "content");
+
+ rx = ((double)x + (double)w / 2.0f) / (double)s_info.screen_width;
+ DbgPrint("x[%d], w[%d], rx[%lf]\n", x, w, rx);
+ // 0.0 0.125 0.25 0.375 0.5 0.625 0.75 0.875 1.0
+ switch (dynamicbox_size(data->handle)) {
+ case DBOX_SIZE_TYPE_1x1:
+ if (rx < 0.25f) {
+ rx = 0.125f;
+ } else if (rx < 0.5f) {
+ rx = 0.375f;
+ } else if (rx < 0.75f) {
+ rx = 0.625f;
+ } else if (rx < 1.0f) {
+ rx = 0.875f;
+ }
+ break;
+ case DBOX_SIZE_TYPE_2x1:
+ case DBOX_SIZE_TYPE_2x2:
+ if (rx < 0.5f) {
+ rx = 0.25f;
+ } else if (rx < 0.625f) {
+ rx = 0.5f;
+ } else {
+ rx = 0.75f;
+ }
+ break;
+ default:
+ rx = 0.5f;
+ break;
+ }
+
+ if (y + h + gbar_h <= s_info.screen_height) {
+ ry = 0.0f;
+ } else {
+ ry = 1.0f;
+ }
+
+ DbgPrint("converted rx[%lf], ry[%lf]\n", rx, ry);
+
+ ret = dynamicbox_create_glance_bar(data->handle, rx, ry, dbox_create_gbar_cb, widget_ref(data));
+ if (ret < 0) {
+ widget_unref(data);
+ DbgPrint("Flick down is canceled\n");
+ info.error = DBOX_STATUS_ERROR_CANCEL;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info);
+ }
+ DbgPrint("Create GBAR: %d (%lfx%lf)\n", ret, rx, ry);
+ }
+ }
+
+ if (data->handle && !data->is.field.faulted) {
+ struct dynamicbox_mouse_event_info minfo;
+
+ minfo.x = (double)(data->x - x) / (double)w;
+ minfo.y = (double)(data->y - y) / (double)h;
+
+ evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+
+ reset_scroller(data);
+
+ if (s_info.conf.field.auto_feed && data->is.field.mouse_event) {
+ struct dynamicbox_mouse_event_info _minfo;
+
+ if (data->down.geo.x != x || data->down.geo.y != y || data->is.field.scroll_x || data->is.field.scroll_y || data->is.field.cancel_click == CANCEL_USER) {
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_ON_HOLD, &minfo);
+ data->is.field.cancel_click = CANCEL_PROCESSED;
+ }
+
+ _minfo.x = (double)data->down.geo.x / (double)data->down.geo.w;
+ _minfo.y = (double)data->down.geo.y / (double)data->down.geo.h;
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_UNSET, &_minfo);
+ } else {
+ if (!data->is.field.mouse_event) {
+ /* We have to keep the first position of touch down */
+ minfo.x = (double)(data->down.x - x) / (double)w;
+ minfo.y = (double)(data->down.y - y) / (double)h;
+ if (data->down.geo.x != x || data->down.geo.y != y || data->is.field.scroll_x || data->is.field.scroll_y || data->is.field.cancel_click == CANCEL_USER || abs(data->x - data->down.x) > CLICK_REGION || abs(data->y - data->down.y) > CLICK_REGION) {
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_ON_HOLD, &minfo);
+ data->is.field.cancel_click = CANCEL_PROCESSED;
+ }
+ } else {
+ if (data->down.geo.x != x || data->down.geo.y != y || data->is.field.scroll_x || data->is.field.scroll_y || data->is.field.cancel_click == CANCEL_USER) {
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_ON_HOLD, &minfo);
+ data->is.field.cancel_click = CANCEL_PROCESSED;
+ }
+ }
+
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_UP, &minfo);
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_LEAVE, &minfo);
+ }
+
+ if (!data->is.field.flick_down) {
+ ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ if (data->is.field.gbar_created) {
+ ret = dynamicbox_destroy_glance_bar(data->handle, dbox_destroy_gbar_cb, widget_ref(data));
+ if (ret < 0) {
+ widget_unref(data);
+ }
+ } else if (data->is.field.cancel_click == CANCEL_DISABLED) {
+ ret = dynamicbox_click(data->handle, minfo.x, minfo.y);
+ }
+ }
+
+ DbgPrint("Up: %lfx%lf [x:%d/%d/%d] [y:%d/%d/%d], ret: 0x%X, cancel: 0x%x\n",
+ minfo.x, minfo.y,
+ data->is.field.scroll_x, s_info.conf.field.is_scroll_x, data->is.field.cancel_scroll_x,
+ data->is.field.scroll_y, s_info.conf.field.is_scroll_y, data->is.field.cancel_scroll_y,
+ ret, data->is.field.cancel_click);
+ data->is.field.cancel_click = CANCEL_DISABLED;
+ }
+}
+
+static void dbox_move_cb(void *cbdata, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *move = event_info;
+ struct widget_data *data = cbdata;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (!data->is.field.pressed) {
+ return;
+ }
+
+ if (s_info.conf.field.support_gbar && data->is.field.flick_down && data->y - move->cur.canvas.y > 0) {
+ struct dynamicbox_evas_event_info info;
+
+ DbgPrint("Flick down is canceled\n");
+ data->is.field.flick_down = 0;
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_GBAR_CREATED;
+ info.error = DBOX_STATUS_ERROR_CANCEL;
+
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info);
+ }
+
+ update_scroll_flag(data, move->cur.canvas.x, move->cur.canvas.y);
+
+ data->x = move->cur.canvas.x;
+ data->y = move->cur.canvas.y;
+
+ if (data->handle && !data->is.field.faulted) {
+ if (data->is.field.cancel_click == CANCEL_USER) {
+ struct dynamicbox_mouse_event_info minfo;
+ Evas_Coord x, y, w, h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+ minfo.x = (double)(data->x - x) / (double)w;
+ minfo.y = (double)(data->y - y) / (double)h;
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_ON_HOLD, &minfo);
+
+ /*
+ * Reset the clicked event
+ */
+ data->is.field.cancel_click = CANCEL_PROCESSED;
+
+ if (s_info.conf.field.auto_render_selector) {
+ DbgPrint("Change to render animator\n");
+ s_info.conf.field.render_animator = 1;
+ }
+
+ }
+
+ if (!s_info.conf.field.auto_feed) {
+ struct dynamicbox_mouse_event_info minfo;
+ Evas_Coord x, y, w, h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+ minfo.x = (double)(data->x - x) / (double)w;
+ minfo.y = (double)(data->y - y) / (double)h;
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_MOVE, &minfo);
+ }
+
+ if (s_info.conf.field.support_gbar && data->is.field.flick_down && abs(data->y - data->down.y) > CLICK_REGION) {
+ struct dynamicbox_evas_event_info info;
+ data->is.field.flick_down = 0;
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_GBAR_CREATED;
+ info.error = DBOX_STATUS_ERROR_CANCEL;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info);
+ DbgPrint("Flick down is canceled\n");
+ }
+
+ } else {
+ if (s_info.conf.field.auto_render_selector) {
+ s_info.conf.field.render_animator = 1;
+ }
+ }
+}
+
+static char *get_package_icon(struct widget_data *data)
+{
+ char *icon;
+ char *uiapp;
+
+ if (data->size_type == DBOX_SIZE_TYPE_UNKNOWN) {
+ icon = dynamicbox_service_i18n_icon(data->dbox_id, NULL);
+ } else {
+ icon = dynamicbox_service_preview(data->dbox_id, data->size_type);
+ }
+
+ if (icon && access(icon, R_OK) == 0) {
+ return icon;
+ }
+
+ if (icon) {
+ ErrPrint("Failed to access an icon file: [%s]\n", icon);
+ free(icon);
+ icon = NULL;
+ }
+
+ uiapp = dynamicbox_service_mainappid(data->dbox_id);
+ if (uiapp) {
+ int ret;
+ ail_appinfo_h ai;
+
+ ret = ail_get_appinfo(uiapp, &ai);
+ free(uiapp);
+ if (ret == AIL_ERROR_OK) {
+ char *uiapp_icon = NULL;
+
+ ret = ail_appinfo_get_str(ai, AIL_PROP_ICON_STR, &uiapp_icon);
+ if (ret != AIL_ERROR_OK || !uiapp_icon || access(uiapp_icon, R_OK) != 0) {
+ ErrPrint("[%s] - %s\n", uiapp_icon, strerror(errno));
+ } else {
+ DbgPrint("UI-App icon: [%s]\n", uiapp_icon);
+ icon = strdup(uiapp_icon);
+ if (!icon) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ /*!
+ * \note
+ * icon will be specified to "unknown" icon file. (default)
+ */
+ }
+ }
+
+ ail_destroy_appinfo(ai);
+ }
+ }
+
+ if (!icon) {
+ icon = strdup(DYNAMICBOX_EVAS_UNKNOWN);
+ if (!icon) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ }
+ }
+
+ return icon;
+}
+
+static void activate_ret_cb(struct dynamicbox *handle, int ret, void *cbdata)
+{
+ struct widget_data *data = cbdata;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ data->overlay_update_counter = 0;
+ dbox_overlay_disable(data, 1);
+
+ DbgPrint("Activated (%s): %d\n", data->dbox_id, ret);
+ if (!data->is.field.deleted && (ret == DBOX_STATUS_ERROR_NONE || ret == DBOX_STATUS_ERROR_INVALID_PARAMETER)) {
+ int type;
+ Evas_Coord w, h;
+ struct acquire_data acquire_data = {
+ .data = data,
+ };
+
+ evas_object_geometry_get(data->dbox_layout, NULL, NULL, &w, &h);
+
+ type = find_size_type(data, w, h);
+ if (type == DBOX_SIZE_TYPE_UNKNOWN) {
+ ErrPrint("Failed to find a proper size type: %dx%d\n", w, h);
+ type = DBOX_SIZE_TYPE_1x1;
+ }
+
+ data->is.field.faulted = 0;
+ data->is.field.created = 0;
+ data->is.field.send_delete = 1;
+ update_dbox_geometry(&acquire_data);
+ data->handle = dynamicbox_add(data->dbox_id, data->content,
+ data->cluster, data->category,
+ data->period, type,
+ dbox_created_cb, widget_ref(data));
+ if (!data->handle) {
+ ErrPrint("Failed to send add request\n");
+ widget_unref(data);
+ return;
+ }
+
+ DbgPrint("Added Handle: (%p) %p\n", data->handle, data);
+ dynamicbox_set_data(data->handle, data->dynamicbox);
+ dbox_overlay_loading(data);
+ }
+
+ data->is.field.deleted = 0;
+ widget_unref(data);
+}
+
+static void dbox_animation_done_cb(void *cbdata, Evas_Object *obj, const char *emission, const char *source)
+{
+ struct widget_data *data = cbdata;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (dynamicbox_has_glance_bar(data->handle)) {
+ } else {
+ DbgPrint("Animation finished\n");
+ }
+}
+
+static void dbox_turn_done_cb(void *cbdata, Evas_Object *obj, const char *emission, const char *source)
+{
+ struct widget_data *data = cbdata;
+ Evas_Object *overlay;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ overlay = elm_object_part_content_unset(data->dbox_layout, "overlay,content");
+ if (overlay) {
+ evas_object_del(overlay);
+ data->is.field.dbox_overlay_loaded = 0;
+ }
+}
+
+static void dbox_overlay_clicked_cb(void *cbdata, Evas_Object *obj, const char *emission, const char *source)
+{
+ struct widget_data *data = cbdata;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ DbgPrint("Overlay is clicked: (%s) (%s)\n", emission, source);
+ if (!data->is.field.faulted) {
+ /*!
+ * \todo
+ * Reload
+ */
+ DbgPrint("Package [%s] is not faulted one\n", data->dbox_id);
+ } else {
+ DbgPrint("Activate: [%s]\n", data->dbox_id);
+ if (dynamicbox_activate(data->dbox_id, activate_ret_cb, widget_ref(data)) < 0) {
+ widget_unref(data);
+ ErrPrint("Failed to activate %s\n", data->dbox_id);
+ }
+ }
+}
+
+static void widget_data_setup(struct widget_data *data)
+{
+ data->e = evas_object_evas_get(data->dynamicbox);
+ if (!data->e) {
+ ErrPrint("Failed to get Evas object\n");
+ data->state = WIDGET_DATA_DELETED;
+ free(data);
+ return;
+ }
+
+ data->stage = evas_object_rectangle_add(data->e);
+ if (!data->stage) {
+ ErrPrint("Failed to add stage object\n");
+ data->state = WIDGET_DATA_DELETED;
+ free(data);
+ return;
+ }
+
+ evas_object_color_set(data->stage, 255, 255, 255, 255);
+
+ data->dbox_layout = elm_layout_add(data->parent);
+ if (!data->dbox_layout) {
+ ErrPrint("Failed to add edje object\n");
+ evas_object_del(data->stage);
+ data->state = WIDGET_DATA_DELETED;
+ free(data);
+ return;
+ }
+
+ if (elm_layout_file_set(data->dbox_layout, DYNAMICBOX_EVAS_RESOURCE_EDJ, DYNAMICBOX_EVAS_RESOURCE_LB) == EINA_FALSE) {
+ ErrPrint("Failed to load edje object: %s(%s)\n", DYNAMICBOX_EVAS_RESOURCE_EDJ, DYNAMICBOX_EVAS_RESOURCE_LB);
+ evas_object_del(data->dbox_layout);
+ evas_object_del(data->stage);
+ data->state = WIDGET_DATA_DELETED;
+ free(data);
+ return;
+ }
+
+ Evas_Object *scroller;
+ scroller = elm_scroller_add(data->parent);
+ if (scroller) {
+ Evas_Object *box;
+
+ elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE);
+ elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_scroller_single_direction_set(scroller, ELM_SCROLLER_SINGLE_DIRECTION_HARD);
+ //elm_object_scroll_lock_x_set(scroller, EINA_TRUE);
+
+ box = evas_object_rectangle_add(data->e);
+ if (box) {
+ int height;
+
+ height = s_info.screen_height << 1;
+
+ evas_object_color_set(box, 0, 0, 0, 0);
+ evas_object_resize(box, s_info.screen_width, height);
+ evas_object_size_hint_min_set(box, s_info.screen_width, height);
+ evas_object_show(box);
+ }
+
+ elm_object_content_set(scroller, box);
+ elm_object_part_content_set(data->dbox_layout, "scroller", scroller);
+ } else {
+ ErrPrint("Failed to create a scroller\n");
+ }
+
+ evas_object_show(data->dbox_layout);
+
+ elm_object_signal_callback_add(data->dbox_layout, "mouse,clicked,1", "overlay,content", dbox_overlay_clicked_cb, data);
+ elm_object_signal_callback_add(data->dbox_layout, "done", "turn", dbox_turn_done_cb, data);
+ elm_object_signal_callback_add(data->dbox_layout, "finished", "animation", dbox_animation_done_cb, data);
+
+ evas_object_event_callback_add(data->dbox_layout, EVAS_CALLBACK_MOUSE_DOWN, dbox_down_cb, data);
+ evas_object_event_callback_add(data->dbox_layout, EVAS_CALLBACK_MOUSE_MOVE, dbox_move_cb, data);
+ evas_object_event_callback_add(data->dbox_layout, EVAS_CALLBACK_MOUSE_UP, dbox_up_cb, data);
+
+ evas_object_smart_member_add(data->stage, data->dynamicbox);
+ evas_object_smart_member_add(data->dbox_layout, data->dynamicbox);
+ evas_object_clip_set(data->dbox_layout, data->stage);
+
+}
+
+static Eina_Bool renderer_cb(void *_data)
+{
+ struct widget_data *data;
+
+ EINA_LIST_FREE(s_info.dbox_dirty_objects, data) {
+ dynamicbox_event_dbox_updated(data);
+ }
+
+ EINA_LIST_FREE(s_info.gbar_dirty_objects, data) {
+ dynamicbox_event_gbar_updated(data);
+ }
+
+ s_info.renderer = NULL;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void remove_dbox_dirty_object_list(struct widget_data *data)
+{
+ s_info.dbox_dirty_objects = eina_list_remove(s_info.dbox_dirty_objects, data);
+}
+
+static void remove_gbar_dirty_object_list(struct widget_data *data)
+{
+ s_info.gbar_dirty_objects = eina_list_remove(s_info.gbar_dirty_objects, data);
+}
+
+static void append_dbox_dirty_object_list(struct widget_data *data, int idx)
+{
+ data->is.field.dbox_dirty = 1;
+
+ if (idx != DBOX_KEEP_BUFFER) {
+ data->dbox_latest_idx = idx;
+ }
+
+ if (dynamicbox_visibility(data->handle) != DBOX_SHOW) {
+ return;
+ }
+
+ if (s_info.conf.field.render_animator) {
+ if (eina_list_data_find(s_info.dbox_dirty_objects, data)) {
+ return;
+ }
+
+ if (!s_info.renderer) {
+ s_info.renderer = ecore_animator_add(renderer_cb, NULL);
+ if (!s_info.renderer) {
+ ErrPrint("Failed to create a renderer\n");
+ }
+ }
+
+ s_info.dbox_dirty_objects = eina_list_append(s_info.dbox_dirty_objects, data);
+ } else {
+ if (s_info.renderer) {
+ ecore_animator_del(s_info.renderer);
+ s_info.renderer = NULL;
+ }
+
+ /* Need a choice
+ * Do we have to discard these all changes? or just flush them?
+ struct widget_data *item;
+ EINA_LIST_FREE(s_info.dbox_dirty_objects, item) {
+ dynamicbox_event_dbox_updated(item);
+ }
+ */
+ eina_list_free(s_info.dbox_dirty_objects);
+ s_info.dbox_dirty_objects = NULL;
+ dynamicbox_event_dbox_updated(data);
+ }
+}
+
+static void append_gbar_dirty_object_list(struct widget_data *data, int idx)
+{
+ data->is.field.gbar_dirty = 1;
+
+ if (idx != DBOX_KEEP_BUFFER) {
+ data->gbar_latest_idx = idx;
+ }
+
+ if (dynamicbox_visibility(data->handle) != DBOX_SHOW) {
+ return;
+ }
+
+ if (s_info.conf.field.render_animator) {
+ if (eina_list_data_find(s_info.gbar_dirty_objects, data)) {
+ return;
+ }
+
+ if (!s_info.renderer) {
+ s_info.renderer = ecore_animator_add(renderer_cb, NULL);
+ if (!s_info.renderer) {
+ ErrPrint("Failed to create a renderer\n");
+ }
+ }
+
+ s_info.gbar_dirty_objects = eina_list_append(s_info.gbar_dirty_objects, data);
+ } else {
+ if (s_info.renderer) {
+ ecore_animator_del(s_info.renderer);
+ s_info.renderer = NULL;
+ }
+
+ /* Need a choice
+ * Do we have to discard these all changes? or just flush them?
+ struct widget_data *item;
+ EINA_LIST_FREE(s_info.gbar_dirty_objects, item) {
+ dynamicbox_event_gbar_updated(item);
+ }
+ */
+ eina_list_free(s_info.gbar_dirty_objects);
+ s_info.gbar_dirty_objects = NULL;
+ dynamicbox_event_gbar_updated(data);
+ }
+}
+
+static void widget_add(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = calloc(1, sizeof(*data));
+ if (!data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return;
+ }
+
+ data->state = WIDGET_DATA_CREATED;
+ data->dynamicbox = dynamicbox;
+ data->is.field.permanent_delete = 0;
+ data->dbox_latest_idx = DBOX_PRIMARY_BUFFER;
+ data->gbar_latest_idx = DBOX_PRIMARY_BUFFER;
+ evas_object_smart_data_set(data->dynamicbox, data);
+ widget_ref(data);
+
+ s_info.list = eina_list_append(s_info.list, dynamicbox);
+ return;
+}
+
+static Evas_Object *create_image_object(struct widget_data *data)
+{
+ Evas_Object *img;
+
+ img = evas_object_image_filled_add(data->e);
+ if (!img) {
+ ErrPrint("Failed to create an image object\n");
+ } else {
+ evas_object_image_colorspace_set(img, EVAS_COLORSPACE_ARGB8888);
+ evas_object_image_alpha_set(img, EINA_TRUE);
+ }
+
+ return img;
+}
+
+static void replace_dbox_pixmap_with_image(struct widget_data *data)
+{
+ Evas_Object *img;
+ Evas_Object *dbox_content;
+
+ dbox_content = elm_object_part_content_unset(data->dbox_layout, "dynamicbox,content");
+ if (!dbox_content) {
+ ErrPrint("Failed to get content object\n");
+ return;
+ }
+
+ img = create_image_object(data);
+ if (img) {
+ Evas_Coord w;
+ Evas_Coord h;
+ void *content;
+
+ evas_object_image_size_get(dbox_content, &w, &h);
+ evas_object_image_size_set(img, w, h);
+
+ content = evas_object_image_data_get(dbox_content, 0);
+ if (content) {
+ evas_object_image_data_copy_set(img, content);
+ }
+
+ evas_object_image_fill_set(img, 0, 0, w, h);
+ evas_object_image_pixels_dirty_set(img, EINA_TRUE);
+ evas_object_image_data_update_add(img, 0, 0, w, h);
+
+ elm_object_part_content_set(data->dbox_layout, "dynamicbox,content", img);
+ } else {
+ ErrPrint("Failed to create an image object\n");
+ }
+
+ evas_object_del(dbox_content);
+}
+
+static void replace_gbar_pixmap_with_image(struct widget_data *data)
+{
+ Evas_Object *img;
+ Evas_Object *gbar_content;
+
+ gbar_content = elm_object_part_content_unset(data->dbox_layout, "gbar,content");
+ if (!gbar_content) {
+ ErrPrint("Failed to get content object\n");
+ return;
+ }
+
+ img = create_image_object(data);
+ if (img) {
+ Evas_Coord w;
+ Evas_Coord h;
+ void *content;
+
+ evas_object_image_size_get(gbar_content, &w, &h);
+ evas_object_image_size_set(img, w, h);
+
+ content = evas_object_image_data_get(gbar_content, 0);
+ if (content) {
+ evas_object_image_data_copy_set(img, content);
+ }
+
+ evas_object_image_fill_set(img, 0, 0, w, h);
+ evas_object_image_pixels_dirty_set(img, EINA_TRUE);
+ evas_object_image_data_update_add(img, 0, 0, w, h);
+
+ elm_object_part_content_set(data->dbox_layout, "gbar,content", img);
+ } else {
+ ErrPrint("Failed to create an image object\n");
+ }
+
+ evas_object_del(gbar_content);
+}
+
+static void dbox_destroy_dbox_cb(struct dynamicbox *handle, int ret, void *_data)
+{
+ struct widget_data *data = _data;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (data->dbox_pixmap) {
+ replace_dbox_pixmap_with_image(data);
+ }
+
+ if (data->gbar_pixmap) {
+ replace_gbar_pixmap_with_image(data);
+ }
+
+ data->is.field.send_delete = 0;
+ DbgPrint("Invoke raw delete %s\n", data->dbox_id);
+ invoke_raw_event_callback(DYNAMICBOX_EVAS_RAW_DELETE, data->dbox_id, NULL, ret);
+ remove_dbox_dirty_object_list(data);
+ remove_gbar_dirty_object_list(data); /* for the safety */
+ widget_unref(data);
+}
+
+static void widget_del(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (data->is.field.deleted == 1) {
+ DbgPrint("Already deleted: %s\n", data->dbox_id);
+ return;
+ }
+
+ data->is.field.deleted = 1;
+
+ s_info.list = eina_list_remove(s_info.list, dynamicbox);
+
+ if (data->handle) {
+ dynamicbox_set_data(data->handle, NULL);
+
+ if (data->is.field.send_delete) {
+ int delete_type;
+
+ if (data->is.field.permanent_delete) {
+ delete_type = DBOX_DELETE_PERMANENTLY;
+ } else {
+ delete_type = DBOX_DELETE_TEMPORARY;
+ }
+ DbgPrint("Send delete request (0x%X)\n", delete_type);
+
+ if (data->is.field.created) {
+ if (dynamicbox_del(data->handle, delete_type, dbox_destroy_dbox_cb, widget_ref(data)) < 0) {
+ widget_unref(data);
+ }
+ } else {
+ DbgPrint("Not created yet. this will be canceld by created callback, ignore delete callback\n");
+ if (dynamicbox_del(data->handle, delete_type, NULL, NULL) < 0) {
+ DbgPrint("Unref %p\n", data);
+ }
+ }
+ } else {
+ DbgPrint("Skip delete request\n");
+ }
+ } else {
+ DbgPrint("Handle is not created: %s\n", data->dbox_id);
+ }
+
+ /**
+ * From now, the dynamicbox object is not valid
+ */
+ data->dynamicbox = NULL;
+ widget_unref(data);
+}
+
+static void update_visibility(struct widget_data *data)
+{
+ int is_visible = 0;
+
+ if (!data->handle || !data->is.field.created) {
+ return;
+ }
+
+ if (data->is.field.freeze_visibility) {
+ DbgPrint("Freezed visibility: %X (%s)\n", data->freezed_visibility, dynamicbox_pkgname(data->handle));
+ (void)dynamicbox_set_visibility(data->handle, data->freezed_visibility);
+ return;
+ }
+
+ is_visible = evas_object_visible_get(data->stage);
+
+ if (is_visible) {
+ Evas_Coord x, y, w, h;
+
+ evas_object_geometry_get(data->dbox_layout, &x, &y, &w, &h);
+
+ if (!s_info.conf.field.user_view_port) {
+ Ecore_Evas *ee;
+
+ ee = ecore_evas_ecore_evas_get(data->e);
+ if (ee) {
+ ecore_evas_geometry_get(ee, &data->view_port.x, &data->view_port.y, &data->view_port.w, &data->view_port.h);
+ } else {
+ data->view_port.x = 0;
+ data->view_port.y = 0;
+ ecore_x_window_size_get(0, &data->view_port.w, &data->view_port.h);
+ ErrPrint("Failed to get view port info (Fallback: %dx%d - %dx%d\n",
+ data->view_port.x, data->view_port.y, data->view_port.w, data->view_port.h);
+ }
+ }
+
+ if (x + w <= data->view_port.x || x >= data->view_port.x + data->view_port.w || y + h <= data->view_port.y || y >= data->view_port.y + data->view_port.h) {
+ is_visible = 0;
+ } else {
+ is_visible = 1;
+ }
+ }
+
+ if (is_visible) {
+ (void)dynamicbox_set_visibility(data->handle, DBOX_SHOW);
+
+ if (data->is.field.dbox_dirty) {
+ /**
+ * If the object has dirty flag, pumping it up again
+ * To updates its content
+ */
+ append_dbox_dirty_object_list(data, DBOX_KEEP_BUFFER);
+ }
+ } else {
+ (void)dynamicbox_set_visibility(data->handle, DBOX_HIDE_WITH_PAUSE);
+ }
+}
+
+static int do_force_mouse_up(struct widget_data *data)
+{
+ struct dynamicbox_mouse_event_info minfo;
+ Evas_Coord x, y, w, h;
+ struct dynamicbox_evas_event_info info;
+
+ if (s_info.conf.field.auto_render_selector && s_info.conf.field.render_animator == 0) {
+ DbgPrint("Change to render animator\n");
+ s_info.conf.field.render_animator = 1;
+ }
+
+ if (!data->is.field.pressed) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ evas_object_geometry_get(data->dynamicbox, &x, &y, &w, &h);
+
+ minfo.x = (double)(data->x - x) / (double)w;
+ minfo.y = (double)(data->y - y) / (double)h;
+
+ data->is.field.pressed = 0;
+
+ reset_scroller(data);
+
+ if (s_info.conf.field.auto_feed && data->is.field.mouse_event) {
+ DbgPrint("%x\n", data->is.field.cancel_click);
+ if (data->is.field.cancel_click != CANCEL_PROCESSED) {
+ DbgPrint("ON_HOLD send\n");
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_ON_HOLD, &minfo);
+ data->is.field.cancel_click = CANCEL_PROCESSED;
+ }
+
+ minfo.x = (double)data->down.geo.x / (double)data->down.geo.w;
+ minfo.y = (double)data->down.geo.y / (double)data->down.geo.h;
+
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_UNSET, &minfo);
+ } else {
+ if (!data->is.field.mouse_event) {
+ /* We have to keep the first position of touch down */
+ minfo.x = (double)(data->down.x - x) / (double)w;
+ minfo.y = (double)(data->down.y - y) / (double)h;
+ }
+
+ DbgPrint("%x\n", data->is.field.cancel_click);
+ if (data->is.field.cancel_click != CANCEL_PROCESSED) {
+ DbgPrint("ON_HOLD send\n");
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_ON_HOLD, &minfo);
+ data->is.field.cancel_click = CANCEL_PROCESSED;
+ }
+
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_UP, &minfo);
+ dynamicbox_feed_mouse_event(data->handle, DBOX_MOUSE_LEAVE, &minfo);
+ }
+
+ data->is.field.cancel_click = CANCEL_DISABLED;
+ data->is.field.flick_down = 0;
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_GBAR_CREATED;
+ info.error = DBOX_STATUS_ERROR_CANCEL;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_FLICKDOWN_CANCELLED, &info);
+ DbgPrint("Flick down is canceled\n");
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static void widget_move(Evas_Object *dynamicbox, Evas_Coord x, Evas_Coord y)
+{
+ struct widget_data *data;
+ Evas_Coord w, h;
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (data->gbar_layout) {
+ Evas_Coord gbar_x, gbar_y, gbar_h;
+ Evas_Coord prev_x, prev_y;
+ Evas_Coord dbox_w, dbox_h;
+ double rx;
+ double ry;
+
+ evas_object_geometry_get(data->dbox_layout, &prev_x, &prev_y, &dbox_w, &dbox_h);
+ evas_object_geometry_get(data->gbar_layout, &gbar_x, &gbar_y, NULL, &gbar_h);
+
+ gbar_x += (x - prev_x);
+ gbar_y += (y - prev_y);
+
+ evas_object_move(data->gbar_layout, gbar_x, gbar_y);
+
+ rx = ((double)x + (double)dbox_w / 2.0f) / s_info.screen_width;
+ switch (find_size_type(data, dbox_w, dbox_h)) {
+ case DBOX_SIZE_TYPE_1x1:
+ if (rx < 0.25f) {
+ rx = 0.125f;
+ } else if (rx < 0.5f) {
+ rx = 0.375f;
+ } else if (rx < 0.75f) {
+ rx = 0.625f;
+ } else if (rx < 1.0f) {
+ rx = 0.875f;
+ }
+ break;
+ case DBOX_SIZE_TYPE_2x1:
+ case DBOX_SIZE_TYPE_2x2:
+ if (rx < 0.5f) {
+ rx = 0.25f;
+ } else if (rx < 0.75f) {
+ rx = 0.5f;
+ } else {
+ rx = 0.75f;
+ }
+ break;
+ default:
+ rx = 0.5f;
+ break;
+ }
+ if (prev_y + dbox_h + gbar_h > s_info.screen_height) {
+ ry = 1.0f;
+ } else {
+ ry = 0.0f;
+ }
+
+ if (data->is.field.gbar_created) {
+ dynamicbox_move_glance_bar(data->handle, rx, ry);
+ }
+ }
+
+ evas_object_move(data->stage, x, y);
+ evas_object_move(data->dbox_layout, x, y);
+ evas_object_geometry_get(data->dbox_layout, NULL, NULL, &w, &h);
+
+ if (!s_info.conf.field.manual_pause_resume) {
+ update_visibility(data);
+ }
+
+ if (s_info.conf.field.sensitive_move) {
+ do_force_mouse_up(data);
+ }
+}
+
+static int dbox_create_plug_object(struct widget_data *data)
+{
+ struct acquire_data acquire_data = {
+ .w = 0,
+ .h = 0,
+ .content = NULL,
+ .data = data,
+ };
+
+ DbgPrint("Plug type created\n");
+
+ acquire_data.content = elm_object_part_content_unset(data->dbox_layout, "dynamicbox,content");
+ if (acquire_data.content) {
+ DbgPrint("Dynamicbox Content is already prepared: %s\n", dynamicbox_filename(data->handle));
+ evas_object_del(acquire_data.content);
+ }
+
+ acquire_data.content = elm_plug_add(s_info.win);
+ if (!acquire_data.content) {
+ ErrPrint("Failed to add a plug object\n");
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ DbgPrint("Try to connect to %s\n", dynamicbox_filename(data->handle));
+ if (!elm_plug_connect(acquire_data.content, dynamicbox_filename(data->handle), 0, EINA_TRUE)) {
+ ErrPrint("Cannot connect plug[%s]", dynamicbox_filename(data->handle));
+ evas_object_del(acquire_data.content);
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ elm_object_part_content_set(data->dbox_layout, "dynamicbox,content", acquire_data.content);
+
+ acquire_data.w = data->dbox_width;
+ acquire_data.h = data->dbox_height;
+ update_dbox_geometry(&acquire_data);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int dbox_create_image_object(struct widget_data *data)
+{
+ Evas_Object *front_image;
+ struct acquire_data acquire_data = {
+ .w = 0,
+ .h = 0,
+ .content = NULL,
+ .data = data,
+ };
+
+ DbgPrint("Image type created\n");
+
+ acquire_data.content = elm_object_part_content_get(data->dbox_layout, "dynamicbox,content");
+ if (!acquire_data.content) {
+ acquire_data.content = elm_layout_add(data->parent);
+ if (!acquire_data.content) {
+ ErrPrint("Failed to create an edje object\n");
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ if (elm_layout_file_set(acquire_data.content, DYNAMICBOX_EVAS_RESOURCE_EDJ, DYNAMICBOX_EVAS_RESOURCE_IMG) == EINA_FALSE) {
+ ErrPrint("Failed to load edje object: %s(%s)\n", DYNAMICBOX_EVAS_RESOURCE_EDJ, DYNAMICBOX_EVAS_RESOURCE_IMG);
+ evas_object_del(acquire_data.content);
+ return DBOX_STATUS_ERROR_IO_ERROR;
+ }
+
+ front_image = elm_image_add(acquire_data.content);
+ if (!front_image) {
+ ErrPrint("Failed to add front_image object\n");
+ evas_object_del(acquire_data.content);
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ DbgPrint("Default size %dx%d\n", data->dbox_width, data->dbox_height);
+
+ elm_object_part_content_set(acquire_data.content, "front,content", front_image);
+ elm_object_part_content_set(data->dbox_layout, "dynamicbox,content", acquire_data.content);
+ } else {
+ front_image = elm_object_part_content_get(acquire_data.content, "front,content");
+ if (!front_image) {
+ ErrPrint("Unable to get front,content object\n");
+ front_image = elm_image_add(acquire_data.content);
+ if (!front_image) {
+ ErrPrint("Failed to add front_image object\n");
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ elm_object_part_content_set(acquire_data.content, "front,content", front_image);
+ }
+ }
+
+ /*
+ evas_object_geometry_get(data->dynamicbox, NULL, NULL, &acquire_data.w, &acquire_data.h);
+ DbgPrint("Default size %dx%d\n", acquire_data.w, acquire_data.h);
+ DbgPrint("Image size: %dx%d\n", acquire_data.w, acquire_data.h);
+ */
+ acquire_data.w = data->dbox_width;
+ acquire_data.h = data->dbox_height;
+ update_dbox_geometry(&acquire_data);
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int dbox_create_buffer_object(struct widget_data *data)
+{
+ Evas_Object *dbox_content;
+
+ dbox_content = elm_object_part_content_get(data->dbox_layout, "dynamicbox,content");
+ if (!dbox_content) {
+ dbox_content = evas_object_image_filled_add(data->e);
+ if (!dbox_content) {
+ ErrPrint("Failed to create an image object\n");
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ evas_object_image_colorspace_set(dbox_content, EVAS_COLORSPACE_ARGB8888);
+ evas_object_image_alpha_set(dbox_content, EINA_TRUE);
+ elm_object_part_content_set(data->dbox_layout, "dynamicbox,content", dbox_content);
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static int dbox_create_text_object(struct widget_data *data)
+{
+ ErrPrint("Unsupported\n");
+
+ /*!
+ * \todo
+ */
+
+ return DBOX_STATUS_ERROR_NOT_IMPLEMENTED;
+}
+
+static int dbox_create_pixmap_object(struct widget_data *data)
+{
+ Evas_Object *dbox_content;
+
+ dbox_content = elm_object_part_content_get(data->dbox_layout, "dynamicbox,content");
+ if (!dbox_content) {
+ dbox_content = evas_object_image_filled_add(data->e);
+ if (!dbox_content) {
+ ErrPrint("Failed to create an image object\n");
+ return DBOX_STATUS_ERROR_FAULT;
+ }
+
+ evas_object_image_colorspace_set(dbox_content, EVAS_COLORSPACE_ARGB8888);
+ evas_object_image_alpha_set(dbox_content, EINA_TRUE);
+ evas_object_event_callback_add(dbox_content, EVAS_CALLBACK_DEL, dbox_pixmap_del_cb, data);
+
+ elm_object_part_content_set(data->dbox_layout, "dynamicbox,content", dbox_content);
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+static void dbox_resize_pixmap_object(struct widget_data *data)
+{
+ DbgPrint("Dynamicbox resize request is succssfully sent\n");
+}
+
+static void update_dbox_pixmap(Evas_Object *content, int w, int h)
+{
+ evas_object_image_pixels_dirty_set(content, EINA_TRUE);
+ evas_object_image_data_update_add(content, 0, 0, w, h);
+ evas_object_show(content);
+}
+
+static void acquire_dbox_extra_resource_cb(struct dynamicbox *handle, int pixmap, void *cbdata)
+{
+ DbgPrint("Acquired: %u\n", (unsigned int)pixmap);
+}
+
+static void acquire_gbar_extra_resource_cb(struct dynamicbox *handle, int pixmap, void *cbdata)
+{
+ DbgPrint("Acquired: %u\n", (unsigned int)pixmap);
+}
+
+static void replace_pixmap(struct dynamicbox *handle, int gbar, Evas_Object *content, unsigned int pixmap)
+{
+ Evas_Native_Surface *old_surface;
+ Evas_Native_Surface surface;
+
+ surface.version = EVAS_NATIVE_SURFACE_VERSION;
+ surface.type = EVAS_NATIVE_SURFACE_X11;
+ surface.data.x11.pixmap = pixmap;
+
+ old_surface = evas_object_image_native_surface_get(content);
+ if (!old_surface) {
+ surface.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get());
+
+ evas_object_image_native_surface_set(content, &surface);
+
+ DbgPrint("Created: %u\n", surface.data.x11.pixmap);
+ } else {
+ unsigned int old_pixmap;
+
+ old_pixmap = old_surface->data.x11.pixmap;
+
+ surface.data.x11.visual = old_surface->data.x11.visual;
+ evas_object_image_native_surface_set(content, &surface);
+
+ if (old_pixmap && handle) {
+ dynamicbox_release_resource_id(handle, gbar, old_pixmap);
+ }
+ }
+}
+
+static void acquire_dbox_pixmap_cb(struct dynamicbox *handle, int pixmap, void *cbdata)
+{
+ struct acquire_data *acquire_data = cbdata;
+ struct widget_data *data = acquire_data->data;
+
+ data->is.field.dbox_pixmap_acquire_requested = 0;
+
+ if (pixmap == 0) {
+ DbgPrint("Pixmap gotten (0)\n");
+ free(acquire_data);
+ widget_unref(data);
+ return;
+ }
+
+ evas_object_image_size_set(acquire_data->content, acquire_data->w, acquire_data->h);
+ evas_object_image_fill_set(acquire_data->content, 0, 0, acquire_data->w, acquire_data->h);
+ DbgPrint("fillset: %dx%d\n", acquire_data->w, acquire_data->h);
+
+ replace_pixmap(handle, 0, acquire_data->content, (unsigned int)pixmap);
+
+ data->dbox_pixmap = pixmap;
+
+ append_dbox_dirty_object_list(data, DBOX_KEEP_BUFFER);
+ update_dbox_geometry(acquire_data);
+
+ widget_unref(data);
+ free(acquire_data);
+}
+
+static void dbox_update_pixmap_object(struct widget_data *data, Evas_Object *dbox_content, int w, int h)
+{
+ int ret;
+ struct acquire_data *acquire_data;
+
+ if (data->dbox_latest_idx == DBOX_PRIMARY_BUFFER) {
+ if (data->dbox_pixmap == dynamicbox_resource_id(data->handle, 0)) {
+ if (data->dbox_extra) {
+ /* Just replace the pixmap in this case, do not release old pixmap */
+ replace_pixmap(NULL, 0, dbox_content, data->dbox_pixmap);
+ }
+
+ update_dbox_pixmap(dbox_content, w, h);
+ return;
+ }
+
+ if (data->is.field.dbox_pixmap_acquire_requested) {
+ return;
+ }
+
+ acquire_data = malloc(sizeof(*acquire_data));
+ if (!acquire_data) {
+ ErrPrint("malloc: %s\n", strerror(errno));
+ return;
+ }
+
+ acquire_data->data = widget_ref(data);
+ acquire_data->content = dbox_content;
+ acquire_data->w = w;
+ acquire_data->h = h;
+
+ ret = dynamicbox_acquire_resource_id(data->handle, 0, acquire_dbox_pixmap_cb, acquire_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ widget_unref(data);
+ free(acquire_data);
+ } else {
+ data->is.field.dbox_pixmap_acquire_requested = 1;
+ }
+ } else {
+ if (!data->dbox_extra) {
+ ErrPrint("Extra buffer is not prepared yet\n");
+ return;
+ }
+
+ replace_pixmap(NULL, 0, dbox_content, data->dbox_extra[data->dbox_latest_idx]);
+ update_dbox_pixmap(dbox_content, w, h);
+ }
+}
+
+static void dbox_created_cb(struct dynamicbox *handle, int ret, void *cbdata)
+{
+ struct widget_data *data = cbdata;
+ struct dynamicbox_evas_event_info info;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p (%d), %s\n", data, ret, dynamicbox_pkgname(handle));
+ return;
+ }
+
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ DbgPrint("Failed to create: %X\n", ret);
+ data->handle = NULL;
+
+ if (!data->is.field.deleted) {
+ struct dynamicbox_evas_event_info fault_event;
+
+ fault_event.error = ret;
+ fault_event.pkgname = data->dbox_id;
+ fault_event.event = DBOX_EVENT_CREATED;
+
+ if (!data->is.field.faulted) {
+ data->is.field.faulted = 1;
+ dbox_overlay_faulted(data);
+ }
+
+ DbgPrint("Display tap to load (%p) [%s]\n", data, data->dbox_id);
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_DBOX_CREATE_ABORTED, &fault_event);
+
+ ret = DBOX_STATUS_ERROR_FAULT;
+ } else {
+ ret = DBOX_STATUS_ERROR_CANCEL;
+ }
+
+ data->is.field.send_delete = 0;
+ DbgPrint("Invoke raw delete %s\n", data->dbox_id);
+ invoke_raw_event_callback(DYNAMICBOX_EVAS_RAW_DELETE, data->dbox_id, data->dynamicbox, ret);
+ widget_unref(data);
+ return;
+ }
+
+ switch (dynamicbox_type(handle, 0)) {
+ case DBOX_CONTENT_TYPE_IMAGE:
+ ret = dbox_create_image_object(data);
+ break;
+ case DBOX_CONTENT_TYPE_RESOURCE_ID:
+ if (!s_info.conf.field.force_to_buffer) {
+ ret = dbox_create_pixmap_object(data);
+ break;
+ }
+ case DBOX_CONTENT_TYPE_BUFFER:
+ ret = dbox_create_buffer_object(data);
+ break;
+ case DBOX_CONTENT_TYPE_TEXT:
+ ret = dbox_create_text_object(data);
+ break;
+ case DBOX_CONTENT_TYPE_UIFW:
+ ret = dbox_create_plug_object(data);
+ break;
+ case DBOX_CONTENT_TYPE_INVALID:
+ default:
+ ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ break;
+ }
+
+ if (ret == DBOX_STATUS_ERROR_NONE) {
+ info.error = DBOX_STATUS_ERROR_NONE;
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_CREATED;
+
+ data->is.field.created = 1;
+
+ update_visibility(data);
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_DBOX_CREATED, &info);
+ DbgPrint("Invoke raw create %s\n", data->dbox_id);
+ invoke_raw_event_callback(DYNAMICBOX_EVAS_RAW_CREATE, data->dbox_id, data->dynamicbox, ret);
+
+ /**
+ * In case of using the direct update path,
+ * sometimes the provider can send the updated event faster than created event.
+ * In that case, the viewer cannot recognize the updated content of a dbox.
+ * So for the safety, I added this to forcely update the dbox at the first time
+ * Right after creating its instance.
+ */
+ append_dbox_dirty_object_list(data, DBOX_KEEP_BUFFER);
+ } else {
+ info.error = ret;
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_CREATED;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_DBOX_CREATE_ABORTED, &info);
+ data->is.field.send_delete = 0;
+ DbgPrint("Invoke raw delete %s\n", data->dbox_id);
+ invoke_raw_event_callback(DYNAMICBOX_EVAS_RAW_DELETE, data->dbox_id, data->dynamicbox, ret);
+ }
+
+ widget_unref(data);
+}
+
+static void dbox_resize_image_object(struct widget_data *data)
+{
+ DbgPrint("Dynamicbox resize request is succssfully sent\n");
+}
+
+static void dbox_resize_buffer_object(struct widget_data *data)
+{
+ DbgPrint("Dynamicbox resize request is succssfully sent\n");
+}
+
+static void dbox_resize_text_object(struct widget_data *data)
+{
+ DbgPrint("Dynamicbox resize request is succssfully sent\n");
+}
+
+static void dbox_resize_cb(struct dynamicbox *handle, int ret, void *cbdata)
+{
+ struct widget_data *data = cbdata;
+ struct dynamicbox_evas_event_info info;
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ info.error = ret;
+ info.event = DBOX_EVENT_DBOX_SIZE_CHANGED;
+ info.pkgname = data->dbox_id;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_DBOX_RESIZE_ABORTED, &info);
+ widget_unref(data);
+ return;
+ }
+
+ switch (dynamicbox_type(handle, 0)) {
+ case DBOX_CONTENT_TYPE_IMAGE:
+ dbox_resize_image_object(data);
+ break;
+ case DBOX_CONTENT_TYPE_RESOURCE_ID:
+ if (!s_info.conf.field.force_to_buffer) {
+ dbox_resize_pixmap_object(data);
+ break;
+ }
+ case DBOX_CONTENT_TYPE_BUFFER:
+ dbox_resize_buffer_object(data);
+ break;
+ case DBOX_CONTENT_TYPE_TEXT:
+ dbox_resize_text_object(data);
+ break;
+ case DBOX_CONTENT_TYPE_UIFW:
+ break;
+ case DBOX_CONTENT_TYPE_INVALID:
+ break;
+ default:
+ break;
+ }
+
+ info.error = ret;
+ info.event = DBOX_EVENT_DBOX_SIZE_CHANGED;
+ info.pkgname = data->dbox_id;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_DBOX_RESIZED, &info);
+ widget_unref(data);
+}
+
+static void gbar_overlay_disable(struct widget_data *data)
+{
+ if (!data->gbar_layout) {
+ return;
+ }
+
+ if (!data->is.field.gbar_overlay_loaded) {
+ return;
+ }
+
+ elm_object_signal_emit(data->gbar_layout, "disable", "overlay");
+ data->is.field.gbar_overlay_loaded = 0;
+}
+
+static void gbar_overlay_loading(struct widget_data *data)
+{
+ Evas_Object *rect;
+
+ if (data->is.field.gbar_overlay_loaded) {
+ ErrPrint("Already loaded");
+ return;
+ }
+
+ rect = elm_object_part_content_unset(data->gbar_layout, "overlay,content");
+ if (rect) {
+ evas_object_del(rect);
+ }
+
+ rect = evas_object_rectangle_add(data->e);
+ evas_object_color_set(rect, 0, 0, 0, 0);
+ evas_object_show(rect);
+ /*!
+ * \todo
+ * Overlay for loading a GBAR
+ */
+
+ elm_object_part_content_set(data->gbar_layout, "overlay,content", rect);
+ elm_object_signal_emit(data->gbar_layout, "enable", "overlay");
+
+ data->is.field.gbar_overlay_loaded = 1;
+}
+
+static Evas_Object *dbox_load_overlay_edje(struct widget_data *data)
+{
+ Evas_Object *overlay;
+
+ overlay = elm_layout_add(data->parent);
+ if (!overlay) {
+ ErrPrint("Failed to create a overlay\n");
+ return NULL;
+ }
+
+ if (elm_layout_file_set(overlay, DYNAMICBOX_EVAS_RESOURCE_EDJ, DYNAMICBOX_EVAS_RESOURCE_OVERLAY_LOADING) == EINA_FALSE) {
+ ErrPrint("Failed to load overlay file\n");
+ evas_object_del(overlay);
+ return NULL;
+ }
+
+ elm_object_part_content_set(data->dbox_layout, "overlay,content", overlay);
+ return overlay;
+}
+
+static Eina_Bool delayed_overlay_disable_cb(void *_data)
+{
+ struct widget_data *data = _data;
+
+ elm_object_signal_emit(data->dbox_layout, "disable", "overlay");
+
+ data->is.field.dbox_overlay_loaded = 0;
+ data->overlay_update_counter = DEFAULT_OVERLAY_COUNTER;
+ data->overlay_timer = NULL;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void dbox_overlay_disable(struct widget_data *data, int no_timer)
+{
+ if (!data->dbox_layout) {
+ return;
+ }
+
+ if (!data->is.field.dbox_overlay_loaded) {
+ return;
+ }
+
+ data->overlay_update_counter--;
+ if (data->overlay_update_counter <= 0) {
+ if (no_timer) {
+ if (data->overlay_timer) {
+ ecore_timer_del(data->overlay_timer);
+ data->overlay_timer = NULL;
+ }
+ delayed_overlay_disable_cb(data);
+ } else {
+ if (data->overlay_timer) {
+ ecore_timer_del(data->overlay_timer);
+ data->overlay_timer = NULL;
+ delayed_overlay_disable_cb(data);
+ } else {
+ return;
+ }
+ }
+ }
+
+ if (!no_timer && !data->overlay_timer) {
+ data->overlay_timer = ecore_timer_add(DEFAULT_OVERLAY_WAIT_TIME, delayed_overlay_disable_cb, data);
+ if (!data->overlay_timer) {
+ ErrPrint("Failed to create a timer\n");
+ delayed_overlay_disable_cb(data);
+ }
+ }
+}
+
+static void dbox_overlay_loading(struct widget_data *data)
+{
+ struct acquire_data acquire_data;
+ Evas_Object *overlay;
+
+ if (data->is.field.disable_loading == 1) {
+ DbgPrint("Loading overlay is disabled");
+ return;
+ }
+
+ if (data->is.field.dbox_overlay_loaded == 1) {
+ DbgPrint("Overlay is already loaded");
+ return;
+ }
+
+ overlay = elm_object_part_content_get(data->dbox_layout, "overlay,content");
+ if (!overlay) {
+ overlay = dbox_load_overlay_edje(data);
+ if (!overlay) {
+ return;
+ }
+ }
+
+ if (!data->is.field.disable_preview) {
+ char *icon;
+
+ icon = get_package_icon(data);
+ if (icon) {
+ Evas_Object *preview;
+
+ preview = elm_object_part_content_get(overlay, "preview");
+ if (!preview) {
+ preview = elm_image_add(overlay);
+ }
+
+ if (preview) {
+ elm_image_file_set(preview, icon, NULL);
+ elm_object_part_content_set(overlay, "preview", preview);
+ }
+
+ free(icon);
+ }
+
+ DbgPrint("Set overlay loading (%p) %s\n", data, data->dbox_id);
+ } else {
+ DbgPrint("Overlay is disabled (%s)\n", data->dbox_id);
+ }
+
+ elm_object_part_text_set(overlay, "text", _("IDS_IDLE_POP_LOADING_ING"));
+ if (data->is.field.disable_text) {
+ elm_object_signal_emit(overlay, "disable", "text");
+ }
+
+ elm_object_signal_emit(data->dbox_layout, "reset", "overlay");
+ elm_object_signal_emit(data->dbox_layout, "enable", "overlay");
+
+ evas_object_geometry_get(data->dynamicbox, NULL, NULL, &acquire_data.w, &acquire_data.h);
+ acquire_data.content = NULL;
+ acquire_data.data = data;
+ update_dbox_geometry(&acquire_data);
+
+ data->is.field.dbox_overlay_loaded = 1;
+ data->overlay_update_counter = DEFAULT_OVERLAY_COUNTER;
+}
+
+static void dbox_overlay_faulted(struct widget_data *data)
+{
+ struct acquire_data acquire_data;
+ Evas_Object *overlay;
+
+ if (data->is.field.dbox_overlay_loaded) {
+ data->overlay_update_counter = 0;
+ dbox_overlay_disable(data, 1);
+ }
+
+ overlay = elm_object_part_content_get(data->dbox_layout, "overlay,content");
+ if (!overlay) {
+ overlay = dbox_load_overlay_edje(data);
+ if (!overlay) {
+ return;
+ }
+ }
+
+ if (dynamicbox_type(data->handle, 0) != DBOX_CONTENT_TYPE_IMAGE) {
+ Evas_Object *preview;
+
+ preview = elm_object_part_content_get(overlay, "preview");
+ if (!preview) {
+ char *icon;
+
+ icon = dynamicbox_service_preview(data->dbox_id, data->size_type);
+ if (icon) {
+ preview = elm_image_add(data->dbox_layout);
+ if (preview) {
+ elm_image_file_set(preview, icon, NULL);
+ elm_object_part_content_set(overlay, "preview", preview);
+ }
+
+ free(icon);
+ }
+ }
+ }
+
+ DbgPrint("Set overlay fault (%p) %s\n", data, data->dbox_id);
+ elm_object_part_text_set(overlay, "text", _("IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY"));
+ elm_object_signal_emit(overlay, "enable", "text");
+ elm_object_signal_emit(data->dbox_layout, "reset", "overlay");
+ elm_object_signal_emit(data->dbox_layout, "enable", "overlay");
+
+ evas_object_geometry_get(data->dynamicbox, NULL, NULL, &acquire_data.w, &acquire_data.h);
+ acquire_data.content = NULL;
+ acquire_data.data = data;
+ update_dbox_geometry(&acquire_data);
+ data->is.field.dbox_overlay_loaded = 1;
+}
+
+static void widget_resize(Evas_Object *dynamicbox, Evas_Coord w, Evas_Coord h)
+{
+ struct widget_data *data;
+ int type;
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ type = find_size_type(data, w, h);
+ if (type == DBOX_SIZE_TYPE_UNKNOWN) {
+ ErrPrint("Invalid size: %dx%d\n", w, h);
+ //return;
+ } else if (s_info.conf.field.use_fixed_size) {
+ if (dynamicbox_service_get_size(type, &w, &h) < 0) {
+ ErrPrint("Failed to get box size\n");
+ }
+ }
+
+ data->dbox_width = w;
+ data->dbox_height = h;
+ data->size_type = type;
+
+ if (data->is.field.faulted) {
+ evas_object_resize(data->dbox_layout, data->dbox_width, data->dbox_height);
+ ErrPrint("Faulted DBox, skip resizing (%s)\n", data->dbox_id);
+ return;
+ }
+
+ if (!data->handle) {
+ struct acquire_data acquire_data = {
+ .data = data,
+ };
+ DbgPrint("Create new handle: %dx%d, (%s, %s), %s/%s\n", data->dbox_width, data->dbox_height,
+ data->dbox_id, data->content,
+ data->cluster, data->category);
+ if (dynamicbox_activate(data->dbox_id, NULL, NULL) < 0) {
+ ErrPrint("Activate: %s\n", data->dbox_id);
+ }
+ data->is.field.created = 0;
+ data->is.field.send_delete = 1;
+ update_dbox_geometry(&acquire_data);
+
+ data->handle = dynamicbox_add(data->dbox_id, data->content,
+ data->cluster, data->category,
+ data->period, type,
+ dbox_created_cb, widget_ref(data));
+ if (!data->handle) {
+ ErrPrint("Failed to send add request\n");
+ DbgPrint("Unref %p %s\n", data, data->dbox_id);
+ widget_unref(data);
+ return;
+ }
+
+ DbgPrint("Added handle: %p (%p)\n", data->handle, data);
+ dynamicbox_set_data(data->handle, dynamicbox);
+ dbox_overlay_loading(data);
+ data->is.field.touch_effect = dynamicbox_service_touch_effect(data->dbox_id, type);
+ data->is.field.mouse_event = dynamicbox_service_mouse_event(data->dbox_id, type);
+ } else {
+ int ret;
+
+ DbgPrint("Resize to %dx%d\n", w, h);
+
+ if (type > 0 && type != DBOX_SIZE_TYPE_UNKNOWN) {
+ ret = dynamicbox_resize(data->handle, type, dbox_resize_cb, widget_ref(data));
+ } else {
+ ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ /* This will be decreased soon ... */
+ widget_ref(data);
+ }
+
+ evas_object_resize(data->dbox_layout, data->dbox_width, data->dbox_height);
+ if (ret == DBOX_STATUS_ERROR_ALREADY) {
+ DbgPrint("Same size\n");
+ widget_unref(data);
+ } else if (ret == DBOX_STATUS_ERROR_NONE) {
+ DbgPrint("Resize request is successfully sent\n");
+ data->is.field.touch_effect = dynamicbox_service_touch_effect(data->dbox_id, type);
+ data->is.field.mouse_event = dynamicbox_service_mouse_event(data->dbox_id, type);
+ } else {
+ widget_unref(data);
+ }
+ }
+}
+
+static void widget_show(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ evas_object_show(data->stage);
+ evas_object_show(data->dbox_layout);
+
+ update_visibility(data);
+}
+
+static void widget_hide(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ evas_object_hide(data->stage);
+ evas_object_hide(data->dbox_layout);
+
+ update_visibility(data);
+}
+
+static void widget_color_set(Evas_Object *dynamicbox, int r, int g, int b, int a)
+{
+ struct widget_data *data;
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ evas_object_color_set(data->stage, r, g, b, a);
+}
+
+static void widget_clip_set(Evas_Object *dynamicbox, Evas_Object *clip)
+{
+ struct widget_data *data;
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ evas_object_clip_set(data->stage, clip);
+}
+
+static void widget_clip_unset(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ if (data->state != WIDGET_DATA_CREATED) {
+ ErrPrint("Invalid widget data: %p\n", data);
+ return;
+ }
+
+ evas_object_clip_unset(data->stage);
+}
+
+/*!
+ * This must be called before update_gbar_geometry
+ */
+static void update_stage_geometry(struct acquire_data *acquire_data)
+{
+ Evas_Coord dbox_x, dbox_y, dbox_w, dbox_h;
+ Evas_Coord stage_w, stage_h;
+
+ evas_object_geometry_get(acquire_data->data->dbox_layout, &dbox_x, &dbox_y, &dbox_w, &dbox_h);
+
+ const int delta_y_top = (acquire_data->h - dbox_y);
+ const int delta_y_bottom = (acquire_data->h - (s_info.screen_height - dbox_y - dbox_h));
+
+ stage_w = dbox_w > acquire_data->w ? dbox_w : acquire_data->w;
+ stage_h = dbox_h + acquire_data->h;// - delta_y_top;
+
+ if(delta_y_top >= delta_y_bottom)
+ {
+ evas_object_move(acquire_data->data->stage, 0, dbox_y);
+ }
+ else
+ {
+ evas_object_move(acquire_data->data->stage, 0, dbox_y - acquire_data->h);
+ }
+
+ evas_object_resize(acquire_data->data->stage, stage_w, stage_h);
+}
+
+static void update_gbar_geometry(struct acquire_data *acquire_data)
+{
+ Evas_Coord dbox_x, dbox_y, dbox_w, dbox_h;
+
+ evas_object_geometry_get(acquire_data->data->dbox_layout, &dbox_x, &dbox_y, &dbox_w, &dbox_h);
+
+ //How much of the GBAR is outside the screen
+ const int delta_y_top = (acquire_data->h - dbox_y) < 0 ? 0 : acquire_data->h - dbox_y;
+ const int delta_y_bottom = (acquire_data->h - (s_info.screen_height - dbox_y - dbox_h)) < 0 ? 0 : (acquire_data->h - (s_info.screen_height - dbox_y - dbox_h));
+
+ //If more of the GBAR is outside the top side draw at the bottom, otherwise draw at the top
+ if(delta_y_top >= delta_y_bottom)
+ {
+ evas_object_move(acquire_data->data->gbar_layout, 0, dbox_y + dbox_h - delta_y_bottom);
+ effect_resize(acquire_data->data->gbar_layout, acquire_data->w, acquire_data->h, EFFECT_HEIGHT);
+ }
+ else
+ {
+ evas_object_move(acquire_data->data->gbar_layout, 0, dbox_y + delta_y_top);
+ effect_resize(acquire_data->data->gbar_layout, acquire_data->w, acquire_data->h, EFFECT_HEIGHT|EFFECT_MOVE);
+ }
+}
+
+static void update_dbox_geometry(struct acquire_data *acquire_data)
+{
+ Evas_Coord dbox_x, dbox_y, dbox_w, dbox_h;
+ Evas_Coord stage_w, stage_h;
+ struct widget_data *data = acquire_data->data;
+
+ evas_object_resize(data->dbox_layout, data->dbox_width, data->dbox_height);
+ evas_object_geometry_get(data->dbox_layout, &dbox_x, &dbox_y, &dbox_w, &dbox_h);
+
+ if (data->gbar_layout) {
+ Evas_Coord gbar_x, gbar_y, gbar_w, gbar_h;
+
+ evas_object_geometry_get(data->gbar_layout, &gbar_x, &gbar_y, &gbar_w, &gbar_h);
+ if (dbox_y + dbox_h + gbar_h > s_info.screen_height) {
+ evas_object_move(data->gbar_layout, 0, dbox_y - gbar_h);
+ evas_object_move(data->stage, 0, dbox_y - gbar_h);
+ } else {
+ evas_object_move(data->gbar_layout, 0, dbox_y + dbox_h);
+ evas_object_move(data->stage, 0, dbox_y);
+ }
+
+ stage_w = gbar_w > dbox_w ? gbar_w : dbox_w;
+ stage_h = dbox_h + gbar_h;
+ } else {
+ stage_w = dbox_w;
+ if (s_info.conf.field.support_gbar) {
+ stage_h = dbox_h + 100; /* Reserve 100 px for effect */
+ } else {
+ stage_h = dbox_h;
+ }
+
+ evas_object_move(data->stage, dbox_x, dbox_y);
+ }
+
+ evas_object_resize(data->stage, stage_w, stage_h);
+}
+
+static void dbox_update_image_object(struct widget_data *data, Evas_Object *dbox_content, int w, int h)
+{
+ Evas_Object *front_image;
+
+ front_image = elm_object_part_content_get(dbox_content, "front,content");
+ if (front_image) {
+ elm_image_file_set(front_image, dynamicbox_filename(data->handle), NULL);
+ } else {
+ ErrPrint("Image object not found\n");
+ }
+}
+
+static void dbox_update_buffer_object(struct widget_data *data, Evas_Object *dbox_content, int w, int h)
+{
+ struct acquire_data acquire_data = {
+ .w = w,
+ .h = h,
+ .content = dbox_content,
+ .data = data,
+ };
+
+ if (data->dbox_fb) {
+ dynamicbox_release_buffer(data->dbox_fb);
+ data->dbox_fb = NULL;
+ }
+
+ data->dbox_fb = dynamicbox_acquire_buffer(data->handle, 0);
+ if (!data->dbox_fb) {
+ ErrPrint("Failed to get fb\n");
+ return;
+ }
+
+ evas_object_image_size_set(dbox_content, w, h);
+
+ if (dynamicbox_acquire_buffer_lock(data->handle, 0) < 0) {
+ ErrPrint("Failed to acquire lock\n");
+ }
+ evas_object_image_data_copy_set(dbox_content, data->dbox_fb);
+ if (dynamicbox_release_buffer_lock(data->handle, 0) < 0) {
+ ErrPrint("Failed to release lock\n");
+ }
+
+ evas_object_image_fill_set(dbox_content, 0, 0, w, h);
+ evas_object_image_pixels_dirty_set(dbox_content, EINA_TRUE);
+ evas_object_image_data_update_add(dbox_content, 0, 0, w, h);
+ update_dbox_geometry(&acquire_data);
+}
+
+static void dbox_update_text_object(struct widget_data *data, Evas_Object *dbox_content, int w, int h)
+{
+ struct acquire_data acquire_data = {
+ .w = w,
+ .h = h,
+ .content = dbox_content,
+ .data = data,
+ };
+
+ update_dbox_geometry(&acquire_data);
+}
+
+static void dynamicbox_event_extra_info_updated(struct widget_data *data)
+{
+ struct dynamicbox_evas_event_info info;
+ const char *content_info;
+ char *tmp;
+
+ if (data->is.field.deleted) {
+ DbgPrint("Box is %s, ignore update\n", data->is.field.deleted ? "deleted" : "faulted");
+ return;
+ }
+
+ content_info = dynamicbox_content(data->handle);
+ if (content_info && data->content) {
+ if (!strcmp(content_info, data->content)) {
+ /* Nothing chnaged */
+ } else {
+ tmp = strdup(content_info);
+ if (!tmp) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return;
+ }
+
+ free(data->content);
+ data->content = tmp;
+ }
+ } else if (content_info) {
+ tmp = strdup(content_info);
+ if (!tmp) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return;
+ }
+ data->content = tmp;
+ } else if (data->content) {
+ free(data->content);
+ data->content = NULL;
+ } else {
+ /* Nothing changed */
+ }
+
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_EXTRA_INFO_UPDATED;
+ info.error = DBOX_STATUS_ERROR_NONE;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_EXTRA_INFO_UPDATED, &info);
+}
+
+/*!
+ * Event handlers
+ */
+static void dynamicbox_event_dbox_updated(struct widget_data *data)
+{
+ Evas_Object *dbox_content;
+ int type;
+ int w, h;
+ struct dynamicbox_evas_event_info info;
+
+ data->is.field.dbox_dirty = 0;
+
+ if (data->is.field.deleted) {
+ DbgPrint("Box is %s, ignore update\n", data->is.field.deleted ? "deleted" : "faulted");
+ return;
+ }
+
+ dbox_content = elm_object_part_content_get(data->dbox_layout, "dynamicbox,content");
+ if (!dbox_content) {
+ ErrPrint("Failed to get content object\n");
+ return;
+ }
+
+ type = dynamicbox_size(data->handle);
+ if (type < 0 || type == DBOX_SIZE_TYPE_UNKNOWN) {
+ ErrPrint("Size is not valid %X\n", type);
+ return;
+ }
+
+ w = data->dbox_width;
+ h = data->dbox_height;
+
+ switch (dynamicbox_type(data->handle, 0)) {
+ case DBOX_CONTENT_TYPE_IMAGE:
+ dbox_update_image_object(data, dbox_content, w, h);
+ break;
+ case DBOX_CONTENT_TYPE_RESOURCE_ID:
+ if (!s_info.conf.field.force_to_buffer) {
+ dbox_update_pixmap_object(data, dbox_content, w, h);
+ break;
+ }
+ case DBOX_CONTENT_TYPE_BUFFER:
+ dbox_update_buffer_object(data, dbox_content, w, h);
+ break;
+ case DBOX_CONTENT_TYPE_TEXT:
+ dbox_update_text_object(data, dbox_content, w, h);
+ break;
+ case DBOX_CONTENT_TYPE_UIFW:
+ break;
+ case DBOX_CONTENT_TYPE_INVALID:
+ default:
+ break;
+ }
+
+ dbox_overlay_disable(data, 0);
+
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_DBOX_UPDATED;
+ info.error = DBOX_STATUS_ERROR_NONE;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_UPDATED, &info);
+}
+
+static void gbar_update_buffer_object(struct widget_data *data, Evas_Object *gbar_content, int w, int h)
+{
+ struct acquire_data acquire_data = {
+ .data = data,
+ .content = gbar_content,
+ .w = w,
+ .h = h,
+ };
+
+ if (data->gbar_fb) {
+ dynamicbox_release_buffer(data->gbar_fb);
+ data->gbar_fb = NULL;
+ } else {
+ // This is first time
+ gbar_overlay_disable(data);
+ }
+
+ data->gbar_fb = dynamicbox_acquire_buffer(data->handle, 1);
+ if (!data->gbar_fb) {
+ ErrPrint("Failed to get fb\n");
+ return;
+ }
+
+ evas_object_image_size_set(gbar_content, w, h);
+
+ if (dynamicbox_acquire_buffer_lock(data->handle, 1) < 0) {
+ ErrPrint("Failed to acquire lock\n");
+ }
+ evas_object_image_data_copy_set(gbar_content, data->gbar_fb);
+ if (dynamicbox_release_buffer_lock(data->handle, 1) < 0) {
+ ErrPrint("Failed to release lock\n");
+ }
+
+ evas_object_image_fill_set(gbar_content, 0, 0, w, h);
+ evas_object_image_pixels_dirty_set(gbar_content, EINA_TRUE);
+ evas_object_image_data_update_add(gbar_content, 0, 0, w, h);
+
+ update_stage_geometry(&acquire_data);
+ update_gbar_geometry(&acquire_data);
+}
+
+static void gbar_update_text_object(struct widget_data *data, Evas_Object *gbar_content, int w, int h)
+{
+ struct acquire_data acquire_data = {
+ .data = data,
+ .content = gbar_content,
+ .w = w,
+ .h = h,
+ };
+
+ ErrPrint("Text type is updated\n");
+ gbar_overlay_disable(data);
+
+ update_stage_geometry(&acquire_data);
+ update_gbar_geometry(&acquire_data);
+}
+
+static void update_gbar_pixmap(Evas_Object *content, int w, int h)
+{
+ evas_object_image_pixels_dirty_set(content, EINA_TRUE);
+ evas_object_image_data_update_add(content, 0, 0, w, h);
+ evas_object_show(content);
+}
+
+static void acquire_gbar_pixmap_cb(struct dynamicbox *handle, int pixmap, void *cbdata)
+{
+ struct acquire_data *acquire_data = cbdata;
+ struct widget_data *data = acquire_data->data;
+ Evas_Native_Surface *old_surface;
+ Evas_Native_Surface surface;
+
+ data->is.field.gbar_pixmap_acquire_requested = 0;
+
+ if (pixmap == 0) {
+ ErrPrint("Failed to acquire pixmap\n");
+ DbgPrint("Unref %p %s\n", data, data->dbox_id);
+ widget_unref(data);
+ free(acquire_data);
+ return;
+ }
+
+ evas_object_image_size_set(acquire_data->content, acquire_data->w, acquire_data->h);
+ evas_object_image_fill_set(acquire_data->content, 0, 0, acquire_data->w, acquire_data->h);
+
+ surface.version = EVAS_NATIVE_SURFACE_VERSION;
+ surface.type = EVAS_NATIVE_SURFACE_X11;
+ surface.data.x11.pixmap = (unsigned int)pixmap;
+
+ old_surface = evas_object_image_native_surface_get(acquire_data->content);
+ if (!old_surface) {
+ gbar_overlay_disable(data);
+ surface.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get());
+ evas_object_image_native_surface_set(acquire_data->content, &surface);
+ } else {
+ unsigned int old_pixmap = 0u;
+ old_pixmap = old_surface->data.x11.pixmap;
+ surface.data.x11.visual = old_surface->data.x11.visual;
+ evas_object_image_native_surface_set(acquire_data->content, &surface);
+
+ if (old_pixmap) {
+ dynamicbox_release_resource_id(data->handle, 1, old_pixmap);
+ }
+ }
+
+ data->gbar_pixmap = (unsigned int)pixmap;
+
+ append_gbar_dirty_object_list(data, DBOX_KEEP_BUFFER);
+ update_stage_geometry(acquire_data);
+ update_gbar_geometry(acquire_data);
+
+ free(acquire_data);
+ DbgPrint("Unref %p %s\n", data, data->dbox_id);
+ widget_unref(data);
+}
+
+static void gbar_update_pixmap_object(struct widget_data *data, Evas_Object *gbar_content, int w, int h)
+{
+ struct acquire_data *acquire_data;
+ int ret;
+
+ if (data->gbar_latest_idx == DBOX_PRIMARY_BUFFER) {
+ if (data->gbar_pixmap == dynamicbox_resource_id(data->handle, 1)) {
+ int ow;
+ int oh;
+
+ effect_size_get(gbar_content, &ow, &oh);
+
+ if (data->gbar_extra) {
+ replace_pixmap(NULL, 1, gbar_content, data->gbar_pixmap);
+ }
+ update_gbar_pixmap(gbar_content, w, h);
+
+ if (ow != w || oh != h) {
+ struct acquire_data adata = {
+ .data = data,
+ .content = gbar_content,
+ .w = w,
+ .h = h,
+ };
+
+ update_stage_geometry(&adata);
+ }
+ return;
+ }
+
+ if (data->is.field.gbar_pixmap_acquire_requested) {
+ return;
+ }
+
+ acquire_data = malloc(sizeof(*acquire_data));
+ if (!acquire_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return;
+ }
+
+ acquire_data->content = gbar_content;
+ acquire_data->w = w;
+ acquire_data->h = h;
+ acquire_data->data = widget_ref(data);
+
+ ret = dynamicbox_acquire_resource_id(data->handle, 1, acquire_gbar_pixmap_cb, acquire_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ ErrPrint("Failed to acquire gbar resource id\n");
+ free(acquire_data);
+ DbgPrint("Unref %p %s\n", data, data->dbox_id);
+ widget_unref(data);
+ } else {
+ data->is.field.gbar_pixmap_acquire_requested = 1;
+ }
+ } else {
+ int ow;
+ int oh;
+
+ if (!data->gbar_extra) {
+ DbgPrint("Extra GBar is not prepared yet\n");
+ return;
+ }
+
+ effect_size_get(gbar_content, &ow, &oh);
+
+ replace_pixmap(NULL, 1, gbar_content, data->gbar_extra[data->gbar_latest_idx]);
+ update_gbar_pixmap(gbar_content, w, h);
+
+ if (ow != w || oh != h) {
+ struct acquire_data adata = {
+ .data = data,
+ .content = gbar_content,
+ .w = w,
+ .h = h,
+ };
+
+ update_stage_geometry(&adata);
+ }
+ }
+}
+
+static void dynamicbox_event_gbar_updated(struct widget_data *data)
+{
+ Evas_Object *gbar_content;
+ int w, h;
+
+ data->is.field.gbar_dirty = 0;
+
+ if (data->is.field.deleted) {
+ DbgPrint("Box is deleted, ignore update\n");
+ return;
+ }
+
+ gbar_content = elm_object_part_content_get(data->gbar_layout, "gbar,content");
+ if (!gbar_content) {
+ ErrPrint("Failed to get content object\n");
+ return;
+ }
+
+ if (dynamicbox_get_glance_bar_size(data->handle, &w, &h) != DBOX_STATUS_ERROR_NONE) {
+ ErrPrint("Failed to get gbar_size\n");
+ w = 0;
+ h = 0;
+ }
+
+ switch (dynamicbox_type(data->handle, 1)) {
+ case DBOX_CONTENT_TYPE_RESOURCE_ID:
+ if (!s_info.conf.field.force_to_buffer) {
+ gbar_update_pixmap_object(data, gbar_content, w, h);
+ break;
+ }
+ case DBOX_CONTENT_TYPE_BUFFER:
+ gbar_update_buffer_object(data, gbar_content, w, h);
+ break;
+ case DBOX_CONTENT_TYPE_TEXT:
+ gbar_update_text_object(data, gbar_content, w, h);
+ break;
+ case DBOX_CONTENT_TYPE_UIFW:
+ break;
+ case DBOX_CONTENT_TYPE_INVALID:
+ default:
+ ErrPrint("Invalid pd type\n");
+ break;
+ }
+}
+
+static void dynamicbox_event_deleted(struct widget_data *data)
+{
+ struct dynamicbox_evas_event_info info;
+
+ if (data->dbox_fb) {
+ dynamicbox_release_buffer(data->dbox_fb);
+ data->dbox_fb = NULL;
+ }
+
+ if (data->gbar_fb) {
+ dynamicbox_release_buffer(data->gbar_fb);
+ data->gbar_fb = NULL;
+ }
+
+ if (data->dbox_pixmap) {
+ replace_dbox_pixmap_with_image(data);
+ }
+
+ if (data->gbar_pixmap) {
+ replace_gbar_pixmap_with_image(data);
+ }
+
+ DbgPrint("Dynamicbox is deleted: %p (emit signal)\n", data);
+ data->is.field.send_delete = 0;
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_DELETED;
+ info.error = data->is.field.faulted ? DBOX_STATUS_ERROR_FAULT : DBOX_STATUS_ERROR_NONE;
+
+ /**
+ * Even if the dynamicbox object tries to be deleted from DBOX_DELETED event callback,
+ * widget data should not be released while processing RAW_DELETE event handling
+ */
+ widget_ref(data);
+
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_DBOX_DELETED, &info);
+ DbgPrint("Invoke raw delete %s\n", data->dbox_id);
+ invoke_raw_event_callback(DYNAMICBOX_EVAS_RAW_DELETE, data->dbox_id, data->dynamicbox, info.error);
+
+ remove_dbox_dirty_object_list(data);
+ remove_gbar_dirty_object_list(data); /* For the safety */
+
+ data->handle = NULL;
+
+ /**
+ * All event handler is handled correctly,
+ * Then decrease the refcnt of it.
+ */
+ widget_unref(data);
+}
+
+static void dynamicbox_event_request_close_gbar(struct widget_data *data)
+{
+ int ret;
+
+ ret = dynamicbox_destroy_glance_bar(data->handle, dbox_destroy_gbar_cb, widget_ref(data));
+ if (ret < 0) {
+ ErrPrint("Failed to close a GBAR: %x\n", ret);
+ DbgPrint("Unref %p %s\n", data, data->dbox_id);
+ widget_unref(data);
+ }
+}
+
+static void dynamicbox_event_group_changed(struct widget_data *data)
+{
+ DbgPrint("Group is changed\n");
+}
+
+static void dynamicbox_event_pinup_changed(struct widget_data *data)
+{
+ DbgPrint("Pinup is changed\n");
+}
+
+static void dynamicbox_event_period_changed(struct widget_data *data)
+{
+ struct dynamicbox_evas_event_info info;
+
+ data->period = dynamicbox_period(data->handle);
+ DbgPrint("Update period is changed to (%lf)\n", data->period);
+
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_PERIOD_CHANGED;
+ info.error = DBOX_STATUS_ERROR_NONE;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_PERIOD_CHANGED, &info);
+}
+
+static void dynamicbox_event_dbox_size_changed(struct widget_data *data)
+{
+ DbgPrint("Dynamicbox LB size is changed\n");
+}
+
+static void dynamicbox_event_gbar_size_changed(struct widget_data *data)
+{
+ DbgPrint("Dynamicbox GBAR size is changed\n");
+}
+
+static void dynamicbox_event_gbar_created(struct widget_data *data)
+{
+ DbgPrint("Dynamicbox GBAR is created\n");
+}
+
+static void dynamicbox_event_gbar_destroyed(struct widget_data *data)
+{
+ DbgPrint("Dynamicbox GBAR is destroyed\n");
+ remove_gbar_dirty_object_list(data);
+}
+
+static void dynamicbox_event_hold_scroll(struct widget_data *data)
+{
+ struct dynamicbox_evas_event_info info;
+ DbgPrint("Dynamicbox hold scroll\n");
+
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_HOLD_SCROLL;
+ info.error = DBOX_STATUS_ERROR_NONE;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_CONTROL_SCROLLER, &info);
+}
+
+static void dynamicbox_event_release_scroll(struct widget_data *data)
+{
+ struct dynamicbox_evas_event_info info;
+ DbgPrint("Dynamicbox release scroll\n");
+
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_EVENT_RELEASE_SCROLL;
+ info.error = DBOX_STATUS_ERROR_NONE;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_CONTROL_SCROLLER, &info);
+}
+
+static void dynamicbox_event_dbox_update_begin(struct widget_data *data)
+{
+ DbgPrint("DBOX Update Begin\n");
+}
+
+static void dynamicbox_event_dbox_update_end(struct widget_data *data)
+{
+ DbgPrint("DBOX Update End\n");
+}
+
+static void dynamicbox_event_gbar_update_begin(struct widget_data *data)
+{
+ DbgPrint("GBAR Update Begin\n");
+}
+
+static void dynamicbox_event_gbar_update_end(struct widget_data *data)
+{
+ DbgPrint("GBAR Update End\n");
+}
+
+static void dynamicbox_event_update_mode_changed(struct widget_data *data)
+{
+ DbgPrint("Update mode changed\n");
+}
+
+static void dynamicbox_event_ignored(struct widget_data *data)
+{
+ DbgPrint("Request is ignored\n");
+}
+
+static int dynamicbox_event_handler(struct dynamicbox *handle, enum dynamicbox_event_type event, void *cbdata)
+{
+ Evas_Object *dynamicbox;
+ struct widget_data *data;
+ int idx;
+ unsigned int resource_id;
+ int status;
+
+ dynamicbox = dynamicbox_data(handle);
+ if (!dynamicbox) {
+ ErrPrint("dynamicbox object is not exists\n");
+ return 0;
+ }
+
+ data = get_smart_data(dynamicbox);
+ if (!data || data->is.field.deleted) {
+ ErrPrint("Failed to get smart data\n");
+ dynamicbox_set_data(handle, NULL);
+ if (event == DBOX_EVENT_CREATED) {
+ DbgPrint("System created dynamicbox is not supported\n");
+ (void)dynamicbox_del(handle, DBOX_DELETE_PERMANENTLY, NULL, NULL);
+ }
+ return 0;
+ }
+
+ switch (event) {
+ case DBOX_EVENT_DBOX_EXTRA_BUFFER_CREATED:
+ dynamicbox_get_affected_extra_buffer(handle, 0, &idx, &resource_id);
+ DbgPrint("Extra buffer created for DBOX: %d (%u)\n", idx, resource_id);
+
+ status = dynamicbox_acquire_extra_resource_id(handle, 0, idx, acquire_dbox_extra_resource_cb, data);
+ if (status < 0) {
+ ErrPrint("Failed to acquire resource: %u (0x%X)\n", resource_id, status);
+ break;
+ }
+
+ if (!data->dbox_extra) {
+ data->dbox_extra = calloc(dynamicbox_option(DBOX_OPTION_EXTRA_BUFFER_CNT), sizeof(*data->dbox_extra));
+ if (!data->dbox_extra) {
+ ErrPrint("calloc: %s\n", strerror(errno));
+ }
+ }
+
+ data->dbox_extra[idx] = resource_id;
+ data->dbox_extra_cnt++;
+ break;
+ case DBOX_EVENT_DBOX_EXTRA_BUFFER_DESTROYED:
+ dynamicbox_get_affected_extra_buffer(handle, 0, &idx, &resource_id);
+ DbgPrint("Extra buffer destroyed for DBOX: %d (%u)\n", idx, resource_id);
+ if (data->dbox_extra[idx] != resource_id) {
+ DbgPrint("Resource Id mismatched\n");
+ if (data->dbox_extra[idx] == 0u) {
+ DbgPrint("Not acquired resourced\n");
+ break;
+ }
+ }
+
+ data->dbox_extra[idx] = 0u;
+ data->dbox_extra_cnt--;
+ if (!data->dbox_extra_cnt) {
+ DbgPrint("Release dbox array\n");
+ free(data->dbox_extra);
+ data->dbox_extra = NULL;
+ }
+
+ if (dynamicbox_release_resource_id(handle, 0, resource_id) < 0) {
+ ErrPrint("Failed to release resource: %u\n", resource_id);
+ }
+ break;
+ case DBOX_EVENT_GBAR_EXTRA_BUFFER_CREATED:
+ dynamicbox_get_affected_extra_buffer(handle, 1, &idx, &resource_id);
+ DbgPrint("Extra buffer destroyed for GBAR: %d (%u)\n", idx, resource_id);
+ if (!data->gbar_extra) {
+ data->gbar_extra = calloc(dynamicbox_option(DBOX_OPTION_EXTRA_BUFFER_CNT), sizeof(*data->gbar_extra));
+ if (!data->gbar_extra) {
+ ErrPrint("calloc: %s\n", strerror(errno));
+ break;
+ }
+ }
+
+ data->gbar_extra[idx] = resource_id;
+ data->gbar_extra_cnt++;
+
+ if (dynamicbox_acquire_extra_resource_id(handle, 1, idx, acquire_gbar_extra_resource_cb, data) < 0) {
+ ErrPrint("Failed to acquire resource: %u\n", resource_id);
+ }
+ break;
+ case DBOX_EVENT_GBAR_EXTRA_BUFFER_DESTROYED:
+ dynamicbox_get_affected_extra_buffer(handle, 1, &idx, &resource_id);
+ DbgPrint("Extra buffer destroyed for GBAR: %d (%u)\n", idx, resource_id);
+ if (data->gbar_extra[idx] != resource_id) {
+ DbgPrint("Resource Id mismatched\n");
+ }
+ data->gbar_extra[idx] = 0u;
+ data->gbar_extra_cnt--;
+ if (!data->gbar_extra_cnt) {
+ DbgPrint("Release gbar array\n");
+ free(data->gbar_extra);
+ data->gbar_extra = NULL;
+ }
+
+ if (dynamicbox_release_resource_id(handle, 1, resource_id) < 0) {
+ ErrPrint("Failed to release resource: %u\n", resource_id);
+ }
+ break;
+ case DBOX_EVENT_DBOX_EXTRA_UPDATED:
+ dynamicbox_get_affected_extra_buffer(handle, 0, &idx, &resource_id);
+ if (!data->dbox_extra) {
+ ErrPrint("Extra buffer is not prepared yet\n");
+ } else {
+ if (data->dbox_extra[idx] != resource_id) {
+ ErrPrint("Resource ID mismatched\n");
+ }
+ append_dbox_dirty_object_list(data, idx);
+ }
+ break;
+ case DBOX_EVENT_GBAR_EXTRA_UPDATED:
+ dynamicbox_get_affected_extra_buffer(handle, 1, &idx, &resource_id);
+ if (!data->gbar_extra) {
+ ErrPrint("Extra buffer is not prepared yet\n");
+ } else {
+ if (data->gbar_extra[idx] != resource_id) {
+ ErrPrint("Resource ID mismatched\n");
+ }
+ append_gbar_dirty_object_list(data, idx);
+ }
+ break;
+ case DBOX_EVENT_DBOX_UPDATED:
+ append_dbox_dirty_object_list(data, DBOX_PRIMARY_BUFFER);
+ break;
+ case DBOX_EVENT_GBAR_UPDATED:
+ append_gbar_dirty_object_list(data, DBOX_PRIMARY_BUFFER);
+ break;
+ case DBOX_EVENT_EXTRA_INFO_UPDATED:
+ dynamicbox_event_extra_info_updated(data);
+ break;
+
+ case DBOX_EVENT_DELETED:
+ dynamicbox_event_deleted(data);
+ break;
+
+ case DBOX_EVENT_GROUP_CHANGED:
+ dynamicbox_event_group_changed(data);
+ break;
+ case DBOX_EVENT_PINUP_CHANGED:
+ dynamicbox_event_pinup_changed(data);
+ break;
+ case DBOX_EVENT_PERIOD_CHANGED:
+ dynamicbox_event_period_changed(data);
+ break;
+
+ case DBOX_EVENT_DBOX_SIZE_CHANGED:
+ dynamicbox_event_dbox_size_changed(data);
+ break;
+ case DBOX_EVENT_GBAR_SIZE_CHANGED:
+ dynamicbox_event_gbar_size_changed(data);
+ break;
+
+ case DBOX_EVENT_GBAR_CREATED:
+ dynamicbox_event_gbar_created(data);
+ break;
+ case DBOX_EVENT_GBAR_DESTROYED:
+ dynamicbox_event_gbar_destroyed(data);
+ break;
+
+ case DBOX_EVENT_HOLD_SCROLL:
+ dynamicbox_event_hold_scroll(data);
+ break;
+ case DBOX_EVENT_RELEASE_SCROLL:
+ dynamicbox_event_release_scroll(data);
+ break;
+
+ case DBOX_EVENT_DBOX_UPDATE_BEGIN:
+ dynamicbox_event_dbox_update_begin(data);
+ break;
+ case DBOX_EVENT_DBOX_UPDATE_END:
+ dynamicbox_event_dbox_update_end(data);
+ break;
+
+ case DBOX_EVENT_GBAR_UPDATE_BEGIN:
+ dynamicbox_event_gbar_update_begin(data);
+ break;
+ case DBOX_EVENT_GBAR_UPDATE_END:
+ dynamicbox_event_gbar_update_end(data);
+ break;
+
+ case DBOX_EVENT_UPDATE_MODE_CHANGED:
+ dynamicbox_event_update_mode_changed(data);
+ break;
+
+ case DBOX_EVENT_REQUEST_CLOSE_GBAR:
+ dynamicbox_event_request_close_gbar(data);
+ break;
+
+ case DBOX_EVENT_IGNORED:
+ dynamicbox_event_ignored(data);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int dynamicbox_fault_handler(enum dynamicbox_fault_type fault, const char *pkgname, const char *filename, const char *funcname, void *cbdata)
+{
+ Eina_List *l = NULL;
+ Evas_Object *dynamicbox;
+ struct widget_data *data;
+ struct dynamicbox_evas_event_info info;
+
+ switch (fault) {
+ case DBOX_FAULT_DEACTIVATED:
+ EINA_LIST_FOREACH(s_info.list, l, dynamicbox) {
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ continue;
+ }
+
+ if (!strcmp(data->dbox_id, pkgname)) {
+ DbgPrint("Faulted: %s (%p)\n", pkgname, data);
+ data->is.field.faulted = 1;
+ dbox_overlay_faulted(data);
+ info.error = DBOX_STATUS_ERROR_FAULT;
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_FAULT_DEACTIVATED;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_DBOX_FAULTED, &info);
+ }
+ }
+ break;
+ case DBOX_FAULT_PROVIDER_DISCONNECTED:
+ EINA_LIST_FOREACH(s_info.list, l, dynamicbox) {
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ continue;
+ }
+
+ if (!strcmp(data->dbox_id, pkgname)) {
+ DbgPrint("Disconnected: %s (%p)\n", pkgname, data);
+ data->is.field.faulted = 1;
+ dbox_overlay_faulted(data);
+ info.error = DBOX_STATUS_ERROR_FAULT;
+ info.pkgname = data->dbox_id;
+ info.event = DBOX_FAULT_PROVIDER_DISCONNECTED;
+ smart_callback_call(data, DYNAMICBOX_SMART_SIGNAL_PROVIDER_DISCONNECTED, &info);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+EAPI int evas_object_dynamicbox_init(Evas_Object *win, int force_to_buffer)
+{
+ int ret;
+
+ ecore_x_window_size_get(0, &s_info.screen_width, &s_info.screen_height);
+
+ s_info.conf.field.render_animator = 0; // By default, use render animator for updating
+
+ ret = dynamicbox_init(ecore_x_display_get(), 1, 0.001f, 1);
+ if (ret < 0) {
+ return ret;
+ }
+
+ ret = dynamicbox_add_event_handler(dynamicbox_event_handler, NULL);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ ErrPrint("Failed to set handler\n");
+ dynamicbox_fini();
+ } else {
+ DbgPrint("Event handler registered\n");
+ ret = dynamicbox_add_fault_handler(dynamicbox_fault_handler, NULL);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ ErrPrint("Failed to set fault handler\n");
+ dynamicbox_remove_event_handler(dynamicbox_event_handler);
+ dynamicbox_fini();
+ } else {
+ DbgPrint("Fault handler is registered\n");
+ }
+ }
+
+ s_info.conf.field.force_to_buffer = force_to_buffer;
+ s_info.win = win;
+
+ return ret;
+}
+
+EAPI int evas_object_dynamicbox_fini(void)
+{
+ dynamicbox_remove_event_handler(dynamicbox_event_handler);
+ dynamicbox_remove_fault_handler(dynamicbox_fault_handler);
+ dynamicbox_fini();
+ return 0;
+}
+
+EAPI int evas_object_dynamicbox_resumed(void)
+{
+ return dynamicbox_viewer_set_resumed();
+}
+
+EAPI int evas_object_dynamicbox_paused(void)
+{
+ return dynamicbox_viewer_set_paused();
+}
+
+EAPI Evas_Object *evas_object_dynamicbox_add(Evas_Object *parent, const char *dbox_id, const char *content_info, const char *cluster, const char *category, double period)
+{
+ struct widget_data *data;
+ Evas_Object *dynamicbox;
+ char *_dbox_id;
+ char *_content_info;
+ char *_cluster;
+ char *_category;
+
+ if (!parent || !dbox_id) {
+ return NULL;
+ }
+
+ if (!cluster) {
+ cluster = DEFAULT_CLUSTER;
+ }
+
+ if (!category) {
+ category = DEFAULT_CATEGORY;
+ }
+
+ _cluster = strdup(cluster);
+ if (!_cluster) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ _category = strdup(category);
+ if (!_category) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(_cluster);
+ return NULL;
+ }
+
+ _dbox_id = strdup(dbox_id);
+ if (!_dbox_id) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(_category);
+ free(_cluster);
+ return NULL;
+ }
+
+ if (content_info) {
+ _content_info = strdup(content_info);
+ if (!_content_info) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ free(_dbox_id);
+ free(_category);
+ free(_cluster);
+ return NULL;
+ }
+ } else {
+ _content_info = NULL;
+ }
+
+ if (!s_info.smart) {
+ s_info.sc.add = widget_add;
+ s_info.sc.del = widget_del;
+ s_info.sc.move = widget_move;
+ s_info.sc.resize = widget_resize;
+ s_info.sc.show = widget_show;
+ s_info.sc.hide = widget_hide;
+ s_info.sc.color_set = widget_color_set;
+ s_info.sc.clip_set = widget_clip_set;
+ s_info.sc.clip_unset = widget_clip_unset;
+
+ s_info.smart = evas_smart_class_new(&s_info.sc);
+ }
+
+ dynamicbox = evas_object_smart_add(evas_object_evas_get(parent), s_info.smart);
+
+ data = evas_object_smart_data_get(dynamicbox);
+ if (data) {
+ data->parent = parent;
+ data->dbox_id = _dbox_id;
+ data->content = _content_info;
+ data->cluster = _cluster;
+ data->category = _category;
+ data->is.field.mouse_event = 0;
+ data->period = period;
+
+ widget_data_setup(data);
+ } else {
+ ErrPrint("Failed to get smart data\n");
+ free(_dbox_id);
+ free(_content_info);
+ free(_cluster);
+ free(_category);
+ }
+
+ return dynamicbox;
+}
+
+EAPI int evas_object_dynamicbox_view_port_set(Evas_Object *dynamicbox, int x, int y, int w, int h)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ data->view_port.x = x;
+ data->view_port.y = y;
+ data->view_port.w = w;
+ data->view_port.h = h;
+ s_info.conf.field.user_view_port = 1;
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+EAPI int evas_object_dynamicbox_view_port_get(Evas_Object *dynamicbox, int *x, int *y, int *w, int *h)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ if (x) {
+ *x = data->view_port.x;
+ }
+
+ if (y) {
+ *y = data->view_port.y;
+ }
+
+ if (w) {
+ *w = data->view_port.w;
+ }
+
+ if (h) {
+ *h = data->view_port.h;
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+EAPI int evas_object_dynamicbox_conf_set(enum dynamicbox_evas_conf type, int value)
+{
+ switch (type) {
+ case DYNAMICBOX_EVAS_SENSITIVE_MOVE:
+ s_info.conf.field.sensitive_move = value;
+ break;
+ case DYNAMICBOX_EVAS_EVENT_AUTO_FEED:
+ s_info.conf.field.auto_feed = value;
+ break;
+ case DYNAMICBOX_EVAS_EASY_MODE:
+ s_info.conf.field.easy_mode = value;
+ break;
+ case DYNAMICBOX_EVAS_USE_FIXED_SIZE:
+ s_info.conf.field.use_fixed_size = value;
+ break;
+ case DYNAMICBOX_EVAS_MANUAL_PAUSE_RESUME:
+ s_info.conf.field.manual_pause_resume = value;
+ break;
+ case DYNAMICBOX_EVAS_SHARED_CONTENT:
+ (void)dynamicbox_set_option(DBOX_OPTION_SHARED_CONTENT, value);
+ break;
+ case DYNAMICBOX_EVAS_SUPPORT_GBAR:
+ s_info.conf.field.support_gbar = value;
+ break;
+ case DYNAMICBOX_EVAS_SCROLL_X:
+ s_info.conf.field.is_scroll_x = value;
+ break;
+ case DYNAMICBOX_EVAS_SCROLL_Y:
+ s_info.conf.field.is_scroll_y = value;
+ break;
+ case DYNAMICBOX_EVAS_DELAYED_PAUSE_RESUME:
+ s_info.conf.field.delayed_pause_resume = value;
+ break;
+ case DYNAMICBOX_EVAS_AUTO_RENDER_SELECTION:
+ s_info.conf.field.auto_render_selector = value;
+ break;
+ case DYNAMICBOX_EVAS_DIRECT_UPDATE:
+ (void)dynamicbox_set_option(DBOX_OPTION_DIRECT_UPDATE, !!value);
+ break;
+ case DYNAMICBOX_EVAS_USE_RENDER_ANIMATOR:
+ if (s_info.conf.field.auto_render_selector) {
+ DbgPrint("Auto selector enabled, this render_animator option will be changed automatically\n");
+ }
+
+ s_info.conf.field.render_animator = !!value;
+ DbgPrint("Turn %s render animator\n", s_info.conf.field.render_animator ? "on" : "off");
+ break;
+ default:
+ break;
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+EAPI int evas_object_dynamicbox_pause(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || !data->is.field.created || !data->handle) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ return dynamicbox_set_visibility(data->handle, DBOX_HIDE_WITH_PAUSE);
+}
+
+EAPI int evas_object_dynamicbox_resume(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || !data->is.field.created || !data->handle) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ return dynamicbox_set_visibility(data->handle, DBOX_SHOW);
+}
+
+EAPI int evas_object_dynamicbox_destroy_gbar(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+ int ret;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || data->state != WIDGET_DATA_CREATED || !data->is.field.created || !data->handle || !data->is.field.gbar_created) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ ret = dynamicbox_destroy_glance_bar(data->handle, dbox_destroy_gbar_cb, widget_ref(data));
+ if (ret < 0) {
+ widget_unref(data);
+ }
+
+ return ret;
+}
+
+EAPI const char *evas_object_dynamicbox_content(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || !data->is.field.created || !data->handle) {
+ return NULL;
+ }
+
+ return dynamicbox_content(data->handle);
+}
+
+EAPI const char *evas_object_dynamicbox_title(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || !data->is.field.created || !data->handle) {
+ return NULL;
+ }
+
+ return dynamicbox_title(data->handle);
+}
+
+EAPI const char *evas_object_dynamicbox_dbox_id(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || data->state != WIDGET_DATA_CREATED) {
+ return NULL;
+ }
+
+ return data->dbox_id;
+}
+
+EAPI double evas_object_dynamicbox_period(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || !data->is.field.created || !data->handle) {
+ return 0.0f;
+ }
+
+ return data->period;
+}
+
+EAPI void evas_object_dynamicbox_cancel_click(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || !data->is.field.created || !data->handle) {
+ return;
+ }
+
+ if (data->is.field.cancel_click == CANCEL_DISABLED) {
+ data->is.field.cancel_click = CANCEL_USER;
+ }
+}
+
+static void access_ret_cb(struct dynamicbox *handle, int ret, void *data)
+{
+ struct access_ret_cb_data *cb_data = data;
+
+ switch (ret) {
+ case DBOX_ACCESS_STATUS_ERROR:
+ ret = DYNAMICBOX_ACCESS_ERROR;
+ break;
+ case DBOX_ACCESS_STATUS_DONE:
+ ret = DYNAMICBOX_ACCESS_DONE;
+ break;
+ case DBOX_ACCESS_STATUS_FIRST:
+ ret = DYNAMICBOX_ACCESS_FIRST;
+ break;
+ case DBOX_ACCESS_STATUS_LAST:
+ ret = DYNAMICBOX_ACCESS_LAST;
+ break;
+ case DBOX_ACCESS_STATUS_READ:
+ ret = DYNAMICBOX_ACCESS_READ;
+ break;
+ default:
+ ret = DYNAMICBOX_ACCESS_UNKNOWN;
+ break;
+ }
+
+ if (cb_data->ret_cb) {
+ cb_data->ret_cb(cb_data->obj, ret, cb_data->data);
+ }
+
+ free(cb_data);
+}
+
+EAPI int evas_object_dynamicbox_force_mouse_up(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || !data->is.field.created || !data->handle) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ return do_force_mouse_up(data);
+}
+
+EAPI int evas_object_dynamicbox_access_action(Evas_Object *dynamicbox, int type, void *_info, void (*ret_cb)(Evas_Object *obj, int ret, void *data), void *cbdata)
+{
+ struct widget_data *data;
+ Elm_Access_Action_Info *info = _info;
+ int w;
+ int h;
+ struct access_ret_cb_data *cb_data;
+ int ret;
+ struct dynamicbox_access_event_info ainfo;
+
+ data = get_smart_data(dynamicbox);
+ if (!data || !data->is.field.created || !data->handle) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ evas_object_geometry_get(data->dbox_layout, NULL, NULL, &w, &h);
+ ainfo.x = (double)info->x / (double)w;
+ ainfo.y = (double)info->y / (double)h;
+ ainfo.info = 0;
+
+ switch (type) {
+ case ELM_ACCESS_ACTION_HIGHLIGHT: /* highlight an object */
+ DbgPrint("Highlight %dx%d ignored\n", info->x, info->y);
+ break;
+ case ELM_ACCESS_ACTION_READ:
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_HIGHLIGHT;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_HIGHLIGHT, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_UNHIGHLIGHT: /* unhighlight an object */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_UNHIGHLIGHT;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_HIGHLIGHT, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT: /* set highlight to next object */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_HIGHLIGHT_NEXT;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_HIGHLIGHT, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_HIGHLIGHT_PREV: /* set highlight to previous object */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_HIGHLIGHT_NEXT;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_HIGHLIGHT, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_ACTIVATE: /* activate a highlight object */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_NONE; /* meaningless */
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_ACTIVATE, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_SCROLL: /* scroll if one of highlight object parents * is scrollable */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ switch (info->mouse_type) {
+ case 0:
+ ainfo.type = DBOX_ACCESS_TYPE_DOWN;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_SCROLL, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case 1:
+ ainfo.type = DBOX_ACCESS_TYPE_MOVE;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_SCROLL, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case 2:
+ ainfo.type = DBOX_ACCESS_TYPE_UP;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_SCROLL, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ default:
+ ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ free(cb_data);
+ break;
+ }
+ break;
+ case ELM_ACCESS_ACTION_MOUSE: /* give mouse event to highlight object */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+ ainfo.type = DBOX_ACCESS_TYPE_NONE;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_MOUSE, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_UP: /* change value up of highlight object */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+ ainfo.type = DBOX_ACCESS_TYPE_UP;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_ACTION, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_DOWN: /* change value down of highlight object */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_DOWN;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_ACTION, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_VALUE_CHANGE: /* TODO: deprecate this */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_NONE;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_VALUE_CHANGE, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_BACK: /* go back to a previous view ex: pop naviframe item */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_NONE;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_BACK, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_OVER: /* mouse over an object */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_NONE;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_OVER, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_ENABLE: /* enable highlight and read ability */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_ENABLE;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_ENABLE, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ case ELM_ACCESS_ACTION_DISABLE: /* disable highlight and read ability */
+ cb_data = calloc(1, sizeof(*cb_data));
+ if (!cb_data) {
+ ErrPrint("Heap: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cb_data->ret_cb = ret_cb;
+ cb_data->data = cbdata;
+ cb_data->obj = dynamicbox;
+
+ ainfo.type = DBOX_ACCESS_TYPE_DISABLE;
+ ret = dynamicbox_feed_access_event(data->handle, DBOX_ACCESS_ENABLE, &ainfo, access_ret_cb, cb_data);
+ if (ret != DBOX_STATUS_ERROR_NONE) {
+ free(cb_data);
+ }
+ break;
+ default:
+ ret = DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ break;
+ }
+
+ return ret;
+}
+
+EAPI void evas_object_dynamicbox_disable_preview(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ data->is.field.disable_preview = 1;
+}
+
+EAPI void evas_object_dynamicbox_disable_overlay_text(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ data->is.field.disable_text = 1;
+}
+
+EAPI void evas_object_dynamicbox_disable_loading(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ data->is.field.disable_loading = 1;
+}
+
+EAPI void evas_object_dynamicbox_activate(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ if (data->is.field.faulted) {
+ elm_object_signal_emit(data->dbox_layout, "mouse,clicked,1", "overlay,content");
+ } else {
+ DbgPrint("Dynamicbox is not faulted\n");
+ }
+}
+
+EAPI int evas_object_dynamicbox_is_faulted(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return 0;
+ }
+
+ return data->is.field.faulted;
+}
+
+EAPI int evas_object_dynamicbox_set_raw_event_callback(enum dynamicbox_evas_raw_event_type type, void (*cb)(struct dynamicbox_evas_raw_event_info *info, void *data), void *data)
+{
+ struct raw_event_cbdata *cbdata;
+
+ cbdata = calloc(1, sizeof(*cbdata));
+ if (!cbdata) {
+ ErrPrint("calloc: %s\n", strerror(errno));
+ return DBOX_STATUS_ERROR_OUT_OF_MEMORY;
+ }
+
+ cbdata->cb = cb;
+ cbdata->data = data;
+
+ switch (type) {
+ case DYNAMICBOX_EVAS_RAW_DELETE:
+ s_info.raw_event.delete_list = eina_list_append(s_info.raw_event.delete_list, cbdata);
+ break;
+ case DYNAMICBOX_EVAS_RAW_CREATE:
+ s_info.raw_event.create_list = eina_list_append(s_info.raw_event.create_list, cbdata);
+ break;
+ default:
+ free(cbdata);
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+EAPI int evas_object_dynamicbox_unset_raw_event_callback(enum dynamicbox_evas_raw_event_type type, void (*cb)(struct dynamicbox_evas_raw_event_info *info, void *data), void *data)
+{
+ Eina_List *l;
+ Eina_List *n;
+ struct raw_event_cbdata *cbdata;
+
+ switch (type) {
+ case DYNAMICBOX_EVAS_RAW_DELETE:
+ EINA_LIST_FOREACH_SAFE(s_info.raw_event.delete_list, l, n, cbdata) {
+ if (cbdata->cb == cb && cbdata->data == data) {
+ s_info.raw_event.delete_list = eina_list_remove(s_info.raw_event.delete_list, cbdata);
+ break;
+ }
+ }
+ break;
+ case DYNAMICBOX_EVAS_RAW_CREATE:
+ EINA_LIST_FOREACH_SAFE(s_info.raw_event.create_list, l, n, cbdata) {
+ if (cbdata->cb == cb && cbdata->data == data) {
+ s_info.raw_event.create_list = eina_list_remove(s_info.raw_event.create_list, cbdata);
+ break;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+EAPI int evas_object_dynamicbox_freeze_visibility(Evas_Object *dynamicbox, int status)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ data->is.field.freeze_visibility = 1;
+ data->freezed_visibility = status;
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+EAPI int evas_object_dynamicbox_thaw_visibility(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ data->is.field.freeze_visibility = 0;
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+EAPI int evas_object_dynamicbox_visibility_is_freezed(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return 0;
+ }
+
+ return data->is.field.freeze_visibility;
+}
+
+EAPI int evas_object_dynamicbox_dump(Evas_Object *dynamicbox, const char *filename)
+{
+ struct widget_data *data;
+ FILE *fp;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ fp = fopen(filename, "w+");
+ if (fp) {
+ Evas_Object *image;
+ image = elm_object_part_content_get(data->dbox_layout, "dynamicbox,content");
+ if (image) {
+ void *data;
+ Evas_Coord w, h;
+ evas_object_geometry_get(image, NULL, NULL, &w, &h);
+
+ data = evas_object_image_data_get(image, 0);
+ if (data) {
+ fwrite(data, w * h, sizeof(int), fp);
+ }
+ }
+ fclose(fp);
+ }
+
+ return DBOX_STATUS_ERROR_NONE;
+}
+
+int evas_object_dynamicbox_is_dynamicbox(Evas_Object *dynamicbox)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return 0;
+ }
+
+ return 1;
+}
+
+void evas_object_dynamicbox_use_render_animator(int flag)
+{
+}
+
+void evas_object_dynamicbox_set_permanent_delete(Evas_Object *dynamicbox, int flag)
+{
+ struct widget_data *data;
+
+ data = get_smart_data(dynamicbox);
+ if (!data) {
+ ErrPrint("Invalid object\n");
+ return;
+ }
+
+ data->is.field.permanent_delete = !!flag;
+}
+
+/* End of a file */
diff --git a/home/src/edit.c b/home/src/edit.c
new file mode 100755
index 0000000..ed6a332
--- /dev/null
+++ b/home/src/edit.c
@@ -0,0 +1,3828 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <stdbool.h>
+
+#include <dlog.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <unicode/unum.h>
+#include <unicode/ustring.h>
+#include <vconf.h>
+
+#include "util.h"
+#include "add-viewer.h"
+#include "conf.h"
+#include "db.h"
+#include "wms.h"
+#include "page.h"
+#include "page_info.h"
+#include "edit_info.h"
+#include "effect.h"
+#include "key.h"
+#include "layout_info.h"
+#include "layout.h"
+#include "dbox.h"
+#include "dynamicbox_evas.h"
+#include "log.h"
+#include "main.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "edit.h"
+#include "gesture.h"
+#include "index.h"
+#include "noti_broker.h"
+
+#define PRIVATE_DATA_KEY_EDIT_DISABLE_REORDERING "p_e_l"
+#define PRIVATE_DATA_KEY_EDIT_FOCUS_OBJECT "p_fo"
+#define PRIVATE_DATA_KEY_EDIT_UNFOCUSABLE "p_uf"
+#define PRIVATE_DATA_KEY_PAGE_LONGPRESS_TIMER "p_p_lp_t"
+#define PRIVATE_DATA_KEY_PAGE_ANIM_FOR_DEL "p_it_ani_d"
+#define PRIVATE_DATA_KEY_PAGE_ANIM_FOR_MOVING "p_it_ani_mv"
+#define PRIVATE_DATA_KEY_PAGE_PRESSED "p_i_p"
+#define PRIVATE_DATA_KEY_PAGE_DOWN_X "p_i_dx"
+#define PRIVATE_DATA_KEY_PAGE_DOWN_Y "p_i_dy"
+#define PRIVATE_DATA_KEY_PAGE_X_FOR_MOVING "p_i_x_mv"
+#define PRIVATE_DATA_KEY_PAGE_Y_FOR_MOVING "p_i_y_mv"
+#define PRIVATE_DATA_KEY_PAGE_X_FOR_ANIM "p_i_x"
+#define PRIVATE_DATA_KEY_PAGE_Y_FOR_ANIM "p_i_y"
+#define PRIVATE_DATA_KEY_PAGE_W "p_i_w"
+#define PRIVATE_DATA_KEY_PAGE_H "p_i_h"
+#define PRIVATE_DATA_KEY_PAGE_INNER "p_pg_in"
+#define PRIVATE_DATA_KEY_PROXY_BG "p_pr_bg"
+#define PRIVATE_DATA_KEY_SCROLLER_ANIM_FOR_MOVING "p_sc_an_mv"
+#define PRIVATE_DATA_KEY_SCROLLER_PAGE_FOR_MOVING "p_sc_pg_mv"
+#define PRIVATE_DATA_KEY_SCROLLER_RECT_FOR_MOVING "p_sc_r_mv"
+#define PRIVATE_DATA_KEY_SCROLLER_PRESS_PAGE "p_sc_p"
+#define PRIVATE_DATA_KEY_SCROLLER_X "p_sc_x"
+#define PRIVATE_DATA_KEY_EDIT_SYNC_IS_DONE "pdke_s_d"
+#define PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED "pdke_il"
+#define PRIVATE_DATA_KEY_EDIT_ITEM_IS_MOVED "pdke_im"
+#define PRIVATE_DATA_KEY_DIVIDE_FACTOR "pdk_df"
+#define PRIVATE_DATA_KEY_ANIM_FOR_MINIFY "p_a_mi"
+#define PRIVATE_DATA_KEY_ANIM_FOR_ENLARGE "p_a_en"
+#define PRIVATE_DATA_KEY_EDIT_DO_NOT_SUPPORT_ENLARGE_EFFECT "pdk_dnsee"
+
+#define MOVE_THRESHOLD 5
+#define SLIPPED_LENGTH 40
+
+static void _destroy_proxy_bg(Evas_Object *clip_bg);
+static Evas_Object *_create_proxy_bg(Evas_Object *item);
+
+
+
+static char *_access_tab_to_move_cb(void *data, Evas_Object *obj)
+{
+ char *tmp;
+
+ tmp = strdup(_("IDS_COM_BODY_TAP_AND_HOLD_A_WIDGET_TO_MOVE_IT_ABB"));
+ retv_if(!tmp, NULL);
+
+ return tmp;
+}
+
+
+
+static char *_access_plus_button_name_cb(void *data, Evas_Object *obj)
+{
+ char *tmp;
+
+ tmp = strdup(_("IDS_HS_BODY_ADD_WIDGET"));
+ retv_if(!tmp, NULL);
+
+ return tmp;
+}
+
+
+
+/* Caution : Do not create & destroy an item */
+static void _scroller_read_page_list(Evas_Object *scroller, Eina_List *page_info_list)
+{
+ Evas_Object *before_page = NULL;
+ const Eina_List *l, *ln;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!page_info_list);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ before_page = scroller_info->center;
+
+ EINA_LIST_FOREACH_SAFE(page_info_list, l, ln, page_info) {
+ continue_if(!page_info);
+ continue_if(!page_info->page);
+
+ elm_box_unpack(scroller_info->box, page_info->page);
+ elm_box_pack_after(scroller_info->box, page_info->page, before_page);
+ before_page = page_info->page;
+ }
+}
+
+
+
+static Eina_List *_scroller_write_page_list(Evas_Object *edit_scroller)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *tmp = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ page_info_s *dup_page_info = NULL;
+ Eina_List *list = NULL;
+ Eina_List *page_info_list = NULL;
+ const Eina_List *l, *ln;
+
+ retv_if(!edit_scroller, NULL);
+
+ edit_scroller_info = evas_object_data_get(edit_scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!edit_scroller_info, NULL);
+
+ list = elm_box_children_get(edit_scroller_info->box);
+ retv_if(!list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) continue;
+ if (!page_info->id) continue;
+ if (PAGE_DIRECTION_RIGHT != page_info->direction) continue;
+
+ dup_page_info = page_info_dup(page_info);
+ continue_if(!dup_page_info);
+
+ tmp = evas_object_data_get(dup_page_info->page, DATA_KEY_REAL_PAGE);
+ if (tmp) dup_page_info->page = tmp;
+ page_info_list = eina_list_append(page_info_list, dup_page_info);
+ }
+ eina_list_free(list);
+
+ return page_info_list;
+}
+
+
+
+static Evas_Object *_content_set_page_inner(Evas_Object *proxy_page)
+{
+ Evas_Object *page_inner = NULL;
+ page_info_s *page_info = NULL;
+
+ page_inner = evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_INNER);
+ retv_if(!page_inner, NULL);
+
+ elm_object_part_content_set(proxy_page, "inner", page_inner);
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ scroller_unfreeze(page_info->scroller);
+
+ return proxy_page;
+}
+
+
+
+static Evas_Object *_content_unset_page_inner(Evas_Object *proxy_page)
+{
+ Evas_Object *page_inner = NULL;
+ page_info_s *page_info = NULL;
+
+ page_inner = elm_object_part_content_unset(proxy_page, "inner");
+ retv_if(!page_inner, NULL);
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_INNER, page_inner);
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ elm_object_signal_emit(page_inner, "on,zoom", "inner");
+
+ scroller_freeze(page_info->scroller);
+
+ return proxy_page;
+}
+
+
+
+/* This function SHOULD be called related to edit_destroy_layout */
+static void _sync_from_edit_to_normal(void *layout)
+{
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+ Eina_List *page_info_list = NULL;
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+
+ page_info_list = _scroller_write_page_list(edit_info->scroller);
+ if (page_info_list) {
+ db_read_list(page_info_list);
+ _scroller_read_page_list(layout_info->scroller, page_info_list);
+ page_info_list_destroy(page_info_list);
+ } else {
+ db_remove_all_item();
+ }
+
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_EDIT_SYNC_IS_DONE, (void *) 1);
+}
+
+
+
+static void _clicked_noti_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *proxy_page = data;
+ Evas_Object *effect_page = NULL;
+ Evas_Object *page = NULL;
+ Evas_Object *scroller = NULL;
+ Evas_Object *layout = NULL;
+
+ layout_info_s *layout_info = NULL;
+ page_info_s *page_info = NULL;
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ if (evas_object_data_del(page_info->scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED)) return;
+
+ layout = page_info->layout;
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ scroller = layout_info->scroller;
+
+ effect_page = edit_create_enlarge_effect_page(proxy_page);
+ if (effect_page) edit_enlarge_effect_page(effect_page);
+
+ page = evas_object_data_get(proxy_page, DATA_KEY_REAL_PAGE);
+ ret_if(!page);
+ scroller_region_show_center_of(scroller, page, SCROLLER_FREEZE_OFF, NULL, NULL, NULL, NULL);
+}
+
+
+
+static void _clicked_center_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *proxy_page = data;
+ Evas_Object *effect_page = NULL;
+ Evas_Object *page = NULL;
+ Evas_Object *scroller = NULL;
+ Evas_Object *layout = NULL;
+
+ layout_info_s *layout_info = NULL;
+ page_info_s *page_info = NULL;
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ if (evas_object_data_get(page_info->scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED)) return;
+
+ layout = page_info->layout;
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ scroller = layout_info->scroller;
+
+ effect_page = edit_create_enlarge_effect_page(proxy_page);
+ if (effect_page) edit_enlarge_effect_page(effect_page);
+
+ page = evas_object_data_get(proxy_page, DATA_KEY_REAL_PAGE);
+ ret_if(!page);
+ scroller_region_show_center_of(scroller, page, SCROLLER_FREEZE_OFF, NULL, NULL, NULL, NULL);
+}
+
+
+
+static void _clicked_dbox_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *proxy_page = data;
+ Evas_Object *effect_page = NULL;
+ Evas_Object *page = NULL;
+ Evas_Object *scroller = NULL;
+ Evas_Object *layout = NULL;
+
+ layout_info_s *layout_info = NULL;
+ page_info_s *page_info = NULL;
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ if (evas_object_data_get(page_info->scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED)) return;
+
+ layout = page_info->layout;
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ scroller = layout_info->scroller;
+
+ effect_page = edit_create_enlarge_effect_page(proxy_page);
+ if (effect_page) edit_enlarge_effect_page(effect_page);
+
+ page = evas_object_data_get(proxy_page, DATA_KEY_REAL_PAGE);
+ ret_if(!page);
+ scroller_region_show_center_of(scroller, page, SCROLLER_FREEZE_OFF, _sync_from_edit_to_normal, layout, NULL, NULL);
+}
+
+
+
+#define ANIM_RATE 5
+#define ANIM_RATE_SPARE ANIM_RATE - 1
+static Eina_Bool _anim_move_page_to_empty_position(void *data)
+{
+ Evas_Object *proxy_page = data;
+ page_info_s *page_info = NULL;
+ Evas_Object *scroller = NULL;
+ Evas_Object *page_inner = evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_INNER);
+ int cur_x, cur_y, end_x, end_y;
+ int vec_x, vec_y;
+
+ goto_if(!data, ERROR);
+ if(!page_inner) {
+ _D("page_inner was not unset");
+ goto ERROR;
+ }
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ goto_if(!page_info, ERROR);
+ scroller = page_info->scroller;
+
+ evas_object_geometry_get(page_inner, &cur_x, &cur_y, NULL, NULL);
+ end_x = (int)evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_ANIM);
+ end_y = (int)evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_ANIM);
+
+ if (cur_y == end_y && cur_x == end_x) {
+ goto_if (NULL == _content_set_page_inner(proxy_page), ERROR);
+ /* unfreeze the scroller after setting the content */
+ if (scroller) scroller_unfreeze(scroller);
+
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_ANIM);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_ANIM);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_MOVING);
+ edit_change_focus(scroller, proxy_page);
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+ vec_y = (end_y - cur_y)/ANIM_RATE;
+ if (0 == vec_y) {
+ if (end_y - cur_y < 0) vec_y = -1;
+ else if (end_y - cur_y > 0) vec_y = 1;
+ }
+ cur_y += vec_y;
+
+ vec_x = (end_x - cur_x)/ANIM_RATE;
+ if (0 == vec_x) {
+ if (end_x - cur_x < 0) vec_x = -1;
+ else if (end_x - cur_x > 0) vec_x = 1;
+ }
+ cur_x += vec_x;
+
+ evas_object_move(page_inner, cur_x, cur_y);
+
+ return ECORE_CALLBACK_RENEW;
+
+ERROR:
+ if (proxy_page) {
+ if (scroller) scroller_unfreeze(scroller);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_MOVING);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_ANIM);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_ANIM);
+
+ }
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Eina_Bool _longpress_timer_cb(void *data)
+{
+ Evas_Object *proxy_page = NULL;
+ page_info_s *proxy_page_info = NULL;
+ Ecore_Timer *timer;
+
+ proxy_page = data;
+ retv_if(!proxy_page, ECORE_CALLBACK_CANCEL);
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ retv_if(!proxy_page_info, ECORE_CALLBACK_CANCEL);
+
+ timer = evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_LONGPRESS_TIMER);
+ if (timer) ecore_timer_del(timer);
+ else return ECORE_CALLBACK_CANCEL;
+
+ evas_object_data_set(proxy_page_info->scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED, (void *) 1);
+
+ if (evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_EDIT_DISABLE_REORDERING)) {
+ _D("long-press is not supported on this page");
+ scroller_freeze(proxy_page_info->scroller);
+ util_create_toast_popup(proxy_page_info->scroller, _("IDS_HS_TPOP_CANNOT_REORDER_NOTIFICATION_BOARD_ITEMS"));
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ _D("longpress start for proxy_page(%p)", proxy_page);
+
+ page_unfocus(proxy_page);
+ scroller_disable_focus_on_scroll(proxy_page_info->scroller);
+ scroller_disable_index_on_scroll(proxy_page_info->scroller);
+
+ retv_if(!evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_PRESSED), ECORE_CALLBACK_CANCEL);
+ retv_if(!_content_unset_page_inner(proxy_page), ECORE_CALLBACK_CANCEL);
+
+ elm_object_signal_emit(proxy_page_info->layout, "show", "checker");
+ scroller_bring_in_center_of(proxy_page_info->scroller, proxy_page, SCROLLER_FREEZE_ON, NULL, NULL, NULL, NULL);
+ effect_play_vibration();
+
+ return ECORE_CALLBACK_CANCEL;
+
+}
+
+
+
+static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ei = event_info;
+ Evas_Object *proxy_page = data;
+ Evas_Object *page_current = NULL;
+ Evas_Object *page_inner = NULL;
+ Ecore_Timer *timer = NULL;
+ Ecore_Animator *anim = NULL;
+ page_info_s *page_info = NULL;
+
+ int x = ei->output.x;
+ int y = ei->output.y;
+ int inner_x, inner_y, inner_w, inner_h;
+ int sx;
+
+ _D("edit : Down (%d, %d)", x, y);
+
+ ret_if(!proxy_page);
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ if (scroller_is_scrolling(page_info->scroller)) return;
+
+ anim = evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_MOVING);
+ if (anim) return;
+
+ page_current = scroller_get_focused_page(page_info->scroller);
+ ret_if(!page_current);
+ if (proxy_page != page_current) return;
+
+ page_inner = elm_object_part_content_get(proxy_page, "inner");
+ if (!page_inner) {
+ page_inner = evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_INNER);
+ ret_if(!page_inner);
+ elm_object_part_content_set(proxy_page, "inner", page_inner);
+ }
+
+ evas_object_data_set(page_info->scroller, PRIVATE_DATA_KEY_SCROLLER_PRESS_PAGE, proxy_page);
+ evas_object_data_set(page_info->scroller, DATA_KEY_EVENT_UPPER_PAGE, proxy_page);
+
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_PRESSED, (void *) 1);
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_DOWN_X, (void *) x);
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_DOWN_Y, (void *) y);
+
+ evas_object_geometry_get(page_inner, &inner_x, &inner_y, &inner_w, &inner_h);
+
+ /* this data key is used the destination in animation of item's set.
+ If the destination of animation can be changed, you set the changed value in _up_cb or other function */
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_ANIM, (void *) inner_x);
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_ANIM, (void *) inner_y);
+
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_MOVING, (void *) inner_x);
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_MOVING, (void *) inner_y);
+
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_W, (void *) inner_w);
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_H, (void *) inner_h);
+
+ elm_scroller_region_get(page_info->scroller, &sx, NULL, NULL, NULL);
+ sx += inner_x;
+ evas_object_data_set(page_info->scroller, PRIVATE_DATA_KEY_SCROLLER_X, (void *) sx);
+ evas_object_data_del(page_info->scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED);
+
+ timer = ecore_timer_add(LONGPRESS_TIME, _longpress_timer_cb, proxy_page);
+ if (timer) evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_LONGPRESS_TIMER, timer);
+ else _E("Cannot add a timer");
+}
+
+
+
+static void _call_object(Evas_Object *proxy_page, int cur_x, int cur_y)
+{
+ Evas_Object *parent = NULL;
+ Evas_Object *tmp = NULL;
+ Eina_List *obj_list = NULL;
+ page_info_s *page_info = NULL;
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->scroller);
+
+ obj_list = evas_tree_objects_at_xy_get(main_get_info()->e, NULL, cur_x, cur_y);
+ ret_if(!obj_list);
+
+ EINA_LIST_FREE(obj_list, tmp) {
+ parent = tmp;
+ while (parent) {
+ if (evas_object_data_get(parent, DATA_KEY_EVENT_UPPER_IS_ON)) {
+ Evas_Object *old_obj = evas_object_data_get(page_info->scroller, DATA_KEY_EVENT_UPPER_PAGE);
+ if (old_obj != parent) {
+ _D("Call upper_end(%p) & upper_start(%p)", old_obj, parent);
+ evas_object_smart_callback_call(old_obj, "upper_end", NULL);
+ evas_object_smart_callback_call(parent, "upper_start", NULL);
+ evas_object_data_set(page_info->scroller, DATA_KEY_EVENT_UPPER_PAGE, parent);
+ } else {
+ evas_object_smart_callback_call(parent, "upper", proxy_page);
+ }
+
+ eina_list_free(obj_list);
+ return;
+ }
+
+ parent = evas_object_smart_parent_get(parent);
+ if (parent == page_info->scroller) {
+ evas_object_data_set(page_info->scroller, DATA_KEY_EVENT_UPPER_PAGE, parent);
+ break;
+ }
+ }
+ }
+}
+
+
+
+static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ei = event_info;
+ Evas_Object *proxy_page = data;
+ Evas_Object *page_inner = NULL;
+ Ecore_Timer *timer = NULL;
+ page_info_s *page_info = NULL;
+ Ecore_Animator *anim = NULL;
+
+ int down_x, down_y, inner_x, inner_y;
+ int cur_x, cur_y, vec_x, vec_y;
+
+ ret_if(!proxy_page);
+ if (!evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_PRESSED)) {
+ return;
+ }
+
+ anim = evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_MOVING);
+ if (anim) return;
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ cur_x = ei->cur.output.x;
+ cur_y = ei->cur.output.y;
+
+ down_x = (int) evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_DOWN_X);
+ down_y = (int) evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_DOWN_Y);
+
+ inner_x = (int) evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_MOVING);
+ inner_y = (int) evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_MOVING);
+
+ vec_x = cur_x - down_x;
+ vec_y = cur_y - down_y;
+
+ inner_x += vec_x;
+ inner_y += vec_y;
+
+ timer = evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_LONGPRESS_TIMER);
+ if (timer && (abs(vec_x) >= LONGPRESS_THRESHOLD || abs(vec_y) >= LONGPRESS_THRESHOLD)) {
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_LONGPRESS_TIMER);
+ ecore_timer_del(timer);
+ return;
+ }
+
+ page_inner = evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_INNER);
+ if (!page_inner) return;
+
+ evas_object_move(page_inner, inner_x, inner_y);
+
+ _call_object(proxy_page, cur_x, cur_y);
+}
+
+
+
+static void _up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *proxy_page = data;
+ Evas_Object *old_obj;
+ Evas_Object *page_current;
+ Evas_Event_Mouse_Up *ei = event_info;
+ Ecore_Timer *timer = NULL;
+ page_info_s *page_info = NULL;
+ Ecore_Animator *anim = NULL;
+
+ int x = ei->output.x;
+ int y = ei->output.y;
+
+ _D("edit : Up (%p) (%d, %d)", obj, x, y);
+
+ ret_if(!proxy_page);
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ page_current = scroller_get_focused_page(page_info->scroller);
+ ret_if(!page_current);
+ if (page_current != proxy_page) return;
+
+ scroller_enable_focus_on_scroll(page_info->scroller);
+ scroller_enable_index_on_scroll(page_info->scroller);
+
+ if (evas_object_data_del(page_info->scroller, PRIVATE_DATA_KEY_EDIT_ITEM_IS_MOVED)
+ && main_get_info()->is_tts)
+ {
+ elm_access_say(_("IDS_TTS_BODY_ITEM_MOVED"));
+ }
+
+ elm_object_signal_emit(page_info->layout, "hide", "checker");
+
+ evas_object_data_del(page_info->scroller, PRIVATE_DATA_KEY_SCROLLER_PRESS_PAGE);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_PRESSED);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_DOWN_X);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_DOWN_Y);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_MOVING);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_MOVING);
+
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_W);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_H);
+ old_obj = evas_object_data_del(page_info->scroller, DATA_KEY_EVENT_UPPER_PAGE);
+ if (old_obj) {
+ _D("Call upper_end & upper_start");
+ evas_object_smart_callback_call(old_obj, "upper_end", NULL);
+ }
+
+ timer = evas_object_data_del(page_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ timer = evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_LONGPRESS_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ timer = NULL;
+ return;
+ }
+
+ anim = evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_MOVING);
+ if (anim) {
+ ecore_animator_del(anim);
+ anim = NULL;
+ }
+
+ if (evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_EDIT_DISABLE_REORDERING)) {
+ _D("long-press is not supported on this page");
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_ANIM);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_ANIM);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_MOVING);
+ scroller_unfreeze(page_info->scroller);
+ edit_change_focus(page_info->scroller, page_current);
+ return;
+ }
+
+ anim = ecore_animator_add(_anim_move_page_to_empty_position, proxy_page);
+ ret_if(NULL == anim);
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_MOVING, anim);
+ if (evas_object_data_get(page_info->scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED)) {
+ elm_object_signal_emit(page_info->page_inner, "reset,zoom", "inner");
+ }
+}
+
+
+
+static key_cb_ret_e _add_viewer_back_key_cb(void *data)
+{
+ _W("");
+ Evas_Object *layout = data;
+
+ retv_if(!layout, KEY_CB_RET_CONTINUE);
+ edit_destroy_add_viewer(layout);
+
+ return KEY_CB_RET_STOP;
+}
+
+
+
+#if 0 /* We use this when back key isn't used anymore*/
+static Eina_Bool _delay_destroy_add_viewer_cb(void *data)
+{
+ Evas_Object *layout = data;
+
+ edit_destroy_add_viewer(layout);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Eina_Bool _delay_destroy_edit_cb(void *data)
+{
+ Evas_Object *layout = data;
+
+ edit_destroy_layout(layout);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static void _add_viewer_bezel_down_cb(void *data)
+{
+ Evas_Object *layout = data;
+ Ecore_Timer *timer = NULL;
+
+ ret_if(!layout);
+
+ timer = evas_object_data_del(layout, PRIVATE_DATA_KEY_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ }
+ timer = ecore_timer_add(0.1f, _delay_destroy_add_viewer_cb, layout);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_TIMER, timer);
+}
+
+
+
+static void _edit_bezel_down_cb(void *data)
+{
+ Evas_Object *layout = data;
+ Ecore_Timer *timer = NULL;
+
+ ret_if(!layout);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ if (!layout_info->edit) {
+ _D("Layout is not edited");
+ return;
+ }
+ timer = evas_object_data_del(layout, PRIVATE_DATA_KEY_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ }
+ timer = ecore_timer_add(0.1f, _delay_destroy_layout_cb, layout);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_TIMER, timer);
+}
+#endif
+
+
+
+static key_cb_ret_e _add_viewer_home_key_cb(void *data)
+{
+ Evas_Object *layout = data;
+ layout_info_s *layout_info = NULL;
+
+ retv_if(!layout, KEY_CB_RET_CONTINUE);
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, KEY_CB_RET_CONTINUE);
+
+ edit_destroy_add_viewer(layout);
+ if (layout_info->edit) edit_destroy_layout(layout);
+
+ return KEY_CB_RET_STOP;
+}
+
+
+
+static char *_access_remove_button_name_cb(void *data, Evas_Object *obj)
+{
+ char *tmp;
+
+ tmp = strdup(_("IDS_COM_BUTTON_REMOVE_ABB"));
+ retv_if(!tmp, NULL);
+ return tmp;
+}
+
+
+
+#define PROXY_ITEM_EDJ EDJEDIR"/edit.edj"
+#define PROXY_ITEM_GROUP "proxy_item"
+Evas_Object *_create_proxy_item(Evas_Object *edit_scroller, Evas_Object *real_page)
+{
+ Evas_Object *proxy_item = NULL;
+ Evas_Object *proxy_image = NULL;
+ page_info_s *page_info = NULL;
+ Eina_Bool ret;
+
+ retv_if(!edit_scroller, NULL);
+ retv_if(!real_page, NULL);
+
+ page_info = evas_object_data_get(real_page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ /* Proxy Item */
+ proxy_item = elm_layout_add(edit_scroller);
+ retv_if(!proxy_item, NULL);
+
+ ret = elm_layout_file_set(proxy_item, PROXY_ITEM_EDJ, PROXY_ITEM_GROUP);
+ if (EINA_FALSE == ret) {
+ _E("cannot set the file into the layout");
+ evas_object_del(proxy_item);
+ return NULL;
+ }
+ evas_object_repeat_events_set(proxy_item, EINA_TRUE);
+
+ /* Proxy Image */
+ proxy_image = evas_object_image_filled_add(main_get_info()->e);
+ if (!proxy_item) {
+ _E("Cannot add an image");
+ evas_object_del(proxy_image);
+ return NULL;
+ }
+
+ ret = evas_object_image_source_set(proxy_image, page_info->item);
+ if(EINA_FALSE == ret) _E("Cannot set the source into the proxy image");
+
+ evas_object_image_source_visible_set(proxy_image, EINA_FALSE);
+ evas_object_image_source_clip_set(proxy_image, EINA_FALSE);
+
+ elm_object_part_content_set(proxy_item, "proxy_item", proxy_image);
+
+ evas_object_repeat_events_set(proxy_image, EINA_TRUE);
+ evas_object_size_hint_weight_set(proxy_image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(proxy_image, ITEM_EDIT_WIDTH, ITEM_EDIT_HEIGHT);
+ evas_object_resize(proxy_image, ITEM_EDIT_WIDTH, ITEM_EDIT_HEIGHT);
+ evas_object_show(proxy_image);
+
+ _D("Create a proxy item(%p)", proxy_item);
+
+ return proxy_item;
+}
+
+
+
+static void _destroy_proxy_item(Evas_Object *proxy_item)
+{
+ Evas_Object *proxy_image = NULL;
+
+ ret_if(!proxy_item);
+
+ proxy_image = elm_object_part_content_unset(proxy_item, "proxy_item");
+ if (proxy_image) {
+ evas_object_image_source_visible_set(proxy_image, EINA_TRUE);
+ evas_object_del(proxy_image);
+ }
+
+ _D("Destroy a proxy item(%p)", proxy_item);
+
+ evas_object_del(proxy_item);
+}
+
+
+
+HAPI void edit_change_focus(Evas_Object *edit_scroller, Evas_Object *page_current)
+{
+ Evas_Object *page_focused = NULL;
+ page_info_s *page_info = NULL;
+ page_info_s *focused_page_info = NULL;
+ int unfocusable = 0;
+
+ ret_if(!edit_scroller);
+ if(!page_current) {
+ evas_object_data_set(edit_scroller, PRIVATE_DATA_KEY_EDIT_FOCUS_OBJECT, NULL);
+ return;
+ }
+
+ page_focused = evas_object_data_get(edit_scroller, PRIVATE_DATA_KEY_EDIT_FOCUS_OBJECT);
+ if (page_focused == page_current) return;
+
+ page_info = evas_object_data_get(page_current, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->page_inner);
+ ret_if(!page_info->item);
+
+ /* Blocker has to be disabled even if this is unfocusable */
+ elm_object_signal_emit(page_info->page_inner, "disable", "blocker");
+
+ evas_object_data_set(edit_scroller, PRIVATE_DATA_KEY_EDIT_FOCUS_OBJECT, page_current);
+
+ if(page_focused) {
+ focused_page_info = evas_object_data_get(page_focused, DATA_KEY_PAGE_INFO);
+ if (!focused_page_info) goto OUT;
+ if (!focused_page_info->page_inner) goto OUT;
+ if (!focused_page_info->item) goto OUT;
+
+ unfocusable = (int) evas_object_data_get(page_focused, PRIVATE_DATA_KEY_EDIT_UNFOCUSABLE);
+ if (!unfocusable) {
+ elm_object_signal_emit(focused_page_info->page_inner, "deselect", "cover");
+ elm_object_signal_emit(focused_page_info->page_inner, "deselect", "line");
+ elm_object_signal_emit(focused_page_info->page_inner, "hide", "del");
+ }
+ elm_object_signal_emit(focused_page_info->page_inner, "enable", "blocker");
+ }
+
+OUT:
+ /* Unfocusable page */
+ unfocusable = (int) evas_object_data_get(page_current, PRIVATE_DATA_KEY_EDIT_UNFOCUSABLE);
+ if (unfocusable) return;
+
+ /* Focusable page */
+ elm_object_signal_emit(page_info->page_inner, "select", "cover");
+ elm_object_signal_emit(page_info->page_inner, "select", "line");
+ if (page_info->removable) {
+ elm_object_signal_emit(page_info->page_inner, "show", "del");
+ }
+}
+
+
+
+static void _remove_dbox(Evas_Object *page)
+{
+ Evas_Object *proxy_page = NULL;
+ Evas_Object *page_current = NULL;
+ Evas_Object *focused_page = NULL;
+
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ layout_info = evas_object_data_get(page_info->layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+
+ edit_scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!edit_scroller_info);
+
+ /* Proxy DBox */
+ proxy_page = evas_object_data_get(page, DATA_KEY_PROXY_PAGE);
+ ret_if(!proxy_page);
+
+ focused_page = evas_object_data_get(edit_info->scroller, PRIVATE_DATA_KEY_EDIT_FOCUS_OBJECT);
+ if (proxy_page == focused_page) {
+ evas_object_data_set(edit_info->scroller, PRIVATE_DATA_KEY_EDIT_FOCUS_OBJECT, NULL);
+ }
+
+ scroller_pop_page(edit_info->scroller, proxy_page);
+ edit_destroy_proxy_page(proxy_page);
+ edit_arrange_plus_page(layout_info->edit);
+
+ /* Real DBox */
+ scroller_pop_page(layout_info->scroller, page);
+ /**
+ * @note
+ * Delete a box permanently only if a user deletes it.
+ */
+ evas_object_dynamicbox_set_permanent_delete(page_info->item, 1);
+ evas_object_del(page_info->item);
+ page_destroy(page);
+ page_arrange_plus_page(layout_info->scroller, 0);
+
+ page_current = scroller_get_focused_page(edit_info->scroller);
+ ret_if(!page_current);
+
+ scroller_region_show_page(edit_info->scroller, page_current, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+ edit_change_focus(edit_info->scroller, page_current);
+}
+
+
+
+static Eina_Bool _minify_dbox_anim_cb(void *data)
+{
+ Evas_Object *proxy_page = data;
+ int w, h;
+
+ retv_if(!proxy_page, ECORE_CALLBACK_CANCEL);
+
+ evas_object_geometry_get(proxy_page, NULL, NULL, &w, &h);
+
+ w -= SLIPPED_LENGTH;
+ evas_object_size_hint_min_set(proxy_page, w, h);
+
+ if (w <= 0) {
+ Evas_Object *real_page = evas_object_data_get(proxy_page, DATA_KEY_REAL_PAGE);
+
+ /* This has to be executed before _remove_dbox */
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_DEL);
+
+ if (real_page) _remove_dbox(real_page);
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ return ECORE_CALLBACK_RENEW;
+
+}
+
+
+
+static void _del_dbox_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *proxy_page = data;
+ Evas_Object *page_inner = NULL;
+ Ecore_Animator *anim = NULL;
+
+ _D("Del is clicked");
+
+ ret_if(!proxy_page);
+ page_inner = elm_object_part_content_unset(proxy_page, "inner");
+ ret_if(!page_inner);
+
+ evas_object_hide(page_inner);
+
+ anim = evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_DEL);
+ if (anim) return;
+
+ anim = ecore_animator_add(_minify_dbox_anim_cb, proxy_page);
+ if (anim) evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_DEL, anim);
+ else _E("Cannot add an animator");
+
+ elm_access_say(_("IDS_TTS_BODY_ITEM_REMOVED"));
+}
+
+
+
+static Evas_Object *_add_dbox_in_normal(Evas_Object *layout, const char *id, const char *subid)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *item = NULL;
+ Eina_List *page_info_list = NULL;
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!layout, NULL);
+ retv_if(!id, NULL);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ /* Real DBox */
+ item = dbox_create(layout_info->scroller, id, NULL, DYNAMICBOX_EVAS_DEFAULT_PERIOD);
+ retv_if(!item, NULL);
+ evas_object_dynamicbox_resume(item);
+ evas_object_dynamicbox_disable_loading(item);
+ evas_object_resize(item, scroller_info->page_width, scroller_info->page_height);
+ evas_object_size_hint_min_set(item, scroller_info->page_width, scroller_info->page_height);
+ evas_object_show(item);
+
+ page = page_create(layout_info->scroller
+ , item
+ , id, NULL
+ , scroller_info->page_width, scroller_info->page_height
+ , PAGE_CHANGEABLE_BG_ON, PAGE_REMOVABLE_ON);
+ goto_if(!page, ERROR);
+ dbox_add_callback(item, page);
+ page_set_effect(page, page_effect_none, page_effect_none);
+
+ scroller_push_page(layout_info->scroller, page, SCROLLER_PUSH_TYPE_LAST);
+ page_arrange_plus_page(layout_info->scroller, 1);
+
+ page_info_list = scroller_write_list(layout_info->scroller);
+ if (page_info_list) {
+ db_read_list(page_info_list);
+ scroller_read_list(layout_info->scroller, page_info_list);
+ page_info_list_destroy(page_info_list);
+ }
+
+ scroller_region_show_page(layout_info->scroller, page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+
+ return page;
+
+ERROR:
+ dbox_destroy(item);
+ return NULL;
+
+}
+
+
+
+static Evas_Object *add_dbox_in_edit(Evas_Object *layout, const char *id, const char *subid)
+{
+ Evas_Object *proxy_page = NULL;
+ Evas_Object *page = NULL;
+ Evas_Object *page_inner = NULL;
+ Evas_Object *item = NULL;
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ page_info_s *proxy_page_info = NULL;
+ page_info_s *plus_page_info = NULL;
+
+ retv_if(!layout, NULL);
+ retv_if(!id, NULL);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ retv_if(!edit_info, NULL);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ edit_scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!edit_scroller_info, NULL);
+
+ plus_page_info = evas_object_data_get(edit_scroller_info->plus_page, DATA_KEY_PAGE_INFO);
+ retv_if(!plus_page_info, NULL);
+
+ /* Real DBox */
+ item = dbox_create(layout_info->scroller, id, NULL, DYNAMICBOX_EVAS_DEFAULT_PERIOD);
+ goto_if(!item, ERROR);
+ evas_object_dynamicbox_resume(item);
+ evas_object_dynamicbox_disable_loading(item);
+ evas_object_resize(item, scroller_info->page_width, scroller_info->page_height);
+ evas_object_size_hint_min_set(item, scroller_info->page_width, scroller_info->page_height);
+ evas_object_show(item);
+
+ page = page_create(layout_info->scroller
+ , item
+ , id, NULL
+ , scroller_info->page_width, scroller_info->page_height
+ , PAGE_CHANGEABLE_BG_ON, PAGE_REMOVABLE_ON);
+ goto_if(!page, ERROR);
+ dbox_add_callback(item, page);
+ page_set_effect(page, page_effect_none, page_effect_none);
+
+ scroller_push_page_before(layout_info->scroller, page, scroller_info->plus_page);
+ page_arrange_plus_page(layout_info->scroller, 1);
+
+ page_inner = elm_object_part_content_unset(page, "inner");
+ if (page_inner) evas_object_move(page_inner, 0, 0);
+ else _E("Cannot get the page_inner");
+
+ /* Proxy DBox */
+ proxy_page = edit_create_proxy_page(edit_info->scroller, page, PAGE_CHANGEABLE_BG_ON);
+ goto_if(!proxy_page, ERROR);
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ goto_if(!proxy_page_info, ERROR);
+ goto_if(!edit_info->plus_page, ERROR);
+
+ elm_object_signal_emit(proxy_page_info->page_inner, "select", "cover_clipper");
+
+ scroller_push_page_before(edit_info->scroller, proxy_page, edit_info->plus_page);
+ edit_arrange_plus_page(layout_info->edit);
+
+ evas_object_smart_callback_add(proxy_page_info->focus, "clicked", _clicked_dbox_cb, proxy_page);
+ evas_object_smart_callback_add(proxy_page_info->remove_focus, "clicked", _del_dbox_cb, proxy_page);
+
+ /* Update index */
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_RIGHT], layout_info->scroller, INDEX_BRING_IN_NONE);
+ }
+
+ if (edit_scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_update(edit_scroller_info->index[PAGE_DIRECTION_RIGHT], edit_info->scroller, INDEX_BRING_IN_NONE);
+ }
+
+ index_bring_in_page(edit_scroller_info->index[PAGE_DIRECTION_RIGHT], proxy_page);
+ edit_change_focus(edit_info->scroller, proxy_page);
+ scroller_region_show_page(edit_info->scroller, proxy_page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+ elm_object_signal_emit(plus_page_info->page_inner, "deselect", "line");
+ elm_object_signal_emit(plus_page_info->page_inner, "deselect", "cover");
+ elm_object_signal_emit(plus_page_info->page_inner, "enable", "blocker");
+
+ return page;
+
+ERROR:
+ if (page) {
+ _remove_dbox(page);
+ }
+ return NULL;
+}
+
+
+
+static Eina_Bool _fire_timer_cb(void *data)
+{
+ Evas_Object *real_page = data;
+ retv_if(!real_page, ECORE_CALLBACK_CANCEL);
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_EDITING, EVENT_TYPE_NOTI_DELETE, real_page);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static void _remove_noti(Evas_Object *real_page)
+{
+ Evas_Object *edit_scroller = NULL;
+ Evas_Object *proxy_page = NULL;
+ Evas_Object *page_current = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ page_info_s *proxy_page_info = NULL;
+ Ecore_Timer *fire_timer = NULL;
+
+ ret_if(!real_page);
+
+ page_info = evas_object_data_get(real_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ proxy_page = evas_object_data_get(real_page, DATA_KEY_PROXY_PAGE);
+ ret_if(!proxy_page);
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!proxy_page_info);
+
+ edit_scroller = proxy_page_info->scroller;
+ ret_if(!edit_scroller);
+
+ edit_scroller_info = evas_object_data_get(edit_scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!edit_scroller_info);
+
+ /* Proxy */
+ scroller_pop_page(edit_scroller, proxy_page);
+ edit_destroy_proxy_page(proxy_page);
+
+ page_current = scroller_get_focused_page(edit_scroller);
+ if (!page_current) {
+ _D("No focused page");
+ return;
+ }
+
+ edit_change_focus(edit_scroller, page_current);
+
+ /* Noti */
+ fire_timer = ecore_timer_add(0.1f, _fire_timer_cb, real_page);
+ if (!fire_timer) {
+ _E("Cannot add a timer");
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_EDITING, EVENT_TYPE_NOTI_DELETE, real_page);
+ }
+}
+
+
+
+static Eina_Bool _minify_noti_anim_cb(void *data)
+{
+ Evas_Object *proxy_page = data;
+ int w, h;
+
+ retv_if(!proxy_page, ECORE_CALLBACK_CANCEL);
+
+ evas_object_geometry_get(proxy_page, NULL, NULL, &w, &h);
+
+ w -= SLIPPED_LENGTH;
+ evas_object_size_hint_min_set(proxy_page, w, h);
+
+ if (w <= 0) {
+ Evas_Object *real_page = NULL;
+
+ /* This has to be executed before _remove_noti */
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_DEL);
+
+ real_page = evas_object_data_get(proxy_page, DATA_KEY_REAL_PAGE);
+ if (real_page) _remove_noti(real_page);
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+
+
+static void _del_noti_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *proxy_page = data;
+ Evas_Object *page_inner = NULL;
+ Ecore_Animator *anim = NULL;
+
+ _D("Del is clicked");
+
+ ret_if(!proxy_page);
+
+ page_inner = elm_object_part_content_unset(proxy_page, "inner");
+ ret_if(!page_inner);
+ evas_object_hide(page_inner);
+
+ anim = evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_DEL);
+ if (anim) return;
+
+ anim = ecore_animator_add(_minify_noti_anim_cb, proxy_page);
+ if (anim) evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_DEL, anim);
+ else _E("Cannot add an animator");
+}
+
+
+
+#define SLIPPED_LENGTH_BEFORE 15
+static Eina_Bool _anim_move_page_before_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ Evas_Object *page = NULL;
+ Evas_Object *rect = NULL;
+ scroller_info_s *scroller_info = NULL;
+ int w, h;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ page = evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_PAGE_FOR_MOVING);
+ evas_object_geometry_get(page, NULL, NULL, &w, &h);
+
+ w += SLIPPED_LENGTH_BEFORE;
+ evas_object_size_hint_min_set(page, w, h);
+ if (w >= PAGE_EDIT_WIDTH) {
+ evas_object_size_hint_min_set(page, PAGE_EDIT_WIDTH, PAGE_EDIT_HEIGHT);
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_PAGE_FOR_MOVING);
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_ANIM_FOR_MOVING);
+ rect = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_RECT_FOR_MOVING);
+
+ if (rect) {
+ elm_box_unpack(scroller_info->box, rect);
+ evas_object_del(rect);
+ } else _E("Cannot get the rect");
+
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_RIGHT], scroller, INDEX_BRING_IN_NONE);
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_RIGHT], page);
+ }
+ return ECORE_CALLBACK_CANCEL;
+ }
+ return ECORE_CALLBACK_RENEW;
+}
+
+
+
+HAPI w_home_error_e edit_push_page_before(Evas_Object *scroller, Evas_Object *page, Evas_Object *before)
+{
+ Evas_Object *rect = NULL;
+ scroller_info_s *scroller_info = NULL;
+ Ecore_Animator *anim = NULL;
+
+ retv_if(!scroller, W_HOME_ERROR_FAIL);
+ retv_if(!page, W_HOME_ERROR_FAIL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ anim = evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_ANIM_FOR_MOVING);
+ if (anim) return W_HOME_ERROR_FAIL;
+
+ rect = evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_RECT_FOR_MOVING);
+ if (rect) {
+ elm_box_unpack(scroller_info->box, rect);
+ evas_object_del(rect);
+ }
+
+ rect = evas_object_rectangle_add(main_get_info()->e);
+ retv_if(!rect, W_HOME_ERROR_FAIL);
+ evas_object_size_hint_min_set(rect, PAGE_EDIT_WIDTH, PAGE_EDIT_HEIGHT);
+ evas_object_color_set(rect, 0, 0, 0, 0);
+ evas_object_show(rect);
+
+ elm_box_pack_after(scroller_info->box, rect, page);
+ elm_box_unpack(scroller_info->box, page);
+ if (before) elm_box_pack_before(scroller_info->box, page, before);
+ else elm_box_pack_end(scroller_info->box, page);
+
+ evas_object_size_hint_min_set(page, 1, PAGE_EDIT_HEIGHT);
+
+ scroller_bring_in_page(scroller, page, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_ANIMATOR);
+
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_PAGE_FOR_MOVING, page);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_RECT_FOR_MOVING, rect);
+
+ anim = ecore_animator_add(_anim_move_page_before_cb, scroller);
+ retv_if(!anim, W_HOME_ERROR_FAIL);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_ANIM_FOR_MOVING, anim);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_EDIT_ITEM_IS_MOVED, (void *) 1);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+#define SLIPPED_LENGTH_AFTER 30
+static Eina_Bool _anim_move_page_after_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ Evas_Object *page = NULL;
+ Evas_Object *rect = NULL;
+ scroller_info_s *scroller_info = NULL;
+ int w, h;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ rect = evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_RECT_FOR_MOVING);
+ retv_if(!rect, ECORE_CALLBACK_CANCEL);
+ evas_object_geometry_get(rect, NULL, NULL, &w, &h);
+
+ w -= SLIPPED_LENGTH_AFTER;
+ evas_object_size_hint_min_set(rect, w, h);
+ if (w <= 0) {
+ page = evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_PAGE_FOR_MOVING);
+ elm_box_unpack(scroller_info->box, rect);
+ scroller_bring_in_page(scroller, page, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+ evas_object_del(rect);
+
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_RIGHT], scroller, INDEX_BRING_IN_NONE);
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_RIGHT], page);
+ }
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_PAGE_FOR_MOVING);
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_ANIM_FOR_MOVING);
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_RECT_FOR_MOVING);
+ return ECORE_CALLBACK_CANCEL;
+ }
+ return ECORE_CALLBACK_RENEW;
+}
+
+
+
+HAPI w_home_error_e edit_push_page_after(Evas_Object *scroller, Evas_Object *page, Evas_Object *after)
+{
+ Evas_Object *rect = NULL;
+ scroller_info_s *scroller_info = NULL;
+ Ecore_Animator *anim = NULL;
+
+ retv_if(!scroller, W_HOME_ERROR_FAIL);
+ retv_if(!page, W_HOME_ERROR_FAIL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ anim = evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_ANIM_FOR_MOVING);
+ if (anim) return W_HOME_ERROR_FAIL;
+
+ rect = evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_RECT_FOR_MOVING);
+ if (rect) {
+ elm_box_unpack(scroller_info->box, rect);
+ evas_object_del(rect);
+ }
+
+ rect = evas_object_rectangle_add(main_get_info()->e);
+ retv_if(!rect, W_HOME_ERROR_FAIL);
+ evas_object_size_hint_min_set(rect, PAGE_EDIT_WIDTH, PAGE_EDIT_HEIGHT);
+ evas_object_color_set(rect, 0, 0, 0, 0);
+ evas_object_show(rect);
+
+ elm_box_pack_before(scroller_info->box, rect, page);
+ elm_box_unpack(scroller_info->box, page);
+ if (after) elm_box_pack_after(scroller_info->box, page, after);
+ else elm_box_pack_start(scroller_info->box, page);
+
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_PAGE_FOR_MOVING, page);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_RECT_FOR_MOVING, rect);
+
+ anim = ecore_animator_add(_anim_move_page_after_cb, scroller);
+ retv_if(!anim, W_HOME_ERROR_FAIL);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_ANIM_FOR_MOVING, anim);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_EDIT_ITEM_IS_MOVED, (void *) 1);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static Eina_Bool _move_timer_cb(void *data)
+{
+ Evas_Object *proxy_page = data;
+ Evas_Object *pressed_page = NULL;
+ page_info_s *page_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ int idx_above_page = -1;
+ int idx_below_page = -1;
+ int inner_x, inner_y, sx;
+
+ retv_if(!proxy_page, ECORE_CALLBACK_CANCEL);
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, ECORE_CALLBACK_CANCEL);
+ retv_if(!page_info->scroller, ECORE_CALLBACK_CANCEL);
+ evas_object_data_del(page_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+
+ evas_object_geometry_get(page_info->page_inner, &inner_x, &inner_y, NULL, NULL);
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_ANIM, (void *) inner_x);
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_ANIM, (void *) inner_y);
+
+ elm_scroller_region_get(page_info->scroller, &sx, NULL, NULL, NULL);
+ sx += inner_x;
+ evas_object_data_set(page_info->scroller, PRIVATE_DATA_KEY_SCROLLER_X, (void *)sx);
+
+ idx_below_page = scroller_seek_page_position(page_info->scroller, proxy_page);
+ retv_if(-1 == idx_below_page, ECORE_CALLBACK_CANCEL);
+
+ pressed_page = evas_object_data_get(page_info->scroller, PRIVATE_DATA_KEY_SCROLLER_PRESS_PAGE);
+ retv_if(!pressed_page, ECORE_CALLBACK_CANCEL);
+
+ idx_above_page = scroller_seek_page_position(page_info->scroller, pressed_page);
+ retv_if(-1 == idx_above_page, ECORE_CALLBACK_CANCEL);
+
+ if (idx_above_page < idx_below_page) {
+ scroller_move_page_prev(page_info->scroller, pressed_page, proxy_page, pressed_page);
+ } else {
+ scroller_move_page_next(page_info->scroller, proxy_page, pressed_page, pressed_page);
+ }
+
+ scroller_bring_in_center_of(page_info->scroller, pressed_page, SCROLLER_FREEZE_ON, NULL, NULL, NULL, NULL);
+
+ edit_scroller_info = evas_object_data_get(page_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!edit_scroller_info, ECORE_CALLBACK_CANCEL);
+
+ /* Update index */
+ retv_if(!edit_scroller_info->index[PAGE_DIRECTION_RIGHT], ECORE_CALLBACK_CANCEL);
+ index_update(edit_scroller_info->index[PAGE_DIRECTION_RIGHT], page_info->scroller, INDEX_BRING_IN_NONE);
+ index_bring_in_page(edit_scroller_info->index[PAGE_DIRECTION_RIGHT], pressed_page);
+
+ _D("Move an proxy_page(%p, %d) to (%d)", proxy_page, idx_below_page, idx_above_page);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+#define TIME_MOVE_ITEM 0.1f
+static void _upper_start_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *proxy_page = obj;
+ Evas_Object *pressed_page = NULL;
+ Ecore_Timer *timer = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!proxy_page);
+
+ page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ pressed_page = evas_object_data_get(page_info->scroller, PRIVATE_DATA_KEY_SCROLLER_PRESS_PAGE);
+ ret_if(!pressed_page);
+
+ if (proxy_page == pressed_page) {
+ timer = evas_object_data_del(page_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+ return;
+ }
+
+ _D("Upper start : %p", proxy_page);
+
+ timer = evas_object_data_del(page_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ timer = ecore_timer_add(TIME_MOVE_ITEM, _move_timer_cb, proxy_page);
+ if (timer) evas_object_data_set(page_info->scroller, DATA_KEY_EVENT_UPPER_TIMER, timer);
+ else _E("Cannot add a timer");
+}
+
+
+
+static void _upper_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ;
+}
+
+
+
+static void _upper_end_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *page = obj;
+ page_info_s *page_info = NULL;
+ Ecore_Timer *timer = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ _D("Upper end : %p", page);
+
+ timer = evas_object_data_del(page_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+}
+
+
+
+Evas_Object *edit_create_proxy_page(Evas_Object *edit_scroller, Evas_Object *real_page, page_changeable_bg_e changable_color)
+{
+ Evas_Object *proxy_page = NULL;
+ Evas_Object *proxy_item = NULL;
+ Evas_Object *remove_focus = NULL;
+ page_info_s *page_info = NULL;
+ page_info_s *proxy_page_info = NULL;
+
+ retv_if(!edit_scroller, NULL);
+ retv_if(!real_page, NULL);
+
+ page_info = evas_object_data_get(real_page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ /* Proxy item */
+ proxy_item = _create_proxy_item(edit_scroller, real_page);
+ retv_if(!proxy_item, NULL);
+
+ /* Proxy Page */
+ proxy_page = page_create(edit_scroller
+ , proxy_item
+ , page_info->id, page_info->subid
+ , PAGE_EDIT_WIDTH, PAGE_EDIT_HEIGHT
+ , changable_color, page_info->removable);
+ if (!proxy_page) {
+ _E("Cannot create a page");
+ _destroy_proxy_item(proxy_item);
+ return NULL;
+ }
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ if (!proxy_page_info) {
+ _E("Cannot get the proxy_page_info");
+ page_destroy(proxy_page);
+ _destroy_proxy_item(proxy_item);
+ return NULL;
+ }
+ elm_object_signal_emit(proxy_page_info->page_inner, "enable", "blocker");
+
+ remove_focus = elm_button_add(proxy_page_info->page_inner);
+ retv_if(!remove_focus, NULL);
+
+ elm_object_style_set(remove_focus, "focus");
+ elm_object_part_content_set(proxy_page_info->page_inner, "remove_focus", remove_focus);
+ elm_access_info_cb_set(remove_focus, ELM_ACCESS_INFO, _access_remove_button_name_cb, NULL);
+ proxy_page_info->remove_focus = remove_focus;
+
+ evas_object_data_set(proxy_page, DATA_KEY_REAL_PAGE, real_page);
+ evas_object_data_set(real_page, DATA_KEY_PROXY_PAGE, proxy_page);
+
+ proxy_page_info->direction = page_info->direction;
+ if (PAGE_DIRECTION_CENTER == page_info->direction) return proxy_page;
+
+ evas_object_event_callback_add(proxy_page_info->page_inner, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, proxy_page);
+ evas_object_event_callback_add(proxy_page_info->page_inner, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, proxy_page);
+ evas_object_event_callback_add(proxy_page_info->page_inner, EVAS_CALLBACK_MOUSE_UP, _up_cb, proxy_page);
+ evas_object_smart_callback_add(proxy_page, "upper_start", _upper_start_cb, NULL);
+ evas_object_smart_callback_add(proxy_page, "upper", _upper_cb, NULL);
+ evas_object_smart_callback_add(proxy_page, "upper_end", _upper_end_cb, NULL);
+
+ return proxy_page;
+}
+
+
+
+void edit_destroy_proxy_page(Evas_Object *proxy_page)
+{
+ Evas_Object *real_page = NULL;
+ page_info_s *proxy_page_info = NULL;
+ Ecore_Animator *anim = NULL;
+
+ ret_if(!proxy_page);
+
+ real_page = evas_object_data_del(proxy_page, DATA_KEY_REAL_PAGE);
+ if (real_page) evas_object_data_del(real_page, DATA_KEY_PROXY_PAGE);
+
+ anim = evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_ANIM_FOR_MOVING);
+ if (anim) {
+ ecore_animator_del(anim);
+ anim = NULL;
+ if (NULL == _content_set_page_inner(proxy_page)) _E("cannot set the page");
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_X_FOR_ANIM);
+ evas_object_data_del(proxy_page, PRIVATE_DATA_KEY_PAGE_Y_FOR_ANIM);
+ }
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ ret_if(!proxy_page_info);
+
+ if (proxy_page_info->remove_focus) {
+ evas_object_del(proxy_page_info->remove_focus);
+ proxy_page_info->remove_focus = NULL;
+ }
+
+ if (proxy_page_info->item) {
+ _destroy_proxy_item(proxy_page_info->item);
+ }
+ page_destroy(proxy_page);
+}
+
+
+
+static Eina_Bool _enlarge_dbox_anim_cb(void *data)
+{
+ Evas_Object *effect_page = data;
+ Evas_Object *bg_rect = NULL;
+
+ int cur_x, cur_y, cur_w, cur_h;
+ int end_x, end_y, end_w, end_h;
+ int vec_x, vec_y, vec_w, vec_h;
+ int divide_factor;
+
+ goto_if(!effect_page, OUT);
+
+ bg_rect = evas_object_data_get(effect_page, DATA_KEY_BG);
+ goto_if(!bg_rect, OUT);
+
+ end_w = main_get_info()->root_w;
+ end_h = main_get_info()->root_h;
+
+ end_x = 0;
+ end_y = 0;
+
+ evas_object_geometry_get(effect_page, &cur_x, &cur_y, &cur_w, &cur_h);
+
+ divide_factor = (int) evas_object_data_get(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR);
+ if (divide_factor > 1) {
+ evas_object_data_set(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR, (void *) divide_factor - 1);
+ }
+
+ vec_x = (end_x - cur_x) / divide_factor;
+ vec_y = (end_y - cur_y) / divide_factor;
+ vec_w = (end_w - cur_w) / divide_factor;
+ vec_h = (end_h - cur_h) / divide_factor;
+
+ if (!vec_x) vec_x = -1;
+ if (!vec_y) vec_y = -1;
+ if (!vec_w) vec_w = 1;
+ if (!vec_h) vec_h = 1;
+
+ cur_x += vec_x;
+ cur_y += vec_y;
+ cur_w += vec_w;
+ cur_h += vec_h;
+
+ if (cur_x < end_x) {
+ goto OUT;
+ }
+
+ evas_object_move(effect_page, cur_x, cur_y);
+ evas_object_resize(effect_page, cur_w, cur_h);
+ evas_object_move(bg_rect, cur_x, cur_y);
+ evas_object_resize(bg_rect, cur_w, cur_h);
+
+ return ECORE_CALLBACK_RENEW;
+
+OUT:
+ if (effect_page) {
+ evas_object_data_del(effect_page, PRIVATE_DATA_KEY_ANIM_FOR_ENLARGE);
+ evas_object_data_del(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR);
+ evas_object_data_del(effect_page, DATA_KEY_BG);
+
+ edit_destroy_add_viewer(main_get_info()->layout);
+ _destroy_proxy_bg(bg_rect);
+ evas_object_del(effect_page);
+ }
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+#define DIVIDE_FACTOR 5
+HAPI void edit_enlarge_effect_dbox(void *effect_page)
+{
+ Evas_Object *clip_bg = NULL;
+ Ecore_Animator *anim = NULL;
+
+ anim = evas_object_data_get(effect_page, PRIVATE_DATA_KEY_ANIM_FOR_ENLARGE);
+ if (anim) {
+ _D("You've already an animator");
+ return;
+ }
+
+ evas_object_raise(effect_page);
+
+ anim = ecore_animator_add(_enlarge_dbox_anim_cb, effect_page);
+ if (anim) {
+ evas_object_data_set(effect_page, PRIVATE_DATA_KEY_ANIM_FOR_ENLARGE, anim);
+ evas_object_data_set(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR, (void *) DIVIDE_FACTOR);
+ } else {
+ clip_bg = evas_object_data_del(effect_page, DATA_KEY_BG);
+ if (clip_bg) _destroy_proxy_bg(clip_bg);
+ evas_object_del(effect_page);
+ }
+}
+
+
+
+static void _dbox_selected_cb(void *data, Evas_Object *add_viewer, void *event_info)
+{
+ Evas_Object *layout = data;
+ Evas_Object *clip_bg = NULL;
+ layout_info_s *layout_info = NULL;
+ struct add_viewer_event_info *e = event_info;
+
+ _D("Selected: %s", e->pkg_info.dbox_id);
+ ret_if(!layout);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ if (layout_info->edit) {
+ evas_object_del(e->pkg_info.image);
+ if (!add_dbox_in_edit(layout, e->pkg_info.dbox_id, e->pkg_info.content)) {
+ _E("Cannot add dbox in edit mode");
+ }
+ edit_destroy_add_viewer(layout);
+ } else {
+ clip_bg = _create_proxy_bg(e->pkg_info.image);
+ ret_if(!clip_bg);
+ evas_object_data_set(e->pkg_info.image, DATA_KEY_BG, clip_bg);
+ edit_enlarge_effect_dbox(e->pkg_info.image);
+
+ if (!_add_dbox_in_normal(layout, e->pkg_info.dbox_id, e->pkg_info.content)) {
+ _E("Cannot add dbox in widget scroller");
+ }
+ }
+
+ /* Only for right layout */
+ wms_change_favorite_order(W_HOME_WMS_BACKUP);
+}
+
+
+
+HAPI Evas_Object *edit_create_add_viewer(Evas_Object *layout)
+{
+ Evas_Object *add_viewer = NULL;
+ layout_info_s *layout_info = NULL;
+
+ retv_if(!layout, NULL);
+
+ if (evas_object_data_get(layout, DATA_KEY_ADD_VIEWER)) {
+ _D("There is already the add-viewer");
+ return NULL;
+ }
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ add_viewer = evas_object_add_viewer_add(layout);
+ retv_if(!add_viewer, NULL);
+
+ evas_object_size_hint_weight_set(add_viewer, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(add_viewer, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_resize(add_viewer, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_smart_callback_add(add_viewer, "selected", _dbox_selected_cb, layout);
+ evas_object_show(add_viewer);
+ elm_object_part_content_set(layout, "add_viewer", add_viewer);
+ elm_object_signal_emit(layout, "show", "add_viewer");
+
+ if (layout_info->edit) {
+ elm_object_tree_focus_allow_set(layout_info->edit, EINA_FALSE);
+ } else {
+ elm_object_tree_focus_allow_set(layout_info->scroller, EINA_FALSE);
+ layout_del_mouse_cb(layout);
+ }
+ elm_object_tree_focus_allow_set(add_viewer, EINA_TRUE);
+
+ evas_object_data_set(layout, DATA_KEY_ADD_VIEWER, add_viewer);
+
+ if (W_HOME_ERROR_NONE != key_register_cb(KEY_TYPE_BACK, _add_viewer_back_key_cb, layout)) {
+ _E("Cannot register the key callback");
+ }
+ if (W_HOME_ERROR_NONE != key_register_cb(KEY_TYPE_HOME, _add_viewer_home_key_cb, layout)) {
+ _E("Cannot register the key callback");
+ }
+#if 0
+ if (W_HOME_ERROR_NONE != gesture_register_cb(BEZEL_DOWN, _add_viewer_bezel_down_cb, layout)) {
+ _E("Cannot register the gesture callback");
+ }
+#endif
+
+ return add_viewer;
+}
+
+
+
+static void _del_add_viewer(void *data, Evas_Object *o, const char *emission, const char *source)
+{
+ Evas_Object *add_viewer = NULL;
+ Evas_Object *layout = data;
+ layout_info_s *layout_info = NULL;
+
+ ret_if(!layout);
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ add_viewer = elm_object_part_content_unset(layout, "add_viewer");
+ ret_if(!add_viewer);
+
+ if (layout_info->edit) {
+ /* If you want to set the EINA_TRUE in this API,
+ you have to control the tree focus set when using content_set or content_unset API
+ in the layout that elm_object_tree_focus_allow_set is EINA_TRUE*/
+ elm_object_tree_focus_allow_set(layout_info->edit, EINA_FALSE);
+ } else {
+ elm_object_tree_focus_allow_set(layout_info->scroller, EINA_TRUE);
+ layout_add_mouse_cb(layout);
+ }
+ elm_object_tree_focus_allow_set(add_viewer, EINA_FALSE);
+
+ evas_object_del(add_viewer);
+ elm_object_signal_callback_del(layout, "add_viewer,hide", "add_viewer", _del_add_viewer);
+}
+
+
+
+HAPI void edit_destroy_add_viewer(Evas_Object *layout)
+{
+ Evas_Object *add_viewer = NULL;
+ layout_info_s *layout_info = NULL;
+
+ ret_if(!layout);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ add_viewer = evas_object_data_del(layout, DATA_KEY_ADD_VIEWER);
+ if (!add_viewer) return;
+
+#if 0
+ gesture_unregister_cb(BEZEL_DOWN, _add_viewer_bezel_down_cb);
+#endif
+ key_unregister_cb(KEY_TYPE_BACK, _add_viewer_back_key_cb);
+ key_unregister_cb(KEY_TYPE_HOME, _add_viewer_home_key_cb);
+
+ if (layout_info->edit) elm_object_signal_emit(layout, "hide", "add_viewer");
+ else elm_object_signal_emit(layout, "hide,instant", "add_viewer");
+
+ edje_object_message_signal_process(elm_layout_edje_get(layout));
+
+ elm_object_signal_callback_add(layout, "add_viewer,hide", "add_viewer", _del_add_viewer, layout);
+}
+
+
+
+/* You have to free the returned value */
+HAPI char *edit_get_count_str_from_icu(int count)
+{
+ char *p = NULL;
+ char *ret_str = NULL;
+ char *locale = NULL;
+ char res[LOCALE_LEN] = { 0, };
+
+ UErrorCode status = U_ZERO_ERROR;
+ UNumberFormat *num_fmt;
+ UChar result[20] = { 0, };
+
+ uint32_t number = count;
+ int32_t len = (int32_t) (sizeof(result) / sizeof((result)[0]));
+
+ locale = vconf_get_str(VCONFKEY_REGIONFORMAT);
+ retv_if(!locale, NULL);
+
+ if(locale[0] != '\0') {
+ p = strstr(locale, ".UTF-8");
+ if (p) *p = 0;
+ }
+
+ num_fmt = unum_open(UNUM_DEFAULT, NULL, -1, locale, NULL, &status);
+ unum_format(num_fmt, number, result, len, NULL, &status);
+ u_austrcpy(res, result);
+ unum_close(num_fmt);
+
+ ret_str = strdup(res);
+ free(locale);
+ return ret_str;
+}
+
+
+
+static void _plus_item_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ edit_info_s *edit_info = NULL;
+ layout_info_s *layout_info = data;
+
+ _D("Clicked the plus item");
+
+ ret_if(!layout_info);
+ ret_if(!layout_info->edit);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ edit_change_focus(edit_info->scroller, NULL);
+
+ if (!edit_create_add_viewer(edit_info->layout)) {
+ _E("Cannot add the add-viewer");
+ }
+
+ effect_play_sound();
+}
+
+
+
+static void _plus_item_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Evas_Object *page = data;
+ Evas_Object *box = NULL;
+ page_info_s *page_info = NULL;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->page_inner);
+ ret_if(!page_info->item);
+
+ box = elm_object_part_content_get(page_info->page_inner, "line");
+ ret_if(!box);
+ evas_object_color_set(box, 255, 255, 255, 100);
+
+ elm_object_signal_emit(page_info->item, "edit,press", "plus");
+}
+
+
+
+static void _plus_item_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Evas_Object *page = data;
+ Evas_Object *box = NULL;
+ page_info_s *page_info = NULL;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->page_inner);
+ ret_if(!page_info->item);
+
+ box = elm_object_part_content_get(page_info->page_inner, "line");
+ ret_if(!box);
+ evas_object_color_set(box, 255, 255, 255, 255);
+
+ elm_object_signal_emit(page_info->item, "edit,release", "plus");
+}
+
+
+
+void _destroy_plus_page(Evas_Object *edit)
+{
+ edit_info_s *edit_info = NULL;
+ page_info_s *page_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!edit);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+ ret_if(!edit_info->scroller);
+ ret_if(!edit_info->plus_page);
+
+ scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ page_info = evas_object_data_get(edit_info->plus_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ evas_object_del(page_info->item);
+
+ evas_object_data_del(edit_info->plus_page, DATA_KEY_REAL_PAGE);
+ evas_object_data_del(edit_info->plus_page, PRIVATE_DATA_KEY_EDIT_DO_NOT_SUPPORT_ENLARGE_EFFECT);
+ page_destroy(edit_info->plus_page);
+
+ edit_info->plus_page = NULL;
+ scroller_info->plus_page = NULL;
+}
+
+
+
+#define PLUS_ITEM_EDJ EDJEDIR"/page.edj"
+#define PLUS_ITEM_GROUP "plus_item"
+Evas_Object *_create_plus_page(Evas_Object *edit)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *plus_item = NULL;
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+ page_info_s *page_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ Eina_Bool ret;
+ char max_text[TEXT_LEN] = {0, };
+ char *count_str = NULL;
+
+ retv_if(!edit, NULL);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ retv_if(!edit_info, NULL);
+
+ layout_info = evas_object_data_get(edit_info->layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ edit_scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!edit_scroller_info, NULL);
+
+ plus_item = elm_layout_add(edit_info->scroller);
+ goto_if(!plus_item, ERROR);
+
+ ret = elm_layout_file_set(plus_item, PLUS_ITEM_EDJ, PLUS_ITEM_GROUP);
+ goto_if(EINA_FALSE == ret, ERROR);
+ evas_object_size_hint_weight_set(plus_item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(plus_item, ITEM_EDIT_WIDTH, ITEM_EDIT_HEIGHT);
+ evas_object_show(plus_item);
+
+ count_str = edit_get_count_str_from_icu(MAX_DBOX);
+ if (!count_str) {
+ _E("count_str is NULL");
+ count_str = calloc(1, LOCALE_LEN);
+ retv_if(!count_str, NULL);
+ snprintf(count_str, LOCALE_LEN, "%d", MAX_DBOX);
+ }
+
+ snprintf(max_text
+ , sizeof(max_text)
+ , _("IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB")
+ , count_str);
+ elm_object_part_text_set(plus_item, "max_text", max_text);
+ free(count_str);
+
+ page = page_create(edit_info->scroller,
+ plus_item,
+ NULL, NULL,
+ edit_scroller_info->page_width, edit_scroller_info->page_height,
+ PAGE_CHANGEABLE_BG_OFF, PAGE_REMOVABLE_OFF);
+ if (!page) {
+ _E("Cannot create the page");
+ evas_object_del(plus_item);
+ return NULL;
+ }
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ goto_if(!page_info, ERROR);
+ goto_if(!page_info->page_inner, ERROR);
+
+ elm_object_signal_emit(page_info->page_inner, "enable", "blocker");
+ elm_object_signal_emit(plus_item, "show,edit", "plus_item");
+
+ elm_access_info_cb_set(page_info->focus, ELM_ACCESS_TYPE, NULL, NULL);
+ elm_access_info_cb_set(page_info->focus, ELM_ACCESS_INFO, _access_plus_button_name_cb, NULL);
+ elm_object_signal_callback_add(plus_item, "click", "plus_item", _plus_item_clicked_cb, layout_info);
+ elm_object_signal_callback_add(plus_item, "down", "plus_item", _plus_item_down_cb, page);
+ elm_object_signal_callback_add(plus_item, "up", "plus_item", _plus_item_up_cb, page);
+
+
+ evas_object_data_set(page, DATA_KEY_REAL_PAGE, scroller_info->plus_page);
+ evas_object_data_set(page, PRIVATE_DATA_KEY_EDIT_DO_NOT_SUPPORT_ENLARGE_EFFECT, (void *) 1);
+ evas_object_data_set(scroller_info->plus_page, DATA_KEY_PROXY_PAGE, page);
+
+ edit_info->plus_page = page;
+ edit_scroller_info->plus_page = page;
+
+ return page;
+
+ERROR:
+ _destroy_plus_page(edit);
+ return NULL;
+}
+
+
+
+static Evas_Object *_create_center_page(Evas_Object *edit, page_direction_e page_direction)
+{
+ Evas_Object *center_page = NULL;
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ page_info_s *center_page_info = NULL;
+
+ retv_if(!edit, NULL);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ retv_if(!edit_info, NULL);
+
+ layout_info = evas_object_data_get(edit_info->layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ edit_scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!edit_scroller_info, NULL);
+
+ /* Create the center page */
+ center_page = edit_create_proxy_page(edit_info->scroller, scroller_info->center, PAGE_CHANGEABLE_BG_ON);
+ if (!center_page) {
+ _E("Cannot create a page");
+ return NULL;
+ }
+ evas_object_data_set(center_page, PRIVATE_DATA_KEY_EDIT_UNFOCUSABLE, (void *) 1);
+
+ center_page_info = evas_object_data_get(center_page, DATA_KEY_PAGE_INFO);
+ if (!center_page_info) {
+ _E("Cannot get the page_info");
+ edit_destroy_proxy_page(center_page);
+ return NULL;
+ }
+ elm_access_info_cb_set(center_page_info->focus, ELM_ACCESS_CONTEXT_INFO, _access_tab_to_move_cb, center_page);
+
+ if (page_direction == PAGE_DIRECTION_LEFT) {
+ evas_object_smart_callback_add(center_page_info->focus, "clicked", _clicked_center_cb, center_page);
+ } else {
+ evas_object_smart_callback_add(center_page_info->focus, "clicked", _clicked_noti_cb, center_page);
+ }
+ elm_object_signal_emit(center_page_info->page_inner, "disable", "cover");
+ elm_object_signal_emit(center_page_info->page_inner, "select", "cover_clipper");
+ elm_object_signal_emit(center_page_info->page_inner, "enable", "blocker");
+
+ edit_info->center_page = center_page;
+
+ return center_page;
+}
+
+
+
+static void _destroy_center_page(Evas_Object *edit)
+{
+ edit_info_s *edit_info = NULL;
+
+ ret_if(!edit);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+ ret_if(!edit_info->center_page);
+
+ evas_object_data_del(edit_info->center_page, PRIVATE_DATA_KEY_EDIT_UNFOCUSABLE);
+
+ edit_destroy_proxy_page(edit_info->center_page);
+ edit_info->center_page = NULL;
+}
+
+
+
+static w_home_error_e _scroller_push_right_page(Evas_Object *edit, Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *center_page = NULL;
+ Evas_Object *plus_page = NULL;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+ edit_info_s *edit_info = NULL;
+ page_info_s *page_info = NULL;
+ int count = 0;
+
+ retv_if(!edit, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(!scroller, W_HOME_ERROR_INVALID_PARAMETER);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ retv_if(!edit_info, W_HOME_ERROR_FAIL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, W_HOME_ERROR_FAIL);
+
+ center_page = _create_center_page(edit, PAGE_DIRECTION_RIGHT);
+ if (center_page) {
+ scroller_push_page(edit_info->scroller, center_page, SCROLLER_PUSH_TYPE_CENTER);
+ }
+
+ EINA_LIST_FREE(list, page) {
+ Evas_Object *proxy_page = NULL;
+ page_info_s *proxy_page_info = NULL;
+ Evas_Object *page_inner;
+
+ continue_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) continue;
+ if (PAGE_DIRECTION_RIGHT != page_info->direction) continue;
+ if (page == scroller_info->plus_page) continue;
+
+ page_inner = elm_object_part_content_unset(page, "inner");
+ if (!page_inner) {
+ elm_object_part_content_set(page, "inner", page_info->page_inner);
+ page_inner = elm_object_part_content_unset(page, "inner");
+ if (!page_inner) {
+ _E("Fault - Impossible");
+ page_inner = page_info->page_inner;
+ }
+ }
+ evas_object_move(page_inner, 0, 0);
+
+ evas_object_dynamicbox_resume(page_info->item);
+
+ proxy_page = edit_create_proxy_page(edit_info->scroller, page, PAGE_CHANGEABLE_BG_ON);
+ continue_if(!proxy_page);
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ if (!proxy_page_info) {
+ _E("Cannot get the page_info");
+ edit_destroy_proxy_page(proxy_page);
+ continue;
+ }
+ elm_object_signal_emit(proxy_page_info->page_inner, "select", "cover_clipper");
+
+ elm_access_info_cb_set(proxy_page_info->focus, ELM_ACCESS_CONTEXT_INFO, _access_tab_to_move_cb, NULL);
+ evas_object_smart_callback_add(proxy_page_info->focus, "clicked", _clicked_dbox_cb, proxy_page);
+ evas_object_smart_callback_add(proxy_page_info->remove_focus, "clicked", _del_dbox_cb, proxy_page);
+
+ scroller_push_page(edit_info->scroller, proxy_page, SCROLLER_PUSH_TYPE_LAST);
+ count++;
+ }
+
+ /* Plus page */
+ plus_page = _create_plus_page(edit);
+ retv_if(!plus_page, W_HOME_ERROR_FAIL);
+ scroller_push_page(edit_info->scroller, plus_page, SCROLLER_PUSH_TYPE_LAST);
+ edit_arrange_plus_page(edit);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static void _scroller_pop_right_page(Evas_Object *edit)
+{
+ Evas_Object *proxy_page = NULL;
+ Eina_List *edit_list = NULL;
+ edit_info_s *edit_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *proxy_page_info = NULL;
+
+ ret_if(!edit);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+
+ scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ scroller_pop_page(edit_info->scroller, edit_info->center_page);
+ _destroy_center_page(edit);
+
+ if (edit_info->plus_page) {
+ evas_object_data_del(edit_info->plus_page, DATA_KEY_REAL_PAGE);
+ evas_object_data_del(scroller_info->plus_page, DATA_KEY_PROXY_PAGE);
+ _destroy_plus_page(edit);
+ }
+
+ edit_list = elm_box_children_get(scroller_info->box);
+ if (!edit_list) {
+ _D("There is no page");
+ return;
+ }
+
+ EINA_LIST_FREE(edit_list, proxy_page) {
+ continue_if(!proxy_page);
+
+ elm_box_unpack(scroller_info->box, proxy_page);
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ continue_if(!proxy_page_info);
+
+ edit_destroy_proxy_page(proxy_page);
+ }
+}
+
+
+
+#define PRIVATE_DATA_KEY_SCROLLER_PAD_BF "p_sc_pbf"
+#define PRIVATE_DATA_KEY_SCROLLER_PAD_AF "p_sc_paf"
+static void _add_padding(Evas_Object *edit_scroller)
+{
+ Evas_Object *pad_bf, *pad_af;
+ scroller_info_s *edit_scroller_info = NULL;
+
+ ret_if(!edit_scroller);
+
+ edit_scroller_info = evas_object_data_get(edit_scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!edit_scroller_info);
+
+ pad_bf = evas_object_rectangle_add(main_get_info()->e);
+ ret_if(!pad_bf);
+ evas_object_size_hint_min_set(pad_bf, PAGE_EDIT_SIDE_PAD_WIDTH, PAGE_EDIT_HEIGHT);
+ evas_object_color_set(pad_bf, 0, 0, 0, 0);
+ evas_object_show(pad_bf);
+ elm_box_pack_start(edit_scroller_info->box_layout, pad_bf);
+ evas_object_data_set(edit_scroller, PRIVATE_DATA_KEY_SCROLLER_PAD_BF, pad_bf);
+
+ pad_af = evas_object_rectangle_add(main_get_info()->e);
+ ret_if(!pad_af);
+ evas_object_size_hint_min_set(pad_af, PAGE_EDIT_SIDE_PAD_WIDTH, PAGE_EDIT_HEIGHT);
+ evas_object_color_set(pad_af, 0, 0, 0, 0);
+ evas_object_show(pad_af);
+ elm_box_pack_end(edit_scroller_info->box_layout, pad_af);
+ evas_object_data_set(edit_scroller, PRIVATE_DATA_KEY_SCROLLER_PAD_AF, pad_af);
+}
+
+
+
+static void _remove_padding(Evas_Object *edit_scroller)
+{
+ Evas_Object *pad_bf, *pad_af;
+
+ ret_if(!edit_scroller);
+
+ pad_bf = evas_object_data_del(edit_scroller, PRIVATE_DATA_KEY_SCROLLER_PAD_BF);
+ if (pad_bf) evas_object_del(pad_bf);
+
+ pad_af = evas_object_data_del(edit_scroller, PRIVATE_DATA_KEY_SCROLLER_PAD_AF);
+ if (pad_af) evas_object_del(pad_af);
+}
+
+
+
+static void _edit_scroll_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *edit_scroller = obj;
+ Evas_Object *page_current = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+
+ ret_if(!edit_scroller);
+
+ edit_scroller_info = evas_object_data_get(edit_scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!edit_scroller_info);
+
+ if (evas_object_data_get(edit_scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED)) return;
+ if (!edit_scroller_info->scroll_cover) return;
+
+ page_current = scroller_get_focused_page(edit_scroller);
+ ret_if(!page_current);
+ edit_change_focus(edit_scroller, page_current);
+}
+
+
+
+static w_home_error_e _scroller_push_left_page(Evas_Object *edit, Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *center_page = NULL;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+ edit_info_s *edit_info = NULL;
+ page_info_s *page_info = NULL;
+
+ retv_if(!edit, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(!scroller, W_HOME_ERROR_INVALID_PARAMETER);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ retv_if(!edit_info, W_HOME_ERROR_FAIL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, W_HOME_ERROR_FAIL);
+
+ center_page = _create_center_page(edit, PAGE_DIRECTION_LEFT);
+ if (center_page) {
+ scroller_push_page(edit_info->scroller, center_page, SCROLLER_PUSH_TYPE_CENTER);
+ }
+
+ EINA_LIST_FREE(list, page) {
+ Evas_Object *proxy_page = NULL;
+ page_info_s *proxy_page_info = NULL;
+
+ continue_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) continue;
+ if (PAGE_DIRECTION_LEFT != page_info->direction) continue;
+
+ proxy_page = edit_create_proxy_page(edit_info->scroller, page, PAGE_CHANGEABLE_BG_OFF);
+ continue_if(!proxy_page);
+
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_EDIT_DISABLE_REORDERING, (void *) 1);
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ if (!proxy_page_info) {
+ _E("Cannot get the page_info");
+ edit_destroy_proxy_page(proxy_page);
+ continue;
+ }
+
+ if (scroller_info->center_neighbor_left == page) {
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_EDIT_UNFOCUSABLE, (void *) 1);
+ elm_object_signal_emit(proxy_page_info->page_inner, "disable", "cover");
+ }
+ elm_object_signal_emit(proxy_page_info->page_inner, "select", "cover_clipper");
+
+ elm_access_info_cb_set(proxy_page_info->focus, ELM_ACCESS_CONTEXT_INFO, _access_tab_to_move_cb, NULL);
+
+ evas_object_smart_callback_add(proxy_page_info->focus, "clicked", _clicked_noti_cb, proxy_page);
+ evas_object_smart_callback_add(proxy_page_info->remove_focus, "clicked", _del_noti_cb, proxy_page);
+
+ scroller_push_page(edit_info->scroller, proxy_page, SCROLLER_PUSH_TYPE_CENTER_LEFT);
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static void _scroller_pop_left_page(Evas_Object *edit)
+{
+ Evas_Object *edit_page = NULL;
+ Eina_List *edit_list = NULL;
+ edit_info_s *edit_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!edit);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+
+ scroller_pop_page(edit_info->scroller, edit_info->center_page);
+ _destroy_center_page(edit);
+
+ edit_scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!edit_scroller_info);
+
+ edit_list = elm_box_children_get(edit_scroller_info->box);
+ ret_if(!edit_list);
+
+ EINA_LIST_FREE(edit_list, edit_page) {
+ continue_if(!edit_page);
+
+ page_info = evas_object_data_get(edit_page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+
+ evas_object_data_del(edit_page, PRIVATE_DATA_KEY_EDIT_DISABLE_REORDERING);
+ evas_object_data_del(edit_page, PRIVATE_DATA_KEY_EDIT_UNFOCUSABLE);
+ scroller_pop_page(edit_info->scroller, edit_page);
+ edit_destroy_proxy_page(edit_page);
+ }
+}
+
+
+
+static char *_access_page_num_cb(Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ page_info_s *page_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ int count = 0;
+ int cur = 0;
+ char number[BUFSZE];
+ char *tmp;
+
+ retv_if(NULL == scroller, NULL);
+
+ page = scroller_get_focused_page(scroller);
+ retv_if(!page, NULL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ count = eina_list_count(list);
+ cur = scroller_seek_page_position(scroller, page) + 1;
+
+ snprintf(number, sizeof(number), _("IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"), cur, count);
+
+ tmp = strdup(number);
+ if (!tmp) return NULL;
+ return tmp;
+}
+
+
+
+static void _edit_anim_stop_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ Evas_Object *press_page = NULL;
+ char *tmp = NULL;
+
+ _D("stop the scroller(%p) animation", scroller);
+
+ ret_if(!scroller);
+
+ if (!main_get_info()->is_tts) return;
+
+ press_page = evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_PRESS_PAGE);
+ ret_if(!press_page);
+
+ tmp = _access_page_num_cb(scroller);
+ if (tmp) {
+ elm_access_say(tmp);
+ free(tmp);
+ }
+}
+
+
+
+#define EDIT_EDJ EDJEDIR"/edit.edj"
+#define EDIT_GROUP "edit"
+HAPI Evas_Object *_create_right_layout(Evas_Object *layout)
+{
+ Evas_Object *edit = NULL;
+ Evas_Object *edit_scroller = NULL;
+
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ edit_info_s *edit_info = NULL;
+ Eina_Bool ret;
+
+ retv_if(!layout, NULL);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ edit = elm_layout_add(layout);
+ retv_if(NULL == edit, NULL);
+
+ edit_info = calloc(1, sizeof(edit_info_s));
+ if (!edit_info) {
+ _E("Cannot calloc for edit_info");
+ free(edit_info);
+ return NULL;
+ }
+ evas_object_data_set(edit, DATA_KEY_EDIT_INFO, edit_info);
+
+ ret = elm_layout_file_set(edit, EDIT_EDJ, EDIT_GROUP);
+ if (EINA_FALSE == ret) {
+ _E("cannot set the file into the layout");
+ free(edit_info);
+ evas_object_del(edit);
+ return NULL;
+ }
+ evas_object_size_hint_weight_set(edit, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(edit, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_resize(edit, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_show(edit);
+
+ layout_del_mouse_cb(layout);
+
+ edit_scroller = scroller_create(layout, edit, PAGE_EDIT_WIDTH, PAGE_EDIT_HEIGHT, SCROLLER_INDEX_SINGULAR);
+ if (!edit_scroller) {
+ _E("Cannot create edit_scroller");
+ free(edit_info);
+ evas_object_del(edit);
+ return NULL;
+ }
+ evas_object_smart_callback_add(edit_scroller, "scroll", _edit_scroll_cb, NULL);
+ evas_object_smart_callback_add(edit_scroller, "scroll,anim,stop", _edit_anim_stop_cb, NULL);
+ _add_padding(edit_scroller);
+
+ elm_object_part_content_set(layout, "edit", edit);
+ elm_object_part_content_set(edit, "scroller", edit_scroller);
+
+ edit_info->layout = layout;
+ edit_info->scroller = edit_scroller;
+
+ layout_info->edit = edit;
+
+ edit_scroller_info = evas_object_data_get(edit_scroller, DATA_KEY_SCROLLER_INFO);
+ if (!edit_scroller_info) {
+ _E("Cannot create scroller");
+ scroller_destroy(layout);
+ free(layout_info);
+ evas_object_del(layout);
+ return NULL;
+ }
+ edit_info->scroller = edit_scroller;
+
+ edit_scroller_info->index[PAGE_DIRECTION_RIGHT] = index_create(edit, edit_scroller, PAGE_DIRECTION_RIGHT);
+ if (!edit_scroller_info->index[PAGE_DIRECTION_RIGHT]) _E("Cannot create the right index");
+ else elm_object_part_content_set(edit, "index", edit_scroller_info->index[PAGE_DIRECTION_RIGHT]);
+
+ _scroller_push_right_page(edit, layout_info->scroller);
+
+ return edit;
+}
+
+
+
+HAPI void _destroy_right_layout(Evas_Object *layout)
+{
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ edit_info_s *edit_info = NULL;
+ Evas_Object *focus_page = NULL;
+
+ ret_if(!layout);
+
+ edit_destroy_add_viewer(layout);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+ ret_if(!layout_info->edit);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+
+ if (!evas_object_data_get(layout, PRIVATE_DATA_KEY_EDIT_SYNC_IS_DONE)) {
+ _sync_from_edit_to_normal(layout);
+ }
+ evas_object_data_del(layout, PRIVATE_DATA_KEY_EDIT_SYNC_IS_DONE);
+
+ layout_add_mouse_cb(layout);
+
+ edit_scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!edit_scroller_info);
+
+ focus_page = scroller_get_focused_page(layout_info->scroller);
+ scroller_push_page(layout_info->scroller, scroller_info->plus_page, SCROLLER_PUSH_TYPE_LAST);
+ if (focus_page) scroller_region_show_page(layout_info->scroller, focus_page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT);
+ else _E("Cannot get the focused page");
+
+ if (edit_scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_destroy(edit_scroller_info->index[PAGE_DIRECTION_RIGHT]);
+ }
+
+ _scroller_pop_right_page(layout_info->edit);
+ _remove_padding(edit_info->scroller);
+
+ evas_object_data_del(edit_info->scroller, PRIVATE_DATA_KEY_EDIT_FOCUS_OBJECT);
+ evas_object_data_del(edit_info->scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED);
+ scroller_destroy(layout_info->edit);
+
+ evas_object_del(layout_info->edit);
+ free(edit_info);
+ layout_info->edit = NULL;
+
+ /* Only for right layout */
+ wms_change_favorite_order(W_HOME_WMS_BACKUP);
+}
+
+
+
+#define EDIT_EDJ EDJEDIR"/edit.edj"
+#define EDIT_GROUP "edit"
+HAPI Evas_Object *_create_left_layout(Evas_Object *layout)
+{
+ Evas_Object *edit = NULL;
+ Evas_Object *edit_scroller = NULL;
+ Evas_Object *box = NULL;
+
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ edit_info_s *edit_info = NULL;
+ Eina_Bool ret;
+
+ retv_if(!layout, NULL);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ edit = elm_layout_add(layout);
+ retv_if(NULL == edit, NULL);
+
+ edit_info = calloc(1, sizeof(edit_info_s));
+ if (!edit_info) {
+ _E("Cannot calloc for edit_info");
+ free(edit_info);
+ return NULL;
+ }
+ evas_object_data_set(edit, DATA_KEY_EDIT_INFO, edit_info);
+
+ ret = elm_layout_file_set(edit, EDIT_EDJ, EDIT_GROUP);
+ if (EINA_FALSE == ret) {
+ _E("cannot set the file into the layout");
+ free(edit_info);
+ evas_object_del(edit);
+ return NULL;
+ }
+ evas_object_size_hint_weight_set(edit, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(edit, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_resize(edit, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_show(edit);
+
+ layout_del_mouse_cb(layout);
+
+ evas_object_smart_callback_call(layout, LAYOUT_SMART_SIGNAL_EDIT_ON, layout);
+
+ edit_scroller = scroller_create(layout, edit, PAGE_EDIT_WIDTH, PAGE_EDIT_HEIGHT, SCROLLER_INDEX_SINGULAR);
+ if (!edit_scroller) {
+ _E("Cannot create edit_scroller");
+ free(edit_info);
+ evas_object_del(edit);
+ return NULL;
+ }
+ evas_object_smart_callback_add(edit_scroller, "scroll", _edit_scroll_cb, NULL);
+ _add_padding(edit_scroller);
+
+ box = elm_object_content_get(edit_scroller);
+ evas_object_size_hint_align_set(box, 1.0, 0.5);
+
+ elm_object_part_content_set(layout, "edit", edit);
+ elm_object_part_content_set(edit, "scroller", edit_scroller);
+
+ edit_info->layout = layout;
+ edit_info->scroller = edit_scroller;
+
+ layout_info->edit = edit;
+
+ edit_scroller_info = evas_object_data_get(edit_scroller, DATA_KEY_SCROLLER_INFO);
+ if (!edit_scroller_info) {
+ _E("Cannot create scroller");
+ scroller_destroy(layout);
+ free(layout_info);
+ evas_object_del(layout);
+ return NULL;
+ }
+ edit_info->scroller = edit_scroller;
+
+ edit_scroller_info->index[PAGE_DIRECTION_LEFT] = index_create(edit, edit_scroller, PAGE_DIRECTION_LEFT);
+ if (!edit_scroller_info->index[PAGE_DIRECTION_LEFT]) _E("Cannot create the left index");
+ else elm_object_part_content_set(edit, "index", edit_scroller_info->index[PAGE_DIRECTION_LEFT]);
+
+ _scroller_push_left_page(edit, layout_info->scroller);
+
+ return edit;
+}
+
+
+
+HAPI void _destroy_left_layout(Evas_Object *layout)
+{
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *edit_scroller_info = NULL;
+ edit_info_s *edit_info = NULL;
+
+ ret_if(!layout);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+ ret_if(!layout_info->edit);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+
+ edit_scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!edit_scroller_info);
+
+ _scroller_pop_left_page(layout_info->edit);
+ _remove_padding(edit_info->scroller);
+
+ if (edit_scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_destroy(edit_scroller_info->index[PAGE_DIRECTION_LEFT]);
+ }
+
+ scroller_destroy(layout_info->edit);
+
+ layout_add_mouse_cb(layout);
+
+ free(edit_info);
+ evas_object_data_del(layout_info->edit, DATA_KEY_EDIT_INFO);
+ evas_object_del(layout_info->edit);
+ layout_info->edit = NULL;
+
+ evas_object_smart_callback_call(layout, LAYOUT_SMART_SIGNAL_EDIT_OFF, layout);
+}
+
+
+
+static key_cb_ret_e _edit_back_key_cb(void *data)
+{
+ _W("");
+ Evas_Object *layout = data;
+ Evas_Object *effect_page = NULL;
+ Evas_Object *proxy_page = NULL;
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ retv_if(!layout, KEY_CB_RET_CONTINUE);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, KEY_CB_RET_CONTINUE);
+
+ if (!layout_info->edit) {
+ _D("Layout is not edited");
+ return KEY_CB_RET_CONTINUE;
+ }
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ goto_if(!edit_info, OUT);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ goto_if(!scroller_info, OUT);
+
+ proxy_page = scroller_get_focused_page(edit_info->scroller);
+ if (!proxy_page) goto OUT;
+ if (evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_EDIT_DO_NOT_SUPPORT_ENLARGE_EFFECT)) goto OUT;
+
+ effect_page = edit_create_enlarge_effect_page(proxy_page);
+ if (effect_page) edit_enlarge_effect_page(effect_page);
+ else goto OUT;
+
+ return KEY_CB_RET_STOP;
+
+OUT:
+ if (!scroller_get_right_page(edit_info->scroller, proxy_page)) {
+ Evas_Object *real_page = NULL;
+ int i = 0;
+
+ _D("The proxy page(%p) does not have the right neighbor.", proxy_page);
+
+ elm_scroller_last_page_get(layout_info->scroller, &i, NULL);
+ real_page = scroller_get_page_at(layout_info->scroller, i);
+ if (real_page) {
+ _D("The last real page is (%p)", real_page);
+ scroller_region_show_page(layout_info->scroller, real_page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT);
+ if (scroller_info->plus_page == real_page) {
+ _D("The last page is the plus page");
+ page_info = evas_object_data_get(real_page, DATA_KEY_PAGE_INFO);
+ if (page_info->item) elm_object_signal_emit(page_info->item, "show,widget,ani", "plus_item");
+ elm_object_signal_emit(page_info->page_inner, "deselect", "line");
+ }
+ }
+ }
+ edit_destroy_layout(layout);
+ return KEY_CB_RET_STOP;
+}
+
+
+
+static key_cb_ret_e _edit_home_key_cb(void *data)
+{
+ Evas_Object *layout = data;
+ Evas_Object *effect_page = NULL;
+ Evas_Object *proxy_page = NULL;
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+
+ retv_if(!layout, KEY_CB_RET_CONTINUE);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, KEY_CB_RET_CONTINUE);
+
+ if (!layout_info->edit) {
+ _D("Layout is not edited");
+ return KEY_CB_RET_CONTINUE;
+ }
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ goto_if(!edit_info, OUT);
+
+ if (evas_object_data_get(edit_info->scroller, PRIVATE_DATA_KEY_EDIT_IS_LONGPRESSED)) return KEY_CB_RET_STOP;
+
+ proxy_page = scroller_get_focused_page(edit_info->scroller);
+ if (!proxy_page) goto OUT;
+ if (evas_object_data_get(proxy_page, PRIVATE_DATA_KEY_EDIT_DO_NOT_SUPPORT_ENLARGE_EFFECT)) goto OUT;
+
+ effect_page = edit_create_enlarge_effect_page(proxy_page);
+ if (effect_page) edit_enlarge_effect_page(effect_page);
+ else goto OUT;
+
+ return KEY_CB_RET_STOP;
+
+OUT:
+ edit_destroy_layout(layout);
+ return KEY_CB_RET_CONTINUE;
+}
+
+
+
+static void _destroy_proxy_bg(Evas_Object *clip_bg)
+{
+ Evas_Object *proxy_bg = NULL;
+
+ proxy_bg = evas_object_data_del(clip_bg, PRIVATE_DATA_KEY_PROXY_BG);
+ if(proxy_bg) evas_object_del(proxy_bg);
+ evas_object_del(clip_bg);
+}
+
+
+
+static Evas_Object *_create_proxy_bg(Evas_Object *item)
+{
+ Evas_Object *bg = NULL;
+ Evas_Object *clip_bg = NULL;
+ Evas_Object *proxy_bg = NULL;
+ Eina_Bool ret;
+ int x, y, w, h;
+
+ clip_bg = evas_object_rectangle_add(main_get_info()->e);
+ retv_if(!clip_bg, NULL);
+
+ evas_object_geometry_get(item, &x, &y, &w, &h);
+ evas_object_resize(clip_bg, w, h);
+ evas_object_move(clip_bg, x, y);
+ evas_object_color_set(clip_bg, 255, 255, 255, 255);
+ evas_object_show(clip_bg);
+
+ bg = evas_object_data_get(main_get_info()->win, DATA_KEY_BG);
+ goto_if(!bg, ERROR);
+
+ proxy_bg = evas_object_image_filled_add(main_get_info()->e);
+ goto_if(!proxy_bg, ERROR);
+
+ evas_object_data_set(clip_bg, PRIVATE_DATA_KEY_PROXY_BG, proxy_bg);
+
+ ret = evas_object_image_source_set(proxy_bg, bg);
+ goto_if(EINA_FALSE == ret, ERROR);
+ evas_object_image_source_visible_set(proxy_bg, EINA_TRUE);
+ evas_object_image_source_clip_set(proxy_bg, EINA_FALSE);
+ evas_object_resize(proxy_bg, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_move(proxy_bg, 0, 0);
+ evas_object_show(proxy_bg);
+
+ evas_object_clip_set(proxy_bg, clip_bg);
+
+ return clip_bg;
+
+ERROR:
+ _destroy_proxy_bg(clip_bg);
+ return NULL;
+}
+
+
+
+static w_home_error_e _lang_changed_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ char max_text[TEXT_LEN] = {0, };
+ char *count_str = NULL;
+
+ retv_if(!scroller, W_HOME_ERROR_FAIL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ page_info = evas_object_data_get(scroller_info->plus_page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, W_HOME_ERROR_FAIL);
+
+ count_str = edit_get_count_str_from_icu(MAX_DBOX);
+ if (!count_str) {
+ _E("count_str is NULL");
+ count_str = calloc(1, LOCALE_LEN);
+ retv_if(!count_str, W_HOME_ERROR_FAIL);
+ snprintf(count_str, LOCALE_LEN, "%d", MAX_DBOX);
+ }
+
+ snprintf(max_text
+ , sizeof(max_text)
+ , _("IDS_HS_BODY_THE_MAXIMUM_NUMBER_OF_WIDGETS_HPD_HAS_BEEN_REACHED_DELETE_SOME_WIDGETS_AND_TRY_AGAIN_ABB")
+ , count_str);
+ elm_object_part_text_set(page_info->item, "max_text", max_text);
+ free(count_str);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI Evas_Object *edit_create_layout(Evas_Object *layout, edit_mode_e edit_mode)
+{
+ Evas_Object *edit = NULL;
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+
+ retv_if(!layout, NULL);
+
+ _W("Create the edit layout");
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ if (W_HOME_ERROR_NONE != key_register_cb(KEY_TYPE_BACK, _edit_back_key_cb, layout)) {
+ _E("Cannot register the key callback");
+ }
+
+ if (W_HOME_ERROR_NONE != key_register_cb(KEY_TYPE_HOME, _edit_home_key_cb, layout)) {
+ _E("Cannot register the key callback");
+ }
+#if 0
+ if (W_HOME_ERROR_NONE != gesture_register_cb(BEZEL_DOWN, _edit_bezel_down_cb, layout)) {
+ _E("Cannot register the gesture callback");
+ }
+#endif
+
+ switch (edit_mode) {
+ case EDIT_MODE_LEFT:
+ edit = _create_left_layout(layout);
+ break;
+ case EDIT_MODE_CENTER:
+ break;
+ case EDIT_MODE_RIGHT:
+ edit = _create_right_layout(layout);
+ break;
+ default:
+ _E("Cannot reach here");
+ break;
+ }
+ elm_object_signal_emit(layout, "show", "edit");
+ elm_object_signal_emit(edit, "init", "edit");
+ elm_object_signal_emit(layout, "hide", "scroller");
+
+ evas_object_data_set(layout, DATA_KEY_EDIT_MODE, (void *) edit_mode);
+ layout_info->edit = edit;
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ if (edit_info && edit_info->scroller) {
+ scroller_focus(edit_info->scroller);
+ main_register_cb(APP_STATE_LANGUAGE_CHANGED, _lang_changed_cb, edit_info->scroller);
+ } else _E("Cannot get the edit_info & edit_info->scroller");
+
+ elm_object_tree_focus_allow_set(layout_info->scroller, EINA_FALSE);
+ /* If you want to set the EINA_TRUE in this API,
+ you have to control the tree focus set when using content_set or content_unset API
+ in the layout that elm_object_tree_focus_allow_set is EINA_TRUE*/
+ elm_object_tree_focus_allow_set(layout_info->edit, EINA_FALSE);
+
+ return edit;
+}
+
+
+
+HAPI void edit_destroy_layout(void *layout)
+{
+ Evas_Object *current_page = NULL;
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ edit_mode_e edit_mode = (int) evas_object_data_del(layout, DATA_KEY_EDIT_MODE);
+
+ ret_if(!layout);
+
+ main_unregister_cb(APP_STATE_LANGUAGE_CHANGED, _lang_changed_cb);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+ ret_if(!layout_info->edit);
+
+ key_unregister_cb(KEY_TYPE_BACK, _edit_back_key_cb);
+ key_unregister_cb(KEY_TYPE_HOME, _edit_home_key_cb);
+#if 0
+ gesture_unregister_cb(BEZEL_DOWN, _edit_bezel_down_cb);
+#endif
+
+ elm_object_tree_focus_allow_set(layout_info->scroller, EINA_TRUE);
+ elm_object_tree_focus_allow_set(layout_info->edit, EINA_FALSE);
+
+ _D("Destroy the edit layout : %d", edit_mode);
+
+ switch (edit_mode) {
+ case EDIT_MODE_LEFT:
+ _destroy_left_layout(layout);
+ break;
+ case EDIT_MODE_CENTER:
+ break;
+ case EDIT_MODE_RIGHT:
+ _destroy_right_layout(layout);
+ break;
+ default:
+ _E("Cannot reach here");
+ break;
+ }
+
+ layout_info->edit = NULL;
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ current_page = scroller_get_focused_page(layout_info->scroller);
+ ret_if(!current_page);
+
+ if (scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_LEFT], layout_info->scroller, INDEX_BRING_IN_NONE);
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_LEFT], current_page);
+ }
+
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_RIGHT], layout_info->scroller, INDEX_BRING_IN_NONE);
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_RIGHT], current_page);
+ }
+
+ elm_object_signal_emit(layout, "hide", "edit");
+ elm_object_signal_emit(layout, "show", "scroller");
+}
+
+
+
+static Eina_Bool _minify_page_anim_cb(void *data)
+{
+ Evas_Object *effect_page = data;
+ Evas_Object *end_page = NULL;
+ Evas_Object *page_inner = NULL;
+
+ page_info_s *end_page_info = NULL;
+
+ int cur_x, cur_y, cur_w, cur_h;
+ int end_x, end_y, end_w, end_h;
+ int vec_x, vec_y, vec_w, vec_h;
+ int divide_factor;
+
+ retv_if(!effect_page, ECORE_CALLBACK_CANCEL);
+
+ end_page = evas_object_data_get(effect_page, DATA_KEY_PROXY_PAGE);
+ retv_if(!end_page, ECORE_CALLBACK_CANCEL);
+
+ end_page_info = evas_object_data_get(end_page, DATA_KEY_PAGE_INFO);
+ goto_if(!end_page_info, ERROR);
+
+ page_inner = end_page_info->page_inner;
+ goto_if(!page_inner, ERROR);
+
+ evas_object_geometry_get(page_inner, &end_x, &end_y, &end_w, &end_h);
+ evas_object_geometry_get(effect_page, &cur_x, &cur_y, &cur_w, &cur_h);
+
+ divide_factor = (int) evas_object_data_get(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR);
+ if (divide_factor > 2) {
+ evas_object_data_set(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR, (void *) divide_factor - 1);
+ }
+
+ vec_x = (end_x - cur_x) / divide_factor;
+ vec_y = (end_y - cur_y) / divide_factor;
+ vec_w = (end_w - cur_w) / divide_factor;
+ vec_h = (end_h - cur_h) / divide_factor;
+
+ if (!vec_x) vec_x = 1;
+ if (!vec_y) vec_y = 1;
+ if (!vec_w) vec_w = -1;
+ if (!vec_h) vec_h = -1;
+
+ cur_x += vec_x;
+ cur_y += vec_y;
+ cur_w += vec_w;
+ cur_h += vec_h;
+
+ if (cur_x > end_x) cur_x = end_x;
+ if (cur_y > end_y) cur_y = end_y;
+ if (cur_w < end_w) cur_w = end_w;
+ if (cur_h < end_h) cur_h = end_h;
+
+ if (cur_x >= end_x) {
+ evas_object_data_del(effect_page, PRIVATE_DATA_KEY_ANIM_FOR_MINIFY);
+ evas_object_data_del(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR);
+ edit_destroy_minify_effect_page(effect_page);
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ evas_object_move(effect_page, cur_x, cur_y);
+ evas_object_resize(effect_page, cur_w, cur_h);
+
+ return ECORE_CALLBACK_RENEW;
+
+ERROR:
+ _E("Critical! Effect page will be removed.");
+ evas_object_del(effect_page);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Eina_Bool _enlarge_page_anim_cb(void *data)
+{
+ Evas_Object *effect_page = data;
+ Evas_Object *bg_rect = NULL;
+ Evas_Object *layout = NULL;
+ Evas_Object *real_page = NULL;
+ page_info_s *page_info = NULL;
+ layout_info_s *layout_info = NULL;
+
+ int cur_x, cur_y, cur_w, cur_h;
+ int end_x, end_y, end_w, end_h;
+ int vec_x, vec_y, vec_w, vec_h;
+ int divide_factor;
+ double rel;
+
+ retv_if(!effect_page, ECORE_CALLBACK_CANCEL);
+
+ layout = main_get_info()->layout;
+ retv_if(!layout, ECORE_CALLBACK_CANCEL);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, ECORE_CALLBACK_CANCEL);
+ retv_if(!layout_info->scroller, ECORE_CALLBACK_CANCEL);
+
+ bg_rect = evas_object_data_get(effect_page, DATA_KEY_BG);
+ goto_if(!bg_rect, OUT);
+
+ real_page = evas_object_data_get(effect_page, DATA_KEY_REAL_PAGE);
+ goto_if(!real_page, OUT);
+
+ page_info = evas_object_data_get(real_page, DATA_KEY_PAGE_INFO);
+ goto_if(!page_info, OUT);
+
+ rel = (double) main_get_info()->root_w / ITEM_EDIT_WIDTH;
+ end_w = PAGE_EDIT_WIDTH * rel;
+ end_h = PAGE_EDIT_HEIGHT * rel;
+
+ end_x = (end_w - main_get_info()->root_w) / -2;
+ end_y = (end_h - main_get_info()->root_h) / -2;
+
+ evas_object_geometry_get(effect_page, &cur_x, &cur_y, &cur_w, &cur_h);
+
+ divide_factor = (int) evas_object_data_get(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR);
+ if (divide_factor > 1) {
+ evas_object_data_set(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR, (void *) divide_factor - 1);
+ }
+
+ vec_x = (end_x - cur_x) / divide_factor;
+ vec_y = (end_y - cur_y) / divide_factor;
+ vec_w = (end_w - cur_w) / divide_factor;
+ vec_h = (end_h - cur_h) / divide_factor;
+
+ if (!vec_x) vec_x = -1;
+ if (!vec_y) vec_y = -1;
+ if (!vec_w) vec_w = 1;
+ if (!vec_h) vec_h = 1;
+
+ cur_x += vec_x;
+ cur_y += vec_y;
+ cur_w += vec_w;
+ cur_h += vec_h;
+
+ if (cur_x < end_x) {
+ goto OUT;
+ }
+
+ evas_object_move(effect_page, cur_x, cur_y);
+ evas_object_resize(effect_page, cur_w, cur_h);
+ evas_object_move(bg_rect, cur_x, cur_y);
+ evas_object_resize(bg_rect, cur_w, cur_h);
+
+ return ECORE_CALLBACK_RENEW;
+
+OUT:
+ evas_object_data_del(effect_page, PRIVATE_DATA_KEY_ANIM_FOR_ENLARGE);
+ evas_object_data_del(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR);
+
+ edit_destroy_layout(layout);
+ /* Layout has to be updated before after destroying the layout */
+ edje_object_message_signal_process(elm_layout_edje_get(layout));
+ edit_destroy_enlarge_effect_page(effect_page);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void edit_minify_effect_page(void *effect_page)
+{
+ Ecore_Animator *anim = NULL;
+
+ ret_if(!effect_page);
+
+ anim = evas_object_data_get(effect_page, PRIVATE_DATA_KEY_ANIM_FOR_MINIFY);
+ if (anim) {
+ _D("You've already an animator");
+ return;
+ }
+
+ anim = ecore_animator_add(_minify_page_anim_cb, effect_page);
+ if (anim) {
+ evas_object_data_set(effect_page, PRIVATE_DATA_KEY_ANIM_FOR_MINIFY, anim);
+ evas_object_data_set(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR, (void *) DIVIDE_FACTOR);
+ } else {
+ edit_destroy_minify_effect_page(effect_page);
+ }
+}
+
+
+
+HAPI Evas_Object *edit_create_minify_effect_page(Evas_Object *page)
+{
+ Evas_Object *effect_page = NULL;
+ page_info_s *page_info = NULL;
+ Eina_Bool ret;
+ double rel;
+ int width, height, x, y;
+
+ retv_if(!page, NULL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ if (page_info->removable) {
+ elm_object_signal_emit(page_info->page_inner, "hide", "del");
+ }
+
+ elm_object_signal_emit(page_info->page_inner, "deselect", "cover");
+ elm_object_signal_emit(page_info->page_inner, "deselect", "cover_clipper");
+ elm_object_signal_emit(page_info->page_inner, "deselect", "line");
+ edje_object_message_signal_process(elm_layout_edje_get(page_info->page_inner));
+
+ if (evas_object_data_get(page, PRIVATE_DATA_KEY_EDIT_UNFOCUSABLE)) {
+ elm_object_signal_emit(page_info->page_inner, "disable", "cover");
+ elm_object_signal_emit(page_info->page_inner, "deselect", "line");
+ } else {
+ elm_object_signal_emit(page_info->page_inner, "select", "cover");
+ elm_object_signal_emit(page_info->page_inner, "select", "line");
+ }
+ elm_object_signal_emit(page_info->page_inner, "select", "cover_clipper");
+ scroller_disable_cover_on_scroll(page_info->scroller);
+
+ effect_page = evas_object_image_filled_add(main_get_info()->e);
+ retv_if(!effect_page, NULL);
+
+ ret = evas_object_image_source_set(effect_page, page);
+ if (EINA_FALSE == ret) {
+ _E("Cannot set the source into the proxy image");
+ evas_object_del(effect_page);
+ return NULL;
+ }
+ evas_object_image_source_visible_set(effect_page, EINA_FALSE);
+ evas_object_image_source_clip_set(effect_page, EINA_FALSE);
+
+ rel = (double) main_get_info()->root_w / ITEM_EDIT_WIDTH;
+ width = PAGE_EDIT_WIDTH * rel;
+ height = PAGE_EDIT_HEIGHT * rel;
+
+ x = (width - main_get_info()->root_w) / -2;
+ y = (height - main_get_info()->root_h) / -2;
+
+ evas_object_size_hint_min_set(effect_page, width, height);
+ evas_object_resize(effect_page, width, height);
+ evas_object_move(effect_page, x, y);
+ evas_object_show(effect_page);
+
+ evas_object_data_set(effect_page, DATA_KEY_PROXY_PAGE, page);
+
+ return effect_page;
+
+}
+
+
+
+HAPI void edit_destroy_minify_effect_page(Evas_Object *effect_page)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *page_current = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!effect_page);
+
+ page = evas_object_data_del(effect_page, DATA_KEY_PROXY_PAGE);
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ scroller_enable_cover_on_scroll(page_info->scroller);
+
+ if (page_info->removable) {
+ elm_object_signal_emit(page_info->page_inner, "show", "del");
+ }
+
+ evas_object_image_source_visible_set(effect_page, EINA_TRUE);
+ evas_object_del(effect_page);
+
+ page_current = scroller_get_focused_page(page_info->scroller);
+ ret_if(!page_current);
+ edit_change_focus(page_info->scroller, page_current);
+}
+
+
+
+HAPI void edit_enlarge_effect_page(void *effect_page)
+{
+ Evas_Object *real_page = NULL;
+ layout_info_s *layout_info = NULL;
+ page_info_s *page_info = NULL;
+ Ecore_Animator *anim = NULL;
+
+ ret_if(!effect_page);
+
+ real_page = evas_object_data_get(effect_page, DATA_KEY_REAL_PAGE);
+ goto_if(!real_page, ERROR);
+
+ page_info = evas_object_data_get(real_page, DATA_KEY_PAGE_INFO);
+ goto_if(!page_info, ERROR);
+ goto_if(!page_info->layout, ERROR);
+
+ layout_info = evas_object_data_get(page_info->layout, DATA_KEY_LAYOUT_INFO);
+ goto_if(!layout_info, ERROR);
+ goto_if(!layout_info->scroller, ERROR);
+
+ anim = evas_object_data_get(effect_page, PRIVATE_DATA_KEY_ANIM_FOR_ENLARGE);
+ if (anim) {
+ _D("You've already an animator");
+ return;
+ }
+
+ anim = ecore_animator_add(_enlarge_page_anim_cb, effect_page);
+ if (anim) {
+ evas_object_data_set(effect_page, PRIVATE_DATA_KEY_ANIM_FOR_ENLARGE, anim);
+ evas_object_data_set(effect_page, PRIVATE_DATA_KEY_DIVIDE_FACTOR, (void *) DIVIDE_FACTOR);
+ } else {
+ edit_destroy_enlarge_effect_page(effect_page);
+ }
+
+ if (real_page) {
+ scroller_region_show_page(layout_info->scroller, real_page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT);
+ }
+ edje_object_message_signal_process(elm_layout_edje_get(page_info->layout));
+
+ return;
+
+ERROR:
+ _E("Destroy the effect page(%p)", effect_page);
+ edit_destroy_enlarge_effect_page(effect_page);
+}
+
+
+
+HAPI Evas_Object *edit_create_enlarge_effect_page(Evas_Object *page)
+{
+ Evas_Object *clip_bg = NULL;
+ Evas_Object *effect_page = NULL;
+ Evas_Object *real_page = NULL;
+ page_info_s *page_info = NULL;
+ layout_info_s *layout_info = NULL;
+ Eina_Bool ret;
+ int x, y, w, h;
+
+ retv_if(!page, NULL);
+
+ if (main_get_info()->layout) {
+ layout_info = evas_object_data_get(main_get_info()->layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+ if (layout_info->edit) elm_object_signal_emit(layout_info->edit, "hide", "edit");
+ }
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ real_page = evas_object_data_get(page, DATA_KEY_REAL_PAGE);
+ retv_if(!real_page, NULL);
+
+ if (page_info->removable) {
+ elm_object_signal_emit(page_info->page_inner, "hide", "del");
+ }
+
+ elm_object_signal_emit(page_info->page_inner, "deselect", "cover");
+ elm_object_signal_emit(page_info->page_inner, "deselect", "cover_clipper");
+ elm_object_signal_emit(page_info->page_inner, "deselect,im", "line");
+ edje_object_message_signal_process(elm_layout_edje_get(page_info->page_inner));
+
+ clip_bg = _create_proxy_bg(page_info->item);
+ retv_if(!clip_bg, NULL);
+
+ effect_page = evas_object_image_filled_add(main_get_info()->e);
+ if (!effect_page) {
+ _E("Cannot add effect page");
+ _destroy_proxy_bg(clip_bg);
+ return NULL;
+ }
+
+ evas_object_data_set(effect_page, DATA_KEY_REAL_PAGE, real_page);
+ evas_object_data_set(effect_page, DATA_KEY_BG, clip_bg);
+
+ ret = evas_object_image_source_set(effect_page, page_info->page_inner);
+ if (EINA_FALSE == ret) {
+ _E("Cannot set the source into the effect image");
+ edit_destroy_enlarge_effect_page(effect_page);
+ return NULL;
+ }
+ evas_object_image_source_visible_set(effect_page, EINA_FALSE);
+ evas_object_image_source_clip_set(effect_page, EINA_FALSE);
+
+ evas_object_geometry_get(page, &x, &y, &w, &h);
+
+ evas_object_resize(effect_page, w, h);
+ evas_object_move(effect_page, x, y);
+ evas_object_show(effect_page);
+
+ return effect_page;
+}
+
+
+
+HAPI void edit_destroy_enlarge_effect_page(Evas_Object *effect_page)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *clip_bg = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!effect_page);
+
+ clip_bg = evas_object_data_del(effect_page, DATA_KEY_BG);
+ if (clip_bg) _destroy_proxy_bg(clip_bg);
+
+ page = evas_object_data_del(effect_page, DATA_KEY_REAL_PAGE);
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ evas_object_image_source_visible_set(effect_page, EINA_TRUE);
+ evas_object_del(effect_page);
+}
+
+
+
+static Evas_Object *_create_refresh_left_page(Evas_Object *edit, Evas_Object *page)
+{
+ Evas_Object *proxy_page = NULL;
+ page_info_s *proxy_page_info = NULL;
+ edit_info_s *edit_info = NULL;
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!page, NULL);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ retv_if(!edit_info, NULL);
+
+ layout_info = evas_object_data_get(edit_info->layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ proxy_page = edit_create_proxy_page(edit_info->scroller, page, PAGE_CHANGEABLE_BG_OFF);
+ retv_if(!proxy_page, NULL);
+
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_EDIT_DISABLE_REORDERING, (void *) 1);
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ goto_if(!proxy_page_info, ERROR);
+
+ if (scroller_info->center_neighbor_left == page) {
+ evas_object_data_set(proxy_page, PRIVATE_DATA_KEY_EDIT_UNFOCUSABLE, (void *) 1);
+ elm_object_signal_emit(proxy_page_info->page_inner, "disable", "cover");
+ elm_object_signal_emit(proxy_page_info->page_inner, "select", "cover_clipper");
+ }
+
+ elm_access_info_cb_set(proxy_page_info->focus, ELM_ACCESS_CONTEXT_INFO, _access_tab_to_move_cb, NULL);
+
+ evas_object_smart_callback_add(proxy_page_info->focus, "clicked", _clicked_noti_cb, proxy_page);
+ evas_object_smart_callback_add(proxy_page_info->remove_focus, "clicked", _del_noti_cb, proxy_page);
+
+ proxy_page_info->direction = PAGE_DIRECTION_LEFT;
+
+ return proxy_page;
+
+ERROR:
+ if (proxy_page) {
+ edit_destroy_proxy_page(proxy_page);
+ }
+ return NULL;
+}
+
+
+
+static Evas_Object *_create_refresh_right_page(Evas_Object *edit, Evas_Object *page)
+{
+ Evas_Object *proxy_page = NULL;
+ page_info_s *proxy_page_info = NULL;
+ edit_info_s *edit_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(edit, NULL);
+ retv_if(page, NULL);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ retv_if(!edit_info, NULL);
+
+ scroller_info = evas_object_data_get(edit_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ proxy_page = edit_create_proxy_page(edit_info->scroller, page, PAGE_CHANGEABLE_BG_ON);
+ retv_if(!proxy_page, NULL);
+
+ proxy_page_info = evas_object_data_get(proxy_page, DATA_KEY_PAGE_INFO);
+ goto_if(!proxy_page_info, ERROR);
+
+ evas_object_smart_callback_add(proxy_page_info->focus, "clicked", _clicked_dbox_cb, proxy_page);
+ evas_object_smart_callback_add(proxy_page_info->remove_focus, "clicked", _del_dbox_cb, proxy_page);
+
+ proxy_page_info->direction = PAGE_DIRECTION_RIGHT;
+
+ return proxy_page;
+
+ERROR:
+ if (proxy_page) {
+ edit_destroy_proxy_page(proxy_page);
+ }
+ return NULL;
+}
+
+
+
+HAPI void edit_refresh_scroller(Evas_Object *edit, page_direction_e direction)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *proxy_page = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ edit_info_s *edit_info = NULL;
+ layout_info_s *layout_info = NULL;
+ page_info_s *page_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!edit);
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+
+ layout_info = evas_object_data_get(edit_info->layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ /*Add proxy page which didn't exist in eidt scroller list*/
+ switch (direction) {
+ case PAGE_DIRECTION_LEFT:
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+ if (page_info->direction != PAGE_DIRECTION_LEFT) continue;
+ proxy_page = evas_object_data_get(page, DATA_KEY_PROXY_PAGE);
+ if (!proxy_page) {
+ proxy_page = _create_refresh_left_page(edit, page);
+ break_if(!proxy_page);
+ } else scroller_pop_page(edit_info->scroller, proxy_page);
+ scroller_push_page(edit_info->scroller, proxy_page, SCROLLER_PUSH_TYPE_CENTER_LEFT);
+ }
+ break;
+ case PAGE_DIRECTION_RIGHT:
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+ if (page_info->direction != PAGE_DIRECTION_RIGHT) continue;
+ proxy_page = evas_object_data_get(page, DATA_KEY_PROXY_PAGE);
+ if (!proxy_page) {
+ proxy_page = _create_refresh_right_page(edit, page);
+ break_if(!proxy_page);
+ if (edit_info->plus_page) {
+ scroller_push_page_before(edit_info->scroller, proxy_page, edit_info->plus_page);
+ } else {
+ scroller_push_page_before(edit_info->scroller, proxy_page, NULL);
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ eina_list_free(list);
+}
+
+
+
+HAPI void edit_arrange_plus_page(Evas_Object *edit)
+{
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+ page_info_s *page_info = NULL;
+ int count = 0;
+
+ ret_if(!edit);
+
+ _D("Arrange the plus page");
+
+ edit_info = evas_object_data_get(edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+ ret_if(!edit_info->plus_page);
+ ret_if(!edit_info->scroller);
+
+ page_info = evas_object_data_get(edit_info->plus_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ count = scroller_count_direction(edit_info->scroller, PAGE_DIRECTION_RIGHT);
+ if (count > MAX_DBOX) {
+ _D("Diable the plus page, count:%d", count);
+
+ elm_object_signal_callback_del(page_info->item, "click", "plus_item", _plus_item_clicked_cb);
+ elm_object_signal_callback_del(page_info->item, "down", "plus_item", _plus_item_down_cb);
+ elm_object_signal_callback_del(page_info->item, "up", "plus_item", _plus_item_up_cb);
+
+ elm_object_signal_emit(page_info->item, "max", "plus_in_edit");
+ elm_object_focus_allow_set(page_info->focus, EINA_FALSE);
+
+ edit_info->is_max = 1;
+ } else {
+ _D("Enable the plus page, count:%d", count);
+
+ ret_if(!edit_info->layout);
+ layout_info = evas_object_data_get(edit_info->layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ /* Callbacks could be added infinitely */
+ if (edit_info->is_max) {
+ elm_object_signal_callback_add(page_info->item, "click", "plus_item", _plus_item_clicked_cb, layout_info);
+ elm_object_signal_callback_add(page_info->item, "down", "plus_item", _plus_item_down_cb, edit_info->plus_page);
+ elm_object_signal_callback_add(page_info->item, "up", "plus_item", _plus_item_up_cb, edit_info->plus_page);
+
+ edit_info->is_max = 0;
+ }
+
+ elm_object_signal_emit(page_info->item, "no_max", "plus_in_edit");
+ elm_object_focus_allow_set(page_info->focus, EINA_TRUE);
+ }
+}
+
+
+
+// End of this file
diff --git a/home/src/effect.c b/home/src/effect.c
new file mode 100755
index 0000000..23da4a4
--- /dev/null
+++ b/home/src/effect.c
@@ -0,0 +1,120 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <feedback.h>
+#include <vconf.h>
+#include <Evas.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "effect.h"
+
+
+static struct {
+ int sound_status;
+ int is_feedback_initialized;
+} effect_info = {
+ .sound_status = 0,
+ .is_feedback_initialized = 0,
+};
+
+
+
+HAPI inline void effect_set_sound_status(int status)
+{
+ effect_info.sound_status = status;
+}
+
+
+
+HAPI inline int effect_get_sound_status(void)
+{
+ return effect_info.sound_status;
+}
+
+
+
+HAPI w_home_error_e effect_init(void)
+{
+ retv_if(1 == effect_info.is_feedback_initialized, W_HOME_ERROR_NONE);
+ retv_if(0 != feedback_initialize(), W_HOME_ERROR_FAIL);
+ retv_if(vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &effect_info.sound_status) < 0, W_HOME_ERROR_FAIL);
+
+ effect_info.is_feedback_initialized = 1;
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI void effect_fini(void)
+{
+ ret_if(0 == effect_info.is_feedback_initialized);
+ ret_if(0 != feedback_deinitialize());
+
+ effect_info.is_feedback_initialized = 0;
+}
+
+
+
+HAPI void effect_play_sound(void)
+{
+ int state = main_get_info()->state;
+
+ if (APP_STATE_PAUSE == state)
+ {
+ _D("Do not play sound");
+ return;
+ }
+
+ if (effect_info.is_feedback_initialized == 0) {
+ effect_init();
+ }
+
+ ret_if(vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &effect_info.sound_status) < 0);
+
+ if (effect_info.sound_status) {
+ feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TOUCH_TAP);
+ }
+}
+
+
+
+HAPI void effect_play_vibration(void)
+{
+ int state = main_get_info()->state;
+
+ if (APP_STATE_PAUSE == state)
+ {
+ _D("Do not play vibration");
+ return;
+ }
+
+ if (effect_info.is_feedback_initialized == 0) {
+ effect_init();
+ }
+
+ feedback_play_type(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_HOLD);
+}
+
+
+
+// End of a file
diff --git a/home/src/gesture.c b/home/src/gesture.c
new file mode 100755
index 0000000..3b05962
--- /dev/null
+++ b/home/src/gesture.c
@@ -0,0 +1,293 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Evas.h>
+#include <stdio.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+#include <Ecore.h>
+#include <Ecore_X.h>
+#include <Ecore_Evas.h>
+#include <Elementary.h>
+#include <utilX.h>
+#include <dd-display.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "util.h"
+#include "main.h"
+#include "log.h"
+#include "gesture.h"
+#include "effect.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "layout.h"
+#include "layout_info.h"
+#include "tutorial.h"
+#include "dbus.h"
+#include "apps/apps_main.h"
+
+#define LCD_ON_REASON_GESTURE "gesture"
+#define VCONFKEY_SIMPLE_CLOCK_STATUS "db/setting/simpleclock_mode"
+#define VCONFKEY_RESERVED_APPS_STATUS "memory/starter/reserved_apps_status"
+
+#define CB_LIST_MAX 3
+
+static Eina_List *cbs_list[CB_LIST_MAX];
+
+typedef struct {
+ void (*result_cb)(void *);
+ void *result_data;
+} gesture_cb_s;
+
+static struct _s_info {
+ int option_wristup;
+ int is_win_effect_enabled;
+ int is_win_effect_id;
+} s_info = {
+ .option_wristup = 0,
+ .is_win_effect_enabled = 1,
+ .is_win_effect_id = -1,
+};
+
+static Evas_Object *_layout_get(void) {
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ }
+
+ return layout;
+}
+
+static Evas_Object *_scroller_get(void) {
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ if (layout != NULL) {
+ scroller = elm_object_part_content_get(layout, "scroller");
+ }
+ }
+
+ return scroller;
+}
+
+static Eina_Bool _apps_hide_idler_cb(void *data)
+{
+ apps_main_launch(APPS_LAUNCH_HIDE);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void _clock_show(void)
+{
+ int is_clock_displayed = 0;
+ Eina_Bool is_apps_displayed = (apps_main_is_visible() == EINA_TRUE) ? 1 : 0;
+
+ Evas_Object *scroller = _scroller_get();
+ ret_if(scroller == NULL);
+ Evas_Object *layout = _layout_get();
+ ret_if(layout == NULL);
+
+ if (tutorial_is_exist() == 1) {
+ return ;
+ }
+
+ /* delete edit/addviewer layout */
+ layout_set_idle(layout);
+
+ if (is_clock_displayed == 0) {
+ scroller_bring_in_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT_SHOW);
+ }
+
+ int w, h;
+ Evas *e;
+ Ecore_Evas *ee;
+ Ecore_X_GC gc;
+ unsigned int foreground;
+ ee = ecore_evas_ecore_evas_get(evas_object_evas_get(main_get_info()->win));
+ e = ecore_evas_get(ee);
+ evas_output_viewport_get(e, NULL, NULL, &w, &h);
+ evas_obscured_clear(e);
+ evas_damage_rectangle_add(e, 0, 0, w, h);
+ ecore_evas_manual_render(ee);
+
+ gc = ecore_x_gc_new(0, ECORE_X_GC_VALUE_MASK_FOREGROUND, &foreground);
+ ecore_x_pixmap_paste(elm_win_xwindow_get(main_get_info()->win)
+ , ecore_x_window_root_first_get(), gc, 0, 0, main_get_info()->root_w, main_get_info()->root_h, 0, 0);
+ ecore_x_sync();
+
+#if 0 /* EFL private features */
+ gesture_home_window_effect_set(0);
+#endif
+ elm_win_raise(main_get_info()->win);
+
+ /* hiding apps */
+ if (is_apps_displayed == 1) {
+ _D("need to hide apps");
+ ecore_idler_add(_apps_hide_idler_cb, NULL);
+ }
+}
+
+#define ALPM_MANAGER_STATUS_SHOW "show"
+#define ALPM_MANAGER_STATUS_HIDE "hide"
+static void _alpm_manager_status_changed_cb(void *user_data, void *event_info)
+{
+ char *status = event_info;
+ ret_if(status == NULL);
+
+ _W("alpm status:%s", status);
+
+ if (strcmp(status, ALPM_MANAGER_STATUS_SHOW) == 0) {
+ // do nothing
+ } else if (strcmp(status, ALPM_MANAGER_STATUS_SIMPLE_HIDE) == 0) {
+ _clock_show();
+ _W("clock show");
+ }
+}
+
+#if 0 /* EFL private features */
+void gesture_home_window_effect_set(int is_enable)
+{
+ int id = 0;
+ int xwin;
+ int angle = 0;
+ int size = 0;
+ char *buf = NULL;
+ const char *buf_disable = NULL;
+
+ Evas_Object *win = main_get_info()->win;
+ ret_if(win == NULL);
+
+ int win_w = main_get_info()->root_w;
+ int win_h = main_get_info()->root_h;
+
+ if (is_enable == 1 && s_info.is_win_effect_enabled == 0) {
+ xwin = elm_win_xwindow_get(win);
+ angle = elm_win_rotation_get(win);
+ size = snprintf(NULL, 0, "%x.%d.%d.%d.%d.%d", xwin, angle, 0, win_h, win_w, win_h) + 1;
+
+ buf = (char *)malloc(sizeof(char) * size);
+ if (buf != NULL) {
+ snprintf(buf, size, "%x.%d.%d.%d.%d.%d", xwin, angle, 0, win_h, win_w, win_h);
+
+ if(s_info.is_win_effect_id >= 0)
+ elm_win_aux_hint_del(win, s_info.is_win_effect_id);
+
+ id = elm_win_aux_hint_add(win, "wm.comp.win.effect.launch.pos", buf);
+ if (id != -1) {
+ elm_win_aux_hint_val_set(win, id, buf);
+ _D("window slide-up effect is enabled");
+ s_info.is_win_effect_enabled = 1;
+ s_info.is_win_effect_id = id;
+ }
+ free(buf);
+ } else {
+ _E("failed to create hint ID");
+ }
+ } else if (is_enable == 0 && s_info.is_win_effect_enabled == 1) {
+ if(s_info.is_win_effect_id >= 0)
+ elm_win_aux_hint_del(win, s_info.is_win_effect_id);
+
+ buf_disable = "noeffect";
+ id = elm_win_aux_hint_add(win, "wm.comp.win.effect.launch.pos", buf_disable);
+ if (id != -1) {
+ elm_win_aux_hint_val_set(win, id, buf_disable);
+ _D("window slide-up effect is disabled");
+ s_info.is_win_effect_enabled = 0;
+ s_info.is_win_effect_id = id;
+ }
+ }
+}
+#endif
+
+HAPI int home_gesture_wristup_setting_get(void)
+{
+ return s_info.option_wristup;
+}
+
+HAPI void home_gesture_init(void)
+{
+ if (home_dbus_register_cb(DBUS_EVENT_ALPM_MANAGER_STATE_CHANGED, _alpm_manager_status_changed_cb, NULL) != W_HOME_ERROR_NONE) {
+ _E("Failed to register alpm manager status changed cb");
+ }
+}
+
+HAPI void home_gesture_fini(void)
+{
+ home_dbus_unregister_cb(DBUS_EVENT_ALPM_MANAGER_STATE_CHANGED, _alpm_manager_status_changed_cb);
+}
+
+
+
+HAPI w_home_error_e gesture_register_cb(
+ int mode,
+ void (*result_cb)(void *), void *result_data)
+{
+ retv_if(NULL == result_cb, W_HOME_ERROR_INVALID_PARAMETER);
+
+ gesture_cb_s *cb = calloc(1, sizeof(gesture_cb_s));
+
+ cb->result_cb = result_cb;
+ cb->result_data = result_data;
+
+ cbs_list[mode] = eina_list_append(cbs_list[mode], cb);
+ retv_if(NULL == cbs_list[mode], W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI void gesture_unregister_cb(
+ int mode,
+ void (*result_cb)(void *))
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ gesture_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(cbs_list[mode], l, n, cb) {
+ continue_if(NULL == cb);
+ if (result_cb != cb->result_cb) {
+ continue;
+ }
+ cbs_list[mode] = eina_list_remove(cbs_list[mode], cb);
+ free(cb);
+ return;
+ }
+}
+
+
+
+extern void gesture_execute_cbs(int mode)
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ gesture_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(cbs_list[mode], l, n, cb) {
+ continue_if(n);
+ cb->result_cb(cb->result_data);
+ }
+}
+
+
diff --git a/home/src/index.c b/home/src/index.c
new file mode 100644
index 0000000..ff1377f
--- /dev/null
+++ b/home/src/index.c
@@ -0,0 +1,438 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <efl_assist.h>
+#include <bundle.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout_info.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "index_info.h"
+#include "index.h"
+#include "scroller.h"
+
+
+
+typedef struct {
+ Evas_Object *page;
+ int index;
+} page_index_s;
+
+
+
+HAPI void index_bring_in_page(Evas_Object *index, Evas_Object *page)
+{
+ Elm_Object_Item *idx_it = NULL;
+ const Eina_List *l = NULL;
+ index_info_s *index_info = NULL;
+ page_index_s *page_index = NULL;
+ int idx = 0;
+ int found = 0;
+
+ ret_if(!index);
+ ret_if(!page);
+
+ index_info = evas_object_data_get(index, DATA_KEY_INDEX_INFO);
+ ret_if(!index_info);
+ ret_if(!index_info->page_index_list);
+
+ EINA_LIST_FOREACH(index_info->page_index_list, l, page_index) {
+ if (page_index->page == page) {
+ idx = page_index->index;
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found) {
+ _E("Cannot find a page(%p)", page);
+ return;
+ }
+
+ idx_it = elm_index_item_find(index, (void *) idx);
+ if (idx_it) {
+ elm_index_item_selected_set(idx_it, EINA_TRUE);
+ } else {
+ _E("Critical, the index(%p) cannot find the page(%p:%d)", index, page, idx);
+ }
+}
+
+
+
+HAPI Evas_Object *index_create(Evas_Object *layout, Evas_Object *scroller, page_direction_e direction)
+{
+ Evas_Object *index = NULL;
+ scroller_info_s *scroller_info = NULL;
+ index_info_s *index_info = NULL;
+
+ retv_if(!layout, NULL);
+ retv_if(!scroller, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ index = elm_index_add(layout);
+ retv_if(!index, NULL);
+
+ index_info = calloc(1, sizeof(index_info_s));
+ if (!index_info) {
+ _E("Cannot calloc for index_info");
+ evas_object_del(index);
+ return NULL;
+ }
+ evas_object_data_set(index, DATA_KEY_INDEX_INFO, index_info);
+
+ evas_object_size_hint_weight_set(index, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(index, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ elm_object_theme_set(index, main_get_info()->theme);
+ elm_object_style_set(index, "thumbnail");
+ elm_index_horizontal_set(index, EINA_TRUE);
+ elm_index_autohide_disabled_set(index, EINA_TRUE);
+ elm_index_level_go(index, 0);
+ evas_object_show(index);
+
+ index_info->direction = direction;
+ index_info->layout = layout;
+ index_info->scroller = scroller;
+
+ return index;
+}
+
+
+
+HAPI void index_destroy(Evas_Object *index)
+{
+ index_info_s *index_info = NULL;
+ page_index_s *page_index = NULL;
+
+ ret_if(!index);
+
+ index_info = evas_object_data_del(index, DATA_KEY_INDEX_INFO);
+ ret_if(!index_info);
+
+ if (index_info->page_index_list) {
+ EINA_LIST_FREE(index_info->page_index_list, page_index) {
+ free(page_index);
+ }
+ index_info->page_index_list = NULL;
+ }
+
+ free(index_info);
+ elm_index_item_clear(index);
+ evas_object_del(index);
+}
+
+
+
+#define MAX_INDEX_NUMBER 17
+static void _update_left(Evas_Object *scroller, Evas_Object *index, const Eina_List *list)
+{
+ Evas_Object *page = NULL;
+ Elm_Object_Item *idx_it = NULL;
+ Eina_List *reverse_list = NULL;
+ const Eina_List *l = NULL;
+
+ index_info_s *index_info = NULL;
+ page_info_s *page_info = NULL;
+ page_index_s *page_index = NULL;
+ page_direction_e before_direction = PAGE_DIRECTION_LEFT;
+
+ int extra_idx = 0, page_index_inserting = 0;
+ int center_inserted = 0, other_inserted = 0, cur_inserted = 0;
+ int center_count = 0, other_count = 0, cur_count = 0;
+ int cur_mid_idx = 0;
+ int total_count = 0, total_inserted = 0;
+
+ ret_if(!index);
+ ret_if(!list);
+
+ index_info = evas_object_data_get(index, DATA_KEY_INDEX_INFO);
+ ret_if(!index_info);
+
+ /* 0. Remove an old page_index_list */
+ if (index_info->page_index_list) {
+ EINA_LIST_FREE(index_info->page_index_list, page_index) {
+ free(page_index);
+ }
+ index_info->page_index_list = NULL;
+ }
+
+ /* 1. Make indexes (cur/center/other) */
+ total_count = scroller_count(scroller);
+ total_inserted = scroller_count_direction(scroller, PAGE_DIRECTION_LEFT);
+ if (scroller_count_direction(scroller, PAGE_DIRECTION_CENTER)) total_inserted++;
+ if (scroller_count_direction(scroller, PAGE_DIRECTION_RIGHT)) total_inserted++;
+
+ if (total_inserted > MAX_INDEX_NUMBER) {
+ total_inserted = MAX_INDEX_NUMBER;
+ }
+
+ reverse_list = eina_list_reverse_clone(list);
+ ret_if(!reverse_list);
+
+ total_inserted--;
+ EINA_LIST_FREE(reverse_list, page) {
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+
+ if (page_info->direction == PAGE_DIRECTION_CENTER) {
+ if (!center_inserted && total_inserted >= 0) {
+ center_inserted++;
+ idx_it = elm_index_item_prepend(index, NULL, NULL, (void *) total_inserted);
+ total_inserted--;
+#ifdef RUN_ON_DEVICE
+ elm_object_item_style_set(idx_it, "item/vertical/clock");
+#endif
+ }
+ center_count++;
+ } else if (page_info->direction == index_info->direction) {
+ if (total_inserted >= 0) {
+ cur_inserted++;
+ idx_it = elm_index_item_prepend(index, NULL, NULL, (void *) total_inserted);
+ total_inserted--;
+#ifdef RUN_ON_DEVICE
+ elm_object_item_style_set(idx_it, "item/vertical/page");
+#endif
+ }
+ cur_count++;
+ } else {
+ if (!other_inserted && total_inserted >= 0) {
+ other_inserted++;
+ idx_it = elm_index_item_prepend(index, NULL, NULL, (void *) total_inserted);
+ total_inserted--;
+#ifdef RUN_ON_DEVICE
+ elm_object_item_style_set(idx_it, "item/vertical/noti");
+#endif
+ }
+ other_count++;
+ }
+ _D("page:%p, total_inserted:%d, idx_it:%p", page, total_inserted, idx_it);
+ }
+
+ cur_mid_idx = (cur_inserted - 1) / 2;
+ extra_idx = total_count - other_count - center_count - cur_inserted;
+
+ /* 2. Make a new page_index_list */
+ page_index_inserting = -1;
+ EINA_LIST_FOREACH(list, l, page) {
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+
+ page_index = calloc(1, sizeof(page_index_s));
+ continue_if(!page_index);
+
+ if (before_direction == page_info->direction) {
+ if (index_info->direction == page_info->direction) {
+ if (page_index_inserting == cur_mid_idx && extra_idx > 0) {
+ extra_idx--;
+ } else {
+ page_index_inserting++;
+ }
+ }
+ } else {
+ before_direction = page_info->direction;
+ page_index_inserting++;
+ }
+
+ page_index->page = page;
+ page_index->index = page_index_inserting;
+
+ _D("Index(%p-%d) is updating, page(%p-%d:%d)(start:%d, mid:%d, extra:%d)"
+ , index, index_info->direction
+ , page, page_info->direction, page_index_inserting
+ , 0, cur_mid_idx, extra_idx);
+
+ index_info->page_index_list = eina_list_append(index_info->page_index_list, page_index);
+ }
+}
+
+
+
+static void _update_right(Evas_Object *scroller, Evas_Object *index, const Eina_List *list)
+{
+ Evas_Object *page = NULL;
+ Elm_Object_Item *idx_it = NULL;
+ const Eina_List *l = NULL;
+
+ index_info_s *index_info = NULL;
+ page_info_s *page_info = NULL;
+ page_index_s *page_index = NULL;
+ page_direction_e before_direction = PAGE_DIRECTION_MAX;
+
+ int extra_idx = 0, page_index_inserting = 0;
+ int center_inserted = 0, other_inserted = 0, cur_inserted = 0;
+ int center_count = 0, other_count = 0, cur_count = 0, index_number = 0;
+ int cur_start_idx = 0, cur_mid_idx = 0;
+ int total_count = 0, total_inserted = 0;
+
+ ret_if(!index);
+ ret_if(!list);
+
+ index_info = evas_object_data_get(index, DATA_KEY_INDEX_INFO);
+ ret_if(!index_info);
+
+ /* 0. Remove an old page_index_list */
+ if (index_info->page_index_list) {
+ EINA_LIST_FREE(index_info->page_index_list, page_index) {
+ free(page_index);
+ }
+ index_info->page_index_list = NULL;
+ }
+
+ /* 1. Make indexes (cur/center/other) */
+ total_count = scroller_count(scroller);
+ total_inserted = scroller_count_direction(scroller, PAGE_DIRECTION_RIGHT);
+ if (scroller_count_direction(scroller, PAGE_DIRECTION_CENTER)) total_inserted++;
+ if (scroller_count_direction(scroller, PAGE_DIRECTION_LEFT)) total_inserted++;
+
+ if (total_inserted > MAX_INDEX_NUMBER) {
+ total_inserted = MAX_INDEX_NUMBER;
+ }
+
+ EINA_LIST_FOREACH(list, l, page) {
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+
+ if (page_info->direction == PAGE_DIRECTION_CENTER) {
+ if (!center_inserted) {
+ center_inserted++;
+ idx_it = elm_index_item_append(index, NULL, NULL, (void *) index_number);
+ index_number++;
+#ifdef RUN_ON_DEVICE
+ elm_object_item_style_set(idx_it, "item/vertical/clock");
+#endif
+ }
+ center_count++;
+ } else if (page_info->direction == index_info->direction) {
+ if (index_number < total_inserted) {
+ if (!cur_inserted) {
+ cur_start_idx = index_number;
+ }
+
+ cur_inserted++;
+ idx_it = elm_index_item_append(index, NULL, NULL, (void *) index_number);
+ index_number++;
+#ifdef RUN_ON_DEVICE
+ elm_object_item_style_set(idx_it, "item/vertical/page");
+#endif
+ }
+ cur_count++;
+ } else {
+ if (!other_inserted) {
+ other_inserted++;
+ idx_it = elm_index_item_append(index, NULL, NULL, (void *) index_number);
+ index_number++;
+#ifdef RUN_ON_DEVICE
+ elm_object_item_style_set(idx_it, "item/vertical/noti");
+#endif
+ }
+ other_count++;
+ }
+ _D("page:%p, total_inserted:%d, idx_it:%p", page, total_inserted, idx_it);
+ }
+
+ cur_mid_idx = (cur_start_idx * 2 + cur_inserted - 1) / 2;
+ extra_idx = total_count - other_count - center_count - cur_inserted;
+
+ /* 2. Make a new page_index_list */
+ page_index_inserting = -1;
+ EINA_LIST_FOREACH(list, l, page) {
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+
+ page_index = calloc(1, sizeof(page_index_s));
+ continue_if(!page_index);
+
+ if (before_direction == page_info->direction) {
+ if (index_info->direction == page_info->direction) {
+ if (page_index_inserting == cur_mid_idx && extra_idx > 0) {
+ extra_idx--;
+ } else {
+ page_index_inserting++;
+ }
+ }
+ } else {
+ before_direction = page_info->direction;
+ page_index_inserting++;
+ }
+
+ page_index->page = page;
+ page_index->index = page_index_inserting;
+
+ _D("Index(%p-%d) is updating, page(%p-%d:%d)(start:%d, mid:%d, extra:%d)"
+ , index, index_info->direction
+ , page, page_info->direction, page_index_inserting
+ , 0, cur_mid_idx, extra_idx);
+
+ index_info->page_index_list = eina_list_append(index_info->page_index_list, page_index);
+ }
+}
+
+
+
+HAPI void index_update(Evas_Object *index, Evas_Object *scroller, index_bring_in_e after)
+{
+ Evas_Object *page_current = NULL;
+ Eina_List *list = NULL;
+
+ scroller_info_s *scroller_info = NULL;
+ index_info_s *index_info = NULL;
+
+ ret_if(!index);
+ ret_if(!scroller);
+
+ _D("Index(%p) is clear", index);
+ elm_index_item_clear(index);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ index_info = evas_object_data_get(index, DATA_KEY_INDEX_INFO);
+ ret_if(!index_info);
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ elm_object_theme_set(index, main_get_info()->theme);
+ elm_object_style_set(index, "thumbnail");
+
+ if (PAGE_DIRECTION_LEFT == index_info->direction) {
+ _update_left(scroller, index, list);
+ } else {
+ _update_right(scroller, index, list);
+ }
+ eina_list_free(list);
+
+ elm_index_level_go(index, 0);
+
+ if (INDEX_BRING_IN_AFTER == after) {
+ page_current = scroller_get_focused_page(scroller);
+ ret_if(!page_current);
+ index_bring_in_page(index, page_current);
+ }
+}
+
+
+
+ // End of file
diff --git a/home/src/item_info.c b/home/src/item_info.c
new file mode 100755
index 0000000..0b6f6b8
--- /dev/null
+++ b/home/src/item_info.c
@@ -0,0 +1,94 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Evas.h>
+#include <stdlib.h>
+#include <bundle.h>
+#include <dlog.h>
+
+#include "log.h"
+#include "util.h"
+#include "item_info.h"
+
+HAPI item_info_s *item_info_create(const char *id, const char *subid)
+{
+ item_info_s *item_info = NULL;
+
+ item_info = calloc(1, sizeof(item_info_s));
+ retv_if(!item_info, NULL);
+
+ if (id) {
+ item_info->id = strdup(id);
+ if (!item_info->id) {
+ free(item_info);
+ return NULL;
+ }
+ }
+
+ if (subid) {
+ item_info->subid = strdup(subid);
+ if (!item_info->subid) {
+ free(item_info->id);
+ free(item_info);
+ return NULL;
+ }
+ }
+
+ if (id && item_info_is_removable(id)) {
+ item_info->removable = 1;
+ }
+
+ return item_info;
+}
+
+
+
+HAPI void item_info_destroy(item_info_s *item_info)
+{
+ ret_if(!item_info);
+
+ free(item_info->id);
+ free(item_info->subid);
+ free(item_info);
+}
+
+
+
+HAPI void item_info_list_destroy(Eina_List *item_info_list)
+{
+ item_info_s *item_info = NULL;
+
+ ret_if(!item_info_list);
+
+ EINA_LIST_FREE(item_info_list, item_info) {
+ continue_if(!item_info);
+ item_info_destroy(item_info);
+ }
+}
+
+
+
+#define APPID_APPS "org.tizen.apps-dbox"
+HAPI int item_info_is_removable(const char *id)
+{
+ retv_if(!id, 1);
+ return strcmp(id, APPID_APPS);
+}
+
+
+
+// End of a file
diff --git a/home/src/key.c b/home/src/key.c
new file mode 100755
index 0000000..67881cd
--- /dev/null
+++ b/home/src/key.c
@@ -0,0 +1,219 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Ecore_X.h>
+#include <Elementary.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <utilX.h>
+#include <dlog.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+
+#include "layout_info.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "key.h"
+#include "minictrl.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+
+
+
+#define CB_LIST_MAX 1
+static struct {
+ Eina_Bool pressed;
+ Ecore_Event_Handler *press_handler;
+ Ecore_Event_Handler *release_handler;
+
+ Eina_Bool register_handler;
+ Ecore_Timer *long_press;
+ Eina_Bool home_grabbed;
+ Eina_List *cbs_list[CB_LIST_MAX];
+} key_info = {
+ .pressed = 0,
+ .press_handler = NULL,
+ .release_handler = NULL,
+
+ .register_handler = EINA_FALSE,
+ .long_press = NULL,
+ .home_grabbed = EINA_FALSE,
+ .cbs_list = {NULL, },
+};
+
+
+
+typedef struct {
+ key_cb_ret_e (*result_cb)(void *);
+ void *result_data;
+} key_cb_s;
+
+
+
+HAPI w_home_error_e key_register_cb(
+ int type,
+ key_cb_ret_e (*result_cb)(void *), void *result_data)
+{
+ retv_if(NULL == result_cb, W_HOME_ERROR_INVALID_PARAMETER);
+
+ key_cb_s *cb = calloc(1, sizeof(key_cb_s));
+ retv_if(NULL == cb, W_HOME_ERROR_FAIL);
+
+ cb->result_cb = result_cb;
+ cb->result_data = result_data;
+
+ key_info.cbs_list[type] = eina_list_prepend(key_info.cbs_list[type], cb);
+ retv_if(NULL == key_info.cbs_list[type], W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI void key_unregister_cb(
+ int type,
+ key_cb_ret_e (*result_cb)(void *))
+{
+
+ const Eina_List *l;
+ const Eina_List *n;
+ key_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(key_info.cbs_list[type], l, n, cb) {
+ continue_if(NULL == cb);
+ if (result_cb != cb->result_cb) continue;
+ key_info.cbs_list[type] = eina_list_remove(key_info.cbs_list[type], cb);
+ free(cb);
+ return;
+ }
+}
+
+
+
+static void _execute_cbs(int type)
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ key_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(key_info.cbs_list[type], l, n, cb) {
+ continue_if(NULL == cb);
+ continue_if(NULL == cb->result_cb);
+ if (KEY_CB_RET_STOP == cb->result_cb(cb->result_data)) {
+ _W("back key execution has been stopped");
+ break;
+ }
+ }
+}
+
+
+
+#define HOME_KEY_ESC "XF86PowerOff"
+static Eina_Bool _key_release_cb(void *data, int type, void *event)
+{
+ Evas_Event_Key_Up *ev = event;
+
+ retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_PASS_ON);
+ retv_if(NULL == ev, ECORE_CALLBACK_PASS_ON);
+
+ _D("Key(%s) released %d", ev->keyname, key_info.pressed);
+
+ if (key_info.pressed == EINA_FALSE) {
+ return ECORE_CALLBACK_PASS_ON;
+ }
+
+ if (!strcmp(ev->keyname, KEY_BACK)) {
+ _execute_cbs(KEY_TYPE_BACK);
+ }
+
+ key_info.pressed = EINA_FALSE;
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+
+
+static Eina_Bool _key_press_cb(void *data, int type, void *event)
+{
+ Evas_Event_Key_Down *ev = event;
+
+ retv_if(EINA_FALSE == key_info.register_handler, ECORE_CALLBACK_PASS_ON);
+ retv_if(NULL == ev, ECORE_CALLBACK_PASS_ON);
+
+ key_info.pressed = EINA_TRUE;
+ _D("Key pressed %d", key_info.pressed);
+
+ retv_if(APP_STATE_PAUSE == main_get_info()->state, ECORE_CALLBACK_PASS_ON);
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+
+
+HAPI void key_register(void)
+{
+ if (!key_info.release_handler) {
+ key_info.release_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_release_cb, NULL);
+ if (!key_info.release_handler) {
+ _E("Failed to register a key up event handler");
+ }
+ }
+
+ if (!key_info.press_handler) {
+ key_info.press_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_press_cb, NULL);
+ if (!key_info.press_handler) {
+ _E("Failed to register a key down event handler");
+ }
+ }
+
+ key_info.pressed = EINA_FALSE;
+ key_info.register_handler = EINA_TRUE;
+}
+
+
+
+HAPI void key_unregister(void)
+{
+ if (key_info.long_press) {
+ ecore_timer_del(key_info.long_press);
+ key_info.long_press = NULL;
+ }
+
+ if (key_info.release_handler) {
+ ecore_event_handler_del(key_info.release_handler);
+ key_info.release_handler = NULL;
+ }
+
+ if (key_info.press_handler) {
+ ecore_event_handler_del(key_info.press_handler);
+ key_info.press_handler = NULL;
+ }
+
+ key_info.register_handler = EINA_FALSE;
+}
+
+
+
+HAPI void key_cb_execute(int type)
+{
+ _execute_cbs(type);
+}
+
+// End of a file
diff --git a/home/src/lang.c b/home/src/lang.c
new file mode 100755
index 0000000..e775093
--- /dev/null
+++ b/home/src/lang.c
@@ -0,0 +1,145 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <bundle.h>
+#include <dlog.h>
+
+#include "log.h"
+#include "util.h"
+
+static Eina_List *lang_list;
+static Eina_List *cbs_list;
+
+typedef struct {
+ Evas_Object *obj;
+ const char *group;
+ const char *id;
+ int domain;
+} lang_element;
+
+typedef struct {
+ w_home_error_e (*result_cb)(void *);
+ void *result_data;
+} lang_cb_s;
+
+
+
+HAPI w_home_error_e lang_add_id(Evas_Object *obj, const char *group, const char *id, int domain)
+{
+ lang_element *le;
+
+ retv_if(NULL == obj, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == group, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == id, W_HOME_ERROR_INVALID_PARAMETER);
+
+ le = malloc(sizeof(lang_element));
+ retv_if(NULL == le, W_HOME_ERROR_FAIL);
+
+ le->obj = obj;
+ le->group = group;
+ le->id = id;
+ le->domain = domain;
+
+ lang_list = eina_list_append(lang_list, le);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI void lang_remove_id(Evas_Object *obj, const char *group)
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ lang_element *le;
+
+ ret_if(NULL == obj);
+ ret_if(NULL == group);
+
+ EINA_LIST_FOREACH_SAFE(lang_list, l, n, le) {
+ if (le->obj == obj && !strcmp(group, le->group)) {
+ lang_list = eina_list_remove(lang_list, le);
+ free(le);
+ return;
+ }
+ }
+}
+
+
+
+HAPI w_home_error_e lang_register_cb(w_home_error_e (*result_cb)(void *), void *result_data)
+{
+ retv_if(NULL == result_cb, W_HOME_ERROR_INVALID_PARAMETER);
+
+ lang_cb_s *cb = calloc(1, sizeof(lang_cb_s));
+ retv_if(NULL == cb, W_HOME_ERROR_FAIL);
+
+ cb->result_cb = result_cb;
+ cb->result_data = result_data;
+
+ cbs_list = eina_list_append(cbs_list, cb);
+ retv_if(NULL == cbs_list, W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI void lang_unregister_cb(w_home_error_e (*result_cb)(void *))
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ lang_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(cbs_list, l, n, cb) {
+ continue_if(NULL == cb);
+ if (result_cb != cb->result_cb) continue;
+ cbs_list = eina_list_remove(cbs_list, cb);
+ free(cb);
+ return;
+ }
+}
+
+
+
+HAPI void lang_refresh_ids(void)
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ lang_element *le;
+ char *temp;
+
+ EINA_LIST_FOREACH_SAFE(lang_list, l, n, le) {
+ if (le->domain) {
+ temp = D_(le->id);
+ } else {
+ temp = _(le->id);
+ }
+
+ elm_object_part_text_set(le->obj, le->group, temp);
+ }
+
+ lang_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(cbs_list, l, n, cb) {
+ continue_if(NULL == cb);
+ continue_if(NULL == cb->result_cb);
+
+ if (W_HOME_ERROR_NONE != cb->result_cb(cb->result_data)) _E("There are some problems");
+ }
+}
+
+// End of a file
diff --git a/home/src/layout.c b/home/src/layout.c
new file mode 100755
index 0000000..d38bbd5
--- /dev/null
+++ b/home/src/layout.c
@@ -0,0 +1,922 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+#include <efl_assist.h>
+#include <bundle.h>
+#include <dlog.h>
+
+#include "util.h"
+#include "conf.h"
+#include "log.h"
+#include "main.h"
+#include "db.h"
+#include "edit.h"
+#include "edit_info.h"
+#include "effect.h"
+#include "key.h"
+#include "layout.h"
+#include "layout_info.h"
+#include "dynamicbox_evas.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "index.h"
+#include "util.h"
+#include "xml.h"
+#include "clock_service.h"
+#include "power_mode.h"
+#include "apps/apps_main.h"
+#include "gesture.h"
+
+#define PRIVATE_DATA_KEY_LAYOUT_DOWN_X "p_l_x"
+#define PRIVATE_DATA_KEY_LAYOUT_DOWN_Y "p_l_y"
+#define PRIVATE_DATA_KEY_LAYOUT_PRESSED "p_l_ps"
+#define PRIVATE_DATA_KEY_LAYOUT_TIMER "p_l_t"
+#define PRIVATE_DATA_KEY_CHECKER_TYPE "ck_tp"
+#define PRIVATE_DATA_KEY_DOWN_X "dw_x"
+#define PRIVATE_DATA_KEY_DOWN_Y "dw_y"
+#define PRIVATE_DATA_KEY_LAYOUT_G_DOWN_Y "gdw_y"
+#define PRIVATE_DATA_KEY_LAYOUT_G_FKICKUP_DONE "gdw_f_d"
+#define PRIVATE_DATA_KEY_LEFT_CHECKER "top_ck"
+#define PRIVATE_DATA_KEY_RIGHT_CHECKER "bt_ck"
+#define PRIVATE_DATA_KEY_READY_TO_BEZEL_DOWN "pd_rt_bd"
+#define PRIVATE_DATA_KEY_CENTER_LONG_PRESSED "pd_c_l_p"
+
+#define MOVE_LEFT -1
+#define MOVE_RIGHT 1
+
+#define THRESHOLD_BEZEL_UP_H 60
+#define THRESHOLD_BEZEL_UP_END_D_H 25
+#define THRESHOLD_BEZEL_UP_MOVE_D_H 25
+#define THRESHOLD_MOMENTUM_FLICK_Y 450
+#define LONGPRESS_GRAY_ZONE_W 50
+#define LONGPRESS_GRAY_ZONE_H 100
+
+static w_home_error_e _pause_result_cb(void *data)
+{
+ Evas_Object *layout = data;
+ Evas_Object *page = NULL;
+ layout_info_s *layout_info = NULL;
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, W_HOME_ERROR_FAIL);
+
+ page = scroller_get_focused_page(layout_info->scroller);
+ retv_if(!page, W_HOME_ERROR_FAIL);
+ page_focus(page);
+
+ /* If TTS is on, use focus */
+ if (main_get_info()->is_tts) {
+ elm_object_tree_focus_allow_set(layout, EINA_FALSE);
+ _D("tree_focus_allow_set layout(%p) as FALSE", layout);
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _resume_result_cb(void *data)
+{
+ Evas_Object *layout = data;
+ layout_info_s *layout_info = NULL;
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, W_HOME_ERROR_FAIL);
+
+ if (layout_info->tutorial) {
+ /* If TTS is on, use focus */
+ if (main_get_info()->is_tts) {
+ elm_object_tree_focus_allow_set(layout, EINA_FALSE);
+ _D("tree_focus_allow_set layout(%p) as FALSE", layout);
+ }
+ } else {
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+
+ layout = evas_object_data_get(main_get_info()->win, DATA_KEY_LAYOUT);
+ if (!layout) {
+ return W_HOME_ERROR_FAIL;
+ }
+
+ /* If TTS is on, use focus */
+ if (main_get_info()->is_tts) {
+ elm_object_tree_focus_allow_set(layout, EINA_TRUE);
+ _D("tree_focus_allow_set layout(%p) as TRUE", layout);
+ }
+
+ scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ if (!scroller) {
+ return W_HOME_ERROR_FAIL;
+ }
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _reset_result_cb(void *data)
+{
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static Eina_Bool _longpress_timer_cb(void *data)
+{
+ int no_effect = 0;
+ Evas_Object *layout = data;
+ Evas_Object *proxy_page = NULL;
+ Evas_Object *effect_page = NULL;
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ edit_info_s *edit_info = NULL;
+
+ retv_if(!layout, ECORE_CALLBACK_CANCEL);
+ evas_object_data_del(layout, PRIVATE_DATA_KEY_LAYOUT_TIMER);
+
+ _D("Enter the edit mode");
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, ECORE_CALLBACK_CANCEL);
+ retv_if(!layout_info->pressed_page, ECORE_CALLBACK_CANCEL);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ page_info = evas_object_data_get(layout_info->pressed_page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, ECORE_CALLBACK_CANCEL);
+
+ if (!page_info->layout_longpress) {
+ _D("long-press is not supported on this page");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ switch (page_info->direction) {
+ case PAGE_DIRECTION_LEFT:
+ _D("There is already a pressed item");
+ evas_object_data_set(layout_info->pressed_page, DATA_KEY_PAGE_ONHOLD_COUNT, (void*)1);
+ retv_if(!edit_create_layout(layout, EDIT_MODE_LEFT), ECORE_CALLBACK_CANCEL);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ retv_if(!edit_info, ECORE_CALLBACK_CANCEL);
+
+ proxy_page = evas_object_data_get(layout_info->pressed_page, DATA_KEY_PROXY_PAGE);
+ retv_if(!proxy_page, ECORE_CALLBACK_CANCEL);
+
+ effect_page = edit_create_minify_effect_page(proxy_page);
+ retv_if(!effect_page, ECORE_CALLBACK_CANCEL);
+
+ scroller_region_show_center_of(edit_info->scroller, proxy_page, SCROLLER_FREEZE_OFF, NULL, NULL, edit_minify_effect_page, effect_page);
+ break;
+ case PAGE_DIRECTION_CENTER:
+ if (util_feature_enabled_get(FEATURE_CLOCK_SELECTOR) == 1) {
+ if (clock_service_clock_selector_launch() > 0) {
+ evas_object_data_set(layout_info->pressed_page, DATA_KEY_PAGE_ONHOLD_COUNT, (void*)1);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_CENTER_LONG_PRESSED, (void*)1);
+ scroller_freeze(layout_info->scroller);
+ }
+ } else {
+ no_effect = 1;
+ }
+ break;
+ case PAGE_DIRECTION_RIGHT:
+ if (main_get_info()->is_tts) return ECORE_CALLBACK_CANCEL;
+ if (layout_info->pressed_item) {
+ _D("There is already a pressed item");
+ evas_object_dynamicbox_force_mouse_up(layout_info->pressed_item);
+ }
+ retv_if(!edit_create_layout(layout, EDIT_MODE_RIGHT), ECORE_CALLBACK_CANCEL);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ retv_if(!edit_info, ECORE_CALLBACK_CANCEL);
+
+ proxy_page = evas_object_data_get(layout_info->pressed_page, DATA_KEY_PROXY_PAGE);
+ retv_if(!proxy_page, ECORE_CALLBACK_CANCEL);
+
+ effect_page = edit_create_minify_effect_page(proxy_page);
+ retv_if(!effect_page, ECORE_CALLBACK_CANCEL);
+
+ scroller_region_show_center_of(edit_info->scroller, proxy_page, SCROLLER_FREEZE_OFF, NULL, NULL, edit_minify_effect_page, effect_page);
+
+ if (layout_info->pressed_page == scroller_info->plus_page) {
+ evas_object_data_set(layout_info->pressed_item, DATA_KEY_IS_LONGPRESS, (void *)1);
+ }
+ break;
+ default:
+ _D("Cannot reach here");
+ break;
+ }
+
+ if (no_effect == 0) {
+ effect_play_vibration();
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ei = event_info;
+ Evas_Object *layout = obj;
+ Ecore_Timer *timer = NULL;
+
+ int is_gray_zone = 0;
+ int x = ei->output.x;
+ int y = ei->output.y;
+
+ _D("Mouse is down on the layout");
+
+ timer = evas_object_data_del(layout, PRIVATE_DATA_KEY_LAYOUT_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_LAYOUT_PRESSED, (void *) 1);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_LAYOUT_DOWN_X, (void *) x);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_LAYOUT_DOWN_Y, (void *) y);
+
+ double longpress_time = LONGPRESS_TIME;
+ layout_info_s *layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ if (layout_info != NULL) {
+ Evas_Object *page = scroller_get_focused_page(layout_info->scroller);
+ if (page != NULL) {
+ page_info_s *page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (page_info != NULL) {
+ if (page_info->direction == PAGE_DIRECTION_CENTER) {
+ longpress_time = 0.4f;
+ }
+ }
+ }
+ }
+
+ if ((x <= LONGPRESS_GRAY_ZONE_W) || (x >= (main_get_info()->root_w - LONGPRESS_GRAY_ZONE_W))) {
+ is_gray_zone = 1;
+ }
+ if ((y <= LONGPRESS_GRAY_ZONE_H) || (y >= (main_get_info()->root_h - LONGPRESS_GRAY_ZONE_H))) {
+ is_gray_zone = 1;
+ }
+ if (is_gray_zone == 1) {
+ _W("we don't add a longpress timer, it's too close to home key");
+ return;
+ }
+
+ timer = ecore_timer_add(longpress_time, _longpress_timer_cb, layout);
+ if (timer) evas_object_data_set(layout, PRIVATE_DATA_KEY_LAYOUT_TIMER, timer);
+ else _E("Cannot add a timer");
+}
+
+
+
+static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ei = event_info;
+ Evas_Object *layout = obj;
+ Ecore_Timer *timer = NULL;
+
+ int down_x, down_y, vec_x, vec_y;
+ int cur_x = ei->cur.output.x;
+ int cur_y = ei->cur.output.y;
+
+ if (!evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_PRESSED)) return;
+
+ down_x = (int) evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_DOWN_X);
+ down_y = (int) evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_DOWN_Y);
+
+ vec_x = cur_x - down_x;
+ vec_y = cur_y - down_y;
+
+ timer = evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_TIMER);
+ if (timer && (abs(vec_x) >= LONGPRESS_THRESHOLD || abs(vec_y) >= LONGPRESS_THRESHOLD)) {
+ evas_object_data_del(layout, PRIVATE_DATA_KEY_LAYOUT_TIMER);
+ ecore_timer_del(timer);
+ }
+}
+
+
+
+static void _up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *layout = obj;
+ Ecore_Timer *timer = NULL;
+ layout_info_s *layout_info = NULL;
+
+ _D("Mouse is up on the layout");
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ timer = evas_object_data_del(layout, PRIVATE_DATA_KEY_LAYOUT_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ if (evas_object_data_del(layout, PRIVATE_DATA_KEY_CENTER_LONG_PRESSED) != NULL) {
+ if (layout_info->scroller) {
+ scroller_unfreeze(layout_info->scroller);
+ scroller_bring_in_by_push_type(layout_info->scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+ }
+ }
+}
+
+
+
+static void _bezel_up_cb(void *data)
+{
+ Evas_Object *layout = data;
+ Evas_Object *scroller = NULL;
+ Evas_Object *focused_page = NULL;
+
+ _D("Bezel up");
+
+ ret_if(!layout);
+
+ scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+
+ if (PAGE_DIRECTION_CENTER != scroller_get_current_page_direction(scroller)) {
+ return;
+ }
+
+ if (util_feature_enabled_get(FEATURE_APPS) == 0) {
+ elm_object_signal_emit(layout, "bottom,show", "layout");
+ return;
+ }
+
+ if (util_feature_enabled_get(FEATURE_APPS_BY_BEZEL_UP) == 0) {
+ return;
+ }
+
+ if (scroller_is_scrolling(scroller)) {
+ return;
+ }
+
+ if (layout_is_edit_mode(layout)) {
+ return;
+ }
+
+ focused_page = scroller_get_focused_page(scroller);
+ if (focused_page != NULL) {
+ evas_object_data_set(focused_page, DATA_KEY_PAGE_ONHOLD_COUNT, (void*)1);
+ }
+
+ apps_main_show_count_add();
+ apps_main_launch(APPS_LAUNCH_SHOW);
+}
+
+
+
+HAPI void layout_add_mouse_cb(Evas_Object *layout)
+{
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, NULL);
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_MOVE, _move_cb, NULL);
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP, _up_cb, NULL);
+}
+
+
+
+HAPI void layout_del_mouse_cb(Evas_Object *layout)
+{
+ evas_object_event_callback_del(layout, EVAS_CALLBACK_MOUSE_DOWN, _down_cb);
+ evas_object_event_callback_del(layout, EVAS_CALLBACK_MOUSE_MOVE, _move_cb);
+ evas_object_event_callback_del(layout, EVAS_CALLBACK_MOUSE_UP, _up_cb);
+}
+
+
+
+static Eina_Bool _move_timer_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ Evas_Object *cur_page = NULL;
+ Evas_Object *move_page = NULL;
+ scroller_info_s *scroller_info = NULL;
+ int checker_type = 0;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+ checker_type = (int)evas_object_data_get(scroller, PRIVATE_DATA_KEY_CHECKER_TYPE);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ cur_page = scroller_get_focused_page(scroller);
+ if (MOVE_LEFT == checker_type) {
+ move_page = scroller_get_left_page(scroller, cur_page);
+ if (move_page && scroller_info->center != move_page) {
+ elm_object_signal_emit(scroller_info->layout, "left,show", "layout");
+ edit_push_page_before(scroller, cur_page, move_page);
+ }
+ } else {
+ move_page = scroller_get_right_page(scroller, cur_page);
+ if (move_page && scroller_info->plus_page != move_page) {
+ elm_object_signal_emit(scroller_info->layout, "right,show", "layout");
+ edit_push_page_after(scroller, cur_page, move_page);
+ }
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+
+
+#define TIME_MOVE_SCROLLER 1.0f
+static void _upper_start_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *layout = data;
+ Evas_Object *checker = obj;
+ Ecore_Timer *timer = NULL;
+
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+ int checker_type = 0;
+
+ _D("Upper start for the checker");
+
+ ret_if(!layout);
+ ret_if(!checker);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+
+ checker_type = (int) evas_object_data_get(checker, PRIVATE_DATA_KEY_CHECKER_TYPE);
+ evas_object_data_set(edit_info->scroller, PRIVATE_DATA_KEY_CHECKER_TYPE, (void *)checker_type);
+
+ timer = evas_object_data_del(edit_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+
+ timer = ecore_timer_add(TIME_MOVE_SCROLLER, _move_timer_cb, edit_info->scroller);
+ if (timer) evas_object_data_set(edit_info->scroller, DATA_KEY_EVENT_UPPER_TIMER, timer);
+ else _E("Cannot add a timer");
+}
+
+
+
+static void _upper_end_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *layout = data;
+ Evas_Object *checker = obj;
+ Ecore_Timer *timer = NULL;
+
+ layout_info_s *layout_info = NULL;
+ edit_info_s *edit_info = NULL;
+
+ _D("Upper end for the checker");
+
+ ret_if(!checker);
+ ret_if(!layout);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ edit_info = evas_object_data_get(layout_info->edit, DATA_KEY_EDIT_INFO);
+ ret_if(!edit_info);
+
+ timer = evas_object_data_del(edit_info->scroller, DATA_KEY_EVENT_UPPER_TIMER);
+ if (timer) ecore_timer_del(timer);
+ evas_object_data_del(edit_info->scroller, PRIVATE_DATA_KEY_CHECKER_TYPE);
+}
+
+
+
+static Evas_Event_Flags _flick_start_cb(void *data, void *event_info)
+{
+ int gesture_down_y = 0;
+ Evas_Object *layout = data;
+ Elm_Gesture_Line_Info *ei = (Elm_Gesture_Line_Info *)event_info;
+ retv_if(!layout, EVAS_EVENT_FLAG_NONE);
+ retv_if(!ei, EVAS_EVENT_FLAG_NONE);
+
+ gesture_down_y = (int) evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_G_DOWN_Y);
+
+ if (gesture_down_y <= THRESHOLD_BEZEL_UP_H
+ && ei->momentum.my >= THRESHOLD_MOMENTUM_FLICK_Y) {
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_READY_TO_BEZEL_DOWN, (void *) 1);
+ }
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+
+
+static Evas_Event_Flags _flick_move_cb(void *data, void *event_info)
+{
+ int gesture_down_y = 0;
+ Evas_Object *layout = data;
+ Elm_Gesture_Line_Info *ei = (Elm_Gesture_Line_Info *)event_info;
+ retv_if(!layout, EVAS_EVENT_FLAG_NONE);
+ retv_if(!ei, EVAS_EVENT_FLAG_NONE);
+
+ int is_flickup_done = (int) evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_G_FKICKUP_DONE);
+ gesture_down_y = (int) evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_G_DOWN_Y);
+ int vector_y = ei->momentum.y2 - ei->momentum.y1;
+ int distance_x = abs( ei->momentum.x1 - ei->momentum.x2);
+ int distance_y = abs(vector_y);
+
+#if 0 //DEBUG
+ _D("gesture_down_y:%d", gesture_down_y);
+ _D("ei->momentum.my:%d", ei->momentum.my);
+ _D("is_flickup_done:%d", is_flickup_done);
+ _D("vector_y:%d", vector_y);
+ _D("distance_x:%d", distance_x);
+ _D("distance_y:%d", distance_y);
+#endif
+
+ if (vector_y < 0 &&
+ (ei->momentum.my <= -THRESHOLD_MOMENTUM_FLICK_Y || distance_y >= THRESHOLD_BEZEL_UP_MOVE_D_H) &&
+ distance_x < distance_y) {
+ if (is_flickup_done == 0) {
+ if (gesture_down_y >= (main_get_info()->root_h - THRESHOLD_BEZEL_UP_H)) {
+ gesture_execute_cbs(BEZEL_UP);
+ }
+ evas_object_smart_callback_call(layout, LAYOUT_SMART_SIGNAL_FLICK_UP, layout);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_LAYOUT_G_FKICKUP_DONE, (void *) 1);
+ }
+ }
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+
+
+static void _gesture_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ei = event_info;
+ Evas_Object *layout = obj;
+
+ int y = ei->output.y;
+
+ _D("Mouse is down on the gesture layer:%d", y);
+
+ evas_object_data_del(layout, PRIVATE_DATA_KEY_LAYOUT_G_FKICKUP_DONE);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_LAYOUT_G_DOWN_Y, (void *) y);
+
+}
+
+
+
+static Evas_Event_Flags _flick_end_cb(void *data, void *event_info)
+{
+ int gesture_down_y = 0;
+ Evas_Object *layout = data;
+ Elm_Gesture_Line_Info *ei = (Elm_Gesture_Line_Info *)event_info;
+ retv_if(!layout, EVAS_EVENT_FLAG_NONE);
+ retv_if(!ei, EVAS_EVENT_FLAG_NONE);
+
+ if (evas_object_data_del(layout, PRIVATE_DATA_KEY_READY_TO_BEZEL_DOWN)) {
+ gesture_execute_cbs(BEZEL_DOWN);
+ }
+
+ int is_flickup_done = (int) evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_G_FKICKUP_DONE);
+ gesture_down_y = (int) evas_object_data_get(layout, PRIVATE_DATA_KEY_LAYOUT_G_DOWN_Y);
+ int vector_y = ei->momentum.y2 - ei->momentum.y1;
+ int distance_x = abs( ei->momentum.x1 - ei->momentum.x2);
+ int distance_y = abs(vector_y);
+
+#if 0 //DEBUG
+ _D("gesture_down_y:%d", gesture_down_y);
+ _D("ei->momentum.my:%d", ei->momentum.my);
+ _D("is_flickup_done:%d", is_flickup_done);
+ _D("vector_y:%d", vector_y);
+ _D("distance_x:%d", distance_x);
+ _D("distance_y:%d", distance_y);
+#endif
+
+ if (vector_y < 0 &&
+ distance_y >= THRESHOLD_BEZEL_UP_END_D_H && //cannot use momentum
+ distance_x < distance_y) {
+ if (is_flickup_done == 0) {
+ if (gesture_down_y >= (main_get_info()->root_h - THRESHOLD_BEZEL_UP_H)) {
+ gesture_execute_cbs(BEZEL_UP);
+ }
+ evas_object_smart_callback_call(layout, LAYOUT_SMART_SIGNAL_FLICK_UP, layout);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_LAYOUT_G_FKICKUP_DONE, (void *) 1);
+ }
+ }
+
+ return EVAS_EVENT_FLAG_NONE;
+}
+
+
+
+static void _attach_gesture_layer(Evas_Object *layout)
+{
+ Evas_Object *gesture_layer = NULL;
+ ret_if(!layout);
+
+ gesture_layer = elm_gesture_layer_add(layout);
+ ret_if(!gesture_layer);
+
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, _gesture_down_cb, NULL);
+
+ elm_gesture_layer_attach(gesture_layer, layout);
+ elm_gesture_layer_cb_set(gesture_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_START, _flick_start_cb, layout);
+ elm_gesture_layer_cb_set(gesture_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, _flick_end_cb, layout);
+ elm_gesture_layer_cb_set(gesture_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_MOVE, _flick_move_cb, layout);
+}
+
+
+
+static Evas_Object *_create_checker(Evas_Object *layout, int type)
+{
+ Evas_Object *checker;
+
+ retv_if(!layout, NULL);
+
+ checker = elm_button_add(layout);
+ evas_object_size_hint_weight_set(checker, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(checker, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_color_set(checker, 0, 0, 0, 0);
+ if (MOVE_LEFT == type) {
+ elm_object_part_content_set(layout, "left_checker", checker);
+ evas_object_data_set(checker, PRIVATE_DATA_KEY_CHECKER_TYPE, (void *)MOVE_LEFT);
+ } else if (MOVE_RIGHT == type) {
+ elm_object_part_content_set(layout, "right_checker", checker);
+ evas_object_data_set(checker, PRIVATE_DATA_KEY_CHECKER_TYPE, (void *)MOVE_RIGHT);
+ }
+ evas_object_data_set(checker, DATA_KEY_EVENT_UPPER_IS_ON, (void *) 1);
+
+ evas_object_smart_callback_add(checker, "upper_start", _upper_start_cb, layout);
+ evas_object_smart_callback_add(checker, "upper_end", _upper_end_cb, layout);
+ evas_object_show(checker);
+
+ return checker;
+}
+
+
+
+static void _destroy_checker(Evas_Object *checker)
+{
+ evas_object_data_del(checker, DATA_KEY_EVENT_UPPER_IS_ON);
+ evas_object_data_del(checker, PRIVATE_DATA_KEY_CHECKER_TYPE);
+ evas_object_del(checker);
+}
+
+
+
+#define FILE_LAYOUT_EDJ EDJEDIR"/layout.edj"
+#define GROUP_LAYOUT "layout"
+HAPI Evas_Object *layout_create(Evas_Object *win)
+{
+ Evas_Object *layout = NULL;
+ Evas_Object *checker = NULL;
+ Evas_Object *scroller = NULL;
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ Eina_Bool ret;
+
+ retv_if(!win, NULL);
+
+ layout = elm_layout_add(win);
+ retv_if(NULL == layout, NULL);
+
+ layout_info = calloc(1, sizeof(layout_info_s));
+ if (!layout_info) {
+ _E("Cannot calloc for layout_info");
+ evas_object_del(layout);
+ return NULL;
+ }
+ evas_object_data_set(layout, DATA_KEY_LAYOUT_INFO, layout_info);
+ layout_info->win = win;
+
+ ret = elm_layout_file_set(layout, FILE_LAYOUT_EDJ, GROUP_LAYOUT);
+ if (EINA_FALSE == ret) {
+ _E("cannot set the file into the layout");
+ free(layout_info);
+ evas_object_del(layout);
+ return NULL;
+ }
+
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(layout, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_resize(layout, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_show(layout);
+
+ evas_object_data_set(win, DATA_KEY_LAYOUT, layout);
+ evas_object_data_set(layout, DATA_KEY_WIN, win);
+
+ if (W_HOME_ERROR_NONE != main_register_cb(APP_STATE_PAUSE, _pause_result_cb, layout)) {
+ _E("Cannot register the pause callback");
+ }
+
+ if (W_HOME_ERROR_NONE != main_register_cb(APP_STATE_RESUME, _resume_result_cb, layout)) {
+ _E("Cannot register the resume callback");
+ }
+
+ if (W_HOME_ERROR_NONE != main_register_cb(APP_STATE_RESET, _reset_result_cb, layout)) {
+ _E("Cannot register the reset callback");
+ }
+
+ if (W_HOME_ERROR_NONE != gesture_register_cb(BEZEL_UP, _bezel_up_cb, layout)) {
+ _E("Cannot register the gesture callback");
+ }
+
+ layout_add_mouse_cb(layout);
+
+ checker = _create_checker(layout, MOVE_LEFT);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_LEFT_CHECKER, checker);
+
+ checker = _create_checker(layout, MOVE_RIGHT);
+ evas_object_data_set(layout, PRIVATE_DATA_KEY_RIGHT_CHECKER, checker);
+
+ scroller = scroller_create(layout, layout, main_get_info()->root_w, main_get_info()->root_h, SCROLLER_INDEX_PLURAL);
+ if (!scroller) {
+ _E("Cannot create scroller");
+ free(layout_info);
+ evas_object_del(layout);
+ return NULL;
+ }
+ elm_object_part_content_set(layout, "scroller", scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ if (!scroller_info) {
+ _E("Cannot create scroller");
+ scroller_destroy(layout);
+ free(layout_info);
+ evas_object_del(layout);
+ return NULL;
+ }
+ layout_info->scroller = scroller;
+
+ /* Scroller has to unpack all page_inners on scroll */
+ scroller_info->unpack_page_inners_on_scroll = 1;
+ scroller_info->scroll_effect = 1;
+
+ scroller_info->index[PAGE_DIRECTION_LEFT] = index_create(layout, scroller, PAGE_DIRECTION_LEFT);
+ if (!scroller_info->index[PAGE_DIRECTION_LEFT]) _E("Cannot create the left index");
+ else elm_object_part_content_set(layout, "left_index", scroller_info->index[PAGE_DIRECTION_LEFT]);
+
+ scroller_info->index[PAGE_DIRECTION_RIGHT] = index_create(layout, scroller, PAGE_DIRECTION_RIGHT);
+ if (!scroller_info->index[PAGE_DIRECTION_RIGHT]) _E("Cannot create the right index");
+ else elm_object_part_content_set(layout, "right_index", scroller_info->index[PAGE_DIRECTION_RIGHT]);
+ layout_hide_index(layout);
+
+ _attach_gesture_layer(layout);
+
+ return layout;
+}
+
+
+
+HAPI void layout_destroy(Evas_Object *win)
+{
+ Evas_Object *layout = NULL;
+ Evas_Object *checker = NULL;
+ Evas_Object *scroller = NULL;
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *page_info_list = NULL;
+
+ ret_if(win);
+
+ layout = evas_object_data_del(win, DATA_KEY_LAYOUT);
+ ret_if(!layout);
+
+ scroller = evas_object_data_del(layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ if (scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_destroy(scroller_info->index[PAGE_DIRECTION_LEFT]);
+ }
+
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_destroy(scroller_info->index[PAGE_DIRECTION_RIGHT]);
+ }
+
+ scroller_pop_pages(scroller, PAGE_DIRECTION_ANY);
+ scroller_destroy(layout);
+
+ checker = evas_object_data_del(layout, PRIVATE_DATA_KEY_LEFT_CHECKER);
+ if (checker) {
+ _destroy_checker(checker);
+ }
+
+ checker = evas_object_data_del(layout, PRIVATE_DATA_KEY_RIGHT_CHECKER);
+ if (checker) {
+ _destroy_checker(checker);
+ }
+
+ main_unregister_cb(APP_STATE_PAUSE, _pause_result_cb);
+ main_unregister_cb(APP_STATE_RESUME, _resume_result_cb);
+ main_unregister_cb(APP_STATE_RESET, _reset_result_cb);
+ gesture_unregister_cb(BEZEL_UP, _bezel_up_cb);
+
+ evas_object_data_del(layout, DATA_KEY_WIN);
+
+ layout_info = evas_object_data_del(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ page_info_list_destroy(page_info_list);
+ free(layout_info);
+
+ evas_object_del(layout);
+}
+
+
+
+HAPI void layout_show_left_index(Evas_Object *layout)
+{
+ ret_if(!layout);
+ elm_object_signal_emit(layout, "show", "left_index");
+ elm_object_signal_emit(layout, "hide", "right_index");
+}
+
+
+
+HAPI void layout_show_right_index(Evas_Object *layout)
+{
+ ret_if(!layout);
+ elm_object_signal_emit(layout, "show", "right_index");
+ elm_object_signal_emit(layout, "hide", "left_index");
+}
+
+
+
+HAPI void layout_hide_index(Evas_Object *layout)
+{
+ ret_if(!layout);
+ elm_object_signal_emit(layout, "hide", "right_index");
+ elm_object_signal_emit(layout, "hide", "left_index");
+}
+
+
+
+HAPI int layout_is_edit_mode(Evas_Object *layout)
+{
+ layout_info_s *layout_info = NULL;
+
+ retv_if(!layout, 0);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, 0);
+
+ return layout_info->edit? 1 : 0;
+}
+
+
+
+HAPI void layout_set_idle(Evas_Object *layout)
+{
+ layout_info_s *layout_info = NULL;
+
+ ret_if(!layout);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ if (evas_object_data_get(layout, DATA_KEY_ADD_VIEWER) != NULL) {
+ _D("destroy a addviewer");
+ edit_destroy_add_viewer(layout);
+ }
+
+ if (layout_info->edit != NULL) {
+ _D("destroy a editing layout");
+ edit_destroy_layout(layout);
+ }
+}
+
+
+
+HAPI int layout_is_idle(Evas_Object *layout)
+{
+ layout_info_s *layout_info = NULL;
+
+ retv_if(!layout, 1);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, 1);
+
+ if (evas_object_data_get(layout, DATA_KEY_ADD_VIEWER) != NULL) {
+ _W("Addview is exist");
+ return 0;
+ }
+
+ if (layout_info->edit != NULL) {
+ _W("editing is in progress");
+ return 0;
+ }
+
+ return 1;
+}
+// End of file
diff --git a/home/src/main.c b/home/src/main.c
new file mode 100755
index 0000000..cec80b9
--- /dev/null
+++ b/home/src/main.c
@@ -0,0 +1,1478 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <app.h>
+#include <appcore-efl.h>
+#include <aul.h>
+#include <bundle.h>
+#include <Ecore.h>
+#include <Ecore_X.h>
+#include <efl_assist.h>
+#include <Elementary.h>
+#include <errno.h>
+#include <dynamicbox.h>
+#include <dynamicbox_service.h>
+#include <dynamicbox_errno.h>
+#include <utilX.h>
+#include <unistd.h>
+#include <vconf.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+#include <dlog.h>
+
+#include "bg.h"
+#include "conf.h"
+#include "layout.h"
+#include "layout_info.h"
+#include "dynamicbox_evas.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "pkgmgr.h"
+#include "win.h"
+#include "key.h"
+#include "effect.h"
+#include "page_info.h"
+#include "page.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "minictrl.h"
+#include "clock_service.h"
+#include "dbus.h"
+#include "gesture.h"
+#include "add-viewer.h"
+#include "power_mode.h"
+#include "noti_broker.h"
+#include "wms.h"
+#include "tutorial.h"
+#include "apps/apps_main.h"
+#include "critical_log.h"
+#include "db.h"
+#include "xml.h"
+#include "dbox.h"
+#include "edit.h"
+#include "popup.h"
+
+#define HOME_SERVICE_KEY "home_op"
+#define HOME_SERVICE_VALUE_POWERKEY "powerkey"
+#define HOME_SERVICE_VALUE_EDIT "edit"
+#define HOME_SERVICE_VALUE_SHOW_APPS "show_apps"
+#define HOME_SERVICE_VALUE_SHOW_NOTI "show_noti"
+#define HOME_SERVICE_VALUE_APPS_EDIT "apps_edit"
+#define HOME_SERVICE_VALUE_FIRST_BOOT "first_boot"
+
+#define VCONFKEY_HOME_VISIBILITY "memory/homescreen/clock_visibility"
+#define VCONFKEY_SETAPPL_CHANGE_UI_THEME_INT VCONFKEY_SETAPPL_PREFIX"/change_ui/theme"
+
+#define PRIVATE_DATA_KEY_FOCUS_IN_EVENT_HANDLER "k_fi_ev_hd"
+#define PRIVATE_DATA_KEY_FOCUS_OUT_EVENT_HANDLER "k_fo_ev_hd"
+#define PRIVATE_DATA_KEY_VISIBILITY_EVENT_HANDLER "k_vi_ev_hd"
+
+#define APP_CONTROL_OPERATION_MAIN "http://tizen.org/appcontrol/operation/main"
+
+#define VISIBILITY_TIMEOUT 8.0f
+#define LAZY_NOTI_TIMER 3.0f
+#define LAZY_DBOX_TIMER 5.0f
+
+
+static main_s main_info = {
+ .color_theme = NULL,
+ .font_theme = NULL,
+ .theme = NULL,
+ .layout = NULL,
+
+ .state = APP_STATE_CREATE,
+ .is_mapbuf = 0,
+ .apps_pid = 0,
+ .is_tts = false,
+ .is_lcd_on = -1,
+ .is_alpm_clock_enabled = 0,
+
+ .safety_init_timer = NULL,
+};
+
+
+
+typedef struct {
+ w_home_error_e (*result_cb)(void *);
+ void *result_data;
+} main_cb_s;
+
+
+
+static void _activate_window_job_cb(void *data);
+
+
+
+HAPI main_s *main_get_info(void)
+{
+ return &main_info;
+}
+
+
+
+static void _home_visibility_vconf_set(int is_visible)
+{
+ int ret = 0;
+
+ if ((ret = vconf_set_int(VCONFKEY_HOME_VISIBILITY, is_visible)) != 0) {
+ _E("Failed to set key:%s(%d) value:%d", VCONFKEY_HOME_VISIBILITY, ret, is_visible);
+ }
+}
+
+
+
+static int _is_window_on_top(void)
+{
+ int pid = -1;
+ char *cmd = NULL;
+
+ pid = util_find_top_visible_window(&cmd);
+ if (pid == -1) {
+ _E("Failed to get top visible window pid");
+ }
+
+ if (pid == getpid()) {
+ free(cmd);
+ return 1;
+ }
+
+ free(cmd);
+
+ return 0;
+}
+
+
+
+static int _is_tutorial_enabled(void)
+{
+ int ret = 0;
+ int tutorial_enabled = 0;
+ if ((ret = vconf_get_int(VCONF_KEY_HOME_IS_TUTORIAL, &tutorial_enabled)) != 0) {
+ _E("Cannot get the vconf for %s %d", VCONF_KEY_HOME_IS_TUTORIAL, ret);
+ return 0;
+ }
+
+ return tutorial_enabled;
+}
+
+
+
+static int _is_lcd_turned_on(void)
+{
+ int val = VCONFKEY_PM_STATE_NORMAL;
+
+ if (main_info.is_lcd_on >= 0) {
+ return main_get_info()->is_lcd_on;
+ } else {
+ if (vconf_get_int(VCONFKEY_PM_STATE, &val) < 0) {
+ _E("Failed to get PM STATE");
+ }
+
+ if (val == VCONFKEY_PM_STATE_NORMAL || val == VCONFKEY_PM_STATE_LCDDIM) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+
+static void _del_list(void *data)
+{
+ Eina_List *page_info_list = data;
+ ret_if(!page_info_list);
+ page_info_list_destroy(page_info_list);
+}
+
+
+
+static inline char *_ltrim(char *str)
+{
+ retv_if(NULL == str, NULL);
+ while (*str && (*str == ' ' || *str == '\t' || *str == '\n')) str ++;
+ return str;
+}
+
+
+
+static inline int _rtrim(char *str)
+{
+ int len;
+
+ retv_if(NULL == str, 0);
+
+ len = strlen(str);
+ while (--len >= 0 && (str[len] == ' ' || str[len] == '\n' || str[len] == '\t')) {
+ str[len] = '\0';
+ }
+
+ return len;
+}
+
+
+
+Eina_List *_create_tts_list(const char *file)
+{
+ retv_if(!file, NULL);
+
+ FILE *fp;
+ char *line = NULL;
+ size_t size = 0;
+ ssize_t read;
+ char *data = NULL;
+ Eina_List *list = NULL;
+
+ fp = fopen(file, "r");
+ retv_if(!fp, NULL);
+
+ while ((read = getline(&line, &size, fp)) != -1) {
+ char *begin;
+
+ if (size <= 0) {
+ free(line);
+ line = NULL;
+ break;
+ }
+
+ begin = _ltrim(line);
+ _rtrim(line);
+
+ if (*begin == '#' || *begin == '\0') {
+ free(line);
+ line = NULL;
+ continue;
+ }
+
+ data = strdup(begin);
+ list = eina_list_append(list, data);
+
+ if (line) {
+ free(line);
+ line = NULL;
+ }
+ }
+
+ fclose(fp);
+
+ return list;
+}
+
+
+void _destroy_tts_list(Eina_List *list)
+{
+ char *data = NULL;
+
+ ret_if(!list);
+
+ EINA_LIST_FREE(list, data) {
+ free(data);
+ }
+}
+
+
+
+static int _page_info_in_list(page_info_s *page_info, Eina_List *list)
+{
+ char *name = NULL;
+ const Eina_List *l, *ln;
+
+ retv_if(!list, 0);
+ retv_if(!page_info, 0);
+ retv_if(!page_info->id, 0);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, name) {
+ continue_if(!name);
+ if(!strcmp(name, page_info->id)) return 1;
+ }
+
+ return 0;
+}
+
+
+#define BLACK_LIST RESDIR"/tts_black.list"
+#define WHITE_LIST RESDIR"/tts_white.list"
+static void _tts_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int val = -1;
+
+ _W("Change TTS");
+
+ if (0 == vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &val)
+ && main_info.is_tts != val)
+ {
+ Evas_Object *scroller = NULL;
+ Eina_List *page_info_list = NULL;
+ page_info_s *page_info = NULL;
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *white_list = NULL;
+ Eina_List *black_list = NULL;
+ const Eina_List *l, *ln;
+
+ main_info.is_tts = val;
+ apps_main_list_tts(val);
+
+ layout_info = evas_object_data_get(main_info.layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ if (evas_object_data_get(main_info.layout, DATA_KEY_ADD_VIEWER) != NULL) {
+ _D("destroy a addviewer");
+ edit_destroy_add_viewer(main_info.layout);
+ }
+
+ if (layout_info->edit != NULL) {
+ _D("destroy a editing layout");
+ edit_destroy_layout(main_info.layout);
+ }
+
+ scroller = evas_object_data_get(main_info.layout, DATA_KEY_SCROLLER);
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ page_info_list = db_write_list();
+
+ if (main_info.is_tts) {
+ _W("TTS is on");
+
+ white_list = _create_tts_list(WHITE_LIST);
+ ret_if(!white_list);
+
+ black_list = _create_tts_list(BLACK_LIST);
+ ret_if(!black_list);
+
+ EINA_LIST_FOREACH_SAFE(page_info_list, l, ln, page_info) {
+ if(_page_info_in_list(page_info, white_list)) continue;
+ if(_page_info_in_list(page_info, black_list)) {
+ page_info_list = eina_list_remove(page_info_list, page_info);
+ continue;
+ }
+ }
+
+ _destroy_tts_list(white_list);
+ _destroy_tts_list(black_list);
+
+ if (W_HOME_ERROR_NONE != db_read_list(page_info_list)) {
+ _E("Cannot write items into the DB");
+ }
+
+ /* If TTS is on, use focus & do not use the enhanced scroller. */
+ elm_object_tree_focus_allow_set(main_info.layout, EINA_TRUE);
+ _D("tree_focus_allow_set layout(%p) as TRUE", main_info.layout);
+
+ page_focus(scroller_info->center);
+ scroller_backup_inner_focus(scroller);
+ scroller_restore_inner_focus(scroller);
+ } else {
+ _W("TTS is off");
+
+ /* If TTS is off, do not use focus */
+ elm_object_tree_focus_allow_set(main_info.layout, EINA_FALSE);
+ _D("tree_focus_allow_set layout(%p) as FALSE", main_info.layout);
+ }
+
+ scroller_pop_pages(scroller, PAGE_DIRECTION_RIGHT);
+ scroller_push_pages(scroller, page_info_list, _del_list, page_info_list);
+ }
+
+ if (apps_main_is_visible() == EINA_TRUE) {
+ apps_main_launch(APPS_LAUNCH_HIDE);
+ }
+
+ /* UX requirement: activate home window when TTS option is changed */
+ ecore_job_add(_activate_window_job_cb, NULL);
+}
+
+
+
+static void _tutorial_cb(keynode_t *node, void *data)
+{
+ int tutorial_enabled = _is_tutorial_enabled();
+
+ if (tutorial_enabled == 0) {
+ if (main_info.state == APP_STATE_RESUME) {
+ _home_visibility_vconf_set(1);
+ } else {
+ _home_visibility_vconf_set(0);
+ }
+
+ popup_show(POPUP_STAGE_AFTER_TUTORIAL);
+ }
+}
+
+
+
+static void _init_theme(void)
+{
+ main_info.theme = elm_theme_new();
+ elm_theme_ref_set(main_info.theme, NULL);
+ elm_theme_extension_add(main_info.theme, EDJEDIR"/index.edj");
+
+ /* Default Changeable UI State : off */
+ ea_theme_changeable_ui_enabled_set(EINA_FALSE);
+
+ if (!main_info.color_theme) {
+ main_info.color_theme = ea_theme_color_table_new(PREFIX"/shared/res/tables/org.tizen.w-home_ChangeableColorInfo.xml");
+ ret_if (!main_info.color_theme);
+ }
+ /* Default Theme Style : DEFAULT(B3 is Dark, Kiran is Light) */
+ ea_theme_style_set(EA_THEME_STYLE_DEFAULT);
+ ea_theme_colors_set(main_info.color_theme, EA_THEME_STYLE_DEFAULT);
+
+ if (!main_info.font_theme) {
+ main_info.font_theme = ea_theme_font_table_new(PREFIX"/shared/res/tables/org.tizen.w-home_ChangeableFontInfo.xml");
+ ret_if(!main_info.font_theme);
+ }
+ ea_theme_fonts_set(main_info.font_theme);
+
+ ea_theme_system_colors_apply();
+ ea_theme_system_fonts_apply();
+}
+
+
+
+static void _destroy_theme(void)
+{
+ elm_theme_extension_del(main_info.theme, EDJEDIR"/index.edj");
+ elm_theme_free(main_info.theme);
+ main_info.theme = NULL;
+
+ if (main_info.color_theme) {
+ ea_theme_color_table_free(main_info.color_theme);
+ main_info.color_theme = NULL;
+ }
+ if (main_info.font_theme) {
+ ea_theme_font_table_free(main_info.font_theme);
+ main_info.font_theme = NULL;
+ }
+}
+
+
+
+static Eina_Bool _appcore_flush_cb(void *data)
+{
+ if (APP_STATE_PAUSE != main_info.state) return ECORE_CALLBACK_CANCEL;
+ if (0 != appcore_flush_memory()) _E("Cannot flush memory");
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void main_inc_booting_state(void)
+{
+ main_info.booting_state++;
+ if (BOOTING_STATE_DONE > main_info.booting_state) return;
+
+ w_home_error_e ret = W_HOME_ERROR_NONE;
+ do {
+ ret = pkgmgr_reserve_list_pop_request();
+ } while (W_HOME_ERROR_NONE == ret);
+
+ /* Cache memory is cleared when the application paused (every time, after 5 seconds (in appcore)),
+ * but after running in a minimized mode (HIDE_LAUNCH) application have status AS_RUNNING.
+ * Application have status AS_PAUSED only after change of visibility to hidden condition by user (on hiding window)
+ * Cleaning must be performed only once after application loading in hidden condition
+ * (and stay in a hidden condition at time of cleaning).
+ */
+ if (APP_STATE_PAUSE == main_info.state) {
+ ecore_timer_add(5.0f, _appcore_flush_cb, NULL);
+ }
+}
+
+
+
+HAPI void main_dec_booting_state(void)
+{
+ main_info.booting_state--;
+}
+
+
+
+HAPI int main_get_booting_state(void)
+{
+ return main_info.booting_state;
+}
+
+
+
+HAPI w_home_error_e main_register_cb(
+ int state,
+ w_home_error_e (*result_cb)(void *), void *result_data)
+{
+ main_cb_s *cb = NULL;
+
+ retv_if(NULL == result_cb, W_HOME_ERROR_INVALID_PARAMETER);
+
+ cb = calloc(1, sizeof(main_cb_s));
+ retv_if(NULL == cb, W_HOME_ERROR_FAIL);
+
+ cb->result_cb = result_cb;
+ cb->result_data = result_data;
+
+ main_info.cbs_list[state] = eina_list_append(main_info.cbs_list[state], cb);
+ retv_if(NULL == main_info.cbs_list[state], W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI void main_unregister_cb(
+ int state,
+ w_home_error_e (*result_cb)(void *))
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ main_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(main_info.cbs_list[state], l, n, cb) {
+ continue_if(NULL == cb);
+ if (result_cb != cb->result_cb) continue;
+ main_info.cbs_list[state] = eina_list_remove(main_info.cbs_list[state], cb);
+ free(cb);
+ return;
+ }
+}
+
+
+
+static void _execute_cbs(int state)
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ main_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(main_info.cbs_list[state], l, n, cb) {
+ continue_if(NULL == cb);
+ continue_if(NULL == cb->result_cb);
+
+ if (W_HOME_ERROR_NONE != cb->result_cb(cb->result_data)) _E("There are some problems");
+ }
+}
+
+
+
+static int _dead_cb(int pid, void *data)
+{
+ _D("PID(%d) is dead", pid);
+ /* Who manages the idle clock? home_item_idle_clock_app_dead_cb */
+ clock_service_event_app_dead_cb(pid);
+
+ return 1;
+}
+
+
+
+#if 0 /* EFL private features */
+static Eina_Bool _window_effect_setting_cb(void *data)
+{
+ gesture_home_window_effect_set(1);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+#endif
+
+
+
+static void _resume_cb(void *data)
+{
+ _D("Resumed");
+
+ if (main_info.state == APP_STATE_RESUME) {
+ _E("resumed already");
+ return;
+ }
+
+#if 0 /* EFL private features */
+ ecore_timer_add(0.2f, _window_effect_setting_cb, NULL);
+#endif
+
+ if (apps_main_is_visible() && main_info.is_win_visible == 0) {
+ _E("Apps is showing");
+ return;
+ }
+
+ if (_is_tutorial_enabled() == 0) {
+ _home_visibility_vconf_set(1);
+ }
+
+ main_info.state = APP_STATE_RESUME;
+ _execute_cbs(APP_STATE_RESUME);
+
+ if (main_info.is_alpm_clock_enabled == 0) {
+ if (_is_lcd_turned_on() == 1) {
+ _W("clock/widget resumed");
+ evas_object_dynamicbox_resumed();
+ clock_service_resume();
+ }
+ }
+}
+
+
+
+static void _pause_cb(void *data)
+{
+ _D("Paused");
+
+ if (main_info.state == APP_STATE_PAUSE) {
+ _E("paused already");
+ return;
+ }
+
+ _home_visibility_vconf_set(0);
+
+ main_info.state = APP_STATE_PAUSE;
+ _execute_cbs(APP_STATE_PAUSE);
+
+ /* DYNAMICBOX pause */
+ _W("clock/widget paused");
+ evas_object_dynamicbox_paused();
+ clock_service_pause();
+}
+
+
+
+static void _setup_wizard_cb(keynode_t *node, void *data)
+{
+ Eina_List *page_info_list = NULL;
+ layout_info_s *layout_info = NULL;
+ const char *file = NULL;
+ int setup_wizard = 1;
+
+ if (vconf_get_int(VCONFKEY_SETUP_WIZARD_STATE, &setup_wizard) < 0) {
+ _E("Failed to get VCONFKEY_SETUP_WIZARD_STATE");
+ }
+
+ if (setup_wizard) {
+ _W("Setup wizard is still on");
+ return;
+ }
+
+ /* If setup_wizard is off, please ignore this callback */
+ vconf_ignore_key_changed(VCONFKEY_SETUP_WIZARD_STATE, _setup_wizard_cb);
+
+ /* Below routines is same with _dbox_load_init_timer_cb. */
+ if (main_info.is_tts) {
+ _W("TTS is on");
+ file = TTS_XML_FILE;
+ } else {
+ _W("TTS is off");
+ file = DEFAULT_XML_FILE;
+ }
+
+ if (file && 0 == access(file, R_OK)) {
+ _W("We'll read the file(%s)", file);
+ } else {
+ _E("Cannot access the file(%s)", file);
+ file = DEFAULT_XML_FILE;
+ }
+
+ page_info_list = xml_write_list(file);
+ if (!page_info_list) {
+ _E("Critical! Cannot read xml file(%s)", file);
+ return;
+ }
+
+ if (W_HOME_ERROR_NONE != db_read_list(page_info_list)) {
+ _E("Cannot write items into the DB");
+ }
+
+ layout_info = evas_object_data_get(main_info.layout, DATA_KEY_LAYOUT_INFO);
+ if (layout_info) {
+ scroller_push_pages(layout_info->scroller, page_info_list, _del_list, page_info_list);
+ }
+}
+
+
+
+static Eina_Bool _dbox_load_init_timer_cb(void *data)
+{
+ const char *file = NULL;
+ Eina_List *page_info_list = NULL;
+ layout_info_s *layout_info = NULL;
+
+ _W("Loads DBoxes");
+
+ if (emergency_mode_enabled_get()) {
+ _W("Emergency mode, we don't need to add dboxes.");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ /* Order is very important. Do not change if-statments */
+ if (main_info.first_boot) {
+ int setup_wizard = 0;
+
+ main_info.first_boot = 0;
+
+ if (vconf_get_int(VCONFKEY_SETUP_WIZARD_STATE, &setup_wizard) < 0) {
+ _E("Failed to get VCONFKEY_SETUP_WIZARD_STATE");
+ }
+
+ if (setup_wizard) {
+ _W("Setup wizard is still on");
+ if (vconf_notify_key_changed(VCONFKEY_SETUP_WIZARD_STATE, _setup_wizard_cb, NULL) < 0) {
+ _E("Failed to register the setup_wizard callback");
+ }
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ /* Below routines is same with _setup_wizard_cb */
+ if (main_info.is_tts) {
+ _W("TTS is on");
+ file = TTS_XML_FILE;
+ } else {
+ _W("TTS is off");
+ file = DEFAULT_XML_FILE;
+ }
+
+ if (file && 0 == access(file, R_OK)) {
+ _W("We'll read the file(%s)", file);
+ } else {
+ _E("Cannot access the file(%s)", file);
+ file = DEFAULT_XML_FILE;
+ }
+
+ page_info_list = xml_write_list(file);
+ if (!page_info_list) {
+ _E("Critical! Cannot read xml file(%s)", file);
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ if (W_HOME_ERROR_NONE != db_read_list(page_info_list)) {
+ _E("Cannot write items into the DB");
+ }
+ } else {
+ _W("Read DB for initial list");
+ page_info_list = db_write_list();
+ }
+
+ layout_info = evas_object_data_get(main_info.layout, DATA_KEY_LAYOUT_INFO);
+ if (layout_info) {
+ scroller_push_pages(layout_info->scroller, page_info_list, _del_list, page_info_list);
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Eina_Bool _noti_broker_init_timer_cb(void *data)
+{
+ _W("loading noti broker");
+ noti_broker_init();
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Eina_Bool _clock_service_init_timer_cb(void *data)
+{
+ _W("clock service init");
+ clock_service_init();
+ minicontrol_init();
+ power_mode_ui_init();
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Eina_Bool _visibility_timeout_cb(void *data)
+{
+ _E("Visibility event is not reached in %lf seconds", VISIBILITY_TIMEOUT);
+
+ effect_init();
+ _clock_service_init_timer_cb(data);
+ _dbox_load_init_timer_cb(NULL);
+
+ main_info.safety_init_timer = NULL;
+ main_info.is_service_initialized = 1;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Eina_Bool _window_visibility_cb(void *data, int type, void *event)
+{
+ Ecore_X_Event_Window_Visibility_Change *ev = event;
+ retv_if(ev == NULL, ECORE_CALLBACK_PASS_ON);
+
+ if (!main_info.win) {
+ return ECORE_CALLBACK_PASS_ON;
+ }
+
+ Ecore_X_Window xWin = elm_win_xwindow_get(main_info.win);
+
+ if (xWin != ev->win) {
+ return ECORE_CALLBACK_PASS_ON;
+ }
+
+ _W("Window [0x%X] is now visible(%d)", xWin, ev->fully_obscured);
+
+ if (ev->fully_obscured == 1) {
+ main_info.is_win_visible = 0;
+ } else {
+ main_info.is_win_visible = 1;
+ }
+
+ if (main_info.is_service_initialized == 0) {
+ if (main_info.safety_init_timer) {
+ /**
+ * Delete the safety timer,
+ * We are successfully get the visibility change event.
+ * So we don't need to keep the safety timer anymore.
+ * Delete it.
+ */
+ ecore_timer_del(main_info.safety_init_timer);
+ main_info.safety_init_timer = NULL;
+ }
+
+ _clock_service_init_timer_cb(NULL);
+
+ if (!ecore_timer_add(LAZY_NOTI_TIMER, _noti_broker_init_timer_cb, NULL)) {
+ _E("Failed to create a new timer for noti-broker");
+ _noti_broker_init_timer_cb(NULL);
+ }
+
+ if (!ecore_timer_add(LAZY_DBOX_TIMER, _dbox_load_init_timer_cb, NULL)) {
+ _E("Failed to create a new timer for dbox initializer");
+ _dbox_load_init_timer_cb(NULL);
+ }
+
+ effect_init();
+
+ main_info.is_service_initialized = 1;
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+
+
+static Eina_Bool _window_focus_in_cb(void *data, int type, void *event)
+{
+ Ecore_X_Event_Window_Focus_In *ev = event;
+
+ if (!main_info.win) {
+ return ECORE_CALLBACK_PASS_ON;
+ }
+
+ Ecore_X_Window xWin = elm_win_xwindow_get(main_info.win);
+ if (xWin == ev->win) {
+ _D("focus in");
+ _resume_cb(NULL);
+ } else {
+ _E("win[%d], ev->win[%d]", xWin, ev->win);
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+
+
+static Eina_Bool _window_focus_out_cb(void *data, int type, void *event)
+{
+ Ecore_X_Event_Window_Focus_Out *ev = event;
+
+ if (!main_info.win) {
+ return ECORE_CALLBACK_PASS_ON;
+ }
+
+ Ecore_X_Window xWin = elm_win_xwindow_get(main_info.win);
+ if (xWin == ev->win) {
+ _D("focus out");
+ _pause_cb(NULL);
+
+ if (tutorial_is_exist()) {
+ Ecore_X_Window xwin = ecore_x_window_focus_get();
+ if (tutorial_is_apps(xwin)) {
+ _D("tutorial shows apps");
+ tutorial_set_transient_for(xwin);
+ } else if (tutorial_is_indicator(xwin)) {
+ _D("tutorial shows indicator");
+ tutorial_set_transient_for(xwin);
+ } else {
+ _E("Cannot reach here");
+ }
+ }
+ } else {
+ _E("win[%d], ev->win[%d]", xWin, ev->win);
+ }
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+
+
+static void _change_apps_order_cb(keynode_t *node, void *data)
+{
+ int value = -1;
+
+ /* check Emergency Mode */
+ if (emergency_mode_enabled_get()) {
+ _E("emergency mode enabled");
+ return;
+ }
+
+ // 0 : init, 1 : backup request, 2 : restore request, 3: write done
+ if (vconf_get_int(VCONF_KEY_WMS_APPS_ORDER, &value) < 0) {
+ _E("Failed to get VCONFKEY_WMS_APPS_ORDER");
+ return;
+ }
+
+ _D("Change apps order vconf:[%d]", value);
+ wms_change_apps_order(value);
+}
+
+
+
+static void _alpm_manager_status_changed_cb(void *user_data, void *event_info)
+{
+ char *status = event_info;
+ ret_if(status == NULL);
+
+ _W("alpm status:%s", status);
+
+ main_s *main_info = main_get_info();
+ ret_if(main_info == NULL);
+
+ if (strcmp(status, ALPM_MANAGER_STATUS_SHOW) == 0) {
+ main_info->is_alpm_clock_enabled = 1;
+
+ } else if (strcmp(status, ALPM_MANAGER_STATUS_ALPM_HIDE) == 0) {
+ _D("is win visible?:%d", main_info->is_win_visible);
+ main_info->is_alpm_clock_enabled = 0;
+ if (main_info->state == APP_STATE_RESUME || main_info->is_win_visible == 1) {
+ if (_is_lcd_turned_on() == 1) {
+ _W("clock/widget resumed");
+ evas_object_dynamicbox_resumed();
+ clock_service_resume();
+ }
+ }
+ } else if (strcmp(status, ALPM_MANAGER_STATUS_SIMPLE_HIDE) == 0) {
+ main_info->is_alpm_clock_enabled = 0;
+ evas_object_dynamicbox_resumed();
+ clock_service_resume();
+ }
+}
+
+
+static void _lcd_on_cb(void *user_data, void *event_info)
+{
+ main_s *main_info = main_get_info();
+ ret_if(main_info == NULL);
+
+ _W("LCD: off->on");
+ main_info->is_lcd_on = 1;
+ if (main_info->state == APP_STATE_RESUME) {
+ if (main_info->is_alpm_clock_enabled == 0) {
+ _W("clock/widget resumed");
+ evas_object_dynamicbox_resumed();
+ clock_service_resume();
+ }
+ }
+}
+
+static void _lcd_off_cb(void *user_data, void *event_info)
+{
+ main_s *main_info = main_get_info();
+ ret_if(main_info == NULL);
+
+ _D("LCD: on->off");
+ main_info->is_lcd_on = 0;
+ if (main_info->state == APP_STATE_RESUME) {
+ _W("clock/widget paused");
+ evas_object_dynamicbox_paused();
+ clock_service_pause();
+ }
+}
+
+
+
+#define LANGUAGE_MALI "ml_IN"
+#define LANGUAGE_GEORGIA "ka_GE"
+static void _check_lang(void)
+{
+ char *lang = NULL;
+
+ lang = vconf_get_str(VCONFKEY_LANGSET);
+ if (!lang) {
+ return;
+ }
+ elm_language_set(lang);
+
+ if (!strncmp(lang, LANGUAGE_MALI, strlen(LANGUAGE_MALI))) {
+ main_info.is_wide_character = TUTORIAL_LANGUAGE_MALI;
+ } else if (!strncmp(lang, LANGUAGE_GEORGIA, strlen(LANGUAGE_GEORGIA))) {
+ main_info.is_wide_character = TUTORIAL_LANGUAGE_GEORGIA;
+ } else {
+ main_info.is_wide_character = TUTORIAL_LANGUAGE_NORMAL;
+ }
+
+ free(lang);
+}
+
+
+
+#define TUTORIAL_TIMER 1.5f
+static bool _create_cb(void *data)
+{
+ Evas_Object *bg = NULL;
+ int tutorial_enabled = 0;
+ Ecore_Event_Handler *handler;
+ char *pkgname;
+
+ _D("Created");
+ home_dbus_init(NULL);
+ power_mode_init();
+ db_init(DB_FILE_NORMAL);
+
+ main_info.state = APP_STATE_CREATE;
+ evas_object_add_viewer_init();
+
+ if (vconf_notify_key_changed(VCONF_KEY_WMS_APPS_ORDER, _change_apps_order_cb, NULL) < 0) {
+ _E("Failed to register the changed_apps_order callback");
+ }
+ /* wms vconf has to be dealt after pushing pages */
+
+ if (vconf_notify_key_changed(VCONF_KEY_HOME_IS_TUTORIAL, _tutorial_cb, NULL) < 0) {
+ _E("Failed to register the tutorial callback");
+ }
+
+ retv_if(vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &main_info.is_tts) < 0, W_HOME_ERROR_FAIL);
+ _check_lang();
+
+ wms_register_setup_wizard_vconf();
+
+#if 1 //TBD
+ home_gesture_init();
+ if (home_dbus_register_cb(DBUS_EVENT_LCD_ON, _lcd_on_cb, NULL) != W_HOME_ERROR_NONE) {
+ _E("Failed to register lcd status changed cb");
+ }
+ if (home_dbus_register_cb(DBUS_EVENT_LCD_OFF, _lcd_off_cb, NULL) != W_HOME_ERROR_NONE) {
+ _E("Failed to register lcd status changed cb");
+ }
+#else
+ if (vconf_notify_key_changed(VCONFKEY_PM_STATE, _pm_state_cb, NULL) < 0) {
+ _E("Failed to register the pm status callback");
+ }
+#endif
+ if (home_dbus_register_cb(DBUS_EVENT_ALPM_MANAGER_STATE_CHANGED, _alpm_manager_status_changed_cb, NULL) != W_HOME_ERROR_NONE) {
+ _E("Failed to register alpm manager status changed cb");
+ }
+
+ /**
+ * Register the X Event handlers before creating our Window.
+ * If you don't want to be bothered by timing issue of these **cking events ;)
+ */
+ handler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _window_focus_in_cb, NULL);
+ if (!handler) {
+ _E("Failed to add an ecore event handler (FOCUS_IN)");
+ }
+ evas_object_data_set(main_info.win, PRIVATE_DATA_KEY_FOCUS_IN_EVENT_HANDLER, handler);
+
+ handler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, _window_focus_out_cb, NULL);
+ if (!handler) {
+ _E("Failed to add an ecore event handler (FOCUS_OUT)");
+ }
+ evas_object_data_set(main_info.win, PRIVATE_DATA_KEY_FOCUS_OUT_EVENT_HANDLER, handler);
+
+ handler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, _window_visibility_cb, NULL);
+ if (!handler) {
+ _E("Failed to add an ecore event handler (VISIBILITY_CHANGE)");
+ }
+ evas_object_data_set(main_info.win, PRIVATE_DATA_KEY_VISIBILITY_EVENT_HANDLER, handler);
+
+ main_info.win = win_create("W-Home");
+ retv_if(!main_info.win, false);
+ evas_object_smart_callback_add(main_info.win, "access,changed", _tts_cb, NULL);
+
+ /* DYNAMICBOX init */
+ dbox_init(main_info.win);
+
+ /* Key register */
+ key_register();
+
+ bg = bg_create(main_info.win);
+ if (!bg) {
+ _E("Cannot create bg");
+ win_destroy(main_info.win);
+ return false;
+ }
+
+ main_info.layout = layout_create(main_info.win);
+ if (!main_info.layout) {
+ _E("Cannot create layout");
+ bg_destroy(main_info.win);
+ win_destroy(main_info.win);
+ return false;
+ }
+
+ if (main_info.is_tts) {
+ /* If TTS is on, use focus & do not use the enhanced scroller. */
+ _D("Set tree focus as true");
+ elm_object_tree_focus_allow_set(main_info.layout, EINA_TRUE);
+ } else {
+ /* If TTS is off, do not use focus */
+ _D("Set tree focus as false");
+ elm_object_tree_focus_allow_set(main_info.layout, EINA_FALSE);
+ }
+
+ _execute_cbs(APP_STATE_CREATE);
+
+ /**
+ * After preparation is done,
+ * Create a dbox clock if it is prepared.
+ */
+ pkgname = clock_service_clock_pkgname_get();
+ if (clock_inf_prepare_first_clock(pkgname) != CLOCK_RET_OK) {
+ /* What happens */
+ }
+ free(pkgname);
+
+ /* After creating a window */
+ _init_theme();
+
+ clock_service_event_register();
+ /**
+ * This function initialize the noti-broker.
+ * But we already manage it from this file.
+ * and the _load function uses timer to initialize the noti.
+ * It uses 10 secs.....
+ */
+ noti_broker_load();
+
+ /*
+ * workaround: when window visibiltiy cb isn't called
+ */
+ main_info.safety_init_timer = ecore_timer_add(VISIBILITY_TIMEOUT, _visibility_timeout_cb, NULL);
+ if (!main_info.safety_init_timer) {
+ _E("Failed to create a fallback init timer for safety");
+ }
+
+ if (vconf_get_int(VCONF_KEY_HOME_IS_TUTORIAL_ENABLED_TO_RUN, &tutorial_enabled) != 0) {
+ _E("Cannot get the vconf for %s", VCONF_KEY_HOME_IS_TUTORIAL_ENABLED_TO_RUN);
+ }
+
+ if (tutorial_enabled && util_feature_enabled_get(FEATURE_TUTORIAL) == 1) {
+ if (!tutorial_create(main_info.layout)) {
+ _E("Cannot create a tutorial");
+ }
+ }
+
+ /**
+ * Dead callback should be called after initialize all services.
+ * So we should register this at the last of this function.
+ */
+ aul_listen_app_dead_signal(_dead_cb, NULL);
+
+ return true;
+}
+
+
+
+static void _terminate_cb(void *data)
+{
+ layout_info_s *layout_info = NULL;
+
+ main_dec_booting_state();
+ evas_object_add_viewer_fini();
+
+ _D("Terminated");
+
+ home_dbus_fini(NULL);
+
+ apps_main_fini();
+
+
+ home_dbus_unregister_cb(DBUS_EVENT_LCD_ON, _lcd_on_cb);
+ home_dbus_unregister_cb(DBUS_EVENT_LCD_OFF, _lcd_off_cb);
+ home_dbus_unregister_cb(DBUS_EVENT_ALPM_MANAGER_STATE_CHANGED, _alpm_manager_status_changed_cb);
+
+ Ecore_Event_Handler *handler = evas_object_data_del(main_info.win, PRIVATE_DATA_KEY_FOCUS_IN_EVENT_HANDLER);
+ if (handler) ecore_event_handler_del(handler);
+
+ handler = evas_object_data_del(main_info.win, PRIVATE_DATA_KEY_FOCUS_OUT_EVENT_HANDLER);
+ if (handler) ecore_event_handler_del(handler);
+
+ handler = evas_object_data_del(main_info.win, PRIVATE_DATA_KEY_VISIBILITY_EVENT_HANDLER);
+ if (handler) ecore_event_handler_del(handler);
+
+ main_info.state = APP_STATE_TERMINATE;
+ _execute_cbs(APP_STATE_TERMINATE);
+
+ wms_unregister_setup_wizard_vconf();
+
+ layout_info = evas_object_data_get(main_info.layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ if (layout_info->tutorial) {
+ tutorial_destroy(layout_info->tutorial);
+ layout_info->tutorial = NULL;
+ }
+
+ _destroy_theme();
+
+ vconf_ignore_key_changed(VCONF_KEY_WMS_APPS_ORDER, _change_apps_order_cb);
+ vconf_ignore_key_changed(VCONF_KEY_HOME_IS_TUTORIAL, _tutorial_cb);
+
+ effect_fini();
+
+ clock_service_event_deregister();
+
+ /* Clock Service fini */
+ clock_service_fini();
+
+ /* Minicontrol fini */
+ minicontrol_fini();
+
+ noti_broker_fini();
+
+ /* Emergency Mode fini */
+ power_mode_fini();
+
+ /*!
+ * DBUS fini
+ * Gesture fini
+ * calling sequence is meaningful
+ */
+ home_gesture_fini();
+
+ bg_destroy(main_info.win);
+
+ /* Key unregister */
+ key_unregister();
+
+ win_destroy(main_info.win);
+
+ /* DYNAMICBOX fini */
+ dbox_fini();
+
+ if (main_info.apps_pid) {
+ aul_terminate_pid(main_info.apps_pid);
+ main_info.apps_pid = 0;
+ }
+}
+
+
+
+static Eina_Bool _show_noti_timer_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ retv_if(scroller == NULL, ECORE_CALLBACK_CANCEL);
+
+ scroller_bring_in_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static void _activate_window_job_cb(void *data)
+{
+ ret_if(!main_info.win);
+
+ _D("Activate the window");
+ elm_win_activate(main_info.win);
+ home_dbus_home_raise_signal_send();
+
+ _resume_cb(NULL);
+}
+
+
+
+static Evas_Object *_layout_get(void)
+{
+ Evas_Object *layout = NULL;
+
+ if (!main_info.win) {
+ return NULL;
+ }
+
+ layout = evas_object_data_get(main_info.win, DATA_KEY_LAYOUT);
+
+ return layout;
+}
+
+
+
+static Evas_Object *_scroller_get(void)
+{
+ Evas_Object *layout = _layout_get();
+ retv_if(layout == NULL, NULL);
+
+ return elm_object_part_content_get(layout, "scroller");
+}
+
+
+
+static void _app_control(app_control_h service, void *data)
+{
+ /* powerkey bundle */
+ char *service_val = NULL;
+
+ apps_main_init();
+
+ app_control_get_extra_data(service, HOME_SERVICE_KEY, &service_val);
+ _D("Service value : %s", service_val);
+
+ if (service_val) {
+ int is_clock_displayed = 0;
+ int is_window_on_top = _is_window_on_top();
+ is_window_on_top = (apps_main_is_visible() == EINA_TRUE) ? 0 : is_window_on_top;
+ Evas_Object *layout = _layout_get();
+ Evas_Object *scroller = _scroller_get();
+ if (scroller_get_current_page_direction(scroller) == PAGE_DIRECTION_CENTER) {
+ is_clock_displayed = 1;
+ }
+
+ if (!strncmp(service_val, HOME_SERVICE_VALUE_POWERKEY, strlen(HOME_SERVICE_VALUE_POWERKEY))) {
+ int tutorial_exist = tutorial_is_exist();
+
+ _D("Powerkey operation");
+
+ if(tutorial_exist) {
+ is_window_on_top = 1;
+ } else {
+ apps_main_launch(APPS_LAUNCH_HIDE);
+ }
+
+ if (is_clock_displayed == 1) {
+ _D("clock is displayed");
+ if (is_window_on_top == 1) {
+ _D("home window is top");
+ if (_is_lcd_turned_on() == 1) {
+ if (layout_is_idle(layout) == 1) {
+ home_dbus_lcd_off_signal_send();
+ } else {
+ _W("home isn't in idle");
+ }
+ }
+ }
+ } else if (!tutorial_exist) {
+ scroller_bring_in_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+ }
+
+ key_cb_execute(KEY_TYPE_HOME);
+ } else if (!strncmp(service_val, HOME_SERVICE_VALUE_EDIT, strlen(HOME_SERVICE_VALUE_EDIT))) {
+ _D("Edit operation");
+ } else if (!strncmp(service_val, HOME_SERVICE_VALUE_SHOW_APPS, strlen(HOME_SERVICE_VALUE_SHOW_APPS))) {
+ if (util_feature_enabled_get(FEATURE_APPS) == 1) {
+ apps_main_launch(APPS_LAUNCH_SHOW);
+ _D("Show apps operation");
+ }
+ } else if (!strncmp(service_val, HOME_SERVICE_VALUE_APPS_EDIT, strlen(HOME_SERVICE_VALUE_APPS_EDIT))) {
+ _D("Apps edit operation");
+ apps_main_launch(APPS_LAUNCH_EDIT);
+ is_window_on_top = 1;
+
+ } else if (!strncmp(service_val, HOME_SERVICE_VALUE_SHOW_NOTI, strlen(HOME_SERVICE_VALUE_SHOW_NOTI))) {
+ _D("Show noti operation");
+ ecore_timer_add(0.250f, _show_noti_timer_cb, scroller);
+ } else if (!strncmp(service_val, HOME_SERVICE_VALUE_FIRST_BOOT, strlen(HOME_SERVICE_VALUE_FIRST_BOOT))) {
+ _D("First boot operation");
+ main_info.first_boot = 1;
+ }
+
+ if (is_window_on_top == 0) {
+ ecore_job_add(_activate_window_job_cb, NULL);
+ }
+
+ free(service_val);
+ } else {
+ ecore_job_add(_activate_window_job_cb, NULL);
+ _execute_cbs(APP_STATE_RESET);
+ }
+}
+
+
+
+static void _language_changed(void *data)
+{
+ _D("");
+ apps_main_language_chnage();
+ evas_object_add_viewer_reload();
+
+ _check_lang();
+ _execute_cbs(APP_STATE_LANGUAGE_CHANGED);
+}
+
+
+
+
+int main(int argc, char *argv[])
+{
+ int ret;
+ app_event_callback_s event_callback;
+ char *clock_pkgname;
+
+ if (CRITICAL_LOG_INIT(util_basename(argv[0])) < 0) {
+ _E("Failed to initiate the critical log system");
+ }
+
+ event_callback.create = _create_cb;
+ event_callback.terminate = _terminate_cb;
+ event_callback.pause = _pause_cb;
+ event_callback.resume = _resume_cb;
+ event_callback.app_control = _app_control;
+ event_callback.low_memory = NULL;
+ event_callback.low_battery = NULL;
+ event_callback.device_orientation = NULL;
+ event_callback.language_changed = _language_changed;
+ event_callback.region_format_changed = NULL;
+
+ if (setenv("ELM_ENGINE", "gl", 1) < 0) {
+ _E("setenv(ELM_ENGINE) is failed: %s", strerror(errno));
+ }
+
+ if (setenv("COREGL_FASTPATH", "1", 1) < 0) {
+ _E("setenv(COREGL_FASTPATH) is failed: %s", strerror(errno));
+ }
+
+ if (setenv("BUFMGR_LOCK_TYPE", "always", 0) < 0) {
+ _E("setenv(BUFMGR_LOCK_TYPE) is failed: %s", strerror(errno));
+ }
+
+ if (setenv("BUFMGR_MAP_CACHE", "true", 0) < 0) {
+ _E("setenv(BUFMGR_MAP_CACHE) is failed: %s", strerror(errno));
+ }
+
+ /* initial mode set */
+ if (emergency_mode_enabled_get() == 1) {
+ clock_service_mode_set(CLOCK_SERVICE_MODE_EMERGENCY);
+ }
+ if (cooldown_mode_enabled_get() == 1) {
+ clock_service_mode_set(CLOCK_SERVICE_MODE_COOLDOWN);
+ }
+
+ /* Launch the clock */
+ if ((clock_pkgname = clock_service_clock_pkgname_get()) != NULL) {
+ clock_util_provider_launch(clock_pkgname, NULL, CLOCK_CONF_NONE);
+ free(clock_pkgname);
+ }
+
+ ret = app_efl_main(&argc, &argv, &event_callback, &main_info);
+ CRITICAL_LOG_FINI();
+ return ret;
+}
+
+
+
+// End of a file
diff --git a/home/src/mapbuf.c b/home/src/mapbuf.c
new file mode 100755
index 0000000..beed1c9
--- /dev/null
+++ b/home/src/mapbuf.c
@@ -0,0 +1,250 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <stdbool.h>
+#include <efl_assist.h>
+#include <dlog.h>
+#include <bundle.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "mapbuf.h"
+
+#define PRIVATE_DATA_KEY_MAPBUF_ENABLED "p_mb_en"
+
+
+HAPI Evas_Object *mapbuf_get_mapbuf(Evas_Object *obj)
+{
+ Evas_Object *mapbuf;
+
+ if (obj == NULL) return NULL;
+
+ mapbuf = evas_object_data_get(obj, DATA_KEY_MAPBUF);
+ if (!mapbuf && evas_object_data_get(obj, DATA_KEY_PAGE)) {
+ mapbuf = obj;
+ }
+
+ return mapbuf;
+}
+
+
+
+HAPI Evas_Object *mapbuf_get_page(Evas_Object *obj)
+{
+ Evas_Object *page;
+
+ retv_if(NULL == obj, NULL);
+
+ page = evas_object_data_get(obj, DATA_KEY_PAGE);
+ if (!page && evas_object_data_get(obj, DATA_KEY_MAPBUF)) {
+ page = obj;
+ }
+
+ return page;
+}
+
+
+
+HAPI void mapbuf_set_color(Evas_Object *obj, int a)
+{
+ Evas_Object *mapbuf = mapbuf_get_mapbuf(obj);
+ ret_if(NULL == mapbuf);
+
+ int i;
+ for (i = 0; i < 4; i ++) {
+ elm_mapbuf_point_color_set(mapbuf, i, a, a, a, a);
+ }
+}
+
+
+
+static void _move_pages(Evas_Object *page)
+{
+ ret_if(NULL == page);
+
+ Evas_Object *scroller = evas_object_data_get(page, DATA_KEY_SCROLLER);
+ if (NULL == scroller) return;
+
+ Evas_Coord x, y;
+ evas_object_geometry_get(scroller, &x, &y, NULL, NULL);
+ evas_object_move(page, x, y);
+}
+
+
+
+HAPI w_home_error_e mapbuf_enable(Evas_Object *obj, int force)
+{
+ Evas_Object *mapbuf = mapbuf_get_mapbuf(obj);
+ retv_if(NULL == mapbuf, W_HOME_ERROR_FAIL);
+
+ Evas_Object *page = mapbuf_get_page(obj);
+ retv_if(NULL == page, W_HOME_ERROR_FAIL);
+
+ if (force) {
+ evas_object_data_set(mapbuf, PRIVATE_DATA_KEY_MAPBUF_ENABLED, (void*)0);
+ _move_pages(page);
+ elm_mapbuf_enabled_set(mapbuf, 1);
+ return W_HOME_ERROR_NONE;
+ }
+
+ int cnt = (int)evas_object_data_get(mapbuf, PRIVATE_DATA_KEY_MAPBUF_ENABLED);
+ cnt ++;
+ evas_object_data_set(mapbuf, PRIVATE_DATA_KEY_MAPBUF_ENABLED, (void*)cnt);
+
+ if (cnt == 0) {
+ if (!elm_mapbuf_enabled_get(mapbuf)) {
+ _move_pages(page);
+ elm_mapbuf_enabled_set(mapbuf, 1);
+ }
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI int mapbuf_is_enabled(Evas_Object *obj)
+{
+ Evas_Object *mapbuf;
+ mapbuf = mapbuf_get_mapbuf(obj);
+ if (!mapbuf) {
+ return 0;
+ }
+
+ return elm_mapbuf_enabled_get(mapbuf);
+}
+
+
+
+HAPI int mapbuf_disable(Evas_Object *obj, int force)
+{
+ Evas_Object *mapbuf;
+ int cnt;
+
+ mapbuf = mapbuf_get_mapbuf(obj);
+ if (!mapbuf) {
+ _D("Failed to get the mapbuf object");
+ return W_HOME_ERROR_FAIL;
+ }
+
+ if (force) {
+ evas_object_data_set(mapbuf, PRIVATE_DATA_KEY_MAPBUF_ENABLED, (void*)-1);
+ elm_mapbuf_enabled_set(mapbuf, 0);
+ return W_HOME_ERROR_NONE;
+ }
+
+ cnt = (int)evas_object_data_get(mapbuf, PRIVATE_DATA_KEY_MAPBUF_ENABLED);
+ if (cnt == 0) {
+ if (elm_mapbuf_enabled_get(mapbuf)) {
+ elm_mapbuf_enabled_set(mapbuf, 0);
+ }
+ }
+
+ cnt --;
+ evas_object_data_set(mapbuf, PRIVATE_DATA_KEY_MAPBUF_ENABLED, (void*)cnt);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI Evas_Object *mapbuf_bind(Evas_Object *box, Evas_Object *page)
+{
+ Evas_Object *mapbuf;
+
+ mapbuf = elm_mapbuf_add(box);
+ if (!mapbuf) {
+ _E("Failed to create a new mapbuf");
+ return NULL;
+ }
+
+ elm_mapbuf_smooth_set(mapbuf, EINA_TRUE);
+ elm_mapbuf_alpha_set(mapbuf, EINA_TRUE);
+ elm_object_content_set(mapbuf, page);
+
+ evas_object_data_set(page, DATA_KEY_MAPBUF, mapbuf);
+ evas_object_data_set(mapbuf, DATA_KEY_PAGE, page);
+
+ evas_object_show(mapbuf);
+
+ return mapbuf;
+}
+
+
+
+HAPI Evas_Object *mapbuf_unbind(Evas_Object *obj)
+{
+ Evas_Object *page;
+ Evas_Object *mapbuf;
+
+ page = evas_object_data_get(obj, DATA_KEY_PAGE);
+ if (page) {
+ mapbuf = obj;
+ } else {
+ page = obj;
+ mapbuf = evas_object_data_get(obj, DATA_KEY_MAPBUF);
+ }
+
+ if (mapbuf) {
+ elm_mapbuf_enabled_set(mapbuf, 0);
+ evas_object_data_del(page, DATA_KEY_MAPBUF);
+ evas_object_data_del(mapbuf, DATA_KEY_PAGE);
+ evas_object_data_del(mapbuf, PRIVATE_DATA_KEY_MAPBUF_ENABLED);
+ page = elm_object_content_unset(mapbuf);
+ evas_object_del(mapbuf);
+ }
+ return page;
+}
+
+
+
+HAPI int mapbuf_can_be_made(Evas_Object *obj)
+{
+ if (!main_get_info()->is_mapbuf) return 0;
+
+ Evas_Object *page = evas_object_data_get(obj, DATA_KEY_PAGE);
+ if (!page) page = obj;
+ retv_if(NULL == page, 0);
+
+ bool mapbuf_disabled_page = (bool) evas_object_data_get(page, DATA_KEY_MAPBUF_DISABLED_PAGE);
+ if (mapbuf_disabled_page) return 0;
+
+ return 1;
+}
+
+
+
+HAPI int mapbuf_can_be_on(Evas_Object *obj)
+{
+ if (!main_get_info()->is_mapbuf) return 0;
+
+ Evas_Object *page = evas_object_data_get(obj, DATA_KEY_PAGE);
+ if (!page) page = obj;
+ retv_if(NULL == page, 0);
+
+ bool mapbuf_disabled_page = (bool) evas_object_data_get(page, DATA_KEY_MAPBUF_DISABLED_PAGE);
+ if (mapbuf_disabled_page) return 0;
+
+ return 1;
+}
+
+
+
+// End of a file
diff --git a/home/src/minictrl.c b/home/src/minictrl.c
new file mode 100755
index 0000000..a9c8025
--- /dev/null
+++ b/home/src/minictrl.c
@@ -0,0 +1,134 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+#include <glib.h>
+#include <aul.h>
+#include <vconf.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "page.h"
+#include "minictrl.h"
+#include "power_mode.h"
+#include "clock_service.h"
+
+/*!
+ * functions to handle MC IPC & object
+ */
+static void _minicontrol_monitor_cb_with_handler(minicontrol_action_e action, const char *name,
+ unsigned int width, unsigned int height, minicontrol_priority_e priority,
+ minicontrol_h handler, void *data)
+{
+ int pid = 0;
+ int state = 0;
+ char *service_name = NULL;
+ char *category_name = NULL;
+
+ if(name == NULL || handler == NULL) {
+ _E("Invalid paremter %p %p", name, handler);
+ return;
+ }
+
+ /* This API is not kept in Tizen 2.3 */
+ //minicontrol_handler_get_state(handler, &state);
+ minicontrol_handler_get_pid(handler, &pid);
+ minicontrol_handler_get_service_name(handler, &service_name);
+ minicontrol_handler_get_category(handler, &category_name);
+ if (service_name == NULL) {
+ _E("Failed to get service name from a minicontrol handler");
+ return;
+ }
+
+ _E("socket:%s, service:%s pid:%d category:%s action:%d, flag1:%d, flag2:%d, handler:%p"
+ ,name, service_name, pid, category_name, action, width, height, handler);
+
+ if (strcmp(category_name, MINICONTROL_HDL_CATEGORY_CLOCK) == 0 ||
+ strcmp(category_name, MINICONTROL_HDL_CATEGORY_UNKNOWN) == 0) {
+ clock_inf_minictrl_event_hooker(action, pid, name, state, width, height);
+ } else {
+ _E("Not supported categroy");
+ return ;
+ }
+}
+
+static void _minicontrol_monitor_cb_without_handler(minicontrol_action_e action, const char *name,
+ unsigned int width, unsigned int height, minicontrol_priority_e priority,
+ minicontrol_h handler, void *data)
+{
+ ret_if(name == NULL);
+
+ Minictrl_Entry *entry = minictrl_manager_entry_get_by_name(name);
+ ret_if(entry == NULL);
+
+ _E("socket:%s, category:%d action:%d, flag1:%d, flag2:%d"
+ ,name, entry->category, action, width, height);
+
+ if (action == MINICONTROL_ACTION_STOP) {
+ if (entry->view != NULL) {
+ minictrl_manager_entry_del_by_name(name);
+ } else {
+ _E("failed to get view, do nothing");
+ }
+ }
+}
+
+static void _minicontrol_monitor_cb(minicontrol_action_e action, const char *name,
+ unsigned int width, unsigned int height, minicontrol_priority_e priority,
+ minicontrol_h handler, void *data)
+{
+ if (handler != NULL) {
+ _minicontrol_monitor_cb_with_handler(action, name,
+ width, height, priority, handler, data);
+ } else {
+ _E("A minicontrol provider may be died forcely");
+ _minicontrol_monitor_cb_without_handler(action, name,
+ width, height, priority, handler, data);
+ }
+}
+
+/*!
+ * constructor/deconstructor
+ */
+HAPI void minicontrol_init(void)
+{
+ int ret = minicontrol_monitor_start_with_handler(_minicontrol_monitor_cb, NULL);
+ if (ret != MINICONTROL_ERROR_NONE) {
+ _E("Failed to attach minicontrol monitor:%d", ret);
+ }
+}
+
+HAPI void minicontrol_fini(void)
+{
+ int ret = minicontrol_monitor_stop();
+ if (ret != MINICONTROL_ERROR_NONE) {
+ _E("Failed to deattach minicontrol monitor:%d", ret);
+ }
+}
diff --git a/home/src/minictrl_manager.c b/home/src/minictrl_manager.c
new file mode 100755
index 0000000..99c3e79
--- /dev/null
+++ b/home/src/minictrl_manager.c
@@ -0,0 +1,217 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+#include <aul.h>
+#include <efl_assist.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "page_info.h"
+#include "page.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "minictrl.h"
+
+static struct _info {
+ Eina_List *item_list;
+} s_info = {
+ .item_list = NULL,
+};
+
+/*!
+ * functions to handle linked-list for MC object
+ */
+static Minictrl_Entry *_minictrl_entry_new(const char *name, const char *service_name, int category, Evas_Object *view)
+{
+ Minictrl_Entry *entry = NULL;
+ retv_if(view == NULL, NULL);
+ retv_if(name == NULL, NULL);
+ retv_if(service_name == NULL, NULL);
+
+ entry = (Minictrl_Entry *)calloc(1, sizeof(Minictrl_Entry));
+ if (entry != NULL) {
+ entry->category = category;
+ entry->name = strdup(name);
+ entry->service_name = strdup(service_name);
+ entry->view = view;
+ } else {
+ _E("failed to allocate memory");
+ }
+
+ return entry;
+}
+
+static void _minictrl_entry_del(Minictrl_Entry *item)
+{
+ free(item->name);
+ free(item->service_name);
+ free(item);
+}
+
+static Minictrl_Entry *_minictrl_entry_get_by_category(int category)
+{
+ Minictrl_Entry *entry = NULL;
+
+ if (category != MC_CATEGORY_CLOCK &&
+ category != MC_CATEGORY_NOTIFICATION &&
+ category != MC_CATEGORY_DASHBOARD) {
+ return NULL;
+ }
+
+ Eina_List *l = NULL;
+ EINA_LIST_FOREACH(s_info.item_list, l, entry) {
+ if (entry != NULL) {
+ if (entry->category == category) {
+ return entry;
+ }
+ }
+ }
+
+ _E("Failed to find entry with category:%d", category);
+
+ return NULL;
+}
+
+static Minictrl_Entry *_minictrl_entry_get_by_name(const char *name)
+{
+ Minictrl_Entry *entry = NULL;
+ retv_if(name == NULL, NULL);
+
+ Eina_List *l = NULL;
+ EINA_LIST_FOREACH(s_info.item_list, l, entry) {
+ if (entry != NULL && entry->name != NULL) {
+ if (strcmp(entry->name, name) == 0) {
+ return entry;
+ }
+ }
+ }
+
+ _E("Failed to find entry with name:%s", name);
+
+ return NULL;
+}
+
+static int _minictrl_entry_del_by_name(const char *name)
+{
+ int ret = 0;
+
+ Minictrl_Entry *entry = _minictrl_entry_get_by_name(name);
+ if (entry != NULL) {
+ s_info.item_list = eina_list_remove(s_info.item_list, entry);
+ _minictrl_entry_del(entry);
+ ret = 1;
+ }
+
+ return ret;
+}
+
+static int _minictrl_entry_del_by_category(int category)
+{
+ int ret = 0;
+
+ Minictrl_Entry *entry = _minictrl_entry_get_by_category(category);
+ if (entry != NULL) {
+ s_info.item_list = eina_list_remove(s_info.item_list, entry);
+ _minictrl_entry_del(entry);
+ ret = 1;
+ }
+
+ return ret;
+}
+
+HAPI void minictrl_manager_entry_add_with_data(const char *name, const char *service_name, int category, Evas_Object *view)
+{
+ /*!
+ * below category can't have multiple instance
+ */
+ switch (category) {
+ case MC_CATEGORY_CLOCK:
+ case MC_CATEGORY_DASHBOARD:
+ if (_minictrl_entry_del_by_category(category) == 1) {
+ _E("Exceptional, Why multiple instance exist?");
+ }
+ break;
+ }
+
+ Minictrl_Entry *entry = _minictrl_entry_new(name, service_name, category, view);
+ if (entry != NULL) {
+ s_info.item_list = eina_list_append(s_info.item_list, entry);
+ }
+}
+
+HAPI Evas_Object *minictrl_manager_view_get_by_name(const char *name)
+{
+ retv_if(name == NULL, NULL);
+
+ Minictrl_Entry *entry = _minictrl_entry_get_by_name(name);
+ if (entry != NULL) {
+ return entry->view;
+ }
+
+ return NULL;
+}
+
+HAPI Evas_Object *minictrl_manager_view_get_by_category(int category)
+{
+ Minictrl_Entry *entry = _minictrl_entry_get_by_category(category);
+ if (entry != NULL) {
+ return entry->view;
+ }
+
+ return NULL;
+}
+
+HAPI Minictrl_Entry *minictrl_manager_entry_get_by_category(int category)
+{
+ return _minictrl_entry_get_by_category(category);
+}
+
+HAPI Minictrl_Entry *minictrl_manager_entry_get_by_name(const char *name)
+{
+ return _minictrl_entry_get_by_name(name);
+}
+
+HAPI int minictrl_manager_entry_del_by_category(int category)
+{
+ return _minictrl_entry_del_by_category(category);
+}
+
+HAPI int minictrl_manager_entry_del_by_name(const char *name)
+{
+ return _minictrl_entry_del_by_name(name);
+}
+
+HAPI void minictrl_manager_entry_foreach(Minictrl_Entry_Foreach_Cb cb, void *user_data)
+{
+ Minictrl_Entry *entry = NULL;
+ ret_if(cb == NULL);
+
+ Eina_List *l = NULL;
+ EINA_LIST_FOREACH(s_info.item_list, l, entry) {
+ if (entry != NULL) {
+ cb(entry, user_data);
+ }
+ }
+}
diff --git a/home/src/minictrl_util.c b/home/src/minictrl_util.c
new file mode 100755
index 0000000..35a583c
--- /dev/null
+++ b/home/src/minictrl_util.c
@@ -0,0 +1,154 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <stdbool.h>
+#include <glib.h>
+#include <aul.h>
+#include <vconf.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "page.h"
+#include "scroller.h"
+#include "minictrl.h"
+
+HAPI char *minicontrol_appid_get_by_pid(int pid)
+{
+ int ret = AUL_R_OK;
+ char *dup_pkgname = NULL;
+ char pkgname[512 + 1] = { 0, };
+
+ ret = aul_app_get_pkgname_bypid(pid, pkgname, sizeof(pkgname));
+ if (ret == AUL_R_OK) {
+ if (strlen(pkgname) <= 0) {
+ return NULL;
+ }
+ }
+
+ dup_pkgname = strdup(pkgname);
+ if (!dup_pkgname) {
+ _E("Failed to dup string");
+ }
+
+ return dup_pkgname;
+}
+
+HAPI void minicontrol_magic_set(Evas_Object *obj) {
+ if (obj != NULL) {
+ evas_object_data_set(obj, MINICTRL_DATA_KEY_MAGIC, (void *)MINICONTROL_MAGIC);
+ }
+}
+
+HAPI int minicontrol_magic_get(Evas_Object *obj) {
+ if (obj != NULL) {
+ return (int)evas_object_data_get(obj, MINICTRL_DATA_KEY_MAGIC);
+ }
+
+ return 0x0;
+}
+
+HAPI void minicontrol_name_set(Evas_Object *obj, const char *name) {
+ char *name_old = NULL;
+
+ name_old = evas_object_data_get(obj, MINICTRL_DATA_KEY_NAME);
+ if (name_old != NULL) {
+ evas_object_data_del(obj, MINICTRL_DATA_KEY_NAME);
+ free(name_old);
+ }
+
+ if (obj != NULL && name != NULL) {
+ evas_object_data_set(obj, MINICTRL_DATA_KEY_NAME, (void *)strdup(name));
+ }
+}
+
+HAPI char *minicontrol_name_get(Evas_Object *obj) {
+ if (obj != NULL) {
+ return (char *)evas_object_data_get(obj, MINICTRL_DATA_KEY_NAME);
+ }
+
+ return NULL;
+}
+
+HAPI void minicontrol_category_set(Evas_Object *obj, int category) {
+ if (obj != NULL) {
+ evas_object_data_set(obj, MINICTRL_DATA_KEY_CATEGORY, (void *)category);
+ }
+}
+
+HAPI int minicontrol_category_get(Evas_Object *obj) {
+ if (obj != NULL) {
+ return (int)evas_object_data_get(obj, MINICTRL_DATA_KEY_CATEGORY);
+ }
+
+ return 0;
+}
+
+HAPI void minicontrol_pid_set(Evas_Object *obj, int pid) {
+ if (obj != NULL) {
+ evas_object_data_set(obj, MINICTRL_DATA_KEY_PID, (void *)pid);
+ }
+}
+
+HAPI int minicontrol_pid_get(Evas_Object *obj) {
+ if (obj != NULL) {
+ return (int)evas_object_data_get(obj, MINICTRL_DATA_KEY_PID);
+ }
+
+ return 0;
+}
+
+HAPI void minicontrol_visibility_set(Evas_Object *obj, int visibility) {
+ if (obj != NULL) {
+ evas_object_data_set(obj, MINICTRL_DATA_KEY_VISIBILITY, (void *)visibility);
+ }
+}
+
+HAPI int minicontrol_visibility_get(Evas_Object *obj) {
+ if (obj != NULL) {
+ return (int)evas_object_data_get(obj, MINICTRL_DATA_KEY_VISIBILITY);
+ }
+
+ return 0;
+}
+
+HAPI int minicontrol_message_send(Evas_Object *minictrl, char *message)
+{
+ Ecore_Evas *ee = NULL;
+ Evas_Object *plug_img = NULL;
+ retv_if(message == NULL, 0);
+ retv_if(minictrl == NULL, 0);
+
+ plug_img = elm_plug_image_object_get(minictrl);
+ retv_if(plug_img == NULL, 0);
+ ee = ecore_evas_object_ecore_evas_get(plug_img);
+ retv_if(ee == NULL, 0);
+ ecore_evas_msg_parent_send(ee, 0, 0, message, strlen(message) + 1);
+
+ return 1;
+}
diff --git a/home/src/noti_broker.c b/home/src/noti_broker.c
new file mode 100755
index 0000000..54019ed
--- /dev/null
+++ b/home/src/noti_broker.c
@@ -0,0 +1,666 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <dlfcn.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "page.h"
+#include "key.h"
+#include "tutorial.h"
+#include "noti_broker.h"
+#include "apps/apps_main.h"
+#include "critical_log.h"
+
+#define NOTI_BROKER_ERROR_NONE 0
+#define NOTI_BROKER_ERROR_FAIL -1
+#define NOTI_BROKER_PLUGIN_PATH "/usr/lib/libnoti-sample.so"
+
+/*
+ * Events, To notify events to plugin
+ */
+const int EVENT_SOURCE_SCROLLER = 0x00000000;
+const int EVENT_SOURCE_VIEW = 0x00000001;
+const int EVENT_SOURCE_EDITING = 0x00000002;
+
+const int EVENT_RET_NONE = 0x00000000;
+const int EVENT_RET_CONTINUE = 0x00000004;
+const int EVENT_RET_STOP = 0x00000008;
+
+#define EVENT_TYPE_ANIM 0x00000000
+const int EVENT_TYPE_ANIM_START = EVENT_TYPE_ANIM | 0x0;
+const int EVENT_TYPE_ANIM_STOP = EVENT_TYPE_ANIM | 0x1;
+#define EVENT_TYPE_DRAG 0x00001000
+const int EVENT_TYPE_DRAG_START = EVENT_TYPE_DRAG | 0x0;
+const int EVENT_TYPE_DRAG_STOP = EVENT_TYPE_DRAG | 0x1;
+#define EVENT_TYPE_EDGE 0x00002000
+const int EVENT_TYPE_EDGE_LEFT = EVENT_TYPE_EDGE | 0x0;
+const int EVENT_TYPE_EDGE_RIGHT = EVENT_TYPE_EDGE | 0x1;
+#define EVENT_TYPE_EDIT 0x00004000
+const int EVENT_TYPE_EDIT_START = EVENT_TYPE_EDIT | 0x0;
+const int EVENT_TYPE_EDIT_STOP = EVENT_TYPE_EDIT | 0x1;
+#define EVENT_TYPE_NOTI 0x00008000
+const int EVENT_TYPE_NOTI_DELETE = EVENT_TYPE_NOTI | 0x0;
+const int EVENT_TYPE_NOTI_DELETE_ALL = EVENT_TYPE_NOTI | 0x1;
+#define EVENT_TYPE_MOUSE 0x00010000
+const int EVENT_TYPE_MOUSE_DOWN = EVENT_TYPE_MOUSE | 0x0;
+const int EVENT_TYPE_MOUSE_UP = EVENT_TYPE_MOUSE | 0x1;
+#define EVENT_TYPE_SCROLL 0x00020000
+const int EVENT_TYPE_SCROLLING = EVENT_TYPE_SCROLL | 0x0;
+#define EVENT_TYPE_KEY 0x00040000
+const int EVENT_TYPE_KEY_BACK = EVENT_TYPE_KEY | 0x0;
+#define EVENT_TYPE_APPS 0x00080000
+const int EVENT_TYPE_APPS_SHOW = EVENT_TYPE_APPS | 0x0;
+const int EVENT_TYPE_APPS_HIDE = EVENT_TYPE_APPS | 0x1;
+
+/*
+ * Categories, To discrete views
+ */
+const int CATEGORY_NOTIFICATION = 0x00000001;
+const int CATEGORY_DASHBOARD = 0x00000002;
+
+/*
+ * Functions, To handle requests from plugin
+ */
+#define FUNCTION_DEF(X) const int X = E_##X
+#define FUNCTION_VAL(X) E_##X
+enum {
+ FUNCTION_VAL(FUNCTION_NONE) = 0x0,
+ FUNCTION_VAL(FUNCTION_PAGE_CREATE) = 0x00000001,
+ FUNCTION_VAL(FUNCTION_PAGE_DESTROY) = 0x00000002,
+ FUNCTION_VAL(FUNCTION_PAGE_ADD) = 0x00000004,
+ FUNCTION_VAL(FUNCTION_PAGE_REMOVE) = 0x00000008,
+ FUNCTION_VAL(FUNCTION_PAGE_SHOW) = 0x00000010,
+ FUNCTION_VAL(FUNCTION_PAGE_RELOAD) = 0x00000020,
+ FUNCTION_VAL(FUNCTION_PAGE_ITEM_SET) = 0x00000040,
+ FUNCTION_VAL(FUNCTION_PAGE_ITEM_GET) = 0x00000080,
+ FUNCTION_VAL(FUNCTION_SCROLLER_LEFT_PAGE_GET) = 0x00000100,
+ FUNCTION_VAL(FUNCTION_SCROLLER_RIGHT_PAGE_GET) = 0x00000200,
+ FUNCTION_VAL(FUNCTION_SCROLLER_FOCUSED_PAGE_GET) = 0x00000400,
+ FUNCTION_VAL(FUNCTION_WINDOW_ACTIVATE) = 0x00000800,
+ FUNCTION_VAL(FUNCTION_WINDOW_GET) = 0x00001000,
+ FUNCTION_VAL(FUNCTION_PAGE_SHOW_NO_DELAY) = 0x00002000,
+ FUNCTION_VAL(FUNCTION_PAGE_FOCUS_OBJECT_GET) = 0x00004000,
+ FUNCTION_VAL(FUNCTION_PAGE_REORDER) = 0x00008000,
+};
+FUNCTION_DEF(FUNCTION_NONE);
+FUNCTION_DEF(FUNCTION_PAGE_CREATE);
+FUNCTION_DEF(FUNCTION_PAGE_DESTROY);
+FUNCTION_DEF(FUNCTION_PAGE_ADD);
+FUNCTION_DEF(FUNCTION_PAGE_REMOVE);
+FUNCTION_DEF(FUNCTION_PAGE_SHOW);
+FUNCTION_DEF(FUNCTION_PAGE_SHOW_NO_DELAY);
+FUNCTION_DEF(FUNCTION_PAGE_RELOAD);
+FUNCTION_DEF(FUNCTION_PAGE_REORDER);
+FUNCTION_DEF(FUNCTION_PAGE_ITEM_SET);
+FUNCTION_DEF(FUNCTION_PAGE_ITEM_GET);
+FUNCTION_DEF(FUNCTION_PAGE_FOCUS_OBJECT_GET);
+FUNCTION_DEF(FUNCTION_SCROLLER_LEFT_PAGE_GET);
+FUNCTION_DEF(FUNCTION_SCROLLER_RIGHT_PAGE_GET);
+FUNCTION_DEF(FUNCTION_SCROLLER_FOCUSED_PAGE_GET);
+FUNCTION_DEF(FUNCTION_WINDOW_ACTIVATE);
+FUNCTION_DEF(FUNCTION_WINDOW_GET);
+
+
+struct broker_function {
+ int function;
+ int (*process) (const char *id, int category, void *view, void *data, void *result);
+};
+
+typedef struct _Noti_Broker_Plugin_Handler {
+ int (*init) (void *parent, void *data);
+ int (*fini) (void);
+ int (*event) (int source, int event, void *data);
+} Noti_Broker_Plugin_Handler;
+
+static struct _s_info {
+ int is_loaded;
+ int is_initialized;
+ void *dl_handler;
+ Noti_Broker_Plugin_Handler handle;
+} s_info = {
+ .is_loaded = 0,
+ .is_initialized = 0,
+ .dl_handler = NULL,
+ .handle = {NULL,NULL,NULL},
+};
+
+static Evas_Object *_layout_get(void)
+{
+ Evas_Object *win = main_get_info()->win;
+ retv_if(win == NULL, NULL);
+
+ return evas_object_data_get(win, DATA_KEY_LAYOUT);
+}
+
+static Evas_Object *_scroller_get(void)
+{
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ if (layout != NULL) {
+ scroller = elm_object_part_content_get(layout, "scroller");
+ }
+ }
+
+ return scroller;
+}
+
+/*!
+ * To handle requests from plugin
+ */
+static int _handler_page_create(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ page_removable_e removable = PAGE_REMOVABLE_ON;
+
+ if (category == CATEGORY_DASHBOARD) {
+ removable = PAGE_REMOVABLE_OFF;
+ }
+
+ page = page_create(scroller
+ , (Evas_Object*)view
+ , NULL, NULL
+ , main_get_info()->root_w, main_get_info()->root_h
+ , PAGE_CHANGEABLE_BG_OFF, removable);
+ if (page != NULL && result != NULL) {
+ *((Evas_Object **)result) = page;
+ page_set_effect(page, page_effect_none, page_effect_none);
+
+ return NOTI_BROKER_ERROR_NONE;
+ }
+
+ return NOTI_BROKER_ERROR_FAIL;
+}
+
+static int _handler_page_destroy(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+
+ page_destroy(page);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_add(const char *id, int category, void *view, void *data, void *result)
+{
+ int ret = W_HOME_ERROR_NONE;
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();;
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (category == CATEGORY_NOTIFICATION) {
+ ret = scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER_LEFT);
+ } else if (category == CATEGORY_DASHBOARD) {
+ ret = scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT);
+ }
+
+ return (ret == W_HOME_ERROR_NONE) ? NOTI_BROKER_ERROR_NONE : NOTI_BROKER_ERROR_FAIL;
+}
+
+static int _handler_page_remove(const char *id, int category, void *view, void *data, void *result)
+{
+ int ret = NOTI_BROKER_ERROR_NONE;
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (scroller_pop_page(scroller, page) == NULL) {
+ _E("Failed to remove page(%p)", page);
+ ret = NOTI_BROKER_ERROR_FAIL;
+ }
+ evas_object_hide(page);
+
+ return ret;
+}
+
+static int _handler_page_show(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (tutorial_is_exist() == 1) {
+ _E("tutorial is exist, can't bring the page");
+ return NOTI_BROKER_ERROR_FAIL;
+ }
+
+ scroller_bring_in_page(scroller, page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_show_no_delay(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ scroller_bring_in_page(scroller, page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT_SHOW);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_reload(const char *id, int category, void *view, void *data, void *result)
+{
+ int ret = W_HOME_ERROR_NONE;
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (category == CATEGORY_NOTIFICATION) {
+ ret = scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER_LEFT);
+ } else if (category == CATEGORY_DASHBOARD) {
+ if (scroller_pop_page(scroller, page) == NULL) {
+ _E("Failed to pop page(%p)", page);
+ }
+ ret = scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT);
+ }
+
+ return (ret == W_HOME_ERROR_NONE) ? NOTI_BROKER_ERROR_NONE : NOTI_BROKER_ERROR_FAIL;
+}
+
+static int _handler_page_reorder(const char *id, int category, void *view, void *data, void *result)
+{
+ int ret = W_HOME_ERROR_NONE;
+ Eina_List *list = data;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(list == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ scroller_reorder_with_list(scroller, list, PAGE_DIRECTION_LEFT);
+
+ return (ret == W_HOME_ERROR_NONE) ? NOTI_BROKER_ERROR_NONE : NOTI_BROKER_ERROR_FAIL;
+}
+
+static int _handler_page_item_set(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *item = data;
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(item == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ page_set_item(page, item);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_item_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = page_get_item(page);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_focus_object_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ page_info_s *page_info = NULL;
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(page_info == NULL, NOTI_BROKER_ERROR_FAIL);
+ *((Evas_Object **)result) = page_info->focus;
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_scroller_left_page_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = scroller_get_left_page(scroller, page);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_scroller_right_page_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = scroller_get_right_page(scroller, page);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_scroller_focused_page_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = scroller_get_focused_page(scroller);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_window_activate(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *win = main_get_info()->win;
+ retv_if(win == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (tutorial_is_exist() == 1) {
+ _E("tutorial is exist, can't activate home window");
+ return NOTI_BROKER_ERROR_FAIL;
+ }
+
+ elm_win_activate(win);
+
+ if (apps_main_is_visible() == EINA_TRUE) {
+ apps_main_launch(APPS_LAUNCH_HIDE);
+ }
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_window_get(const char *id, int category, void *view, void *data, void *result)
+{
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = main_get_info()->win;
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+int noti_broker_request(int function, const char *id, int category, void *view, void *data, void *result)
+{
+ //do something
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, -1);
+
+ if (function == FUNCTION_PAGE_CREATE ||
+ function == FUNCTION_PAGE_DESTROY ||
+ function == FUNCTION_PAGE_ADD ||
+ function == FUNCTION_PAGE_REMOVE ||
+ function == FUNCTION_PAGE_SHOW ||
+ function == FUNCTION_PAGE_RELOAD ||
+ function == FUNCTION_PAGE_REORDER) {
+ _W("%x %s %d %p %p %p", function, id, category, view, data, result);
+ }
+
+ static struct broker_function fn_table[] = {
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_CREATE),
+ .process = _handler_page_create,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_DESTROY),
+ .process = _handler_page_destroy,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_ADD),
+ .process = _handler_page_add,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_REMOVE),
+ .process = _handler_page_remove,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_SHOW),
+ .process = _handler_page_show,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_RELOAD),
+ .process = _handler_page_reload,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_REORDER),
+ .process = _handler_page_reorder,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_ITEM_SET),
+ .process = _handler_page_item_set,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_ITEM_GET),
+ .process = _handler_page_item_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_SCROLLER_LEFT_PAGE_GET),
+ .process = _handler_scroller_left_page_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_SCROLLER_RIGHT_PAGE_GET),
+ .process = _handler_scroller_right_page_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_SCROLLER_FOCUSED_PAGE_GET),
+ .process = _handler_scroller_focused_page_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_WINDOW_ACTIVATE),
+ .process = _handler_window_activate,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_WINDOW_GET),
+ .process = _handler_window_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_SHOW_NO_DELAY),
+ .process = _handler_page_show_no_delay,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_FOCUS_OBJECT_GET),
+ .process = _handler_page_focus_object_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_NONE),
+ .process = NULL,
+ },
+ };
+
+ int i = 0;
+ int ret = NOTI_BROKER_ERROR_NONE;
+ for (i = 0; fn_table[i].function != FUNCTION_VAL(FUNCTION_NONE); i++) {
+ if (function == fn_table[i].function && fn_table[i].process != NULL) {
+ ret = fn_table[i].process(id, category, view, data, result);
+ }
+ }
+
+ return ret;
+}
+
+static void _scroller_evas_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ int event_type = (int)data;
+
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_SCROLLER, event_type, event_info);
+}
+
+static void _layout_smart_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ int event_type = (int)data;
+
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_VIEW, event_type, event_info);
+}
+
+static void _scroller_smart_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ int event_type = (int)data;
+
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_SCROLLER, event_type, event_info);
+}
+
+static key_cb_ret_e _noti_broker_back_cb(void *data)
+{
+ int ret = EVENT_RET_CONTINUE;
+ if (tutorial_is_exist() == 1) {
+ return KEY_CB_RET_CONTINUE;
+ }
+
+ ret = noti_broker_event_fire_to_plugin(EVENT_SOURCE_VIEW, EVENT_TYPE_KEY_BACK, NULL);
+ if (ret == EVENT_RET_STOP) {
+ _W("stop back key execution");
+ return KEY_CB_RET_STOP;
+ }
+
+ _W("continue the back key execution");
+ return KEY_CB_RET_CONTINUE;
+}
+
+static void _evas_object_events_register(Evas_Object *layout, Evas_Object *scroller)
+{
+ evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_DOWN, _scroller_evas_cb, (void*)EVENT_TYPE_MOUSE_DOWN);
+ evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_UP, _scroller_evas_cb, (void*)EVENT_TYPE_MOUSE_UP);
+
+ evas_object_smart_callback_add(scroller, "scroll,anim,start", _scroller_smart_cb, (void*)EVENT_TYPE_ANIM_START);
+ evas_object_smart_callback_add(scroller, "scroll,anim,stop", _scroller_smart_cb, (void*)EVENT_TYPE_ANIM_STOP);
+ evas_object_smart_callback_add(scroller, "scroll,drag,start", _scroller_smart_cb, (void*)EVENT_TYPE_DRAG_START);
+ evas_object_smart_callback_add(scroller, "scroll,drag,stop", _scroller_smart_cb, (void*)EVENT_TYPE_DRAG_STOP);
+ evas_object_smart_callback_add(scroller, "edge,left", _scroller_smart_cb, (void*)EVENT_TYPE_EDGE_LEFT);
+ evas_object_smart_callback_add(scroller, "edge,right", _scroller_smart_cb, (void*)EVENT_TYPE_EDGE_RIGHT);
+ evas_object_smart_callback_add(scroller, "scroll", _scroller_smart_cb, (void*)EVENT_TYPE_SCROLL);
+
+ evas_object_smart_callback_add(layout, LAYOUT_SMART_SIGNAL_EDIT_ON,
+ _layout_smart_cb, (void *)EVENT_TYPE_EDIT_START);
+ evas_object_smart_callback_add(layout, LAYOUT_SMART_SIGNAL_EDIT_OFF,
+ _layout_smart_cb, (void *)EVENT_TYPE_EDIT_STOP);
+
+ key_register_cb(KEY_TYPE_BACK, _noti_broker_back_cb, NULL);
+}
+
+Eina_Bool _init_timeout_cb(void *data)
+{
+ if (s_info.is_initialized == 0) {
+ _W("noti broker isn't initialized");
+ noti_broker_init();
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+/*!
+ * constructor/deconstructor
+ */
+HAPI void noti_broker_load(void)
+{
+ char *errmsg = NULL;
+ void *dl_handle = NULL;
+
+ _W("loading noti broker plugin start");
+ dl_handle = dlopen(NOTI_BROKER_PLUGIN_PATH, RTLD_LOCAL | RTLD_NOW | RTLD_DEEPBIND);
+ _W("loading noti broker plugin done");
+
+ errmsg = dlerror();
+ if (errmsg) {
+ _E("dlerror(can be ignored): %s\n", errmsg);
+ CRITICAL_LOG("dlopen failed: %s\n", errmsg);
+ }
+ ret_if(dl_handle == NULL);
+
+ s_info.handle.init = dlsym(dl_handle, "noti_board_plugin_init");
+ if (s_info.handle.init == NULL) {
+ _E("Failed to find noti_board_plugin_init");
+ goto ERR;
+ }
+
+ s_info.handle.fini = dlsym(dl_handle, "noti_board_plugin_fini");
+ if (s_info.handle.fini == NULL) {
+ _E("Failed to find noti_board_plugin_fini");
+ goto ERR;
+ }
+
+ s_info.handle.event = dlsym(dl_handle, "noti_board_plugin_event");
+ if (s_info.handle.event == NULL) {
+ _E("Failed to find noti_board_plugin_event");
+ goto ERR;
+ }
+
+ s_info.is_loaded = 1;
+ s_info.dl_handler = dl_handle;
+
+ ecore_timer_add(10.0f, _init_timeout_cb, NULL);
+
+ return ;
+
+ERR:
+ if (dl_handle) dlclose(dl_handle);
+}
+
+HAPI void noti_broker_init(void)
+{
+ Evas_Object *layout = _layout_get();
+ Evas_Object *scroller = _scroller_get();
+ ret_if(s_info.is_loaded == 0);
+ ret_if(s_info.is_initialized == 1);
+ ret_if(layout == NULL);
+ ret_if(scroller == NULL);
+
+ s_info.is_initialized = 1;
+ s_info.handle.init(scroller, scroller);
+ _evas_object_events_register(layout, scroller);
+}
+
+HAPI void noti_broker_fini(void)
+{
+ ret_if(s_info.is_loaded == 0);
+ s_info.is_loaded = 0;
+
+ s_info.handle.fini();
+ s_info.is_initialized = 0;
+
+ if (s_info.dl_handler != NULL) {
+ dlclose(s_info.dl_handler);
+ }
+}
+
+/*!
+ * To notify events to plugin
+ */
+HAPI int noti_broker_event_fire_to_plugin(int source, int event, void *data)
+{
+ retv_if(s_info.is_loaded == 0, EVENT_RET_NONE);
+
+ if (event == EVENT_TYPE_APPS_SHOW ||
+ event == EVENT_TYPE_APPS_HIDE) {
+ _W("source:%d event:%x", source, event);
+ }
+
+ return s_info.handle.event(source, event, data);
+}
diff --git a/home/src/page.c b/home/src/page.c
new file mode 100644
index 0000000..a4e1833
--- /dev/null
+++ b/home/src/page.c
@@ -0,0 +1,1105 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <bundle.h>
+#include <dlog.h>
+#include <efl_assist.h>
+#include <vconf.h>
+
+#include "util.h"
+#include "conf.h"
+#include "edit.h"
+#include "edit_info.h"
+#include "effect.h"
+#include "layout.h"
+#include "layout_info.h"
+#include "dynamicbox_evas.h"
+#include "log.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "page.h"
+#include "scroller.h"
+#include "index.h"
+#include "bg.h"
+#include "add-viewer_package.h"
+
+#define PRIVATE_DATA_KEY_PAGE_ACCESS_OBJECT "pg_pd_ao"
+#define PRIVATE_DATA_KEY_PAGE_FOCUS_OBJECT "p_fo"
+#define PRIVATE_DATA_KEY_PAGE_LEFT_EFFECT "p_le"
+#define PRIVATE_DATA_KEY_PAGE_RIGHT_EFFECT "p_re"
+
+
+
+static void _move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *page = obj;
+ page_info_s *page_info = NULL;
+ Evas_Coord x, y, w, h;
+
+ ret_if(!page);
+
+ evas_object_geometry_get(page, &x, &y, &w, &h);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ page_info->appended = EINA_TRUE;
+ _D("Page(%p) is appended into the scroller (%d:%d:%d:%d)", page, x, y, w, h);
+
+ evas_object_event_callback_del(page, EVAS_CALLBACK_MOVE, _move_cb);
+}
+
+
+
+static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ei = event_info;
+ Evas_Object *page = data;
+
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ int x = ei->output.x;
+ int y = ei->output.y;
+
+ _D("Down (%p)(%d, %d)", page, x, y);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ layout_info = evas_object_data_get(page_info->layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ scroller_info = evas_object_data_get(layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ layout_info->pressed_page = page;
+ layout_info->pressed_item = page_info->item;
+ if (layout_info->pressed_page == scroller_info->plus_page) {
+ evas_object_data_set(layout_info->pressed_item, DATA_KEY_IS_LONGPRESS, (void *)0);
+ }
+}
+
+
+
+static void _up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Up *ei = event_info;
+ Evas_Object *page = data;
+
+ layout_info_s *layout_info = NULL;
+ page_info_s *page_info = NULL;
+
+ int x = ei->output.x;
+ int y = ei->output.y;
+
+ _D("Up (%p)(%d, %d)", page, x, y);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ layout_info = evas_object_data_get(page_info->layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ layout_info->pressed_page = page;
+ layout_info->pressed_item = NULL;
+
+ if (evas_object_data_get(page, DATA_KEY_PAGE_ONHOLD_COUNT)) {
+ evas_object_data_del(page, DATA_KEY_PAGE_ONHOLD_COUNT);
+ ei->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+ _D("Event ON_HOLD flag set on a page(%p)", page);
+ }
+}
+
+
+
+#define LINE_IMAGE_DIR IMAGEDIR"/b_home_screen_widget_line.png"
+static Evas_Object *_create_page_line(Evas_Object *page_inner)
+{
+ Evas_Object *image = NULL;
+ Evas_Object *box = NULL;
+ int ret;
+
+ image = evas_object_image_filled_add(main_get_info()->e);
+ retv_if(!image, NULL);
+
+ evas_object_image_smooth_scale_set(image, EINA_TRUE);
+ evas_object_image_load_size_set(image, ITEM_EDIT_LINE_WIDTH, ITEM_EDIT_LINE_HEIGHT);
+ evas_object_image_file_set(image, LINE_IMAGE_DIR, NULL);
+
+ ret = evas_object_image_load_error_get(image);
+ goto_if (EVAS_LOAD_ERROR_NONE != ret, ERROR);
+
+ evas_object_image_fill_set(image, 0, 0, ITEM_EDIT_LINE_WIDTH, ITEM_EDIT_LINE_HEIGHT);
+ evas_object_image_border_set(image, 9, 9, 9, 9);
+
+ evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(image, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(image);
+
+ box = elm_box_add(page_inner);
+ goto_if(!box, ERROR);
+
+ evas_object_size_hint_min_set(image, ITEM_EDIT_LINE_WIDTH+2, ITEM_EDIT_LINE_HEIGHT+2);
+ 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_box_pack_end(box, image);
+
+ elm_object_part_content_set(page_inner, "line", box);
+
+ return box;
+
+ERROR:
+ evas_object_del(image);
+ return NULL;
+}
+
+
+
+static void _destroy_page_line(Evas_Object *page)
+{
+ Evas_Object *image = NULL;
+ Evas_Object *box = NULL;
+ Eina_List *list = NULL;
+
+ ret_if(!page);
+ box = elm_object_part_content_get(page, "line");
+ ret_if(!box);
+
+ list = elm_box_children_get(box);
+ if (!list) {
+ evas_object_del(box);
+ return;
+ }
+
+ EINA_LIST_FREE(list, image) {
+ evas_object_del(image);
+ }
+ evas_object_del(box);
+}
+
+
+
+HAPI void page_destroy(Evas_Object *page)
+{
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_del(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ _destroy_page_line(page_info->page_inner);
+
+ evas_object_del(page_info->focus);
+ evas_object_del(page_info->page_inner_area);
+ evas_object_del(page_info->page_inner_bg);
+
+ evas_object_data_del(page_info->page_inner, PRIVATE_DATA_KEY_PAGE_ACCESS_OBJECT);
+ evas_object_data_del(page_info->page_inner, DATA_KEY_PAGE_INFO);
+ evas_object_del(page_info->page_inner);
+ evas_object_del(page_info->page_rect);
+
+ evas_object_data_del(page, DATA_KEY_EVENT_UPPER_IS_ON);
+
+ free(page_info->id);
+ free(page_info->subid);
+ free(page_info->title);
+ free(page_info);
+ evas_object_del(page);
+}
+
+
+
+static char *_access_page_num_cb(void *data, Evas_Object *obj)
+{
+ Evas_Object *scroller = data;
+ Evas_Object *page = NULL;
+ page_info_s *page_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ int count = 0;
+ int cur = 0;
+ char number[BUFSZE];
+ char *tmp;
+
+ retv_if(NULL == scroller, NULL);
+
+ page = scroller_get_focused_page(scroller);
+ retv_if(!page, NULL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ if (PAGE_DIRECTION_CENTER == page_info->direction) {
+ _D("This page is the center page");
+ return NULL;
+ }
+
+ if (evas_object_dynamicbox_is_dynamicbox(page_get_item(page)) == 1) {
+ if (page_info->need_to_read == EINA_FALSE) {
+ return NULL;
+ }
+
+ if (page_info->need_to_unhighlight == EINA_TRUE) {
+ return NULL;
+ }
+
+ if (!evas_object_dynamicbox_is_faulted(page_info->item)) {
+ page_info->need_to_read = EINA_FALSE;
+ }
+ }
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ count = eina_list_count(list);
+ cur = scroller_seek_page_position(scroller, page) + 1;
+
+ snprintf(number, sizeof(number), _("IDS_AT_BODY_PAGE_P1SD_OF_P2SD_T_TTS"), cur, count);
+
+ tmp = strdup(number);
+ if (!tmp) return NULL;
+ return tmp;
+}
+
+
+
+static char *_access_plus_button_name_cb(void *data, Evas_Object *obj)
+{
+ char *tmp;
+
+ tmp = strdup(_("IDS_HS_BODY_ADD_WIDGET"));
+ retv_if(!tmp, NULL);
+ return tmp;
+}
+
+
+
+#define PAGE_EDJE_FILE EDJEDIR"/page.edj"
+HAPI Evas_Object *page_create(Evas_Object *scroller
+ , Evas_Object *item
+ , const char *id
+ , const char *subid
+ , int width, int height
+ , page_changeable_bg_e changeable_bg
+ , page_removable_e removable)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *focus = NULL;
+ Evas_Object *page_rect = NULL;
+ Evas_Object *page_inner = NULL;
+ Evas_Object *page_inner_area = NULL;
+ Evas_Object *page_inner_bg = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ retv_if(!scroller, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ page = elm_layout_add(scroller);
+ retv_if(!page, NULL);
+ elm_layout_file_set(page, PAGE_EDJE_FILE, "page");
+ /* Do not have weight for unpacking from elm_box */
+ evas_object_size_hint_weight_set(page, 0.0, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(page, width, height);
+ evas_object_move(page, -10000, -10000);
+ evas_object_show(page);
+ evas_object_event_callback_add(page, EVAS_CALLBACK_MOVE, _move_cb, NULL);
+
+ page_info = calloc(1, sizeof(page_info_s));
+ if (!page_info) {
+ _E("Cannot calloc for page_info");
+ evas_object_del(page);
+ return NULL;
+ }
+ evas_object_data_set(page, DATA_KEY_PAGE_INFO, page_info);
+ evas_object_data_set(page, DATA_KEY_EVENT_UPPER_IS_ON, (void *) 1);
+
+ page_rect = evas_object_rectangle_add(main_get_info()->e);
+ goto_if(!page_rect, ERROR);
+ evas_object_size_hint_min_set(page_rect, width, height);
+ evas_object_show(page_rect);
+ elm_object_part_content_set(page, "bg", page_rect);
+ evas_object_color_set(page_rect, 0, 0, 0, 0);
+
+ page_inner = elm_layout_add(scroller);
+ goto_if(NULL == page_inner, ERROR);
+ elm_layout_file_set(page_inner, PAGE_EDJE_FILE, "page_inner");
+ evas_object_size_hint_weight_set(page_inner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_repeat_events_set(page_inner, EINA_TRUE);
+ evas_object_show(page_inner);
+ elm_object_part_content_set(page, "inner", page_inner);
+ evas_object_event_callback_add(page_inner, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, page);
+ evas_object_event_callback_add(page_inner, EVAS_CALLBACK_MOUSE_UP, _up_cb, page);
+ evas_object_data_set(page_inner, DATA_KEY_PAGE_INFO, page_info);
+
+ page_inner_area = evas_object_rectangle_add(main_get_info()->e);
+ goto_if(!page_inner_area, ERROR);
+ evas_object_size_hint_min_set(page_inner_area, width, height);
+ evas_object_resize(page_inner_area, width, height);
+ evas_object_color_set(page_inner_area, 0, 0, 0, 0);
+ evas_object_repeat_events_set(page_inner_area, EINA_TRUE);
+ evas_object_show(page_inner_area);
+ elm_object_part_content_set(page_inner, "area", page_inner_area);
+
+ page_inner_bg = evas_object_rectangle_add(main_get_info()->e);
+ goto_if(!page_inner_bg, ERROR);
+ evas_object_size_hint_weight_set(page_inner_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_color_set(page_inner_bg, 0, 0, 0, 0);
+ evas_object_repeat_events_set(page_inner_bg, EINA_TRUE);
+ evas_object_show(page_inner_bg);
+ elm_object_part_content_set(page_inner, "bg", page_inner_bg);
+
+ if (item) {
+ elm_object_part_content_set(page_inner, "item", item);
+ }
+
+ if (!_create_page_line(page_inner)) {
+ _E("cannot create line");
+ }
+
+ if (id) {
+ page_info->id = strdup(id);
+ if (!page_info->id) {
+ _E("Critical, cannot strdup for id");
+ }
+ }
+
+ if (subid) {
+ page_info->subid = strdup(subid);
+ if (!page_info->subid) {
+ _E("Critical, cannot strdup for subid");
+ }
+ }
+
+ if (changeable_bg) {
+ bg_register_object(page_inner);
+ }
+
+ evas_object_data_set(page_inner, PRIVATE_DATA_KEY_PAGE_ACCESS_OBJECT, NULL);
+
+ focus = elm_button_add(page_inner);
+ retv_if(NULL == focus, NULL);
+
+ elm_object_style_set(focus, "focus");
+ elm_object_part_content_set(page_inner, "focus", focus);
+
+ elm_access_info_cb_set(focus, ELM_ACCESS_TYPE, NULL, NULL);
+ elm_access_info_cb_set(focus, ELM_ACCESS_STATE, _access_page_num_cb, scroller);
+ evas_object_size_hint_weight_set(focus, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_focus_allow_set(focus, EINA_TRUE);
+
+ page_info->width = width;
+ page_info->height = height;
+
+ page_info->layout = scroller_info->layout;
+ page_info->scroller = scroller;
+ page_info->page = page;
+ page_info->page_rect = page_rect;
+ page_info->page_inner = page_inner;
+ page_info->page_inner_area = page_inner_area;
+ page_info->page_inner_bg = page_inner_bg;
+ page_info->item = item;
+ page_info->removable = removable;
+ page_info->focus = focus;
+ page_info->layout_longpress = 1;
+ page_info->appended = EINA_FALSE;
+ page_info->need_to_read = EINA_FALSE;
+ page_info->highlighted = EINA_FALSE;
+
+ return page;
+
+ERROR:
+ page_destroy(page);
+ return NULL;
+}
+
+
+
+static void _plus_item_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Evas_Object *layout = data;
+ layout_info_s *layout_info = NULL;
+
+ ret_if(!layout);
+
+ _D("clicked plus page");
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ if (evas_object_data_get(obj, DATA_KEY_IS_LONGPRESS)) return;
+
+ if (layout_info->pressed_item) {
+ _D("There is already a pressed item");
+ evas_object_dynamicbox_force_mouse_up(layout_info->pressed_item);
+ }
+
+ if (!edit_create_add_viewer(layout)) _E("Cannot add the add-viewer");
+
+ effect_play_sound();
+}
+
+
+
+static void _plus_item_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info = NULL;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->item);
+
+ elm_object_signal_emit(page_info->item, "press", "plus");
+}
+
+
+
+static void _plus_item_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ Evas_Object *page = data;
+ page_info_s *page_info = NULL;
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->item);
+
+ elm_object_signal_emit(page_info->item, "release", "plus");
+}
+
+
+
+#define PLUS_ITEM_EDJ EDJEDIR"/page.edj"
+#define PLUS_ITEM_GROUP "plus_item"
+HAPI Evas_Object *page_create_plus_page(Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *plus_item = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ Eina_Bool ret;
+
+ retv_if(!scroller, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+ retv_if(scroller_info->plus_page, NULL);
+
+ plus_item = elm_layout_add(scroller);
+ retv_if(!plus_item, NULL);
+
+ ret = elm_layout_file_set(plus_item, PLUS_ITEM_EDJ, PLUS_ITEM_GROUP);
+ if (EINA_FALSE == ret) {
+ _E("cannot set the file into the layout");
+ evas_object_del(plus_item);
+ return NULL;
+ }
+ evas_object_size_hint_weight_set(plus_item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(plus_item, 0.5, 0.5);
+ evas_object_repeat_events_set(plus_item, EINA_TRUE);
+ evas_object_show(plus_item);
+ evas_object_data_set(plus_item, DATA_KEY_IS_LONGPRESS, (void *)0);
+
+ page = page_create(scroller, plus_item, NULL, NULL, scroller_info->page_width, scroller_info->page_height, PAGE_CHANGEABLE_BG_OFF, PAGE_REMOVABLE_OFF);
+ if (!page) {
+ _E("Cannot create the page");
+ evas_object_del(plus_item);
+ return NULL;
+ }
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ goto_if(!page_info, ERROR);
+ page_info->layout_longpress = 0;
+
+ elm_object_signal_emit(page_info->page_inner, "select", "cover");
+ elm_object_signal_emit(page_info->page_inner, "show", "line,widget");
+
+ elm_access_info_cb_set(page_info->focus, ELM_ACCESS_INFO, _access_plus_button_name_cb, NULL);
+ scroller_info->plus_page = page;
+
+ elm_object_signal_emit(plus_item, "show,widget", "plus_item");
+ elm_object_signal_callback_add(plus_item, "down", "plus_item", _plus_item_down_cb, page);
+ elm_object_signal_callback_add(plus_item, "up", "plus_item", _plus_item_up_cb, page);
+ elm_object_signal_callback_add(plus_item, "click", "plus_item", _plus_item_clicked_cb, page_info->layout);
+
+ return page;
+
+ERROR:
+ evas_object_del(page);
+
+ return NULL;
+}
+
+
+
+HAPI void page_destroy_plus_page(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ page_info = evas_object_data_get(scroller_info->plus_page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ evas_object_data_del(page_info->item, DATA_KEY_IS_LONGPRESS);
+
+ evas_object_del(page_info->item);
+ page_destroy(scroller_info->plus_page);
+
+ scroller_info->plus_page = NULL;
+}
+
+
+
+HAPI void page_arrange_plus_page(Evas_Object *scroller, int toast_popup)
+{
+ scroller_info_s *scroller_info = NULL;
+ int count = 0;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ count = scroller_count_direction(scroller, PAGE_DIRECTION_RIGHT);
+ if (count > MAX_DBOX) {
+ if (scroller_info->plus_page) {
+ char text[TEXT_LEN] = {0, };
+ char *count_str = NULL;
+
+ scroller_pop_page(scroller, scroller_info->plus_page);
+ page_destroy_plus_page(scroller);
+
+ if (toast_popup) {
+ count_str = edit_get_count_str_from_icu(MAX_DBOX);
+ if (!count_str) {
+ _E("count_str is NULL");
+ count_str = calloc(1, LOCALE_LEN);
+ ret_if(!count_str);
+ snprintf(count_str, LOCALE_LEN, "%d", MAX_DBOX);
+ }
+
+ snprintf(text, sizeof(text), _("IDS_HS_TPOP_MAXIMUM_NUMBER_OF_WIDGETS_HPD_REACHED"), count_str);
+ free(count_str);
+ util_create_toast_popup(scroller, text);
+ }
+ } else {
+ /* Leave me alone */
+ }
+ } else if (count == MAX_DBOX) {
+ /* Leave me alone */
+ } else {
+ if (scroller_info->plus_page) {
+ /* Leave me alone */
+ scroller_pop_page(scroller, scroller_info->plus_page);
+ scroller_push_page(scroller, scroller_info->plus_page, SCROLLER_PUSH_TYPE_LAST);
+ } else {
+ page_create_plus_page(scroller);
+ page_set_effect(scroller_info->plus_page, page_effect_none, page_effect_none);
+ scroller_push_page(scroller, scroller_info->plus_page, SCROLLER_PUSH_TYPE_LAST);
+ }
+ }
+}
+
+
+
+Evas_Object *page_set_item(Evas_Object *page, Evas_Object *item)
+{
+ Evas_Object *old_item = NULL;
+ page_info_s *page_info = NULL;
+
+ retv_if(!page, NULL);
+ retv_if(!item, NULL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ old_item = elm_object_part_content_unset(page_info->page_inner, "item");
+ if (old_item) {
+ _D("You need to free the old item");
+ }
+
+ elm_object_part_content_set(page_info->page_inner, "item", item);
+ page_info->item = item;
+
+ return old_item;
+}
+
+
+
+HAPI Evas_Object *page_get_item(Evas_Object *page)
+{
+ page_info_s *page_info = NULL;
+
+ retv_if(!page, NULL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ return page_info->item;
+}
+
+
+
+HAPI void page_focus(Evas_Object *page)
+{
+ Eina_Bool is_focused = EINA_FALSE;
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->focus);
+
+ is_focused = elm_object_focus_get(page_info->focus);
+ if (is_focused) return;
+
+ /*
+ * workaround, to avoid scroller focus become invalid
+ */
+ _D("focus set to %p", page_info->focus);
+ elm_object_focus_set(page_info->focus, EINA_TRUE);
+}
+
+
+
+HAPI void page_unfocus(Evas_Object *page)
+{
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->focus);
+
+ elm_object_focus_set(page_info->focus, EINA_FALSE);
+}
+
+
+
+HAPI void page_highlight(Evas_Object *page)
+{
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->focus);
+
+ elm_access_object_register(page_info->focus, page);
+}
+
+
+
+HAPI void page_unhighlight(Evas_Object *page)
+{
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->focus);
+
+ elm_access_object_unregister(page_info->focus);
+}
+
+
+
+/* You have to free returned value */
+HAPI char *page_read_title(Evas_Object *page)
+{
+ char *title = NULL;
+ const char *tmp = NULL;
+ page_info_s *page_info = NULL;
+
+ retv_if(!page, NULL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+ retv_if(!page_info->item, NULL);
+
+ switch (page_info->direction) {
+ case PAGE_DIRECTION_LEFT:
+ break;
+ case PAGE_DIRECTION_CENTER:
+ break;
+ case PAGE_DIRECTION_RIGHT:
+ tmp = evas_object_dynamicbox_title(page_info->item);
+ if (!tmp || strlen(tmp) == 0) {
+ const char *dbox_id;
+ struct add_viewer_package *pkginfo;
+
+ dbox_id = evas_object_dynamicbox_dbox_id(page_info->item);
+ break_if(!dbox_id);
+
+ pkginfo = add_viewer_package_find(dbox_id);
+ if (pkginfo) {
+ tmp = add_viewer_package_list_name(pkginfo);
+ }
+
+ if (!tmp) {
+ //Fallback to the dynamicbox id
+ tmp = dbox_id;
+ }
+ }
+ break;
+ default:
+ _E("Cannot reach here");
+ break;
+ }
+ if (!tmp) return NULL;
+
+ title = strdup(tmp);
+ retv_if(!title, NULL);
+
+ return title;
+}
+
+
+
+HAPI void page_set_effect(Evas_Object *page, void (*left_effect)(Evas_Object *), void (*right_effect)(Evas_Object *))
+{
+ ret_if(!page);
+
+ if (left_effect) {
+ evas_object_data_set(page, PRIVATE_DATA_KEY_PAGE_LEFT_EFFECT, left_effect);
+ }
+
+ if (right_effect) {
+ evas_object_data_set(page, PRIVATE_DATA_KEY_PAGE_RIGHT_EFFECT, right_effect);
+ }
+}
+
+
+
+HAPI void page_unset_effect(Evas_Object *page)
+{
+ evas_object_data_del(page, PRIVATE_DATA_KEY_PAGE_LEFT_EFFECT);
+ evas_object_data_del(page, PRIVATE_DATA_KEY_PAGE_RIGHT_EFFECT);
+}
+
+
+
+HAPI void *page_get_effect(Evas_Object *page, page_effect_type_e effect_type)
+{
+ void (*effect)(Evas_Object *) = NULL;
+
+ retv_if(!page, NULL);
+
+ switch (effect_type) {
+ case PAGE_EFFECT_TYPE_LEFT:
+ effect = evas_object_data_get(page, PRIVATE_DATA_KEY_PAGE_LEFT_EFFECT);
+ break;
+ case PAGE_EFFECT_TYPE_RIGHT:
+ effect = evas_object_data_get(page, PRIVATE_DATA_KEY_PAGE_RIGHT_EFFECT);
+ break;
+ default:
+ _E("Cannot reach here");
+ break;
+ }
+
+ return effect;
+}
+
+
+
+#define PAGE_EFFECT_REMAINDER_LIMIT 30
+#define PAGE_EFFECT_REMAINDER_RELATION 0.90f
+#define PAGE_EFFECT_REMAINDER_RELATION_EX (1.0f-PAGE_EFFECT_REMAINDER_RELATION)
+HAPI void page_effect_smaller_by_remainder(Evas_Object *page)
+{
+ Evas_Map *map = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ int cur_x, cur_y, cur_w, cur_h;
+ int base_x;
+ int page_w;
+ double center_x, center_y, rel;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->page_inner);
+
+ scroller_info = evas_object_data_get(page_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ evas_object_geometry_get(page, &cur_x, &cur_y, &cur_w, &cur_h);
+
+ center_x = cur_x + cur_w / 2.0f;
+ center_y = cur_y + cur_h / 2.0f;
+
+ page_w = page_info->width;
+
+ /* Every pages need to be considered between 0 and page_width */
+ if (cur_x < 0) {
+ base_x = cur_x + (cur_x / page_w + 1) * page_w;
+ } else {
+ base_x = cur_x % page_w;
+ }
+
+ if (base_x <= PAGE_EFFECT_REMAINDER_LIMIT) {
+ /* Change the relation */
+ rel = 1.0f
+ - PAGE_EFFECT_REMAINDER_RELATION_EX * (((double) base_x) / PAGE_EFFECT_REMAINDER_LIMIT);
+ } else if (page_w - base_x <= PAGE_EFFECT_REMAINDER_LIMIT) {
+ /* Change the relation */
+ rel = 1.0f
+ - PAGE_EFFECT_REMAINDER_RELATION_EX * (((double) page_w - base_x) / PAGE_EFFECT_REMAINDER_LIMIT);
+ } else {
+ /* Keep the relation */
+ rel = PAGE_EFFECT_REMAINDER_RELATION;
+ }
+
+ map = evas_map_new(4);
+ ret_if(!map);
+
+ evas_map_util_points_populate_from_object(map, page);
+ evas_map_util_zoom(map, rel, rel, center_x, center_y);
+
+ evas_object_map_set(page_info->page_inner, map);
+ evas_object_map_enable_set(page_info->page_inner, EINA_TRUE);
+
+ evas_map_free(map);
+
+ if (!eina_list_data_find_list(scroller_info->effect_page_list, page_info->page_inner)) {
+ scroller_info->effect_page_list
+ = eina_list_append(scroller_info->effect_page_list, page_info->page_inner);
+ }
+}
+
+
+
+HAPI void page_effect_none(Evas_Object *page)
+{
+ Evas_Map *map = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ int cur_x, cur_y, cur_w, cur_h;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ ret_if(!page_info->page_inner);
+
+ scroller_info = evas_object_data_get(page_info->scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ /**
+ * Send mouse up event when we start to scroll pages.
+ */
+ if (page_info->item) {
+ evas_object_dynamicbox_force_mouse_up(page_info->item);
+ }
+
+ evas_object_geometry_get(page, &cur_x, &cur_y, &cur_w, &cur_h);
+
+ map = evas_map_new(4);
+ ret_if(!map);
+
+ /* LEFT */
+ evas_map_point_coord_set(map, 0, cur_x, cur_y, 0);
+ evas_map_point_image_uv_set(map, 0, 0, 0);
+ evas_map_point_color_set(map, 0, 255, 255, 255, 255);
+
+ /* RIGHT */
+ evas_map_point_coord_set(map, 1, cur_x + cur_w, cur_y, 0);
+ evas_map_point_image_uv_set(map, 1, cur_w, 0);
+ evas_map_point_color_set(map, 1, 255, 255, 255, 255);
+
+ /* BOTTOM-RIGHT */
+ evas_map_point_coord_set(map, 2, cur_x + cur_w, cur_y + cur_h, 0);
+ evas_map_point_image_uv_set(map, 2, cur_w, cur_h);
+ evas_map_point_color_set(map, 2, 255, 255, 255, 255);
+
+ /* BOTTOM-LEFT */
+ evas_map_point_coord_set(map, 3, cur_x, cur_y + cur_h, 0);
+ evas_map_point_image_uv_set(map, 3, 0, cur_h);
+ evas_map_point_color_set(map, 3, 255, 255, 255, 255);
+
+ evas_object_map_set(page_info->page_inner, map);
+ evas_object_map_enable_set(page_info->page_inner, EINA_TRUE);
+
+ evas_map_free(map);
+
+ if (!eina_list_data_find_list(scroller_info->effect_page_list, page_info->page_inner)) {
+ scroller_info->effect_page_list
+ = eina_list_append(scroller_info->effect_page_list, page_info->page_inner);
+ }
+}
+
+
+
+
+
+
+HAPI void page_clean_effect(Evas_Object *scroller)
+{
+ Evas_Object *page_inner = NULL;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ list = scroller_info->effect_page_list;
+ if (!list) return;
+
+ EINA_LIST_FREE(list, page_inner) {
+ evas_object_map_enable_set(page_inner, EINA_FALSE);
+ }
+
+ scroller_info->effect_page_list = NULL;
+}
+
+
+
+HAPI void page_backup_inner_focus(Evas_Object *page, Evas_Object *prev_page, Evas_Object *next_page)
+{
+ page_info_s *page_info = NULL;
+ page_info_s *prev_page_info = NULL;
+ page_info_s *next_page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+ if (prev_page) {
+ prev_page_info = evas_object_data_get(prev_page, DATA_KEY_PAGE_INFO);
+ ret_if(!prev_page_info);
+ }
+ if (next_page) {
+ next_page_info = evas_object_data_get(next_page, DATA_KEY_PAGE_INFO);
+ ret_if(!next_page_info);
+ }
+
+ if (prev_page) {
+ elm_object_focus_next_object_set(page_info->focus, prev_page_info->focus, ELM_FOCUS_PREVIOUS);
+ elm_access_highlight_next_set(page_info->focus, ELM_HIGHLIGHT_DIR_PREVIOUS, prev_page_info->focus);
+ }
+
+ if (next_page) {
+ elm_object_focus_next_object_set(page_info->focus, next_page_info->focus, ELM_FOCUS_NEXT);
+ elm_access_highlight_next_set(page_info->focus, ELM_HIGHLIGHT_DIR_NEXT, next_page_info->focus);
+ }
+}
+
+
+
+HAPI void page_restore_inner_focus(Evas_Object *page)
+{
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ if (page_info->focus_prev) {
+ elm_object_focus_next_object_set(page_info->focus, page_info->focus_prev, ELM_FOCUS_PREVIOUS);
+ elm_access_highlight_next_set(page_info->focus, ELM_HIGHLIGHT_DIR_PREVIOUS, page_info->focus_prev);
+ } else {
+ elm_object_focus_next_object_set(page_info->focus, NULL, ELM_FOCUS_PREVIOUS);
+ elm_access_highlight_next_set(page_info->focus, ELM_HIGHLIGHT_DIR_PREVIOUS, NULL);
+ }
+
+ if (page_info->focus_next) {
+ elm_object_focus_next_object_set(page_info->focus, page_info->focus_next, ELM_FOCUS_NEXT);
+ elm_access_highlight_next_set(page_info->focus, ELM_HIGHLIGHT_DIR_NEXT, page_info->focus_next);
+ } else {
+ elm_object_focus_next_object_set(page_info->focus, NULL, ELM_FOCUS_NEXT);
+ elm_access_highlight_next_set(page_info->focus, ELM_HIGHLIGHT_DIR_NEXT, NULL);
+ }
+}
+
+
+
+HAPI void page_set_title(Evas_Object *page, const char *title)
+{
+ page_info_s *page_info = NULL;
+
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ free(page_info->title);
+
+ /* Title can be NULL */
+ if (title) {
+ page_info->title = strdup(title);
+ } else {
+ page_info->title = NULL;
+ }
+}
+
+
+
+HAPI const char *page_get_title(Evas_Object *page)
+{
+ page_info_s *page_info = NULL;
+
+ retv_if(!page, NULL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ return page_info->title;
+}
+
+
+
+HAPI int page_is_appended(Evas_Object *page)
+{
+ page_info_s *page_info = NULL;
+
+ retv_if(!page, 0);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, 0);
+
+ return page_info->appended == EINA_TRUE ? 1 : 0;
+}
+
+
+
+// End of this file
diff --git a/home/src/page_info.c b/home/src/page_info.c
new file mode 100644
index 0000000..4a87d05
--- /dev/null
+++ b/home/src/page_info.c
@@ -0,0 +1,139 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <Eina.h>
+#include <Evas.h>
+#include <bundle.h>
+#include <dlog.h>
+
+#include "log.h"
+#include "page_info.h"
+#include "util.h"
+
+HAPI page_info_s *page_info_create(const char *id, const char *subid, double period)
+{
+ page_info_s *page_info = NULL;
+
+ page_info = calloc(1, sizeof(page_info_s));
+ retv_if(!page_info, NULL);
+
+ if (id) {
+ page_info->id = strdup(id);
+ if (!page_info->id) {
+ free(page_info);
+ return NULL;
+ }
+ }
+
+ if (subid) {
+ page_info->subid = strdup(subid);
+ if (!page_info->subid) {
+ free(page_info->id);
+ free(page_info);
+ return NULL;
+ }
+ }
+
+ if (id) {
+ page_info->removable = 1;
+ }
+
+ page_info->period = period;
+
+ return page_info;
+}
+
+
+
+HAPI void page_info_destroy(page_info_s *page_info)
+{
+ ret_if(!page_info);
+
+ free(page_info->id);
+ free(page_info->subid);
+ free(page_info);
+}
+
+
+
+HAPI page_info_s *page_info_dup(page_info_s *page_info)
+{
+ page_info_s *dup = NULL;
+
+ retv_if(!page_info, NULL);
+
+ dup = page_info_create(page_info->id, page_info->subid, page_info->period);
+ retv_if(!dup, NULL);
+
+ if (page_info->title) {
+ dup->title = strdup(page_info->title);
+ }
+ dup->width = page_info->width;
+ dup->height = page_info->height;
+ dup->direction = page_info->direction;
+ dup->category = page_info->category;
+ dup->removable = page_info->removable;
+
+ dup->layout = page_info->layout;
+ dup->scroller = page_info->scroller;
+ dup->page = page_info->page;
+ dup->page_rect = page_info->page_rect;
+ dup->page_inner = page_info->page_inner;
+ dup->page_inner_area = page_info->page_inner_area;
+ dup->page_inner_bg = page_info->page_inner_bg;
+ dup->focus = page_info->focus;
+ dup->remove_focus = page_info->remove_focus;
+ dup->item = page_info->item;
+ dup->focus_prev = page_info->focus_prev;
+ dup->focus_next = page_info->focus_next;
+
+ dup->ordering = page_info->ordering;
+ dup->layout_longpress = page_info->layout_longpress;
+ dup->highlighted = page_info->highlighted;
+ dup->need_to_unhighlight = page_info->need_to_unhighlight;
+ dup->highlight_changed = page_info->highlight_changed;
+ dup->is_scrolled_object = page_info->is_scrolled_object;
+
+ return dup;
+}
+
+
+
+HAPI void page_info_list_destroy(Eina_List *page_info_list)
+{
+ page_info_s *page_info = NULL;
+
+ ret_if(!page_info_list);
+
+ EINA_LIST_FREE(page_info_list, page_info) {
+ continue_if(!page_info);
+ page_info_destroy(page_info);
+ }
+}
+
+
+
+HAPI int page_info_is_removable(const char *id)
+{
+ if(!id) return 0;
+ return 1;
+}
+
+
+
+// End of a file
diff --git a/home/src/pkgmgr.c b/home/src/pkgmgr.c
new file mode 100644
index 0000000..83376d0
--- /dev/null
+++ b/home/src/pkgmgr.c
@@ -0,0 +1,760 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <package-manager.h>
+#include <pkgmgr-info.h>
+#include <efl_assist.h>
+#include <bundle.h>
+#include <dlog.h>
+
+#include <dynamicbox_service.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "pkgmgr.h"
+
+
+
+struct pkgmgr_handler {
+ const char *key;
+ int (*func)(const char *package, const char *val, void *data);
+};
+
+typedef struct {
+ char* package;
+ char* key;
+ char* val;
+} pkgmgr_reserve_s;
+
+typedef struct {
+ char* package;
+ char* status;
+} pkgmgr_request_s;
+
+typedef struct {
+ char* pkg_id;
+ char* app_id;
+ Evas_Object *item;
+} pkgmgr_install_s;
+
+static struct {
+ pkgmgr_client *listen_pc;
+ Eina_List *reserve_list;
+ Eina_List *request_list;
+ Eina_List *item_list;
+ Eina_List *dynamicbox_list;
+ int hold;
+} pkg_mgr_info = {
+ .listen_pc = NULL,
+ .reserve_list = NULL,
+ .request_list = NULL,
+ .item_list = NULL,
+ .dynamicbox_list = NULL,
+};
+
+
+
+HAPI void pkgmgr_hold_event(void)
+{
+ pkg_mgr_info.hold = 1;
+}
+
+
+
+HAPI void pkgmgr_unhold_event(void)
+{
+ pkg_mgr_info.hold = 0;
+}
+
+
+
+static w_home_error_e _append_request_in_list(const char *package, const char *status)
+{
+ pkgmgr_request_s *rt = NULL;
+ char *tmp_pkg = NULL;
+ char *tmp_st = NULL;
+
+ retv_if(NULL == package, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == status, W_HOME_ERROR_INVALID_PARAMETER);
+
+ rt = calloc(1, sizeof(pkgmgr_request_s));
+ retv_if(NULL == rt, W_HOME_ERROR_FAIL);
+
+ tmp_pkg = strdup(package);
+ goto_if(NULL == tmp_pkg, ERROR);
+
+ rt->package = tmp_pkg;
+
+ tmp_st = strdup(status);
+ goto_if(NULL == tmp_st, ERROR);
+
+ rt->status = tmp_st;
+
+ pkg_mgr_info.request_list = eina_list_append(pkg_mgr_info.request_list, rt);
+ goto_if(NULL == pkg_mgr_info.request_list, ERROR);
+
+ return W_HOME_ERROR_NONE;
+
+ERROR:
+ free(rt->package);
+ free(rt->status);
+ free(rt);
+
+ return W_HOME_ERROR_FAIL;
+}
+
+
+
+static w_home_error_e _remove_request_in_list(const char *package)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_request_s *rt = NULL;
+
+ retv_if(NULL == package, W_HOME_ERROR_INVALID_PARAMETER);
+
+ if (NULL == pkg_mgr_info.request_list) return W_HOME_ERROR_NONE;
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.request_list, l, ln, rt) {
+ if (!rt) continue;
+ if (!rt->package) continue;
+ if (strcmp(rt->package, package)) continue;
+
+ pkg_mgr_info.request_list = eina_list_remove(pkg_mgr_info.request_list, rt);
+ free(rt->package);
+ free(rt->status);
+ free(rt);
+ return W_HOME_ERROR_NONE;
+ }
+
+ return W_HOME_ERROR_FAIL;
+}
+
+
+
+static int _exist_request_in_list(const char *package)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_request_s *rt = NULL;
+
+ retv_if(NULL == package, 0);
+
+ if (NULL == pkg_mgr_info.request_list) return 0;
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.request_list, l, ln, rt) {
+ if (!rt) continue;
+ if (!rt->package) continue;
+ if (strcmp(rt->package, package)) continue;
+ return 1;
+ }
+
+ return 0;
+}
+
+
+
+static pkgmgr_request_s *_get_request_in_list(const char *package)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_request_s *rt = NULL;
+
+ retv_if(NULL == package, NULL);
+
+ if (NULL == pkg_mgr_info.request_list) return NULL;
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.request_list, l, ln, rt) {
+ if (!rt) continue;
+ if (!rt->package) continue;
+ if (strcmp(rt->package, package)) continue;
+ return rt;
+ }
+
+ return NULL;
+}
+
+
+
+HAPI w_home_error_e pkgmgr_item_list_append_item(const char *pkg_id, const char *app_id, Evas_Object *item)
+{
+ pkgmgr_install_s *pi = NULL;
+ char *tmp_pkg_id = NULL;
+ char *tmp_app_id = NULL;
+
+ retv_if(NULL == pkg_id, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == app_id, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == item, W_HOME_ERROR_INVALID_PARAMETER);
+
+ pi = calloc(1, sizeof(pkgmgr_install_s));
+ goto_if(NULL == pi, ERROR);
+
+ tmp_pkg_id = strdup(pkg_id);
+ goto_if(NULL == tmp_pkg_id, ERROR);
+
+ tmp_app_id = strdup(app_id);
+ goto_if(NULL == tmp_app_id, ERROR);
+
+ pi->pkg_id = tmp_pkg_id;
+ pi->app_id = tmp_app_id;
+ pi->item = item;
+
+ pkg_mgr_info.item_list = eina_list_append(pkg_mgr_info.item_list, pi);
+ goto_if(NULL == pkg_mgr_info.item_list, ERROR);
+
+ return W_HOME_ERROR_NONE;
+
+ERROR:
+ free(tmp_app_id);
+ free(tmp_pkg_id);
+ free(pi);
+
+ return W_HOME_ERROR_FAIL;
+}
+
+
+
+HAPI w_home_error_e pkgmgr_item_list_remove_item(const char *pkg_id, const char *app_id, Evas_Object *item)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_install_s *pi = NULL;
+
+ retv_if(NULL == pkg_id, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == app_id, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == item, W_HOME_ERROR_INVALID_PARAMETER);
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.item_list, l, ln, pi) {
+ continue_if(NULL == pi);
+ continue_if(NULL == pi->pkg_id);
+ continue_if(NULL == pi->app_id);
+ continue_if(NULL == pi->item);
+
+ if (strcmp(pi->pkg_id, pkg_id)) continue;
+ if (strcmp(pi->app_id, app_id)) continue;
+ if (pi->item != item) continue;
+
+ pkg_mgr_info.item_list = eina_list_remove(pkg_mgr_info.item_list, pi);
+
+ free(pi->app_id);
+ free(pi->pkg_id);
+ free(pi);
+
+ return W_HOME_ERROR_NONE;
+ }
+
+ return W_HOME_ERROR_FAIL;
+}
+
+
+
+HAPI void pkgmgr_item_list_affect_pkgid(const char *pkg_id, Eina_Bool (*_affected_cb)(const char *, Evas_Object *, void *), void *data)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_install_s *pi = NULL;
+
+ ret_if(NULL == pkg_mgr_info.item_list);
+ ret_if(NULL == pkg_id);
+ ret_if(NULL == _affected_cb);
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.item_list, l, ln, pi) {
+ continue_if(NULL == pi);
+ continue_if(NULL == pi->app_id);
+ continue_if(NULL == pi->item);
+
+ if (strcmp(pkg_id, pi->pkg_id)) continue;
+ /* It's possible that many items with the same package name are in the install list */
+ continue_if(EINA_TRUE != _affected_cb(pi->app_id, pi->item, data));
+ }
+}
+
+
+
+HAPI void pkgmgr_item_list_affect_appid(const char *app_id, Eina_Bool (*_affected_cb)(const char *, Evas_Object *, void *), void *data)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ pkgmgr_install_s *pi = NULL;
+
+ ret_if(NULL == pkg_mgr_info.item_list);
+ ret_if(NULL == app_id);
+ ret_if(NULL == _affected_cb);
+
+ EINA_LIST_FOREACH_SAFE(pkg_mgr_info.item_list, l, ln, pi) {
+ continue_if(NULL == pi);
+ continue_if(NULL == pi->app_id);
+ continue_if(NULL == pi->item);
+
+ if (strcmp(app_id, pi->app_id)) continue;
+ /* It's possible that many items with the same package name are in the install list */
+ continue_if(EINA_TRUE != _affected_cb(pi->app_id, pi->item, data));
+ }
+}
+
+
+
+HAPI w_home_error_e pkgmgr_uninstall(const char *appid)
+{
+ pkgmgr_client *req_pc = NULL;
+ int ret = W_HOME_ERROR_NONE;
+ char *pkgid = NULL;
+
+ retv_if(NULL == appid, W_HOME_ERROR_FAIL);
+
+ req_pc = pkgmgr_client_new(PC_REQUEST);
+ retv_if(NULL == req_pc, W_HOME_ERROR_FAIL);
+
+ pkgmgrinfo_appinfo_h handle = NULL;
+ if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_appinfo(appid, &handle)) {
+ if (PKGMGR_R_OK != pkgmgr_client_free(req_pc)) {
+ _E("cannot free pkgmgr_client for request.");
+ }
+ return W_HOME_ERROR_FAIL;
+ }
+
+ if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid)) {
+ if (PMINFO_R_OK != pkgmgrinfo_appinfo_destroy_appinfo(handle)) {
+ _E("cannot destroy the appinfo");
+ }
+
+ if (PKGMGR_R_OK != pkgmgr_client_free(req_pc)) {
+ _E("cannot free pkgmgr_client for request.");
+ }
+
+ return W_HOME_ERROR_FAIL;
+ }
+
+ if (!pkgid) pkgid = (char *) appid;
+
+ _D("Uninstall a package[%s] from an app[%s]", pkgid, appid);
+ if (pkgmgr_client_uninstall(req_pc, NULL, pkgid, PM_QUIET, NULL, NULL) < 0) {
+ _E("cannot uninstall %s.", appid);
+ ret = W_HOME_ERROR_FAIL;
+ }
+
+ if (PMINFO_R_OK != pkgmgrinfo_appinfo_destroy_appinfo(handle)) {
+ _E("cannot destroy the appinfo");
+ ret = W_HOME_ERROR_FAIL;
+ }
+
+ if (PMINFO_R_OK != pkgmgr_client_free(req_pc)) {
+ _E("cannot free pkgmgr_client");
+ ret = W_HOME_ERROR_FAIL;
+ }
+
+ return ret;
+}
+
+
+
+static w_home_error_e _start_download(const char *package, void *scroller)
+{
+ _D("Start downloading for the package(%s)", package);
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _start_uninstall(const char *package, void *scroller)
+{
+ _D("Start uninstalling for the package(%s)", package);
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _start_update(const char *package, void *scroller)
+{
+ _D("Start updating for the package(%s)", package);
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _start_recover(const char *package, void *scroller)
+{
+ _D("Start recovering for the package(%s)", package);
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _start_install(const char *package, void *scroller)
+{
+ _D("Start installing for the package(%s)", package);
+ return W_HOME_ERROR_NONE;
+}
+
+
+static int _get_dynamicbox_list_cb(const char *dbox_id, int is_prime, void *data)
+{
+ char *id = NULL;
+
+ retv_if(NULL == dbox_id, -1);
+
+ id = strdup(dbox_id);
+ retv_if(!id, -1);
+
+ _D("dbox_id(%s %d) with %s", id, is_prime, data);
+
+ pkg_mgr_info.dynamicbox_list = eina_list_append(pkg_mgr_info.dynamicbox_list, id);
+
+ return 0;
+}
+
+
+static w_home_error_e _start(const char *package, const char *val, void *scroller)
+{
+ struct start_cb_set {
+ const char *name;
+ int (*handler)(const char *package, void *scroller);
+ } start_cb[] = {
+ {
+ .name = "download",
+ .handler = _start_download,
+ },
+ {
+ .name = "uninstall",
+ .handler = _start_uninstall,
+ },
+ {
+ .name = "install",
+ .handler = _start_install,
+ },
+ {
+ .name = "update",
+ .handler = _start_update,
+ },
+ {
+ .name = "recover",
+ .handler = _start_recover,
+ },
+ {
+ .name = NULL,
+ .handler = NULL,
+ },
+ };
+
+ _D("package [%s], val [%s]", package, val);
+ retv_if(_exist_request_in_list(package), W_HOME_ERROR_FAIL);
+ retv_if(W_HOME_ERROR_NONE != _append_request_in_list(package, val), W_HOME_ERROR_FAIL);
+
+ dynamicbox_service_get_pkglist_by_pkgid(package, _get_dynamicbox_list_cb, (void*) val);
+
+ register unsigned int i;
+ for (i = 0; start_cb[i].name; i ++) {
+ if (strcasecmp(val, start_cb[i].name)) continue;
+ break_if(NULL == start_cb[i].handler);
+ return start_cb[i].handler(package, scroller);
+ }
+
+ _E("Unknown status for starting phase signal'd from package manager");
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _icon_path(const char *package, const char *val, void *scroller)
+{
+ _D("package(%s) with %s", package, val);
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _download_percent(const char *package, const char *val, void *scroller)
+{
+ _D("package(%s) with %s", package, val);
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _install_percent(const char *package, const char *val, void *scroller)
+{
+ _D("package(%s) with %s", package, val);
+ if (_exist_request_in_list(package)) return W_HOME_ERROR_NONE;
+ retv_if(W_HOME_ERROR_NONE != _append_request_in_list(package, "install"), W_HOME_ERROR_FAIL);
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _error(const char *package, const char *val, void *scroller)
+{
+ _D("package(%s) with %s", package, val);
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static int _end_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
+{
+ char *appid = NULL;
+ pkgmgr_request_s *rt = NULL;
+
+ retv_if(NULL == handle, -1);
+ retv_if(NULL == user_data, -1);
+
+ pkgmgrinfo_appinfo_get_appid(handle, &appid);
+
+ rt = user_data;
+ if (!strcmp(rt->status, "install")) {
+ /* Install an app */
+ } else if (!strcmp(rt->status, "update")) {
+ /* Update an app */
+ } else {
+ _E("No routines for this status (%s:%s)", rt->package, rt->status);
+ }
+
+ return 0;
+}
+
+
+
+static Eina_Bool _uninstall_cb(const char *app_id, Evas_Object *item, void *data)
+{
+ /* Uninstall a dbox */
+
+ return EINA_TRUE;
+}
+
+
+
+static w_home_error_e _end(const char *package, const char *val, void *data)
+{
+ pkgmgr_request_s *rt = NULL;
+ pkgmgrinfo_pkginfo_h handle = NULL;
+
+ retv_if(!_exist_request_in_list(package), W_HOME_ERROR_FAIL);
+
+ rt = _get_request_in_list(package);
+ retv_if(NULL == rt, W_HOME_ERROR_FAIL);
+ retv_if(strcasecmp(val, "ok"), W_HOME_ERROR_FAIL);
+
+ _D("Package(%s) : key(%s) - val(%s)", package, rt->status, val);
+
+ /* Criteria : pkgid */
+ if (!strcasecmp("uninstall", rt->status)) {
+ char *dbox_id = NULL;
+
+ pkgmgr_item_list_affect_pkgid(package, _uninstall_cb, NULL);
+
+ EINA_LIST_FREE(pkg_mgr_info.dynamicbox_list, dbox_id) {
+ continue_if(NULL == dbox_id);
+ pkgmgr_item_list_affect_pkgid(dbox_id, _uninstall_cb, NULL);
+ free(dbox_id);
+ }
+ pkg_mgr_info.dynamicbox_list = NULL;
+
+ goto OUT;
+ }
+
+ retv_if(PMINFO_R_OK != pkgmgrinfo_pkginfo_get_pkginfo(package, &handle), W_HOME_ERROR_FAIL);
+
+ /* Criteria : appid */
+ if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_list(handle, PMINFO_UI_APP, _end_cb, rt)) {
+ if (W_HOME_ERROR_NONE != _remove_request_in_list(package))
+ _E("cannot remove a request(%s:%s)", rt->package, rt->status);
+ pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+ return W_HOME_ERROR_FAIL;
+ }
+
+OUT:
+ if (W_HOME_ERROR_NONE != _remove_request_in_list(package))
+ _E("cannot remove a request(%s:%s)", rt->package, rt->status);
+ if (handle) pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static w_home_error_e _change_pkg_name(const char *package, const char *val, void *scroller)
+{
+ _D("package(%s) with %s", package, val);
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static struct pkgmgr_handler pkgmgr_cbs[] = {
+ { "start", _start },
+ { "icon_path", _icon_path },
+ { "download_percent", _download_percent },
+ { "command", NULL },
+ { "install_percent", _install_percent },
+ { "error", _error },
+ { "end", _end },
+ { "change_pkg_name", _change_pkg_name },
+};
+
+
+
+static w_home_error_e _pkgmgr_cb(int req_id, const char *pkg_type, const char *package, const char *key, const char *val, const void *pmsg, void *data)
+{
+ register unsigned int i;
+
+ _D("pkgmgr request [%s:%s] for %s", key, val, package);
+
+ if (BOOTING_STATE_DONE > main_get_info()->booting_state) {
+ pkgmgr_reserve_list_push_request(package, key, val);
+ return W_HOME_ERROR_NONE;
+ }
+
+ if (pkg_mgr_info.hold) {
+ pkgmgr_reserve_list_push_request(package, key, val);
+ return W_HOME_ERROR_NONE;
+ }
+
+ for (i = 0; i < sizeof(pkgmgr_cbs) / sizeof(struct pkgmgr_handler); i++) {
+ if (strcasecmp(pkgmgr_cbs[i].key, key)) continue;
+ break_if(!pkgmgr_cbs[i].func);
+
+ if (W_HOME_ERROR_NONE != pkgmgr_cbs[i].func(package, val, NULL)) {
+ _E("pkgmgr_cbs[%u].func has errors.", i);
+ }
+
+ return W_HOME_ERROR_NONE;
+ }
+
+ return W_HOME_ERROR_FAIL;
+}
+
+
+
+HAPI w_home_error_e pkgmgr_reserve_list_push_request(const char *package, const char *key, const char *val)
+{
+ char *tmp_package = NULL;
+ char *tmp_key = NULL;
+ char *tmp_val = NULL;
+
+ retv_if(NULL == package, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == key, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(NULL == val, W_HOME_ERROR_INVALID_PARAMETER);
+
+ pkgmgr_reserve_s *pr = calloc(1, sizeof(pkgmgr_reserve_s));
+ retv_if(NULL == pr, W_HOME_ERROR_FAIL);
+
+ tmp_package = strdup(package);
+ goto_if(NULL == tmp_package, ERROR);
+ pr->package = tmp_package;
+
+ tmp_key = strdup(key);
+ goto_if(NULL == tmp_key, ERROR);
+ pr->key = tmp_key;
+
+ tmp_val = strdup(val);
+ goto_if(NULL == tmp_val, ERROR);
+ pr->val = tmp_val;
+
+ pkg_mgr_info.reserve_list = eina_list_append(pkg_mgr_info.reserve_list, pr);
+ goto_if(NULL == pkg_mgr_info.reserve_list, ERROR);
+
+ return W_HOME_ERROR_NONE;
+
+ERROR:
+ free(tmp_val);
+ free(tmp_key);
+ free(tmp_package);
+ free(pr);
+
+ return W_HOME_ERROR_FAIL;
+}
+
+
+
+HAPI w_home_error_e pkgmgr_reserve_list_pop_request(void)
+{
+ pkgmgr_reserve_s *pr = NULL;
+
+ if (!pkg_mgr_info.reserve_list) return W_HOME_ERROR_NO_DATA;
+
+ pr = eina_list_nth(pkg_mgr_info.reserve_list, 0);
+ if (!pr) return W_HOME_ERROR_NO_DATA;
+ pkg_mgr_info.reserve_list = eina_list_remove(pkg_mgr_info.reserve_list, pr);
+
+ goto_if(W_HOME_ERROR_NONE != _pkgmgr_cb(0, NULL, pr->package, pr->key, pr->val, NULL, NULL), ERROR);
+
+ free(pr->package);
+ free(pr->key);
+ free(pr->val);
+ free(pr);
+
+ return W_HOME_ERROR_NONE;
+
+ERROR:
+ free(pr->package);
+ free(pr->key);
+ free(pr->val);
+ free(pr);
+
+ return W_HOME_ERROR_FAIL;
+}
+
+
+
+HAPI w_home_error_e pkgmgr_init(void)
+{
+ if (NULL != pkg_mgr_info.listen_pc) {
+ return W_HOME_ERROR_NONE;
+ }
+
+ pkg_mgr_info.listen_pc = pkgmgr_client_new(PC_LISTENING);
+ retv_if(NULL == pkg_mgr_info.listen_pc, W_HOME_ERROR_FAIL);
+ retv_if(pkgmgr_client_listen_status(pkg_mgr_info.listen_pc,
+ _pkgmgr_cb, NULL) != PKGMGR_R_OK, W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI void pkgmgr_fini(void)
+{
+ ret_if(NULL == pkg_mgr_info.listen_pc);
+ if (pkgmgr_client_free(pkg_mgr_info.listen_pc) != PKGMGR_R_OK) {
+ _E("cannot free pkgmgr_client for listen.");
+ }
+ pkg_mgr_info.listen_pc = NULL;
+}
+
+
+
+HAPI int pkgmgr_exist(char *appid)
+{
+ int ret = 0;
+ pkgmgrinfo_appinfo_h handle = NULL;
+
+ ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle);
+ if (PMINFO_R_OK != ret || NULL == handle) {
+ _SD("%s doesn't exist in this binary", appid);
+ return 0;
+ }
+
+ pkgmgrinfo_appinfo_destroy_appinfo(handle);
+
+ return 1;
+}
+
+
+
+// End of a file
diff --git a/home/src/popup.c b/home/src/popup.c
new file mode 100755
index 0000000..1697022
--- /dev/null
+++ b/home/src/popup.c
@@ -0,0 +1,69 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <aul.h>
+#include <app.h>
+#include <appsvc.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <Elementary.h>
+#include <Evas.h>
+#include <dlog.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <vconf.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "popup.h"
+
+
+
+#define APPID_WC_POPUP "org.tizen.weconn-popup"
+#define WC_POPUP_EXTRA_DATA_KEY "http://samsung.com/appcontrol/data/connection_type"
+static void _popup_weconn_gear_to_home(void)
+{
+ app_control_h service = NULL;
+ ret_if(APP_CONTROL_ERROR_NONE != app_control_create(&service));
+ ret_if(NULL == service);
+
+ app_control_add_extra_data(service, WC_POPUP_EXTRA_DATA_KEY, "mobile_data_noti");
+
+ app_control_set_app_id(service, APPID_WC_POPUP);
+ int ret = app_control_send_launch_request(service, NULL, NULL);
+ if (ret != APP_CONTROL_ERROR_NONE) {
+ _E("Failed to launch:%d", ret);
+ }
+
+ app_control_destroy(service);
+}
+
+static void _popup_after_tutorial(void)
+{
+ _W("popup:misc");
+ _popup_weconn_gear_to_home();
+}
+
+void popup_show(int stage)
+{
+ if (stage == POPUP_STAGE_AFTER_TUTORIAL) {
+ _popup_after_tutorial();
+ }
+}
diff --git a/home/src/power_mode.c b/home/src/power_mode.c
new file mode 100755
index 0000000..d2515cc
--- /dev/null
+++ b/home/src/power_mode.c
@@ -0,0 +1,412 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Evas.h>
+#include <vconf.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "layout_info.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "layout.h"
+#include "clock_service.h"
+#include "db.h"
+#include "dbus.h"
+#include "tutorial.h"
+#include "apps/apps_main.h"
+#include "power_mode.h"
+
+#define COOLDOWN_STATUS_RELEASE "Release"
+#define COOLDOWN_STATUS_LIMITATION "LimitAction"
+#define COOLDOWN_STATUS_WARNING "WarningAction"
+
+#define POWER_MODE_POWER_ENHANCED_MODE 1
+#define POWER_MODE_COOLDOWN_MODE 2
+
+static struct {
+ int is_ui_ready;
+ int ps_mode;
+ int cooldown_mode;
+ int applied_mode;
+
+ Eina_List *cbs_list[POWER_MODE_EVENT_MAX];
+} s_info = {
+ .is_ui_ready = 0,
+ .ps_mode = 0,
+ .cooldown_mode = -1,
+ .applied_mode = -1,
+
+ .cbs_list = {NULL, },
+};
+
+typedef struct {
+ void (*result_cb)(void *, void *);
+ void *result_data;
+} powermode_cb_s;
+
+HAPI int power_mode_register_cb(
+ int type,
+ void (*result_cb)(void *, void *), void *result_data)
+{
+ retv_if(result_cb == NULL, W_HOME_ERROR_INVALID_PARAMETER);
+
+ powermode_cb_s *cb = calloc(1, sizeof(powermode_cb_s));
+ retv_if(cb == NULL, W_HOME_ERROR_FAIL);
+
+ cb->result_cb = result_cb;
+ cb->result_data = result_data;
+
+ s_info.cbs_list[type] = eina_list_prepend(s_info.cbs_list[type], cb);
+ retv_if(s_info.cbs_list[type] == NULL, W_HOME_ERROR_FAIL);
+
+ return W_HOME_ERROR_NONE;
+}
+
+HAPI void power_mode_unregister_cb(
+ int type,
+ void (*result_cb)(void *, void *))
+{
+ const Eina_List *l;
+ const Eina_List *n;
+ powermode_cb_s *cb;
+ EINA_LIST_FOREACH_SAFE(s_info.cbs_list[type], l, n, cb) {
+ continue_if(cb == NULL);
+ if (result_cb != cb->result_cb) continue;
+ s_info.cbs_list[type] = eina_list_remove(s_info.cbs_list[type], cb);
+ free(cb);
+ return;
+ }
+}
+
+static void _execute_cbs(int type, void *event_info)
+{
+ const Eina_List *l = NULL;
+ const Eina_List *n = NULL;
+ powermode_cb_s *cb = NULL;
+ EINA_LIST_FOREACH_SAFE(s_info.cbs_list[type], l, n, cb) {
+ continue_if(cb == NULL);
+ continue_if(cb->result_cb == NULL);
+
+ cb->result_cb(cb->result_data, event_info);
+ }
+}
+
+static Evas_Object *_layout_get(void) {
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ }
+
+ return layout;
+}
+
+static Evas_Object *_scroller_get(void) {
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ if (layout != NULL) {
+ scroller = elm_object_part_content_get(layout, "scroller");
+ }
+ }
+
+ return scroller;
+}
+
+static Evas_Object *_tutorial_get(void) {
+ Evas_Object *layout = _layout_get();
+ layout_info_s *layout_info = NULL;
+ Evas_Object *tutorial = NULL;
+
+ if (layout != NULL) {
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ if(layout_info != NULL) {
+ tutorial = layout_info->tutorial;
+ }
+ }
+
+ return tutorial;
+}
+
+static int _psmode_get(void)
+{
+ int ps_mode = SETTING_PSMODE_NORMAL;
+
+ if(vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &ps_mode) < 0) {
+ _E("Failed to get VCONFKEY_SETAPPL_PSMODE");
+ }
+
+ return ps_mode;
+}
+
+static void _del_list(void *data)
+{
+ Eina_List *page_info_list = data;
+ ret_if(!page_info_list);
+ page_info_list_destroy(page_info_list);
+}
+
+/*
+ * Emergency Mode
+ */
+static void _psmode_apply(int mode)
+{
+ Evas_Object *scroller = _scroller_get();
+ ret_if(scroller == NULL);
+
+ _D("changing home to emergency mode to:%d", mode);
+
+ if (mode == SETTING_PSMODE_NORMAL) {
+ Eina_List *page_info_list = NULL;
+
+ _execute_cbs(POWER_MODE_ENHANCED_OFF, NULL);
+
+ clock_service_request(CLOCK_SERVICE_MODE_NORMAL);
+
+ page_info_list = db_write_list();
+ if (page_info_list) {
+ scroller_push_pages(scroller, page_info_list, _del_list, page_info_list);
+ } else {
+ scroller_push_pages(scroller, NULL, NULL, NULL);
+ }
+
+ if(tutorial_is_first_boot()) tutorial_create(_layout_get());
+ } else if (mode == SETTING_PSMODE_WEARABLE_ENHANCED) {
+ _execute_cbs(POWER_MODE_ENHANCED_ON, NULL);
+
+ if(_tutorial_get()) tutorial_destroy(_tutorial_get());
+
+ if (apps_main_is_visible() == EINA_TRUE) {
+ _D("need to hide apps");
+ apps_main_launch(APPS_LAUNCH_HIDE);
+ }
+ layout_set_idle(_layout_get());
+
+ clock_service_request(CLOCK_SERVICE_MODE_EMERGENCY);
+ scroller_region_show_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT);
+
+ scroller_pop_pages(scroller, PAGE_DIRECTION_RIGHT);
+ elm_win_activate(main_get_info()->win);
+ }
+}
+
+/*
+ * CoolDown Mode
+ */
+static int _cooldown_mode_status_to_mode(const char *status)
+{
+ if (strcmp(status, COOLDOWN_STATUS_RELEASE) == 0) {
+ return COOLDOWN_MODE_RELEASE;
+ } else if (strcmp(status, COOLDOWN_STATUS_LIMITATION) == 0) {
+ return COOLDOWN_MODE_LIMITATION;
+ } else if (strcmp(status, COOLDOWN_STATUS_WARNING) == 0) {
+ return COOLDOWN_MODE_WARNING;
+ }
+
+ return COOLDOWN_MODE_RELEASE;
+}
+
+static int _cooldown_mode_get_from_dbus(void)
+{
+ int mode = COOLDOWN_MODE_RELEASE;
+
+ char *cooldown_mode = home_dbus_cooldown_status_get();
+ _W("cooldown status:%s", cooldown_mode);
+ if (cooldown_mode != NULL) {
+ mode = _cooldown_mode_status_to_mode(cooldown_mode);
+ free(cooldown_mode);
+ }
+
+ return mode;
+}
+
+static int _cooldown_mode_get(void)
+{
+ if (s_info.cooldown_mode == -1) {
+ s_info.cooldown_mode = _cooldown_mode_get_from_dbus();
+ }
+
+ return s_info.cooldown_mode;
+}
+
+static void _cooldown_mode_apply(int mode)
+{
+ Evas_Object *scroller = _scroller_get();
+ ret_if(scroller == NULL);
+
+ _D("changing home to cooldown mode:%d", mode);
+
+ if (mode == COOLDOWN_MODE_RELEASE) {
+ _execute_cbs(POWER_MODE_COOLDOWN_OFF, NULL);
+
+ clock_service_request(CLOCK_SERVICE_MODE_NORMAL);
+ scroller_unfreeze(scroller);
+
+ if(tutorial_is_first_boot()) tutorial_create(_layout_get());
+ } else if (mode == COOLDOWN_MODE_LIMITATION) {
+ _execute_cbs(POWER_MODE_COOLDOWN_ON, NULL);
+
+ if(_tutorial_get()) tutorial_destroy(_tutorial_get());
+
+ if (apps_main_is_visible() == EINA_TRUE) {
+ _D("need to hide apps");
+ apps_main_launch(APPS_LAUNCH_HIDE);
+ }
+ layout_set_idle(_layout_get());
+
+ clock_service_request(CLOCK_SERVICE_MODE_COOLDOWN);
+ scroller_region_show_by_push_type(scroller, SCROLLER_PUSH_TYPE_CENTER, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT);
+ elm_win_activate(main_get_info()->win);
+ scroller_freeze(scroller);
+ }
+}
+
+#define POWER_MODE_POWER_ENHANCED_MODE 1
+#define POWER_MODE_COOLDOWN_MODE 2
+
+static void _power_mode_apply(void)
+{
+ int ps_mode = SETTING_PSMODE_NORMAL;
+ int cooldown_mode = COOLDOWN_MODE_RELEASE;
+
+ ps_mode = _psmode_get();
+ s_info.ps_mode = ps_mode;
+
+ cooldown_mode = _cooldown_mode_get();
+ s_info.cooldown_mode = cooldown_mode;
+
+ _D("ps mode:%d cooldown mode:%d", ps_mode, cooldown_mode);
+
+ if (s_info.is_ui_ready == 0) {
+ _E("ui isn't ready yet, just update power mode flag");
+ return ;
+ }
+
+ if (ps_mode != SETTING_PSMODE_NORMAL && cooldown_mode != COOLDOWN_MODE_RELEASE) {
+ _cooldown_mode_apply(cooldown_mode);
+ s_info.applied_mode = POWER_MODE_COOLDOWN_MODE;
+
+ } else if (ps_mode != SETTING_PSMODE_NORMAL && cooldown_mode == COOLDOWN_MODE_RELEASE) {
+ _psmode_apply(ps_mode);
+ s_info.applied_mode = POWER_MODE_POWER_ENHANCED_MODE;
+
+ } else if (ps_mode == SETTING_PSMODE_NORMAL && cooldown_mode != COOLDOWN_MODE_RELEASE) {
+ _cooldown_mode_apply(cooldown_mode);
+ s_info.applied_mode = POWER_MODE_COOLDOWN_MODE;
+
+ } else {
+ if (s_info.applied_mode == POWER_MODE_POWER_ENHANCED_MODE) {
+ _psmode_apply(ps_mode);
+ } else if (s_info.applied_mode == POWER_MODE_COOLDOWN_MODE) {
+ _cooldown_mode_apply(cooldown_mode);
+ } else {
+ _E("no power mode applied");
+ }
+ s_info.applied_mode = -1;
+ }
+}
+
+static void _psmode_changed_cb(keynode_t *node, void *data)
+{
+ _D("");
+ _power_mode_apply();
+}
+
+static void _cooldown_mode_changed_cb(void *user_data, void *event_info)
+{
+ _D("");
+ int mode = COOLDOWN_MODE_RELEASE;
+ _W("cooldown status:%s", event_info);
+ if (event_info != NULL) {
+ mode = _cooldown_mode_status_to_mode(event_info);
+ s_info.cooldown_mode = mode;
+ }
+
+ _power_mode_apply();
+}
+
+/*!
+ * constructor/deconstructor
+ */
+HAPI void power_mode_init(void)
+{
+ if (vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE, _psmode_changed_cb, NULL) < 0) {
+ _E("Failed to register the VCONFKEY_SETAPPL_PSMODE callback");
+ }
+
+ if (home_dbus_register_cb(DBUS_EVENT_COOLDOWN_STATE_CHANGED, _cooldown_mode_changed_cb, NULL) != W_HOME_ERROR_NONE) {
+ _E("Failed to register cooldown status changed cb");
+ }
+}
+
+HAPI void power_mode_ui_init(void)
+{
+ s_info.is_ui_ready = 1;
+
+ _power_mode_apply();
+}
+
+HAPI void power_mode_fini(void)
+{
+ if (vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE, _psmode_changed_cb) < 0) {
+ _E("Failed to ignore the VCONFKEY_SETAPPL_PSMODE callback");
+ }
+
+ home_dbus_unregister_cb(DBUS_EVENT_COOLDOWN_STATE_CHANGED, _cooldown_mode_changed_cb);
+
+ s_info.is_ui_ready = 0;
+}
+
+HAPI int emergency_mode_enabled_get(void)
+{
+ int mode = _psmode_get();
+
+ if (mode == SETTING_PSMODE_WEARABLE_ENHANCED) {
+ return 1;
+ }
+
+ return 0;
+}
+
+HAPI int cooldown_mode_enabled_get(void)
+{
+ if (_cooldown_mode_get() == COOLDOWN_MODE_LIMITATION) {
+ return 1;
+ }
+
+ return 0;
+}
+
+HAPI int cooldown_mode_warning_get(void)
+{
+ if (_cooldown_mode_get() == COOLDOWN_MODE_WARNING) {
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/home/src/scroller.c b/home/src/scroller.c
new file mode 100755
index 0000000..f4e76cf
--- /dev/null
+++ b/home/src/scroller.c
@@ -0,0 +1,2965 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <dlog.h>
+#include <minicontrol-viewer.h>
+#include <minicontrol-monitor.h>
+#include <minicontrol-handler.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <vconf.h>
+
+#include "bg.h"
+#include "util.h"
+#include "wms.h"
+#include "conf.h"
+#include "power_mode.h"
+#include "key.h"
+#include "dbus.h"
+#include "layout.h"
+#include "layout_info.h"
+#include "dbox.h"
+#include "log.h"
+#include "main.h"
+#include "minictrl.h"
+#include "page_info.h"
+#include "page.h"
+#include "pkgmgr.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "index.h"
+#include "db.h"
+#include "dynamicbox_evas.h"
+
+#define BOX_EDJE EDJEDIR"/box_layout.edj"
+#define BOX_GROUP_NAME "box"
+
+#define PRIVATE_DATA_KEY_HIDE_INDEX_TIMER "p_h_ix_tm"
+#define PRIVATE_DATA_KEY_SHOW_END "p_s_e"
+#define PRIVATE_DATA_KEY_IS_DUMMY "p_is_dum"
+#define PRIVATE_DATA_KEY_SCROLLER_FREEZED "p_sc_is_fr"
+#define PRIVATE_DATA_KEY_SCROLLER_PRESSED_PAGE "p_sc_pr_pg"
+#define PRIVATE_DATA_KEY_SCROLLER_PUSH_ALL_TIMER "p_p_tm"
+#define PRIVATE_DATA_KEY_SCROLLER_LIST "p_sc_l"
+#define PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER "p_sc_tmer"
+#define PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM "p_sc_anim"
+#define PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB "p_sc_job"
+#define PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE "p_sc_page"
+#define PRIVATE_DATA_KEY_SCROLLER_HIDE_INDEX_TIMER "p_sc_ht"
+#define PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC "pdk_sc_bf_fn"
+#define PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC_DATA "pdk_sc_bf_fn_d"
+#define PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC "pdk_sc_af_fn"
+#define PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC_DATA "pdk_sc_af_fn_d"
+
+
+
+static void _mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Ecore_Timer *timer = NULL;
+ Evas_Object *layout = data;
+ Evas_Object *scroller = obj;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!layout);
+
+ home_dbus_scroll_booster_signal_send(200);
+
+ timer = evas_object_data_del(layout, PRIVATE_DATA_KEY_HIDE_INDEX_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ timer = NULL;
+ }
+
+ elm_object_signal_emit(layout, "show", "index");
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ scroller_info->mouse_down = 1;
+}
+
+
+
+static void _mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *scroller = obj;
+ scroller_info_s *scroller_info = NULL;
+
+#if 0 //TBD
+ home_dbus_scroll_booster_signal_send(0);
+#endif
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ scroller_info->mouse_down = 0;
+}
+
+
+
+HAPI Evas_Object *scroller_get_focused_page(Evas_Object *scroller)
+{
+ Evas_Object *obj = NULL;
+ Evas_Object *cur_page = NULL;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ int x, w;
+ int half_line, whole_line, pad;
+
+ retv_if(!scroller, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ pad = (scroller_info->root_width - scroller_info->page_width) / 2;
+ half_line = scroller_info->root_width / 2;
+ whole_line = scroller_info->root_width;
+
+ list = elm_box_children_get(scroller_info->box);
+ if (!list) return NULL;
+
+ EINA_LIST_FREE(list, obj) {
+ continue_if(!obj);
+ if (cur_page) continue;
+
+ page_info = evas_object_data_get(obj, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+
+ if (!page_info->appended) {
+ _D("Page(%p) is not appended yet", obj);
+ continue;
+ }
+
+ evas_object_geometry_get(obj, &x, NULL, &w, NULL);
+ if (!w) continue;
+ if (x + w > half_line && x <= whole_line - pad) {
+ cur_page = obj;
+ } else if (x <= half_line && x >= pad) {
+ cur_page = obj;
+ }
+ }
+
+ return cur_page;
+}
+
+
+
+static int _set_scroller_reverse_by_page(Evas_Object *scroller, Evas_Object *target_page)
+{
+ Evas_Object *focus_page = NULL;
+ Evas_Object *tmp = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l;
+ scroller_info_s *scroller_info = NULL;
+ int after_focus = 0;
+
+ retv_if(!scroller, 0);
+
+ focus_page = scroller_get_focused_page(scroller);
+ if (!focus_page) return 0;
+
+ /* Center */
+ if (focus_page == target_page) return 0;
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, 0);
+
+ list = elm_box_children_get(scroller_info->box);
+ if (!list) return 0;
+
+ EINA_LIST_FOREACH(list, l, tmp) {
+ /* if the target is focused, then it is not after_focus */
+ if (tmp == target_page) break;
+ if (tmp == focus_page) after_focus = 1;
+ }
+ eina_list_free(list);
+
+ /* Right side */
+ if (after_focus) return 1;
+
+ /* Left side */
+ return -1;
+}
+
+
+
+static void _elm_box_pack_start(Evas_Object *scroller, Evas_Object *page)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!page);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_TRUE, EINA_TRUE);
+#endif
+
+ _D("pack_start a page(%p) into the scroller(%p), origin_reverse(1)", page, scroller);
+ elm_box_pack_start(scroller_info->box, page);
+ /* recalculate : child box with pages -> parent box */
+ elm_box_recalculate(scroller_info->box);
+ elm_box_recalculate(scroller_info->box_layout);
+}
+
+
+
+static void _elm_box_pack_end(Evas_Object *scroller, Evas_Object *page)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!page);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_FALSE, EINA_FALSE);
+#endif
+
+ _D("pack_end a page(%p) into the scroller(%p), origin_reverse(0)", page, scroller);
+ elm_box_pack_end(scroller_info->box, page);
+ /* recalculate : child box with pages -> parent box */
+ elm_box_recalculate(scroller_info->box);
+ elm_box_recalculate(scroller_info->box_layout);
+}
+
+
+
+static void _elm_box_pack_before(Evas_Object *scroller, Evas_Object *page, Evas_Object *before)
+{
+ scroller_info_s *scroller_info = NULL;
+ int reverse_factor;
+
+ ret_if(!scroller);
+ ret_if(!page);
+ ret_if(!before);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ reverse_factor = _set_scroller_reverse_by_page(scroller, before);
+ switch (reverse_factor) {
+ case -1:
+ case 0:
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_TRUE, EINA_TRUE);
+#endif
+ _D("pack_before a page(%p) before a page(%p) into the scroller(%p), origin_reverse(1)", page, before, scroller);
+ break;
+ case 1:
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_FALSE, EINA_FALSE);
+#endif
+ _D("pack_before a page(%p) before a page(%p) into the scroller(%p), origin_reverse(0)", page, before, scroller);
+ break;
+ default:
+ _E("Cannot reach here : %d", reverse_factor);
+ break;
+ }
+
+ elm_box_pack_before(scroller_info->box, page, before);
+ /* recalculate : child box with pages -> parent box */
+ elm_box_recalculate(scroller_info->box);
+ elm_box_recalculate(scroller_info->box_layout);
+}
+
+
+
+static void _elm_box_pack_after(Evas_Object *scroller, Evas_Object *page, Evas_Object *after)
+{
+ scroller_info_s *scroller_info = NULL;
+ int reverse_factor;
+
+ ret_if(!scroller);
+ ret_if(!page);
+ ret_if(!after);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ reverse_factor = _set_scroller_reverse_by_page(scroller, after);
+ switch (reverse_factor) {
+ case -1:
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_TRUE, EINA_TRUE);
+#endif
+ _D("pack_after a page(%p) after a page(%p) into the scroller(%p), origin_reverse(1)", page, after, scroller);
+ break;
+ case 0:
+ case 1:
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_FALSE, EINA_FALSE);
+#endif
+ _D("pack_after a page(%p) after a page(%p) into the scroller(%p), origin_reverse(0)", page, after, scroller);
+ break;
+ default:
+ _E("Cannot reach here : %d", reverse_factor);
+ break;
+ }
+
+ elm_box_pack_after(scroller_info->box, page, after);
+ /* recalculate : child box with pages -> parent box */
+ elm_box_recalculate(scroller_info->box);
+ elm_box_recalculate(scroller_info->box_layout);
+}
+
+
+
+static void _elm_box_unpack(Evas_Object *scroller, Evas_Object *page)
+{
+ scroller_info_s *scroller_info = NULL;
+ int reverse_factor;
+
+ ret_if(!scroller);
+ ret_if(!page);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ ret_if(!scroller_info->box);
+
+ int is_page_exist = 0;
+ Evas_Object *tmp = NULL;
+ Eina_List *list = elm_box_children_get(scroller_info->box);
+ EINA_LIST_FREE(list, tmp) {
+ continue_if(!tmp);
+
+ if (page == tmp) {
+ is_page_exist = 1;
+ }
+ }
+
+ if (is_page_exist == 0) {
+ _D("No page to unpack");
+ return;
+ }
+
+ reverse_factor = _set_scroller_reverse_by_page(scroller, page);
+ switch (reverse_factor) {
+ case -1:
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_TRUE, EINA_TRUE);
+#endif
+ _D("unpack a page(%p) from the scroller(%p), origin_reverse(1)", page, scroller);
+ break;
+ case 0:
+ case 1:
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_FALSE, EINA_FALSE);
+#endif
+ _D("unpack a page(%p) from the scroller(%p), origin_reverse(0)", page, scroller);
+ break;
+ default:
+ _E("Cannot reach here : %d", reverse_factor);
+ break;
+ }
+
+ elm_object_focus_set(page, EINA_FALSE);
+ elm_box_unpack(scroller_info->box, page);
+ /* recalculate : child box with pages -> parent box */
+ elm_box_recalculate(scroller_info->box);
+ elm_box_recalculate(scroller_info->box_layout);
+}
+
+
+
+static Eina_Bool _hide_index_timer_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ layout_hide_index(scroller_info->layout);
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_HIDE_INDEX_TIMER);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static Evas_Object *_select_singular_index(Evas_Object *scroller)
+{
+ Evas_Object *cur_page;
+ scroller_info_s *scroller_info = NULL;
+ page_direction_e direction;
+
+ retv_if(!scroller, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ cur_page = scroller_get_focused_page(scroller);
+ retv_if(!cur_page, NULL);
+
+ direction = scroller_get_current_page_direction(scroller);
+ switch (direction) {
+ case PAGE_DIRECTION_LEFT:
+ if (scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_LEFT], cur_page);
+ }
+ return scroller_info->index[PAGE_DIRECTION_LEFT];
+ case PAGE_DIRECTION_CENTER:
+ if (scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_LEFT], cur_page);
+ }
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_RIGHT], cur_page);
+ }
+ break;
+ case PAGE_DIRECTION_RIGHT:
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_RIGHT], cur_page);
+ }
+ return scroller_info->index[PAGE_DIRECTION_RIGHT];
+ default:
+ _E("Cannot reach here");
+ break;
+ }
+
+ return NULL;
+}
+
+
+
+#define HIDE_TIME 1.0f
+static Evas_Object *_select_plural_index(Evas_Object *scroller)
+{
+ Evas_Object *cur_page = NULL;
+ Ecore_Timer *hide_timer = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_direction_e direction;
+
+ retv_if(!scroller, NULL);
+
+ hide_timer = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_HIDE_INDEX_TIMER);
+ if (hide_timer) {
+ ecore_timer_del(hide_timer);
+ hide_timer = NULL;
+ }
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ cur_page = scroller_get_focused_page(scroller);
+ retv_if(!cur_page, NULL);
+
+ direction = scroller_get_current_page_direction(scroller);
+ switch (direction) {
+ case PAGE_DIRECTION_LEFT:
+ layout_show_left_index(scroller_info->layout);
+ if (scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_LEFT], cur_page);
+ }
+ hide_timer = ecore_timer_add(HIDE_TIME, _hide_index_timer_cb, scroller);
+ if (hide_timer) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_HIDE_INDEX_TIMER, hide_timer);
+ else _E("Cannot add a hide_timer");
+ return scroller_info->index[PAGE_DIRECTION_LEFT];
+ case PAGE_DIRECTION_CENTER:
+ if (scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_LEFT], cur_page);
+ }
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_RIGHT], cur_page);
+ }
+ layout_hide_index(scroller_info->layout);
+ break;
+ case PAGE_DIRECTION_RIGHT:
+ layout_show_right_index(scroller_info->layout);
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_bring_in_page(scroller_info->index[PAGE_DIRECTION_RIGHT], cur_page);
+ }
+ hide_timer = ecore_timer_add(HIDE_TIME, _hide_index_timer_cb, scroller);
+ if (hide_timer) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_HIDE_INDEX_TIMER, hide_timer);
+ else _E("Cannot add a hide_timer");
+ return scroller_info->index[PAGE_DIRECTION_RIGHT];
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
+
+
+static void _anim_start_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ _D("start the scroller(%p) animation", scroller);
+}
+
+
+
+static void _anim_stop_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ scroller_info_s *scroller_info = NULL;
+ Evas_Object *page = NULL;
+ Evas_Coord x, w;
+
+ _D("stop the scroller(%p) animation", scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ elm_scroller_region_get(scroller, &x, NULL, &w, NULL);
+ if (0 == x % scroller_info->page_width) {
+ /* If TTS is off, unpack or pack page_inners */
+ if (main_get_info()->is_tts) {
+ page = scroller_get_focused_page(scroller);
+ page_focus(page);
+ }
+ }
+}
+
+
+
+static void _drag_start_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ _D("start to drag the scroller(%p)", scroller);
+}
+
+
+
+static void _drag_stop_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ _D("stop to drag the scroller(%p) animation", scroller);
+}
+
+
+
+static void _scroll_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ double loop_time = 0.0;
+ static double last_boosted_time = 0.0;
+ scroller_info_s *scroller_info = NULL;
+ layout_info_s *layout_info = NULL;
+ int x, w;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ loop_time = ecore_loop_time_get();
+ if (last_boosted_time == 0.0) {
+ last_boosted_time = loop_time;
+ } else {
+ if ((loop_time - last_boosted_time) >= 2.5) {
+#if 0 // TBD
+ home_dbus_scroll_booster_signal_send(2000);
+#endif
+ last_boosted_time = loop_time;
+ }
+ }
+
+ /* 1. Focus */
+ elm_scroller_region_get(scroller, &x, NULL, &w, NULL);
+ if (0 == x % scroller_info->page_width) {
+ /* Page is on the edge */
+ scroller_info->scrolling = 0;
+ if (main_get_info()->is_tts) {
+ scroller_restore_inner_focus(scroller);
+ }
+ } else {
+ /* Page is not on the edge */
+ if (!scroller_info->scrolling) {
+ scroller_info->scrolling = 1;
+ if (main_get_info()->is_tts) {
+ scroller_backup_inner_focus(scroller);
+ }
+ }
+ }
+
+ /* 2. Index */
+ layout_info = evas_object_data_get(scroller_info->layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ /* When an user is reordering pages now, index has not to be updated */
+ if (!scroller_info->scroll_index) return;
+
+ switch (scroller_info->index_number) {
+ case SCROLLER_INDEX_SINGULAR:
+ _select_singular_index(scroller);
+ break;
+ case SCROLLER_INDEX_PLURAL:
+ _select_plural_index(scroller);
+ break;
+ default:
+ _E("Cannot reach here");
+ break;
+ }
+}
+
+
+
+HAPI void scroller_destroy(Evas_Object *parent)
+{
+ Evas_Object *scroller = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!parent);
+
+ scroller = elm_object_part_content_unset(parent, "scroller");
+ ret_if(!scroller);
+
+ evas_object_data_del(parent, DATA_KEY_SCROLLER);
+ scroller_info = evas_object_data_del(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ evas_object_data_del(scroller, DATA_KEY_INDEX);
+
+ if (scroller_info->index_update_timer) {
+ ecore_timer_del(scroller_info->index_update_timer);
+ scroller_info->index_update_timer = NULL;
+ }
+
+ evas_object_del(scroller_info->box);
+ evas_object_del(scroller_info->box_layout);
+
+ free(scroller_info);
+ evas_object_del(scroller);
+}
+
+
+
+HAPI void scroller_focus(Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+
+ ret_if(!scroller);
+
+ page = scroller_get_focused_page(scroller);
+ if (!page) return;
+
+ page_focus(page);
+}
+
+
+
+HAPI void scroller_highlight(Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ ret_if(!scroller_info->box);
+ scroller_info->enable_highlight = 1;
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FREE(list, page) {
+ page_highlight(page);
+ }
+}
+
+
+
+HAPI void scroller_unhighlight(Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ ret_if(!scroller_info->box);
+ scroller_info->enable_highlight = 0;
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FREE(list, page) {
+ page_unhighlight(page);
+ }
+}
+
+
+
+HAPI Evas_Object *scroller_create(Evas_Object *layout, Evas_Object *parent, int page_width, int page_height, scroller_index_e index_number)
+{
+ Evas_Object *scroller = NULL;
+ Evas_Object *box_layout = NULL;
+ Evas_Object *box = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!parent, NULL);
+
+ scroller = elm_scroller_add(parent);
+ retv_if(!scroller, NULL);
+
+ scroller_info = calloc(1, sizeof(scroller_info_s));
+ if (!scroller_info) {
+ _E("Cannot calloc for scroller_info");
+ evas_object_del(scroller);
+ return NULL;
+ }
+ evas_object_data_set(scroller, DATA_KEY_SCROLLER_INFO, scroller_info);
+ evas_object_data_set(parent, DATA_KEY_SCROLLER, scroller);
+ evas_object_data_set(scroller, DATA_KEY_INDEX, NULL);
+
+ elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_FALSE);
+ elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_scroller_page_scroll_limit_set(scroller, 1, 1);
+ elm_scroller_content_min_limit(scroller, EINA_FALSE, EINA_TRUE);
+ elm_scroller_single_direction_set(scroller, ELM_SCROLLER_SINGLE_DIRECTION_HARD);
+ elm_scroller_page_size_set(scroller, page_width, page_height);
+ evas_object_smart_callback_add(scroller, "scroll", _scroll_cb, NULL);
+
+ elm_object_style_set(scroller, "effect");
+ evas_object_show(scroller);
+ elm_object_scroll_lock_y_set(scroller, EINA_TRUE);
+ elm_object_part_content_set(parent, "scroller", scroller);
+
+ evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, layout);
+ evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, layout);
+ evas_object_smart_callback_add(scroller, "scroll,anim,start", _anim_start_cb, NULL);
+ evas_object_smart_callback_add(scroller, "scroll,anim,stop", _anim_stop_cb, NULL);
+ evas_object_smart_callback_add(scroller, "scroll,drag,start", _drag_start_cb, NULL);
+ evas_object_smart_callback_add(scroller, "scroll,drag,stop", _drag_stop_cb, NULL);
+
+ /* Use the parent between box and scroller because of alignment of a page in the box. */
+ box_layout = elm_box_add(scroller);
+ if (!box_layout) {
+ _E("Cannot create box_layout");
+ evas_object_del(scroller);
+ return NULL;
+ }
+ elm_box_horizontal_set(box_layout, EINA_TRUE);
+ /* The weight of box_layout has to be set as EVAS_HINT_EXPAND on y-axis. */
+ evas_object_size_hint_weight_set(box_layout, 0.0, EVAS_HINT_EXPAND);
+ evas_object_show(box_layout);
+
+ elm_object_content_set(scroller, box_layout);
+
+ box = elm_box_add(box_layout);
+ if (!box) {
+ _E("Cannot create box");
+ evas_object_del(box_layout);
+ evas_object_del(scroller);
+ return NULL;
+ }
+
+ elm_box_horizontal_set(box, EINA_TRUE);
+ /* The alignment of box has to be set as 0.0, 0.5 for pages */
+ elm_box_align_set(box, 0.0, 0.5);
+ evas_object_size_hint_weight_set(box, 0.0, EVAS_HINT_EXPAND);
+ evas_object_show(box);
+
+ elm_box_pack_end(box_layout, box);
+
+ scroller_info->root_width = main_get_info()->root_w;
+ scroller_info->root_height = main_get_info()->root_h;
+ scroller_info->page_width = page_width;
+ scroller_info->page_height = page_height;
+ scroller_info->index_number = index_number;
+
+ scroller_info->layout = layout;
+ scroller_info->parent = parent;
+ scroller_info->box_layout = box_layout;
+ scroller_info->box = box;
+
+ scroller_info->scroll_focus = 1;
+ scroller_info->scroll_index = 1;
+
+ return scroller;
+}
+
+
+
+HAPI w_home_error_e scroller_push_page_before(Evas_Object *scroller, Evas_Object *page, Evas_Object *before)
+{
+ Evas_Object *tmp = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ int center_check = 0;
+
+ retv_if(!scroller, W_HOME_ERROR_FAIL);
+ retv_if(!page, W_HOME_ERROR_FAIL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, W_HOME_ERROR_FAIL);
+
+ _elm_box_unpack(scroller, page);
+ if (before) _elm_box_pack_before(scroller, page, before);
+ else _elm_box_pack_end(scroller, page);
+
+ list = elm_box_children_get(scroller_info->box);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, tmp) {
+ continue_if(!tmp);
+
+ if (scroller_info->center == tmp) center_check = 1;
+ if (page == tmp) {
+ if (center_check) page_info->direction = PAGE_DIRECTION_RIGHT;
+ else page_info->direction = PAGE_DIRECTION_LEFT;
+ break;
+ }
+ }
+ eina_list_free(list);
+
+ if (scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_LEFT], scroller, INDEX_BRING_IN_NONE);
+ }
+
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_RIGHT], scroller, INDEX_BRING_IN_NONE);
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI w_home_error_e scroller_push_page_after(Evas_Object *scroller, Evas_Object *page, Evas_Object *after)
+{
+ Evas_Object *tmp = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ int center_check = 0;
+
+ retv_if(!scroller, W_HOME_ERROR_FAIL);
+ retv_if(!page, W_HOME_ERROR_FAIL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, W_HOME_ERROR_FAIL);
+
+ _elm_box_unpack(scroller, page);
+ if (after) _elm_box_pack_after(scroller, page, after);
+ else _elm_box_pack_start(scroller, page);
+
+ list = elm_box_children_get(scroller_info->box);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, tmp) {
+ continue_if(!tmp);
+
+ if (scroller_info->center == tmp) center_check = 1;
+ if (page == tmp) {
+ if (center_check) page_info->direction = PAGE_DIRECTION_RIGHT;
+ else page_info->direction = PAGE_DIRECTION_LEFT;
+ break;
+ }
+ }
+ eina_list_free(list);
+
+ if (scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_LEFT], scroller, INDEX_BRING_IN_NONE);
+ }
+
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_RIGHT], scroller, INDEX_BRING_IN_NONE);
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static Eina_Bool _index_update_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ scroller_info->index_update_timer = NULL;
+
+ if (scroller_info->index[PAGE_DIRECTION_LEFT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_LEFT], scroller, INDEX_BRING_IN_AFTER);
+ }
+
+ if (scroller_info->index[PAGE_DIRECTION_RIGHT]) {
+ index_update(scroller_info->index[PAGE_DIRECTION_RIGHT], scroller, INDEX_BRING_IN_AFTER);
+ }
+
+ _D("Index is updated");
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI w_home_error_e scroller_push_page(Evas_Object *scroller, Evas_Object *page, scroller_push_type_e scroller_type)
+{
+ Evas_Object *tmp = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ retv_if(!scroller, W_HOME_ERROR_FAIL);
+ retv_if(!page, W_HOME_ERROR_FAIL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ if (scroller_info->index_update_timer) {
+ ecore_timer_del(scroller_info->index_update_timer);
+ scroller_info->index_update_timer = NULL;
+ }
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, W_HOME_ERROR_FAIL);
+
+ switch (scroller_type) {
+ case SCROLLER_PUSH_TYPE_FIRST:
+ case SCROLLER_PUSH_TYPE_CENTER_LEFT:
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT:
+ page_info->direction = PAGE_DIRECTION_LEFT;
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER:
+ page_info->direction = PAGE_DIRECTION_CENTER;
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_RIGHT:
+ case SCROLLER_PUSH_TYPE_CENTER_RIGHT:
+ case SCROLLER_PUSH_TYPE_LAST:
+ default:
+ page_info->direction = PAGE_DIRECTION_RIGHT;
+ break;
+ }
+
+ if (!scroller_info->center) {
+ switch (scroller_type) {
+ case SCROLLER_PUSH_TYPE_CENTER_LEFT:
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT:
+ case SCROLLER_PUSH_TYPE_CENTER_RIGHT:
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_RIGHT:
+ scroller_type = SCROLLER_PUSH_TYPE_LAST;
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER:
+ scroller_type = SCROLLER_PUSH_TYPE_LAST;
+ scroller_info->center = page;
+ break;
+ default:
+ break;
+ }
+ }
+
+ switch (scroller_type) {
+ case SCROLLER_PUSH_TYPE_FIRST:
+ _elm_box_unpack(scroller, page);
+ _elm_box_pack_start(scroller, page);
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER_LEFT:
+ _elm_box_unpack(scroller, page);
+
+ tmp = (scroller_info->center_neighbor_left && scroller_info->center_neighbor_left != page) ?
+ scroller_info->center_neighbor_left : scroller_info->center;
+ _elm_box_pack_before(scroller, page, tmp);
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT:
+ if (scroller_info->center_neighbor_left) {
+ _elm_box_unpack(scroller, scroller_info->center_neighbor_left);
+ }
+ _elm_box_pack_before(scroller, page, scroller_info->center);
+ scroller_info->center_neighbor_left = page;
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER:
+ _elm_box_pack_after(scroller, page, scroller_info->center);
+ _elm_box_unpack(scroller, scroller_info->center);
+
+ if (evas_object_data_del(scroller_info->center, PRIVATE_DATA_KEY_IS_DUMMY) != NULL) {
+ page_destroy(scroller_info->center);
+ }
+ scroller_info->center = page;
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_RIGHT:
+ if (scroller_info->center_neighbor_right) {
+ _elm_box_unpack(scroller, scroller_info->center_neighbor_right);
+ }
+ _elm_box_pack_after(scroller, page, scroller_info->center);
+ scroller_info->center_neighbor_right = page;
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER_RIGHT:
+ _elm_box_unpack(scroller, page);
+ tmp = scroller_info->center_neighbor_right && scroller_info->center_neighbor_right != page ?
+ scroller_info->center_neighbor_right : scroller_info->center;
+ _elm_box_pack_after(scroller, page, tmp);
+ break;
+ case SCROLLER_PUSH_TYPE_LAST:
+ default:
+ _elm_box_unpack(scroller, page);
+ _elm_box_pack_end(scroller, page);
+ break;
+ }
+
+ scroller_info->index_update_timer = ecore_timer_add(INDEX_UPDATE_TIME, _index_update_cb, scroller);
+ if (!scroller_info->index_update_timer) {
+ _E("Cannot add an index update timer");
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI Evas_Object *scroller_pop_page(Evas_Object *scroller, Evas_Object *page)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l = NULL;
+ const Eina_List *ln = NULL;
+ Evas_Object *tmp_page = NULL;
+ page_info_s *page_info = NULL;
+ int count = 0;
+
+ retv_if(!scroller, NULL);
+ retv_if(!page, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ if (scroller_info->index_update_timer) {
+ ecore_timer_del(scroller_info->index_update_timer);
+ scroller_info->index_update_timer = NULL;
+ }
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(NULL == list, NULL);
+
+ if (scroller_info->center == page) {
+ _D("The center will be removed");
+ scroller_info->center = NULL;
+ }
+
+ if (scroller_info->center_neighbor_left == page) {
+ _D("The neighbor left will be removed");
+ scroller_info->center_neighbor_left = NULL;
+ }
+
+ if (scroller_info->center_neighbor_right == page) {
+ _D("The neighbor right will be removed");
+ scroller_info->center_neighbor_right = NULL;
+ }
+
+ count = eina_list_count(list);
+ EINA_LIST_FOREACH_SAFE(list, l, ln, tmp_page) {
+ if (page != tmp_page) continue;
+ _elm_box_unpack(scroller, page);
+
+ scroller_info->index_update_timer = ecore_timer_add(INDEX_UPDATE_TIME, _index_update_cb, scroller);
+ if (!scroller_info->index_update_timer) {
+ _E("Cannot add an index update timer");
+ }
+
+ if (1 == count) {
+ _D("There is only one page");
+ eina_list_free(list);
+ return page;
+ }
+
+ eina_list_free(list);
+ return page;
+ }
+
+ eina_list_free(list);
+
+ return NULL;
+}
+
+
+
+static void _change_favorites_order_cb(keynode_t *node, void *data)
+{
+ int value = -1;
+
+ _D("Change favorites order");
+
+ /* check Emergency Mode */
+ if(emergency_mode_enabled_get()) {
+ _E("emergency mode enabled");
+ return;
+ }
+
+ // 0 : init, 1 : backup request, 2 : restore request, 3: write done
+ if(vconf_get_int(VCONF_KEY_WMS_FAVORITES_ORDER, &value) < 0) {
+ _E("Failed to get VCONF_KEY_WMS_FAVORITES_ORDER");
+ return;
+ }
+
+ _D("Change favorites order vconf:[%d]", value);
+
+ wms_change_favorite_order(value);
+}
+
+
+
+static void _del_list(void *data)
+{
+ Eina_List *page_info_list = data;
+ ret_if(!page_info_list);
+ page_info_list_destroy(page_info_list);
+}
+
+
+
+#define MAX_RETRY 10
+static Eina_Bool _retry_to_push_pages(void *data)
+{
+ Evas_Object *scroller = data;
+ Eina_List *page_info_list = NULL;
+ static int retry_count = 0;
+ int count = 0;
+
+ if (retry_count >= MAX_RETRY) {
+ _E("Retried to push pages %d time(s), don't try anymore", retry_count);
+ retry_count = 0;
+ return ECORE_CALLBACK_CANCEL;
+ } else retry_count++;
+
+ count = scroller_count_direction(scroller, PAGE_DIRECTION_RIGHT);
+ if (count > 1) {
+ _E("Scroller already has more than %d pages.", count);
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ page_info_list = db_write_list();
+ if (page_info_list) {
+ scroller_push_pages(scroller, page_info_list, _del_list, page_info_list);
+
+ count = scroller_count_direction(scroller, PAGE_DIRECTION_RIGHT);
+ if (count > 1) {
+ _E("Scroller has more than %d pages.", count);
+ return ECORE_CALLBACK_CANCEL;
+ }
+ } else {
+ _W("page_info_list is NULL");
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+
+
+static Eina_Bool _push_all_page_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ Ecore_Timer *timer = NULL;
+ Eina_List *page_info_list = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ void (*after_func)(void *);
+ void *after_func_data = NULL;
+ static int i = 0;
+ int count = 0;
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ page_info_list = evas_object_data_get(scroller, PRIVATE_DATA_KEY_SCROLLER_LIST);
+ if (!page_info_list) {
+ _W("page_info_list is NULL");
+ goto END;
+ }
+
+ page_info = eina_list_nth(page_info_list, i);
+ if (!page_info) {
+ if (!i) {
+ _W("page_info_list is zero");
+ }
+ goto END;
+ }
+ i++;
+
+ page_info->item = dbox_create(scroller, page_info->id, page_info->subid, page_info->period);
+ if (!page_info->item) {
+ _E("cannot create a dynamicbox");
+ return ECORE_CALLBACK_RENEW;
+ }
+ evas_object_dynamicbox_disable_loading(page_info->item);
+ evas_object_resize(page_info->item, scroller_info->page_width, scroller_info->page_height);
+ evas_object_size_hint_min_set(page_info->item, scroller_info->page_width, scroller_info->page_height);
+ evas_object_show(page_info->item);
+
+ page_info->page = page_create(scroller
+ , page_info->item
+ , page_info->id, page_info->subid
+ , scroller_info->page_width, scroller_info->page_height
+ , PAGE_CHANGEABLE_BG_ON, PAGE_REMOVABLE_ON);
+ if (!page_info->page) {
+ evas_object_del(page_info->item);
+ _E("cannot create a page");
+ goto END;
+ }
+ dbox_add_callback(page_info->item, page_info->page);
+
+ page_set_effect(page_info->page, page_effect_none, page_effect_none);
+ scroller_push_page(scroller, page_info->page, SCROLLER_PUSH_TYPE_LAST);
+
+ return ECORE_CALLBACK_RENEW;
+
+END:
+ /* If there are 7 pages, do not append the plus page */
+ count = scroller_count_direction(scroller, PAGE_DIRECTION_RIGHT);
+ if (count < MAX_DBOX
+ && !main_get_info()->is_tts
+ && page_create_plus_page(scroller))
+ {
+ page_set_effect(scroller_info->plus_page, page_effect_none, page_effect_none);
+ scroller_push_page(scroller, scroller_info->plus_page, SCROLLER_PUSH_TYPE_LAST);
+ }
+
+ after_func = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC);
+ after_func_data = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC_DATA);
+
+ if (after_func) {
+ after_func(after_func_data);
+ }
+
+ _W("It's done to push all the pages(%d)", i);
+ i = 0;
+
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_PUSH_ALL_TIMER);
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_LIST);
+
+ if (!main_get_booting_state()) {
+ _W("First boot");
+ main_inc_booting_state();
+ _change_favorites_order_cb(NULL, NULL);
+
+ /* wms vconf has to be dealt after pushing pages */
+ if (vconf_notify_key_changed(VCONF_KEY_WMS_FAVORITES_ORDER, _change_favorites_order_cb, NULL) < 0) {
+ _E("Failed to register the changed_apps_order callback");
+ }
+ }
+
+ /* Key register */
+ key_register();
+
+ if (main_get_info()->is_tts) {
+ _W("TTS Mode : Do not save orders of widgets");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ /* Widgets can be removed before launching w-home */
+ /* But, we do not need to refresh the DB */
+ count = scroller_count_direction(scroller, PAGE_DIRECTION_RIGHT);
+ if (count <= 1) {
+ _E("Right page is only one or zero");
+ goto RETRY;
+ }
+
+ wms_change_favorite_order(W_HOME_WMS_BACKUP);
+
+ return ECORE_CALLBACK_CANCEL;
+
+RETRY:
+
+ timer = ecore_timer_add(1.0f, _retry_to_push_pages, scroller);
+ if (!timer) {
+ _E("Cannot add a timer");
+ return W_HOME_ERROR_FAIL;
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+/* This dummy will be destroyed by the clock */
+static w_home_error_e _dummy_center(Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *center = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ center = evas_object_rectangle_add(main_get_info()->e);
+ retv_if(!center, W_HOME_ERROR_FAIL);
+
+ page = page_create(scroller
+ , center
+ , NULL, NULL
+ , scroller_info->page_width, scroller_info->page_height
+ , PAGE_CHANGEABLE_BG_OFF, PAGE_REMOVABLE_OFF);
+ if (!page) {
+ _E("Cannot create a page");
+ evas_object_del(center);
+ return W_HOME_ERROR_FAIL;
+ }
+
+ evas_object_data_set(page, PRIVATE_DATA_KEY_IS_DUMMY, (void*)1);
+ page_set_effect(scroller_info->plus_page, page_effect_none, page_effect_none);
+ scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI w_home_error_e scroller_push_pages(Evas_Object *scroller, Eina_List *page_info_list, void (*after_func)(void *), void *data)
+{
+ Ecore_Timer *timer = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!scroller, W_HOME_ERROR_INVALID_PARAMETER);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, W_HOME_ERROR_FAIL);
+
+ timer = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_PUSH_ALL_TIMER);
+ if (timer) {
+ _D("There is already a timer for popping all items.");
+ ecore_timer_del(timer);
+ timer = NULL;
+ }
+
+ if (!scroller_info->center && W_HOME_ERROR_NONE != _dummy_center(scroller)) {
+ _E("Cannot create a dummy clock");
+ }
+
+ /* We have to prevent pushing pages doubly */
+ /* We don't need to care about LEFT pages according to UIG */
+ scroller_pop_pages(scroller, PAGE_DIRECTION_RIGHT);
+
+ timer = ecore_timer_add(0.01f, _push_all_page_cb, scroller);
+ if (!timer) {
+ _E("Cannot add a timer");
+ return W_HOME_ERROR_FAIL;
+ }
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_PUSH_ALL_TIMER, timer);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_LIST, page_info_list);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC, after_func);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC_DATA, data);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+HAPI void scroller_pop_pages(Evas_Object *scroller, page_direction_e direction)
+{
+ Evas_Object *page = NULL;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!scroller);
+
+ _W("pop all the pages");
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ switch (direction) {
+ case PAGE_DIRECTION_LEFT:
+ scroller_info->center_neighbor_left = NULL;
+ break;
+ case PAGE_DIRECTION_CENTER:
+ scroller_info->center = NULL;
+ break;
+ case PAGE_DIRECTION_RIGHT:
+ scroller_info->center_neighbor_right = NULL;
+ page_destroy_plus_page(scroller);
+ break;
+ case PAGE_DIRECTION_ANY:
+ scroller_info->center_neighbor_left = NULL;
+ scroller_info->center = NULL;
+ scroller_info->center_neighbor_right = NULL;
+ page_destroy_plus_page(scroller);
+ break;
+ default:
+ _E("Cannot reach here");
+ break;
+ }
+
+ list = elm_box_children_get(scroller_info->box);
+ if (!list) return;
+
+ EINA_LIST_FREE(list, page) {
+ continue_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+
+ if (PAGE_DIRECTION_ANY != direction
+ && direction != page_info->direction)
+ {
+ continue;
+ }
+
+ if (PAGE_DIRECTION_RIGHT == page_info->direction) {
+ evas_object_del(page_info->item);
+ }
+
+ scroller_pop_page(scroller, page);
+ page_destroy(page);
+ }
+}
+
+
+
+HAPI int scroller_count(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+ Eina_List *list = NULL;
+ int count;
+
+ retv_if(NULL == scroller, 0);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, 0);
+
+ list = elm_box_children_get(scroller_info->box);
+ if (NULL == list) return 0;
+
+ count = eina_list_count(list);
+ eina_list_free(list);
+
+ return count;
+}
+
+
+
+HAPI int scroller_count_direction(Evas_Object *scroller, page_direction_e direction)
+{
+ Evas_Object *page = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ Eina_List *list = NULL;
+ int count = 0;
+
+ retv_if(NULL == scroller, 0);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, 0);
+
+ list = elm_box_children_get(scroller_info->box);
+ if (NULL == list) return 0;
+
+ EINA_LIST_FREE(list, page) {
+ continue_if(!page);
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+
+ if (page_info->direction == direction) count++;
+ }
+
+ return count;
+}
+
+
+
+HAPI Eina_Bool scroller_is_scrolling(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!scroller, EINA_FALSE);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller, EINA_FALSE);
+
+ return scroller_info->scrolling? EINA_TRUE:EINA_FALSE;
+}
+
+
+
+HAPI void scroller_freeze(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ elm_object_scroll_freeze_push(scroller_info->box);
+}
+
+
+
+HAPI void scroller_unfreeze(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(NULL == scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ while (elm_object_scroll_freeze_get(scroller_info->box)) {
+ elm_object_scroll_freeze_pop(scroller_info->box);
+ }
+}
+
+
+
+static inline int _get_index_in_list(Evas_Object *box, Evas_Object *page)
+{
+ Evas_Object *tmp = NULL;
+ Eina_List *list = NULL;
+
+ list = elm_box_children_get(box);
+ retv_if(!list, 0);
+
+ int exist = 1;
+ int i = 0;
+
+ EINA_LIST_FREE(list, tmp) {
+ continue_if(!tmp);
+ if (tmp == page)
+ exist = 0;
+ i += exist;
+ }
+
+ if (exist) {
+ i = 0;
+ }
+ return i;
+}
+
+
+
+static inline void _page_bring_in(Evas_Object *scroller, int index, scroller_freeze_e is_freezed)
+{
+ Evas_Object *page = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ int cur_freezed = 0;
+
+ page = scroller_get_page_at(scroller, index);
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ cur_freezed = elm_object_scroll_freeze_get(scroller_info->box);
+
+ if (is_freezed) scroller_unfreeze(scroller);
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_FALSE, EINA_FALSE);
+#endif
+ _D("Bring in now : %d(%p)", index, page);
+ elm_scroller_page_bring_in(scroller, index, 0);
+ if (is_freezed && cur_freezed) scroller_freeze(scroller);
+ if (scroller_info->index[page_info->direction]) {
+ index_bring_in_page(scroller_info->index[page_info->direction], page);
+ }
+}
+
+
+
+static inline void _page_show(Evas_Object *scroller, int index, scroller_freeze_e is_freezed)
+{
+ Evas_Object *page = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ int cur_freezed = 0;
+
+ page = scroller_get_page_at(scroller, index);
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ cur_freezed = elm_object_scroll_freeze_get(scroller_info->box);
+
+ if (is_freezed) scroller_unfreeze(scroller);
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_FALSE, EINA_FALSE);
+#endif
+ _D("Page show now : %d(%p)", index, page);
+ elm_scroller_page_show(scroller, index, 0);
+ if (is_freezed && cur_freezed) scroller_freeze(scroller);
+ if (scroller_info->index[page_info->direction]) {
+ index_bring_in_page(scroller_info->index[page_info->direction], page);
+ }
+}
+
+
+
+static Eina_Bool _bring_in_anim_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ int i = 0;
+ int is_freezed = 0;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+
+ i = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE);
+ is_freezed = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED);
+
+ _page_bring_in(scroller, i, is_freezed);
+
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+static void _bring_in_job_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ int i = 0;
+ int is_freezed = 0;
+
+ ret_if(!scroller);
+
+ i = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE);
+ is_freezed = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED);
+
+ _page_bring_in(scroller, i, is_freezed);
+
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB);
+}
+
+
+
+HAPI void scroller_bring_in_by_push_type(Evas_Object *scroller, scroller_push_type_e push_type, scroller_freeze_e freeze, scroller_bring_type_e bring_type)
+{
+ Evas_Object *page = NULL;
+ Ecore_Animator *anim = NULL;
+ Ecore_Job *job = NULL;
+ scroller_info_s *scroller_info = NULL;
+ int i = 0;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ switch (push_type) {
+ case SCROLLER_PUSH_TYPE_CENTER:
+ page = scroller_info->center;
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT:
+ page = scroller_info->center_neighbor_left;
+ if (page == NULL) {
+ page = scroller_get_left_page(scroller, scroller_info->center);
+ }
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_RIGHT:
+ page = scroller_info->center_neighbor_right;
+ if (page == NULL) {
+ page = scroller_get_right_page(scroller, scroller_info->center);
+ }
+ break;
+ default:
+ _E("Unsupported push-type:%d", push_type);
+ break;
+ }
+ ret_if(!page);
+ i = _get_index_in_list(scroller_info->box, page);
+
+ /* 1. Remove the old action */
+ job = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB);
+ if (job) ecore_job_del(job);
+
+ anim = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM);
+ if (anim) ecore_animator_del(anim);
+
+ /* 2. Append the new timer */
+ switch (bring_type) {
+ case SCROLLER_BRING_TYPE_INSTANT_SHOW:
+ _page_show(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_INSTANT:
+ _page_bring_in(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_JOB:
+ job = ecore_job_add(_bring_in_job_cb, scroller);
+ if (job) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB, job);
+ else _E("Cannot add a job");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ case SCROLLER_BRING_TYPE_ANIMATOR:
+ anim = ecore_animator_add(_bring_in_anim_cb, scroller);
+ if (anim) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM, anim);
+ else _E("Cannot add an animator");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ default:
+ _E("Unsupported bring_type:%d", bring_type);
+ break;
+ }
+}
+
+
+
+HAPI void scroller_bring_in(Evas_Object *scroller, int i, scroller_freeze_e freeze, scroller_bring_type_e bring_type)
+{
+ Ecore_Animator *anim = NULL;
+ Ecore_Job *job = NULL;
+
+ ret_if(!scroller);
+
+ /* 1. Remove the old action */
+ job = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB);
+ if (job) ecore_job_del(job);
+
+ anim = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM);
+ if (anim) ecore_animator_del(anim);
+
+ /* 2. Append the new timer */
+ switch (bring_type) {
+ case SCROLLER_BRING_TYPE_INSTANT_SHOW:
+ _page_show(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_INSTANT:
+ _page_bring_in(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_JOB:
+ job = ecore_job_add(_bring_in_job_cb, scroller);
+ if (job) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB, job);
+ else _E("Cannot add a job");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ case SCROLLER_BRING_TYPE_ANIMATOR:
+ anim = ecore_animator_add(_bring_in_anim_cb, scroller);
+ if (anim) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM, anim);
+ else _E("Cannot add an animator");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ default:
+ _E("Unsupported bring_type:%d", bring_type);
+ break;
+ }
+}
+
+
+
+HAPI void scroller_bring_in_page(Evas_Object *scroller, Evas_Object *page, scroller_freeze_e freeze, scroller_bring_type_e bring_type)
+{
+ scroller_info_s *scroller_info = NULL;
+ Ecore_Animator *anim = NULL;
+ Ecore_Job *job = NULL;
+ int i = 0;
+
+ ret_if(!scroller);
+ ret_if(!page);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ i = _get_index_in_list(scroller_info->box, page);
+
+ /* 1. Remove the old action */
+ job = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB);
+ if (job) ecore_job_del(job);
+
+ anim = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM);
+ if (anim) ecore_animator_del(anim);
+
+ /* 2. Append the new timer */
+ switch (bring_type) {
+ case SCROLLER_BRING_TYPE_INSTANT_SHOW:
+ _page_show(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_INSTANT:
+ _page_bring_in(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_JOB:
+ job = ecore_job_add(_bring_in_job_cb, scroller);
+ if (job) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB, job);
+ else _E("Cannot add a job");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ case SCROLLER_BRING_TYPE_ANIMATOR:
+ anim = ecore_animator_add(_bring_in_anim_cb, scroller);
+ if (anim) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM, anim);
+ else _E("Cannot add an animator");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ default:
+ _E("Unsupported bring_type:%d", bring_type);
+ break;
+ }
+
+}
+
+
+
+static Eina_Bool _bring_in_center_timer_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ Evas_Object *page = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ void (*before_func)(void *);
+ void (*after_func)(void *);
+ void *func_data = NULL;
+
+ int page_w = 0;
+ int total_x = 0;
+
+ /* 1. Before function */
+ before_func = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC);
+ if (before_func) {
+ func_data = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC_DATA);
+ before_func(func_data);
+ return ECORE_CALLBACK_RENEW;
+ }
+
+ /* 2. Bring in */
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ page = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_PRESSED_PAGE);
+ if (page) {
+ Evas_Object *tmp_page = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ int is_freezed = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED);
+ int sw, sh;
+ int cur_freezed = 0;
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, ECORE_CALLBACK_CANCEL);
+
+ cur_freezed = elm_object_scroll_freeze_get(scroller_info->box);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, tmp_page) {
+ continue_if(!tmp_page);
+ if (tmp_page == page) break;
+ evas_object_geometry_get(tmp_page, NULL, NULL, &page_w, NULL);
+ total_x += page_w;
+ }
+ eina_list_free(list);
+ evas_object_geometry_get(scroller, NULL, NULL, &sw, &sh);
+
+ if (is_freezed) scroller_unfreeze(scroller);
+ elm_scroller_region_bring_in(scroller, total_x, 0, sw, sh);
+ if (is_freezed && cur_freezed) scroller_freeze(scroller);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, ECORE_CALLBACK_RENEW);
+
+ if (scroller_info->index[page_info->direction]) {
+ index_bring_in_page(scroller_info->index[page_info->direction], page);
+ }
+
+ return ECORE_CALLBACK_RENEW;
+ }
+
+ /* 3. After function */
+ after_func = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC);
+ if (after_func) {
+ func_data = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC_DATA);
+ after_func(func_data);
+ }
+
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void scroller_bring_in_center_of(Evas_Object *scroller
+ , Evas_Object *page
+ , scroller_freeze_e freeze
+ , void (*before_func)(void *), void *before_data
+ , void (*after_func)(void *), void *after_data)
+{
+ scroller_info_s *scroller_info = NULL;
+ Ecore_Timer *timer = NULL;
+
+ ret_if(!scroller);
+ ret_if(!page);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_PRESSED_PAGE, page);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC, before_func);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC_DATA, before_data);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC, after_func);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC_DATA, after_data);
+
+ /* 1. Remove the old timer */
+ timer = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ timer = NULL;
+ }
+
+ /* 2. Append the new timer */
+ timer = ecore_timer_add(0.01f, _bring_in_center_timer_cb, scroller);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER, timer);
+}
+
+
+
+static Eina_Bool _region_show_center_timer_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ Evas_Object *page = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ void (*before_func)(void *);
+ void (*after_func)(void *);
+ void *func_data = NULL;
+
+ int page_w = 0;
+ int total_x = 0;
+
+ /* 1. Before function */
+ before_func = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC);
+ if (before_func) {
+ func_data = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC_DATA);
+ before_func(func_data);
+ return ECORE_CALLBACK_RENEW;
+ }
+
+ /* 2. Bring in */
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, ECORE_CALLBACK_CANCEL);
+
+ page = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_PRESSED_PAGE);
+ if (page) {
+ Evas_Object *tmp_page = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ int is_freezed = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED);
+ int cur_freezed = 0;
+ int sw, sh;
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, ECORE_CALLBACK_CANCEL);
+
+ cur_freezed = elm_object_scroll_freeze_get(scroller_info->box);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, tmp_page) {
+ continue_if(!tmp_page);
+ if (tmp_page == page) break;
+ evas_object_geometry_get(tmp_page, NULL, NULL, &page_w, NULL);
+ total_x += page_w;
+ }
+ eina_list_free(list);
+ evas_object_geometry_get(scroller, NULL, NULL, &sw, &sh);
+
+ if (is_freezed) scroller_unfreeze(scroller);
+ _D("Region show now : %d", total_x);
+ elm_scroller_region_show(scroller, total_x, 0, sw, sh);
+ if (is_freezed && cur_freezed) scroller_freeze(scroller);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, ECORE_CALLBACK_RENEW);
+
+ if (scroller_info->index[page_info->direction]) {
+ index_bring_in_page(scroller_info->index[page_info->direction], page);
+ }
+
+ return ECORE_CALLBACK_RENEW;
+ }
+
+ /* 3. After function */
+ after_func = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC);
+ if (after_func) {
+ func_data = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC_DATA);
+ after_func(func_data);
+ }
+
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void scroller_region_show_center_of(Evas_Object *scroller
+ , Evas_Object *page
+ , scroller_freeze_e freeze
+ , void (*before_func)(void *), void *before_data
+ , void (*after_func)(void *), void *after_data)
+{
+ Ecore_Timer *timer = NULL;
+
+ ret_if(!scroller);
+ ret_if(!page);
+
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_PRESSED_PAGE, page);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC, before_func);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BEFORE_FUNC_DATA, before_data);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC, after_func);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_AFTER_FUNC_DATA, after_data);
+
+ /* 1. Remove the old timer */
+ timer = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER);
+ if (timer) {
+ ecore_timer_del(timer);
+ timer = NULL;
+ }
+
+ /* 2. Append the new timer */
+ timer = ecore_timer_add(0.01f, _region_show_center_timer_cb, scroller);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_TIMER, timer);
+}
+
+
+
+static inline void _page_region_show(Evas_Object *scroller, int index, scroller_freeze_e is_freezed)
+{
+ Evas_Object *page = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ int cur_freezed = 0;
+
+ page = scroller_get_page_at(scroller, index);
+ ret_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ elm_object_tree_focus_allow_set(scroller, EINA_TRUE);
+ page_focus(page);
+
+ cur_freezed = elm_object_scroll_freeze_get(scroller_info->box);
+
+ if (is_freezed) scroller_unfreeze(scroller);
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_FALSE, EINA_FALSE);
+#endif
+ _D("Page show now : %d(%p)", index, page);
+ elm_scroller_page_show(scroller, index, 0);
+ if (is_freezed && cur_freezed) scroller_freeze(scroller);
+
+ if (scroller_info->index[page_info->direction]) {
+ index_bring_in_page(scroller_info->index[page_info->direction], page);
+ }
+}
+
+
+
+static void _region_show_job_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ int i = 0;
+ int is_freezed = 0;
+
+ ret_if(!scroller);
+
+ i = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE);
+ is_freezed = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED);
+
+ _page_region_show(scroller, i, is_freezed);
+
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB);
+}
+
+
+
+static Eina_Bool _region_show_anim_cb(void *data)
+{
+ Evas_Object *scroller = data;
+ int i = 0;
+ int is_freezed = 0;
+
+ retv_if(!scroller, ECORE_CALLBACK_CANCEL);
+
+ i = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE);
+ is_freezed = (int) evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED);
+
+ _page_region_show(scroller, i, is_freezed);
+
+ evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+HAPI void scroller_region_show_by_push_type(Evas_Object *scroller, scroller_push_type_e push_type, scroller_freeze_e freeze, scroller_bring_type_e bring_type)
+{
+ Evas_Object *page = NULL;
+ Ecore_Animator *anim = NULL;
+ Ecore_Job *job = NULL;
+ scroller_info_s *scroller_info = NULL;
+ int i = 0;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ switch (push_type) {
+ case SCROLLER_PUSH_TYPE_CENTER:
+ page = scroller_info->center;
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT:
+ page = scroller_info->center_neighbor_left;
+ break;
+ case SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_RIGHT:
+ page = scroller_info->center_neighbor_right;
+ break;
+ default:
+ _E("Unsupported push-type:%d", push_type);
+ break;
+ }
+ ret_if(!page);
+
+ i = _get_index_in_list(scroller_info->box, page);
+
+ /* 1. Remove the old action */
+ job = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB);
+ if (job) ecore_job_del(job);
+
+ anim = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM);
+ if (anim) ecore_animator_del(anim);
+
+ /* 2. Append the new timer */
+ switch (bring_type) {
+ case SCROLLER_BRING_TYPE_INSTANT_SHOW:
+ _page_show(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_INSTANT:
+ _page_region_show(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_JOB:
+ job = ecore_job_add(_region_show_job_cb, scroller);
+ if (job) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB, job);
+ else _E("Cannot add a job");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ case SCROLLER_BRING_TYPE_ANIMATOR:
+ anim = ecore_animator_add(_region_show_anim_cb, scroller);
+ if (anim) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM, anim);
+ else _E("Cannot add an animator");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ default:
+ _E("Unsupported bring_type:%d", bring_type);
+ break;
+ }
+}
+
+
+
+HAPI void scroller_region_show_page(Evas_Object *scroller, Evas_Object *page, scroller_freeze_e freeze, scroller_bring_type_e bring_type)
+{
+ Ecore_Animator *anim = NULL;
+ Ecore_Job *job = NULL;
+ scroller_info_s *scroller_info = NULL;
+ int i = 0;
+
+
+ ret_if(!scroller);
+ ret_if(!page);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ i = _get_index_in_list(scroller_info->box, page);
+
+ /* 1. Remove the old action */
+ job = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB);
+ if (job) ecore_job_del(job);
+
+ anim = evas_object_data_del(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM);
+ if (anim) ecore_animator_del(anim);
+
+ /* 2. Append the new timer */
+ switch (bring_type) {
+ case SCROLLER_BRING_TYPE_INSTANT_SHOW:
+ _page_show(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_INSTANT:
+ _page_region_show(scroller, i, freeze);
+ break;
+ case SCROLLER_BRING_TYPE_JOB:
+ job = ecore_job_add(_region_show_job_cb, scroller);
+ if (job) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_JOB, job);
+ else _E("Cannot add a job");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ case SCROLLER_BRING_TYPE_ANIMATOR:
+ anim = ecore_animator_add(_region_show_anim_cb, scroller);
+ if (anim) evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_ANIM, anim);
+ else _E("Cannot add an animator");
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_BRING_IN_PAGE, (void *) i);
+ evas_object_data_set(scroller, PRIVATE_DATA_KEY_SCROLLER_FREEZED, (void *) freeze);
+ break;
+ default:
+ _E("Unsupported bring_type:%d", bring_type);
+ break;
+ }
+}
+
+
+
+static Evas_Object *_pop_page_in_list(Eina_List **list, const char *id, const char *subid)
+{
+ Evas_Object *page = NULL;
+ const Eina_List *l, *ln;
+ page_info_s *page_info = NULL;
+
+ retv_if(!list, NULL);
+ retv_if(!id, NULL);
+
+ EINA_LIST_FOREACH_SAFE(*list, l, ln, page) {
+ continue_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+ if (!page_info->id) continue;
+
+ if (strcmp(page_info->id, id)) continue;
+
+ if (!subid && !page_info->subid) {
+ *list = eina_list_remove(*list, page);
+ return page;
+ }
+
+ if (subid
+ && page_info->subid
+ && !strcmp(subid, page_info->subid))
+ {
+ *list = eina_list_remove(*list, page);
+ return page;
+ }
+ }
+
+ return NULL;
+}
+
+
+
+static page_info_s *_get_page_info_in_list(page_info_s *scroller_page_info, Eina_List *page_info_list)
+{
+ const Eina_List *l, *ln;
+ page_info_s *page_info = NULL;
+
+ retv_if(!scroller_page_info, NULL);
+ retv_if(!scroller_page_info->id, NULL);
+ retv_if(!page_info_list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(page_info_list, l, ln, page_info) {
+ continue_if(!page_info);
+ continue_if(!page_info->id);
+
+ if (!strcmp(scroller_page_info->id, page_info->id)) {
+ if (((scroller_page_info->subid && page_info->subid)
+ && !strcmp(scroller_page_info->subid, page_info->subid))
+ || (!scroller_page_info->subid && !page_info->subid))
+ {
+ return page_info;
+ }
+ }
+ }
+ return NULL;
+}
+
+
+
+static Evas_Object *_get_page_in_list(page_info_s *page_info, Eina_List *list)
+{
+ const Eina_List *l, *ln;
+ Evas_Object *page = NULL;
+ page_info_s *scroller_page_info = NULL;
+
+ retv_if(!page_info, NULL);
+ retv_if(!page_info->id, NULL);
+ retv_if(!list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+
+ scroller_page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ continue_if(!scroller_page_info);
+ if (!scroller_page_info->id) continue;
+
+ if (!strcmp(scroller_page_info->id, page_info->id)) {
+ if (((scroller_page_info->subid && page_info->subid)
+ && !strcmp(scroller_page_info->subid, page_info->subid))
+ || (!scroller_page_info->subid && !page_info->subid))
+ {
+ return scroller_page_info->page;
+ }
+ }
+ }
+ return NULL;
+}
+
+
+
+HAPI void scroller_read_favorites_list(Evas_Object *scroller, Eina_List *page_info_list)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *scroller_page = NULL;
+ Evas_Object *before_page = NULL;
+
+ Eina_List *list = NULL;
+ Eina_List *cloned_page_info_list = NULL;
+ const Eina_List *l, *ln;
+
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *scroller_page_info = NULL;
+ page_info_s *page_info = NULL;
+ page_info_s *clone_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!page_info_list);
+
+ cloned_page_info_list = eina_list_clone(page_info_list);
+ ret_if(!cloned_page_info_list);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ before_page = scroller_info->center;
+
+ /* 1. Remove widgets those are not in the page_info_list */
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+
+ scroller_page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!scroller_page_info->id) continue;
+
+ if (scroller_page_info->direction != PAGE_DIRECTION_RIGHT) continue;
+
+ clone_info = _get_page_info_in_list(scroller_page_info, cloned_page_info_list);
+ if (clone_info) {
+ _D("Keep this widget : %s(%p)", scroller_page_info->id, page);
+ cloned_page_info_list = eina_list_remove(cloned_page_info_list, clone_info);
+ continue;
+ } else {
+ _D("Do not keep this widget : %s(%p)", scroller_page_info->id, page);
+ list = eina_list_remove(list, scroller_page_info->page);
+ page_destroy(scroller_page_info->page);
+ }
+ }
+
+ /* 2. Create widgets those are not in the scroller */
+ EINA_LIST_FOREACH_SAFE(page_info_list, l, ln, page_info) {
+ continue_if(!page_info);
+ continue_if(!page_info->id);
+
+ scroller_page = _get_page_in_list(page_info, list);
+ if (scroller_page) {
+ _D("Reorder this widget : %s(%p)", page_info->id, scroller_page);
+ _elm_box_unpack(scroller, scroller_page);
+ _elm_box_pack_after(scroller, scroller_page, before_page);
+ before_page = scroller_page;
+ continue;
+ } else {
+ /* Page create */
+ page_info->item = dbox_create(scroller, page_info->id, page_info->subid, page_info->period);
+ ret_if (!page_info->item);
+ evas_object_dynamicbox_disable_loading(page_info->item);
+ evas_object_resize(page_info->item, scroller_info->page_width, scroller_info->page_height);
+ evas_object_size_hint_min_set(page_info->item, scroller_info->page_width, scroller_info->page_height);
+ evas_object_show(page_info->item);
+
+ page_info->page = page_create(scroller
+ , page_info->item
+ , page_info->id, page_info->subid
+ , scroller_info->page_width, scroller_info->page_height
+ , PAGE_CHANGEABLE_BG_ON, PAGE_REMOVABLE_ON);
+ if (!page_info->page) {
+ _E("Cannot create a page");
+ evas_object_del(page_info->item);
+ return;
+ }
+ dbox_add_callback(page_info->item, page_info->page);
+
+ page_set_effect(page_info->page, page_effect_none, page_effect_none);
+ scroller_push_page(scroller, page_info->page, SCROLLER_PUSH_TYPE_LAST);
+
+ before_page = page_info->page;
+
+ _D("Create this widget : %s(%p)", page_info->id, page_info->page);
+ }
+ }
+
+ eina_list_free(list);
+ eina_list_free(cloned_page_info_list);
+
+ page_arrange_plus_page(scroller, 0);
+}
+
+
+
+/* Caution : Do not create & destroy an item */
+HAPI void scroller_read_list(Evas_Object *scroller, Eina_List *page_info_list)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *before_page = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!page_info_list);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ before_page = scroller_info->center;
+
+ EINA_LIST_FOREACH_SAFE(page_info_list, l, ln, page_info) {
+ continue_if(!page_info);
+ continue_if(!page_info->id);
+
+ if (page_info->direction != PAGE_DIRECTION_RIGHT) continue;
+
+ page = _pop_page_in_list(&list, page_info->id, page_info->subid);
+ if (page) {
+ _elm_box_unpack(scroller, page);
+ _elm_box_pack_after(scroller, page, before_page);
+ before_page = page;
+ }
+ }
+
+ eina_list_free(list);
+}
+
+
+
+HAPI Eina_List *scroller_write_list(Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ page_info_s *dup_page_info = NULL;
+ Eina_List *list = NULL;
+ Eina_List *page_info_list = NULL;
+ const Eina_List *l, *ln;
+
+ retv_if(!scroller, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ continue_if(!page);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ if (!page_info) continue;
+ if (!page_info->id) continue;
+ if (PAGE_DIRECTION_RIGHT != page_info->direction) continue;
+
+ dup_page_info = page_info_dup(page_info);
+ continue_if(!dup_page_info);
+
+ page_info_list = eina_list_append(page_info_list, dup_page_info);
+ }
+ eina_list_free(list);
+
+ return page_info_list;
+}
+
+
+
+HAPI Evas_Object *scroller_move_page_prev(Evas_Object *scroller, Evas_Object *from_page, Evas_Object *to_page, Evas_Object *append_page)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!scroller, NULL);
+ retv_if(!from_page, NULL);
+ retv_if(!to_page, NULL);
+ retv_if(!append_page, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ _elm_box_unpack(scroller, from_page);
+ _elm_box_pack_after(scroller, append_page, to_page);
+
+ return from_page;
+}
+
+
+
+HAPI Evas_Object *scroller_move_page_next(Evas_Object *scroller, Evas_Object *from_page, Evas_Object *to_page, Evas_Object *insert_page)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!scroller, NULL);
+ retv_if(!from_page, NULL);
+ retv_if(!to_page, NULL);
+ retv_if(!insert_page, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ _elm_box_unpack(scroller, to_page);
+ _elm_box_pack_before(scroller, insert_page, from_page);
+
+ return to_page;
+}
+
+
+
+HAPI int scroller_seek_page_position(Evas_Object *scroller, Evas_Object *page)
+{
+ Evas_Object *tmp = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ scroller_info_s *scroller_info = NULL;
+ int position = 0;
+
+ retv_if(!scroller, -1);
+ retv_if(!page, -1);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, -1);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, -1);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, tmp) {
+ continue_if(!tmp);
+ if (page == tmp) {
+ eina_list_free(list);
+ return position;
+ }
+ position++;
+ }
+
+ eina_list_free(list);
+ return -1;
+}
+
+
+
+HAPI Evas_Object *scroller_get_page_at(Evas_Object *scroller, int idx)
+{
+ Evas_Object *page = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ scroller_info_s *scroller_info = NULL;
+ int position = 0;
+
+ retv_if(!scroller, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(NULL == list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, page) {
+ if (idx == position) {
+ eina_list_free(list);
+ return page;
+ }
+ position ++;
+ }
+ eina_list_free(list);
+ return NULL;
+}
+
+
+
+HAPI int scroller_get_current_page_direction(Evas_Object *scroller)
+{
+ Evas_Object *cur_page = NULL;
+ page_info_s *page_info = NULL;
+
+ retv_if(!scroller, -1);
+
+ cur_page = scroller_get_focused_page(scroller);
+ retv_if(!cur_page, -1);
+
+ page_info = evas_object_data_get(cur_page, DATA_KEY_PAGE_INFO);
+ retv_if(!page_info, -1);
+
+ return page_info->direction;
+}
+
+
+
+HAPI Evas_Object *scroller_get_left_page(Evas_Object *scroller, Evas_Object *page)
+{
+ Evas_Object *before_page = NULL;
+ Evas_Object *tmp = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!scroller, NULL);
+ retv_if(!page, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, tmp) {
+ continue_if(!tmp);
+
+ if (page == tmp) break;
+ before_page = tmp;
+ }
+ eina_list_free(list);
+ return before_page;
+}
+
+
+
+HAPI Evas_Object *scroller_get_right_page(Evas_Object *scroller, Evas_Object *page)
+{
+ Evas_Object *after_page = NULL;
+ Evas_Object *tmp = NULL;
+ Eina_List *list = NULL;
+ const Eina_List *l, *ln;
+ scroller_info_s *scroller_info = NULL;
+
+ retv_if(!scroller, NULL);
+ retv_if(!page, NULL);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ retv_if(!scroller_info, NULL);
+
+ list = elm_box_children_get(scroller_info->box);
+ retv_if(!list, NULL);
+
+ EINA_LIST_FOREACH_SAFE(list, l, ln, tmp) {
+ continue_if(!tmp);
+
+ if (page == tmp) {
+ after_page = eina_list_data_get(ln);
+ break;
+ }
+ }
+ eina_list_free(list);
+ return after_page;
+}
+
+
+
+HAPI void scroller_region_show_page_without_timer(Evas_Object *scroller, Evas_Object *page)
+{
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+ int i = 0;
+ ret_if(scroller == NULL);
+ ret_if(page == NULL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ ret_if(!page_info);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ i = _get_index_in_list(scroller_info->box, page);
+
+#if 0 /* EFL Private feature */
+ elm_scroller_origin_reverse_set(scroller, EINA_FALSE, EINA_FALSE);
+#endif
+ _D("Page show now : %d(%p)", i, page);
+ elm_scroller_page_show(scroller, i, 0);
+ if (scroller_info->index[page_info->direction]) {
+ index_bring_in_page(scroller_info->index[page_info->direction], page);
+ }
+}
+
+
+
+HAPI void scroller_enable_focus_on_scroll(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ _D("Enable the focus on scroll");
+
+ elm_object_tree_focus_allow_set(scroller, EINA_TRUE);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ scroller_info->scroll_focus = 1;
+}
+
+
+
+HAPI void scroller_disable_focus_on_scroll(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ _D("Disable the focus on scroll");
+
+ elm_object_tree_focus_allow_set(scroller, EINA_FALSE);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ scroller_info->scroll_focus = 0;
+}
+
+
+
+HAPI void scroller_enable_index_on_scroll(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ _D("Enable the index on scroll");
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ scroller_info->scroll_index = 1;
+}
+
+
+
+HAPI void scroller_disable_index_on_scroll(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ _D("Disable the index on scroll");
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ scroller_info->scroll_index = 0;
+}
+
+
+
+HAPI void scroller_enable_effect_on_scroll(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ _D("Enable the effect on scroll");
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ scroller_info->scroll_effect = 1;
+}
+
+
+
+HAPI void scroller_disable_effect_on_scroll(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ _D("Disable the effect on scroll");
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ scroller_info->scroll_effect = 0;
+}
+
+
+
+HAPI void scroller_enable_cover_on_scroll(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ scroller_info->scroll_cover = 1;
+}
+
+
+
+HAPI void scroller_disable_cover_on_scroll(Evas_Object *scroller)
+{
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+
+ scroller_info->scroll_cover = 0;
+}
+
+
+
+HAPI void scroller_backup_inner_focus(Evas_Object *scroller)
+{
+ Evas_Object *prev_page = NULL;
+ Evas_Object *cur_page = NULL;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ ret_if(!scroller_info->box);
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FREE(list, cur_page) {
+ continue_if(!cur_page);
+
+ if (prev_page) {
+ page_backup_inner_focus(cur_page, prev_page, NULL);
+ page_backup_inner_focus(prev_page, NULL, cur_page);
+ }
+
+ prev_page = cur_page;
+ }
+}
+
+
+
+HAPI void scroller_restore_inner_focus(Evas_Object *scroller)
+{
+ Evas_Object *page = NULL;
+ Eina_List *list = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ ret_if(!scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ ret_if(!scroller_info->box);
+
+ list = elm_box_children_get(scroller_info->box);
+ ret_if(!list);
+
+ EINA_LIST_FREE(list, page) {
+ continue_if(!page);
+ page_restore_inner_focus(page);
+ }
+}
+
+
+
+/* This function just reorders not making a notification panel or widget */
+/* CRITICAL : You have to use this function only for notification reordering */
+HAPI void scroller_reorder_with_list(Evas_Object *scroller, Eina_List *list, page_direction_e page_direction)
+{
+ Evas_Object *tmp_page = NULL;
+ Evas_Object *focus_page = NULL;
+ Evas_Object *after = NULL;
+ Eina_List *reverse_list = NULL;
+ scroller_info_s *scroller_info = NULL;
+ page_info_s *page_info = NULL;
+
+ ret_if(!scroller);
+ ret_if(!list);
+
+ reverse_list = eina_list_reverse_clone(list);
+ ret_if(!reverse_list);
+
+ focus_page = scroller_get_focused_page(scroller);
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ ret_if(!scroller_info);
+ ret_if(!scroller_info->box);
+
+ if (scroller_info->center_neighbor_right) {
+ after = scroller_info->center_neighbor_right;
+ } else {
+ after = scroller_info->center;
+ }
+ ret_if(!after);
+
+ EINA_LIST_FREE(reverse_list, tmp_page) {
+ page_info = evas_object_data_get(tmp_page, DATA_KEY_PAGE_INFO);
+ continue_if(!page_info);
+
+ switch (page_info->direction) {
+ case PAGE_DIRECTION_LEFT:
+ _D("Reorder a page(%p) with pack_start", tmp_page);
+ elm_box_unpack(scroller_info->box, tmp_page);
+ elm_box_pack_start(scroller_info->box, tmp_page);
+ break;
+ case PAGE_DIRECTION_RIGHT:
+ _D("Reorder a page(%p) with pack_after", tmp_page);
+ elm_box_unpack(scroller_info->box, tmp_page);
+ elm_box_pack_after(scroller_info->box, tmp_page, after);
+ break;
+ default:
+ _E("Cannot reach here");
+ break;
+ }
+ }
+
+ elm_box_recalculate(scroller_info->box);
+ elm_box_recalculate(scroller_info->box_layout);
+
+ if (focus_page) scroller_region_show_page(scroller, focus_page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT);
+ else _E("Cannot get the focused page");
+
+ scroller_info->index_update_timer = ecore_timer_add(INDEX_UPDATE_TIME, _index_update_cb, scroller);
+ if (!scroller_info->index_update_timer) {
+ _E("Cannot add an index update timer");
+ }
+}
+
+
+
+// End of this file
diff --git a/home/src/tutorial.c b/home/src/tutorial.c
new file mode 100755
index 0000000..020b107
--- /dev/null
+++ b/home/src/tutorial.c
@@ -0,0 +1,1660 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+#include <Ecore_X.h>
+#include <Elementary.h>
+#include <efl_assist.h>
+#include <utilX.h>
+#include <vconf.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "layout_info.h"
+#include "effect.h"
+#include "key.h"
+#include "main.h"
+#include "page_info.h"
+#include "page.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "tutorial.h"
+#include "tutorial_info.h"
+#include "clock_service.h"
+#include "apps/apps_main.h"
+
+#define PRIVATE_DATA_KEY_TUTORIAL_PRESSED "p"
+#define PRIVATE_DATA_KEY_TUTORIAL_DOWN_X "d_x"
+#define PRIVATE_DATA_KEY_TUTORIAL_DOWN_Y "d_y"
+#define PRIVATE_DATA_KEY_TUTORIAL_STEP "p_n"
+#define PRIVATE_DATA_KEY_TUTORIAL_INFO "p_t_i"
+#define PRIVATE_DATA_KEY_TUTORIAL_TEXT "p_t"
+#define PRIVATE_DATA_KEY_TUTORIAL_ENABLE_INDICATOR "p_t_e_i"
+#define PRIVATE_DATA_KEY_TUTORIAL_TRANSIENT_TIMER "pdk_ttt"
+
+#define TUTORIAL_THRESHOLD_ABLE_X 150
+#define TUTORIAL_THRESHOLD_ABLE_Y 150
+
+#define TUTORIAL_THRESHOLD_DISABLE_X 250
+#define TUTORIAL_THRESHOLD_DISABLE_Y 150
+
+#define STEP_APPS ((void *) 1)
+#define APPS_FIRST_LIST 0
+
+
+
+static struct {
+ Evas_Object *win;
+ Ecore_Timer *transient_timer;
+ Ecore_Timer *step_eight_timer;
+ Eina_List *transient_list;
+} _tutorial_info = {
+ .win = NULL,
+ .transient_timer = NULL,
+ .step_eight_timer = NULL,
+ .transient_list = NULL,
+};
+
+
+
+static void _append_transient_list(Ecore_X_Window win, Ecore_X_Window for_win)
+{
+ _W("%p is transient for %p", win, for_win);
+ ecore_x_icccm_transient_for_set(win, for_win);
+
+ _tutorial_info.transient_list
+ = eina_list_append(_tutorial_info.transient_list, (void *) win);
+}
+
+
+
+static void _destroy_transient_list(void)
+{
+ void *xwin;
+
+ if (!_tutorial_info.transient_list) return;
+
+ EINA_LIST_FREE(_tutorial_info.transient_list, xwin) {
+ _W("%p is not transient", xwin);
+ ecore_x_icccm_transient_for_unset((Ecore_X_Window) xwin);
+ }
+}
+
+
+
+static Eina_Bool _set_transient_for_timer(void *data)
+{
+ Ecore_X_Window home_xwin;
+ Ecore_X_Window tutorial_xwin;
+ Ecore_X_Window xwin = (Ecore_X_Window)data;
+
+ retv_if(!xwin, ECORE_CALLBACK_CANCEL);
+
+ _D("Set normal type window");
+
+ home_xwin = elm_win_xwindow_get(main_get_info()->win);
+ retv_if(!home_xwin, ECORE_CALLBACK_CANCEL);
+
+ tutorial_xwin = elm_win_xwindow_get(_tutorial_info.win);
+ retv_if(!tutorial_xwin, ECORE_CALLBACK_CANCEL);
+
+ /* unset transient */
+ _destroy_transient_list();
+
+ /* set tutorial window to normal type */
+ ecore_x_netwm_window_type_set(tutorial_xwin, ECORE_X_WINDOW_TYPE_NORMAL);
+
+ /* set transient */
+ _append_transient_list(tutorial_xwin, xwin);
+ _append_transient_list(xwin, home_xwin);
+
+ _tutorial_info.transient_timer = NULL;
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+#define TIMER_TIME_SET_TRANSIENT 1.0f
+HAPI void tutorial_set_transient_for(Ecore_X_Window xwin)
+{
+ ret_if(!xwin);
+
+ if (_tutorial_info.transient_timer) {
+ ecore_timer_del(_tutorial_info.transient_timer);
+ _tutorial_info.transient_timer = NULL;
+ }
+
+ _tutorial_info.transient_timer = ecore_timer_add(TIMER_TIME_SET_TRANSIENT, _set_transient_for_timer, (void *)xwin);
+ if (!_tutorial_info.transient_timer) _E("Cannot add a timer");
+}
+
+
+
+HAPI int tutorial_is_first_boot(void)
+{
+ int tutorial_enabled = 0;
+
+ if (vconf_get_int(VCONF_KEY_HOME_IS_TUTORIAL_ENABLED_TO_RUN, &tutorial_enabled) != 0) {
+ _E("Cannot get the vconf for %s", VCONF_KEY_HOME_IS_TUTORIAL_ENABLED_TO_RUN);
+ }
+
+ /* 1 : first try, 0 : others */
+ _D("Tutorial is [%d]", tutorial_enabled);
+
+ return tutorial_enabled;
+}
+
+
+
+HAPI int tutorial_is_exist(void)
+{
+ layout_info_s *layout_info = NULL;
+
+ layout_info = evas_object_data_get(main_get_info()->layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, 0);
+
+ return layout_info->tutorial? 1 : 0;
+}
+
+
+
+static void _tutorial_destroy_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ _D("Tutorial will be removed");
+ if (tutorial_is_exist()) {
+ tutorial_destroy(data);
+ }
+}
+
+
+
+static char *_done_button_info_cb(void *data, Evas_Object *obj)
+{
+ char *text = NULL;
+
+ text = strdup(_("IDS_ST_BUTTON_OK"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static void _destroy_done_button(Evas_Object *tutorial)
+{
+ Evas_Object *button = NULL;
+ ret_if(!tutorial);
+
+ button = elm_object_part_content_unset(tutorial, "button");
+ ret_if(!button);
+
+ evas_object_del(button);
+}
+
+
+
+static void _done_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *tutorial = data;
+ ret_if(!tutorial);
+
+ elm_object_signal_emit(tutorial, "show", "page9,pressed");
+ effect_play_vibration();
+
+ /* only tutorial use */
+ if (vconf_set_int(VCONF_KEY_HOME_IS_TUTORIAL_ENABLED_TO_RUN, 0) != 0) {
+ _E("Critical, cannot set the private vconf key");
+ return;
+ }
+
+ _D("End the tutorial");
+
+ _destroy_done_button(tutorial);
+}
+
+
+
+static Evas_Object *_create_done_button(Evas_Object *tutorial)
+{
+ Evas_Object *button = NULL;
+
+ retv_if(!tutorial, NULL);
+
+ _D("Add done button");
+
+ button = elm_button_add(tutorial);
+ retv_if(!button, NULL);
+
+ elm_object_style_set(button, "focus");
+ elm_object_part_content_set(tutorial, "button", button);
+ evas_object_show(button);
+
+ elm_object_part_text_set(tutorial, "button_text", _("IDS_ST_BUTTON_OK"));
+ elm_object_domain_translatable_part_text_set(tutorial, "button_text", PROJECT, "IDS_ST_BUTTON_OK");
+
+ elm_access_info_cb_set(button, ELM_ACCESS_INFO, _done_button_info_cb, tutorial);
+ evas_object_smart_callback_add(button, "clicked", _done_button_clicked_cb, tutorial);
+ elm_object_signal_callback_add(tutorial, "done", "button", _tutorial_destroy_cb, tutorial);
+
+ return button;
+}
+
+
+
+static char *_text_start(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static char *_text_structure(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static char *_text_init(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static char *_text_one(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static char *_text_two(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static char *_text_three(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static char *_text_four(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"));
+ retv_if(!text, NULL);
+ return text;
+}
+
+
+
+static char *_text_five(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static char *_text_six(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"));
+ retv_if(!text, NULL);
+ return text;
+}
+
+
+
+static char *_text_seven(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static char *_text_eight(void)
+{
+ char *text = NULL;
+ text = strdup(_("IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static char *_access_info_cb(void *data, Evas_Object *obj)
+{
+ char *(*_text)(void);
+ Evas_Object *tutorial = data;
+ retv_if(!tutorial, NULL);
+
+ _text = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT);
+ retv_if(!_text, NULL);
+
+ return _text();
+}
+
+
+
+static void _down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ei = event_info;
+ Evas_Object *tutorial = data;
+ ret_if(!tutorial);
+
+ int x = ei->output.x;
+ int y = ei->output.y;
+
+ _D("Tutorial mouse down (%d, %d)", x, y);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_PRESSED, (void *) 1);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_DOWN_X, (void *) x);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_DOWN_Y, (void *) y);
+}
+
+
+
+static Eina_Bool _step_eight_timer_cb(void *data)
+{
+ tutorial_info_s *tutorial_info = NULL;
+ int is_wide_character = 0;
+ Evas_Object *tutorial = data;
+
+ _tutorial_info.step_eight_timer = NULL;
+
+ retv_if(!tutorial, ECORE_CALLBACK_CANCEL);
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ retv_if(!tutorial_info, ECORE_CALLBACK_CANCEL);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "center");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "center");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "center");
+ }
+
+ elm_object_signal_emit(tutorial, "show", "page9");
+ elm_object_part_text_set(tutorial, "text", _("IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_WMGR_POP_THATS_IT_E_GET_INTO_GEAR_E");
+
+ elm_access_highlight_set(tutorial_info->text_focus);
+
+ if (!_create_done_button(tutorial)) _E("failed to add the add done button");
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+
+
+#define TIMER_TIME_STEP_EIGHT 0.3f
+static void _step_eight(Evas_Object *tutorial, int vec_x, int vec_y)
+{
+ Ecore_X_Window tutorial_xwin;
+ Ecore_X_Window home_xwin;
+ tutorial_info_s *tutorial_info = NULL;
+
+ ret_if(!tutorial);
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ _D("Step 8");
+
+ if (!(abs(vec_y) > (TUTORIAL_THRESHOLD_ABLE_Y - 70)
+ && abs(vec_x) < TUTORIAL_THRESHOLD_DISABLE_X
+ && vec_y < 0))
+ {
+ _D("Exit step 8");
+ return;
+ }
+
+ /* Hide indicator */
+ clock_view_indicator_show(INDICATOR_HIDE);
+
+ home_xwin = elm_win_xwindow_get(main_get_info()->win);
+ ret_if(!home_xwin);
+ tutorial_xwin = elm_win_xwindow_get(tutorial_info->win);
+ ret_if(!tutorial_xwin);
+
+ /* unset transient */
+ _destroy_transient_list();
+
+ /* set transient : home & tutorial */
+ _append_transient_list(tutorial_xwin, home_xwin);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP, NULL);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_eight);
+
+ if (_tutorial_info.step_eight_timer) {
+ ecore_timer_del(_tutorial_info.step_eight_timer);
+ _tutorial_info.step_eight_timer = NULL;
+ }
+
+ elm_object_signal_emit(tutorial, "hide", "page8");
+
+ _tutorial_info.step_eight_timer = ecore_timer_add(TIMER_TIME_STEP_EIGHT, _step_eight_timer_cb, tutorial);
+ if (!_tutorial_info.step_eight_timer) _E("Cannot add a timer");
+}
+
+
+
+static void _step_seven(Evas_Object *tutorial, int vec_x, int vec_y)
+{
+ tutorial_info_s *tutorial_info = NULL;
+ Ecore_X_Window tutorial_xwin;
+ int is_wide_character = 0;
+
+ ret_if(!tutorial);
+
+ _D("Step 7");
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP, _step_eight);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_seven);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_ENABLE_INDICATOR, (void *) 0);
+
+ tutorial_xwin = elm_win_xwindow_get(tutorial_info->win);
+ ret_if(!tutorial_xwin);
+
+ /* unset transient : home & tutorial */
+ _destroy_transient_list();
+
+ /* set tutorial window to noti type */
+ ecore_x_netwm_window_type_set(tutorial_xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION);
+ utilx_set_system_notification_level(ecore_x_display_get(), tutorial_xwin, UTILX_NOTIFICATION_LEVEL_LOW);
+
+ /* Show indicator */
+ clock_view_indicator_show(INDICATOR_SHOW);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "sub");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "sub");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "sub");
+ }
+
+ elm_object_signal_emit(tutorial, "hide", "page7");
+ elm_object_signal_emit(tutorial, "show", "page8");
+ elm_object_part_text_set(tutorial, "text", _("IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_WNOTI_BODY_SWIPE_UPWARDS_TO_GO_BACK_TO_CLOCK_ABB");
+ elm_access_highlight_set(tutorial_info->text_focus);
+}
+
+
+
+static void _step_six(Evas_Object *tutorial, int vec_x, int vec_y)
+{
+ tutorial_info_s *tutorial_info = NULL;
+ int is_wide_character = 0;
+
+ ret_if(!tutorial);
+
+ _D("Step 6");
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP, NULL);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_six);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_ENABLE_INDICATOR, (void *) 1);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "sub");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "sub");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "sub");
+ }
+
+ elm_object_signal_emit(tutorial, "up", "sub");
+ elm_object_signal_emit(tutorial, "hide", "page6");
+ elm_object_signal_emit(tutorial, "show", "page7");
+ elm_object_part_text_set(tutorial, "text", _("IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_SEE_INDICATOR_ICONS_ON_CLOCK_ABB");
+}
+
+
+
+static void _step_five(Evas_Object *tutorial, int vec_x, int vec_y)
+{
+ tutorial_info_s *tutorial_info = NULL;
+ Eina_List *instance_list = NULL;
+ instance_info_s *info = NULL;
+ Ecore_X_Window tutorial_xwin;
+ int is_wide_character = 0;
+ int down_y = (int) evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_DOWN_Y);
+
+ ret_if(!tutorial);
+
+ _D("Step 5");
+
+ if (main_get_info()->is_tts) {
+ if (!(abs(vec_y) > TUTORIAL_THRESHOLD_ABLE_Y
+ && abs(vec_x) < TUTORIAL_THRESHOLD_DISABLE_X
+ && vec_y < 0))
+ {
+ _D("Exit step 5");
+ return;
+ }
+ } else {
+ if (!(abs(vec_y) > (TUTORIAL_THRESHOLD_ABLE_Y - 70)
+ && abs(vec_x) < TUTORIAL_THRESHOLD_DISABLE_X
+ && down_y >= main_get_info()->root_h - BEZEL_MOVE_THRESHOLD))
+ {
+ _D("Exit step 5");
+ return;
+ }
+ }
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP, STEP_APPS);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_five);
+
+ /* add event to checking apps state */
+ instance_list = apps_main_get_info()->instance_list;
+ if (!instance_list) {
+ _D("Instance list is not exist");
+ apps_main_init();
+ }
+ info = eina_list_nth(instance_list, APPS_FIRST_LIST);
+ ret_if(!info);
+ ret_if(!info->win);
+
+ if (main_get_info()->is_tts) {
+ ret_if(!info->layout);
+
+ elm_object_tree_focus_allow_set(info->layout, EINA_FALSE);
+ _D("tree_focus_allow_set layout(%p) as FALSE", info->layout);
+ }
+
+ tutorial_xwin = elm_win_xwindow_get(tutorial_info->win);
+ ret_if(!tutorial_xwin);
+
+ /* unset transient : home & tutorial */
+ _destroy_transient_list();
+
+ /* set tutorial window to noti type */
+ ecore_x_netwm_window_type_set(tutorial_xwin, ECORE_X_WINDOW_TYPE_NOTIFICATION);
+ utilx_set_system_notification_level(ecore_x_display_get(), tutorial_xwin, UTILX_NOTIFICATION_LEVEL_LOW);
+
+ _D("Tutorial win (%p)", tutorial_xwin);
+
+ apps_main_launch(APPS_LAUNCH_SHOW);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "sub");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "sub");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "sub");
+ }
+
+ elm_object_signal_emit(tutorial, "up", "sub");
+ elm_object_signal_emit(tutorial, "hide", "page5");
+ elm_object_signal_emit(tutorial, "show", "page6");
+ elm_object_part_text_set(tutorial, "text", _("IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_WNOTI_BODY_SWIPE_TOP_EDGE_DOWN_TO_GO_BACK_ABB");
+}
+
+
+
+static void _step_four(Evas_Object *tutorial, int vec_x, int vec_y)
+{
+ tutorial_info_s *tutorial_info = NULL;
+ int is_wide_character = 0;
+
+ ret_if(!tutorial);
+
+ _D("Step 4");
+
+ if (!(vec_x > TUTORIAL_THRESHOLD_ABLE_X
+ && abs(vec_y) < TUTORIAL_THRESHOLD_DISABLE_Y))
+ {
+ _D("Exit step 4");
+ return;
+ }
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP, _step_five);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_four);
+
+ scroller_bring_in_page(tutorial_info->scroller, tutorial_info->scroller_info->center, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "sub");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "sub");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "sub");
+ }
+
+ elm_object_signal_emit(tutorial, "hide", "page4");
+ elm_object_signal_emit(tutorial, "show", "page5");
+ elm_object_part_text_set(tutorial, "text", _("IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_WNOTI_BODY_SWIPE_BOTTOM_EDGE_UP_TO_VIEW_APPS_ON_CLOCK_ABB");
+ elm_access_highlight_set(tutorial_info->text_focus);
+}
+
+
+
+static void _step_three(Evas_Object *tutorial, int vec_x, int vec_y)
+{
+ Evas_Object *widget_page = NULL;
+ tutorial_info_s *tutorial_info = NULL;
+ int is_wide_character = 0;
+
+ ret_if(!tutorial);
+
+ _D("Step 3");
+
+ if (!(vec_x < -TUTORIAL_THRESHOLD_ABLE_X
+ && abs(vec_y) < TUTORIAL_THRESHOLD_DISABLE_Y))
+ {
+ _D("Exit step 3");
+ return;
+ }
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP, _step_four);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_three);
+
+ widget_page = scroller_get_right_page(tutorial_info->scroller, tutorial_info->scroller_info->center);
+ ret_if(!widget_page);
+ ret_if(!page_is_appended(widget_page));
+ scroller_bring_in_page(tutorial_info->scroller, widget_page, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "sub");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "sub");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "sub");
+ }
+
+ elm_object_signal_emit(tutorial, "hide", "page3");
+ elm_object_signal_emit(tutorial, "show", "page4");
+ elm_object_part_text_set(tutorial, "text", _("IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_HELP_POP_SWIPE_RIGHT_TO_GO_BACK_TO_THE_CLOCK_ABB");
+ elm_access_highlight_set(tutorial_info->text_focus);
+}
+
+
+
+static void _step_two(Evas_Object *tutorial, int vec_x, int vec_y)
+{
+ tutorial_info_s *tutorial_info = NULL;
+ int is_wide_character = 0;
+
+ ret_if(!tutorial);
+
+ _D("Step 2");
+
+ if (!(vec_x < -TUTORIAL_THRESHOLD_ABLE_X
+ && abs(vec_y) < TUTORIAL_THRESHOLD_DISABLE_Y))
+ {
+ _D("Exit step 2");
+ return;
+ }
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP, _step_three);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_two);
+
+ scroller_bring_in_page(tutorial_info->scroller, tutorial_info->scroller_info->center, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "sub");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "sub");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "sub");
+ }
+
+ elm_object_signal_emit(tutorial, "hide", "page2");
+ elm_object_signal_emit(tutorial, "show", "page3");
+ elm_object_part_text_set(tutorial, "text", _("IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_HELP_POP_SWIPE_LEFT_TO_VIEW_WIDGETS_ABB");
+ elm_access_highlight_set(tutorial_info->text_focus);
+}
+
+
+
+static void _step_one(Evas_Object *tutorial, int vec_x, int vec_y)
+{
+ Evas_Object *noti_page = NULL;
+ tutorial_info_s *tutorial_info = NULL;
+ int is_wide_character = 0;
+
+ ret_if(!tutorial);
+
+ _D("Step 1");
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ if (!(vec_x > TUTORIAL_THRESHOLD_ABLE_X
+ && abs(vec_y) < TUTORIAL_THRESHOLD_DISABLE_Y))
+ {
+ _D("Exit step 1");
+ scroller_bring_in_page(tutorial_info->scroller, tutorial_info->scroller_info->center, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+ return;
+ }
+
+ noti_page = scroller_get_left_page(tutorial_info->scroller, tutorial_info->scroller_info->center);
+ if (!noti_page || !page_is_appended(noti_page)) {
+ _D("There is no notification");
+ scroller_bring_in_page(tutorial_info->scroller, tutorial_info->scroller_info->center, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+ return;
+ }
+ scroller_bring_in_page(tutorial_info->scroller, noti_page, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP, _step_two);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_one);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "sub");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "sub");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "sub");
+ }
+
+ elm_object_signal_emit(tutorial, "hide", "page1");
+ elm_object_signal_emit(tutorial, "show", "page2");
+ elm_object_part_text_set(tutorial, "text", _("IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_HELP_POP_SWIPE_LEFT_TO_GO_BACK_TO_THE_CLOCK_ABB");
+ elm_access_highlight_set(tutorial_info->text_focus);
+}
+
+
+
+static void _up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ei = event_info;
+ tutorial_info_s *tutorial_info = data;
+
+ Evas_Object *tutorial = NULL;
+ void (*_step)(Evas_Object *, int , int);
+ int down_x, down_y;
+ int cur_x, cur_y;
+ int vec_x, vec_y;
+
+ ret_if(!tutorial_info);
+ tutorial = tutorial_info->tutorial;
+
+ if (!evas_object_data_del(tutorial, PRIVATE_DATA_KEY_TUTORIAL_PRESSED)) return;
+
+ /* can use down_x or down_y in the _step functions */
+ down_x = (int) evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_DOWN_X);
+ down_y = (int) evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_DOWN_Y);
+
+ cur_x = ei->cur.output.x;
+ cur_y = ei->cur.output.y;
+
+ _D("Tutorial mouse up (%d, %d)", cur_x, cur_y);
+
+ vec_x = cur_x - down_x;
+ vec_y = cur_y - down_y;
+
+ _step = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP);
+ if (!_step) {
+ _D("Step is done");
+ return;
+ } else if (STEP_APPS == _step) {
+ _D("Step is holding");
+ return;
+ }
+ _step(tutorial, vec_x, vec_y);
+
+ evas_object_data_del(tutorial, PRIVATE_DATA_KEY_TUTORIAL_DOWN_X);
+ evas_object_data_del(tutorial, PRIVATE_DATA_KEY_TUTORIAL_DOWN_Y);
+}
+
+
+
+static key_cb_ret_e _tutorial_back_cb(void *data)
+{
+ Evas_Object *tutorial = data;
+
+ retv_if(!tutorial, KEY_CB_RET_STOP);
+
+ _D("Back key is released");
+
+ /* If the Apps is down, then proceed the next step */
+ if(evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_ENABLE_INDICATOR)) {
+ clock_h clock = NULL;
+ clock = clock_manager_clock_get(CLOCK_ATTACHED);
+ retv_if(!clock, KEY_CB_RET_CONTINUE);
+ retv_if(!clock->view, KEY_CB_RET_CONTINUE);
+
+ _step_seven(tutorial, 0, 0);
+
+ return KEY_CB_RET_CONTINUE;
+ }
+ return KEY_CB_RET_STOP;
+}
+
+
+
+static w_home_error_e _resume_cb(void *data)
+{
+ Ecore_X_Window tutorial_xwin;
+ Ecore_X_Window home_xwin;
+ Evas_Object *tutorial = data;
+ void (*_step)(Evas_Object *tutorial, int vec_x, int vec_y);
+
+ retv_if(!tutorial, W_HOME_ERROR_FAIL);
+
+ _D("Resume window");
+
+ _step = evas_object_data_get(data, PRIVATE_DATA_KEY_TUTORIAL_STEP);
+ if (_step_one == _step) {
+ tutorial_info_s *tutorial_info = NULL;
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ retv_if(!tutorial_info, W_HOME_ERROR_FAIL);
+
+ scroller_bring_in_page(tutorial_info->scroller, tutorial_info->scroller_info->center, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+ elm_object_focus_set(tutorial_info->text_focus, EINA_TRUE);
+ } else if (STEP_APPS == _step) {
+ tutorial_info_s *tutorial_info = NULL;
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ retv_if(!tutorial_info, W_HOME_ERROR_FAIL);
+
+ home_xwin = elm_win_xwindow_get(main_get_info()->win);
+ retv_if(!home_xwin, W_HOME_ERROR_FAIL);
+ tutorial_xwin = elm_win_xwindow_get(tutorial_info->win);
+ retv_if(!tutorial_xwin, W_HOME_ERROR_FAIL);
+
+ /* unset transient */
+ _destroy_transient_list();
+
+ /* set transient : home & tutorial */
+ _append_transient_list(tutorial_xwin, home_xwin);
+
+ _step_six(tutorial, 0, 0);
+ }
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static void _highlighted_enabled_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ tutorial_info_s *tutorial_info = data;
+ ret_if(!tutorial_info);
+ ret_if(!tutorial_info->text_focus);
+
+ _D("highlight enabled");
+
+ elm_access_highlight_set(tutorial_info->text_focus);
+}
+
+
+
+static void _highlighted_disabled_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ _D("highlight disabled");
+}
+
+
+
+static void _tutorial_start_2_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ tutorial_info_s *tutorial_info = NULL;
+ int is_wide_character = 0;
+ Evas_Object *tutorial = data;
+ ret_if(!tutorial);
+
+ _D("Show page 1");
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP, _step_one);
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_init);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "sub");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "sub");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "sub");
+ }
+
+ elm_object_signal_emit(tutorial, "hide", "page0");
+ elm_object_signal_emit(tutorial, "show", "page1");
+ elm_object_part_text_set(tutorial, "text", _("IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_HELP_POP_SWIPE_RIGHT_TO_VIEW_NOTIFICATIONS_ABB");
+ elm_access_highlight_set(tutorial_info->text_focus);
+}
+
+
+
+static char *_start_button_info_cb(void *data, Evas_Object *obj)
+{
+ char *text = NULL;
+
+ text = strdup(_("IDS_ST_BUTTON_NEXT"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static void _destroy_start_2_button(Evas_Object *tutorial)
+{
+ Evas_Object *button = NULL;
+ ret_if(!tutorial);
+
+ button = elm_object_part_content_unset(tutorial, "button");
+ ret_if(!button);
+
+ evas_object_del(button);
+}
+
+
+
+static void _start_2_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ tutorial_info_s *tutorial_info = NULL;
+
+ Evas_Object *tutorial = data;
+ ret_if(!tutorial);
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ scroller_bring_in_page(tutorial_info->scroller, tutorial_info->scroller_info->center, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+
+ elm_object_signal_emit(tutorial, "show", "start2,pressed");
+ effect_play_vibration();
+
+ _D("Start the tutorial");
+
+ _destroy_start_2_button(tutorial);
+}
+
+
+
+static Evas_Object *_create_start_2_button(Evas_Object *tutorial)
+{
+ Evas_Object *button = NULL;
+
+ retv_if(!tutorial, NULL);
+
+ _D("Add start 2 button");
+
+ button = elm_button_add(tutorial);
+ retv_if(!button, NULL);
+
+ elm_object_style_set(button, "focus");
+ elm_object_part_content_set(tutorial, "button", button);
+ evas_object_show(button);
+
+ elm_object_part_text_set(tutorial, "button_text", _("IDS_ST_BUTTON_NEXT"));
+ elm_object_domain_translatable_part_text_set(tutorial, "button_text", PROJECT, "IDS_ST_BUTTON_NEXT");
+
+ elm_access_info_cb_set(button, ELM_ACCESS_INFO, _start_button_info_cb, tutorial);
+ evas_object_smart_callback_add(button, "clicked", _start_2_button_clicked_cb, tutorial);
+ elm_object_signal_callback_add(tutorial, "start2", "button", _tutorial_start_2_cb, tutorial);
+
+ return button;
+}
+
+
+
+static void _tutorial_start_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ tutorial_info_s *tutorial_info = NULL;
+ int is_wide_character = 0;
+ Evas_Object *tutorial = data;
+ ret_if(!tutorial);
+
+ _D("Show structure image");
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_structure);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "sub");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "sub");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "sub");
+ }
+
+ elm_object_signal_emit(tutorial, "show", "structure_page");
+ elm_object_part_text_set(tutorial, "text", _("IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_WNOTI_BODY_THIS_IS_THE_MAIN_STRUCTURE_OF_THE_HOME_SCREEN");
+ elm_access_highlight_set(tutorial_info->text_focus);
+
+ if (!_create_start_2_button(tutorial)) _E("failed to add the add start 2 button");
+}
+
+
+
+static char *_close_button_info_cb(void *data, Evas_Object *obj)
+{
+ char *text = NULL;
+
+ text = strdup(_("IDS_ST_BUTTON_EXIT"));
+ retv_if(!text, NULL);
+
+ return text;
+}
+
+
+
+static void _destroy_start_button(Evas_Object *tutorial)
+{
+ Evas_Object *button = NULL;
+ ret_if(!tutorial);
+
+ button = elm_object_part_content_unset(tutorial, "button");
+ ret_if(!button);
+
+ evas_object_del(button);
+}
+
+
+
+static void _destroy_close_button(Evas_Object *tutorial)
+{
+ Evas_Object *button = NULL;
+ ret_if(!tutorial);
+
+ button = elm_object_part_content_unset(tutorial, "close_button");
+ ret_if(!button);
+
+ evas_object_del(button);
+}
+
+
+
+static void _start_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ tutorial_info_s *tutorial_info = NULL;
+
+ Evas_Object *tutorial = data;
+ ret_if(!tutorial);
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ scroller_bring_in_page(tutorial_info->scroller, tutorial_info->scroller_info->center, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+
+ elm_object_signal_emit(tutorial, "show", "start,pressed");
+ effect_play_vibration();
+
+ _D("Show structure page");
+
+ _destroy_start_button(tutorial);
+ _destroy_close_button(tutorial);
+}
+
+
+
+static Evas_Object *_create_start_button(Evas_Object *tutorial)
+{
+ Evas_Object *button = NULL;
+
+ retv_if(!tutorial, NULL);
+
+ _D("Add start button");
+
+ button = elm_button_add(tutorial);
+ retv_if(!button, NULL);
+
+ elm_object_style_set(button, "focus");
+ elm_object_part_content_set(tutorial, "button", button);
+ evas_object_show(button);
+
+ elm_object_part_text_set(tutorial, "button_text", _("IDS_ST_BUTTON_NEXT"));
+ elm_object_domain_translatable_part_text_set(tutorial, "button_text", PROJECT, "IDS_ST_BUTTON_NEXT");
+
+ elm_access_info_cb_set(button, ELM_ACCESS_INFO, _start_button_info_cb, tutorial);
+ evas_object_smart_callback_add(button, "clicked", _start_button_clicked_cb, tutorial);
+ elm_object_signal_callback_add(tutorial, "start", "button", _tutorial_start_cb, tutorial);
+
+ return button;
+}
+
+
+
+static void _close_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ tutorial_info_s *tutorial_info = NULL;
+
+ Evas_Object *tutorial = data;
+ ret_if(!tutorial);
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ /* Scroller has to be unfreezed before using scroller_bring_in_page */
+ scroller_unfreeze(tutorial_info->scroller);
+ scroller_bring_in_page(tutorial_info->scroller, tutorial_info->scroller_info->center, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT);
+
+ _destroy_start_button(tutorial);
+ _destroy_close_button(tutorial);
+
+ tutorial_destroy(tutorial);
+
+ /* only tutorial use */
+ if (vconf_set_int(VCONF_KEY_HOME_IS_TUTORIAL_ENABLED_TO_RUN, 0) != 0) {
+ _E("Critical, cannot set the private vconf key");
+ return;
+ }
+}
+
+
+
+static Evas_Object *_create_close_button(Evas_Object *tutorial)
+{
+ Evas_Object *button = NULL;
+
+ retv_if(!tutorial, NULL);
+
+ _D("Add start button");
+
+ button = elm_button_add(tutorial);
+ retv_if(!button, NULL);
+
+ elm_object_style_set(button, "focus");
+ elm_object_part_content_set(tutorial, "close_button", button);
+ evas_object_show(button);
+
+ elm_access_info_cb_set(button, ELM_ACCESS_INFO, _close_button_info_cb, tutorial);
+ evas_object_smart_callback_add(button, "clicked", _close_button_clicked_cb, tutorial);
+
+ return button;
+}
+
+
+
+static Evas_Object *_create_window(void)
+{
+ Evas_Object *win = NULL;
+
+ win = elm_win_add(NULL, "Tutorial", ELM_WIN_BASIC);
+ retv_if(!win, NULL);
+
+ elm_win_title_set(win, "Tutorial");
+ elm_win_borderless_set(win, EINA_TRUE);
+ elm_win_alpha_set(win, EINA_TRUE);
+ elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_HIDE);
+ elm_win_indicator_opacity_set(win, ELM_WIN_INDICATOR_BG_TRANSPARENT);
+ elm_win_prop_focus_skip_set(win, EINA_TRUE);
+ elm_win_role_set(win, "no-effect");
+
+ evas_object_resize(win, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_show(win);
+
+ return win;
+}
+
+
+
+static void _destroy_window(Evas_Object *win)
+{
+ ret_if(!win);
+
+ evas_object_del(win);
+}
+
+
+
+#define FILE_TUTORIAL_EDJ EDJEDIR"/tutorial.edj"
+#define GROUP_TUTORIAL "tutorial"
+static Evas_Object *_create_layout(Evas_Object *win)
+{
+ Evas_Object *tutorial = NULL;
+ Eina_Bool ret;
+
+ retv_if(!win, NULL);
+
+ tutorial = elm_layout_add(win);
+ retv_if(!tutorial, NULL);
+
+ ret = elm_layout_file_set(tutorial, FILE_TUTORIAL_EDJ, GROUP_TUTORIAL);
+ if (EINA_FALSE == ret) return NULL;
+
+ evas_object_size_hint_weight_set(tutorial, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_min_set(tutorial, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_resize(tutorial, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_show(tutorial);
+
+ return tutorial;
+}
+
+
+
+static void _destroy_layout(Evas_Object *tutorial)
+{
+ ret_if(!tutorial);
+
+ evas_object_data_del(tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP);
+ evas_object_data_del(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT);
+ evas_object_data_del(tutorial, PRIVATE_DATA_KEY_TUTORIAL_ENABLE_INDICATOR);
+
+ evas_object_del(tutorial);
+}
+
+
+
+static Evas_Object *_create_bg(Evas_Object *tutorial)
+{
+ Evas *evas = NULL;
+ Evas_Object *bg = NULL;
+
+ retv_if(!tutorial, NULL);
+
+ evas = evas_object_evas_get(tutorial);
+ retv_if(!evas, NULL);
+
+ bg = evas_object_rectangle_add(evas);
+ retv_if(!bg, NULL);
+
+ evas_object_size_hint_min_set(bg, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_size_hint_max_set(bg, main_get_info()->root_w, main_get_info()->root_h);
+ evas_object_resize(bg, main_get_info()->root_w, main_get_info()->root_h);
+ elm_object_part_content_set(tutorial, "bg_area", bg);
+ evas_object_show(bg);
+
+ return bg;
+}
+
+
+
+static void _destroy_bg(Evas_Object *bg)
+{
+ ret_if(!bg);
+
+ evas_object_del(bg);
+}
+
+
+
+static void _destroy_focus_buttons(tutorial_info_s *tutorial_info)
+{
+ ret_if(!tutorial_info);
+
+ if (tutorial_info->layout_focus) {
+ evas_object_del(tutorial_info->layout_focus);
+ }
+
+ if (tutorial_info->text_focus) {
+ evas_object_del(tutorial_info->text_focus);
+ }
+}
+
+
+
+static void _create_focus_buttons(Evas_Object *tutorial)
+{
+ tutorial_info_s *tutorial_info = NULL;
+ Evas_Object *focus = NULL;
+
+ ret_if(!tutorial);
+
+ tutorial_info = evas_object_data_get(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_TEXT, _text_start);
+
+ /* Layout button for TTS*/
+ focus = elm_button_add(tutorial);
+ ret_if(!focus);
+
+ elm_object_style_set(focus, "focus");
+ elm_object_part_content_set(tutorial, "focus,tutorial", focus);
+ evas_object_event_callback_add(focus, EVAS_CALLBACK_MOUSE_DOWN, _down_cb, tutorial);
+ evas_object_event_callback_add(focus, EVAS_CALLBACK_MOUSE_UP, _up_cb, tutorial_info);
+ elm_object_focus_allow_set(focus, EINA_FALSE);
+ elm_access_object_unregister(focus);
+ tutorial_info->layout_focus = focus;
+
+ /*text button for TTS */
+ focus = elm_button_add(tutorial);
+ goto_if(!focus, ERROR);
+
+ elm_object_style_set(focus, "focus");
+ elm_object_part_content_set(tutorial, "focus,text", focus);
+ elm_access_info_cb_set(focus, ELM_ACCESS_TYPE, _access_info_cb, tutorial);
+ elm_object_focus_allow_set(focus, EINA_TRUE);
+ elm_object_focus_set(focus, EINA_TRUE);
+ tutorial_info->text_focus = focus;
+
+ return;
+
+ERROR:
+ _destroy_focus_buttons(tutorial_info);
+}
+
+
+
+HAPI Evas_Object *tutorial_create(Evas_Object *layout)
+{
+ Evas_Object *win = NULL;
+ Evas_Object *tutorial = NULL;
+ Evas_Object *bg = NULL;
+ Evas_Object *scroller = NULL;
+
+ layout_info_s *layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+ tutorial_info_s *tutorial_info = NULL;
+ Ecore_X_Window tutorial_xwin;
+ Ecore_X_Window home_xwin;
+ int ret = 0;
+ int is_wide_character = 0;
+
+ retv_if(!layout, NULL);
+
+ _D("Creat tutorial");
+
+ if ((ret = vconf_set_int(VCONF_KEY_HOME_IS_TUTORIAL, 1)) != 0) {
+ _E("Critical, cannot set the public vconf key");
+ return NULL;
+ }
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, NULL);
+
+ tutorial_info = calloc(1, sizeof(tutorial_info_s));
+ retv_if(!tutorial_info, NULL);
+
+ tutorial_info->layout = layout;
+
+ scroller = evas_object_data_get(layout, DATA_KEY_SCROLLER);
+ goto_if(!scroller, ERROR);
+ tutorial_info->scroller = scroller;
+
+ scroller_info = evas_object_data_get(scroller, DATA_KEY_SCROLLER_INFO);
+ goto_if(!scroller_info, ERROR);
+ tutorial_info->scroller_info = scroller_info;
+
+ win = _create_window();
+ goto_if(!win, ERROR);
+ tutorial_info->win = win;
+ _tutorial_info.win = win;
+
+ tutorial = _create_layout(win);
+ goto_if(!tutorial, ERROR);
+ tutorial_info->tutorial = tutorial;
+
+ bg = _create_bg(tutorial);
+ goto_if(!bg, ERROR);
+ tutorial_info->bg = bg;
+
+ /* We have to set tutorial_info right after calloc & tutorial */
+ evas_object_data_set(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO, tutorial_info);
+
+ if (main_get_info()->is_tts) {
+ elm_object_tree_focus_allow_set(main_get_info()->layout, EINA_FALSE);
+ _D("tree_focus_allow_set layout(%p) as FALSE", main_get_info()->layout);
+ }
+ scroller_unhighlight(scroller);
+
+ is_wide_character = main_get_info()->is_wide_character;
+ if (is_wide_character == TUTORIAL_LANGUAGE_MALI) {
+ elm_object_signal_emit(tutorial, "small", "center");
+ } else if (is_wide_character == TUTORIAL_LANGUAGE_GEORGIA) {
+ elm_object_signal_emit(tutorial, "medium", "center");
+ } else {
+ elm_object_signal_emit(tutorial, "standard", "center");
+ }
+
+ elm_object_signal_emit(tutorial, "start", "start");
+ elm_object_part_text_set(tutorial, "text", _("IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB"));
+ elm_object_domain_translatable_part_text_set(tutorial, "text", PROJECT, "IDS_WMGR_BODY_WELCOME_E_TAP_THE_BUTTON_BELOW_TO_LEARN_HOW_TO_USE_YOUR_GEAR_ABB");
+ if (!_create_start_button(tutorial)) _E("failed to add the add start button");
+ if (!_create_close_button(tutorial)) _E("failed to add the add close button");
+
+ _create_focus_buttons(tutorial);
+
+ evas_object_smart_callback_add(win, "access,highlight,enabled", _highlighted_enabled_cb, tutorial_info);
+ evas_object_smart_callback_add(win, "access,highlight,disabled", _highlighted_disabled_cb, tutorial_info);
+
+ scroller_freeze(scroller);
+ scroller_bring_in_page(scroller, scroller_info->center, SCROLLER_FREEZE_ON, SCROLLER_BRING_TYPE_INSTANT);
+
+ tutorial_xwin = elm_win_xwindow_get(win);
+ goto_if(!tutorial_xwin, ERROR);
+
+ home_xwin = elm_win_xwindow_get(main_get_info()->win);
+ goto_if(!home_xwin, ERROR);
+
+ /* set transient : home & tutorial */
+ _append_transient_list(tutorial_xwin, home_xwin);
+
+ key_register_cb(KEY_TYPE_BACK, _tutorial_back_cb, tutorial);
+ main_register_cb(APP_STATE_RESUME, _resume_cb, tutorial);
+
+ layout_info->tutorial = tutorial;
+
+ return tutorial;
+
+ERROR:
+ /* We don't need to destroy bg and so on because we don't create */
+ if (tutorial) _destroy_layout(tutorial);
+ if (win) _destroy_window(win);
+ if (tutorial_info) free(tutorial_info);
+
+ return NULL;
+}
+
+
+
+HAPI void tutorial_destroy(Evas_Object *tutorial)
+{
+ layout_info_s *layout_info = NULL;
+ tutorial_info_s *tutorial_info = NULL;
+ Eina_List *instance_list = NULL;
+ instance_info_s *info = NULL;
+ layout_info_s *home_layout_info = NULL;
+ scroller_info_s *scroller_info = NULL;
+
+ _D("Destroy tutorial");
+
+ ret_if(!tutorial);
+
+ if(_tutorial_info.transient_timer) {
+ ecore_timer_del(_tutorial_info.transient_timer);
+ _tutorial_info.transient_timer = NULL;
+ }
+
+ if(_tutorial_info.step_eight_timer) {
+ ecore_timer_del(_tutorial_info.step_eight_timer);
+ _tutorial_info.step_eight_timer = NULL;
+ }
+
+ tutorial_info = evas_object_data_del(tutorial, PRIVATE_DATA_KEY_TUTORIAL_INFO);
+ ret_if(!tutorial_info);
+ ret_if(!tutorial_info->layout);
+
+ layout_info = evas_object_data_get(tutorial_info->layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ main_unregister_cb(APP_STATE_RESUME, _resume_cb);
+ key_unregister_cb(KEY_TYPE_BACK, _tutorial_back_cb);
+
+ instance_list = apps_main_get_info()->instance_list;
+ ret_if(!instance_list);
+
+ info = eina_list_nth(instance_list, APPS_FIRST_LIST);
+ ret_if(!info);
+ ret_if(!info->win);
+
+ if (main_get_info()->is_tts) {
+ elm_object_tree_focus_allow_set(main_get_info()->layout, EINA_TRUE);
+ _D("tree_focus_allow_set layout(%p) as TRUE", main_get_info()->layout);
+
+ ret_if(!info->layout);
+ elm_object_tree_focus_allow_set(info->layout, EINA_TRUE);
+ _D("tree_focus_allow_set layout(%p) as TRUE", info->layout);
+ home_layout_info = evas_object_data_get(main_get_info()->layout, DATA_KEY_LAYOUT_INFO);
+ scroller_info = evas_object_data_get(home_layout_info->scroller, DATA_KEY_SCROLLER_INFO);
+ page_focus(scroller_info->center);
+ }
+
+ scroller_highlight(tutorial_info->scroller);
+
+ _destroy_focus_buttons(tutorial_info);
+ _destroy_bg(tutorial_info->bg);
+ _destroy_layout(tutorial_info->tutorial);
+
+ _destroy_transient_list();
+ _destroy_window(tutorial_info->win);
+
+ scroller_unfreeze(tutorial_info->scroller);
+ free(tutorial_info);
+
+ layout_info->tutorial = NULL;
+
+ if (vconf_set_int(VCONF_KEY_HOME_IS_TUTORIAL, 0) != 0) {
+ _E("Critical, cannot set the public vconf key");
+ return;
+ }
+}
+
+
+
+#define TITLE_APPS "__APPS__"
+HAPI int tutorial_is_apps(Ecore_X_Window xwin)
+{
+ layout_info_s *layout_info = NULL;
+ void (*_step_func)(Evas_Object *, int, int);
+ char *title = NULL;
+
+ title = ecore_x_icccm_title_get(xwin);
+ retv_if(!title, 0);
+
+ if (strcmp(title, TITLE_APPS)) {
+ _D("This is not Apps");
+ free(title);
+ return 0;
+ }
+ free(title);
+
+ layout_info = evas_object_data_get(main_get_info()->layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, 0);
+
+ _step_func = evas_object_data_get(layout_info->tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP);
+ retv_if(!_step_func, 0);
+
+ return _step_func == STEP_APPS ? 1 : 0;
+}
+
+
+
+#define TITLE_INDICATOR "__MOMENT_VIEW__"
+HAPI int tutorial_is_indicator(Ecore_X_Window xwin)
+{
+ layout_info_s *layout_info = NULL;
+ void (*_step_func)(Evas_Object *, int, int);
+ char *title = NULL;
+
+ title = ecore_x_icccm_title_get(xwin);
+ retv_if(!title, 0);
+
+ if (strcmp(title, TITLE_INDICATOR)) {
+ _D("This is not Indicator");
+ free(title);
+ return 0;
+ }
+ free(title);
+
+ layout_info = evas_object_data_get(main_get_info()->layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, 0);
+
+ _step_func = evas_object_data_get(layout_info->tutorial, PRIVATE_DATA_KEY_TUTORIAL_STEP);
+ retv_if(!_step_func, 0);
+
+ return _step_func == _step_eight ? 1 : 0;
+}
+
+// End of file
diff --git a/home/src/util.c b/home/src/util.c
new file mode 100755
index 0000000..9f4a39d
--- /dev/null
+++ b/home/src/util.c
@@ -0,0 +1,1171 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <aul.h>
+#include <app.h>
+#include <appsvc.h>
+#include <bundle.h>
+#include <Elementary.h>
+#include <Evas.h>
+#include <dlog.h>
+#include <notification_status.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <vconf.h>
+#include <efl_assist.h>
+#include <pkgmgr-info.h>
+
+#include "conf.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "power_mode.h"
+#include "dbus.h"
+#include "layout.h"
+#include "layout_info.h"
+#include "clock_service.h"
+
+#include <dynamicbox_errno.h>
+#include <Ecore.h>
+#include <Ecore_X.h>
+
+#include "apps/layout.h"
+#include "apps/apps_main.h"
+#include "tutorial.h"
+
+
+
+HAPI int util_launch_app(const char *appid, const char *key, const char *value)
+{
+ int pid = 0;
+
+ retv_if(!appid, W_HOME_ERROR_INVALID_PARAMETER);
+
+ if (key && value) {
+ bundle *b = bundle_create();
+ retv_if(!b, 0);
+
+ bundle_add(b, key, value);
+ home_dbus_cpu_booster_signal_send();
+ pid = aul_launch_app(appid, b);
+ bundle_free(b);
+ } else {
+ home_dbus_cpu_booster_signal_send();
+ pid = aul_launch_app(appid, NULL);
+ }
+
+ if (pid < 0) {
+ _E("Failed to launch %s(%d)", appid, pid);
+ }
+
+ return pid;
+}
+
+
+
+HAPI int util_feature_enabled_get(int feature)
+{
+ int is_enabled = 1;
+
+ if (feature & FEATURE_CLOCK_HIDDEN_BUTTON) {
+ if (main_get_info()->is_tts) {
+ return 0;
+ }
+ if (cooldown_mode_enabled_get() == 1) {
+ return 0;
+ }
+ if (clock_service_scroller_freezed_get() == 1) {
+ return 0;
+ }
+ if (tutorial_is_exist() == 1) {
+ return 0;
+ }
+ } else if (feature & FEATURE_CLOCK_VISUAL_CUE) {
+ if (main_get_info()->is_tts) {
+ return 0;
+ }
+ if (main_get_info()->is_alpm_clock_enabled == 1) {
+ return 0;
+ }
+ if (emergency_mode_enabled_get() == 1) {
+ return 0;
+ }
+ if (cooldown_mode_enabled_get() == 1) {
+ return 0;
+ }
+ if (apps_main_show_count_get() > 3) {
+ return 0;
+ }
+ if (clock_service_scroller_freezed_get() == 1) {
+ return 0;
+ }
+ } else if (feature & FEATURE_CLOCK_SELECTOR) {
+#if 0 //TBD, it can be disabled
+ return 0;
+#endif
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ if (clock_manager_view_state_get(CLOCK_VIEW_TYPE_DRAWER) == 1) {
+ return 0;
+ }
+#endif
+ if (main_get_info()->is_tts) {
+ return 0;
+ }
+ if (emergency_mode_enabled_get() == 1) {
+ return 0;
+ }
+ if (cooldown_mode_enabled_get() == 1) {
+ return 0;
+ }
+ if (clock_service_scroller_freezed_get() == 1) {
+ return 0;
+ }
+ } else if (feature & FEATURE_APPS_BY_BEZEL_UP) {
+ if (main_get_info()->is_tts) {
+ return 0;
+ }
+#ifndef ENABLE_INDICATOR_BRIEFING_VIEW
+ if (clock_manager_view_state_get(CLOCK_VIEW_TYPE_DRAWER) == 1) {
+ return 0;
+ }
+#endif
+ if (emergency_mode_enabled_get() == 1) {
+ return 0;
+ }
+ if (cooldown_mode_enabled_get() == 1) {
+ return 0;
+ }
+ if (clock_service_scroller_freezed_get() == 1) {
+ return 0;
+ }
+ } else if (feature & FEATURE_APPS) {
+ if (emergency_mode_enabled_get() == 1) {
+ return 0;
+ }
+ if (cooldown_mode_enabled_get() == 1) {
+ return 0;
+ }
+ } else if (feature & FEATURE_CLOCK_CHANGE) {
+ Evas_Object *win = main_get_info()->win;
+ retv_if(win == NULL, is_enabled);
+ Evas_Object *layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ retv_if(layout == NULL, is_enabled);
+
+ // disabled in editing
+ if (layout_is_edit_mode(layout) == 1) {
+ return 0;
+ }
+ } else if (feature & FEATURE_TUTORIAL) {
+ if (emergency_mode_enabled_get() == 1) {
+ return 0;
+ }
+ if (cooldown_mode_enabled_get() == 1) {
+ return 0;
+ }
+ } else if (feature & FEATURE_CLOCK_HIDDEN_BUTTON_TIMER) {
+ Evas_Object *win = main_get_info()->win;
+ retv_if(win == NULL, is_enabled);
+ Evas_Object *layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ retv_if(layout == NULL, is_enabled);
+ layout_info_s *layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ retv_if(!layout_info, is_enabled);
+
+ if (layout_info->tutorial) {
+ return 0;
+ }
+ }
+
+ return is_enabled;
+}
+
+
+#define DbgFree(a) free(a)
+static inline int get_pid(Ecore_X_Window win)
+{
+ int pid;
+ Ecore_X_Atom atom;
+ unsigned char *in_pid;
+ int num;
+
+ atom = ecore_x_atom_get("X_CLIENT_PID");
+ if (!atom) {
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ if (ecore_x_window_prop_property_get(win, atom, ECORE_X_ATOM_CARDINAL,
+ sizeof(int), &in_pid, &num) == EINA_FALSE) {
+ if (ecore_x_netwm_pid_get(win, &pid) == EINA_FALSE) {
+ _E("Failed to get PID from a window 0x%X\n", win);
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+ } else if (in_pid) {
+ pid = *(int *)in_pid;
+ DbgFree(in_pid);
+ } else {
+ _E("Failed to get PID\n");
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ return pid;
+}
+
+static inline Ecore_X_Window get_user_created_window(Ecore_X_Window win)
+{
+ Ecore_X_Window user_win = 0;
+ Ecore_X_Atom atom;
+
+ atom = ecore_x_atom_get("_E_USER_CREATED_WINDOW");
+ if (!atom) {
+ _D("Failed to get user created atom\n");
+ return 0;
+ }
+
+ if (ecore_x_window_prop_xid_get(win, atom, ECORE_X_ATOM_WINDOW, &user_win, 1) == 1 && win) {
+ _D("User window: %x (for %x)\n", user_win, win);
+ return user_win;
+ }
+
+ return 0;
+}
+
+static inline int get_window_info(Ecore_X_Window parent, Ecore_X_Window user_win, int *pid, char **command)
+{
+ Evas_Coord x, y, w, h;
+ int argc;
+ char **argv;
+ Evas_Coord rx, ry, rw, rh;
+ Evas_Coord px, py, pw, ph;
+
+ ecore_x_window_geometry_get(0, &rx, &ry, &rw, &rh);
+ ecore_x_window_geometry_get(user_win, &x, &y, &w, &h);
+ ecore_x_window_geometry_get(parent, &px, &py, &pw, &ph);
+
+ if (x != rx || y != ry || w != rw || h != rh) {
+ _D("Size mismatch (with user,win)\n");
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ if (x != px || y != py || w != pw || h != ph) {
+ _D("Size mismatch (with parent)\n");
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+ }
+
+ ecore_x_icccm_command_get(user_win, &argc, &argv);
+ _D("Get Command of %x\n", user_win);
+ if (argc > 0) {
+ int i;
+ *pid = get_pid(user_win);
+ if (command) {
+ *command = argv[0];
+ _D("Command[0]: %s\n", argv[0]);
+ i = 1;
+ } else {
+ i = 0;
+ }
+
+ while (i < argc) {
+ _D("Command[%d]: %s\n", i, argv[i]);
+ DbgFree(argv[i]);
+ i++;
+ }
+
+ DbgFree(argv);
+ return DBOX_STATUS_ERROR_NONE;
+ }
+
+ return DBOX_STATUS_ERROR_INVALID_PARAMETER;
+}
+
+HAPI int util_find_top_visible_window(char **command)
+{
+ Ecore_X_Window root;
+ Ecore_X_Window ret;
+ struct stack_item *new_item;
+ struct stack_item *item;
+ Eina_List *win_stack;
+ int pid = -1;
+ struct stack_item {
+ Ecore_X_Window *wins;
+ int nr_of_wins;
+ int i;
+ };
+
+ root = ecore_x_window_root_first_get();
+
+ new_item = malloc(sizeof(*new_item));
+ if (!new_item) {
+ _E("Error(%s)\n", strerror(errno));
+ return -1;
+ }
+
+ new_item->nr_of_wins = 0;
+ new_item->wins =
+ ecore_x_window_children_get(root, &new_item->nr_of_wins);
+ new_item->i = new_item->nr_of_wins - 1;
+
+ win_stack = NULL;
+
+ if (new_item->wins) {
+ win_stack = eina_list_append(win_stack, new_item);
+ } else {
+ DbgFree(new_item);
+ }
+
+ while (pid < 0 && (item = eina_list_nth(win_stack, 0))) {
+ win_stack = eina_list_remove(win_stack, item);
+
+ if (!item->wins) {
+ DbgFree(item);
+ continue;
+ }
+
+ while (item->i >= 0) {
+ ret = item->wins[item->i];
+
+ /*
+ * Now we don't need to care about visibility of window,
+ * just check whether it is registered or not.
+ * (ecore_x_window_visible_get(ret))
+ */
+ if (ecore_x_window_visible_get(ret) == EINA_TRUE) {
+ Ecore_X_Window user_win;
+
+ user_win = get_user_created_window(ret);
+ if (user_win && get_window_info(ret, user_win, &pid, command) == DBOX_STATUS_ERROR_NONE) {
+ break;
+ } else {
+ _D("Failed to get win info: %x\n", ret);
+ }
+ }
+
+ new_item = malloc(sizeof(*new_item));
+ if (!new_item) {
+ _E("Error %s\n", strerror(errno));
+ item->i++;
+ continue;
+ }
+
+ new_item->nr_of_wins = 0;
+ new_item->wins =
+ ecore_x_window_children_get(ret,
+ &new_item->nr_of_wins);
+ new_item->i = new_item->nr_of_wins - 1;
+ if (new_item->wins) {
+ win_stack =
+ eina_list_append(win_stack, new_item);
+ } else {
+ DbgFree(new_item);
+ }
+
+ item->i--;
+ }
+
+ DbgFree(item->wins);
+ DbgFree(item);
+ }
+
+ EINA_LIST_FREE(win_stack, item) {
+ DbgFree(item->wins);
+ DbgFree(item);
+ }
+
+ return pid;
+}
+
+/*!
+ *
+ * usage)
+ * app_service(...)
+ * {
+ * if (power_key pressed) {
+ * int pid;
+ * pid = util_find_top_visible_window();
+ * if (pid == getpid()) {
+ * // if (first page) {
+ * // LCD_OFF
+ * // } else {
+ * // SCROLL TO THE FIRST PAGE
+ * // }
+ * } else {
+ * // elm_win_activate(my_win);
+ * }
+ * }
+ *
+ */
+
+
+
+////////////////////////////////////////////////////////////////////
+// Apps util
+
+HAPI void _evas_object_event_changed_size_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Coord w, h;
+
+ evas_object_size_hint_min_get(obj, &w, &h);
+ _D("%s : min (%d:%d)", data, w, h);
+
+ evas_object_size_hint_max_get(obj, &w, &h);
+ _D("%s : max (%d:%d)", data, w, h);
+}
+
+
+
+HAPI void _evas_object_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Coord x;
+ Evas_Coord y;
+ Evas_Coord w;
+ Evas_Coord h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ _D("%s(%p) is resized to (%d, %d, %d, %d)", data, obj, x, y, w, h);
+
+ evas_object_size_hint_min_get(obj, &w, &h);
+ _D("%s : min (%d:%d)", data, w, h);
+
+ evas_object_size_hint_max_get(obj, &w, &h);
+ _D("%s : max (%d:%d)", data, w, h);
+}
+
+
+
+void _evas_object_event_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ _D("%s(%p) IS REMOVED!", (const char *) data, obj);
+}
+
+
+
+void _evas_object_event_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Coord x;
+ Evas_Coord y;
+ Evas_Coord w;
+ Evas_Coord h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ _D("%s's GEOMETRY : [%d, %d, %d, %d]", (const char *) data, x, y, w, h);
+}
+
+
+
+void _evas_object_event_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Coord x;
+ Evas_Coord y;
+ Evas_Coord w;
+ Evas_Coord h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ _D("%s(%p)'s GEOMETRY : [%d, %d, %d, %d]", (const char *) data, obj, x, y, w, h);
+}
+
+
+
+void _evas_object_event_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Coord x;
+ Evas_Coord y;
+ Evas_Coord w;
+ Evas_Coord h;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ _D("%s(%p)'s GEOMETRY : [%d, %d, %d, %d]", (const char *) data, obj, x, y, w, h);
+}
+
+
+
+static Eina_Bool _unblock_cb(void *data)
+{
+ retv_if(NULL == data, EINA_FALSE);
+ apps_layout_unblock(data);
+
+ return EINA_FALSE;
+}
+
+
+
+HAPI void apps_util_post_message_for_launch_fail(const char *name)
+{
+ ret_if(NULL == name);
+
+ int len = strlen(_("IDS_AT_TPOP_UNABLE_TO_OPEN_PS")) + strlen(name) + SPARE_LEN;
+
+ char *inform = calloc(len, sizeof(char));
+ ret_if(NULL == inform);
+
+ snprintf(inform, len, _("IDS_AT_TPOP_UNABLE_TO_OPEN_PS"), name);
+ notification_status_message_post(inform);
+
+ free(inform);
+
+ return;
+}
+
+
+
+static void _svc_cb(bundle *b, int request_code, appsvc_result_val result, void *data)
+{
+ _D("Request code : %d");
+
+ if (result != APPSVC_RES_OK) {
+ char* inform;
+ char* inform_with_ret;
+ int len;
+
+ const char *name = data;
+ ret_if(NULL == name);
+
+ // IDS_AT_TPOP_UNABLE_TO_OPEN_PS : "Unable to open %s"
+ len = strlen(_("IDS_AT_TPOP_UNABLE_TO_OPEN_PS")) + strlen(name) + SPARE_LEN;
+
+ inform = calloc(len, sizeof(char));
+ if (!inform) {
+ _E("cannot calloc for information");
+ return;
+ }
+ snprintf(inform, len, _("IDS_AT_TPOP_UNABLE_TO_OPEN_PS"), name);
+
+ inform_with_ret = calloc(len, sizeof(char));
+ if (!inform_with_ret) {
+ _E("cannot calloc for information");
+ free(inform);
+ return;
+ }
+ snprintf(inform_with_ret, len, "%s(%d)", inform, result);
+ notification_status_message_post(inform_with_ret);
+
+ free(inform);
+ free(inform_with_ret);
+ }
+}
+
+
+
+#define LAUNCH_WITH_SPECIAL_ROUTINE false
+#define PACKAGE_ORANGE_WORLD "dynamicboxMor.orangeMobile"
+static bool _launch_special_package(const char *package, const char *name)
+{
+ retv_if(NULL == package, false);
+ retv_if(NULL == name, false);
+
+ if (!strcmp(package, PACKAGE_ORANGE_WORLD)) {
+ _D("Special launch for %s", PACKAGE_ORANGE_WORLD);
+ bundle *b = bundle_create();
+ retv_if(NULL == b, false);
+
+ appsvc_set_operation(b, APPSVC_OPERATION_VIEW);
+ appsvc_set_uri(b, "http://m.orange.fr");
+ appsvc_run_service(b, 0, _svc_cb, (void *) name);
+
+ bundle_free(b);
+
+ return true;
+ }
+
+ return false;
+}
+
+
+
+#define LAYOUT_BLOCK_INTERVAL 1.0
+HAPI void apps_util_launch(Evas_Object *win, const char *package, const char *name)
+{
+ ret_if(NULL == package);
+
+ if (!name) name = package;
+ if (LAUNCH_WITH_SPECIAL_ROUTINE && _launch_special_package(package, name)) {
+ return;
+ }
+
+ home_dbus_cpu_booster_signal_send();
+
+ int ret_aul = aul_open_app(package);
+ if (ret_aul < AUL_R_OK) {
+
+ if(ret_aul == AUL_R_EREJECTED && cooldown_mode_warning_get()) {
+ util_create_toast_popup(win, _("IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"));
+ }
+ else {
+ char* inform;
+ char* inform_with_ret;
+ int len;
+
+ // IDS_AT_TPOP_UNABLE_TO_OPEN_PS : "Unable to open %s"
+ len = strlen(_("IDS_AT_TPOP_UNABLE_TO_OPEN_PS")) + strlen(name) + SPARE_LEN;
+
+ inform = calloc(len, sizeof(char));
+ if (!inform) {
+ _E("cannot calloc for information");
+ return;
+ }
+ snprintf(inform, len, _("IDS_AT_TPOP_UNABLE_TO_OPEN_PS"), name);
+
+ inform_with_ret = calloc(len, sizeof(char));
+ if (!inform_with_ret) {
+ _E("cannot calloc for information");
+ free(inform);
+ return;
+ }
+ snprintf(inform_with_ret, len, "%s(%d)", inform, ret_aul);
+ notification_status_message_post(inform_with_ret);
+
+ free(inform);
+ free(inform_with_ret);
+ }
+ } else {
+ apps_util_notify_to_home(ret_aul);
+ _D("Launch app's ret : [%d]", ret_aul);
+ _T(package);
+
+ Evas_Object *layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ ret_if(NULL == layout);
+ apps_layout_block(layout);
+ ecore_timer_add(LAYOUT_BLOCK_INTERVAL, _unblock_cb, layout);
+ }
+}
+
+
+
+HAPI void apps_util_launch_main_operation(Evas_Object *win, const char *app_id, const char *name)
+{
+ ret_if(NULL == app_id);
+
+ if (!name) name = app_id;
+ app_control_h service = NULL;
+ ret_if(APP_CONTROL_ERROR_NONE != app_control_create(&service));
+ ret_if(NULL == service);
+
+ app_control_set_operation(service, APP_CONTROL_OPERATION_MAIN);
+ app_control_set_app_id(service, app_id);
+
+ home_dbus_cpu_booster_signal_send();
+
+ int ret = app_control_send_launch_request(service, NULL, NULL);
+ if (APP_CONTROL_ERROR_NONE != ret) {
+
+ if(ret == APP_CONTROL_ERROR_LAUNCH_REJECTED && cooldown_mode_warning_get()) {
+ util_create_toast_popup(win, _("IDS_SM_BODY_THE_DEVICE_TEMPERATURE_IS_TOO_HIGH"));
+ }
+ else {
+ char* inform;
+ char* inform_with_ret;
+ int len;
+
+ // IDS_AT_TPOP_UNABLE_TO_OPEN_PS : "Unable to open %s"
+ len = strlen(_("IDS_AT_TPOP_UNABLE_TO_OPEN_PS")) + strlen(name) + SPARE_LEN;
+
+ inform = calloc(len, sizeof(char));
+ if (!inform) {
+ _E("cannot calloc for information");
+ goto ERROR;
+ }
+ snprintf(inform, len, _("IDS_AT_TPOP_UNABLE_TO_OPEN_PS"), name);
+
+ inform_with_ret = calloc(len, sizeof(char));
+ if (!inform_with_ret) {
+ _E("cannot calloc for information");
+ free(inform);
+ goto ERROR;
+ }
+ snprintf(inform_with_ret, len, "%s(%d)", inform, ret);
+ notification_status_message_post(inform_with_ret);
+
+ free(inform);
+ free(inform_with_ret);
+ }
+ } else {
+ _SD("Launch an app(%s:%s) ret : [%d]", app_id, name, ret);
+ _T(app_id);
+
+ Evas_Object *layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ ret_if(NULL == layout);
+ apps_layout_block(layout);
+ ecore_timer_add(LAYOUT_BLOCK_INTERVAL, _unblock_cb, layout);
+ }
+
+ERROR:
+ app_control_destroy(service);
+}
+
+
+
+HAPI void apps_util_launch_with_arg(Evas_Object *win, const char *app_id, const char *arg, const char *name)
+{
+ ret_if(NULL == app_id);
+ ret_if(NULL == arg);
+
+ if (!name) name = app_id;
+ if (LAUNCH_WITH_SPECIAL_ROUTINE && _launch_special_package(app_id, name)) {
+ return;
+ }
+
+ _SD("Argument:(%s)", arg);
+ int len = strlen(arg);
+
+ bundle *b = NULL;
+ b = bundle_decode((bundle_raw *) arg, len);
+
+ /* AUL requests : Reset the caller appid as App-tray */
+ const char *value = bundle_get_val(b, AUL_K_CALLER_APPID);
+ if (value) bundle_del(b, AUL_K_CALLER_APPID);
+
+ home_dbus_cpu_booster_signal_send();
+
+ int ret = aul_launch_app(app_id, b);
+ bundle_free(b);
+
+ if (0 > ret) {
+ char* inform;
+ char* inform_with_ret;
+ int len;
+
+ // IDS_AT_TPOP_UNABLE_TO_OPEN_PS : "Unable to open %s"
+ len = strlen(_("IDS_AT_TPOP_UNABLE_TO_OPEN_PS")) + strlen(name) + SPARE_LEN;
+
+ inform = calloc(len, sizeof(char));
+ if (!inform) {
+ _E("cannot calloc for information");
+ return;
+ }
+ snprintf(inform, len, _("IDS_AT_TPOP_UNABLE_TO_OPEN_PS"), name);
+
+ inform_with_ret = calloc(len, sizeof(char));
+ if (!inform_with_ret) {
+ _E("cannot calloc for information");
+ free(inform);
+ return;
+ }
+ snprintf(inform_with_ret, len, "%s(%d)", inform, ret);
+ notification_status_message_post(inform_with_ret);
+
+ free(inform);
+ free(inform_with_ret);
+ } else {
+ _SD("Launch an app(%s:%s) ret : [%d]", app_id, name, ret);
+ _T(app_id);
+
+ Evas_Object *layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ ret_if(NULL == layout);
+ apps_layout_block(layout);
+ ecore_timer_add(LAYOUT_BLOCK_INTERVAL, _unblock_cb, layout);
+ }
+}
+
+
+
+HAPI void apps_util_launch_with_bundle(Evas_Object *win, const char *app_id, bundle *b, const char *name)
+{
+ ret_if(NULL == app_id);
+ ret_if(NULL == b);
+
+ if (!name) name = app_id;
+ if (LAUNCH_WITH_SPECIAL_ROUTINE && _launch_special_package(app_id, name)) {
+ return;
+ }
+
+ home_dbus_cpu_booster_signal_send();
+
+ int ret = aul_launch_app(app_id, b);
+ if (0 > ret) {
+ char* inform;
+ char* inform_with_ret;
+ int len;
+
+ // IDS_AT_TPOP_UNABLE_TO_OPEN_PS : "Unable to open %s"
+ len = strlen(_("IDS_AT_TPOP_UNABLE_TO_OPEN_PS")) + strlen(name) + SPARE_LEN;
+
+ inform = calloc(len, sizeof(char));
+ if (!inform) {
+ _E("cannot calloc for information");
+ return;
+ }
+ snprintf(inform, len, _("IDS_AT_TPOP_UNABLE_TO_OPEN_PS"), name);
+
+ inform_with_ret = calloc(len, sizeof(char));
+ if (!inform_with_ret) {
+ _E("cannot calloc for information");
+ free(inform);
+ return;
+ }
+ snprintf(inform_with_ret, len, "%s(%d)", inform, ret);
+ notification_status_message_post(inform_with_ret);
+
+ free(inform);
+ free(inform_with_ret);
+ } else {
+ _SD("Launch an app(%s:%s) ret : [%d]", app_id, name, ret);
+ _T(app_id);
+
+ Evas_Object *layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ ret_if(NULL == layout);
+ apps_layout_block(layout);
+ ecore_timer_add(LAYOUT_BLOCK_INTERVAL, _unblock_cb, layout);
+ }
+}
+
+
+
+HAPI void apps_util_notify_to_home(int pid)
+{
+ int ret;
+ char *pkgname;
+
+ if (pid <= 0)
+ return;
+
+ pkgname = vconf_get_str("db/setting/menuscreen/package_name");
+ if (!pkgname)
+ return;
+
+ if (strcmp(pkgname, "org.tizen.cluster-home")) {
+ free(pkgname);
+ return;
+ }
+
+ ret = vconf_set_int("memory/cluster-home/ignore-resume", 1);
+ if (ret != 0) {
+ // Error
+ }
+ _D("Service: (%s)%d\n", pkgname, ret);
+ free(pkgname);
+}
+
+
+
+static void _toast_popup_destroy_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *popup = obj;
+ ret_if(!popup);
+
+ evas_object_del(popup);
+
+ Evas_Object *parent = data;
+ ret_if(!parent);
+
+ evas_object_data_del(parent, DATA_KEY_POPUP);
+}
+
+
+
+static char *_toast_popup_access_info_cb(void *data, Evas_Object *obj)
+{
+ retv_if(!data, NULL);
+
+ char *tmp = strdup((char*)data);
+ retv_if(!tmp, NULL);
+
+ return tmp;
+}
+
+
+
+/* This API is not allowed to use on the others */
+extern Evas_Object *elm_object_part_access_object_get(const Evas_Object *obj, const char *part);
+#define UTIL_TOAST_POPUP_TIMER 3.0
+int util_create_toast_popup(Evas_Object *parent, const char* text)
+{
+ retv_if(!parent, EINA_FALSE);
+
+ Evas_Object *popup = elm_popup_add(parent);
+ retv_if(!popup, EINA_FALSE);
+
+ elm_object_style_set(popup, "toast");
+ elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ elm_object_part_text_set(popup, "elm.text", text);
+ elm_object_domain_translatable_part_text_set(popup, "elm.text", PROJECT, text);
+
+ Evas_Object *ao = elm_object_part_access_object_get(popup, "access.outline");
+ elm_access_info_cb_set(ao, ELM_ACCESS_TYPE, _toast_popup_access_info_cb, text);
+
+ if(main_get_info()->is_tts == EINA_FALSE)
+ elm_popup_timeout_set(popup, UTIL_TOAST_POPUP_TIMER);
+
+ evas_object_smart_callback_add(popup, "block,clicked", _toast_popup_destroy_cb, parent);
+ evas_object_smart_callback_add(popup, "timeout", _toast_popup_destroy_cb, parent);
+
+ evas_object_data_set(parent, DATA_KEY_POPUP, popup);
+
+ evas_object_show(popup);
+
+ return EINA_TRUE;
+}
+
+
+
+#define POPUP_EDJ EDJEDIR"/popup.edj"
+int util_create_check_popup(Evas_Object *parent, const char* text, void _clicked_cb(void *, Evas_Object *, void *))
+{
+ Evas_Object *popup = NULL;
+ Evas_Object *popup_scroller = NULL;
+ Evas_Object *popup_layout_inner = NULL;
+ Evas_Object *label = NULL;
+ Evas_Object *check = NULL;
+ Evas_Object *button = NULL;
+
+ retv_if(!parent, EINA_FALSE);
+
+ if (evas_object_data_get(parent, DATA_KEY_CHECK_POPUP)) return EINA_TRUE;
+
+ popup = elm_popup_add(parent);
+ retv_if(!popup, EINA_FALSE);
+
+ elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ popup_scroller = elm_scroller_add(popup);
+ goto_if(!popup_scroller, ERROR);
+ elm_object_style_set(popup_scroller, "effect");
+ evas_object_size_hint_weight_set(popup_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_scroller_content_min_limit(popup_scroller, EINA_FALSE, EINA_TRUE);
+ evas_object_size_hint_max_set(popup_scroller, -1, 377);
+ elm_object_content_set(popup, popup_scroller);
+ evas_object_show(popup_scroller);
+
+ popup_layout_inner = elm_layout_add(popup_scroller);
+ goto_if(!popup_layout_inner, ERROR);
+ elm_layout_file_set(popup_layout_inner, POPUP_EDJ, "popup_checkview_internal");
+ evas_object_size_hint_weight_set(popup_layout_inner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(popup_scroller, popup_layout_inner);
+
+ label = elm_label_add(popup_layout_inner);
+ goto_if(!label, ERROR);
+ elm_object_style_set(label, "popup/default");
+ elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
+ elm_object_text_set(label, _("IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE"));
+ elm_object_domain_translatable_text_set(label, PROJECT, "IDS_HS_POP_TO_INSTALL_OR_UNINSTALL_APPLICATIONS_USE_THE_SAMSUNG_GEAR_APPLICATION_ON_YOUR_MOBILE_DEVICE");
+ evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ elm_object_part_content_set(popup_layout_inner, "label", label);
+
+ check = elm_check_add(popup);
+ goto_if(!check, ERROR);
+ elm_object_style_set(check, "popup");
+ elm_object_text_set(check, _("IDS_CLOCK_BODY_DONT_REPEAT_ABB"));
+ elm_object_domain_translatable_text_set(check, PROJECT, "IDS_CLOCK_BODY_DONT_REPEAT_ABB");
+ elm_object_part_content_set(popup_layout_inner, "elm.swallow.end", check);
+ evas_object_show(check);
+ evas_object_data_set(popup, DATA_KEY_CHECK, check);
+
+ button = elm_button_add(popup);
+ goto_if(!button, ERROR);
+ elm_object_style_set(button, "popup");
+ elm_object_text_set(button, _("IDS_ST_BUTTON_OK"));
+ elm_object_domain_translatable_text_set(button, PROJECT, "IDS_ST_BUTTON_OK");
+ elm_object_part_content_set(popup, "button1", button);
+ evas_object_smart_callback_add(button, "clicked", _clicked_cb, parent);
+
+ evas_object_data_set(parent, DATA_KEY_CHECK_POPUP, popup);
+ evas_object_show(popup);
+
+ return EINA_TRUE;
+
+ERROR:
+ if (popup) evas_object_del(popup);
+ return EINA_FALSE;
+}
+
+
+
+static char *_get_app_id(const char *pkgname)
+{
+ int ret = 0;
+ char *appid = 0;
+ pkgmgrinfo_pkginfo_h handle = NULL;
+ retv_if(pkgname == NULL, NULL);
+
+ ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgname, &handle);
+ if (ret != PMINFO_R_OK) {
+ _E("Failed to get pkg information from pkgmgr");
+ goto ERR;
+ }
+ ret = pkgmgrinfo_pkginfo_get_mainappid(handle, &appid);
+ if (ret != PMINFO_R_OK) {
+ _E("Failed to get mainapp ID information from pkgmgr");
+ goto ERR;
+ }
+
+ if (appid != NULL) {
+ appid = strdup(appid);
+ }
+ERR:
+ if (handle != NULL) {
+ pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+ }
+
+ return appid;
+}
+
+
+
+static char *_get_app_pkgname(const char *appid)
+{
+ int ret = 0;
+ char *pkgname = NULL;
+ pkgmgrinfo_appinfo_h handle = NULL;
+ retv_if(appid == NULL, NULL);
+
+ ret = pkgmgrinfo_appinfo_get_appinfo(appid, &handle);
+ if (ret != PMINFO_R_OK) {
+ _E("Failed to get app information from pkgmgr");
+ goto ERR;
+ }
+
+ ret = pkgmgrinfo_appinfo_get_pkgname(handle, &pkgname);
+ if (ret != PMINFO_R_OK) {
+ _E("Failed to get pkgname from app info handler");
+ goto ERR;
+ }
+ if (pkgname != NULL) {
+ pkgname = strdup(pkgname);
+ }
+
+ERR:
+ if (handle != NULL) {
+ pkgmgrinfo_appinfo_destroy_appinfo(handle);
+ }
+
+ return pkgname;
+}
+
+
+
+static int _get_app_type(char *pkgname)
+{
+ int ret = 0;
+ char *apptype = NULL;
+ pkgmgrinfo_pkginfo_h handle = NULL;
+ retv_if(pkgname == NULL, APP_TYPE_NATIVE);
+
+ ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgname, &handle);
+ if (ret != PMINFO_R_OK) {
+ _E("Failed to get pkg information from pkgmgr");
+ goto ERR;
+ }
+ ret = pkgmgrinfo_pkginfo_get_type(handle, &apptype);
+ if (ret != PMINFO_R_OK) {
+ _E("Failed to get app type from pkginfo handler");
+ goto ERR;
+ }
+
+ if (apptype != NULL) {
+ if (strcmp(apptype, "wgt") == 0) {
+ return APP_TYPE_WEB;
+ } else {
+ return APP_TYPE_NATIVE;
+ }
+ }
+ERR:
+ if (handle != NULL) {
+ pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+ }
+
+ return APP_TYPE_NATIVE;
+}
+
+
+
+HAPI int util_get_app_type(const char *appid)
+{
+ int pkgtype = APP_TYPE_NATIVE;
+ char *pkgname = NULL;
+ retv_if(appid == NULL, APP_TYPE_NATIVE);
+
+ pkgname = _get_app_pkgname(appid);
+ if(pkgname == NULL) {
+ _E("Failed to get pkgname");
+ goto DONE;
+ }
+ pkgtype = _get_app_type(pkgname);
+
+DONE:
+ free(pkgname);
+
+ return pkgtype;
+}
+
+
+
+/*
+ * This APIs should be used only for the packages which have only one app
+ * returned pointer have to be free by you
+ */
+HAPI char *util_get_pkgname_by_appid(const char *appid)
+{
+ return _get_app_pkgname(appid);
+}
+
+
+
+HAPI char *util_get_appid_by_pkgname(const char *pkgname)
+{
+ return _get_app_id(pkgname);
+}
+
+
+
+HAPI const char *util_basename(const char *name)
+{
+ int length;
+ length = name ? strlen(name) : 0;
+ if (!length) {
+ return ".";
+ }
+
+ while (--length > 0 && name[length] != '/');
+
+ return length <= 0 ? name : (name + length + (name[length] == '/'));
+}
+
+
+
+HAPI double util_timestamp(void)
+{
+#if defined(_USE_ECORE_TIME_GET)
+ return ecore_time_get();
+#else
+ struct timeval tv;
+ if (gettimeofday(&tv, NULL) < 0) {
+ static unsigned long internal_count = 0;
+ _E("failed to get time of day: %s\n", strerror(errno));
+ tv.tv_sec = internal_count++;
+ tv.tv_usec = 0;
+ }
+
+ return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0f;
+#endif
+}
+
+
+
+HAPI void util_activate_home_window(void)
+{
+ if (apps_main_is_visible() == EINA_TRUE) {
+ apps_main_launch(APPS_LAUNCH_HIDE);
+ }
+
+ Evas_Object *win = main_get_info()->win;
+ if (win) {
+ elm_win_activate(win);
+ }
+}
+// End of a file
diff --git a/home/src/virtual_canvas.c b/home/src/virtual_canvas.c
new file mode 100755
index 0000000..a7e5d2b
--- /dev/null
+++ b/home/src/virtual_canvas.c
@@ -0,0 +1,204 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Ecore_Evas.h>
+#include <Ecore_X.h>
+#include <dlog.h>
+#include <stdbool.h>
+#include <bundle.h>
+
+#include "log.h"
+#include "util.h"
+#include "virtual_canvas.h"
+
+#define QUALITY_N_COMPRESS "quality=100 compress=1"
+#define PRIVATE_DATA_KEY_DATA "dt"
+
+
+
+HAPI Evas *virtual_canvas_create(int w, int h)
+{
+ Ecore_Evas *internal_ee;
+ Evas *internal_e;
+
+ // Create virtual canvas
+ internal_ee = ecore_evas_buffer_new(w, h);
+ if (!internal_ee) {
+ _D("Failed to create a new canvas buffer\n");
+ return NULL;
+ }
+
+ ecore_evas_alpha_set(internal_ee, EINA_TRUE);
+ ecore_evas_manual_render_set(internal_ee, EINA_TRUE);
+
+ // Get the "Evas" object from a virtual canvas
+ internal_e = ecore_evas_get(internal_ee);
+ if (!internal_e) {
+ ecore_evas_free(internal_ee);
+ _D("Faield to get Evas object\n");
+ return NULL;
+ }
+
+ return internal_e;
+}
+
+
+
+static bool _flush_data_to_file(Evas *e, char *data, const char *filename, int w, int h)
+{
+ Evas_Object *output;
+
+ output = evas_object_image_add(e);
+ if (!output) {
+ _D("Failed to create an image object\n");
+ return false;
+ }
+
+ evas_object_image_colorspace_set(output, EVAS_COLORSPACE_ARGB8888);
+ evas_object_image_alpha_set(output, EINA_TRUE);
+ evas_object_image_size_set(output, w, h);
+ evas_object_image_smooth_scale_set(output, EINA_TRUE);
+ evas_object_image_data_set(output, data);
+ evas_object_image_data_update_add(output, 0, 0, w, h);
+
+ if (evas_object_image_save(output, filename, NULL, QUALITY_N_COMPRESS) == EINA_FALSE) {
+ evas_object_del(output);
+ _SD("Failed to save a captured image (%s)\n", filename);
+ return false;
+ }
+
+ evas_object_del(output);
+
+ if (access(filename, F_OK) != 0) {
+ _SD("File %s is not found\n", filename);
+ return false;
+ }
+
+ return true;
+}
+
+
+
+EAPI bool virtual_canvas_flush_to_file(Evas *e, const char *filename, int w, int h)
+{
+ void *data;
+ Ecore_Evas *internal_ee;
+
+ internal_ee = ecore_evas_ecore_evas_get(e);
+ if (!internal_ee) {
+ _D("Failed to get ecore evas\n");
+ return false;
+ }
+
+ ecore_evas_manual_render(internal_ee);
+
+ // Get a pointer of a buffer of the virtual canvas
+ data = (void *) ecore_evas_buffer_pixels_get(internal_ee);
+ if (!data) {
+ _D("Failed to get pixel data\n");
+ return false;
+ }
+
+ return _flush_data_to_file(e, data, filename, w, h);
+}
+
+
+
+#define INDICATOR_HEIGHT 30.0
+static Evas_Object *_load_file(Evas *e, const char *file, int w, int h)
+{
+ Evas_Object *output = evas_object_image_filled_add(e);
+ retv_if(NULL == output, NULL);
+
+ int file_w, file_h;
+
+ evas_object_image_smooth_scale_set(output, EINA_TRUE);
+ evas_object_image_load_size_set(output, w, h);
+ evas_object_image_file_set(output, file, NULL);
+
+ int ret = evas_object_image_load_error_get(output);
+ if (EVAS_LOAD_ERROR_NONE != ret) _E("Cannot load a file (%d, %s)", ret, file);
+
+ evas_object_image_size_get(output, &file_w, &file_h);
+ evas_object_image_fill_set(output, 0, 0, file_w, file_h);
+
+ float file_r = (float) file_w / (float) file_h;
+ float canvas_r = (float) w / ((float) h + INDICATOR_HEIGHT);
+
+ int new_w = file_w;
+ if (file_r > canvas_r) new_w = (float) file_h * (float) canvas_r;
+
+ float r = (float) w / (float) new_w;
+ file_w = (float) file_w * r;
+ file_h = (float) file_h * r;
+
+ evas_object_resize(output, file_w, file_h);
+ evas_object_move(output, 0, (-INDICATOR_HEIGHT * r));
+ evas_object_show(output);
+
+ return output;
+}
+
+
+
+void _del_ee_cb(Ecore_Evas *ee)
+{
+ Evas_Object *eoi = ecore_evas_data_get(ee, PRIVATE_DATA_KEY_DATA);
+ evas_object_del(eoi);
+}
+
+
+
+HAPI void *virtual_canvas_load_file_to_data(Evas *e, const char *file, int w, int h)
+{
+ Evas_Object *eoi = _load_file(e, file, w, h);
+ retv_if(NULL == eoi, NULL);
+
+ Ecore_Evas *internal_ee = ecore_evas_ecore_evas_get(e);
+ if (NULL == internal_ee) {
+ evas_object_del(eoi);
+ return NULL;
+ }
+
+ ecore_evas_data_set(internal_ee, PRIVATE_DATA_KEY_DATA, eoi);
+ ecore_evas_manual_render(internal_ee);
+ ecore_evas_callback_pre_free_set(internal_ee, _del_ee_cb);
+
+ // Get a pointer of a buffer of the virtual canvas
+ return (void *) ecore_evas_buffer_pixels_get(internal_ee);
+}
+
+
+
+HAPI bool virtual_canvas_destroy(Evas *e)
+{
+ Ecore_Evas *ee;
+
+ ee = ecore_evas_ecore_evas_get(e);
+ if (!ee) {
+ _D("Failed to ecore evas object\n");
+ return false;
+ }
+
+ ecore_evas_free(ee);
+ return true;
+}
+
+
+
+// End of a file
diff --git a/home/src/win.c b/home/src/win.c
new file mode 100755
index 0000000..fe0a3ba
--- /dev/null
+++ b/home/src/win.c
@@ -0,0 +1,146 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <app.h>
+#include <Ecore_X.h>
+#include <Elementary.h>
+#include <Evas.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "log.h"
+#include "util.h"
+#include "main.h"
+
+
+
+#ifdef BOOT_OPTIMIZATION
+static w_home_error_e _rotate_cb(main_s *info, int angle)
+{
+ _D("Enter _rotate, angle is %d", angle);
+ info->angle = angle;
+
+ switch (angle) {
+ case 0:
+ _D("Portrait normal");
+ info->is_rotated = 0;
+ break;
+ case 90:
+ _D("Landscape reverse");
+ info->is_rotated = 1;
+ break;
+ case 180:
+ _D("Portrait reverse");
+ info->is_rotated = 0;
+ break;
+ case 270:
+ _D("Landscape normal");
+ info->is_rotated = 1;
+ break;
+ default:
+ _E("Cannot reach here, angle is %d", angle);
+ }
+
+ /* Rotate all objects */
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static void _rotation_changed_cb(void *data, Evas_Object *obj, void *event)
+{
+ main_s *info = data;
+ int changed_ang;
+
+ ret_if(!info);
+
+ changed_ang = elm_win_rotation_get(info->win);
+ if (changed_ang != info->angle) {
+ _rotate_cb(info, changed_ang);
+ }
+}
+#endif
+
+
+
+HAPI Evas_Object *win_create(const char *name)
+{
+ Evas_Object *win = NULL;
+ main_s *info = NULL;
+ Ecore_X_Window xwin;
+
+ info = main_get_info();
+ retv_if(!info, NULL);
+
+ /* Open GL backend */
+ elm_config_preferred_engine_set("opengl_x11");
+ ecore_x_window_size_get(ecore_x_window_root_first_get(), &info->root_w, &info->root_h);
+
+#if 0 // Doesn't support app_get_preinitialized_window in the wearables
+ win = (Evas_Object *) app_get_preinitialized_window(name);
+ if (!win) win = elm_win_add(NULL, name, ELM_WIN_BASIC);
+#else
+ win = elm_win_add(NULL, name, ELM_WIN_BASIC);
+#endif
+ retv_if(!win, NULL);
+
+ elm_win_title_set(win, name);
+ elm_win_borderless_set(win, EINA_TRUE);
+ elm_win_alpha_set(win, EINA_FALSE);
+ elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_HIDE);
+ elm_win_indicator_opacity_set(win, ELM_WIN_INDICATOR_BG_TRANSPARENT);
+
+#ifdef BOOT_OPTIMIZATION
+ /* Set available rotations */
+ if (elm_win_wm_rotation_supported_get(win)) {
+ const int rots[4] = {0, 90, 180, 270};
+ elm_win_wm_rotation_available_rotations_set(win, (const int *) &rots, 4);
+ _D("Set available rotations, {0, 90, 180, 270}");
+ }
+ evas_object_smart_callback_add(win, "wm,rotation,changed", _rotation_changed_cb, info);
+#endif
+
+ evas_object_resize(win, info->root_w, info->root_h);
+ evas_object_show(win);
+ info->win = win;
+ info->e = evas_object_evas_get(win);
+
+ xwin = elm_win_xwindow_get(win);
+ ecore_x_vsync_animator_tick_source_set(xwin);
+
+ return win;
+}
+
+
+
+HAPI void win_destroy(Evas_Object *win)
+{
+ main_s *info = NULL;
+
+ ret_if(!win);
+
+ info = main_get_info();
+ ret_if(!info);
+
+ evas_object_del(win);
+ info->win = NULL;
+}
+
+
+
+// End of a file
diff --git a/home/src/wms.c b/home/src/wms.c
new file mode 100755
index 0000000..719968b
--- /dev/null
+++ b/home/src/wms.c
@@ -0,0 +1,262 @@
+/*
+ * W-Home
+ *
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *
+ * 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 <app_control.h>
+#include <dynamicbox_service.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+#include <Elementary.h>
+
+#include "log.h"
+#include "util.h"
+#include "db.h"
+#include "page.h"
+#include "dbox.h"
+#include "wms.h"
+#include "conf.h"
+#include "layout_info.h"
+#include "xml.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "apps/apps_main.h"
+#include "apps/xml.h"
+#include "main.h"
+
+
+
+void wms_change_apps_order(int value)
+{
+ switch(value)
+ {
+ case W_HOME_WMS_BACKUP:
+ _D("Backup");
+ apps_main_list_backup();
+
+ //Have to set the DONE, 3, to notify that backup is completed.
+ vconf_set_int(VCONF_KEY_WMS_APPS_ORDER, W_HOME_WMS_DONE);
+
+ break;
+ case W_HOME_WMS_RESOTRE:
+ _D("Restore");
+ wms_unregister_setup_wizard_vconf();
+ apps_main_list_restore();
+ break;
+ case W_HOME_WMS_DONE:
+ _D("done");
+ //No need to do anything
+ break;
+ default:
+ _E("Invalid value:[%d]", value);
+ break;
+ }
+}
+
+
+
+#define FAVORITES_ORDER_XML_PATH DATADIR"/favorites_order.xml"
+void wms_change_favorite_order(int value)
+{
+ Evas_Object *layout = NULL;
+ layout_info_s *layout_info = NULL;
+ Eina_List *page_info_list = NULL;
+
+ layout = evas_object_data_get(main_get_info()->win, DATA_KEY_LAYOUT);
+ ret_if(!layout);
+
+ layout_info = evas_object_data_get(layout, DATA_KEY_LAYOUT_INFO);
+ ret_if(!layout_info);
+
+ switch(value)
+ {
+ case W_HOME_WMS_BACKUP:
+ _D("Favorite Backup");
+
+ page_info_list = scroller_write_list(layout_info->scroller);
+ if (page_info_list) {
+ xml_read_list(FAVORITES_ORDER_XML_PATH, page_info_list);
+ }
+
+ //Have to set the DONE, 3, to notify that backup is completed.
+ vconf_set_int(VCONF_KEY_WMS_FAVORITES_ORDER, W_HOME_WMS_DONE);
+
+ break;
+ case W_HOME_WMS_RESOTRE:
+ _D("Favorite Restore");
+ wms_unregister_setup_wizard_vconf();
+
+ page_info_list = xml_write_list(FAVORITES_ORDER_XML_PATH);
+ if (page_info_list) {
+ scroller_read_favorites_list(layout_info->scroller, page_info_list);
+ }
+ break;
+ case W_HOME_WMS_DONE:
+ _D("done");
+ //No need to do anything
+ break;
+ default:
+ _E("Invalid value:[%d]", value);
+ break;
+ }
+}
+
+
+static void _favorites_list_reset()
+{
+ Eina_List *page_info_list = NULL;
+ Eina_List *tmp_list = NULL;
+ const Eina_List *l, *ln;
+ page_info_s *page_info = NULL;
+ char *pkgname = NULL;
+
+ page_info_list = db_write_list();
+ ret_if(!page_info_list);
+
+ EINA_LIST_FOREACH_SAFE(page_info_list, l, ln, page_info) {
+ continue_if(!page_info);
+ continue_if(!page_info->id);
+
+ pkgname = dynamicbox_service_dbox_id(page_info->id);
+ if (pkgname) {
+ tmp_list = eina_list_append(tmp_list, page_info);
+ free(pkgname);
+ } else {
+ _D("%s is not installed in the pkgmgr DB", page_info->id);
+ }
+ }
+
+ xml_read_list(FAVORITES_ORDER_XML_PATH, tmp_list);
+}
+
+
+
+static void _order_reset()
+{
+ _D("order reset");
+
+ //Home
+ _favorites_list_reset();
+ vconf_set_int(VCONF_KEY_WMS_FAVORITES_ORDER, W_HOME_WMS_DONE);
+
+ //apps
+ apps_main_list_reset();
+ vconf_set_int(VCONF_KEY_WMS_APPS_ORDER, W_HOME_WMS_DONE);
+}
+
+
+static void _change_setup_wizard_cb(keynode_t *node, void *data)
+{
+ int value = -1;
+
+ if(vconf_get_bool(VCONFKEY_SETUP_WIZARD_FIRST_BOOT, &value) < 0) {
+ _E("Failed to get VCONFKEY_WMS_FAVORITES_ORDER");
+ return;
+ }
+
+ _SD("value is changed: [%d]", value);
+
+ if(value == 0) {
+ if (vconf_ignore_key_changed(VCONFKEY_SETUP_WIZARD_FIRST_BOOT, _change_setup_wizard_cb) < 0) {
+ _E("Failed to ignore the setup wizard firstboot callback");
+ }
+
+ _order_reset();
+ }
+}
+
+
+void wms_register_setup_wizard_vconf()
+{
+ main_s *main_info = main_get_info();
+ ret_if(!main_info);
+
+ int value = -1;
+
+ vconf_get_bool(VCONFKEY_SETUP_WIZARD_FIRST_BOOT, &value);
+
+ _SD("first boot: [%d]", value);
+
+ if(value == 1) {
+ if (vconf_notify_key_changed(VCONFKEY_SETUP_WIZARD_FIRST_BOOT, _change_setup_wizard_cb, NULL) < 0) {
+ _E("Failed to register the setup wizard firstboot callback");
+ } else {
+ main_info->setup_wizard = 1;
+ }
+ }
+}
+
+
+void wms_unregister_setup_wizard_vconf()
+{
+ main_s *main_info = main_get_info();
+ ret_if(!main_info);
+
+ _SD("first boot cb: [%d]", main_info->setup_wizard);
+
+ if(main_info->setup_wizard) {
+ if (vconf_ignore_key_changed(VCONFKEY_SETUP_WIZARD_FIRST_BOOT, _change_setup_wizard_cb) < 0) {
+ _E("Failed to ignore the setup wizard firstboot callback");
+ }
+ main_info->setup_wizard = 0;
+ }
+}
+
+
+static void _launch_gear_manager_response_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
+{
+ Evas_Object *parent = (Evas_Object*)user_data;
+ ret_if(!parent);
+
+ _APPS_D("result: %d", result);
+
+ if (result == APP_CONTROL_RESULT_SUCCEEDED) {
+ util_create_toast_popup(parent, _("IDS_HS_TPOP_DOWNLOAD_GEAR_APPLICATIONS_USING_MOBILE_DEVICE_ABB"));
+ }
+ else {
+ _APPS_E("Operation is failed: %d", result);
+ }
+}
+
+#define W_MANAGER_SERVICE_APP_ID "org.tizen.w-manager-service"
+void wms_launch_gear_manager(Evas_Object *parent, char *link)
+{
+ char *type = "gear";
+ app_control_h service = NULL;
+
+ ret_if(!link);
+ ret_if(APP_CONTROL_ERROR_NONE != app_control_create(&service));
+ ret_if(!service);
+
+ app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT);
+ app_control_set_app_id(service, W_MANAGER_SERVICE_APP_ID);
+ app_control_add_extra_data(service, "type", type);
+ app_control_add_extra_data(service, "deeplink", link);
+
+ int ret = app_control_send_launch_request(service, _launch_gear_manager_response_cb, parent);
+ if (APP_CONTROL_ERROR_NONE != ret) {
+ _APPS_E("launch fail:[%d]", ret);
+ }
+
+ app_control_destroy(service);
+}
+
+
+// End of a file
diff --git a/home/src/xml.c b/home/src/xml.c
new file mode 100755
index 0000000..7d9d5ff
--- /dev/null
+++ b/home/src/xml.c
@@ -0,0 +1,376 @@
+/*
+ * Samsung API
+ * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <aul.h>
+#include <Eina.h>
+#include <Evas.h>
+
+#include <libxml/encoding.h>
+#include <libxml/xmlwriter.h>
+#include <libxml/xmlreader.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+#include <dlog.h>
+
+#include "dynamicbox_evas.h" // DYNAMICBOX_EVAS_DEFAULT_PERIOD
+
+#include "log.h"
+#include "page_info.h"
+#include "util.h"
+#include "xml.h"
+
+const char *XML_ENCODING = "utf-8";
+const char *PAGE_CATEGORY_IDLE_CLOCK_STR = "idle-clock";
+const char *PAGE_CATEGORY_FAVORITE_STR = "favorite";
+const char *PAGE_CATEGORY_APP_WIDGET_STR = "appwidget";
+const char *PAGE_CATEGORY_MORE_APPS_STR = "more-apps";
+const int DBOX_PER_PAGE = 4;
+
+static void _get_position_by_order(int ordering, int *row, int *cellx, int *celly)
+{
+ ret_if(!row);
+ ret_if(!cellx);
+ ret_if(!celly);
+
+ *row = ordering / 4;
+
+ switch(ordering % 4) {
+ case 0:
+ *cellx = 0;
+ *celly = 0;
+ break;
+ case 1:
+ *cellx = 1;
+ *celly = 0;
+ break;
+ case 2:
+ *cellx = 0;
+ *celly = 1;
+ break;
+ case 3:
+ *cellx = 1;
+ *celly = 1;
+ break;
+ default:
+ _E("Failed to get cellx & celly");
+ *cellx = -1;
+ *celly = -1;
+ break;
+ }
+}
+
+
+
+static xmlTextWriterPtr _init_writer(const char *xml_file)
+{
+ xmlTextWriterPtr writer;
+ int ret = 0;
+
+ writer = xmlNewTextWriterFilename(xml_file, 0);
+ retv_if(!writer, NULL);
+
+ ret = xmlTextWriterStartDocument(writer, NULL, XML_ENCODING, NULL);
+ if (ret < 0) {
+ _E("Failed to start xmlTextWriterStartDocument");
+ xmlFreeTextWriter(writer);
+ return NULL;
+ }
+
+ ret = xmlTextWriterStartElement(writer, BAD_CAST "data");
+ if (ret < 0) {
+ _E("Failed to start xmlTextWriterStartElement");
+ xmlFreeTextWriter(writer);
+ return NULL;
+ }
+
+ return writer;
+}
+
+
+
+static void _destroy_writer(xmlTextWriterPtr writer)
+{
+ int ret = 0;
+
+ ret = xmlTextWriterEndElement(writer);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterEndDocument(writer);
+ if (ret < 0) {
+ _E("Cannot end the document");
+ }
+
+END:
+ xmlFreeTextWriter(writer);
+}
+
+
+
+HAPI w_home_error_e xml_read_list(const char *xml_file, Eina_List *page_info_list)
+{
+ xmlTextWriterPtr writer;
+ Eina_List *l = NULL;
+ page_info_s *page_info = NULL;
+ char *category = NULL;
+ int ret = 0;
+ int row = -1;
+ int cellx = -1;
+ int celly = -1;
+
+ retv_if(!xml_file, W_HOME_ERROR_INVALID_PARAMETER);
+ retv_if(!page_info_list, W_HOME_ERROR_INVALID_PARAMETER);
+
+ writer = _init_writer(xml_file);
+ retv_if(!writer, W_HOME_ERROR_FAIL);
+
+ EINA_LIST_FOREACH(page_info_list, l, page_info) {
+ continue_if(!page_info);
+
+ _get_position_by_order(page_info->ordering, &row, &cellx, &celly);
+
+ switch(page_info->category) {
+ case PAGE_CATEGORY_IDLE_CLOCK:
+ category = (char *) PAGE_CATEGORY_IDLE_CLOCK_STR;
+ break;
+ case PAGE_CATEGORY_APP:
+ category = (char *) PAGE_CATEGORY_FAVORITE_STR;
+ break;
+ case PAGE_CATEGORY_WIDGET:
+ category = (char *) PAGE_CATEGORY_APP_WIDGET_STR;
+ break;
+ case PAGE_CATEGORY_MORE_APPS:
+ category = (char *) PAGE_CATEGORY_MORE_APPS_STR;
+ break;
+ default:
+ _E("page_info->category error");
+ break;
+ }
+
+ ret = xmlTextWriterStartElement(writer, BAD_CAST category);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "packageName", "%s", page_info->id);
+ goto_if(ret < 0, END);
+
+ if (page_info->subid) {
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "className", "%s", page_info->subid);
+ } else {
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "className", "%s", page_info->id);
+ }
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "screen", "%d", row);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "cellX", "%d", cellx);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterWriteFormatElement(writer, BAD_CAST "cellY", "%d", celly);
+ goto_if(ret < 0, END);
+
+ ret = xmlTextWriterEndElement(writer);
+ goto_if(ret < 0, END);
+ }
+
+END:
+ _destroy_writer(writer);
+
+ return W_HOME_ERROR_NONE;
+}
+
+
+
+static xmlTextReaderPtr _init_reader(const char *xml_file)
+{
+ xmlTextReaderPtr reader = NULL;
+
+ retv_if(!xml_file, NULL);
+
+ reader = xmlReaderForFile(xml_file, NULL, 0);
+ retv_if(!reader, NULL);
+
+ return reader;
+}
+
+
+
+static void _destroy_reader(xmlTextReaderPtr reader)
+{
+ ret_if(!reader);
+ xmlFreeTextReader(reader);
+}
+
+
+
+HAPI Eina_List *xml_write_list(const char *xml_file)
+{
+ xmlTextReaderPtr reader = NULL;
+ Eina_List *page_info_list = NULL;
+ page_info_s *page_info = NULL;
+ const char *name, *value;
+ char *element = NULL;
+ int ret = -1;
+
+ retv_if(!xml_file, NULL);
+
+ reader = _init_reader(xml_file);
+ retv_if(!reader, NULL);
+
+ while ((ret = xmlTextReaderRead(reader)) == 1) {
+ int dep = 0;
+ int node_type = 0;
+ static int cellx = 0;
+ static int celly = 0;
+ static int page_no = 0;
+
+ dep = xmlTextReaderDepth(reader);
+ node_type = xmlTextReaderNodeType(reader);
+ continue_if(-1 == dep || -1 == node_type);
+
+ name = (const char*) xmlTextReaderConstName(reader);
+ continue_if(!name);
+
+ value = (const char*) xmlTextReaderConstValue(reader);
+ /* value can be NULL in case of 'category' */
+
+ // Category, element is 1
+ if ((1 == dep) && (1 == node_type)) {
+ if (page_info) {
+ page_info_destroy(page_info);
+ page_info = NULL;
+ }
+
+ page_info = page_info_create(NULL, NULL, DYNAMICBOX_EVAS_DEFAULT_PERIOD);
+ goto_if(!page_info, CRITICAL_ERROR);
+
+ if(!strcasecmp(PAGE_CATEGORY_IDLE_CLOCK_STR, name)) {
+ page_info->category = PAGE_CATEGORY_IDLE_CLOCK;
+ } else if(!strcasecmp(PAGE_CATEGORY_FAVORITE_STR, name)) {
+ page_info->category = PAGE_CATEGORY_APP;
+ } else if(!strcasecmp(PAGE_CATEGORY_APP_WIDGET_STR, name)) {
+ page_info->category = PAGE_CATEGORY_WIDGET;
+ } else if(!strcasecmp(PAGE_CATEGORY_MORE_APPS_STR, name)) {
+ page_info->category = PAGE_CATEGORY_MORE_APPS;
+ } else {
+ _E("Type is wrong.");
+ page_info_destroy(page_info);
+ page_info = NULL;
+ }
+ continue;
+ }
+
+ // Category has to be at first.
+ if (!page_info) continue;
+
+ // Element name
+ if ((2 == dep) && (1 == node_type)) {
+ if (element) {
+ _E("The element name is NOT NULL");
+ free(element);
+ element = NULL;
+ }
+
+ element = strdup(name);
+ goto_if(!element, CRITICAL_ERROR);
+ continue;
+ }
+
+ // Element value, textfield is 3
+ if ((3 == dep) && (3 == node_type)) {
+ continue_if(!element);
+
+ if (!strcasecmp("packageName", element)) {
+ page_info->id = strdup(value);
+ goto_if(!page_info->id, CRITICAL_ERROR);
+ } else if (!strcasecmp("className", element)) {
+ if (page_info->id && !strcmp(value, page_info->id)) {
+ _D("%s subid is NULL", page_info->id);
+ page_info->subid = NULL;
+ } else {
+ page_info->subid = strdup(value);
+ goto_if(!page_info->subid, CRITICAL_ERROR);
+ }
+ } else if(!strcasecmp("screen", element)) {
+ page_no = atoi(value);
+ } else if(!strcasecmp("cellx", element)) {
+ cellx = atoi(value);
+ } else if(!strcasecmp("celly", element)) {
+ celly = atoi(value);
+ }
+ continue;
+ }
+
+ // End of the Element
+ if ((2 == dep) && (15 == node_type)) {
+ if (!element) {
+ if (page_info) {
+ page_info_destroy(page_info);
+ page_info = NULL;
+ continue;
+ }
+ }
+
+ free(element);
+ element = NULL;
+ continue;
+ }
+
+ // End of the category
+ if ((1 == dep) && (15 == node_type)) { // End of the category
+ page_info->direction = PAGE_DIRECTION_RIGHT;
+ page_info->ordering = page_no * DBOX_PER_PAGE + celly * 2 + cellx;
+ page_info->removable = page_info_is_removable(page_info->id);
+ page_info_list = eina_list_append(page_info_list, page_info);
+ _D("Append a package into the page_info_list : (%s:%s:%d:%d) (%d:%d:%d)"
+ , page_info->id, page_info->subid, page_info->category, page_info->ordering
+ , page_no, celly, cellx);
+
+ page_info = NULL;
+ page_no = 0;
+ cellx = 0;
+ celly = 0;
+ }
+ }
+
+ if(element) {
+ _E("An element is not appended properly");
+ free(element);
+ element = NULL;
+ }
+
+ if(page_info) {
+ _E("A node(%s) is not appended into the page_info_list", page_info->subid);
+ page_info_destroy(page_info);
+ page_info = NULL;
+ }
+ goto_if(ret, CRITICAL_ERROR);
+
+ _destroy_reader(reader);
+ return page_info_list;
+
+CRITICAL_ERROR:
+ if (page_info) page_info_destroy(page_info);
+ page_info_list_destroy(page_info_list);
+ _destroy_reader(reader);
+ free(element);
+ return NULL;
+}
+
+
+
+// End of a file
diff --git a/packaging/org.tizen.w-home.spec b/packaging/org.tizen.w-home.spec
new file mode 100755
index 0000000..ceab81a
--- /dev/null
+++ b/packaging/org.tizen.w-home.spec
@@ -0,0 +1,178 @@
+Name: org.tizen.w-home
+Summary: Home for the wearable devices
+Version: 0.1.0
+Release: 1
+Group: TO_BE/FILLED_IN
+License: Apache
+Source0: %{name}-%{version}.tar.gz
+BuildRequires: cmake, gettext-tools, smack, coreutils
+BuildRequires: pkgconfig(ail)
+BuildRequires: pkgconfig(appcore-efl)
+BuildRequires: pkgconfig(badge)
+BuildRequires: pkgconfig(bundle)
+BuildRequires: pkgconfig(capi-appfw-application)
+BuildRequires: pkgconfig(capi-media-player)
+BuildRequires: pkgconfig(capi-media-sound-manager)
+BuildRequires: pkgconfig(deviced)
+BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(ecore-x)
+BuildRequires: pkgconfig(efl-assist)
+BuildRequires: pkgconfig(elementary)
+BuildRequires: pkgconfig(feedback)
+BuildRequires: pkgconfig(libxml-2.0)
+BuildRequires: pkgconfig(dynamicbox_service)
+BuildRequires: pkgconfig(dynamicbox_viewer)
+BuildRequires: pkgconfig(minicontrol-monitor)
+BuildRequires: pkgconfig(minicontrol-viewer)
+BuildRequires: pkgconfig(minicontrol-handler)
+BuildRequires: pkgconfig(pkgmgr)
+BuildRequires: pkgconfig(pkgmgr-info)
+BuildRequires: pkgconfig(syspopup-caller)
+BuildRequires: pkgconfig(utilX)
+BuildRequires: pkgconfig(efl-assist)
+BuildRequires: pkgconfig(syspopup-caller)
+BuildRequires: pkgconfig(appsvc)
+BuildRequires: pkgconfig(capi-system-system-settings)
+BuildRequires: pkgconfig(capi-message-port)
+BuildRequires: pkgconfig(capi-media-image-util)
+BuildRequires: pkgconfig(notification)
+BuildRequires: pkgconfig(rua)
+
+%ifarch %{arm}
+%define ARCH arm
+BuildRequires: pkgconfig(dbus-1)
+BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: pkgconfig(dbus-glib-1)
+BuildRequires: pkgconfig(json)
+BuildRequires: pkgconfig(journal)
+BuildRequires: pkgconfig(tapi)
+%else
+%define ARCH emulator
+%endif
+
+BuildRequires: cmake
+BuildRequires: edje-bin
+BuildRequires: embryo-bin
+BuildRequires: gettext-devel
+BuildRequires: hash-signer
+
+%description
+Home for wearable devices
+
+%prep
+%setup -q
+
+%define PREFIX /usr/apps/%{name}
+%define DATADIR /opt%{PREFIX}/data
+
+%build
+%if 0%{?tizen_build_binary_release_type_eng}
+export CFLAGS="$CFLAGS -DTIZEN_ENGINEER_MODE"
+export CXXFLAGS="$CXXFLAGS -DTIZEN_ENGINEER_MODE"
+export FFLAGS="$FFLAGS -DTIZEN_ENGINEER_MODE"
+%endif
+
+%if 0%{?sec_build_binary_debug_enable}
+export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE"
+export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE"
+export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE"
+%endif
+RPM_OPT=`echo $CFLAGS|sed 's/-Wp,-D_FORTIFY_SOURCE=2//'`
+export CFLAGS=$RPM_OPT
+cmake -DCMAKE_INSTALL_PREFIX="%{PREFIX}" -DARCH=%{ARCH}
+make %{?jobs:-j%jobs}
+
+
+
+%install
+rm -rf %{buildroot}
+%make_install
+mkdir -p %{buildroot}/usr/share/license
+mkdir -p %{buildroot}/opt/usr/share/w-launcher
+%define tizen_sign 1
+%define tizen_sign_base /usr/apps/%{name}
+%define tizen_sign_level platform
+%define tizen_author_sign 1
+%define tizen_dist_sign 1
+
+%post
+/usr/bin/signing-client/hash-signer-client.sh -a -d -p platform /usr/apps/%{name}
+
+INHOUSE_ID="5000"
+make_data_directory()
+{
+ I="%{DATADIR}"
+ if [ ! -d $I ]; then
+ mkdir -p $I
+ fi
+ chmod 775 $I
+ chown :$INHOUSE_ID $I
+}
+make_data_directory
+
+sqlite3 %{DATADIR}/.home.db 'PRAGMA journal_mode = PERSIST;
+ CREATE TABLE IF NOT EXISTS home (
+ id TEXT,
+ subid TEXT,
+ ordering INTEGER
+ );
+'
+chmod 666 %{DATADIR}/.home.db*
+
+sqlite3 %{DATADIR}/.home_tts.db 'PRAGMA journal_mode = PERSIST;
+ CREATE TABLE IF NOT EXISTS home (
+ id TEXT,
+ subid TEXT,
+ ordering INTEGER
+ );
+'
+chmod 666 %{DATADIR}/.home_tts.db*
+
+# apps
+sqlite3 %{DATADIR}/.apps.db 'PRAGMA journal_mode = PERSIST;
+ CREATE TABLE IF NOT EXISTS apps (
+ id TEXT NOT NULL PRIMARY KEY,
+ ordering INTEGER
+ );
+'
+chmod 666 %{DATADIR}/.apps.db*
+
+if [ -f /usr/lib/rpm-plugins/msm.so ]
+then
+chsmack -a '%{name}' /opt%{PREFIX}
+chsmack -a '%{name}' %{DATADIR}
+chsmack -a '%{name}' %{DATADIR}/.home.db*
+chsmack -a '%{name}' %{DATADIR}/.home_tts.db*
+chsmack -a '%{name}' %{DATADIR}/.apps.db*
+fi
+
+vconftool set -t int "memory/private/org.tizen.w-home/tutorial" 0 -i -g $INHOUSE_ID -f -s %{name}
+vconftool set -t int "db/private/org.tizen.w-home/enabled_tutorial" 0 -g $INHOUSE_ID -f -s %{name}
+vconftool set -t int "db/private/org.tizen.w-home/apps_first_boot" 1 -g $INHOUSE_ID -f -s %{name}
+vconftool set -t int "db/private/org.tizen.w-home/apps_flickup_count" 0 -g $INHOUSE_ID -f -s %{name}
+vconftool set -t int "db/private/org.tizen.w-home/apps_initial_popup" 0 -g $INHOUSE_ID -f -s %{name}
+vconftool set -t string "db/private/org.tizen.w-home/logging" ";" -g $INHOUSE_ID -f -s system::vconf_system
+vconftool set -t int "memory/homescreen/clock_visibility" 0 -i -g $INHOUSE_ID -f -s system::vconf_system
+vconftool set -t string "memory/homescreen/music_status" ";" -i -g $INHOUSE_ID -f -s system::vconf_system
+vconftool set -t int "memory/private/org.tizen.w-home/auto_feed" 1 -i -g $INHOUSE_ID -f -s %{name}
+vconftool set -t int "memory/private/org.tizen.w-home/sensitive_move" 1 -i -g $INHOUSE_ID -f -s %{name}
+vconftool set -t string "db/wms/clocks_set_idle" "org.tizen.idle-clock-digital" -g $INHOUSE_ID -f -s system::vconf
+
+%files
+%manifest home/%{name}.manifest
+%defattr(-,root,root,-)
+/usr/share/license/%{name}
+/usr/share/packages/%{name}.xml
+/usr/share/icons/default/small/%{name}*.png
+/etc/smack/accesses.d/%{name}.efl
+/etc/opt/upgrade/*.sh
+%{PREFIX}/*.xml
+%{PREFIX}/bin/*
+%{PREFIX}/shared/*
+%{PREFIX}/res/*.xml
+%{PREFIX}/res/*.list
+%{PREFIX}/res/*.sh
+%{PREFIX}/res/edje/*
+%{PREFIX}/res/images/*
+%{PREFIX}/res/locale/*/*/*.mo
+/opt/etc/dump.d/module.d/dump_w-home.sh