diff options
44 files changed, 2999 insertions, 2612 deletions
@@ -135,13 +135,15 @@ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/> </option> <option id="gnu.cpp.compiler.option.include.paths.471457378" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> - <listOptionValue builtIn="false" value=""${workspace_loc:/DigitalWatch/DigitalWatch/inc}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/App/inc}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/Common/inc}""/> </option> <option id="sbi.gnu.cpp.compiler.option.frameworks.core.1948188719" name="Tizen-Frameworks" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs"> <listOptionValue builtIn="false" value="Native_API"/> </option> - <option id="sbi.gnu.cpp.compiler.option.preprocessor.def.deprecation.1944366159" name="Defined symbols (-D)" superClass="sbi.gnu.cpp.compiler.option.preprocessor.def.deprecation" valueType="definedSymbols"/> - <option id="gnu.cpp.compiler.option.dialect.std.1601782784" superClass="gnu.cpp.compiler.option.dialect.std" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/> + <option id="sbi.gnu.cpp.compiler.option.preprocessor.def.deprecation.1944366159" name="Defined symbols (-D)" superClass="sbi.gnu.cpp.compiler.option.preprocessor.def.deprecation"/> + <option id="gnu.cpp.compiler.option.dialect.std.1601782784" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" value="gnu.cpp.compiler.dialect.c++11" valueType="enumerated"/> <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1156939550" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> </tool> <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.673472688" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler"> @@ -257,7 +259,7 @@ <option id="sbi.gnu.c.compiler.option.frameworks.core.1120316379" name="Tizen-Frameworks" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs"> <listOptionValue builtIn="false" value="Native_API"/> </option> - <option id="sbi.gnu.c.compiler.option.preprocessor.def.symbols.deprecation.47436355" name="Defined symbols (-D)" superClass="sbi.gnu.c.compiler.option.preprocessor.def.symbols.deprecation" valueType="definedSymbols"/> + <option id="sbi.gnu.c.compiler.option.preprocessor.def.symbols.deprecation.47436355" name="Defined symbols (-D)" superClass="sbi.gnu.c.compiler.option.preprocessor.def.symbols.deprecation"/> <option id="gnu.c.compiler.option.dialect.std.1717910620" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" value="gnu.c.compiler.dialect.default" valueType="enumerated"/> <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.712765063" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> </tool> @@ -516,11 +518,14 @@ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/> </option> <option id="gnu.cpp.compiler.option.include.paths.46682391" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath"> - <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/DigitalWatch/DigitalWatch/inc}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/App/inc}""/> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src/Common/inc}""/> </option> <option id="sbi.gnu.cpp.compiler.option.frameworks.core.1516031646" name="Tizen-Frameworks" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs"> <listOptionValue builtIn="false" value="Native_API"/> </option> + <option id="gnu.cpp.compiler.option.dialect.std.742288624" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" value="gnu.cpp.compiler.dialect.c++11" valueType="enumerated"/> <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.209804161" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> </tool> <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.1890430938" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler"> diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..417846b --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +Debug/ +Release/ +crash-info +.sign +.checkers +*~ +/SA_Report +.rds_delta +.sdk_delta.info +.settings/ +org.tizen.w-message-Test-result.xml +.package-stamp +.svace-dir +*.edj diff --git a/Build/flags.mk b/Build/flags.mk index 0ee8efb..39e3e39 100644 --- a/Build/flags.mk +++ b/Build/flags.mk @@ -1,13 +1,13 @@ -DEBUG_OP = -g3 -CPP_DEBUG_OP = +DEBUG_OP = +CPP_DEBUG_OP = -g3 -OPTIMIZATION_OP = -O0 -CPP_OPTIMIZATION_OP = +OPTIMIZATION_OP = +CPP_OPTIMIZATION_OP = -O0 -COMPILE_FLAGS = $(DEBUG_OP) $(OPTIMIZATION_OP) -Wall -c -fmessage-length=0 +COMPILE_FLAGS = $(DEBUG_OP) $(OPTIMIZATION_OP) -CPP_COMPILE_FLAGS = $(CPP_DEBUG_OP) $(CPP_OPTIMIZATION_OP) +CPP_COMPILE_FLAGS = $(CPP_DEBUG_OP) $(CPP_OPTIMIZATION_OP) -std=c++0x -Wall -c -fmessage-length=0 LINK_FLAGS = diff --git a/Build/prepost.mk b/Build/prepost.mk deleted file mode 100644 index 6bb5e2f..0000000 --- a/Build/prepost.mk +++ /dev/null @@ -1,6 +0,0 @@ - -# Add pre/post build process -PREBUILD_DESC = -PREBUILD_COMMAND = -POSTBUILD_DESC = -POSTBUILD_COMMAND = diff --git a/edje/images/default_digital_sec.png b/edje/images/default_digital_sec.png Binary files differnew file mode 100644 index 0000000..9ef7e3b --- /dev/null +++ b/edje/images/default_digital_sec.png diff --git a/inc/clock_view.h b/inc/Config.h index b82cafe..ba1303a 100755..100644 --- a/inc/clock_view.h +++ b/inc/Config.h @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,21 +14,22 @@ * limitations under the License. */ -#ifndef __CLOCK_VIEW_H__ -#define __CLOCK_VIEW_H__ +#ifndef Config_h_ +#define Config_h_ -#include <Elementary.h> +#if !defined(PACKAGE_NAME) +#define PACKAGE_NAME "org.tizen.idle-clock-proto" +#endif -bool clock_view_create_layout(void *data); -int clock_view_parse_result_data(const char *result_data); -void clock_view_set_result_data(void *data); -void clock_view_update_view(void *data); -int clock_view_get_display_state(); -Eina_Bool clock_view_set_info_time(void *data); -void clock_view_destroy_view_main(void *data); -void clock_view_show_clock(void *data); -void clock_view_hide_clock(void *data); +#if !defined(PROJECT_NAME) +#define PROJECT_NAME "idle-clock-proto" +#endif +#ifdef LOGGER_TAG +#undef LOGGER_TAG +#endif +#define LOGGER_TAG "idleclock" +#define APP_DOMAIN PROJECT_NAME -#endif /* __CLOCK_VIEW_H__ */ +#endif // Config_h_ diff --git a/inc/Resource.h b/inc/Resource.h new file mode 100644 index 0000000..1b3c9d1 --- /dev/null +++ b/inc/Resource.h @@ -0,0 +1,26 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RESOURCE_H_ +#define RESOURCE_H_ + +#define EDJ_PATH "edje" +#define IMAGE_PATH "images" + +#define MAINT_LAYOUT_EDJ "main-layout.edj" +#define CLOCK_DIGITAL_EDJ "clock-digital.edj" + +#endif /* RESOURCE_H_ */ diff --git a/inc/app_data.h b/inc/app_data.h deleted file mode 100755 index 16e13c1..0000000 --- a/inc/app_data.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2017 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __APP_DATA_H__ -#define __APP_DATA_H__ - -#include <Elementary.h> -#include <app.h> - -/* for time variables */ -#include <utils_i18n.h> -#define MAX_PATH_LEN 1024 - -typedef struct __appdata { - Evas_Object *win; - Evas_Object *ly_main; - Evas_Object *ly_time; - Evas_Object *bg; - - int win_w; - int win_h; - - Ecore_Timer *timer; - int win_type; - Evas *e_offscreen; - app_control_h app_control; - - /* for time display */ - Eina_Bool is_pre; - int timeformat; - char *timeregion_format; - char *timezone_id; - i18n_udate_format_h formatter_time; - i18n_udate_format_h formatter_ampm; - i18n_udate_format_h formatter_time_24; - i18n_udate_format_h formatter_date; - i18n_udatepg_h generator; - - Eina_Bool is_show; -} appdata; - -#endif /* __APP_DATA_H__ */ - diff --git a/inc/log.h b/inc/log.h deleted file mode 100755 index de35fd0..0000000 --- a/inc/log.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2017 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __LOG_H__ -#define __LOG_H__ - -#include <unistd.h> -#include <dlog.h> -#include <dlog-internal.h> - -#undef LOG_TAG -#define LOG_TAG "IDLE-CLOCK-DIGITAL" - -#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 - -#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; \ - } \ -} - -//assert -#define ASSERT_SE(expr, args...) do { \ - if (expr) app_assert_screen(LOG_TAG, __FILE__, __LINE__, __func__, ##args); \ - } while (0) - -#define ASSERT_S(expr) do { \ - if (expr) assert_screen(LOG_TAG, __FILE__, __LINE__, __func__, #expr, NULL); \ - } while (0) - -void assert_screen(const char* tag_name, const char* file, int line, const char* func, const char *expr, const char *fmt, ...); - - - -#endif /* IDLE_CLOCK_DIGITAL_DEBUG_H */ diff --git a/inc/util.h b/inc/util.h deleted file mode 100755 index 53d0c0f..0000000 --- a/inc/util.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2017 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __UTIL_H__ -#define __UTIL_H__ - -#include <Elementary.h> - -#if !defined(PACKAGE) -# define PACKAGE "idle-clock-digital" -#endif - -#if !defined(PKGNAME) -# define PKGNAME "org.tizen.idle-clock-digital" -#endif - -#define EDJ_APP "/edje/idle-clock-digital.edj" - -#define S_(str) dgettext("sys_string", str) -#define T_(str) dgettext(PACKAGE, str) -#undef _ -#define _(str) gettext(str) - -#define _EDJ(x) elm_layout_edje_get(x) -#define _X(x) (x*elm_config_scale_get()) - -#ifdef FEATURE_DIGITAL_OPERATOR_GEAR3 -#define WIN_SIZE_W 360 -#define WIN_SIZE_H 480 -#else -#define WIN_SIZE_W 320 -#define WIN_SIZE_H 320 -#endif - - -typedef enum _buffer_type { - BUFFER_TYPE_MINICONTROL = 0, - BUFFER_TYPE_OFFSCREEN, - BUFFER_TYPE_WINDOW, -} buffer_type_e; - -#endif /* __IDLE_CLOCK_DIGITAL_COMMON_H__ */ - diff --git a/project_def.prop b/project_def.prop index ce61f20..61ae8a3 100644 --- a/project_def.prop +++ b/project_def.prop @@ -9,17 +9,17 @@ type = app profile = wearable-4.0 # C/CPP Sources -USER_SRCS = src/debug.c src/main.c src/clock_view.c src/window.c +USER_SRCS = src/App/src/DateTimeView.cpp src/Common/src/PathUtils.cpp src/App/src/WatchApp.cpp src/Common/src/I18nString.cpp src/App/src/MainLayout.cpp src/Common/src/View.cpp src/Common/src/Logger.cpp src/App/src/DateTimeFormatter.cpp src/App/src/MainController.cpp src/main.cpp src/Common/src/WatchWindow.cpp # EDC Sources USER_EDCS = # PO Sources -USER_POS = res/po/da.po res/po/en.po res/po/hi.po res/po/ms.po res/po/si.po res/po/es_US.po res/po/ja_JP.po res/po/or.po res/po/bn.po res/po/et.po res/po/my.po res/po/ne.po res/po/ga.po res/po/lv.po res/po/ar.po res/po/hu.po res/po/ta.po res/po/eu.po res/po/he.po res/po/kk.po res/po/es_ES.po res/po/kn.po res/po/fr.po res/po/sk.po res/po/uz.po res/po/hr.po res/po/km.po res/po/uk.po res/po/vi.po res/po/mn_MN.po res/po/zh_CN.po res/po/tl.po res/po/ro.po res/po/gu.po res/po/lt.po res/po/mk.po res/po/nb.po res/po/sl.po res/po/en_PH.po res/po/tr_TR.po res/po/zh_TW.po res/po/pt_PT.po res/po/az.po res/po/lo.po res/po/pa.po res/po/sr.po res/po/is.po res/po/ka.po res/po/sq.po res/po/th.po res/po/ko_KR.po res/po/de.po res/po/fi.po res/po/id.po res/po/ml.po res/po/it_IT.po res/po/zh_HK.po res/po/fa.po res/po/ru_RU.po res/po/bg.po res/po/el_GR.po res/po/mr.po res/po/as.po res/po/ca.po res/po/nl.po res/po/sv.po res/po/pt_BR.po res/po/cs.po res/po/fr_CA.po res/po/pl.po res/po/gl.po res/po/hy.po res/po/te.po res/po/ur.po res/po/en_US.po +USER_POS = res/po/es_US.po res/po/or.po res/po/bn.po res/po/et.po res/po/my.po res/po/ne.po res/po/ga.po res/po/lv.po res/po/eu.po res/po/he.po res/po/kk.po res/po/es_ES.po res/po/vi.po res/po/zh_CN.po res/po/ro.po res/po/nb.po res/po/en_PH.po res/po/zh_TW.po res/po/az.po res/po/pa.po res/po/sr.po res/po/ka.po res/po/sq.po res/po/fi.po res/po/id.po res/po/it_IT.po res/po/zh_HK.po res/po/ru_RU.po res/po/as.po res/po/sv.po res/po/cs.po res/po/fr_CA.po res/po/gl.po res/po/ur.po res/po/da.po res/po/en.po res/po/hi.po res/po/ms.po res/po/si.po res/po/ja_JP.po res/po/ar.po res/po/hu.po res/po/ta.po res/po/kn.po res/po/fr.po res/po/sk.po res/po/uz.po res/po/hr.po res/po/km.po res/po/uk.po res/po/mn_MN.po res/po/tl.po res/po/gu.po res/po/lt.po res/po/mk.po res/po/sl.po res/po/tr_TR.po res/po/pt_PT.po res/po/lo.po res/po/is.po res/po/th.po res/po/ko_KR.po res/po/de.po res/po/ml.po res/po/fa.po res/po/bg.po res/po/el_GR.po res/po/mr.po res/po/ca.po res/po/nl.po res/po/pt_BR.po res/po/pl.po res/po/hy.po res/po/te.po res/po/en_US.po # User Defines USER_DEFS = -USER_CPP_DEFS = +USER_CPP_DEFS = TIZEN_DEPRECATION DEPRECATION_WARNING # User Undefines USER_UNDEFS = @@ -33,10 +33,10 @@ USER_OBJS = # User Includes ## C Compiler -USER_C_INC_DIRS = inc +USER_C_INC_DIRS = USER_INC_FILES = ## C++ Compiler -USER_CPP_INC_DIRS = +USER_CPP_INC_DIRS = inc src/App/inc src/Common/inc USER_CPP_INC_FILES = USER_INC_DIRS = $(USER_C_INC_DIRS) $(USER_CPP_INC_DIRS) @@ -52,7 +52,7 @@ USER_EDCS_FONT_DIRS = ${OUTPUT_DIR} edje/fonts # EDC Flags USER_EXT_EDC_KEYS = EDC0 -USER_EXT_EDC0_EDCS = res/edje/idle-clock-digital.edc +USER_EXT_EDC0_EDCS = res/edje/main-layout.edc res/edje/clock-digital.edc USER_EXT_EDC0_EDCS_IMAGE_DIRS = ${OUTPUT_DIR} edje/images USER_EXT_EDC0_EDCS_SOUND_DIRS = ${OUTPUT_DIR} edje/sounds USER_EXT_EDC0_EDCS_FONT_DIRS = ${OUTPUT_DIR} edje/fonts diff --git a/res/edje/clock-digital.edc b/res/edje/clock-digital.edc new file mode 100755 index 0000000..168be81 --- /dev/null +++ b/res/edje/clock-digital.edc @@ -0,0 +1,100 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "defines.inl" + +#define MAX_TEXT_WIDTH 340 +#define MAX_TIME_TEXT_HEIGHT 118 +#define MAX_SEC_WIDTH 23 + +collections { + base_scale: BASE_SCALE; + + images { + image: "default_digital_sec.png" RAW; + } + + styles { + style { name: "textblock_digit_style"; + base: "font=Tizen font_size=118 color=#ffffff align=center style=shadow,bottom shadow_color=#00000088"; + tag: "ampm" "+ font_size=24"; + } + } + + group { name : "layout_clock_digital"; + parts{ + spacer { "main"; + scale: 1; + desc { "default"; + min: 0 0; + max: MAX_TEXT_WIDTH MAX_TIME_TEXT_HEIGHT; + } + } + textblock { "text_hour"; + effect: SHADOW BOTTOM; + scale: 1; + desc { "default"; + color: 255 255 255 255; + rel1.to: "main"; + rel1.relative: 0 0; + rel2.to_y: "main"; + rel2.relative: 0 1; + align: 0 0.5; + text { + text: "12"; + style: "textblock_digit_style"; + min: 1 1; + max: 0 1; + } + } + } + image { "digital_sec"; + scale; + desc { "default"; + image.normal: "default_digital_sec.png"; + min: 23 MAX_TIME_TEXT_HEIGHT; + max: 23 MAX_TIME_TEXT_HEIGHT; + color: 255 52 41 255; + rel1.to_x: "text_hour"; + rel1.to_y: "main"; + rel1.relative: 1 0; + rel2.to_y: "main"; + rel2.relative: 0 1; + align: 0 0.5; + } + } + textblock { "text_min"; + effect: SHADOW BOTTOM; + scale: 1; + desc { "default"; + color: 255 255 255 255; + rel1.to_x: "digital_sec"; + rel1.to_y: "main"; + rel1.relative: 1 0; + rel2.to: "main"; + rel2.relative: 1 1; + align: 0 0.5; + text { + text: "55<ampm>AM</ampm>"; + style: "textblock_digit_style"; + min: 1 1; + max: 0 1; + } + } + } + } + } //group end +} diff --git a/res/edje/defines.inl b/res/edje/defines.inl new file mode 100644 index 0000000..7b3ae30 --- /dev/null +++ b/res/edje/defines.inl @@ -0,0 +1 @@ +#define BASE_SCALE 1.3;
\ No newline at end of file diff --git a/res/edje/idle-clock-digital.edc b/res/edje/idle-clock-digital.edc deleted file mode 100755 index b5f06a2..0000000 --- a/res/edje/idle-clock-digital.edc +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright 2017 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define WIN_HEIGHT 360 -#define WIN_WIDTH 360 - -#define PROGRAM_SHOW_DATE( TYPE, NUM ) \ - program { \ - signal: "show,"TYPE"_text_date_"NUM; \ - source: "source_"TYPE"_text_date"; \ - action: STATE_SET "text_date_"NUM 0.0; \ - target: ""TYPE"_text_date"; \ - } - -collections { - - group { name: "main"; - parts { - rect { "bg"; - scale: 1; - desc { "default"; - rel1.relative: 0 0; - rel2.relative: 1 1; - color: 0 0 0 255; - } - } - swallow { "time.part"; - scale: 1; - desc { "default"; - rel.to: bg; - rel1.relative: 0 0.5; - rel2.relative: 1 0.5; - } - } - } - } - - group { - name : "layout_clock_digital"; - - styles { - style { - name: "textblock_digit_style"; - base: "font=Tizen:style=Bold font_size=80 color=#ffffff align=center style=shadow,bottom shadow_color=#00000088 text_class=idle_font"; - tag: "br" "\n"; - tag: "hilight" "+ font_weight=Bold"; - tag: "b" "+ font_weight=Bold"; - tag: "tab" "\t"; - } - } - parts{ - rect { "clipper"; - scale: 1; - desc { "default"; - color: 255 255 255 255; - } - desc { "hide"; - color: 0 0 0 0 ; - } - } - - textblock { "textblock_time"; - effect: SHADOW BOTTOM; - scale: 1; - clip_to: "clipper"; - desc { "default"; - rel1.relative: 0 0; - rel2.relative: 1 0; - visible: 1; - color: 255 255 255 255; - align: 0 0; - text{ - text: ""; - style: "textblock_digit_style"; - text_class: "idle_font"; - min: 0 1; - align: 0.5 0.5; - } - } - desc { "no_date"; - inherit: "default" 0.0; - text{ - text: ""; - style: "textblock_digit_style"; - text_class: "idle_font"; - align: 0.5 0.5; - min: 1 1; - } - } - desc { "hide_time"; - inherit: "default" 0.0; - visible: 0; - } - } - part{ - name: "default_text_date"; - type: TEXT; - effect: SHADOW BOTTOM; - scale: 1; - clip_to: "clipper"; - description{ - state: "default" 0.0; - color: 255 255 255 255; - color2: 255 128 0 255; - rel1 { relative: 0.0 1.0; to: "textblock_time"; } - rel2 { relative: 1.0 1.0; } - align: 0 0; - text{ - text: ""; - font: "Tizen:style=Bold"; - text_class: "tizen"; - min: 0 1; - size: 34; - align: 0.5 0; - } - visible: 0; - } - description{ - state: "text_date_1" 0.0; - inherit: "default" 0.0; - color: 0 0 0 255; - visible: 1; - } - description{ - state: "text_date_2" 0.0; - inherit: "default" 0.0; - color: 206 255 0 255; - visible: 1; - } - description{ - state: "text_date_3" 0.0; - inherit: "default" 0.0; - color: 255 101 25 255; - visible: 1; - } - description{ - state: "text_date_4" 0.0; - inherit: "default" 0.0; - color: 188 255 251 255; - visible: 1; - } - description{ - state: "text_date_5" 0.0; - inherit: "default" 0.0; - color: 240 56 128 255; - visible: 1; - } - description{ - state: "text_date_6" 0.0; - inherit: "default" 0.0; - color: 255 234 0 255; - visible: 1; - } - description{ - state: "text_date_7" 0.0; - inherit: "default" 0.0; - color: 103 62 39 255; - visible: 1; - } - description{ - state: "text_date_8" 0.0; - inherit: "default" 0.0; - color: 255 255 255 255; - visible: 1; - } - description{ - state: "text_date_9" 0.0; - inherit: "default" 0.0; - color: 4 40 96 255; - visible: 1; - } - description{ - state: "text_date_10" 0.0; - inherit: "default" 0.0; - color: 242 220 197 255; - visible: 1; - } - description{ - state: "text_date_11" 0.0; - inherit: "default" 0.0; - color: 246 46 0 255; - visible: 1; - } - description{ - state: "text_date_12" 0.0; - inherit: "default" 0.0; - color: 89 89 89 255; - visible: 1; - } - } - } //parts end - programs { - program { - name: "show_effect"; - signal: "show_effect"; - source: ""; - action: STATE_SET "default" 0.0; - target: "clipper"; - } - program { - name: "hide_effect"; - signal: "hide_effect"; - source: ""; - action: STATE_SET "hide" 0.0; - target: "clipper"; - } - program { - name: "change,no_date"; - signal: "change,no_date"; - source: "source_textblock_time"; - action: STATE_SET "no_date" 0.0; - target: "textblock_time"; - } - program { - name: "change,default"; - signal: "change,default"; - source: "source_textblock_time"; - action: STATE_SET "default" 0.0; - target: "textblock_time"; - } - PROGRAM_SHOW_DATE(default, 1); - PROGRAM_SHOW_DATE(default, 2); - PROGRAM_SHOW_DATE(default, 3); - PROGRAM_SHOW_DATE(default, 4); - PROGRAM_SHOW_DATE(default, 5); - PROGRAM_SHOW_DATE(default, 6); - PROGRAM_SHOW_DATE(default, 7); - PROGRAM_SHOW_DATE(default, 8); - PROGRAM_SHOW_DATE(default, 9); - PROGRAM_SHOW_DATE(default, 10); - PROGRAM_SHOW_DATE(default, 11); - PROGRAM_SHOW_DATE(default, 12); - - program { - name: "change,yes_date"; - signal: "change,yes_date"; - source: "source_textblock_time"; - action: STATE_SET "default" 0.0; - target: "textblock_time"; - } - program { - name: "hide,default_time"; - signal: "hide,default_time"; - source: "source_default_time"; - action: STATE_SET "hide_default_time" 0.0; - target: "textblock_time"; - } - program { - name: "hide,text_date"; - signal: "hide,text_date"; - source: "source_text_date"; - action: STATE_SET "default" 0.0; - target: "default_text_date"; - } - } // programs end - } //group end -} diff --git a/res/edje/main-layout.edc b/res/edje/main-layout.edc new file mode 100644 index 0000000..ec5b21d --- /dev/null +++ b/res/edje/main-layout.edc @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "defines.inl" + +collections { + base_scale: BASE_SCALE; + group { name: "main"; + parts { + rect { "bg"; + scale: 1; + desc { "default"; + rel1.relative: 0 0; + rel2.relative: 1 1; + color: 0 0 0 255; + } + } + swallow { "time.part"; + scale: 1; + desc { "default"; + rel.to: bg; + rel1.relative: 0.5 0.5; + rel2.relative: 0.5 0.5; + } + } + } + } +}
\ No newline at end of file diff --git a/src/App/inc/DateTimeFormatter.h b/src/App/inc/DateTimeFormatter.h new file mode 100644 index 0000000..d38d4d6 --- /dev/null +++ b/src/App/inc/DateTimeFormatter.h @@ -0,0 +1,67 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DateTimeFormatter_h_ +#define DateTimeFormatter_h_ + +#include <string> +#include <watch_app.h> +#include <utils_i18n.h> +#include <time.h> + +#include "I18nString.h" + +namespace IdleClock { + + class DateTimeFormatter { + public: + DateTimeFormatter(); + ~DateTimeFormatter(); + + DateTimeFormatter(const DateTimeFormatter&) = delete; + DateTimeFormatter &operator=(const DateTimeFormatter&) = delete; + + std::string getTime(time_t intime) const; + std::string getDate(time_t intime) const; + + void set24hTimeFormat(bool value); + void setRegion(std::string region); + void setTimeZone(const std::string &timeZone); + void update(); + + private: + std::string getDateTime(time_t intime, const i18n_udate_format_h format) const; + + void updateTime(); + void updateDate(); + void updateGen(); + + void destroy(); + void destroyGen(); + void destroyTime(); + void destroyDate(); + + private: + bool m_IsTime24Format; + std::string m_Region; + I18nString m_TimeZoneId; + i18n_udate_format_h m_Time; + i18n_udate_format_h m_Date; + i18n_udatepg_h m_Gen; + }; +} + +#endif /* DateTimeFormatter_h_ */ diff --git a/src/App/inc/DateTimeView.h b/src/App/inc/DateTimeView.h new file mode 100644 index 0000000..59c5510 --- /dev/null +++ b/src/App/inc/DateTimeView.h @@ -0,0 +1,34 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DateTimeView_h_ +#define DateTimeView_h_ + +#include "View.h" + +namespace IdleClock { + class DateTimeView + : public View { + public: + DateTimeView(Evas_Object *parent); + virtual ~DateTimeView(); + + void setHours(const std::string &time); + void setMinutes(const std::string &time); + }; +} + +#endif /* DateTimeView_h_ */ diff --git a/src/App/inc/MainController.h b/src/App/inc/MainController.h new file mode 100644 index 0000000..15a97e9 --- /dev/null +++ b/src/App/inc/MainController.h @@ -0,0 +1,56 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MainController_h_ +#define MainController_h_ + +#include "MainLayout.h" +#include "DateTimeFormatter.h" +#include "DateTimeView.h" + +namespace IdleClock { + class MainController + : public MainLayout { + + public: + MainController(Evas_Object *parent); + virtual ~MainController(); + + void onPause(); + void onResume(); + void onControl(app_control_h app_control); + void onTick(watch_time_h watch_time); + void onAmbientTick(watch_time_h watch_time); + void onAmbientChanged(bool ambient_mode); + void onLanguageChanged(app_event_info_h appEvent); + void onLowBattery(app_event_info_h appEvent); + void onRegionChanged(app_event_info_h appEvent); + void onTimeFormatChanged(); + void onTimeChanged(); + + private: + void updateTime(); + void dispTime(watch_time_h watch_time); + void dispTime(time_t tt); + void dispTime(); + + private: + DateTimeFormatter m_Formatter; + DateTimeView *m_pTimeView; + }; +} + +#endif /* MainController_h_ */ diff --git a/src/App/inc/MainLayout.h b/src/App/inc/MainLayout.h new file mode 100644 index 0000000..1341731 --- /dev/null +++ b/src/App/inc/MainLayout.h @@ -0,0 +1,33 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MainLayout_h_ +#define MainLayout_h_ + +#include "View.h" + +namespace IdleClock { + class MainLayout + : public View { + public: + MainLayout(Evas_Object *parent); + virtual ~MainLayout(); + + void setDateTime(Evas_Object *dateTime); + }; +} + +#endif /* MainLayout_h_ */ diff --git a/src/App/inc/WatchApp.h b/src/App/inc/WatchApp.h new file mode 100644 index 0000000..bb30649 --- /dev/null +++ b/src/App/inc/WatchApp.h @@ -0,0 +1,74 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WatchApp_h_ +#define WatchApp_h_ + +#include <app.h> +#include <app_control.h> +#include <Evas.h> +#include <watch_app.h> +#include <system_settings.h> +#include <string> + +namespace IdleClock { + class WatchWindow; + class MainController; + + class WatchApp { + public: + static WatchApp &getInst(); + int start(int argc, char *argv[]); + void exit(); + WatchWindow &getWindow(); + const WatchWindow &getWindow() const; + + std::string getLang() const; + std::string getTimeZone() const; + std::string getCountry() const; + bool is24TimeFormat() const; + + private: + WatchApp(); + ~WatchApp(); + WatchApp(WatchApp &) = delete; + WatchApp &operator=(WatchApp &) = delete; + + std::string getStr(system_settings_key_e key) const; + + // App cbs: + bool onCreate(int width, int height); + void onTerminate(); + void onPause(); + void onResume(); + void onControl(app_control_h app_control); + void onTick(watch_time_h watch_time); + void onAmbientTick(watch_time_h watch_time); + void onAmbientChanged(bool ambient_mode); + void onLanguageChanged(app_event_info_h appEvent); + void onLowBattery(app_event_info_h appEvent); + void onRegionChanged(app_event_info_h appEvent); + void onTimeFormatChanged(system_settings_key_e key); + void onTimeChanged(system_settings_key_e key); + + private: + static WatchApp m_AppInst; + WatchWindow *m_pWindow; + MainController *m_pRootController; + }; +} + +#endif /* WatchApp_h_ */ diff --git a/src/App/src/DateTimeFormatter.cpp b/src/App/src/DateTimeFormatter.cpp new file mode 100644 index 0000000..f2f400c --- /dev/null +++ b/src/App/src/DateTimeFormatter.cpp @@ -0,0 +1,208 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DateTimeFormatter.h" +#include "Logger.h" + +using namespace IdleClock; + +namespace { + const std::string defaultRegion = "en_US"; + + std::string highlightKeyword(const std::string &str, const std::string &searchWord, + const std::string &tagOpen, const std::string &tagClose) + { + if (str.empty() || searchWord.empty()) + return str; + + char *found = strcasestr((char*)str.c_str(), (char*)searchWord.c_str()); + if (!found) + return str; + + std::string res; + res.reserve(str.length() + tagOpen.length() + tagClose.length()); + + int diff = found - str.c_str(); + std::string firstPart = std::string(str.begin(), str.begin() + diff); + std::string lastPart = std::string(str.begin() + diff + searchWord.length(), str.end()); + + res += firstPart; + res += tagOpen; + res += std::string(found, searchWord.length()); + res += tagClose; + res += lastPart; + + return res; + } + + void cleanupPattern(std::string &s, const std::string &charSet) + { + size_t pos = 0; + do { + pos = s.find_first_of(charSet); + if (pos != std::string::npos) + s.erase(pos, 1); + } while (pos != std::string::npos); + } +} + +DateTimeFormatter::DateTimeFormatter() + : m_IsTime24Format(false) + , m_Region(defaultRegion) + , m_TimeZoneId() + , m_Time() + , m_Date() + , m_Gen() +{ + update(); +} + +DateTimeFormatter::~DateTimeFormatter() +{ + destroy(); +} + +std::string DateTimeFormatter::getDateTime(time_t intime, const i18n_udate_format_h format) const +{ + static const int maxLen = 128; + I18nString res(maxLen); + i18n_udate uTime = (i18n_udate)intime * 1000; + int32_t formattedStrLen = 0; + i18n_udate_format_date(format, uTime, res.getUStr(), res.getCapacity(), nullptr, &formattedStrLen); + return res.toStr(); +} + +std::string DateTimeFormatter::getTime(time_t intime) const +{ + return getDateTime(intime, m_Time); +} + +std::string DateTimeFormatter::getDate(time_t intime) const +{ + return getDateTime(intime, m_Date); +} + +void DateTimeFormatter::set24hTimeFormat(bool value) +{ + m_IsTime24Format = value; + LOG("24Format: ", value); +} + +void DateTimeFormatter::setRegion(std::string region) +{ + m_Region = std::move(region); + if (m_Region.empty()) + m_Region = defaultRegion; + + LOG("Region: ", m_Region); +} + +void DateTimeFormatter::setTimeZone(const std::string &timeZone) +{ + m_TimeZoneId = timeZone; + LOG("TimeZone: ", m_TimeZoneId.toStr()); +} + +void DateTimeFormatter::update() +{ + i18n_ulocale_set_default(nullptr); + i18n_ucalendar_set_default_timezone(m_TimeZoneId); + updateGen(); + updateTime(); + updateDate(); +} + +void DateTimeFormatter::updateDate() +{ + destroyDate(); + + int32_t bestPatternLen = 0; + + I18nString skeleton = "MMMEd"; + I18nString uBestPattern(128); + + i18n_udatepg_get_best_pattern(m_Gen, skeleton, skeleton.getLen(), uBestPattern, uBestPattern.getCapacity(), &bestPatternLen); + std::string aPattern = uBestPattern.toStr(); + i18n_udate_create(I18N_UDATE_PATTERN, I18N_UDATE_PATTERN, m_Region.c_str(), m_TimeZoneId, -1, uBestPattern, -1, &m_Date); + LOG("BestPattern: ", uBestPattern.toStr()); +} + +void DateTimeFormatter::updateTime() +{ + int32_t bestPatternLen = 0; + I18nString uBestPattern(128); + static const std::string period = "a"; + I18nString skeleton = m_IsTime24Format ? "HH:mm" : ("h:mm " + period); + + destroyTime(); + i18n_udatepg_get_best_pattern(m_Gen, skeleton, skeleton.getLen(), uBestPattern, uBestPattern.getCapacity(), &bestPatternLen); + std::string aPattern = uBestPattern.toStr(); + + if (m_IsTime24Format) { + // Remove am/pm: + cleanupPattern(aPattern, " a"); + } else { + static const std::string searchWord = period; + static const std::string tagOpen = "'<ampm>'"; + static const std::string tagClose = "'</ampm>'"; + aPattern = highlightKeyword(aPattern, searchWord, tagOpen, tagClose); + cleanupPattern(aPattern, " "); + } + + uBestPattern = aPattern; + + i18n_udate_create(I18N_UDATE_PATTERN, I18N_UDATE_PATTERN, m_Region.c_str(), m_TimeZoneId, -1, uBestPattern, -1, &m_Time); + LOG("BestPattern: ", uBestPattern.toStr()); +} + +void DateTimeFormatter::destroyGen() +{ + if (m_Gen) { + i18n_udatepg_destroy(m_Gen); + m_Gen = nullptr; + } +} + +void DateTimeFormatter::destroyTime() +{ + if (m_Time) { + i18n_udate_destroy(m_Time); + m_Time = nullptr; + } +} + +void DateTimeFormatter::destroyDate() +{ + if (m_Date) { + i18n_udate_destroy(m_Date); + m_Date = nullptr; + } +} + +void DateTimeFormatter::destroy() +{ + destroyTime(); + destroyDate(); + destroyGen(); +} + +void DateTimeFormatter::updateGen() +{ + destroyGen(); + i18n_udatepg_create(m_Region.c_str(), &m_Gen); +} + + diff --git a/src/App/src/DateTimeView.cpp b/src/App/src/DateTimeView.cpp new file mode 100644 index 0000000..44e1464 --- /dev/null +++ b/src/App/src/DateTimeView.cpp @@ -0,0 +1,43 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DateTimeView.h" +#include "Resource.h" +#include "PathUtils.h" +#include "Logger.h" +#include "LangUtils.h" +#include "Callback.h" + +using namespace IdleClock; + +DateTimeView::DateTimeView(Evas_Object *parent) +{ + setEo(View::addLayout(parent, CLOCK_DIGITAL_EDJ, "layout_clock_digital")); +} + +DateTimeView::~DateTimeView() +{ +} + +void DateTimeView::setHours(const std::string &time) +{ + setText(time, "text_hour"); +} + +void DateTimeView::setMinutes(const std::string &time) +{ + setText(time, "text_min"); +} diff --git a/src/App/src/MainController.cpp b/src/App/src/MainController.cpp new file mode 100644 index 0000000..0214295 --- /dev/null +++ b/src/App/src/MainController.cpp @@ -0,0 +1,135 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "WatchApp.h" +#include "MainController.h" +#include "Logger.h" +#include <vector> +#include <iostream> +#include <cstring> + +using namespace IdleClock; + +MainController::MainController(Evas_Object *parent) + : MainLayout(parent) + , m_pTimeView(nullptr) +{ + m_pTimeView = new DateTimeView(getEo()); + MainLayout::setDateTime(*m_pTimeView); + updateTime(); +} + +MainController::~MainController() +{ +} + +void MainController::onPause() +{ + LOG(""); +} + +void MainController::onResume() +{ + LOG(""); + dispTime(); +} + +void MainController::onControl(app_control_h app_control) +{ + LOG(""); +} + +void MainController::onTick(watch_time_h watch_time) +{ + LOG(""); + dispTime(watch_time); +} + +void MainController::onAmbientTick(watch_time_h watch_time) +{ + LOG(""); + dispTime(watch_time); +} + +void MainController::onAmbientChanged(bool ambient_mode) +{ + LOG(""); +} + +void MainController::onLanguageChanged(app_event_info_h appEvent) +{ + LOG(""); + updateTime(); +} + +void MainController::onLowBattery(app_event_info_h appEvent) +{ + LOG(""); +} + +void MainController::onRegionChanged(app_event_info_h appEvent) +{ + LOG(""); + updateTime(); +} + +void MainController::onTimeFormatChanged() +{ + LOG(""); + updateTime(); +} + +void MainController::onTimeChanged() +{ + LOG(""); + updateTime(); +} + +void MainController::dispTime() +{ + dispTime(time(nullptr)); +} + +void MainController::dispTime(time_t tt) +{ + std::string timeStr = m_Formatter.getTime(tt); + LOG("Time: ", timeStr); + + char *lexeme = strtok(const_cast<char*>(timeStr.c_str()), ":"); + std::string hoursStr = lexeme; + lexeme = strtok(nullptr, ":"); + std::string minutesStr = lexeme; + + m_pTimeView->setHours(hoursStr); + m_pTimeView->setMinutes(minutesStr); +} + +void MainController::dispTime(watch_time_h watch_time) +{ + time_t tt = {}; + if (watch_time_get_utc_timestamp(watch_time, &tt) == 0) + dispTime(tt); +} + +void MainController::updateTime() +{ + LOG(""); + m_Formatter.set24hTimeFormat(WatchApp::getInst().is24TimeFormat()); + m_Formatter.setTimeZone(WatchApp::getInst().getTimeZone()); + m_Formatter.setRegion(WatchApp::getInst().getCountry()); + m_Formatter.update(); + dispTime(); +} diff --git a/src/App/src/MainLayout.cpp b/src/App/src/MainLayout.cpp new file mode 100644 index 0000000..9c779f6 --- /dev/null +++ b/src/App/src/MainLayout.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MainLayout.h" +#include "Resource.h" +#include "PathUtils.h" +#include "Logger.h" +#include "LangUtils.h" +#include "Callback.h" + +using namespace IdleClock; + +MainLayout::MainLayout(Evas_Object *parent) +{ + setEo(View::addLayout(parent, MAINT_LAYOUT_EDJ, "main")); +} + +MainLayout::~MainLayout() +{ +} + +void MainLayout::setDateTime(Evas_Object *dateTime) +{ + setContent(dateTime, "time.part"); +} diff --git a/src/App/src/WatchApp.cpp b/src/App/src/WatchApp.cpp new file mode 100644 index 0000000..dbc6a60 --- /dev/null +++ b/src/App/src/WatchApp.cpp @@ -0,0 +1,214 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "WatchApp.h" + +#include "PathUtils.h" +#include "Logger.h" +#include "Callback.h" +#include "MainController.h" +#include "WatchWindow.h" + +#include <efl_extension.h> + +using namespace IdleClock; + +WatchApp WatchApp::m_AppInst; + +WatchApp::WatchApp() + : m_pWindow(nullptr) + , m_pRootController(nullptr) +{ +} + +WatchApp::~WatchApp() +{ +} + +WatchApp &WatchApp::getInst() +{ + return m_AppInst; +} + +void WatchApp::exit() +{ + watch_app_exit(); +} + +WatchWindow &WatchApp::getWindow() +{ + ASSERT(m_pWindow, "Window is null"); + return *m_pWindow; +} + +const WatchWindow &WatchApp::getWindow() const +{ + return const_cast<WatchApp*>(this)->getWindow(); +} + +int WatchApp::start(int argc, char *argv[]) +{ + watch_app_lifecycle_callback_s cbs = {}; + + cbs.create = makeCbLast(&WatchApp::onCreate); + cbs.terminate = makeCbLast(&WatchApp::onTerminate); + cbs.pause = makeCbLast(&WatchApp::onPause); + cbs.resume = makeCbLast(&WatchApp::onResume); + cbs.app_control = makeCbLast(&WatchApp::onControl); + cbs.time_tick = makeCbLast(&WatchApp::onTick); + cbs.ambient_tick = makeCbLast(&WatchApp::onAmbientTick); + cbs.ambient_changed = makeCbLast(&WatchApp::onAmbientChanged); + + app_event_handler_h events[3] = {}; + + watch_app_add_event_handler(&events[0], APP_EVENT_LANGUAGE_CHANGED, makeCbLast(&WatchApp::onLanguageChanged), this); + watch_app_add_event_handler(&events[1], APP_EVENT_REGION_FORMAT_CHANGED, makeCbLast(&WatchApp::onRegionChanged), this); + watch_app_add_event_handler(&events[2], APP_EVENT_LOW_BATTERY, makeCbLast(&WatchApp::onLowBattery), this); + + system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, makeCbLast(&WatchApp::onTimeFormatChanged), this); + system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_TIME_CHANGED, makeCbLast(&WatchApp::onTimeChanged), this); + + return watch_app_main(argc, argv, &cbs, this); +} + +std::string WatchApp::getStr(system_settings_key_e key) const +{ + std::string res; + char *value = nullptr; + system_settings_get_value_string(key, &value); + if (value) { + res = value; + free(value); + } + return res; +} + +std::string WatchApp::getLang() const +{ + return getStr(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE); +} + +std::string WatchApp::getTimeZone() const +{ + return getStr(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE); +} + +std::string WatchApp::getCountry() const +{ + return getStr(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY); +} + +bool WatchApp::is24TimeFormat() const +{ + bool value = false; + system_settings_get_value_bool(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, &value); + return value; +} + +bool WatchApp::onCreate(int width, int height) +{ + TRACE; + + std::string localePath(PathUtils::getLocalePath()); + if (!localePath.empty()) + bindtextdomain(PROJECT_NAME, localePath.c_str()); + + elm_app_base_scale_set(1.3); + elm_config_accel_preference_set("3d"); + watch_app_set_time_tick_frequency(1, WATCH_APP_TIME_TICKS_PER_MINUTE); + + m_pWindow = new WatchWindow; + m_pWindow->resize(width, height); + m_pWindow->show(); + + m_pRootController = new MainController(m_pWindow->getLayout()); + m_pWindow->setContent(*m_pRootController); + + return true; +} + +void WatchApp::onTerminate() +{ + TRACE; + m_pWindow->destroy(); +} + +void WatchApp::onTimeFormatChanged(system_settings_key_e key) +{ + if (m_pRootController) + m_pRootController->onTimeFormatChanged(); +} + +void WatchApp::onTimeChanged(system_settings_key_e key) +{ + if (m_pRootController) + m_pRootController->onTimeChanged(); +} + +void WatchApp::onPause() +{ + if (m_pRootController) + m_pRootController->onPause(); +} + +void WatchApp::onResume() +{ + if (m_pRootController) + m_pRootController->onResume(); +} + +void WatchApp::onTick(watch_time_h watch_time) +{ + if (m_pRootController) + m_pRootController->onTick(watch_time); +} + +void WatchApp::onAmbientTick(watch_time_h watch_time) +{ + if (m_pRootController) + m_pRootController->onAmbientTick(watch_time); +} + +void WatchApp::onAmbientChanged(bool ambient_mode) +{ + if (m_pRootController) + m_pRootController->onAmbientChanged(ambient_mode); +} + +void WatchApp::onControl(app_control_h app_control) +{ + if (m_pRootController) + m_pRootController->onControl(app_control); +} + +void WatchApp::onLanguageChanged(app_event_info_h appEvent) +{ + if (m_pRootController) + m_pRootController->onLanguageChanged(appEvent); +} + +void WatchApp::onLowBattery(app_event_info_h appEvent) +{ + if (m_pRootController) + m_pRootController->onLowBattery(appEvent); +} + +void WatchApp::onRegionChanged(app_event_info_h appEvent) +{ + if (m_pRootController) + m_pRootController->onRegionChanged(appEvent); +} + diff --git a/src/Common/inc/Atspi.h b/src/Common/inc/Atspi.h new file mode 100644 index 0000000..b92bdc8 --- /dev/null +++ b/src/Common/inc/Atspi.h @@ -0,0 +1,154 @@ +/* + * Copyright 2016 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef Atspi_h_ +#define Atspi_h_ + +#include "LangUtils.h" +#include "Config.h" + +#include <Elementary.h> + +namespace IdleClock { + /** + * @brief Wrapper for Elm_Interface_Atspi_Accessible interface (Screen reader) + */ + class Atspi { + public: + Atspi(); + Atspi(Elm_Interface_Atspi_Accessible *obj); + void wrap(Elm_Interface_Atspi_Accessible *obj); + Elm_Interface_Atspi_Accessible *getEo() const; + operator Elm_Interface_Atspi_Accessible *() const; + + void setDescription(const char *text); + void setDescription(const std::string &text); + void setName(const char *text); + void setName(const std::string &text); + void setRole(Elm_Atspi_Role role); + void setReadingInfo(Elm_Accessible_Reading_Info_Type type); + void appendRel(Elm_Atspi_Relation_Type type, const Elm_Interface_Atspi_Accessible *obj); + void removeRel(Elm_Atspi_Relation_Type type, const Elm_Interface_Atspi_Accessible *obj); + void canHighlight(bool canHighlight); + void setActionCb(const Elm_Access_Action_Type type, const Elm_Access_Action_Cb cb, const void *data); + + void makeStartPosition(Elm_Interface_Atspi_Accessible *obj); + void appendFlowRel(Elm_Interface_Atspi_Accessible *obj); + void removeFlowRel(Elm_Interface_Atspi_Accessible *obj); + + // TODO: impl. other methods if needed + + private: + Elm_Interface_Atspi_Accessible *m_pEo; + }; + + inline Atspi::Atspi() + : m_pEo(nullptr) + { + } + + inline Atspi::Atspi(Elm_Interface_Atspi_Accessible *obj) + : m_pEo(obj) + { + } + + inline void Atspi::wrap(Elm_Interface_Atspi_Accessible *obj) + { + m_pEo = obj; + } + + inline Elm_Interface_Atspi_Accessible *Atspi::getEo() const + { + return m_pEo; + } + + inline Atspi::operator Elm_Interface_Atspi_Accessible *() const + { + return getEo(); + } + + inline void Atspi::setDescription(const char *text) + { + elm_atspi_accessible_description_set(m_pEo, text); + elm_atspi_accessible_translation_domain_set(m_pEo, PACKAGE_NAME); + } + + inline void Atspi::setDescription(const std::string &text) + { + setDescription(text.c_str()); + } + + inline void Atspi::setName(const char *text) + { + elm_atspi_accessible_name_set(m_pEo, (char*)text); + } + + inline void Atspi::setName(const std::string &text) + { + setName(text.c_str()); + } + + inline void Atspi::setRole(Elm_Atspi_Role role) + { + elm_atspi_accessible_role_set(m_pEo, role); + } + + inline void Atspi::setReadingInfo(Elm_Accessible_Reading_Info_Type type) + { + elm_atspi_accessible_reading_info_type_set(m_pEo, type); + } + + inline void Atspi::appendRel(Elm_Atspi_Relation_Type type, const Elm_Interface_Atspi_Accessible *obj) + { + elm_atspi_accessible_relationship_append(m_pEo, type, obj); + } + + inline void Atspi::removeRel(Elm_Atspi_Relation_Type type, const Elm_Interface_Atspi_Accessible *obj) + { + elm_atspi_accessible_relationship_remove(m_pEo, type, obj); + } + + inline void Atspi::canHighlight(bool canHighlight) + { + elm_atspi_accessible_can_highlight_set(m_pEo, canHighlight); + } + + inline void Atspi::setActionCb(const Elm_Access_Action_Type type, const Elm_Access_Action_Cb cb, const void *data) + { + elm_access_action_cb_set(m_pEo, type, cb, data); + } + + inline void Atspi::makeStartPosition(Elm_Interface_Atspi_Accessible *obj) + { + elm_atspi_accessible_relationship_append(m_pEo, ELM_ATSPI_RELATION_FLOWS_FROM, m_pEo); + elm_atspi_accessible_relationship_append(m_pEo, ELM_ATSPI_RELATION_FLOWS_TO, obj); + elm_atspi_accessible_relationship_append(obj, ELM_ATSPI_RELATION_FLOWS_FROM, m_pEo); + } + + inline void Atspi::appendFlowRel(Elm_Interface_Atspi_Accessible *obj) + { + elm_atspi_accessible_relationship_append(m_pEo, ELM_ATSPI_RELATION_FLOWS_TO, obj); + elm_atspi_accessible_relationship_append(obj, ELM_ATSPI_RELATION_FLOWS_FROM, m_pEo); + } + + inline void Atspi::removeFlowRel(Elm_Interface_Atspi_Accessible *obj) + { + elm_atspi_accessible_relationship_remove(m_pEo, ELM_ATSPI_RELATION_FLOWS_TO, obj); + elm_atspi_accessible_relationship_remove(obj, ELM_ATSPI_RELATION_FLOWS_FROM, m_pEo); + } +} + +#endif /* Atspi_h_ */ diff --git a/src/Common/inc/BaseView.h b/src/Common/inc/BaseView.h new file mode 100644 index 0000000..fbdd988 --- /dev/null +++ b/src/Common/inc/BaseView.h @@ -0,0 +1,82 @@ +/* + * Copyright 2016 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef BaseView_h_ +#define BaseView_h_ + +#include "Atspi.h" +#include <Evas.h> +#include "PathUtils.h" + +namespace IdleClock +{ + /** + * @brief Basic interface for all visual objects used across the whole application. + */ + class BaseView + { + public: + BaseView(); + virtual ~BaseView() {}; + + operator Evas_Object *() const; + Eo *getEo() const; + + /** + * @brief Gets AtspiAccessibleInterface wrapper + * @return wrapper to AtspiAccessibleInterface + */ + Atspi getAtspi() const; + + protected: + void setEo(Eo *eo); + + /** + * @brief Performs self-removing by request from children-classes. + */ + virtual void onViewDestroyed() { delete this; }; + + protected: + Eo *m_pEo; + }; + + inline BaseView::BaseView() + : m_pEo(nullptr) + { + } + + inline Atspi BaseView::getAtspi() const + { + return Atspi(m_pEo); + } + + inline BaseView::operator Eo *() const + { + return m_pEo; + } + + inline Eo *BaseView::getEo() const + { + return m_pEo; + } + + inline void BaseView::setEo(Eo *eo) + { + m_pEo = eo; + } +} + +#endif /* BaseView_h_ */ diff --git a/src/Common/inc/Callback.h b/src/Common/inc/Callback.h new file mode 100644 index 0000000..f71259d --- /dev/null +++ b/src/Common/inc/Callback.h @@ -0,0 +1,43 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef Callback_h_ +#define Callback_h_ + +template <class F> +struct Callback; + +template <class R, class C, class... A> +struct Callback<R(C::*)(A...)> { + using M = R(C::*)(A...); + + template <M m> + static R stubFirst(void *obj, A... args) + { + return (static_cast<C*>(obj)->*m)(args...); + } + + template <M m> + static R stubLast(A... args, void *obj) + { + return (static_cast<C*>(obj)->*m)(args...); + } +}; + +#define makeCbFirst(method) Callback<decltype(method)>::stubFirst<method> +#define makeCbLast(method) Callback<decltype(method)>::stubLast<method> + +#endif // Callback_h_ diff --git a/src/Common/inc/I18nString.h b/src/Common/inc/I18nString.h new file mode 100644 index 0000000..89f61b9 --- /dev/null +++ b/src/Common/inc/I18nString.h @@ -0,0 +1,57 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef I18nString_h_ +#define I18nString_h_ + +#include <string> +#include <utils_i18n.h> + +namespace IdleClock { + + class I18nString : + private std::basic_string<i18n_uchar> { + + public: + I18nString(); + I18nString(const I18nString &that); + I18nString(I18nString &&that); + I18nString(size_t count); + I18nString(const char *str); + I18nString(const i18n_uchar *uStr); + I18nString(const std::string &str); + + I18nString &operator=(const I18nString &that); + i18n_uchar *getUStr() const; + operator i18n_uchar *() const; + int getLen() const; + std::string toStr() const; + size_t getCapacity() const; + void clear(); + bool isEmpty() const; + + private: + using Impl = std::basic_string<i18n_uchar>; + + private: + void copyStr(const I18nString &that); + void copyStr(const i18n_uchar *uStr); + void copyStr(const std::string &str); + void copyStr(const char *str); + }; +} + +#endif /* I18nString_h_ */ diff --git a/src/Common/inc/LangUtils.h b/src/Common/inc/LangUtils.h new file mode 100644 index 0000000..659793b --- /dev/null +++ b/src/Common/inc/LangUtils.h @@ -0,0 +1,149 @@ +/* + * Copyright 2016 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LangUtils_h_ +#define LangUtils_h_ + +#include "Resource.h" +#include "Config.h" + +#include <string> +#include <libintl.h> +#include <stdio.h> +#include <stdarg.h> +#include <cstddef> + +namespace IdleClock +{ + // Translatable Text + struct TText + { + // Constructor for nullptr; + TText(std::nullptr_t) + : m_pDomain(nullptr) + , m_IsTranslatable(false) + { + } + + // Move Constructor; + TText(TText &&text) + : m_pDomain(text.m_pDomain) + , m_Str(std::move(text.m_Str)) + , m_IsTranslatable(text.m_IsTranslatable) + { + } + + // Constructor for C string + TText(const char *str, bool translatable = false, const char *domainName = APP_DOMAIN) + : m_pDomain(domainName) + , m_Str(str ? str : "") + , m_IsTranslatable(translatable) + { + } + + // Constructor for C++ string + TText(std::string str, bool translatable = false, const char *domainName = APP_DOMAIN) + : m_pDomain(domainName) + , m_Str(std::move(str)) + , m_IsTranslatable(translatable) + { + } + + void clear() + { + m_Str.clear(); + m_pDomain = nullptr; + m_IsTranslatable = false; + } + + const char *getMsg() const + { + return m_Str.c_str(); + } + + const char *getDomain() const + { + if (m_pDomain && m_pDomain[0] == 0) + return nullptr; + return m_pDomain; + } + + bool isTranslatable() const + { + return m_IsTranslatable; + } + + private: + const char *m_pDomain; + std::string m_Str; + bool m_IsTranslatable; + }; + + // dgettext + struct DText + { + explicit DText(const char *stringId, const char *domainName) + { + m_pMsg = dgettext(domainName, stringId); + } + + explicit DText(const std::string &stringId, const char *domainName) + { + m_pMsg = dgettext(domainName, stringId.c_str()); + } + + explicit DText(char dummyArg, const char *stringId, const char *domainName, ...) + : m_pMsg(m_Buf) + { + va_list args; + va_start(args, domainName); + vsnprintf(m_Buf, maxBufSize, dgettext(domainName, stringId), args); + va_end(args); + } + + const char *get() const + { + return m_pMsg; + } + + const char* cStr() const + { + return m_pMsg; + } + + operator std::string() const + { + return m_pMsg; + } + + private: + DText(DText&) = delete; + DText operator =(DText&) = delete; + + static const int maxBufSize = 1024; + char m_Buf[maxBufSize]; + const char *m_pMsg; + }; + + #define msgt(strId) TText(strId, true, MSG_DOMAIN) + #define msg(strId) DText(strId, MSG_DOMAIN) + #define msgArgs(strId, ...) DText(0, strId, MSG_DOMAIN, __VA_ARGS__) + #define sys(strId) DText(strId, SYS_DOMAIN) + #define syst(strId) TText(strId, true, SYS_DOMAIN) + #define sysArgs(strId, ...) DText(0, strId, SYS_DOMAIN, __VA_ARGS__) +} + +#endif /* LangUtils_h_ */ diff --git a/src/Common/inc/Logger.h b/src/Common/inc/Logger.h new file mode 100644 index 0000000..14b6bab --- /dev/null +++ b/src/Common/inc/Logger.h @@ -0,0 +1,87 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LOGGER_H_ +#define LOGGER_H_ + +#include "Config.h" +#include <assert.h> +#include <dlog.h> +#include <string> +#include <sstream> + +#ifndef LOGGER_TAG + #error "Please define LOGGER_TAG" +#endif + +enum class LogPriority +{ + DEFAULT = DLOG_DEFAULT, + VERBOSE = DLOG_VERBOSE, /**< Verbose */ + DEBUG = DLOG_DEBUG, /**< Debug */ + INFO = DLOG_INFO, /**< Info */ + WARN = DLOG_WARN, /**< Warning */ + ERROR = DLOG_ERROR, /**< Error */ + FATAL = DLOG_FATAL, /**< Fatal */ + SILEN = DLOG_SILENT, /**< Silent */ + MAX = DLOG_PRIO_MAX/**< Keep this always at the end. */ +}; + +template<typename... Tail> +void loggerImpl(LogPriority prior + , const char *tag + , const char *file, const char *function, int line + , Tail... msg) +{ + std::ostringstream messageStr; + (void)std::initializer_list<bool> { (messageStr << msg, true)... }; + dlog_print(static_cast<log_priority>(prior) + , tag, "%s: %s(%d) -> %s", file, function, line + , messageStr.str().c_str()); +} + +class LoggerImpl +{ + public: + LoggerImpl(const char *tag, const char *file, const char *function, int line); + ~LoggerImpl(); + + private: + const std::string m_Tag; + const std::string m_File; + const std::string m_Function; +}; + +#define TRACE\ + LoggerImpl __tmp_logger_unique(LOGGER_TAG, __FILE__, __FUNCTION__, __LINE__);\ + +#define LOG(...)\ + loggerImpl(LogPriority::INFO, LOGGER_TAG, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__); + +#define LOG_INFO(...)\ + loggerImpl(LogPriority::INFO, LOGGER_TAG, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__); + +#define LOG_ERROR(...)\ + loggerImpl(LogPriority::ERROR, LOGGER_TAG, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__); + +#define LOG_WARN(...)\ + loggerImpl(LogPriority::WARN, LOGGER_TAG, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__); + +#define ASSERT(expr, ...)\ + if (!(expr)) { LOG_ERROR(__VA_ARGS__); } \ + assert(expr) + +#endif /* LOGGER_H_ */ diff --git a/src/Common/inc/PathUtils.h b/src/Common/inc/PathUtils.h new file mode 100644 index 0000000..177ac97 --- /dev/null +++ b/src/Common/inc/PathUtils.h @@ -0,0 +1,73 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef PathUtils_h_ +#define PathUtils_h_ + +#include <string> +#include "Resource.h" + +namespace IdleClock { + namespace PathUtils { + /** + * @brief Gets the absolute path to file in the application resource directory. + * @param[in] path to file in res. dir (without slash at begin/end) + * @return absolute path to file + */ + std::string getResourcePath(const std::string &filePath); + + /** + * @brief Gets the absolute path to file in data directory which is used to store private data of the application. + * @param[in] path to file in data dir (without slash at begin/end) + * @return absolute path to file + */ + std::string getDataPath(const std::string &filePath); + + /** + * @brief Gets absolute path to application's resource-directory + * @return absolute path in case of success, or empty string otherwise + */ + std::string getResourcePath(); + + /** + * @brief Gets absolute path to application's locale-directory + * @return absolute path in case of success, or empty string otherwise + */ + std::string getLocalePath(); + + /** + * @brief Gets absolute path to Dowloads directory + * @return absolute path in case of success, or empty string otherwise + */ + const std::string &getDownloadPath(); + + /** + * @brief Gets the absolute path to edje file + * @param[in] base edje file name + * @return absolute path to file + */ + std::string getEdjePath(const std::string &fileName); + + /** + * @brief Gets the absolute path to app. shared resource file + * @param[in] base file name + * @return absolute path to file + */ + std::string getSharedResPath(const std::string &fileName); + }; +} + +#endif /* PathUtils_h_ */ diff --git a/src/Common/inc/View.h b/src/Common/inc/View.h new file mode 100644 index 0000000..803ef0b --- /dev/null +++ b/src/Common/inc/View.h @@ -0,0 +1,622 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef View_h_ +#define View_h_ + +#include <Atspi.h> +#include "BaseView.h" +#include "LangUtils.h" +#include <Elementary.h> +#include <efl_extension.h> + +namespace IdleClock { + /** + * @brief Wraps all basic Evas_Object operations and manages automatic self-removal by EVAS_CALLBACK_FREE and EVAS_CALLBACK_DEL events. + */ + class View + : public BaseView + { + public: + View(); + + /** + * @brief Destroys nested Evas_Object. + */ + void destroy(); + operator Evas_Object *() const; + Evas_Object *getEo() const; + + /** + * @brief Checks whether view is visible or not. + * @return true if view is visible, otherwise false. + */ + bool isVisible() const; + + /** + * @brief Shows view. + * @param[in] value - true show, false - otherwise + */ + void show(bool value = true); + + /** + * @brief Moves view to specified Evas-coordinates. + * @param[in] x x-coordinate + * @param[in] y y-coordinate + */ + void move(Evas_Coord x, Evas_Coord y); + + /** + * @brief Sets size-weight hints. + * @param[in] x x-coordinate + * @param[in] y y-coordinate + */ + void setSizeHintWeight(double x, double y); + + /** + * @brief Sets size-align hints. + * @param[in] x x-coordinate + * @param[in] y y-coordinate + */ + void setSizeHintAlign(double x, double y); + + /** + * @brief Sets size-weight and size-align hints in order to make view expanded. + */ + void expand(); + + /** + * @brief Sets specified Evas_object's size-weight and size-align hints in order to make it expanded. + * @param[in] obj an Evas_Object to be expanded. + */ + static void expand(Evas_Object *obj); + + /** + * @brief Sets min size hints. + * @param[in] w width hint. + * @param[in] h height hint. + */ + void setSizeHintMin(Evas_Coord w, Evas_Coord h); + + /** + * @brief Sets max size hints. + * @param[in] w width hint. + * @param[in] h height hint. + */ + void setSizeHintMax(Evas_Coord w, Evas_Coord h); + + /** + * @brief Gets min size hints. + * @param[out] w width hint. + * @param[out] h height hint. + */ + void getSizeHintMin(Evas_Coord *w, Evas_Coord *h) const; + + /** + * @brief Gets max size hints. + * @param[out] w width hint. + * @param[out] h height hint. + */ + void getSizeHintMax(Evas_Coord *w, Evas_Coord *h) const; + + /** + * @brief Sets specified content into specified part. + * @param[in] content a content to set into view. + * @param[in] part a part content should be placed to. If part is nullptr the default part is used. + * @param[in] saveOldContent a flag that checks whether old view's content should be returned or not. + * @return if saveOldContent is true returns old content set into view before, otherwise returns nullptr. + */ + Evas_Object *setContent(Evas_Object *content, const char *part = nullptr, bool saveOldContent = false); + static Evas_Object *setContent(Evas_Object *obj, Evas_Object *content, const char *part = nullptr, bool saveOldContent = false); + + /** + * @brief Unsets view's content. + * @param[in] part a part content should be removed from. If part is nullptr the default part is used. + * @return old view's content in case of success, nullptr in case of errors. + */ + Evas_Object *unsetContent(const char *part = nullptr); + + /** + * @brief Gets view's content. + * @param[in] part a content-part. If part is nullptr the default part is used. + * @return view's content in case of success, nullptr in case of errors. + */ + Evas_Object* getContent(const char *part = nullptr) const; + + /** + * @brief Set the ability for an view object to be focused. + * @param[in] enable if true view is enabled to be focused, otherwise it can not be focused. + */ + void setFocusAllow(bool enable); + + /** + * @brief Checks whether view can be focused or not. + * @return true if view is able to be focused, otherwise false. + */ + bool getFocusAllow() const; + + /** + * @brief Sets(unsets) focus to view. + * @param[in] focus if true sets focus to view, otherwise unfocuses it. + */ + void setFocus(bool focus); + + /** + * @brief Checks whether view is focused or not. + * @return true if view is focused, otherwise false. + */ + bool getFocus() const; + + /** + * @brief Mark the part text to be translatable or not. + * @param[in] translatable @c true, the part text will be translated internally. @c false, otherwise. + * @param[in] domain The translation domain to use. + * @param[in] part The part name of the translatable text, if part is nullptr the default part is used. + */ + void setTranslatable(bool translatable, const char *domain, const char *part = nullptr); + + /** + * @brief Sends a signal to edje-object. + * @param[in] emission The signal's name. + * @param[in] source The signal's source. + * @param[in] async true - process an object's message queue in job/timer, false - process immediately. + */ + void emitSignal(const char *emission, const char *source = "", bool async = false); + + /** + * @brief Sends a signal to edje-object. + * @param[in] obj Target object + * @param[in] emission The signal's name. + * @param[in] source The signal's source. + * @param[in] async true - process the signal postponed, false - process immediately. + */ + static void emitSignal(Evas_Object *obj, const char *emission, const char *source = "", bool async = false); + + /** + * @brief Process all edje signals for object + * @param[in] obj Target object + */ + static void processSignal(Evas_Object *obj); + + /** + * @brief Process edje signals for object + */ + void processSignal(); + + /** + * @brief Process all edje signals + */ + static void processSignals(); + + /** + * @brief Sets user-data associated with specified key-string. + * @param[in] key a string-key. + * @param[in] data to be stored. + */ + void setData(const char *key, const void *data); + + /** + * @brief Sets the view mirrored mode. + * @param[in] obj evas object + * @param[in] true to set mirrored mode, false othewise + */ + static void setMirrored(Evas_Object *obj, bool mirrored); + void setMirrored(bool mirrored); + + /** + * @brief Gets data associated with specified key-string. + * @param[in] key a string-key. + * @return user-data. + */ + void *getData(const char *key) const; + void addEventCb(Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data); + void addSmartCb(const char *event, Evas_Smart_Cb func, const void *data); + void addSignalCb(const char *emission, const char *source, Edje_Signal_Cb func, void *data); + void addHwButtonEvent(Eext_Callback_Type cbType, Eext_Event_Cb cb, void *data); + void HwButtonEvent(Eext_Callback_Type cbType, Eext_Event_Cb cb, void *data); + + static void addHwButtonEvent(Evas_Object *obj, Eext_Callback_Type cbType, Eext_Event_Cb cb, void *data); + static void addEventCb(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data); + static void addSmartCb(Evas_Object *obj, const char *event, Evas_Smart_Cb func, const void *data); + static void addSignalCb(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func, void *data); + + template<typename T> + static T staticCast(void *evasObj); + template<typename T> + static T reinterpretCast(void *evasObj); + template<typename T> + static T dynamicCast(void *evasObj); + + /** + * @brief Gets text placed in specified part. + * @param[in] part a part to get text from. If part is nullptr the default part is used. + * @return a text part contains. If part contains no text returns empty string. + */ + std::string getText(const char *part = nullptr) const; + + /** + * @brief A C-style implementation of getText(). + */ + const char *getTextCStr(const char *part = nullptr) const; + + /** + * @brief Sets IDS of translatable string into specified part. + * @param[in] text a translatable text to be set in specified part. + * @param[in] part a part to get text from. If part is nullptr the default part is used. + */ + void setText(const TText &text, const char *part = nullptr); + + /** + * @brief Set the style to used by a given widget + * @param[in] style The name of the style to use on it + */ + void setStyle(const char *style); + static void setStyle(Evas_Object *obj, const char *style); + + /** + * @brief Gets the edje object + * @return edje object + */ + Evas_Object *getEdje() const; + + /** + * @brief Gets evas + * @return pointer to evas + */ + Evas *getEvas() const; + + /** + * @brief Resize view + * @param[in] w width + * @param[in] h height + */ + void resize(Evas_Coord w, Evas_Coord h); + + Atspi registerAccessObj(const char *part); + static Atspi registerAccessObj(Evas_Object *obj, const char *part); + Atspi registerAccessObj(Evas_Object *parent); + void unregisterAccessObj(); + static Atspi registerAccessObj(Evas_Object *obj, Evas_Object *parent); + static void unregisterAccessObj(Evas_Object *obj); + static Atspi getAccessObj(Evas_Object *obj); + Atspi getAccessObj() const; + + static void setText(Evas_Object *obj, const TText &text, const char *part = nullptr); + + static Evas_Object *addLayout(Evas_Object *parent, const std::string &edjePath, const std::string &group); + + protected: + virtual ~View(); + + /** + * @brief Allows children-classes to perform some cleanup activities before their destroying. + */ + virtual void onBeforeDelete() {}; + void setEo(Evas_Object *eo); + + private: + View(View&) = delete; + View& operator=(View&) = delete; + Evas_Object_Event_Cb getCb(Evas_Callback_Type); + void *getData() const; + static void *getData(Evas_Object *obj); + void setData(const void *data); + static void setData(Evas_Object *obj, const void *data); + + private: + static void on_free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); + static void on_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); + }; + + std::string markupToUtf8(const char *str); + std::string utf8ToMarkup(const char *str); + std::string markupToUtf8(const std::string &str); + std::string utf8ToMarkup(const std::string &str); + + inline View::operator Evas_Object *() const + { + return m_pEo; + } + + inline Evas_Object *View::getEo() const + { + return (Evas_Object*)BaseView::getEo(); + } + + inline void View::destroy() + { + evas_object_del(m_pEo); + } + + inline bool View::isVisible() const + { + return evas_object_visible_get(m_pEo); + } + + inline void View::show(bool value) + { + value ? evas_object_show(m_pEo) : evas_object_hide(m_pEo); + } + + inline void View::setSizeHintWeight(double x, double y) + { + evas_object_size_hint_weight_set(m_pEo, x, y); + } + + inline void View::setSizeHintAlign(double x, double y) + { + evas_object_size_hint_align_set(m_pEo, x, y); + } + + inline void View::setSizeHintMin(Evas_Coord w, Evas_Coord h) + { + evas_object_size_hint_min_set(m_pEo, w, h); + } + + inline void View::setSizeHintMax(Evas_Coord w, Evas_Coord h) + { + evas_object_size_hint_max_set(m_pEo, w, h); + } + + inline void View::getSizeHintMin(Evas_Coord *w, Evas_Coord *h) const + { + evas_object_size_hint_min_get(m_pEo, w, h); + }; + + inline void View::getSizeHintMax(Evas_Coord *w, Evas_Coord *h) const + { + evas_object_size_hint_max_get(m_pEo, w, h); + } + + inline void View::move(Evas_Coord x, Evas_Coord y) + { + evas_object_move(m_pEo, x, y); + } + + inline Evas_Object* View::getContent(const char *part) const + { + return elm_object_part_content_get(m_pEo, part); + } + + inline void View::setFocusAllow(bool enable) + { + elm_object_focus_allow_set(m_pEo, enable); + } + + inline bool View::getFocusAllow() const + { + return elm_object_focus_allow_get(m_pEo); + } + + inline void View::setFocus(bool focus) + { + return elm_object_focus_set(m_pEo, focus); + } + + inline bool View::getFocus() const + { + return elm_object_focus_get(m_pEo); + } + + inline void View::setTranslatable(bool translatable, const char *domain, const char *part) + { + elm_object_domain_part_text_translatable_set(m_pEo, part, domain, translatable); + } + + inline void View::emitSignal(const char *emission, const char *source, bool async) + { + emitSignal(m_pEo, emission, source, async); + } + + inline void View::processSignal() + { + processSignal(m_pEo); + } + + inline void View::processSignals() + { + edje_message_signal_process(); + } + + inline void View::setText(const TText &text, const char *part) + { + setText(m_pEo, text, part); + } + + inline void View::setStyle(const char *style) + { + setStyle(getEo(), style); + } + + inline void View::setStyle(Evas_Object *obj, const char *style) + { + elm_object_style_set(obj, style); + } + + inline void View::setText(Evas_Object *obj, const TText &text, const char *part) + { + if (text.isTranslatable()) + elm_object_domain_translatable_part_text_set(obj, part, text.getDomain(), text.getMsg()); + else { + elm_object_part_text_translatable_set(obj, part, false); + elm_object_part_text_set(obj, part, text.getMsg()); + } + } + + inline std::string View::getText(const char *part) const + { + const char *text = getTextCStr(part); + return text ? text : ""; + } + + inline const char *View::getTextCStr(const char *part) const + { + return elm_object_part_text_get(m_pEo, part); + } + + inline void View::setData(const char *key, const void *data) + { + evas_object_data_set(m_pEo, key, data); + } + + inline void *View::getData(const char *key) const + { + return evas_object_data_get(m_pEo, key); + } + + inline void View::setData(const void *data) + { + setData(m_pEo, data); + } + + inline void *View::getData() const + { + return getData(m_pEo); + } + + inline void View::resize(Evas_Coord w, Evas_Coord h) + { + evas_object_resize(m_pEo, w, h); + } + + template<typename T> + inline T View::staticCast(void *evasObj) + { + return static_cast<T>(getData((Evas_Object*)evasObj)); + } + + template<typename T> + inline T View::reinterpretCast(void *evasObj) + { + return reinterpret_cast<T>(getData((Evas_Object*)evasObj)); + } + + template<typename T> + inline T View::dynamicCast(void *evasObj) + { + return dynamic_cast<T>(staticCast<View*>(evasObj)); + } + + inline void View::addEventCb(Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data) + { + evas_object_event_callback_add(m_pEo, type, func, data); + } + + inline void View::addSmartCb(const char *event, Evas_Smart_Cb func, const void *data) + { + evas_object_smart_callback_add(m_pEo, event, func, data); + } + + inline void View::addSignalCb(const char *emission, const char *source, Edje_Signal_Cb func, void *data) + { + elm_object_signal_callback_add(m_pEo, emission, source, func, data); + } + + inline void View::addHwButtonEvent(Evas_Object *obj, Eext_Callback_Type cbType, Eext_Event_Cb cb, void *data) + { + eext_object_event_callback_add(obj, cbType, cb, data); + } + + inline void View::addEventCb(Evas_Object *obj, Evas_Callback_Type type, Evas_Object_Event_Cb func, const void *data) + { + evas_object_event_callback_add(obj, type, func, data); + } + + inline void View::addSmartCb(Evas_Object *obj, const char *event, Evas_Smart_Cb func, const void *data) + { + evas_object_smart_callback_add(obj, event, func, data); + } + + inline void View::addSignalCb(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func, void *data) + { + elm_object_signal_callback_add(obj, emission, source, func, data); + } + + inline void View::addHwButtonEvent(Eext_Callback_Type cbType, Eext_Event_Cb cb, void *data) + { + addHwButtonEvent(m_pEo, cbType, cb, data); + } + + inline Evas_Object *View::unsetContent(const char *part) + { + return elm_object_part_content_unset(m_pEo, part); + } + + inline Evas_Object *View::getEdje() const + { + return elm_layout_edje_get(m_pEo); + } + + inline Evas *View::getEvas() const + { + return evas_object_evas_get(m_pEo); + } + + inline void View::setMirrored(Evas_Object *obj, bool mirrored) + { + elm_object_mirrored_automatic_set(obj, mirrored); + elm_object_mirrored_set(obj, mirrored); + } + + inline void View::setMirrored(bool mirrored) + { + setMirrored(getEo(), mirrored); + } + + inline Atspi View::registerAccessObj(const char *part) + { + return registerAccessObj(m_pEo, part); + } + + inline Atspi View::registerAccessObj(Evas_Object *obj, const char *part) + { + Evas_Object *edje = elm_layout_edje_get(obj); + Evas_Object *partObj = (Evas_Object *)edje_object_part_object_get(edje, part); + return registerAccessObj(partObj, obj); + } + + inline Atspi View::registerAccessObj(Evas_Object *parent) + { + return registerAccessObj(m_pEo, parent); + } + + inline void View::unregisterAccessObj() + { + unregisterAccessObj(m_pEo); + } + + inline Atspi View::registerAccessObj(Evas_Object *obj, Evas_Object *parent) + { + return elm_access_object_register(obj, parent); + } + + inline void View::unregisterAccessObj(Evas_Object *obj) + { + elm_access_object_unregister(obj); + } + + inline Atspi View::getAccessObj(Evas_Object *obj) + { + return elm_access_object_get(obj); + } + + inline Atspi View::getAccessObj() const + { + return getAccessObj(m_pEo); + } +} + +#endif /* View_h_ */ diff --git a/src/Common/inc/WatchWindow.h b/src/Common/inc/WatchWindow.h new file mode 100644 index 0000000..7d98ff6 --- /dev/null +++ b/src/Common/inc/WatchWindow.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WatchWindow_h_ +#define WatchWindow_h_ + +#include "View.h" + +namespace IdleClock { + class WatchWindow + : public View { + public: + WatchWindow(); + virtual ~WatchWindow(); + + Evas_Object *getLayout() const; + void setContent(Evas_Object *content); + void getScreenSize(int *w, int *h) const; + int getRotation() const; + void lower(); + void raise(); + }; +} + +#endif /* WatchWindow_h_ */ diff --git a/src/Common/src/I18nString.cpp b/src/Common/src/I18nString.cpp new file mode 100644 index 0000000..8ce901e --- /dev/null +++ b/src/Common/src/I18nString.cpp @@ -0,0 +1,137 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "I18nString.h" +#include <string.h> + +using namespace IdleClock; + +I18nString::I18nString() +{ +} + +I18nString::I18nString(const I18nString &that) +{ + copyStr(that); +} + +I18nString::I18nString(I18nString &&that) + : Impl(std::move(that)) +{ +} + +I18nString::I18nString(size_t count) + : Impl(count, 0) +{ +} + +I18nString::I18nString(const char *str) +{ + copyStr(str); +} + +I18nString::I18nString(const i18n_uchar *uStr) +{ + copyStr(uStr); +} + +I18nString::I18nString(const std::string &str) + : I18nString(str.c_str()) +{ +} + +i18n_uchar *I18nString::getUStr() const +{ + return (i18n_uchar*)&front(); +} + +I18nString::operator i18n_uchar *() const +{ + return getUStr(); +} + +I18nString &I18nString::operator=(const I18nString &that) +{ + copyStr(that); + return *this; +} + +int I18nString::getLen() const +{ + return data() ? i18n_ustring_get_length(data()) : 0; +} + +std::string I18nString::toStr() const +{ + std::string res; + int len = length() * sizeof(i18n_uchar); + if (len >= 0) { + res.resize(len); + i18n_ustring_copy_au(&res.front(), data()); + } + return res; +} + +size_t I18nString::getCapacity() const +{ + return capacity(); +} + +void I18nString::clear() +{ + std::basic_string<i18n_uchar>::clear(); +} + +bool I18nString::isEmpty() const +{ + return Impl::empty(); +} + +void I18nString::copyStr(const I18nString &that) +{ + copyStr(that.getUStr()); +} + +void I18nString::copyStr(const i18n_uchar *uStr) +{ + clear(); + if (uStr) { + int len = uStr ? i18n_ustring_get_length(uStr) : 0; + resize(len); + i18n_ustring_mem_copy(getUStr(), uStr, len); + } +} + +void I18nString::copyStr(const std::string &str) +{ + clear(); + if (!str.empty()) { + size_t len = str.length(); + resize(len); + i18n_ustring_copy_ua_n(getUStr(), str.c_str(), len); + } +} + +void I18nString::copyStr(const char *str) +{ + clear(); + if (str) { + size_t len = strlen(str); + resize(len); + i18n_ustring_copy_ua_n(getUStr(), str, len); + } +} + diff --git a/src/Common/src/Logger.cpp b/src/Common/src/Logger.cpp new file mode 100644 index 0000000..1ac27ff --- /dev/null +++ b/src/Common/src/Logger.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Logger.h" + +namespace { + const std::string enterFraseFormat = "%s: %s(%d) -> [ENTER]"; + const std::string leaveFraseFormat = "%s: %s -> [LEAVE]"; + const log_priority defaultPriority = DLOG_DEBUG; +} + +LoggerImpl::LoggerImpl(const char *tag, const char *file, const char *function, int line) + : m_Tag(tag) + , m_File(file) + , m_Function(function) +{ + dlog_print(defaultPriority + , m_Tag.c_str() + , enterFraseFormat.c_str() + , m_File.c_str() + , m_Function.c_str() + , line); +} + +LoggerImpl::~LoggerImpl() +{ + dlog_print(defaultPriority + , m_Tag.c_str() + , leaveFraseFormat.c_str() + , m_File.c_str() + , m_Function.c_str()); +} diff --git a/src/Common/src/PathUtils.cpp b/src/Common/src/PathUtils.cpp new file mode 100644 index 0000000..1750fc1 --- /dev/null +++ b/src/Common/src/PathUtils.cpp @@ -0,0 +1,142 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "PathUtils.h" +#include "Logger.h" +#include "Resource.h" + +#include <storage-expand.h> +#include <stdlib.h> +#include <app.h> + +namespace IdleClock { +namespace PathUtils { + +std::string getResourcePath(const std::string &filePath) +{ + std::string res; + static std::string basePath; + if (basePath.empty()) { + char *path = app_get_resource_path(); + if (path) { + basePath = path; + free(path); + } + } + + res += basePath; + res += filePath; + + return res; +} + +std::string getDataPath(const std::string &filePath) +{ + std::string res; + static std::string basePath; + if (basePath.empty()) { + char *path = app_get_data_path(); + if (path) { + basePath = path; + free(path); + } + } + + res += basePath; + res += filePath; + + return res; +} + +std::string getResourcePath() +{ + std::string res; + char* resPath = app_get_resource_path(); + if (resPath) { + res = resPath; + free(resPath); + } + + return res; +} + +std::string getLocalePath() +{ + std::string resPath(getResourcePath()); + if (!resPath.empty()) { + resPath.append("locale"); + } + + return resPath; +} + +static bool storageCb(int storageId, storage_type_e type, storage_state_e state, const char *path, void *userData) +{ + if (type == STORAGE_TYPE_INTERNAL) { + int *internalStorage = (int *)userData; + *internalStorage = storageId; + return false; + } + return true; +} + +const std::string &getDownloadPath() +{ + static std::string downloadPath; + + if (!downloadPath.empty()) + return downloadPath; + + char *dirPath = nullptr; + int storageId = -1; + + int error = storage_foreach_device_supported(storageCb, &storageId); + if (error == STORAGE_ERROR_NONE) + storage_get_directory(storageId, STORAGE_DIRECTORY_DOWNLOADS, &dirPath); + + if (dirPath) { + downloadPath = dirPath; + free(dirPath); + } + + return downloadPath; +} + +std::string getEdjePath(const std::string &fileName) +{ + return getResourcePath(EDJ_PATH"/" + fileName); +} + +std::string getSharedResPath(const std::string &fileName) +{ + std::string res; + static std::string basePath; + if (basePath.empty()) { + char *path = app_get_shared_resource_path(); + if (path) { + basePath = path; + free(path); + } + } + + res += basePath; + res += fileName; + + return res; +} + +} // PathUtils +} // TaskMngr diff --git a/src/Common/src/View.cpp b/src/Common/src/View.cpp new file mode 100644 index 0000000..639f4c2 --- /dev/null +++ b/src/Common/src/View.cpp @@ -0,0 +1,163 @@ +/* + * Copyright 2016 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "View.h" +#include "Logger.h" +#include "PathUtils.h" + +#include <cstddef> +#include <cassert> +#include <map> + +using namespace IdleClock; + +namespace +{ + const char *thisKey = "this"; +} + +View::View() +{ +} + +View::~View() +{ +} + +void View::setEo(Evas_Object *eo) +{ + if (m_pEo) { + LOG_ERROR("m_pEo not null"); + assert(false); + return; + } + + BaseView::setEo(eo); + + if (eo) { + setData(this); + evas_object_event_callback_add(eo, EVAS_CALLBACK_FREE, on_free_cb, this); + evas_object_event_callback_add(eo, EVAS_CALLBACK_DEL, on_del_cb, this); + } +} + +Evas_Object *View::setContent(Evas_Object *obj, Evas_Object *content, const char *part, bool saveOldContent) +{ + Evas_Object *oldContent = saveOldContent ? elm_object_part_content_unset(obj, part) : nullptr; + elm_object_part_content_set(obj, part, content); + return oldContent; +} + +Evas_Object *View::setContent(Evas_Object *content, const char *part, bool saveOldContent) +{ + return setContent(m_pEo, content, part, saveOldContent); +} + +void View::on_free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + auto *view = static_cast<View*>(data); + if (view) + view->onViewDestroyed(); +} + +void View::on_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + auto *view = static_cast<View*>(data); + if (view) + view->onBeforeDelete(); +} + +void View::expand() +{ + expand(m_pEo); +} + +void View::expand(Evas_Object *obj) +{ + evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, EVAS_HINT_FILL); +} + +void View::processSignal(Evas_Object *obj) +{ + Evas_Object *edj = elm_layout_edje_get(obj); + edje_object_message_signal_process(edj); +} + +void View::emitSignal(Evas_Object *obj, const char *emission, const char *source, bool async) +{ + elm_object_signal_emit(obj, emission, source); + if (!async) + processSignal(obj); +} + +Evas_Object *View::addLayout(Evas_Object *parent, const std::string &edjePath, const std::string &group) +{ + Evas_Object *layout = elm_layout_add(parent); + std::string edjAbsPath = PathUtils::getEdjePath(edjePath); + elm_layout_file_set(layout, edjAbsPath.c_str(), group.c_str()); + return layout; +} + +void View::setData(Evas_Object *obj, const void *data) +{ + evas_object_data_set(obj, thisKey, (void*)data); +} + +void *View::getData(Evas_Object *obj) +{ + return evas_object_data_get(obj, thisKey); +} + +std::string IdleClock::markupToUtf8(const char *str) +{ + if (!str) + return std::string(); + + std::string res; + char *markup = elm_entry_markup_to_utf8(str); + if (markup) { + res = markup; + free(markup); + } + + return res; +} + +std::string IdleClock::utf8ToMarkup(const char *str) +{ + if (!str) + return std::string(); + + std::string res; + char *markup = elm_entry_utf8_to_markup(str); + if (markup) { + res = markup; + free(markup); + } + + return res; +} + +std::string IdleClock::markupToUtf8(const std::string &str) +{ + return markupToUtf8(str.c_str()); +} + +std::string IdleClock::utf8ToMarkup(const std::string &str) +{ + return utf8ToMarkup(str.c_str()); +} diff --git a/src/Common/src/WatchWindow.cpp b/src/Common/src/WatchWindow.cpp new file mode 100644 index 0000000..627f21b --- /dev/null +++ b/src/Common/src/WatchWindow.cpp @@ -0,0 +1,77 @@ +/* + * Copyright 2017 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "WatchWindow.h" +#include "Config.h" + +#include <watch_app_efl.h> + +using namespace IdleClock; + +WatchWindow::WatchWindow() +{ + Evas_Object *win = nullptr; + + watch_app_get_elm_win(&win); + if (!win) + return; + + setEo(win); + elm_win_title_set(win, PROJECT_NAME); + elm_win_borderless_set(win, true); + elm_win_alpha_set(win, false); + 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, true); + elm_win_role_set(win, "no-effect"); +} + +WatchWindow::~WatchWindow() +{ +} + +void WatchWindow::lower() +{ + elm_win_lower(getEo()); +} + +void WatchWindow::raise() +{ + elm_win_raise(getEo()); +} + +Evas_Object *WatchWindow::getLayout() const +{ + return getEo(); +} + +void WatchWindow::setContent(Evas_Object *content) +{ + expand(content); + evas_object_show(content); + elm_win_resize_object_add(getEo(), content); +} + +void WatchWindow::getScreenSize(int *w, int *h) const +{ + elm_win_screen_size_get(getEo(), nullptr, nullptr, w, h); +} + +int WatchWindow::getRotation() const +{ + return elm_win_rotation_get(getEo()); +} + diff --git a/src/clock_view.c b/src/clock_view.c deleted file mode 100755 index 6a0b7a5..0000000 --- a/src/clock_view.c +++ /dev/null @@ -1,1288 +0,0 @@ -/* - * Copyright 2017 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <app.h> -#include <app_preference.h> -#include <unistd.h> -#include <device/display.h> -#include <device/callback.h> -#include <errno.h> -#include <glib.h> -#include <system_settings.h> - -#include <utils_i18n.h> - -#include <libxml/parser.h> -#include <libxml/xpath.h> -#include <libxml/xpathInternals.h> -#include <libxml/xmlmemory.h> -#include <libxml/xmlreader.h> -#include <string.h> -#include <libxml/encoding.h> -#include <libxml/xmlwriter.h> - -#include "app_data.h" -#include "clock_view.h" -#include "window.h" -#include "log.h" -#include "util.h" - -#define MAX_PATH_LENGTH 1024 - -static struct { - int show_date; - int clock_font_color; -} setting_items_s = { - .show_date = 1, - .clock_font_color = 8, -}; - -/* -font_color : 1 - #000000 -font_color : 2 - #CEFF00 -font_color : 3 - #FF6519 -font_color : 4 - #BCFFFB -font_color : 5 - #F03880 -font_color : 6 - #FFEA00 -font_color : 7 - #673E27 -font_color : 8 - #FFFFFF -font_color : 9 - #042860 -font_color : 10 - #F2DCC5 -font_color : 11 - #F62E00 -font_color : 12 - #595959 -*/ - -static char font_color_list[][7] = { "000000", "CEFF00", "FF6519", "BCFFFB", "F03880", "FFEA00", - "673E27", "FFFFFF", "042860", "F2DCC5", "F62E00", "595959"}; - -#define DIGITAL_PREFERENCE_SHOW_DATE "showdate" -#define DIGITAL_PREFERENCE_CLOCK_FONT_COLOR "clock_font_color" - -#define FONT_DEFAULT_FAMILY_NAME "Tizen:style=Bold" -#define FONT_DEFAULT_SIZE 80 - -#define BUFFER_LENGTH 256 - - - -static void _clock_font_changed_cb(int node, void *data); - - - -void clock_view_show_clock(void *data) -{ - _D(""); - appdata *ad = data; - ret_if(!ad); - - elm_object_signal_emit(ad->ly_time, "show_effect", ""); - ad->is_show = true; -} - - - -void clock_view_hide_clock(void *data) -{ - _D(""); - appdata *ad = data; - ret_if(!ad); - - elm_object_signal_emit(ad->ly_time, "hide_effect", ""); - ad->is_show = false; -} - - - -void clock_view_set_result_data(void *data) -{ - _D(""); - appdata *ad = data; - ret_if(!ad); - - int ret = 0; - bool existing = false; - - ret = preference_is_existing(DIGITAL_PREFERENCE_SHOW_DATE, &existing); - if (!ret) { - if (!existing) ret = preference_set_int(DIGITAL_PREFERENCE_SHOW_DATE, setting_items_s.show_date); - if (0 != ret) _E("cannot set the show date(%d)", ret); - } else _E("cannot check the preference is existing(%d)"); - - ret = preference_is_existing(DIGITAL_PREFERENCE_CLOCK_FONT_COLOR, &existing); - if (!ret) { - if (!existing) ret = preference_set_int(DIGITAL_PREFERENCE_CLOCK_FONT_COLOR, setting_items_s.clock_font_color); - if (0 != ret) _E("cannot set the clock font color(%d)", ret); - } else _E("cannot check the preference is existing(%d)"); - - _clock_font_changed_cb(0, ad); -} - - - -int clock_view_parse_result_data(const char *result_data) -{ - _D(""); - retv_if(!result_data, -1); - - int i = 0; - xmlDocPtr doc = NULL; - xmlXPathContextPtr xpath_context = NULL; - xmlXPathObjectPtr xpath_obj_organization = NULL; - xmlChar *xpath_organization = (xmlChar*)"/Application/SettingsResult/Item"; - - xmlInitParser(); - - doc = xmlParseMemory(result_data, strlen(result_data)); - if (!doc) { - _E("unable to xmlParseMemory"); - return -1; - } - - /* Create xpath evaluation context */ - xpath_context = xmlXPathNewContext(doc); - if (!xpath_context) { - _E("unable to create new XPath context"); - xmlFreeDoc(doc); - return -1; - } - - xpath_obj_organization = xmlXPathEvalExpression(xpath_organization, xpath_context); - if (!xpath_obj_organization) { - _E("unable to xmlXPathEvalExpression!"); - xmlXPathFreeContext(xpath_context); - xmlFreeDoc(doc); - return -1; - } - - if (xpath_obj_organization->nodesetval->nodeNr) { - _D("node count [%d]", xpath_obj_organization->nodesetval->nodeNr); - } else { - _E("xmlXPathEvalExpression failed"); - xmlXPathFreeObject(xpath_obj_organization); - xmlXPathFreeContext(xpath_context); - xmlFreeDoc(doc); - return -1; - } - - for (i = 0; i < xpath_obj_organization->nodesetval->nodeNr; i++) { - xmlNodePtr itemNode = xpath_obj_organization->nodesetval->nodeTab[i]; - if (itemNode) { - char *id = NULL; - id = (char *) xmlGetProp(itemNode, (const xmlChar *)"id"); - if (!id) { - _E("xmlGetProp failed"); - goto FINISH_OFF; - } - - if (strcmp(id, "showdate") == 0) { - xmlNodePtr childNode = xmlFirstElementChild(itemNode); - char *checked = NULL; - - while (childNode) { - checked = (char *) xmlGetProp(childNode, (const xmlChar *)"checked"); - if (checked) { - _D("checked:%s", checked); - if (strcmp(checked, "yes") == 0) - setting_items_s.show_date = 1; - else if (strcmp(checked, "no") == 0) - setting_items_s.show_date = 0; - - xmlFree(checked); - } - childNode = xmlNextElementSibling(childNode); - } - xmlFree(childNode); - } else if (strcmp(id, "clock_font_color") == 0) { - xmlNodePtr childNode = xmlFirstElementChild(itemNode); - char *selected = NULL; - int num = 0; - - while (childNode) { - selected = (char *) xmlGetProp(childNode, (const xmlChar *)"selected"); - if (selected) { - _D("clock_font_color: selected:%s", selected); - num = atoi(selected); - setting_items_s.clock_font_color = num; - xmlFree(selected); - } - childNode = xmlNextElementSibling(childNode); - } - xmlFree(childNode); - } - xmlFree(id); - } - } - -FINISH_OFF: - if (xpath_obj_organization) - xmlXPathFreeObject(xpath_obj_organization); - - if (xpath_context) - xmlXPathFreeContext(xpath_context); - - if (doc) - xmlFreeDoc(doc); - - xmlCleanupParser(); - - return 0; -} - - - -static char *_get_locale(void) -{ - _D(""); - char *locale = NULL; - - int ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, &locale); - if (ret < 0) { - _E("fail to get the locale country value(%d)", ret); - return strdup("en_US"); - } - - if (!locale) { - _E("system settings fail to get value: region format"); - return strdup("en_US"); - } - _D("locale is %s", locale); - - return locale; -} - - - -static i18n_udatepg_h _get_generator(void *data) -{ - _D(""); - - int status = I18N_ERROR_INVALID_PARAMETER; - i18n_udatepg_h generator = NULL; - - //UChar u_skeleton[64] = {0,}; - - appdata *ad = data; - retv_if(!ad, NULL); - - - status = i18n_ulocale_set_default(NULL); - if (status != I18N_ERROR_NONE) { - _E("uloc_setDefault() is failed."); - return NULL; - } - - //i18n_ustring_copy_ua_n(u_skeleton, "hhmm", strlen("hhmm")); - - if (!ad->timeregion_format) - ad->timeregion_format = _get_locale(); - - status = i18n_udatepg_create(ad->timeregion_format, &generator); - if (status != I18N_ERROR_NONE) { - _E("udatepg_creation is failed"); - generator = NULL; - return NULL; - } - - _D("get_generator success"); - return generator; -} - - - -static i18n_udate_format_h _get_time_formatter(void *data) -{ - _D(""); - - char a_best_pattern[64] = {0.}; - char *a_best_pattern_fixed = NULL; - - char *saveptr1, *saveptr2; - int status = I18N_ERROR_INVALID_PARAMETER; - - i18n_uchar u_pattern[64] = {0,}; - i18n_uchar u_timezone[64] = {0,}; - i18n_uchar u_best_pattern[64] = {0,}; - int32_t u_best_pattern_capacity; - int32_t best_pattern_len; - i18n_udate_format_h formatter = NULL; - - appdata *ad = data; - retv_if(!ad, NULL); - - if (!ad->generator) - ad->generator = _get_generator(ad); - - /* only 12 format */ - - if (!i18n_ustring_copy_ua_n(u_pattern, "h:mm", sizeof(u_pattern))) { - _E("ustring_copy() is failed."); - return NULL; - } - - u_best_pattern_capacity = - (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0])); - - status = i18n_udatepg_get_best_pattern(ad->generator, u_pattern, i18n_ustring_get_length(u_pattern), - u_best_pattern, u_best_pattern_capacity, &best_pattern_len); - if (status != I18N_ERROR_NONE) { - _E("get best pattern() failed(%d)", status); - return NULL; - } - - /* remove am/pm of best pattern */ - retv_if(!i18n_ustring_copy_au(a_best_pattern, u_best_pattern), NULL); - _D("best pattern [%s]", a_best_pattern); - a_best_pattern_fixed = strtok_r(a_best_pattern, "a", &saveptr1); - a_best_pattern_fixed = strtok_r(a_best_pattern_fixed, " ", &saveptr2); - _D("best pattern fixed [%s]", a_best_pattern_fixed); - - if (a_best_pattern_fixed) { - /* exception - da_DK */ - if (strncmp(ad->timeregion_format, "da_DK", 5) == 0 - || strncmp(ad->timeregion_format, "mr_IN", 5) == 0) { - - char *a_best_pattern_changed = g_strndup("h:mm", 4); - _D("best pattern is changed [%s]", a_best_pattern_changed); - if (a_best_pattern_changed) { - i18n_ustring_copy_ua(u_best_pattern, a_best_pattern_changed); - g_free(a_best_pattern_changed); - } - } else { - retv_if(!i18n_ustring_copy_ua(u_best_pattern, a_best_pattern_fixed), NULL); - } - } - - /* change char to UChar */ - retv_if(!i18n_ustring_copy_n(u_pattern, u_best_pattern, sizeof(u_pattern)), NULL); - - /* get formatter */ - i18n_ustring_copy_ua_n(u_timezone, ad->timezone_id, sizeof(u_timezone)); - status = i18n_udate_create(I18N_UDATE_PATTERN, I18N_UDATE_PATTERN, ad->timeregion_format, u_timezone, -1, - u_pattern, -1, &formatter); - if (!formatter) { - _E("time_create() is failed.%d", status); - - return NULL; - } - - _D("getting time formatter success"); - return formatter; -} - - - -static i18n_udate_format_h _get_time_formatter_24(void *data) -{ - _D(""); - - char a_best_pattern[64] = {0.}; - char *a_best_pattern_fixed = NULL; - char *saveptr1 = NULL; - char *saveptr2 = NULL; - int status = I18N_ERROR_INVALID_PARAMETER; - - i18n_uchar u_pattern[64] = {0,}; - i18n_uchar u_timezone[64] = {0,}; - i18n_uchar u_best_pattern[64] = {0,}; - int32_t u_best_pattern_capacity; - int32_t best_pattern_len; - i18n_udate_format_h formatter = NULL; - - appdata *ad = data; - retv_if(!ad, NULL); - - if (!ad->generator) - ad->generator = _get_generator(ad); - - /* only 12 format */ - if (!i18n_ustring_copy_ua_n(u_pattern, "H:mm", sizeof(u_pattern))) { - _E("ustring_copy() is failed."); - return NULL; - } - - u_best_pattern_capacity = - (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0])); - - status = i18n_udatepg_get_best_pattern(ad->generator, u_pattern, i18n_ustring_get_length(u_pattern), - u_best_pattern, u_best_pattern_capacity, &best_pattern_len); - if (status != I18N_ERROR_NONE) { - _E("get best pattern() failed(%d)", status); - return NULL; - } - - /* remove am/pm of best pattern */ - retv_if(!i18n_ustring_copy_au(a_best_pattern, u_best_pattern), NULL); - _D("best pattern [%s]", a_best_pattern); - a_best_pattern_fixed = strtok_r(a_best_pattern, "a", &saveptr1); - a_best_pattern_fixed = strtok_r(a_best_pattern_fixed, " ", &saveptr2); - _D("best pattern fixed [%s]", a_best_pattern_fixed); - - if (a_best_pattern_fixed) { - /* exception - pt_BR(HH'h'mm), id_ID, da_DK */ - if (strncmp(a_best_pattern_fixed, "HH'h'mm", 7) == 0 - || strncmp(ad->timeregion_format, "id_ID", 5) == 0 - || strncmp(ad->timeregion_format, "da_DK", 5) == 0 - || strncmp(ad->timeregion_format, "mr_IN", 5) == 0) { - - char *a_best_pattern_changed = g_strndup("HH:mm", 5); - _D("best pattern is changed [%s]", a_best_pattern_changed); - if (a_best_pattern_changed) { - i18n_ustring_copy_ua(u_best_pattern, a_best_pattern_changed); - g_free(a_best_pattern_changed); - } - } else { - retv_if(!i18n_ustring_copy_ua(u_best_pattern, a_best_pattern_fixed), NULL); - } - } - - /* change char to UChar */ - - retv_if(!i18n_ustring_copy_n(u_pattern, u_best_pattern, sizeof(u_pattern)), NULL); - - /* get formatter */ - i18n_ustring_copy_ua_n(u_timezone, ad->timezone_id, sizeof(u_timezone)); - status = i18n_udate_create(I18N_UDATE_PATTERN, I18N_UDATE_PATTERN, ad->timeregion_format, u_timezone, -1, - u_pattern, -1, &formatter); - if (!formatter) { - _E("time24_create() is failed."); - return NULL; - } - - _D("getting time formatter success"); - return formatter; -} - - - -static i18n_udate_format_h _get_date_formatter(void *data) -{ - _D(""); - - i18n_uchar u_timezone[64] = {0,}; - i18n_uchar u_skeleton[64] = {0,}; - int32_t skeleton_len = 0; - int status = I18N_ERROR_INVALID_PARAMETER; - - i18n_uchar u_best_pattern[64] = {0,}; - int32_t u_best_pattern_capacity; - i18n_udate_format_h formatter = NULL; - - appdata *ad = data; - retv_if(!ad, NULL); - - i18n_ustring_copy_ua_n(u_skeleton, "MMMEd", strlen("MMMEd")); - skeleton_len = i18n_ustring_get_length(u_skeleton); - - u_best_pattern_capacity = - (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0])); - status = i18n_udatepg_get_best_pattern(ad->generator, u_skeleton, skeleton_len, - u_best_pattern, u_best_pattern_capacity, &status); - if (status != I18N_ERROR_NONE) { - _E("get best pattern() failed(%d)", status); - return NULL; - } - - if (strncmp(ad->timeregion_format, "fi_FI", 5) == 0) { - char *a_best_pattern_changed = g_strndup("ccc, d. MMM", 11); - _D("date formatter best pattern is changed [%s]", a_best_pattern_changed); - if (a_best_pattern_changed) { - i18n_ustring_copy_ua(u_best_pattern, a_best_pattern_changed); - g_free(a_best_pattern_changed); - } - } - - /* get formatter */ - - i18n_ustring_copy_ua_n(u_timezone, ad->timezone_id, sizeof(u_timezone)); - status = i18n_udate_create(I18N_UDATE_PATTERN, I18N_UDATE_PATTERN, ad->timeregion_format, u_timezone, -1, u_best_pattern, -1, &formatter); - - if (!formatter) { - _E("udate_create() is failed."); - return NULL; - } - - _D("getting date formatter success"); - - return formatter; - -} - - - -static i18n_udate_format_h _get_ampm_formatter(void *data) -{ - _D(""); - - int status = I18N_ERROR_INVALID_PARAMETER; - - char a_best_pattern[64] = {0.}; - - i18n_uchar u_timezone[64] = {0,}; - i18n_uchar u_skeleton[64] = {0,}; - int32_t skeleton_len = 0; - - i18n_uchar u_best_pattern[64] = {0,}; - int32_t u_best_pattern_capacity; - i18n_udate_format_h formatter = NULL; - - appdata *ad = data; - retv_if(!ad, NULL); - - i18n_ustring_copy_ua_n(u_skeleton, "hhmm", strlen("hhmm")); - skeleton_len = i18n_ustring_get_length(u_skeleton); - - u_best_pattern_capacity = - (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0])); - status = i18n_udatepg_get_best_pattern(ad->generator, u_skeleton, skeleton_len, - u_best_pattern, u_best_pattern_capacity, &status); - if (status != I18N_ERROR_NONE) { - _E("get best pattern() failed(%d)", status); - return NULL; - } - - i18n_ustring_copy_au(a_best_pattern, u_best_pattern); - i18n_ustring_copy_ua(u_best_pattern, "a"); - - if (a_best_pattern[0] == 'a') - ad->is_pre = EINA_TRUE; - else - ad->is_pre = EINA_FALSE; - - /* get formatter */ - i18n_ustring_copy_ua_n(u_timezone, ad->timezone_id, sizeof(u_timezone)); - status = i18n_udate_create(I18N_UDATE_PATTERN, I18N_UDATE_PATTERN, ad->timeregion_format, u_timezone, -1, u_best_pattern, -1, &formatter); - if (!formatter) { - _E("ampm_create() is failed."); - return NULL; - } - - _D("getting ampm formatter success"); - - return formatter; -} - - - -static void _set_formatters(void *data) -{ - _D(""); - - appdata *ad = data; - ret_if(!ad); - - /* generator */ - ad->generator = _get_generator(ad); - /* time formatter */ - ad->formatter_time = _get_time_formatter(ad); - /* ampm formatter */ - ad->formatter_ampm = _get_ampm_formatter(ad); - /* 24 time formatter */ - ad->formatter_time_24 = _get_time_formatter_24(ad); - /* date formatter */ - ad->formatter_date = _get_date_formatter(ad); -} - - - -static void _remove_formatters(void *data) -{ - _D(""); - - appdata *ad = data; - ret_if(!ad); - - if (ad->generator) { - i18n_udatepg_destroy(ad->generator); - ad->generator = NULL; - } - if (ad->formatter_time) { - i18n_udate_destroy(ad->formatter_time); - ad->formatter_time = NULL; - } - if (ad->formatter_ampm) { - i18n_udate_destroy(ad->formatter_ampm); - ad->formatter_ampm = NULL; - } - if (ad->formatter_time_24) { - i18n_udate_destroy(ad->formatter_time_24); - ad->formatter_time_24 = NULL; - } - if (ad->formatter_date) { - i18n_udate_destroy(ad->formatter_date); - ad->formatter_date = NULL; - } -} - - - -static int _get_formatted_date_from_utc_time(void *data, time_t intime, char *buf, int buf_len) -{ - appdata *ad = data; - retv_if(!ad, -1); - retv_if(!ad->formatter_date, -1); - - i18n_udate u_time = (i18n_udate)intime * 1000; - i18n_uchar u_formatted_str[64] = {0,}; - int32_t u_formatted_str_capacity; - int32_t formatted_str_len = -1; - int status = I18N_ERROR_INVALID_PARAMETER; - - /* calculate formatted string capacity */ - u_formatted_str_capacity = - (int32_t)(sizeof(u_formatted_str) / sizeof((u_formatted_str)[0])); - - /* fomatting date using formatter */ - status = i18n_udate_format_date(ad->formatter_date, u_time, u_formatted_str, u_formatted_str_capacity, NULL, &formatted_str_len); - if (status != I18N_ERROR_NONE) { - _E("udat_format() failed"); - return -1; - } - - if (formatted_str_len <= 0) - _E("formatted_str_len is less than 0"); - - buf = i18n_ustring_copy_au_n(buf, u_formatted_str, (int32_t)buf_len); - _SD("date:(%d)[%s][%d]", formatted_str_len, buf, intime); - - return 0; -} - - - -static int _get_formatted_ampm_from_utc_time(void *data, time_t intime, char *buf, int buf_len, int *ampm_len) -{ - appdata *ad = data; - retv_if(!ad, -1); - retv_if(!ad->formatter_ampm, -1); - - i18n_udate u_time = (i18n_udate)intime * 1000; - i18n_uchar u_formatted_str[64] = {0,}; - int32_t u_formatted_str_capacity; - int32_t formatted_str_len = -1; - int status = I18N_ERROR_INVALID_PARAMETER; - - /* calculate formatted string capacity */ - u_formatted_str_capacity = - (int32_t)(sizeof(u_formatted_str) / sizeof((u_formatted_str)[0])); - - /* fomatting date using formatter */ - status = i18n_udate_format_date(ad->formatter_ampm, u_time, u_formatted_str, u_formatted_str_capacity, NULL, &formatted_str_len); - if (status != I18N_ERROR_NONE) { - _E("udat_format() failed"); - return -1; - } - - if (formatted_str_len <= 0) - _E("formatted_str_len is less than 0"); - - - (*ampm_len) = i18n_ustring_get_length(u_formatted_str); - - buf = i18n_ustring_copy_au_n(buf, u_formatted_str, (int32_t)buf_len); - _SD("ampm:(%d)[%s][%d]", formatted_str_len, buf, intime); - - return 0; -} - - - -static int _get_formatted_time_from_utc_time(void *data, time_t intime, char *buf, int buf_len, Eina_Bool is_time_24) -{ - appdata *ad = data; - retv_if(!ad, -1); - - i18n_udate u_time = (i18n_udate)intime * 1000; - i18n_uchar u_formatted_str[64] = {0,}; - int32_t u_formatted_str_capacity; - int32_t formatted_str_len = -1; - int status = I18N_ERROR_INVALID_PARAMETER; - - /* calculate formatted string capacity */ - u_formatted_str_capacity = - (int32_t)(sizeof(u_formatted_str) / sizeof((u_formatted_str)[0])); - - /* fomatting date using formatter */ - if (is_time_24) { - retv_if(ad->formatter_time_24 == NULL, -1); - status = i18n_udate_format_date(ad->formatter_time_24, u_time, u_formatted_str, u_formatted_str_capacity, NULL, &formatted_str_len); - } else { - retv_if(ad->formatter_time == NULL, -1); - status = i18n_udate_format_date(ad->formatter_time, u_time, u_formatted_str, u_formatted_str_capacity, NULL, &formatted_str_len); - } - if (status != I18N_ERROR_NONE) { - _E("udat_format() failed"); - return -1; - } - - if (formatted_str_len <= 0) - _E("formatted_str_len is less than 0"); - - buf = i18n_ustring_copy_au_n(buf, u_formatted_str, (int32_t)buf_len); - _SD("time:(%d)[%s][%d]", formatted_str_len, buf, intime); - - return 0; -} - - - -#if 0 -static char *_replaceAll(char *s, const char *olds, const char *news) -{ - char *result, *sr; - size_t i, count = 0; - size_t oldlen = strlen(olds); if (oldlen < 1) return s; - size_t newlen = strlen(news); - - - if (newlen != oldlen) { - for (i = 0; s[i] != '\0';) { - if (memcmp(&s[i], olds, oldlen) == 0) count++, i += oldlen; - else i++; - } - } else i = strlen(s); - - - result = (char *) malloc(i + 1 + count * (newlen - oldlen)); - if (!result) return NULL; - - sr = result; - while (*s) { - if (memcmp(s, olds, oldlen) == 0) { - memcpy(sr, news, newlen); - sr += newlen; - s += oldlen; - } else *sr++ = *s++; - } - *sr = '\0'; - - return result; -} -#endif - - - -Eina_Bool clock_view_set_info_time(void *data) -{ - _D(""); - appdata *ad = data; - if (!ad) { - _D("appdata is NULL"); - return ECORE_CALLBACK_RENEW; - } - struct tm tempts; - struct tm *ts = NULL; - time_t tt; - int err_code = 0; - int showdate = 1; - int clock_font_color = 8; - display_state_e val; - int ampm_length = 0; - char font_buf[512] = {0, }; - char utc_date[256] = { 0, }; //text_date - char utc_time[BUFFER_LENGTH] = { 0 }; - char utc_ampm[BUFFER_LENGTH] = { 0 }; - char *time_str = NULL; - tt = time(NULL); - ts = localtime_r(&tt , &tempts); - retv_if(!ts, ECORE_CALLBACK_RENEW); - - if (ad->timer != NULL) { - ecore_timer_del(ad->timer); - ad->timer = NULL; - } - - device_display_get_state(&val); - if (val != DISPLAY_STATE_SCREEN_OFF) - ad->timer = ecore_timer_add(60 - ts->tm_sec, clock_view_set_info_time, ad); - - /* text_date */ - err_code = preference_get_int(DIGITAL_PREFERENCE_CLOCK_FONT_COLOR, &clock_font_color); - if (0 != err_code) clock_font_color = setting_items_s.clock_font_color; - - if (clock_font_color < 1 || clock_font_color > 12) //Exception - clock_font_color = 8; - - err_code = preference_get_int(DIGITAL_PREFERENCE_SHOW_DATE, &showdate); - if (0 != err_code) showdate = setting_items_s.show_date; - - _D("show_date:%d", showdate); - - if (showdate) { - _get_formatted_date_from_utc_time(ad, tt, utc_date, sizeof(utc_date)); - elm_object_part_text_set(ad->ly_time, "default_text_date", utc_date); - snprintf(font_buf, sizeof(font_buf)-1, "%s_%d", "show,default_text_date", clock_font_color); - elm_object_signal_emit(ad->ly_time, font_buf, "source_default_text_date"); - } - _D(""); - - Eina_Bool is_pre = ad->is_pre; - Eina_Bool is_24hour = EINA_FALSE; - - if (!ad->timeformat) { - _get_formatted_ampm_from_utc_time(ad, tt, utc_ampm, sizeof(utc_ampm), &m_length); - _get_formatted_time_from_utc_time(ad, tt, utc_time, sizeof(utc_time), EINA_FALSE); - is_24hour = EINA_FALSE; - } else { - _get_formatted_time_from_utc_time(ad, tt, utc_time, sizeof(utc_time), EINA_TRUE); - is_24hour = EINA_TRUE; - } - - _D("utc_time=%s, utc_ampm=[%d]%s", utc_time, ampm_length, utc_ampm); - - if (ampm_length >= 3) { - _D("AM PM string is too long, changed to default AM/PM"); - if (ts->tm_hour >= 0 && ts->tm_hour < 12) - snprintf(utc_ampm, sizeof(utc_ampm), "%s", "AM"); - else - snprintf(utc_ampm, sizeof(utc_ampm), "%s", "PM"); - } - - if (is_24hour == EINA_TRUE) { - time_str = g_strdup_printf("<color=#%sFF>%s</color>", font_color_list[clock_font_color-1], utc_time); - } else { - if (is_pre == EINA_TRUE) - time_str = g_strdup_printf("<color=#%sFF><font_size=24><font=Tizen:style=Bold>%s</font></font_size>%s</color>", font_color_list[clock_font_color-1], utc_ampm, utc_time); - else - // Todo : Fix the gap between clock and ampm. - time_str = g_strdup_printf("<color=#%sFF>%s<font_size=24><font=Tizen:style=Bold> %s</font></font_size></color>", font_color_list[clock_font_color-1], utc_time, utc_ampm); - } - _D("time_str=%s", time_str); - - elm_object_part_text_set(ad->ly_time, "textblock_time", time_str); - elm_object_signal_emit(ad->ly_time, "change,default", "source_textblock_time"); - - g_free(time_str); - - return ECORE_CALLBACK_RENEW; -} - - - -void clock_view_update_view(void *data) -{ - _D(""); - appdata *ad = data; - if (!ad) { - _E("appdata is NULL"); - return; - } - - if (ad->win) - clock_view_set_info_time(ad); -} - - - -static i18n_uchar *_uastrcpy(const char *chars) -{ - _D(""); - int len = 0; - i18n_uchar *str = NULL; - len = strlen(chars); - str = (i18n_uchar *) malloc(sizeof(i18n_uchar) *(len + 1)); - if (!str) - return NULL; - i18n_ustring_copy_ua(str, chars); - return str; -} - - - -static void ICU_set_timezone(const char *timezone) -{ - _D("%s", __func__); - if (!timezone) { - _E("TIMEZONE is NULL"); - return; - } - - int ec = I18N_ERROR_NONE; - i18n_uchar *str = _uastrcpy(timezone); - - ec = i18n_ucalendar_set_default_timezone(str); - _D("ec:%d" , ec); - free(str); -} - - - -static char* _get_timezone() -{ - _D(""); - char *timezone = NULL; - - int ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, &timezone); - if (ret < 0) - _E("fail to get the locale time zone value(%d)", ret); - - if (!timezone) - _E("system settings fail to get value: time zone"); - - _D("time zone : %s", timezone); - - return timezone; -} - - - -static void _time_status_changed_cb(system_settings_key_e key, void *data) -{ - _D(""); - - appdata *ad = data; - ret_if(!ad); - - if (ad->timezone_id) { - free(ad->timezone_id); - ad->timezone_id = NULL; - } - if (ad->timeregion_format) { - free(ad->timeregion_format); - ad->timeregion_format = NULL; - } - - ad->timezone_id = _get_timezone(); - ICU_set_timezone(ad->timezone_id); - ad->timeregion_format = _get_locale(); - - _D("[%d][%s][%s]", ad->timeformat, ad->timeregion_format, ad->timezone_id); - _D("system setting key : %d", key); - - _remove_formatters(ad); - _set_formatters(ad); - - clock_view_set_info_time(ad); -} - - -#if 0 -static void _clear_time(void *data) -{ - _D(""); - appdata *ad = data; - ret_if(!ad); - - clock_view_hide_clock(ad); - - if (ad->timer) { - ecore_timer_del(ad->timer); - ad->timer = NULL; - } -} -#endif - - -static void _clock_font_changed_cb(int node, void *data) -{ - _D(""); - appdata *ad = data; - ret_if(!ad); - - char font_buf[512] = {0, }; - - int show_date = 1; - int clock_font_color = 8; - int ret = 0; - - /* font */ - elm_config_font_overlay_set("idle_font", FONT_DEFAULT_FAMILY_NAME, FONT_DEFAULT_SIZE); - - elm_config_font_overlay_apply(); - - ret = preference_get_int(DIGITAL_PREFERENCE_SHOW_DATE, &setting_items_s.show_date); - if (!ret) show_date = setting_items_s.show_date; - else _E("fail to get the show date (%d)", ret); - - ret = preference_get_int(DIGITAL_PREFERENCE_CLOCK_FONT_COLOR, &setting_items_s.clock_font_color); - if (!ret) clock_font_color = setting_items_s.clock_font_color; - else _E("fail to get the clock font color (%d)", ret); - - _D("show_date:%d, font color:%d", show_date, clock_font_color); - - if (show_date) { - snprintf(font_buf, sizeof(font_buf)-1, "%s_%d", "show,default_text_date", clock_font_color); - elm_object_signal_emit(ad->ly_time, font_buf, "source_default_text_date"); - elm_object_signal_emit(ad->ly_time, "change,default", "source_textblock_time"); - } else { - elm_object_signal_emit(ad->ly_time, "hide,text_date", "source_text_date"); - elm_object_signal_emit(ad->ly_time, "change,no_data", "source_textblock_time"); - } - - if (node) - clock_view_set_info_time(ad); -} - - - -int clock_view_get_display_state() -{ - _D(""); - display_state_e val; - device_display_get_state(&val); - _D("DISPLAY STATE [%d]", val); - return val; -} - - - -static void _device_state_changed_cb(device_callback_e type, void *value, void *data) -{ - _D(""); - appdata *ad = data; - struct tm *ts = NULL; - time_t tt; - struct tm tempts; - - if (!ad) { - _E("ad is null. check!!"); - return; - } - - if (type != DEVICE_CALLBACK_DISPLAY_STATE) { - _E("Wrong callback was called. check!!!"); - return; - } - display_state_e val = (display_state_e)value; - _D("DISPLAY STATE [%d] ", val); - - if (val == DISPLAY_STATE_NORMAL) { - if (!ad->is_show) { - clock_view_set_info_time(ad); - clock_view_show_clock(ad); - } - - tt = time(NULL); - ret_if(tt == (time_t)-1); - ts = localtime_r(&tt, &tempts); - ret_if(!ts); - if (ad->timer) { - ecore_timer_del(ad->timer); - ad->timer = NULL; - } - ad->timer = ecore_timer_add(60 - ts->tm_sec, clock_view_set_info_time, ad); - } else if (val == DISPLAY_STATE_SCREEN_OFF) { - //_clear_time(data); //Disable this code for transit to alpm clock - _D("Display state is off"); - } else { - _D("Not interested PM STATE"); - } -} - - - -static void _language_changed_cb(system_settings_key_e key, void *data) -{ - _D("%s", __func__); - appdata *ad = data; - ret_if(!ad); - - sleep(1); - _time_status_changed_cb(key, ad); -} - - - -static void _timeformat_changed_cb(system_settings_key_e key, void *data) -{ - _D(""); - appdata *ad = data; - ret_if(!ad); - - bool val = false; - - system_settings_get_value_bool(key, &val); - ad->timeformat = (int) val; - _time_status_changed_cb(key, ad); -} - - - -static void _set_settings(void *data) -{ - _D(""); - appdata *ad = data; - ret_if(!ad); - int ret = -1; - - /* register time changed cb */ - ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_TIME_CHANGED, _time_status_changed_cb, ad); - if (ret < 0) - _E("Failed to set time changed cb.(%d)", ret); - - /*Register changed cb(timezone) */ - ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, _time_status_changed_cb, ad); - if (ret < 0) - _E("Failed to set time zone change cb(%d)", ret); - - /* Register changed cb(pm mode) */ - ret = device_add_callback(DEVICE_CALLBACK_DISPLAY_STATE, _device_state_changed_cb, ad); - if (DEVICE_ERROR_NONE != ret) - _E("Failed to add device display state changed cb(%d)", ret); - - /*Register changed cb(language) */ - ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, _language_changed_cb, ad); - if (ret < 0) - _E("Failed to set language setting's changed cb.(%d)", ret); - - /*Register changed cb(regionformat 1224) */ - ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, _timeformat_changed_cb, ad); - if (ret < 0) - _E("Failed to set time format about 24 hour changed cb(%d).", ret); -} - - -#if 0 -static void _unset_settings() -{ - _D(""); - int ret = -1; - - /* unset changed cb(time changed) */ - ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_TIME_CHANGED); - if (ret < 0) - _E("Failed to unset time changed(%d).", ret); - - /* unset changed cb(timezone) */ - ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE); - if (ret < 0) - _E("Failed to unset time zone changed cb(%d).", ret); - - /* unset changed cb(pm mode) */ - ret = device_remove_callback(DEVICE_CALLBACK_DISPLAY_STATE, _device_state_changed_cb); - if (DEVICE_ERROR_NONE != ret) - _E("Failed to remove device display state changed cb(%d)", ret); - - /* unset changed cb(language)*/ - ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE); - if (ret < 0) - _E("Failed to unset locale language(%d).", ret); - - /* unset changed cb(region format)*/ - ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR); - if (ret < 0) - _E("Failed to unset locale time format about 24 hour(%d).", ret); - - /* date showing */ - ret = preference_unset_changed_cb(DIGITAL_PREFERENCE_SHOW_DATE); - if (ret < 0) - _E("Failed to unset preference(show_date, %d).", ret); - - /* clock_font_color */ - ret = preference_unset_changed_cb(DIGITAL_PREFERENCE_CLOCK_FONT_COLOR); - if (ret < 0) - _E("Failed to unset preference(font color, %d).", ret); -} -#endif - - -static void _set_info(void *data) -{ - _D(""); - - appdata *ad = data; - ret_if(!ad); - - _set_settings(data); - - _time_status_changed_cb(-1, ad); - _clock_font_changed_cb(0, ad); - - clock_view_set_info_time(ad); -} - - - -static Evas_Object *_add_layout(Evas_Object *parent, const char *file, const char *group) -{ - _D("%s", __func__); - Evas_Object *eo = NULL; - int r = -1; - - retv_if(!parent, NULL); - retv_if(!file, NULL); - retv_if(!group, NULL); - - eo = elm_layout_add(parent); - retv_if(!eo, NULL); - - r = elm_layout_file_set(eo, file, group); - if (!r) { - _E("Failed to set file[%s]", file); - evas_object_del(eo); - return NULL; - } - - evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(eo); - return eo; -} - - - -void clock_view_destroy_view_main(void *data) -{ - _D(""); - appdata *ad = data; - ret_if(!ad); - - if (ad->timezone_id) { - free(ad->timezone_id); - ad->timezone_id = NULL; - } - if (ad->timeregion_format) { - free(ad->timeregion_format); - ad->timeregion_format = NULL; - } - - _remove_formatters(ad); -} - - - -bool clock_view_create_layout(void *data) -{ - _D(""); - appdata *ad = data; - retv_if(!ad, false); - - /* create main layout */ - char edj_path[MAX_PATH_LEN] = {0,}; - char *res_path = app_get_resource_path(); - snprintf(edj_path, MAX_PATH_LEN, "%s%s", res_path, EDJ_APP); - free(res_path); - _D("edj_path: %s", edj_path); - - Evas_Object *ly_main = NULL; - ly_main = _add_layout(ad->win, edj_path, "main"); - retv_if(!ly_main, -1); - evas_object_size_hint_weight_set(ly_main, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_win_resize_object_add(ad->win, ly_main); - ad->ly_main = ly_main; - - Evas_Object *ly_time = NULL; - ly_time = _add_layout(ly_main, edj_path, "layout_clock_digital"); - elm_object_part_content_set(ly_main, "time.part", ly_time); - ad->ly_time = ly_time; - - evas_object_show(ad->win); - - evas_object_resize(ly_main, ad->win_w, ad->win_h); - evas_object_show(ly_main); - - _set_info(ad); - - return true; -} diff --git a/src/debug.c b/src/debug.c deleted file mode 100755 index defbc13..0000000 --- a/src/debug.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2017 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <stdio.h> -#include <app.h> -#include <unistd.h> -#include <errno.h> - -#include "log.h" - -void assert_screen(const char* tag_name, const char* file, int line, const char* func, const char *expr, const char *fmt, ...) -{ - app_control_h app_control; - va_list ap; - char pid_buffer[16] = {0}; - char result_buffer[256] = {0}; - char line_buffer[16] = {0}; - - app_control_create(&app_control); - app_control_set_app_id(app_control, "com.samsung.assert-scr"); - snprintf(pid_buffer, sizeof(pid_buffer), "%d", getpid()); - app_control_add_extra_data(app_control, "pid", pid_buffer); - app_control_add_extra_data(app_control, "appname", tag_name); - if (fmt == NULL) - snprintf(result_buffer, sizeof(result_buffer), "%s", expr); - else { - char arg_buffer[256] = {0}; - va_start(ap, fmt); - vsnprintf(arg_buffer, sizeof(arg_buffer), fmt, ap); - va_end(ap); - snprintf(result_buffer, sizeof(result_buffer), "(%s) %s", expr, arg_buffer); - } - app_control_add_extra_data(app_control, "assert_str", result_buffer); - app_control_add_extra_data(app_control, "filename", file); - snprintf(line_buffer, sizeof(line_buffer), "%d", line); - app_control_add_extra_data(app_control, "line", line_buffer); - app_control_add_extra_data(app_control, "funcname", func); - app_control_send_launch_request(app_control, NULL, NULL); - app_control_destroy(app_control); -} diff --git a/src/main.c b/src/main.c deleted file mode 100755 index db4296c..0000000 --- a/src/main.c +++ /dev/null @@ -1,666 +0,0 @@ -/* - * Copyright 2017 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <app.h> -#include <unistd.h> -#include <errno.h> -#include <glib.h> -#include <device/display.h> -#include <tizen.h> -#include <watch_app.h> -#include <watch_app_efl.h> - - -#include "log.h" -#include "window.h" -#include "app_data.h" -#include "clock_view.h" -#include "util.h" - -#if !defined(PACKAGE_NAME) -#define PACKAGE_NAME "org.tizen.idle-clock-digital" -#endif - -#define DATA_PATH "/tmp" -#define DUMP_FILE_PATH_OFFSCREEN DATA_PATH"/"PACKAGE_NAME"-dump_offscreen.png" -#define DUMP_FILE_PATH_MINICONTROL DATA_PATH"/"PACKAGE_NAME"-dump_minicontrol.png" -#define QUALITY_N_COMPRESS "quality=100 compress=1" - -static int drawing_state = 0; // 0: nothing, 1: offscreen capture ongoing, 2: onscreen capture ongoing -static Ecore_Timer *sync_timer = NULL; -static Ecore_Timer *drawing_timer = NULL; -static Ecore_Timer *close_timer = NULL; - -static Evas *offscreen_e = NULL; -static Evas_Object *offscreen_box = NULL; -static Evas_Object *offscreen_bg = NULL; -static Evas_Object *offscreen_img = NULL; -static Evas *minicontrol_e = NULL; -static Evas_Object *minicontrol_bg = NULL; -static Evas_Object *minicontrol_img = NULL; -static Evas_Object *minicontrol_img_box = NULL; - -static Evas* _live_create_virtual_canvas(int w, int h); -static int live_flush_to_file(Evas *e, const char *filename, int w, int h); -static int _flush_data_to_file(Evas *e, char *data, const char *filename, int w, int h); -static void _update_clock_to_offscreen(void *data, int w, int h); - -EXPORT_API Evas_Object* elm_widget_top_get(const Evas_Object *obj); -EXPORT_API Evas_Object* elm_widget_parent_widget_get(const Evas_Object *obj); - - - -static void _live_destroy_virtual_canvas(Evas *e) -{ - ret_if(!e); - Ecore_Evas *ee; - - ee = ecore_evas_ecore_evas_get(e); - if (!ee) { - _E("Failed to ecore evas object\n"); - return ; - } - - ecore_evas_free(ee); -} - - - -void _remove_preview_resource(void *data) -{ - _D(); - - appdata *ad = data; - ret_if(!ad); - - if (offscreen_box) { - evas_object_del(offscreen_box); - offscreen_box = NULL; - ad->win = NULL; - _D("##### ad->win set to NULL"); - } - - if (offscreen_bg) { - evas_object_del(offscreen_bg); - offscreen_bg = NULL; - } - - if (offscreen_img) { - evas_object_del(offscreen_img); - offscreen_img = NULL; - } - - if (minicontrol_bg) { - evas_object_del(minicontrol_bg); - minicontrol_bg = NULL; - } - - if (minicontrol_img) { - evas_object_del(minicontrol_img); - minicontrol_img = NULL; - } - - if (minicontrol_img_box) { - evas_object_del(minicontrol_img_box); - minicontrol_img_box = NULL; - } - - _live_destroy_virtual_canvas(offscreen_e); - _live_destroy_virtual_canvas(minicontrol_e); - - ad->e_offscreen = NULL; -} - - - -static void _update_clock_to_offscreen(void *data, int w, int h) -{ - appdata *ad = data; - ret_if(!ad); - - if (!offscreen_e) { - offscreen_e = _live_create_virtual_canvas(w, h); - ad->e_offscreen = offscreen_e; - } - - offscreen_box = evas_object_rectangle_add(offscreen_e); - evas_object_resize(offscreen_box, w, h); - evas_object_color_set(offscreen_box, 0, 0, 0, 0); - evas_object_show(offscreen_box); - - ad->win = offscreen_box; - - clock_view_create_layout(ad); - _D("create offscreen window"); - -} - - - -static Evas* _live_create_virtual_canvas(int w, int h) -{ - Ecore_Evas *internal_ee; - Evas *internal_e; - - internal_ee = ecore_evas_buffer_new(w, h); - if (!internal_ee) { - _E("Failed to create a new canvas buffer"); - return NULL; - } - - ecore_evas_alpha_set(internal_ee, EINA_FALSE); - ecore_evas_manual_render_set(internal_ee, EINA_TRUE); - - internal_e = ecore_evas_get(internal_ee); - if (!internal_e) { - ecore_evas_free(internal_ee); - _E("Faield to get Evas object"); - return NULL; - } - - return internal_e; -} - - - -static int live_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) { - _E("Failed to get ecore evas"); - return -1; - } - - 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) { - _E("Failed to get pixel data"); - return -1; - } - - return _flush_data_to_file(e, (char *) data, filename, w, h); -} - - - -static int _flush_data_to_file(Evas *e, char *data, const char *filename, int w, int h) -{ - Evas_Object *output = NULL; - - output = evas_object_image_add(e); - if (!output) { - _E("Failed to create an image object"); - return -1; - } - - /* evas_object_image_data_get/set should be used as pair. */ - evas_object_image_colorspace_set(output, EVAS_COLORSPACE_ARGB8888); - // evas_object_image_alpha_set(output, EINA_FALSE); - 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); - _E("Faield to save a captured image (%s)", filename); - return -1; - } - - evas_object_del(output); - - return 0; -} - - - -static Eina_Bool _make_dump(void *data, int win_type, int width, int height, char *file) -{ - appdata *ad = data; - Evas_Object *obj = NULL; - - Evas *e = NULL; - const void *pixel_data = NULL; - - retv_if(!ad, EINA_FALSE); - retv_if(!win_type, EINA_FALSE); - - obj = ad->win; - - _D("obj: %x", obj); - - _flush_data_to_file(e, (char *)pixel_data, DUMP_FILE_PATH_MINICONTROL, 384, WIN_SIZE_H); - - return EINA_TRUE; -} - - - -static bool _create_window(void *data, int mode) -{ - Evas_Object *win = NULL; - appdata *ad = data; - retv_if(!ad, false); - - /* create main window */ - if (ad->win == NULL) { - if (mode == BUFFER_TYPE_OFFSCREEN) { - ad->win_type = BUFFER_TYPE_OFFSCREEN; - _update_clock_to_offscreen(data, ad->win_w, ad->win_h); - - return true; - } - win = window_create(PACKAGE); - retv_if(!win, -1); - evas_object_resize(win, ad->win_w, ad->win_h); - evas_object_move(win, 0, 0); - ad->win = win; - ad->win_type = BUFFER_TYPE_WINDOW; - clock_view_create_layout(ad); - _D("create window"); - } - return true; -} - - - -static bool _idle_clock_digital_create(int width, int height, void *data) -{ - _D("%s", __func__); - - appdata *ad = data; - - app_event_handler_h handlers[5] = {NULL, }; - - // Register callbacks for each system event - if (watch_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, NULL, NULL) != APP_ERROR_NONE) - _E("watch_app_add_event_handler () is failed"); - - if (watch_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, NULL, NULL) != APP_ERROR_NONE) - _E("watch_app_add_event_handler () is failed"); - - if (watch_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, NULL) != APP_ERROR_NONE) - _E("watch_app_add_event_handler () is failed"); - - if (watch_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, NULL) != APP_ERROR_NONE) - _E("watch_app_add_event_handler () is failed"); - - if (watch_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, NULL) != APP_ERROR_NONE) - _E("watch_app_add_event_handler () is failed"); - - ad->win_w = width; - ad->win_h = height; - - return true; -} - - - -static void _idle_clock_digital_terminate(void *data) -{ - _D(); - appdata *ad = data; - - if (ad->win) { - evas_object_del(ad->win); - ad->win = NULL; - } - - if (ad->ly_time) { - evas_object_del(ad->ly_time); - ad->ly_time = NULL; - } - - if (close_timer) { - ecore_timer_del(close_timer); - close_timer = NULL; - } - - clock_view_destroy_view_main(ad); - -} - - - -static void _idle_clock_digital_pause(void *data) -{ - _D("%s", __func__); - appdata *ad = data; - ret_if(!ad); -} - - - -static void _idle_clock_digital_resume(void *data) -{ - _D("%s", __func__); - appdata *ad = data; - ret_if(!ad); -} - - - -static void _send_reply(void *data) -{ - _D("%s", __func__); - - int ret; - - appdata *ad = data; - ret_if(!ad); - - /* send reply */ - app_control_h reply; - ret = app_control_create(&reply); - _D("reply app_control created"); - if (ret == 0) { - _D("reply caller"); - if (ad->win_type == BUFFER_TYPE_OFFSCREEN) - ret = app_control_add_extra_data(reply, "result", DUMP_FILE_PATH_OFFSCREEN); - else - ret = app_control_add_extra_data(reply, "result", DUMP_FILE_PATH_MINICONTROL); - - if (ret) - _E("app_control_add_extra_data failed"); - - ret = app_control_reply_to_launch_request(reply, ad->app_control, APP_CONTROL_RESULT_SUCCEEDED); - - if (ret) - _E("app_control_reply_to_launch_request failed"); - - app_control_destroy(reply); - } else { - _E("app_control_create failed"); - } - -} - - - -static void _draw_onscreen(void *data) -{ - _D(""); - - appdata *ad = data; - ret_if(!ad); - - _make_dump(data, ad->win_type, WIN_SIZE_W, WIN_SIZE_H, DUMP_FILE_PATH_MINICONTROL); - _send_reply(data); - - if (clock_view_get_display_state() == DISPLAY_STATE_SCREEN_OFF) - clock_view_hide_clock(ad); - - drawing_state = 0; - drawing_timer = NULL; -} - - - -static Eina_Bool _idler_drawing_onscreen_cb(void *data) -{ - _D(""); - - appdata *ad = data; - retv_if(!ad, ECORE_CALLBACK_CANCEL); - - _draw_onscreen(ad); - - return ECORE_CALLBACK_CANCEL; -} - - - -static Eina_Bool _drawing_timer_onscreen_cb(void *data) -{ - appdata *ad = data; - retv_if(!ad, ECORE_CALLBACK_CANCEL); - - if (!ad->is_show) { - clock_view_show_clock(ad); - ecore_idler_add(_idler_drawing_onscreen_cb, ad); - return ECORE_CALLBACK_CANCEL; - } - - _draw_onscreen(ad); - - return ECORE_CALLBACK_CANCEL; -} - - - -static void _draw_offscreen(void *data) -{ - _D(); - - appdata *ad = data; - ret_if(!ad); - - live_flush_to_file(ad->e_offscreen, DUMP_FILE_PATH_OFFSCREEN, WIN_SIZE_W, WIN_SIZE_H); - - _send_reply(data); - - if (clock_view_get_display_state() == DISPLAY_STATE_SCREEN_OFF) - clock_view_hide_clock(ad); - - drawing_state = 0; - drawing_timer = NULL; - - _D("win type = %d and window = %d", ad->win_type, ad->win); - if (BUFFER_TYPE_OFFSCREEN == ad->win_type) { - _D("offscreen capture completed. app will be closed"); - elm_exit(); - } -} - - - -static Eina_Bool _idler_drawing_offscreen_cb(void *data) -{ - _D(); - - appdata *ad = data; - retv_if(!ad, ECORE_CALLBACK_RENEW); - - _draw_offscreen(ad); - - return ECORE_CALLBACK_CANCEL; -} - - - -static Eina_Bool _drawing_timer_cb(void *data) -{ - _D(); - - appdata *ad = data; - retv_if(!ad, ECORE_CALLBACK_RENEW); - - if (!ad->is_show) { - clock_view_show_clock(ad); - ecore_idler_add(_idler_drawing_offscreen_cb, ad); - return ECORE_CALLBACK_CANCEL; - } - - _draw_offscreen(ad); - - return ECORE_CALLBACK_CANCEL; -} - - - -static Eina_Bool _close_timer_cb(void *data) -{ - _D(); - - elm_exit(); - return ECORE_CALLBACK_CANCEL; -} - - - -static Eina_Bool _sync_timer_cb(void *data) -{ - _D(); - - appdata *ad = data; - retv_if(!ad, ECORE_CALLBACK_RENEW); - - if (drawing_state == 0) { - _remove_preview_resource(data); - _create_window(data, BUFFER_TYPE_WINDOW); - sync_timer = NULL; - return ECORE_CALLBACK_CANCEL; - } - - return ECORE_CALLBACK_RENEW; -} - - - -static void _idle_clock_digital_app_control(app_control_h app_control, void *data) -{ - _D(); - - appdata *ad = data; - ret_if(!ad); - - char *op = NULL; - char *result_data = NULL; - - app_control_get_operation(app_control, &op); - - if (op) { - _D("operation:%s", op); - if (strcmp(op, "http://tizen.org/appcontrol/operation/remote_settings") == 0) { - app_control_get_extra_data(app_control, "http://tizen.org/appcontrol/data/result_xml", &result_data); - if (result_data) { - _D("Result:%s", result_data); - clock_view_parse_result_data(result_data); - clock_view_set_result_data(ad); - clock_view_update_view(ad); - free(result_data); - - if (BUFFER_TYPE_WINDOW == ad->win_type && ad->win) { - device_display_change_state(DISPLAY_STATE_NORMAL); - } else { - _D("app will be closed"); - if (close_timer) { - ecore_timer_del(close_timer); - close_timer = NULL; - } - close_timer = ecore_timer_add(3.0, _close_timer_cb, NULL); - } - } - } else if (strcmp(op, "http://tizen.org/appcontrol/operation/main") == 0) { - if (close_timer) { - ecore_timer_del(close_timer); - close_timer = NULL; - } - if (drawing_state) { - if (sync_timer) { - ecore_timer_del(sync_timer); - sync_timer = NULL; - } - sync_timer = ecore_timer_add(0.1, _sync_timer_cb, data); - } else { - /* New case: offscreen capture -> operation/main */ - _remove_preview_resource(data); - _create_window(data, BUFFER_TYPE_WINDOW); /* create window if not mini app setting called */ - } - } else if (strcmp(op, "http://tizen.org/appcontrol/operation/clock/capture") == 0) { - app_control_clone(&ad->app_control, app_control); - - if (close_timer) { - ecore_timer_del(close_timer); - close_timer = NULL; - } - - _create_window(data, BUFFER_TYPE_OFFSCREEN); - - if (BUFFER_TYPE_OFFSCREEN == ad->win_type) { - _D("offscreen capture"); - drawing_state = 1; - - if (drawing_timer) { - ecore_timer_del(drawing_timer); - drawing_timer = NULL; - } - clock_view_set_info_time(data); - if (clock_view_get_display_state() == DISPLAY_STATE_SCREEN_OFF) - clock_view_show_clock(ad); - drawing_timer = ecore_timer_add(0.15, _drawing_timer_cb, data); - } else { - _D("minicontrol capture"); - drawing_state = 2; - if (drawing_timer) { - ecore_timer_del(drawing_timer); - drawing_timer = NULL; - } - clock_view_set_info_time(data); - if (clock_view_get_display_state() == DISPLAY_STATE_SCREEN_OFF) - clock_view_show_clock(ad); - drawing_timer = ecore_timer_add(0.15, _drawing_timer_onscreen_cb, data); - } - } else - _E("Unknown operation"); - - free(op); - } -} - - - -void app_time_tick(watch_time_h watch_time, void* user_data) -{ - -} - -void app_ambient_tick(watch_time_h watch_time, void* user_data) -{ - -} - -void app_ambient_changed(bool ambient_mode, void* user_data) -{ - -} - -int main(int argc, char *argv[]) -{ - appdata ad; - - watch_app_lifecycle_callback_s lifecycle_callback = {0, }; - - lifecycle_callback.create = _idle_clock_digital_create; - lifecycle_callback.terminate = _idle_clock_digital_terminate; - lifecycle_callback.pause = _idle_clock_digital_pause; - lifecycle_callback.resume = _idle_clock_digital_resume; - lifecycle_callback.app_control = _idle_clock_digital_app_control; - lifecycle_callback.time_tick = app_time_tick; - lifecycle_callback.ambient_tick = app_ambient_tick; - lifecycle_callback.ambient_changed = app_ambient_changed; - - - memset(&ad, 0x0, sizeof(appdata)); - - return watch_app_main(argc, argv, &lifecycle_callback, &ad); -} diff --git a/inc/window.h b/src/main.cpp index bc6dbee..5d4be0a 100755..100644 --- a/inc/window.h +++ b/src/main.cpp @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://floralicense.org/license/ + * http://floralicense.org/license/ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,11 +14,12 @@ * limitations under the License. */ -#ifndef __WINDOW_H__ -#define __WINDOW_H__ +#include <tizen.h> +#include "WatchApp.h" +#include "Logger.h" -#include <Elementary.h> - -Evas_Object *window_create(const char *name); - -#endif /* __WINDOW_H__ */ +EXPORT_API int main(int argc, char *argv[]) +{ + TRACE; + return IdleClock::WatchApp::getInst().start(argc, argv); +} diff --git a/src/window.c b/src/window.c deleted file mode 100755 index 8a16595..0000000 --- a/src/window.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2017 Samsung Electronics Co., Ltd - * - * Licensed under the Flora License, Version 1.1 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://floralicense.org/license/ - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <Ecore.h> -#include <Elementary.h> -#include <watch_app.h> -#include <watch_app_efl.h> - - -#include "app_data.h" -#include "log.h" -#include "util.h" - - -Evas_Object *window_create(const char *name) -{ - Evas_Object *win = NULL; - int ret = 0; - - /* Window */ - - _D("WATCH APP CREATE"); - ret = watch_app_get_elm_win(&win); - if (ret != APP_ERROR_NONE) { - _E("failed to get window(%d)", ret); - return NULL; - } - - elm_win_title_set(win, "idle-clock_digital"); - elm_win_borderless_set(win, EINA_TRUE); - elm_win_alpha_set(win, EINA_FALSE); - elm_win_indicator_opacity_set(win, ELM_WIN_INDICATOR_TRANSPARENT); - elm_win_role_set(win, "no-effect"); - - /* Show window after base gui is set up */ - evas_object_show(win); - - return win; - -} - |