diff options
author | hoejoo lee <hoejoo.lee@samsung.com> | 2015-06-11 14:48:48 +0900 |
---|---|---|
committer | hoejoo lee <hoejoo.lee@samsung.com> | 2015-06-12 16:29:32 +0900 |
commit | f0f2a70519e109c7999adc84036d98dc13269d7e (patch) | |
tree | 03c73e5e1b80310277af5dab7c6f5dc7a84e43d7 /daemon | |
parent | 783b89c3d7b9270781c2bd3e1196c1f49d0e3809 (diff) | |
download | quickpanel-f0f2a70519e109c7999adc84036d98dc13269d7e.tar.gz quickpanel-f0f2a70519e109c7999adc84036d98dc13269d7e.tar.bz2 quickpanel-f0f2a70519e109c7999adc84036d98dc13269d7e.zip |
merge from 2.4 , block compile errorsubmit/tizen_mobile/20150623.021839accepted/tizen/mobile/20150623.052942
Change-Id: I2408a20ba7ce2de87ec104341cdb6cb2923017e8
Diffstat (limited to 'daemon')
120 files changed, 28380 insertions, 5089 deletions
diff --git a/daemon/accessibility.c b/daemon/accessibility.c new file mode 100644 index 0000000..a85bebb --- /dev/null +++ b/daemon/accessibility.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <stdio.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "accessibility.h" + +HAPI Evas_Object * +quickpanel_accessibility_screen_reader_object_get(void *obj, screen_reader_object_type_e type, const char *part, Evas_Object *parent) +{ + Evas_Object *to = NULL; + Evas_Object *ao = NULL; + + retif(obj == NULL, NULL, "invalid parameter"); + retif(type == SCREEN_READER_OBJ_TYPE_EDJ_OBJECT && !part, NULL, "invalid parameter"); + + switch (type) { + case SCREEN_READER_OBJ_TYPE_ELM_OBJECT: + if (part != NULL) { + to = (Evas_Object *)elm_object_part_content_get(obj, part); + ao = (Evas_Object *)to; + } else { + ao = (Evas_Object *)obj; + } + break; + + case SCREEN_READER_OBJ_TYPE_EDJ_OBJECT: + to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get((Evas_Object *)obj), part); + break; + + default:// evas, icon + to = (Evas_Object *)obj; + } + + if (!ao && to && parent) { // edj, evas, icon, elm_object_item + ao = elm_access_object_get(to); + if (ao == NULL) { + ao = elm_access_object_register(to, parent); + } + } + + return ao; +} + +HAPI Evas_Object *quickpanel_accessibility_ui_get_focus_object(Evas_Object *parent) +{ + Evas_Object *focus = elm_button_add(parent); + retif(focus == NULL, NULL, "failed to create focus object"); + + elm_object_style_set(focus, "focus"); + + elm_access_info_set(focus, ELM_ACCESS_INFO, ""); + elm_access_info_set(focus, ELM_ACCESS_TYPE, ""); + + return focus; +} + +HAPI char *quickpanel_accessibility_info_cb(void *data, Evas_Object *obj) +{ + char *str = NULL; + retif(data == NULL, NULL, "invalid parameter"); + + str = _((const char *)data); + if (str != NULL) { + return strdup(str); + } + + return NULL; +} + +HAPI char *quickpanel_accessibility_info_cb_s(void *data, Evas_Object *obj) +{ + char *str = NULL; + retif(data == NULL, NULL, "invalid parameter"); + + // system string is not supported. data should be DID from application po files. + str = _(data); + if (str != NULL) { + return strdup(str); + } + + return NULL; +} + +HAPI void +quickpanel_accessibility_screen_reader_data_set(Evas_Object *view, const char *part, char *type, char *info) +{ + Evas_Object *ao = NULL; + retif(view == NULL, , "invalid parameter"); + retif(part == NULL, , "invalid parameter"); + + ao = quickpanel_accessibility_screen_reader_object_get(view, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, part, view); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, type); + elm_access_info_set(ao, ELM_ACCESS_INFO, info); + } +} diff --git a/daemon/accessibility.h b/daemon/accessibility.h new file mode 100644 index 0000000..bf49a18 --- /dev/null +++ b/daemon/accessibility.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + + +#ifndef __ACCESSIBILITY_H__ +#define __ACCESSIBILITY_H__ + +typedef enum { + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, + SCREEN_READER_OBJ_TYPE_EDJ_OBJECT, +} screen_reader_object_type_e; + +Evas_Object * +quickpanel_accessibility_screen_reader_object_get(void *obj, screen_reader_object_type_e type, const char *part, Evas_Object *parent); +Evas_Object *quickpanel_accessibility_ui_get_focus_object(Evas_Object *parent); +char *quickpanel_accessibility_info_cb(void *data, Evas_Object *obj); +char *quickpanel_accessibility_info_cb_s(void *data, Evas_Object *obj); +void quickpanel_accessibility_screen_reader_data_set(Evas_Object *view, const char *part, char *type, char *info); + +#endif /* __ACCESSIBILITY_H__ */ diff --git a/daemon/common.c b/daemon/common.c index d1c21df..40370b7 100755 --- a/daemon/common.c +++ b/daemon/common.c @@ -1,23 +1,89 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 <pkgmgr-info.h> #include "common.h" #include "quickpanel-ui.h" -HAPI void quickpanel_util_char_replace(char *text, char s, char t) { +static inline int _is_space( char in ) +{ + if ( ( in == _SPACE )) { + return 1; + } else { + return 0; + } +} + +static inline int _l_trim( char *in ) +{ + int i, j; + short int done; + + i = 0; + done = 0; + + while ( !done && in[i] != '\0') { + if ( _is_space( in[i] ) ) { + i++; + } else { + done = 1; + } + } + + j = 0; + while ( in[i] != '\0' ) { + in[j++] = in[i++]; + } + + in[j] = '\0'; + + return 0; +} + +static inline int _r_trim( char *in ) +{ + int i; + short int done; + + i = strlen(in) - 1; + done = 0; + + while ( !done && !( i < 0 ) ) { + if ( _is_space( in[i] ) ) { + in[i--] = '\0'; + } else { + done = 1; + } + } + + return(0); +} + +HAPI void quickpanel_common_util_char_trim(char *text) +{ + retif(text == NULL, , "invalid argument"); + + _l_trim(text); + _r_trim(text); +} + +HAPI void quickpanel_common_util_char_replace(char *text, char s, char t) +{ retif(text == NULL, , "invalid argument"); int i = 0, text_len = 0; @@ -31,6 +97,123 @@ HAPI void quickpanel_util_char_replace(char *text, char s, char t) { } } +HAPI void quickpanel_common_util_add_char_to_each_charactor(char *dst, const char *src, char t) +{ + retif(dst == NULL, , "invalid argument"); + retif(src == NULL, , "invalid argument"); + + int i = 0, text_len = 0; + + text_len = strlen(src); + + for (i = 0; i < text_len; i++) { + *(dst + (i * 2)) = *(src + i); + *(dst + ((i * 2) + 1)) = t; + } +} + +static void _char_set(char *dst, char s, int index, int size) +{ + if (index < size) { + *(dst + index) = s; + } +} + +HAPI void quickpanel_common_util_phone_number_tts_make(char *dst, const char *src, int size) +{ + retif(dst == NULL, , "invalid argument"); + retif(src == NULL, , "invalid argument"); + + int no_op = 0; + int i = 0, j = 0, text_len = 0; + + text_len = strlen(src); + + for (i = 0, j= 0; i < text_len; i++) { + if (no_op == 1) { + _char_set(dst, *(src + i), j++, size); + } else { + if (isdigit(*(src + i))) { + if (i + 1 < text_len) { + if (*(src + i + 1) == '-' || *(src + i + 1) == _SPACE) { + _char_set(dst, *(src + i), j++, size); + } else { + _char_set(dst, *(src + i), j++, size); + _char_set(dst, _SPACE, j++, size); + } + } else { + _char_set(dst, *(src + i), j++, size); + _char_set(dst, _SPACE, j++, size); + } + } else if (*(src + i) == '-') { + no_op = 1; + _char_set(dst, *(src + i), j++, size); + } else { + _char_set(dst, *(src + i), j++, size); + } + } + } +} + +HAPI int quickpanel_common_util_is_phone_number(const char *address) +{ + int digit_count = 0; + retif(address == NULL, 0, "address is NULL"); + + int addr_len = 0; + addr_len = strlen(address); + + if (addr_len == 0) { + return 0; + } + + /* length check phone address should be longer than 2 and shorter than 40 */ + if (addr_len > 2 && addr_len <= QP_UTIL_PHONE_NUMBER_MAX_LEN) { + const char *pszOneChar = address; + + while (*pszOneChar) { + if (isdigit(*pszOneChar)) { + digit_count++; + } + + ++pszOneChar; + } + + pszOneChar = address; + + if (*pszOneChar == '+') { + ++pszOneChar; + } + + while (*pszOneChar) { + if (!isdigit(*pszOneChar) + && (*pszOneChar != '*') && (*pszOneChar != '#') + && (*pszOneChar != ' ') + && !((*pszOneChar == '-') && digit_count >= 7)) { + return 0; + } + + ++pszOneChar; + } + + return 1; + } else { + DBG("invalid address length [%d]", addr_len); + return 0; + } +} + +static void _current_popup_default_backkey_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *popup = data; + retif(popup == NULL, , "invalid argument"); + + if (popup!= NULL) { + evas_object_del(popup); + popup = NULL; + } +} + static void _current_popup_deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { retif(obj == NULL, , "obj is NULL"); @@ -45,7 +228,8 @@ static void _current_popup_deleted_cb(void *data, Evas *e, Evas_Object *obj, voi } } -HAPI void quickpanel_ui_set_current_popup(Evas_Object *popup) { +HAPI void quickpanel_common_ui_set_current_popup(Evas_Object *popup, Evas_Smart_Cb func_back) +{ retif(popup == NULL, , "invalid argument"); struct appdata *ad = quickpanel_get_app_data(); @@ -53,13 +237,155 @@ HAPI void quickpanel_ui_set_current_popup(Evas_Object *popup) { ad->popup = popup; evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, _current_popup_deleted_cb, NULL); + + if (func_back != NULL) { + evas_object_data_set(popup, EDATA_BACKKEY_CB, func_back); + } else { + evas_object_data_set(popup, EDATA_BACKKEY_CB, _current_popup_default_backkey_cb); + } } -HAPI void quickpanel_ui_del_current_popup(void) { +HAPI void quickpanel_common_ui_del_current_popup(void) +{ struct appdata *ad = quickpanel_get_app_data(); retif(ad == NULL, , "invalid argument"); if (ad->popup != NULL) { evas_object_del(ad->popup); + ad->popup = NULL; + } +} + +HAPI void *quickpanel_common_ui_get_buffer_from_image(const char *file_path, size_t *memfile_size, char *ext, int ext_size) +{ + FILE *fp = NULL; + void *buffer = NULL; + char *buf_ext = NULL; + + retif(file_path == NULL, NULL, "invalid data"); + + if (ext != NULL) { + buf_ext = ecore_file_strip_ext(file_path); + if (buf_ext != NULL) { + strncpy(ext, buf_ext, ext_size); + free(buf_ext); + } + } + + fp = fopen(file_path, "r"); + if (fp) { + struct stat stat_buf; + if (stat(file_path, &stat_buf) != 0) { + ERR("Getting file information Error"); + goto err; + } + + if (stat_buf.st_size > 0) { + buffer = (void *)calloc(1, (size_t)stat_buf.st_size + 1); + if (buffer == NULL) { + ERR("failed to alloc a buffer"); + goto err; + } + int result = fread(buffer, sizeof(char), stat_buf.st_size, fp); + if (result != stat_buf.st_size) { + ERR("failed to read a file"); + free(buffer); + buffer = NULL; + goto err; + } + if (memfile_size != NULL) { + *memfile_size = result; + } + } else { + if (memfile_size != NULL) { + *memfile_size = 0; + } + } + } + +err: + if (fp) { + fclose(fp); } + return buffer; +} + +HAPI char *quickpanel_common_ui_get_pkginfo_icon(const char *pkgid) +{ + int ret = 0; + char *icon_path = NULL; + char *icon_ret = NULL; + retif(pkgid == NULL, NULL, "invalid parameter"); + + pkgmgrinfo_appinfo_h appinfo_h = NULL; + + ret = pkgmgrinfo_appinfo_get_appinfo(pkgid, &appinfo_h); + if (ret < 0) { + ERR("pkgmgrinfo_appinfo_get_appinfo is failed %d", ret); + return NULL; + } + + //icon path + ret = pkgmgrinfo_appinfo_get_icon(appinfo_h, &icon_path); + if (ret < 0) { + ERR("pkgmgrinfo_appinfo_get_icon is failed %d", ret); + } + if (icon_path) { + icon_ret = (char*)strdup(icon_path); + } + if (appinfo_h) { + pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); + } + + return icon_ret; +} + +HAPI char *quickpanel_common_ui_get_pkginfo_label(const char *pkgid) +{ + int ret = 0; + char *label = NULL; + char *value_ret = NULL; + retif(pkgid == NULL, NULL, "invalid parameter"); + + pkgmgrinfo_appinfo_h appinfo_h = NULL; + + ret = pkgmgrinfo_appinfo_get_appinfo(pkgid, &appinfo_h); + if (ret < 0) { + ERR("pkgmgrinfo_appinfo_get_appinfo is failed %d", ret); + return NULL; + } + + //icon path + ret = pkgmgrinfo_appinfo_get_label(appinfo_h, &label); + if (ret < 0) { + ERR("pkgmgrinfo_appinfo_get_icon is failed %d", ret); + } + if (label) { + value_ret = (char*)strdup(label); + } + if (appinfo_h) { + pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); + } + + return value_ret; +} + +HAPI int quickpanel_common_ui_is_package_exist(const char *pkgid) +{ + int ret = 0; + retif(pkgid == NULL, 0, "invalid parameter"); + + pkgmgrinfo_appinfo_h appinfo_h = NULL; + + ret = pkgmgrinfo_appinfo_get_appinfo(pkgid, &appinfo_h); + if (ret < 0) { + DBG("package %s isn't exist", pkgid); + return 0; + } + + if (appinfo_h) { + pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); + } + + return 1; } diff --git a/daemon/common.h b/daemon/common.h index 913054c..5749c17 100755 --- a/daemon/common.h +++ b/daemon/common.h @@ -1,19 +1,21 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ + #ifndef __QP_COMMON_H_ #define __QP_COMMON_H_ @@ -25,8 +27,11 @@ #define QP_OK (0) #define QP_FAIL (-1) +#define QP_UTIL_PHONE_NUMBER_MAX_LEN 40 +#define EDATA_BACKKEY_CB "bk_cb" #ifdef _DLOG_USED +#undef LOG_TAG #define LOG_TAG "QUICKPANEL" #include <dlog.h> @@ -52,6 +57,21 @@ LOGE("[%s : %d] "fmt"\n", __func__, __LINE__, ##args); \ } while (0) +#define SDBG(fmt , args...) \ + do { \ + SECURE_LOGD("[%s : %d] "fmt"\n", __func__, __LINE__, ##args); \ + } while (0) + +#define SINFO(fmt , args...) \ + do { \ + SECURE_LOGI("[%s : %d] "fmt"\n", __func__, __LINE__, ##args); \ + } while (0) + +#define SERR(fmt , args...) \ + do { \ + SECURE_LOGE("[%s : %d] "fmt"\n", __func__, __LINE__, ##args); \ + } while (0) + #elif FILE_DEBUG /*_DLOG_USED*/ #define DBG(fmt , args...) \ do { \ @@ -112,6 +132,12 @@ } \ } while (0); +#define retif_nomsg(cond, ret) do { \ + if (cond) { \ + return ret;\ + } \ +} while (0); + #define gotoif(cond, target, str, args...) do { \ if (cond) { \ WARN(str, ##args); \ @@ -120,8 +146,16 @@ } while (0); -void quickpanel_util_char_replace(char *text, char s, char t); -void quickpanel_ui_set_current_popup(Evas_Object *popup); -void quickpanel_ui_del_current_popup(void); +void quickpanel_common_util_char_trim(char *text); +void quickpanel_common_util_char_replace(char *text, char s, char t); +void quickpanel_common_util_add_char_to_each_charactor(char *dst, const char *src, char t); +int quickpanel_common_util_is_phone_number(const char *address); +void quickpanel_common_util_phone_number_tts_make(char *dst, const char *src, int size); +void quickpanel_common_ui_set_current_popup(Evas_Object *popup, Evas_Smart_Cb func_close); +void quickpanel_common_ui_del_current_popup(void); +void *quickpanel_common_ui_get_buffer_from_image(const char *file_path, size_t *memfile_size, char *ext, int ext_size); +char *quickpanel_common_ui_get_pkginfo_icon(const char *pkgid); +char *quickpanel_common_ui_get_pkginfo_label(const char *pkgid); +int quickpanel_common_ui_is_package_exist(const char *pkgid); #endif /* __QP_COMMON_H_ */ diff --git a/daemon/common_uic.c b/daemon/common_uic.c new file mode 100644 index 0000000..54596dd --- /dev/null +++ b/daemon/common_uic.c @@ -0,0 +1,375 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <app.h> +#include <sys/utsname.h> +#ifdef HAVE_X +#include <X11/Xlib.h> +#include <utilX.h> +#endif +#include <Ecore_Input.h> +#include <vconf.h> +#include <notification.h> +#include <app_control_internal.h> +#include <bundle_internal.h> +#include "common.h" +#include "quickpanel-ui.h" + + +/* binary information */ +#define QP_EMUL_STR "Emulator" +#define DEL_TIMER_VALUE 0.480 +#define SYSTEM_INFO_KEY_MODEL "http://tizen.org/system/model_name" +static Ecore_Timer *_close_timer = NULL; + + +static void _quickpanel_move_data_to_service(const char *key, const char *val, void *data) +{ + retif(data == NULL || key == NULL || val == NULL, , "Invialid parameter!"); + + app_control_h service = data; + app_control_add_extra_data(service, key, val); +} + +HAPI Evas_Object *quickpanel_uic_load_edj(Evas_Object * parent, const char *file, + const char *group, int is_just_load) +{ + Eina_Bool r; + Evas_Object *eo = NULL; + + retif(parent == NULL, NULL, "Invalid parameter!"); + + eo = elm_layout_add(parent); + retif(eo == NULL, NULL, "Failed to add layout object!"); + + r = elm_layout_file_set(eo, file, group); + retif(r != EINA_TRUE, NULL, + "Failed to set edje object file[%s-%s]!", file, group); + + evas_object_size_hint_weight_set(eo, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(eo, + EVAS_HINT_FILL, EVAS_HINT_FILL); + + if (is_just_load == 1) { + elm_win_resize_object_add(parent, eo); + } + evas_object_show(eo); + + return eo; +} + +HAPI int quickpanel_uic_is_opened(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, 0, "invalid data."); + + return ad->is_opened; +} + +HAPI int quickpanel_uic_is_suspended(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, 0, "invalid data."); + + return ad->is_suspended; +} + +HAPI int quickpanel_uic_is_emul(void) +{ + int is_emul = 0; + char *info = NULL; + if (system_info_get_platform_string(SYSTEM_INFO_KEY_MODEL, &info) == 0) { + if (info == NULL) { + return 0; + } + if (!strncmp(QP_EMUL_STR, info, strlen(info))) { + is_emul = 1; + } + } + + if (info != NULL) free(info); + + return is_emul; +} + +HAPI void quickpanel_uic_initial_resize(Evas_Object *obj, int height) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + + height = (height % 2 != 0) ? height + 1 : height; + + if (ad->angle == 90 || ad->angle == 270) { + evas_object_resize(obj, ad->win_height, height * ad->scale); + } else { + evas_object_resize(obj, ad->win_width, height * ad->scale); + } +} + +HAPI int quickpanel_uic_launch_app(char *app_id, void *data) +{ + int ret = APP_CONTROL_ERROR_NONE; + app_control_h service = NULL; + char *app_id_from_service = NULL; + + retif(app_id == NULL && data == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "Invialid parameter!"); + + ret = app_control_create(&service); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("app_control_create() return error : %d", ret); + return ret; + } + retif(service == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "fail to create service handle!"); + + if (app_id != NULL) { + app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT); + app_control_set_app_id(service, app_id); + + if (data != NULL) { + bundle_iterate((bundle *)data, _quickpanel_move_data_to_service, service); + } + } else { + if (data != NULL) { + ret = app_control_import_from_bundle(service, data); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("Failed to import[%d]", ret); + } + } + } + + ret = app_control_send_launch_request(service, NULL, NULL); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("app_control_send_launch_request() is failed : %d", ret); + app_control_get_app_id(service, &app_id_from_service); + if (app_id_from_service != NULL) { + quickpanel_uic_launch_app_inform_result(app_id_from_service, ret); + free(app_id_from_service); + } else { + quickpanel_uic_launch_app_inform_result(app_id, ret); + } + app_control_destroy(service); + return ret; + } + app_control_destroy(service); + return ret; +} + +HAPI int quickpanel_uic_launch_ug_by_appcontrol(const char *package, void *data) +{ + int ret = APP_CONTROL_ERROR_NONE; + app_control_h service = NULL; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "ad null"); + retif(package == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "package null"); + + ret = app_control_create(&service); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("app_control_create() return error : %d", ret); + return ret; + } + retif(service == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "fail to create service handle!"); + + app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT); + app_control_set_app_id(service, package); + + if (data != NULL) { + bundle_iterate((bundle *)data, _quickpanel_move_data_to_service, service); + } + + ret = app_control_send_launch_request(service, NULL, NULL); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("app_control_send_launch_request() is failed : %d", ret); + app_control_destroy(service); + return ret; + } + app_control_destroy(service); + return ret; +} + +HAPI void quickpanel_uic_launch_app_inform_result(const char *pkgname, int retcode) +{ + retif(retcode == APP_CONTROL_ERROR_NONE, , "retcode = APP_CONTROL_ERROR_NONE!"); + retif(pkgname == NULL && retcode != APP_CONTROL_ERROR_APP_NOT_FOUND, , "Invialid parameter!"); + + const char *msg = NULL; + char *app_label = NULL; + + if (retcode == APP_CONTROL_ERROR_APP_NOT_FOUND) { + notification_status_message_post(_NOT_LOCALIZED("Unable to find application to perform this action.")); + } else { + Eina_Strbuf *strbuf = eina_strbuf_new(); + char *format = _("IDS_QP_TPOP_UNABLE_TO_OPEN_PS"); + + if (strbuf != NULL) { + app_label = quickpanel_common_ui_get_pkginfo_label(pkgname); + if (app_label != NULL) { + eina_strbuf_append_printf(strbuf, format, app_label); + free(app_label); + } else { + eina_strbuf_append_printf(strbuf, format, pkgname); + } + eina_strbuf_append_printf(strbuf, "(%x)", retcode); + msg = eina_strbuf_string_get(strbuf); + + if (msg != NULL) { + notification_status_message_post(msg); + } + eina_strbuf_free(strbuf); + } + } +} + +HAPI void quickpanel_uic_open_quickpanel(int reason) +{ +#ifdef HAVE_X + Ecore_X_Window xwin; + Ecore_X_Window zone; +#endif + struct appdata *ad = quickpanel_get_app_data(); + + DBG("reason:%d", reason); + + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->win == NULL, , "Invalid parameter!"); +#ifdef HAVE_X + xwin = elm_win_xwindow_get(ad->win); + if (xwin != 0) { + if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) { + if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_OFF) { + ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON); + quickpanel_uic_opened_reason_set(reason); + } + } else { + ERR("failed to get zone"); + } + } else { + ERR("failed to get xwin"); + } +#endif +} + +HAPI void quickpanel_uic_opened_reason_set(int reason) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "Invalid parameter!"); + + ad->opening_reason = reason; +} + +HAPI int quickpanel_uic_opened_reason_get(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, OPENED_NO_REASON, "Invalid parameter!"); + + return ad->opening_reason; +} + +static void _quickpanel_close(void) +{ +#ifdef HAVE_X + Ecore_X_Window xwin; + Ecore_X_Window zone; +#endif + struct appdata *ad = quickpanel_get_app_data(); + + DBG(""); + + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->win == NULL, , "Invalid parameter!"); +#ifdef HAVE_X + xwin = elm_win_xwindow_get(ad->win); + if (xwin != 0) { + if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) { + if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_ON) { + ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF); + } + } else { + ERR("failed to get zone"); + } + } else { + ERR("failed to get xwin"); + } +#endif +} + +static Eina_Bool _quickpanel_close_timer_cb(void *data) +{ + if( _close_timer != NULL ) { + _close_timer = NULL; + } + _quickpanel_close(); + + return ECORE_CALLBACK_CANCEL; +} + +HAPI void quickpanel_uic_close_quickpanel(bool is_check_lock, int is_delay_needed) { + int ret = 0; + int is_lock_launched = VCONFKEY_IDLE_UNLOCK; + + if (is_check_lock == true) { + if (vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &is_lock_launched) == 0) { + if (is_lock_launched == VCONFKEY_IDLE_LOCK) { + ret = vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK); + if (ret == 0) { + ERR("unlock the lockscreen from quickpanel"); + } else { + ERR("failed to unlock the lockscreen from quickpanel"); + } + } + } + } + + if (is_delay_needed) { + if( _close_timer == NULL ) { + _close_timer = ecore_timer_add(DEL_TIMER_VALUE, _quickpanel_close_timer_cb, NULL); + } + } else { + _quickpanel_close(); + } +} + +HAPI void quickpanel_uic_toggle_openning_quickpanel(void) +{ +#ifdef HAVE_X + Ecore_X_Window xwin; + Ecore_X_Window zone; +#endif + struct appdata *ad = quickpanel_get_app_data(); + + DBG(""); + + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->win == NULL, , "Invalid parameter!"); +#ifdef HAVE_X + xwin = elm_win_xwindow_get(ad->win); + if (xwin != 0) { + if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) { + if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_ON) { + ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF); + } else { + ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON); + } + } else { + ERR("failed to get zone"); + } + } else { + ERR("failed to get xwin"); + } +#endif +} diff --git a/daemon/common_uic.h b/daemon/common_uic.h new file mode 100644 index 0000000..882163d --- /dev/null +++ b/daemon/common_uic.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __QP_COMMON_UIC_H_ +#define __QP_COMMON_UIC_H_ + +typedef enum { + OPENED_NO_REASON = 0, + OPENED_BY_CMD_HIDE_LAUNCH = 1, + OPENED_BY_CMD_SHOW_SETTINGS = 2, +} qp_open_reason; + +Evas_Object *quickpanel_uic_load_edj(Evas_Object * parent, const char *file, + const char *group, int is_just_load); +int quickpanel_uic_launch_app(char *app_id, void *data); +int quickpanel_uic_launch_ug_by_appcontrol(const char *package, void *data); +int quickpanel_uic_is_emul(void); +int quickpanel_uic_is_suspended(void); +int quickpanel_uic_is_opened(void); +void quickpanel_uic_launch_app_inform_result(const char *pkgname, int retcode); +void quickpanel_uic_initial_resize(Evas_Object *obj, int height); +void quickpanel_uic_close_quickpanel(bool is_check_lock, int is_delay_needed); +void quickpanel_uic_open_quickpanel(int reason); +void quickpanel_uic_toggle_openning_quickpanel(void); +void quickpanel_uic_opened_reason_set(int reason); +int quickpanel_uic_opened_reason_get(void); + +#endif /* __QP_COMMON_UIC_H_ */ diff --git a/daemon/common_uic_x11.c b/daemon/common_uic_x11.c new file mode 100644 index 0000000..5558f29 --- /dev/null +++ b/daemon/common_uic_x11.c @@ -0,0 +1,364 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <app.h> +#include <sys/utsname.h> +#include <X11/Xlib.h> +#include <utilX.h> +#include <Ecore_Input.h> +#include <vconf.h> +#include <notification.h> +#include <app_control_internal.h> +#include <bundle_internal.h> +#include "common.h" +#include "quickpanel-ui.h" + + +/* binary information */ +#define QP_EMUL_STR "Emulator" +#define DEL_TIMER_VALUE 0.480 +#define SYSTEM_INFO_KEY_MODEL "http://tizen.org/system/model_name" +static Ecore_Timer *_close_timer = NULL; + + +static void _quickpanel_move_data_to_service(const char *key, const char *val, void *data) +{ + retif(data == NULL || key == NULL || val == NULL, , "Invialid parameter!"); + + app_control_h service = data; + app_control_add_extra_data(service, key, val); +} + +HAPI Evas_Object *quickpanel_uic_load_edj(Evas_Object * parent, const char *file, + const char *group, int is_just_load) +{ + Eina_Bool r; + Evas_Object *eo = NULL; + + retif(parent == NULL, NULL, "Invalid parameter!"); + + eo = elm_layout_add(parent); + retif(eo == NULL, NULL, "Failed to add layout object!"); + + r = elm_layout_file_set(eo, file, group); + retif(r != EINA_TRUE, NULL, + "Failed to set edje object file[%s-%s]!", file, group); + + evas_object_size_hint_weight_set(eo, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(eo, + EVAS_HINT_FILL, EVAS_HINT_FILL); + + if (is_just_load == 1) { + elm_win_resize_object_add(parent, eo); + } + evas_object_show(eo); + + return eo; +} + +HAPI int quickpanel_uic_is_opened(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, 0, "invalid data."); + + return ad->is_opened; +} + +HAPI int quickpanel_uic_is_suspended(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, 0, "invalid data."); + + return ad->is_suspended; +} + +HAPI int quickpanel_uic_is_emul(void) +{ + int is_emul = 0; + char *info = NULL; + if (system_info_get_platform_string(SYSTEM_INFO_KEY_MODEL, &info) == 0) { + if (info == NULL) { + return 0; + } + if (!strncmp(QP_EMUL_STR, info, strlen(info))) { + is_emul = 1; + } + } + + if (info != NULL) free(info); + + return is_emul; +} + +HAPI void quickpanel_uic_initial_resize(Evas_Object *obj, int height) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + + height = (height % 2 != 0) ? height + 1 : height; + + if (ad->angle == 90 || ad->angle == 270) { + evas_object_resize(obj, ad->win_height, height * ad->scale); + } else { + evas_object_resize(obj, ad->win_width, height * ad->scale); + } +} + +HAPI int quickpanel_uic_launch_app(char *app_id, void *data) +{ + int ret = APP_CONTROL_ERROR_NONE; + app_control_h service = NULL; + char *app_id_from_service = NULL; + + retif(app_id == NULL && data == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "Invialid parameter!"); + + ret = app_control_create(&service); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("app_control_create() return error : %d", ret); + return ret; + } + retif(service == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "fail to create service handle!"); + + if (app_id != NULL) { + app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT); + app_control_set_app_id(service, app_id); + + if (data != NULL) { + bundle_iterate((bundle *)data, _quickpanel_move_data_to_service, service); + } + } else { + if (data != NULL) { + ret = app_control_import_from_bundle(service, data); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("Failed to import[%d]", ret); + } + } + } + + ret = app_control_send_launch_request(service, NULL, NULL); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("app_control_send_launch_request() is failed : %d", ret); + app_control_get_app_id(service, &app_id_from_service); + if (app_id_from_service != NULL) { + quickpanel_uic_launch_app_inform_result(app_id_from_service, ret); + free(app_id_from_service); + } else { + quickpanel_uic_launch_app_inform_result(app_id, ret); + } + app_control_destroy(service); + return ret; + } + app_control_destroy(service); + return ret; +} + +HAPI int quickpanel_uic_launch_ug_by_appcontrol(const char *package, void *data) +{ + int ret = APP_CONTROL_ERROR_NONE; + app_control_h service = NULL; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "ad null"); + retif(package == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "package null"); + + ret = app_control_create(&service); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("app_control_create() return error : %d", ret); + return ret; + } + retif(service == NULL, APP_CONTROL_ERROR_INVALID_PARAMETER, "fail to create service handle!"); + + app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT); + app_control_set_app_id(service, package); + + if (data != NULL) { + bundle_iterate((bundle *)data, _quickpanel_move_data_to_service, service); + } + + ret = app_control_send_launch_request(service, NULL, NULL); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("app_control_send_launch_request() is failed : %d", ret); + app_control_destroy(service); + return ret; + } + app_control_destroy(service); + return ret; +} + +HAPI void quickpanel_uic_launch_app_inform_result(const char *pkgname, int retcode) +{ + retif(retcode == APP_CONTROL_ERROR_NONE, , "retcode = APP_CONTROL_ERROR_NONE!"); + retif(pkgname == NULL && retcode != APP_CONTROL_ERROR_APP_NOT_FOUND, , "Invialid parameter!"); + + const char *msg = NULL; + char *app_label = NULL; + + if (retcode == APP_CONTROL_ERROR_APP_NOT_FOUND) { + notification_status_message_post(_NOT_LOCALIZED("Unable to find application to perform this action.")); + } else { + Eina_Strbuf *strbuf = eina_strbuf_new(); + char *format = _("IDS_QP_TPOP_UNABLE_TO_OPEN_PS"); + + if (strbuf != NULL) { + app_label = quickpanel_common_ui_get_pkginfo_label(pkgname); + if (app_label != NULL) { + eina_strbuf_append_printf(strbuf, format, app_label); + free(app_label); + } else { + eina_strbuf_append_printf(strbuf, format, pkgname); + } + eina_strbuf_append_printf(strbuf, "(%x)", retcode); + msg = eina_strbuf_string_get(strbuf); + + if (msg != NULL) { + notification_status_message_post(msg); + } + eina_strbuf_free(strbuf); + } + } +} + +HAPI void quickpanel_uic_open_quickpanel(int reason) +{ + Ecore_X_Window xwin; + Ecore_X_Window zone; + struct appdata *ad = quickpanel_get_app_data(); + + DBG("reason:%d", reason); + + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->win == NULL, , "Invalid parameter!"); + + xwin = elm_win_xwindow_get(ad->win); + if (xwin != 0) { + if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) { + if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_OFF) { + ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON); + quickpanel_uic_opened_reason_set(reason); + } + } else { + ERR("failed to get zone"); + } + } else { + ERR("failed to get xwin"); + } +} + +HAPI void quickpanel_uic_opened_reason_set(int reason) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "Invalid parameter!"); + + ad->opening_reason = reason; +} + +HAPI int quickpanel_uic_opened_reason_get(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, OPENED_NO_REASON, "Invalid parameter!"); + + return ad->opening_reason; +} + +static void _quickpanel_close(void) +{ + Ecore_X_Window xwin; + Ecore_X_Window zone; + struct appdata *ad = quickpanel_get_app_data(); + + DBG(""); + + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->win == NULL, , "Invalid parameter!"); + + xwin = elm_win_xwindow_get(ad->win); + if (xwin != 0) { + if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) { + if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_ON) { + ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF); + } + } else { + ERR("failed to get zone"); + } + } else { + ERR("failed to get xwin"); + } +} + +static Eina_Bool _quickpanel_close_timer_cb(void *data) +{ + if( _close_timer != NULL ) { + _close_timer = NULL; + } + _quickpanel_close(); + + return ECORE_CALLBACK_CANCEL; +} + +HAPI void quickpanel_uic_close_quickpanel(bool is_check_lock, int is_delay_needed) { + int ret = 0; + int is_lock_launched = VCONFKEY_IDLE_UNLOCK; + + if (is_check_lock == true) { + if (vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &is_lock_launched) == 0) { + if (is_lock_launched == VCONFKEY_IDLE_LOCK) { + ret = vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK); + if (ret == 0) { + ERR("unlock the lockscreen from quickpanel"); + } else { + ERR("failed to unlock the lockscreen from quickpanel"); + } + } + } + } + + if (is_delay_needed) { + if( _close_timer == NULL ) { + _close_timer = ecore_timer_add(DEL_TIMER_VALUE, _quickpanel_close_timer_cb, NULL); + } + } else { + _quickpanel_close(); + } +} + +HAPI void quickpanel_uic_toggle_openning_quickpanel(void) +{ + Ecore_X_Window xwin; + Ecore_X_Window zone; + struct appdata *ad = quickpanel_get_app_data(); + + DBG(""); + + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->win == NULL, , "Invalid parameter!"); + + xwin = elm_win_xwindow_get(ad->win); + if (xwin != 0) { + if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) { + if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_ON) { + ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF); + } else { + ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON); + } + } else { + ERR("failed to get zone"); + } + } else { + ERR("failed to get xwin"); + } +} diff --git a/daemon/datetime/datetime.c b/daemon/datetime/datetime.c new file mode 100644 index 0000000..e87197f --- /dev/null +++ b/daemon/datetime/datetime.c @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <app.h> +#include <glib.h> +#include <string.h> +#include <vconf.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "list_util.h" +#include "quickpanel_def.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif +#include "modules.h" +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif +#include "util-time.h" + +static int _init(void *data); +static int _fini(void *data); + +#define PKG_SETTING_EDIT "quickpanel-setting-efl" +#define QP_TIMEDATE_SETTING_UG "setting-time-efl" +#define E_DATA_EDITING_VISIBILITT "editing_visible" +#define E_DATA_TIME_N_DATE_EVENT "time_n_date_event" + +QP_Module qp_datetime_view = { + .name = "qp_datetime_view", + .init = _init, + .fini = _fini, + .suspend = NULL, + .resume = NULL, + .lang_changed = NULL, + .refresh = NULL, +}; + +static Evas_Object *_datetime_view_get(void); + +static void _flag_set(Evas_Object *container, const char *key, int value) +{ + retif(container == NULL, , "invalid parameter"); + retif(key == NULL, , "invalid parameter"); + + evas_object_data_set(container, key, (void *)value); +} + +static int _flag_get(Evas_Object *container, const char *key) +{ + retif(container == NULL, 0, "invalid parameter"); + retif(key == NULL, 0, "invalid parameter"); + + return (int)evas_object_data_get(container, key); +} + +static void _set_text_to_part(Evas_Object *obj, const char *part, const char *text) +{ + const char *old_text = NULL; + + retif(obj == NULL, , "Invalid parameter!"); + retif(part == NULL, , "Invalid parameter!"); + retif(text == NULL, , "Invalid parameter!"); + + old_text = elm_object_part_text_get(obj, part); + if (old_text != NULL) { + if (strcmp(old_text, text) == 0) { + return; + } + } + + elm_object_part_text_set(obj, part, text); +} + +static void _text_time_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *view = _datetime_view_get(); + int ret; + + if (view) { + if (_flag_get(view, E_DATA_TIME_N_DATE_EVENT) == 0) { + DBG("Time & date area click is event disabled"); + return; + } + } + + quickpanel_media_play_feedback(); + + ret = quickpanel_uic_launch_ug_by_appcontrol(QP_TIMEDATE_SETTING_UG, NULL); + quickpanel_uic_launch_app_inform_result(QP_TIMEDATE_SETTING_UG, ret); + + quickpanel_uic_close_quickpanel(true, 1); +} + +static void _button_setting_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + quickpanel_media_play_feedback(); + +#ifdef QP_EMERGENCY_MODE_ENABLE + if (quickpanel_emergency_mode_is_on()) { + quickpanel_uic_launch_app(PACKAGE_EMERGENCY_MODE_SETTING, NULL); + } else { + quickpanel_uic_launch_app(QP_SETTING_PKG_SETTING, NULL); + } +#else + quickpanel_uic_launch_app(QP_SETTING_PKG_SETTING, NULL); +#endif + quickpanel_uic_close_quickpanel(true, 1); +} + +static Evas_Object *_datetime_view_create(Evas_Object *parent) +{ + Evas_Object *focus = NULL; + Eina_Bool ret = EINA_TRUE; + Evas_Object *view = NULL; + + retif(parent == NULL, NULL, "Invalid parameter!"); + + view = elm_layout_add(parent); + + if (view != NULL) { + ret = elm_layout_file_set(view, DEFAULT_EDJ, + "quickpanel/datetime"); + if (ret == EINA_FALSE) { + ERR("failed to load quickpanel/datetime layout"); + } + evas_object_size_hint_weight_set(view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(view, EVAS_HINT_FILL, EVAS_HINT_FILL); + quickpanel_uic_initial_resize(view, QP_DATE_H); + + focus = quickpanel_accessibility_ui_get_focus_object(view); + elm_object_part_content_set(view, "focus.datetime", focus); + evas_object_smart_callback_add(focus, "clicked", _text_time_clicked_cb, view); + + focus = quickpanel_accessibility_ui_get_focus_object(view); + elm_object_part_content_set(view, "focus.setting", focus); + evas_object_smart_callback_add(focus, "clicked", _button_setting_clicked_cb, view); + + _flag_set(view, E_DATA_EDITING_VISIBILITT, 0); + + if (quickpanel_emergency_mode_is_on()) { + _flag_set(view, E_DATA_TIME_N_DATE_EVENT, 0); + elm_object_signal_emit(view, "timendate.click.disable", "prog"); + } else { + _flag_set(view, E_DATA_TIME_N_DATE_EVENT, 1); + elm_object_signal_emit(view, "timendate.click.enable", "prog"); + } + + evas_object_show(view); + } + + return view; +} + +static Evas_Object *_datetime_view_get(void) { + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, NULL, "invalid argument"); + retif(ad->view_root == NULL, NULL, "invalid argument"); + + return elm_object_part_content_get(ad->view_root + , "qp.base.datetime.swallow"); +} + +static void _datetime_view_attach(void *data) +{ + Evas_Object *view = NULL; + struct appdata *ad = data; + retif(ad == NULL, ,"invalid parameter"); + retif(ad->view_root == NULL, ,"invalid parameter"); + + view = _datetime_view_create(ad->view_root); + if (view != NULL) { + elm_object_part_content_set(ad->view_root, "qp.base.datetime.swallow", view); + } +} + +static void _datetime_view_deattach(void *data) +{ + Evas_Object *view = NULL; + struct appdata *ad = data; + retif(ad == NULL, ,"invalid parameter"); + retif(ad->view_root == NULL, ,"invalid parameter"); + + view = elm_object_part_content_unset(ad->view_root, "qp.base.datetime.swallow"); + if (view != NULL) { + evas_object_del(view); + view = NULL; + } +} + +static int _init(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL,"invalid parameter"); + + _datetime_view_attach(ad); + + return QP_OK; +} + +static int _fini(void *data) +{ + _datetime_view_deattach(data); + + return QP_OK; +} + +HAPI void quickpanel_datetime_datentime_event_set(int is_clickable) +{ + Evas_Object *view = _datetime_view_get(); + + DBG("date n time clickable set[%d]", is_clickable); + + if (view != NULL) { + if (is_clickable == 1) { + if (_flag_get(view, E_DATA_TIME_N_DATE_EVENT) == 0) { + _flag_set(view, E_DATA_TIME_N_DATE_EVENT, 1); + elm_object_signal_emit(view, "timendate.click.enable", "prog"); + } + } else { + if (_flag_get(view, E_DATA_TIME_N_DATE_EVENT) == 1) { + _flag_set(view, E_DATA_TIME_N_DATE_EVENT, 0); + elm_object_signal_emit(view, "timendate.click.disable", "prog"); + } + } + } +} + +HAPI void quickpanel_datetime_editing_icon_visibility_set(int is_visible) +{ + Evas_Object *view = _datetime_view_get(); + + DBG("visibility set:%d", is_visible); + + if (view != NULL) { + if (is_visible == 1) { + if (_flag_get(view, E_DATA_EDITING_VISIBILITT) == 0) { + _flag_set(view, E_DATA_EDITING_VISIBILITT, 1); + elm_object_signal_emit(view, "button,editing,show", "prog"); + } + } else { + if (_flag_get(view, E_DATA_EDITING_VISIBILITT) == 1) { + _flag_set(view, E_DATA_EDITING_VISIBILITT, 0); + elm_object_signal_emit(view, "button,editing,hide", "prog"); + } + } + } +} + +HAPI void quickpanel_datetime_view_update(char *date, char *time, char *meridiem, int meridiem_type) +{ + Evas_Object *view = NULL; + + Eina_Strbuf *strbuf_date = NULL; + Eina_Strbuf *strbuf_time = NULL; + Eina_Strbuf *strbuf_access = NULL; + + view = _datetime_view_get(); + + if (!view) { + ERR("view == NULL"); + return; + } + + strbuf_date = eina_strbuf_new(); + if(!strbuf_date) { + ERR("strbuf_date == NULL"); + return; + } + + strbuf_time = eina_strbuf_new(); + if(!strbuf_time) { + ERR("strbuf_time == NULL"); + eina_strbuf_free(strbuf_date); + return; + } + + strbuf_access = eina_strbuf_new(); + if(!strbuf_access) { + ERR("strbuf_access == NULL"); + eina_strbuf_free(strbuf_date); + eina_strbuf_free(strbuf_time); + return; + } + + + DBG("update time: %s %s %s", date, time, meridiem); + + if (date != NULL) { + eina_strbuf_append_printf(strbuf_date, "%s", date); + eina_strbuf_append_printf(strbuf_access, "%s ", date); + } + + eina_strbuf_ltrim(strbuf_date); + + // ------------------------------------------------------------------------------------- + + if (meridiem_type == UTIL_TIME_MERIDIEM_TYPE_PRE && meridiem != NULL && strlen(meridiem) != 0) { + eina_strbuf_append_printf(strbuf_time, "<ampm>%s</> ", meridiem); + eina_strbuf_append_printf(strbuf_access, "%s ", meridiem); + } + + if (time != NULL) { + eina_strbuf_append_printf(strbuf_time, "<time>%s</>", time); + eina_strbuf_append_printf(strbuf_access, "%s ", time); + } + + if (meridiem_type == UTIL_TIME_MERIDIEM_TYPE_POST && meridiem != NULL && strlen(meridiem) != 0) { + eina_strbuf_append_printf(strbuf_time, " <ampm>%s</>", meridiem); + eina_strbuf_append_printf(strbuf_access, "%s ", meridiem); + } + + eina_strbuf_ltrim(strbuf_time); + + // ------------------------------------------------------------------------------------- + + LOGI("DATE STR SET: %s", eina_strbuf_string_get(strbuf_time)); + + _set_text_to_part(view, "text.date", eina_strbuf_string_get(strbuf_date)); + _set_text_to_part(view, "text.time", eina_strbuf_string_get(strbuf_time)); + + quickpanel_accessibility_screen_reader_data_set(view, "focus.datetime", "", (char *)eina_strbuf_string_get(strbuf_access)); + + eina_strbuf_free(strbuf_date); + eina_strbuf_free(strbuf_time); + eina_strbuf_free(strbuf_access); + + quickpanel_accessibility_screen_reader_data_set(view + , "focus.setting", "", _NOT_LOCALIZED("Settings")); + +} diff --git a/daemon/datetime/datetime.h b/daemon/datetime/datetime.h new file mode 100644 index 0000000..a570bca --- /dev/null +++ b/daemon/datetime/datetime.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __DATETIME_H__ +#define __DATETIME_H__ + +void quickpanel_datetime_datentime_event_set(int is_clickable); +void quickpanel_datetime_editing_icon_visibility_set(int is_visible); +void quickpanel_datetime_view_update(char *date, char *time, char *meridiem, int meridiem_type); + +#endif /* __DATETIME_H__ */ diff --git a/daemon/datetime/util-time.c b/daemon/datetime/util-time.c new file mode 100644 index 0000000..484b3fe --- /dev/null +++ b/daemon/datetime/util-time.c @@ -0,0 +1,1392 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <appcore-common.h> +#include <vconf.h> +#include <vconf-keys.h> +#include <dlog.h> +#include <app_control.h> +#include <ctype.h> +#include <system_settings.h> +#include <utils_i18n.h> + +#include <unicode/utypes.h> +#include <unicode/putil.h> +#include <unicode/uiter.h> +#include <unicode/udat.h> +#include <unicode/udatpg.h> +#include <unicode/ustring.h> + +#include "common.h" +#include "quickpanel-ui.h" +#include "util-time.h" +#include "datetime.h" +#include "noti.h" + +#define TIME_ZONEINFO_PATH "/usr/share/zoneinfo/" +#define TIME_ZONEINFO_PATH_LEN (strlen(TIME_ZONEINFO_PATH)) +#define BUF_FORMATTER 64 + +static const char *colon = ":"; +static const char *ratio = "∶"; +static int _init(void *data); +static int _fini(void *data); +static void _lang_changed(void *data); +static void _util_time_heartbeat_do(void); + +QP_Module qp_datetime_controller = { + .name = "qp_datetime_controller", + .init = _init, + .fini = _fini, + .suspend = NULL, + .resume = NULL, + .lang_changed = _lang_changed, + .refresh = NULL, +}; + +static struct info { + int is_initialized; + Ecore_Timer *timer; + int is_timer_enabled; + UDateFormat *formatter_date; + UDateFormat *formatter_time; + UDateFormat *formatter_ampm; + UDateTimePatternGenerator *generator; + UDateTimePatternGenerator *date_generator; + int timeformat; + char *timeregion_format; + char *dateregion_format; + char *timezone_id; + Eina_Bool is_pre_meridiem; +} s_info = { + .is_initialized = 0, + .timer = NULL, + .is_timer_enabled = 0, + .formatter_date = NULL, + .formatter_time = NULL, + .formatter_ampm = NULL, + .generator = NULL, + .date_generator = NULL, + .timeformat = APPCORE_TIME_FORMAT_24, + .timeregion_format = NULL, + .dateregion_format = NULL, + .timezone_id = NULL, + .is_pre_meridiem = EINA_FALSE, +}; + +static int _get_formatted_time_from_utc_time(time_t intime, char *buf, int buf_len, const char *timezone, int time_format, void *data); +static int _get_formatted_ampm_from_utc_time(time_t intime, char *buf, int buf_len, int *ampm_len, const char *timezone, void *data); +static int _get_formatted_date_from_utc_time(time_t intime, char *buf, int buf_len, const char *timezone, void *data, const char *format); +static int _get_simple_formatted_date_from_utc_time(time_t intime, char *buf, int buf_len, const char *timezone, void *data); + + +static Eina_Bool _timer_cb(void *data); + +static UChar *uastrcpy(const char *chars) +{ + int len = 0; + UChar *str = NULL; + len = strlen(chars); + str = (UChar *) malloc(sizeof(UChar) *(len + 1)); + if (!str) { + return NULL; + } + u_uastrcpy(str, chars); + return str; +} + +static void ICU_set_timezone(const char *timezone) +{ + DBG("ICU_set_timezone = %s ", timezone); + UErrorCode ec = U_ZERO_ERROR; + UChar *str = uastrcpy(timezone); + + ucal_setDefaultTimeZone(str, &ec); + if (U_SUCCESS(ec)) { + DBG("ucal_setDefaultTimeZone() SUCCESS "); + } else { + ERR("ucal_setDefaultTimeZone() FAILED : %s ", + u_errorName(ec)); + } + free(str); +} + +static char *_get_locale(void) +{ + char locale_tmp[32] = { 0, }; + char *locale = NULL; //vconf_get_str(VCONFKEY_REGIONFORMAT); + int ret = 0; + +#ifdef HAVE_X + ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, &locale); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to ignore key(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY) : %d", ret); +#endif + + if (locale == NULL) { + ERR("vconf_get_str() failed : region format"); + return strdup("en_GB"); + } + + strncpy(locale_tmp, locale, sizeof(locale_tmp) - 1); + + // remove .UTF-8 + if (strlen(locale_tmp) > 0) { + char *p = strstr(locale_tmp, ".UTF-8"); + if (p) { + *p = 0; + } + } + + free(locale); + + if (strlen(locale_tmp) > 0) { + return strdup(locale_tmp); + } + + return strdup("en_GB"); +} + +/*static char *_get_locale_for_date(void) +{ + char *locale = vconf_get_str(VCONFKEY_REGIONFORMAT); + if (locale == NULL) { + ERR("vconf_get_str() failed : region format"); + return strdup("en_GB.UTF8"); + } + + if (strlen(locale) > 0) { + return locale; + } + + return strdup("en_GB.UTF8"); +}*/ + +static UDateFormat *_get_formatter_time(void *data, int time_format, const char *timezone) +{ + UErrorCode status = U_ZERO_ERROR; + char buf[BUF_FORMATTER] = {0,}; + char *locale = NULL; + UChar u_pattern[BUF_FORMATTER] = {0,}; + UChar u_timezone[BUF_FORMATTER] = {0,}; + UDateFormat *formatter = NULL; + struct appdata *ad = data; + retif_nomsg(ad == NULL, NULL); + + UDateTimePatternGenerator *generator = NULL; + UChar u_best_pattern[BUF_FORMATTER] = {0,}; + int32_t u_best_pattern_capacity; + +#ifdef HAVE___SECURE_GETENV + uloc_setDefault(__secure_getenv("LC_TIME"), &status); +#elif defined HAVE_SECURE_GETENV + uloc_setDefault(secure_getenv("LC_TIME"), &status); +#else + uloc_setDefault(getenv("LC_TIME"), &status); +#endif + if (U_FAILURE(status)) { + ERR("uloc_setDefault() is failed."); + return NULL; + } + + if (time_format == APPCORE_TIME_FORMAT_24) { + snprintf(buf, sizeof(buf)-1, "%s", "HH:mm"); + } else { + /* set time format 12 */ + snprintf(buf, sizeof(buf)-1, "%s", "h:mm"); + } + if (u_uastrncpy(u_pattern, buf, sizeof(u_pattern)) == NULL) { + ERR("u_uastrncpy() is failed."); + return NULL; + } + + locale = _get_locale(); + + if (time_format == APPCORE_TIME_FORMAT_12) { + generator = udatpg_open(locale, &status); + if (U_FAILURE(status)) { + ERR("udatpg_open() failed"); + generator = NULL; + if (locale) { + free(locale); + locale = NULL; + } + return NULL; + } + + u_best_pattern_capacity = + (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0])); + + udatpg_getBestPattern(generator, u_pattern, u_strlen(u_pattern), + u_best_pattern, u_best_pattern_capacity, &status); + if (U_FAILURE(status)) { + ERR("udatpg_getBestPattern() failed"); + if (locale) { + free(locale); + locale = NULL; + } + } + + /* remove am/pm of best pattern */ + char a_best_pattern[BUF_FORMATTER] = {0.}; + u_austrcpy(a_best_pattern, u_best_pattern); + char *a_best_pattern_fixed = strtok(a_best_pattern, "a"); + a_best_pattern_fixed = strtok(a_best_pattern_fixed, " "); + if (a_best_pattern_fixed) { + u_uastrcpy(u_best_pattern, a_best_pattern_fixed); + } + u_strncpy(u_pattern, u_best_pattern, sizeof(u_pattern)); + } + + if (timezone) { + u_uastrncpy(u_timezone, timezone, sizeof(u_timezone)); + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, u_timezone, -1, + u_pattern, -1, &status); + } else { + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, + u_pattern, -1, &status); + } + if (U_FAILURE(status)) { + ERR("udat_open() is failed."); + if (locale) { + free(locale); + locale = NULL; + } + return NULL; + } + + if (locale) { + free(locale); + locale = NULL; + } + + if (generator) { + udat_close(generator); + generator = NULL; + } + + if (formatter) { + return formatter; + } else { + return NULL; + } +} + +static UDateFormat *_get_formatter_ampm(void *data, const char *timezone) +{ + UErrorCode status = U_ZERO_ERROR; + + char a_best_pattern[BUF_FORMATTER] = {0.}; + char *locale = NULL; + + UChar u_timezone[BUF_FORMATTER] = {0,}; + UChar u_skeleton[BUF_FORMATTER] = {0,}; + int skeleton_len = 0; + + UDateFormat *formatter = NULL; + UDateTimePatternGenerator *generator = NULL; + + UChar u_best_pattern[BUF_FORMATTER] = {0,}; + int32_t u_best_pattern_capacity; + + struct appdata *ad = data; + retif_nomsg(ad == NULL, NULL); + +#ifdef HAVE___SECURE_GETENV + uloc_setDefault(__secure_getenv("LC_TIME"), &status); +#elif defined HAVE_SECURE_GETENV + uloc_setDefault(secure_getenv("LC_TIME"), &status); +#else + uloc_setDefault(getenv("LC_TIME"), &status); +#endif + if (U_FAILURE(status)) { + ERR("uloc_setDefault() is failed."); + return NULL; + } + + locale = _get_locale(); + + u_uastrncpy(u_skeleton, "hhmm", strlen("hhmm")); + skeleton_len = u_strlen(u_skeleton); + + generator = udatpg_open(locale, &status); + if (U_FAILURE(status)) { + ERR("udatpg_open() failed"); + generator = NULL; + if (locale) { + free(locale); + locale = NULL; + } + return NULL; + } + + u_best_pattern_capacity = + (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0])); + + udatpg_getBestPattern(generator, u_skeleton, skeleton_len, + u_best_pattern, u_best_pattern_capacity, &status); + if (U_FAILURE(status)) { + ERR("udatpg_getBestPattern() failed"); + if (locale) { + free(locale); + locale = NULL; + } + } + + u_austrcpy(a_best_pattern, u_best_pattern); + u_uastrcpy(u_best_pattern, "a"); + + if (a_best_pattern[0] == 'a') { + s_info.is_pre_meridiem = EINA_TRUE; + } else { + s_info.is_pre_meridiem = EINA_FALSE; + } + + if (timezone != NULL) { + u_uastrncpy(u_timezone, timezone, sizeof(u_timezone)); + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, u_timezone, -1, + u_best_pattern, -1, &status); + } else { + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, + u_best_pattern, -1, &status); + } + + if (U_FAILURE(status)) { + ERR("udat_open() failed"); + if (locale) { + free(locale); + locale = NULL; + } + return NULL; + } + + if (locale) { + free(locale); + locale = NULL; + } + + if (generator) { + udat_close(generator); + generator = NULL; + } + + return formatter; +} + +//static int _get_formatter_date(void *data, const char *timezone, Eina_Bool is_info, const char *skeleton) +static UDateFormat *_get_formatter_date(void *data, const char *timezone, Eina_Bool is_info, const char *skeleton) +{ + UErrorCode status = U_ZERO_ERROR; + UChar u_timezone[BUF_FORMATTER] = {0,}; + UChar u_skeleton[BUF_FORMATTER] = {0,}; + int skeleton_len = 0; + char *locale = NULL; + + UDateFormat *formatter = NULL; + UDateTimePatternGenerator *generator = NULL; + + UChar u_best_pattern[BUF_FORMATTER] = {0,}; + int32_t u_best_pattern_capacity; + + struct appdata *ad = data; + retif_nomsg(ad == NULL, NULL); + +#ifdef HAVE___SECURE_GETENV + uloc_setDefault(__secure_getenv("LC_TIME"), &status); +#elif defined HAVE_SECURE_GETENV + uloc_setDefault(secure_getenv("LC_TIME"), &status); +#else + uloc_setDefault(getenv("LC_TIME"), &status); +#endif + if (U_FAILURE(status)) { + ERR("uloc_setDefault() is failed."); + return NULL; + } + + locale = _get_locale(); + if (locale == NULL) { + ERR("vconf_get_str() failed : region format"); + locale = strdup("en_GB.UTF-8"); + } + + u_uastrncpy(u_skeleton, skeleton, strlen(skeleton)); + skeleton_len = u_strlen(u_skeleton); + + generator = udatpg_open(locale, &status); + if (U_FAILURE(status)) { + ERR("udatpg_open() failed"); + generator = NULL; + if (locale) { + free(locale); + locale = NULL; + } + return NULL; + } + + u_best_pattern_capacity = + (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0])); + + (void)udatpg_getBestPattern(generator, u_skeleton, skeleton_len, + u_best_pattern, u_best_pattern_capacity, &status); + if (U_FAILURE(status)) { + ERR("udatpg_getBestPattern() failed"); + if (locale) { + free(locale); + locale = NULL; + } + } + + if (timezone) { + u_uastrncpy(u_timezone, timezone, sizeof(u_timezone)); + formatter = udat_open(UDAT_IGNORE, UDAT_DEFAULT, locale, u_timezone, -1, + u_best_pattern, u_strlen(u_best_pattern), &status); + } else { + formatter = udat_open(UDAT_IGNORE, UDAT_DEFAULT, locale, NULL, -1, + u_best_pattern, u_strlen(u_best_pattern), &status); + } + if (U_FAILURE(status)) { + ERR("udat_open() is failed."); + if (locale) { + free(locale); + locale = NULL; + } + return NULL; + } + + if (locale) { + free(locale); + locale = NULL; + } + + if (generator) { + udat_close(generator); + generator = NULL; + } + + return formatter; +} + +static inline char *_extend_heap(char *buffer, int *sz, int incsz) +{ + char *tmp; + + *sz += incsz; + tmp = realloc(buffer, *sz); + if (!tmp) { + ERR("Heap"); + return NULL; + } + + return tmp; +} + +static char *_string_replacer(char *src, const char *pattern, const char *replace) +{ + char *ptr; + char *tmp = NULL; + char *ret = NULL; + int idx = 0; + int out_idx = 0; + int out_sz = 0; + enum { + STATE_START, + STATE_FIND, + STATE_CHECK, + STATE_END, + } state; + + if (!src || !pattern) { + return NULL; + } + + out_sz = strlen(src); + ret = strdup(src); + if (!ret) { + ERR("Heap"); + return NULL; + } + + out_idx = 0; + for (state = STATE_START, ptr = src; state != STATE_END; ptr++) { + switch (state) { + case STATE_START: + if (*ptr == '\0') { + state = STATE_END; + } else if (!isblank(*ptr)) { + state = STATE_FIND; + ptr--; + } + break; + case STATE_FIND: + if (*ptr == '\0') { + state = STATE_END; + } else if (*ptr == *pattern) { + state = STATE_CHECK; + ptr--; + idx = 0; + } else if (*ptr == '-') { + state = STATE_CHECK; + *ptr = *pattern; + ptr--; + idx = 0; + } else { + ret[out_idx] = *ptr; + out_idx++; + if (out_idx == out_sz) { + tmp = _extend_heap(ret, &out_sz, strlen(replace) + 1); + if (!tmp) { + free(ret); + return NULL; + } + ret = tmp; + } + } + break; + case STATE_CHECK: + if (!pattern[idx]) { + /*! + * If there is no space for copying the replacement, + * Extend size of the return buffer. + */ + if (out_sz - out_idx < strlen(replace) + 1) { + tmp = _extend_heap(ret, &out_sz, strlen(replace) + 1); + if (!tmp) { + free(ret); + return NULL; + } + ret = tmp; + } + + strcpy(ret + out_idx, replace); + out_idx += strlen(replace); + + state = STATE_FIND; + ptr--; + } else if (*ptr != pattern[idx]) { + ptr -= idx; + + /* Copy the first matched character */ + ret[out_idx] = *ptr; + out_idx++; + if (out_idx == out_sz) { + tmp = _extend_heap(ret, &out_sz, strlen(replace) + 1); + if (!tmp) { + free(ret); + return NULL; + } + + ret = tmp; + } + + state = STATE_FIND; + } else { + idx++; + } + break; + default: + break; + } + } + + ret[out_idx] = '\0'; + return ret; +} + +static int _get_formatted_time_from_utc_time(time_t intime, char *buf, int buf_len, const char *timezone, int time_format, void *data) +{ + struct appdata *ad = data; + retif_nomsg(ad == NULL, -1); + + UDate u_time = (UDate)intime * 1000; + UChar u_formatted_str[BUF_FORMATTER] = {0,}; + int32_t u_formatted_str_capacity; + + UErrorCode status = U_ZERO_ERROR; + + UDateFormat *formatter = _get_formatter_time(ad, time_format, timezone); + if (formatter == NULL) { + ERR("_get_formatter_time() failed"); + return -1; + } + + /* calculate formatted string capacity */ + u_formatted_str_capacity = + (int32_t)(sizeof(u_formatted_str) / sizeof((u_formatted_str)[0])); + + /* fomatting date using formatter */ + (void)udat_format(formatter, u_time, u_formatted_str, u_formatted_str_capacity, + NULL, &status); + if (U_FAILURE(status)) { + ERR("udat_format() failed"); + if (formatter) { + udat_close(formatter); + formatter = NULL; + } + return -1; + } + + buf = u_austrncpy(buf, u_formatted_str, buf_len); + DBG("time : %s %d", buf, intime); + if (formatter) { + udat_close(formatter); + formatter = NULL; + } + return 0; +} + +static int _get_formatted_ampm_from_utc_time(time_t intime, char *buf, int buf_len, int *ampm_len, const char *timezone, void *data) +{ + struct appdata *ad = data; + retif_nomsg(ad == NULL, -1); + + UDate u_time = (UDate)intime * 1000; + UChar u_formatted_str[BUF_FORMATTER] = {0,}; + int32_t u_formatted_str_capacity; + + UErrorCode status = U_ZERO_ERROR; + + UDateFormat *formatter = _get_formatter_ampm(ad, timezone); + + if (formatter == NULL){ + ERR("_get_formatter_ampm() failed"); + return -1; + } + + u_formatted_str_capacity = + (int32_t)(sizeof(u_formatted_str) / sizeof((u_formatted_str)[0])); + + (void)udat_format(formatter, u_time, u_formatted_str, u_formatted_str_capacity, + NULL, &status); + + if (U_FAILURE(status)) { + ERR("udat_format() failed"); + if (formatter) { + udat_close(formatter); + formatter = NULL; + } + return -1; + } + + (*ampm_len) = u_strlen(u_formatted_str); + + buf = u_austrncpy(buf, u_formatted_str, buf_len); + DBG("ampm : %s %d", buf, intime); + if (formatter) { + udat_close(formatter); + formatter = NULL; + } + return 0; +} + +static int _get_formatted_date_from_utc_time(time_t intime, char *buf, int buf_len, const char *timezone, void *data, const char *format) +{ + struct appdata *ad = data; + retif_nomsg(ad == NULL, -1); + + UDate u_time = (UDate)intime *1000; + UChar u_formatted_str[BUF_FORMATTER] = {0,}; + int32_t u_formatted_str_capacity; + UErrorCode status = U_ZERO_ERROR; + + UDateFormat *formatter = NULL; + + if (format) { + formatter = _get_formatter_date(ad, timezone, EINA_TRUE, format); + } else { + formatter = _get_formatter_date(ad, timezone, EINA_TRUE, "MMMEd"); + } + if (formatter == NULL) { + ERR("_get_formatter_time() failed"); + return -1; + } + + u_formatted_str_capacity = + (int32_t)(sizeof(u_formatted_str) / sizeof((u_formatted_str)[0])); + + (void)udat_format(formatter, u_time, u_formatted_str, u_formatted_str_capacity, + NULL, &status); + if (U_FAILURE(status)) { + ERR("udat_format() failed"); + if (formatter) { + udat_close(formatter); + formatter = NULL; + } + return -1; + } + + buf = u_austrncpy(buf, u_formatted_str, buf_len); + DBG("time : %s %d", buf, intime); + if (formatter) { + udat_close(formatter); + formatter = NULL; + } + return 0; +} + +static int _get_simple_formatted_date_from_utc_time(time_t intime, char *buf, int buf_len, const char *timezone, void *data) +{ + struct appdata *ad = data; + retif_nomsg(ad == NULL, -1); + + time_t today; + struct tm loc_time; + + today = time(NULL); + localtime_r(&today, &loc_time); + + loc_time.tm_sec = 0; + loc_time.tm_min = 0; + loc_time.tm_hour = 0; + today = mktime(&loc_time); + + localtime_r(&intime, &loc_time); + + char time_buf[BUF_FORMATTER] = {0, }; + int time_buf_len = sizeof(time_buf); + char ampm_buf[BUF_FORMATTER] = {0, }; + int ampm_buf_len = sizeof(ampm_buf); + int ampm_dst_len = 0; + int r = 0; + enum appcore_time_format timeformat = APPCORE_TIME_FORMAT_UNKNOWN; + + if (intime < today) { + /* show only simple date */ + _get_formatted_date_from_utc_time(intime, buf, buf_len, timezone, ad, UDAT_ABBR_MONTH_DAY); + } else { + + /* ampm format */ + if (s_info.timeformat == APPCORE_TIME_FORMAT_UNKNOWN) { + r = appcore_get_timeformat(&timeformat); + if (r == 0) { + s_info.timeformat = timeformat; + } else { + s_info.timeformat = APPCORE_TIME_FORMAT_UNKNOWN; + } + } + + /* show time */ + if (s_info.timeformat == APPCORE_TIME_FORMAT_24) { + _get_formatted_time_from_utc_time(intime, buf, buf_len, timezone, APPCORE_TIME_FORMAT_24, ad); + } else { + _get_formatted_time_from_utc_time(intime, time_buf, time_buf_len, timezone, APPCORE_TIME_FORMAT_12, ad); + _get_formatted_ampm_from_utc_time(intime, ampm_buf, ampm_buf_len, &m_dst_len, timezone, ad); + if (ampm_dst_len > 4) { + if (loc_time.tm_hour > 12) { + snprintf(ampm_buf, sizeof(ampm_buf)-1, "%s", "PM"); + } else { + snprintf(ampm_buf, sizeof(ampm_buf)-1, "%s", "AM"); + } + } + if (strlen(ampm_buf) + strlen(time_buf) < buf_len - 1) { + if (s_info.is_pre_meridiem) { + snprintf(buf, buf_len-1, "%s %s", ampm_buf, time_buf); + } else { + snprintf(buf, buf_len-1, "%s %s", time_buf, ampm_buf); + } + } else { + snprintf(buf, buf_len-1, "%s", time_buf); + } + } + } + DBG("%s %d", buf, intime); + return 0; +} + +static UDateTimePatternGenerator *__util_time_generator_get(void *data) +{ + UErrorCode status = U_ZERO_ERROR; + UDateTimePatternGenerator *generator = NULL; + + struct appdata *ad = data; + retif_nomsg(ad == NULL, NULL); + retif_nomsg(s_info.timeregion_format == NULL, NULL); + + generator = udatpg_open(s_info.timeregion_format, &status); + if (U_FAILURE(status)) { + ERR("udatpg_open() failed"); + generator = NULL; + return NULL; + } + return generator; +} + +static UDateTimePatternGenerator *__util_date_generator_get(void *data) +{ + UErrorCode status = U_ZERO_ERROR; + UDateTimePatternGenerator *generator = NULL; + + struct appdata *ad = data; + retif_nomsg(ad == NULL, NULL); + retif_nomsg(s_info.dateregion_format == NULL, NULL); + + generator = udatpg_open(s_info.dateregion_format, &status); + if (U_FAILURE(status)) { + ERR("udatpg_open() failed"); + generator = NULL; + return NULL; + } + return generator; +} + +static UDateFormat *__util_time_date_formatter_get(void *data, const char *timezone_id, const char *skeleton) +{ + UErrorCode status = U_ZERO_ERROR; + + UChar u_skeleton[BUF_FORMATTER] = {0,}; + int skeleton_len = 0; + + UChar u_best_pattern[BUF_FORMATTER] = {0,}; + int32_t u_best_pattern_capacity; + UDateFormat *formatter = NULL; + + struct appdata *ad = data; + retif_nomsg(ad == NULL, NULL); + retif_nomsg(s_info.date_generator == NULL, NULL); + + u_uastrncpy(u_skeleton, skeleton, strlen(skeleton)); + skeleton_len = u_strlen(u_skeleton); + + u_best_pattern_capacity = + (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0])); + + udatpg_getBestPattern(s_info.date_generator, u_skeleton, skeleton_len, + u_best_pattern, u_best_pattern_capacity, &status); + if (U_FAILURE(status)) { + ERR("udatpg_getBestPattern() failed"); + return NULL; + } + + UChar u_timezone_id[BUF_FORMATTER] = {0,}; + if (timezone_id == NULL) { + u_uastrncpy(u_timezone_id, s_info.timezone_id, sizeof(u_timezone_id)); + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, s_info.dateregion_format, u_timezone_id, -1, + u_best_pattern, -1, &status); + } else { + u_uastrncpy(u_timezone_id, timezone_id, sizeof(u_timezone_id)); + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, s_info.dateregion_format, u_timezone_id, -1, + u_best_pattern, -1, &status); + } + if (U_FAILURE(status)) { + ERR("udat_open() failed"); + return NULL; + } + + char a_best_pattern[BUF_FORMATTER] = {0,}; + u_austrcpy(a_best_pattern, u_best_pattern); + + return formatter; +} + +static UDateFormat *__util_time_ampm_formatter_get(void *data, const char *timezone_id) +{ + UErrorCode status = U_ZERO_ERROR; + + UChar u_best_pattern[BUF_FORMATTER] = {0,}; + UDateFormat *formatter = NULL; + + struct appdata *ad = data; + retif_nomsg(ad == NULL, NULL); + + u_uastrcpy(u_best_pattern, "a"); + + UChar u_timezone_id[BUF_FORMATTER] = {0,}; + if (timezone_id == NULL) { + u_uastrncpy(u_timezone_id, s_info.timezone_id, sizeof(u_timezone_id)); + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, s_info.timeregion_format, u_timezone_id, -1, + u_best_pattern, -1, &status); + } else { + u_uastrncpy(u_timezone_id, timezone_id, sizeof(u_timezone_id)); + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, s_info.timeregion_format, u_timezone_id, -1, + u_best_pattern, -1, &status); + } + if (U_FAILURE(status)) { + ERR("udat_open() failed"); + return NULL; + } + + char a_best_pattern[BUF_FORMATTER] = {0,}; + u_austrcpy(a_best_pattern, u_best_pattern); + + return formatter; +} + +static UDateFormat *__util_time_time_formatter_get(void *data, int time_format, const char *timezone_id) +{ + char buf[BUF_FORMATTER] = {0,}; + UErrorCode status = U_ZERO_ERROR; + UChar u_pattern[BUF_FORMATTER] = {0,}; + UChar u_best_pattern[BUF_FORMATTER] = {0,}; + int32_t u_best_pattern_capacity; + char a_best_pattern[BUF_FORMATTER] = {0,}; + + UDateFormat *formatter = NULL; + + struct appdata *ad = data; + retif_nomsg(ad == NULL, NULL); + retif_nomsg(s_info.generator == NULL, NULL); + + if (time_format == APPCORE_TIME_FORMAT_24) { + snprintf(buf, sizeof(buf)-1, "%s", "HH:mm"); + } else { + /* set time format 12 */ + snprintf(buf, sizeof(buf)-1, "%s", "h:mm"); + } + + if (u_uastrncpy(u_pattern, buf, sizeof(u_pattern)) == NULL) { + ERR("u_uastrncpy() is failed."); + return NULL; + } + + u_best_pattern_capacity = + (int32_t) (sizeof(u_best_pattern) / sizeof((u_best_pattern)[0])); + + udatpg_getBestPattern(s_info.generator, u_pattern, u_strlen(u_pattern), + u_best_pattern, u_best_pattern_capacity, &status); + if (U_FAILURE(status)) { + ERR("udatpg_getBestPattern() failed"); + return NULL; + } + + u_austrcpy(a_best_pattern, u_best_pattern); + + if (a_best_pattern[0] == 'a') { + s_info.is_pre_meridiem = EINA_TRUE; + } else { + s_info.is_pre_meridiem = EINA_FALSE; + } + + char *a_best_pattern_fixed = strtok(a_best_pattern, "a"); + a_best_pattern_fixed = strtok(a_best_pattern_fixed, " "); + if (a_best_pattern_fixed) { + u_uastrcpy(u_best_pattern, a_best_pattern_fixed); + } + + UChar u_timezone_id[BUF_FORMATTER] = {0,}; + if (timezone_id == NULL) { + u_uastrncpy(u_timezone_id, s_info.timezone_id, sizeof(u_timezone_id)); + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, s_info.timeregion_format, u_timezone_id, -1, + u_best_pattern, -1, &status); + } else { + u_uastrncpy(u_timezone_id, timezone_id, sizeof(u_timezone_id)); + formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, s_info.timeregion_format, u_timezone_id, -1, + u_best_pattern, -1, &status); + } + if (U_FAILURE(status)) { + ERR("udat_open() failed"); + return NULL; + } + + return formatter; +} + +static void _util_time_formatters_create(void *data) +{ + struct appdata *ad = data; + retif_nomsg(ad == NULL, ); + + if (s_info.generator == NULL) { + s_info.generator = __util_time_generator_get(ad); + } + + if (s_info.date_generator == NULL) { + s_info.date_generator = __util_date_generator_get(ad); + } + + if (s_info.formatter_date == NULL) { + s_info.formatter_date = __util_time_date_formatter_get(ad, NULL, "MMMMEd"); + } + + if (s_info.timeformat == APPCORE_TIME_FORMAT_12) { + if (s_info.formatter_ampm == NULL) { + s_info.formatter_ampm = __util_time_ampm_formatter_get(ad, NULL); + } + } + + if (s_info.formatter_time == NULL) { + s_info.formatter_time = __util_time_time_formatter_get(ad, s_info.timeformat, NULL); + } +} + +static void _util_time_formatters_destroy(void *data) +{ + struct appdata *ad = data; + retif_nomsg(ad == NULL, ); + + if (s_info.date_generator) { + udat_close(s_info.date_generator); + s_info.date_generator = NULL; + } + + if (s_info.generator) { + udat_close(s_info.generator); + s_info.generator = NULL; + } + + if (s_info.formatter_date) { + udat_close(s_info.formatter_date); + s_info.formatter_date = NULL; + } + if (s_info.formatter_time) { + udat_close(s_info.formatter_time); + s_info.formatter_time = NULL; + } + if (s_info.formatter_ampm) { + udat_close(s_info.formatter_ampm); + s_info.formatter_ampm = NULL; + } +} + +static char *_util_time_regionformat_get(void) +{ + return _get_locale(); +} + +static char *_util_date_regionformat_get(void) +{ + return _get_locale(); +} + +static char* _get_timezone_from_vconf(void) +{ + char *szTimezone = NULL; + szTimezone = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID); + if (szTimezone == NULL || strlen(szTimezone) == 0) + { + ERR("QUICKPANEL TIMEZONE - Cannot get time zone."); + return strdup("N/A"); + } + + return szTimezone; +} + +static char *_util_time_timezone_id_get(void) +{ + char buf[1024] = {0,}; + ssize_t len = readlink("/opt/etc/localtime", buf, sizeof(buf)-1); + + INFO("QUICKPANEL TIMEZONE - %s", buf); + + if (len != -1) { + buf[len] = '\0'; + } else { + ERR("QUICKPANEL TIMEZONE - failed to get a timezone information"); + return _get_timezone_from_vconf(); + } + + return strdup(buf + 20); +} + + +static int _util_time_formatted_time_get(UDateFormat *formatter, time_t tt, char *buf, int buf_len) +{ + i18n_udate u_time = (i18n_udate)(tt) * 1000; + i18n_uchar u_formatted_str[BUF_FORMATTER] = {0, }; + int32_t u_formatted_str_capacity; + int32_t formatted_str_len = -1; + int status = I18N_ERROR_INVALID_PARAMETER; + + u_formatted_str_capacity = + (int32_t)(sizeof(u_formatted_str) / sizeof((u_formatted_str)[0])); + + status = i18n_udate_format_date(formatter, u_time, u_formatted_str, u_formatted_str_capacity, NULL, &formatted_str_len); + if (status != I18N_ERROR_NONE) { + ERR("i18n_udate_format_date() failed"); + return -1; + } + + if (formatted_str_len <= 0) { + ERR("formatted_str_len is less than 0"); + } + + buf = i18n_ustring_copy_au_n(buf, u_formatted_str, (int32_t)buf_len); + DBG("date:(%d)[%s][%d]", formatted_str_len, buf, tt); + + return (int)u_strlen(u_formatted_str); +} + + +static void _formatter_create(void *data) +{ + int ret = 0; + struct appdata *ad = data; + retif_nomsg(ad == NULL, ); + bool status = false; + +#ifdef HAVE_X + ret = system_settings_get_value_bool(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, &status); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to ignore key(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR) : %d", ret); +#endif + + if (status == true){ + s_info.timeformat = APPCORE_TIME_FORMAT_24; + }else{ + s_info.timeformat = APPCORE_TIME_FORMAT_12; + } + + if (s_info.timeregion_format == NULL) { + s_info.timeregion_format = _util_time_regionformat_get(); + } + + if (s_info.dateregion_format == NULL) { + s_info.dateregion_format = _util_date_regionformat_get(); + } + + if (s_info.timezone_id == NULL) { + s_info.timezone_id = _util_time_timezone_id_get(); + } + + ICU_set_timezone(s_info.timezone_id); + + _util_time_formatters_create(ad); + + s_info.is_initialized = 1; + DBG("%d %s %s", s_info.timeformat, s_info.timeregion_format, s_info.timezone_id); +} + +static void _formatter_destory(void *data) +{ + struct appdata *ad = data; + retif_nomsg(ad == NULL, ); + + if (s_info.timeregion_format) { + free(s_info.timeregion_format); + s_info.timeregion_format = NULL; + } + if (s_info.dateregion_format) { + free(s_info.dateregion_format); + s_info.dateregion_format = NULL; + } + if (s_info.timezone_id) { + free(s_info.timezone_id); + s_info.timezone_id = NULL; + } + + _util_time_formatters_destroy(ad); + + s_info.is_initialized = 0; +} + +static void _util_time_vconf_changed_cb(keynode_t *key, void *data) +{ + struct appdata *ad = data; + + _formatter_destory(ad); + _formatter_create(ad); + + _util_time_heartbeat_do(); + + //upate noti time information. + quickpanel_noti_update_by_system_time_changed_cb(key,ad); +} + +static void _time_event_deattach(void *data) +{ + int ret = 0; + struct appdata *ad = data; + retif_nomsg(ad == NULL, ); + + /* unregister vconf cbs */ + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_TIMEZONE_INT, _util_time_vconf_changed_cb); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_SETAPPL_TIMEZONE_INT, ret); + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_TIMEZONE_ID, _util_time_vconf_changed_cb); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_SETAPPL_TIMEZONE_ID, ret); + ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SVC_ROAM, _util_time_vconf_changed_cb); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_TELEPHONY_SVC_ROAM, ret); +#ifdef HAVE_X + ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_TIME_CHANGED); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to set key(%d) : %d", SYSTEM_SETTINGS_KEY_TIME_CHANGED, ret); + ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to set key(%d) : %d", SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, ret); + ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to set key(%d) : %d", SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, ret); +#endif +} + +static void _time_event_attach(void *data) +{ + int ret = 0; + struct appdata *ad = data; + retif_nomsg(ad == NULL, ); + + /* register vconf cbs */ + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_TIMEZONE_INT, _util_time_vconf_changed_cb, data); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_SETAPPL_TIMEZONE_INT, ret); + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_TIMEZONE_ID, _util_time_vconf_changed_cb, data); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_SETAPPL_TIMEZONE_ID, ret); + ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SVC_ROAM, _util_time_vconf_changed_cb, data); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_TELEPHONY_SVC_ROAM, ret); +#ifdef HAVE_X + ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_TIME_CHANGED, _util_time_vconf_changed_cb, data); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to set key(%d) : %d", SYSTEM_SETTINGS_KEY_TIME_CHANGED, ret); + ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, _util_time_vconf_changed_cb, data); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to set key(%d) : %d", SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, ret); + ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, _util_time_vconf_changed_cb, data); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to set key(%d) : %d", SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, ret); +#endif +} + +static void _util_time_get(int is_current_time, time_t tt_a, char **str_date, char **str_time, char **str_meridiem) +{ + time_t tt; + struct tm st; + char buf_date[512] = {0,}; + char buf_time[512] = {0,}; + char buf_ampm[512] = {0,}; + + char *convert_formatted_str = NULL; + + if (is_current_time == 1) { + tt = time(NULL); + } else { + tt = tt_a; + } + localtime_r(&tt, &st); + + /* date */ + _util_time_formatted_time_get(s_info.formatter_date, tt, buf_date, sizeof(buf_date)); + + /* time */ + if (s_info.timeformat == APPCORE_TIME_FORMAT_24) { + _util_time_formatted_time_get(s_info.formatter_time, tt, buf_time, sizeof(buf_time)-1); + } else { + _util_time_formatted_time_get(s_info.formatter_time, tt, buf_time, sizeof(buf_time)-1); + int ampm_len = _util_time_formatted_time_get(s_info.formatter_ampm, tt, buf_ampm, sizeof(buf_ampm)-1); + if (ampm_len > 4) { + if (st.tm_hour >= 0 && st.tm_hour < 12) { + snprintf(buf_ampm, sizeof(buf_ampm)-1, "AM"); + } else { + snprintf(buf_ampm, sizeof(buf_ampm)-1, "PM"); + } + } + } + + convert_formatted_str = _string_replacer(buf_time, colon, ratio); + + if (str_date != NULL) { + *str_date = strdup(buf_date); + } + + if (str_meridiem != NULL) { + *str_meridiem = strdup(buf_ampm); + } + + if (convert_formatted_str) + { + if (str_time != NULL) { + *str_time = strdup(convert_formatted_str); + } + free(convert_formatted_str); + } +} + +static void _timer_add(void) +{ + time_t tt; + struct tm st; + + tt = time(NULL); + localtime_r(&tt, &st); + + s_info.timer = ecore_timer_add(60 - st.tm_sec, _timer_cb, NULL); +} + +static void _timer_del(void) +{ + if (s_info.timer != NULL) { + ecore_timer_del(s_info.timer); + s_info.timer = NULL; + } +} + +static Eina_Bool _timer_cb(void *data) +{ + _util_time_heartbeat_do(); + + if (s_info.is_timer_enabled ==1) { + _timer_del(); + _timer_add(); + } + return ECORE_CALLBACK_CANCEL; +} + +static int _init(void *data) +{ + _formatter_create(data); + _time_event_attach(data); + + return QP_OK; +} + +static int _fini(void *data) +{ + _time_event_deattach(data); + _formatter_destory(data); + + return QP_OK; +} + +static void _lang_changed(void *data) +{ + _util_time_vconf_changed_cb(NULL, data); +} + +static void _util_time_heartbeat_do(void) +{ + int type_meridiem = UTIL_TIME_MERIDIEM_TYPE_NONE; + char *str_date = NULL; + char *str_time = NULL; + char *str_meridiem = NULL; + + if (s_info.is_initialized == 0) { + ERR("time information ins't initialized"); + return; + } + + _util_time_get(1, 0, &str_date, &str_time, &str_meridiem); + + if (str_meridiem != NULL) { + if (s_info.is_pre_meridiem == EINA_TRUE) { + type_meridiem = UTIL_TIME_MERIDIEM_TYPE_PRE; + } else { + type_meridiem = UTIL_TIME_MERIDIEM_TYPE_POST; + } + } + quickpanel_datetime_view_update(str_date, str_time, str_meridiem, type_meridiem); + + if (str_date) { + free(str_date); + } + if (str_time) { + free(str_time); + } + if (str_meridiem) { + free(str_meridiem); + } +} + +HAPI void quickpanel_util_time_timer_enable_set(int is_enable) +{ + _timer_del(); + + if (is_enable == 1) { + _timer_add(); + } + + _util_time_heartbeat_do(); + + s_info.is_timer_enabled = is_enable; +} diff --git a/daemon/datetime/util-time.h b/daemon/datetime/util-time.h new file mode 100644 index 0000000..7b3e7aa --- /dev/null +++ b/daemon/datetime/util-time.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __UTIL_TIME_H__ +#define __UTIL_TIME_H__ + +#define UTIL_TIME_MERIDIEM_TYPE_NONE 0 +#define UTIL_TIME_MERIDIEM_TYPE_PRE 1 +#define UTIL_TIME_MERIDIEM_TYPE_POST 2 + +void quickpanel_util_time_timer_enable_set(int is_enable); + +#endif /* __UTIL_TIME_H__ */ diff --git a/daemon/dbus_utility.c b/daemon/dbus_utility.c new file mode 100644 index 0000000..e23236e --- /dev/null +++ b/daemon/dbus_utility.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <glib.h> +#include "common.h" +#include "quickpanel-ui.h" + +#define QP_DBUS_ACTIVENOTI_NAME QP_DBUS_NAME".activenoti" +#define QP_DBUS_ACTIVENOTI_PATH QP_DBUS_PATH"/activenoti" +#define QP_DBUS_ACTIVENOTI_MEMBER_SHOW "show" +#define QP_DBUS_ACTIVENOTI_MEMBER_HIDE "hide" + +HAPI void quickpanel_dbus_activenoti_visibility_send(int is_visible) +{ + DBusMessage *signal = NULL; + const char *member = NULL; + struct appdata *ad = quickpanel_get_app_data(); + + retif(ad == NULL, , "invalid parameter"); + retif(ad->dbus_connection == NULL, , "failed to get dbus system bus"); + + if (is_visible == 1) { + member = QP_DBUS_ACTIVENOTI_MEMBER_SHOW; + } else { + member = QP_DBUS_ACTIVENOTI_MEMBER_HIDE; + } + signal = + dbus_message_new_signal(QP_DBUS_ACTIVENOTI_PATH + , QP_DBUS_ACTIVENOTI_NAME + , member); + if (signal == NULL) { + ERR("Fail to dbus_message_new_signal"); + return; + } + + DBG("status:%s", member); + + e_dbus_message_send(ad->dbus_connection, + signal, + NULL, + 0, + NULL); + dbus_message_unref(signal); +} diff --git a/daemon/dbus_utility.h b/daemon/dbus_utility.h new file mode 100644 index 0000000..02ffdb6 --- /dev/null +++ b/daemon/dbus_utility.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __QP_DBUS_UTILITY_H__ +#define __QP_DBUS_UTILITY_H__ + +void quickpanel_dbus_activenoti_visibility_send(int is_visible); + +#endif
\ No newline at end of file diff --git a/daemon/device/brightness.c b/daemon/device/brightness.c index 3a63d35..cf14a55 100755 --- a/daemon/device/brightness.c +++ b/daemon/device/brightness.c @@ -1,69 +1,154 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 <glib.h> #include <string.h> #include <vconf.h> -#include <device.h> +#include <device/display.h> +#include <app_control.h> + #include "common.h" #include "quickpanel-ui.h" #include "list_util.h" #include "quickpanel_def.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif +#include "preference.h" +#include "setting_utils.h" +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif +#include "page_setting_all.h" +#include "settings_view_featured.h" #define BRIGHTNESS_MIN 1 #define BRIGHTNESS_MAX 100 - -#define QP_BRIGHTNESS_CONTROL_ICON_IMG ICONDIR"/Q02_Notification_brightness.png" +#define BRIGHTNESS_SIG_ACTIVITY "BRIGHTNESS" +#define PREF_BRIGHTNESS_ON "ON" +#define PREF_BRIGHTNESS_OFF "OFF" typedef struct _brightness_ctrl_obj { int min_level; int max_level; + int is_event_registered; + int last_requested_level; Evas_Object *viewer; void *data; + int level_before; + int pos_x; + + Evas_Object *brighntess_slider; } brightness_ctrl_obj; -static int quickpanel_brightness_init(void *data); -static int quickpanel_brightness_fini(void *data); -static void quickpanel_brightness_lang_changed(void *data); -static void quickpanel_brightness_qp_opened(void *data); -static void quickpanel_brightness_qp_closed(void *data); + +int slider_drag_start = -1; +Eina_Bool is_sliding = EINA_FALSE; + + +static int _init(void *data); +static int _fini(void *data); +static void _lang_changed(void *data); +static void _qp_opened(void *data); +static void _qp_closed(void *data); static void _brightness_view_update(void); static void _brightness_register_event_cb(brightness_ctrl_obj *ctrl_obj); static void _brightness_deregister_event_cb(brightness_ctrl_obj *ctrl_obj); +static void _brightness_set_image(int level); +static void _refresh(void *data); + QP_Module brightness_ctrl = { .name = "brightness_ctrl", - .init = quickpanel_brightness_init, - .fini = quickpanel_brightness_fini, + .init = _init, + .fini = _fini, .suspend = NULL, .resume = NULL, .hib_enter = NULL, .hib_leave = NULL, - .lang_changed = quickpanel_brightness_lang_changed, - .refresh = NULL, + .lang_changed = _lang_changed, + .refresh = _refresh, .get_height = NULL, - .qp_opened = quickpanel_brightness_qp_opened, - .qp_closed = quickpanel_brightness_qp_closed, + .qp_opened = _qp_opened, + .qp_closed = _qp_closed, }; static brightness_ctrl_obj *g_ctrl_obj; +E_DBus_Signal_Handler *g_hdl_brightness; -static void _set_text_to_part(Evas_Object *obj, const char *part, const char *text) { - const char *old_text = NULL; +static Evas_Object *_controller_view_get(void) +{ + Evas_Object *view = NULL; + + if (g_ctrl_obj != NULL) { + if (g_ctrl_obj->viewer != NULL) { + view = elm_object_part_content_get(g_ctrl_obj->viewer, "elm.swallow.controller"); + if (view == NULL) { + view = evas_object_data_get(g_ctrl_obj->viewer, "view.controller"); + } + } + } + + return view; +} + +static void _controller_view_set(Evas_Object *wrapper, Evas_Object *view) +{ + retif(wrapper == NULL, , "invalid data"); + retif(view == NULL, , "invalid data"); + + elm_object_part_content_set(wrapper, "elm.swallow.controller", view); + evas_object_data_set(wrapper, "view.controller", view); +} + +static char *_brightness_access_state_cb(void *data, Evas_Object *obj) +{ + char buf[512] = {0,}; + brightness_ctrl_obj *ctrl_obj = data; + retif(NULL == ctrl_obj, NULL, "invalid data"); + + snprintf(buf, sizeof(buf) - 1, _NOT_LOCALIZED("Position %1$d of %2$d"), + ctrl_obj->last_requested_level, ctrl_obj->max_level); + + return strdup(buf); +} + +#ifdef QP_SCREENREADER_ENABLE +static void _set_slider_accessiblity_state(Evas_Object *obj) +{ + Evas_Object *ao = NULL; + brightness_ctrl_obj *ctrl_obj = g_ctrl_obj; + retif(ctrl_obj == NULL, , "Invalid parameter!"); + retif(ctrl_obj->viewer == NULL, , "Invalid parameter!"); + ao = quickpanel_accessibility_screen_reader_object_get(obj, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, NULL, NULL); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_INFO, _NOT_LOCALIZED("Brightness")); + elm_access_info_set(ao, ELM_ACCESS_TYPE, _NOT_LOCALIZED("Slider")); + elm_access_info_cb_set(ao, ELM_ACCESS_STATE, _brightness_access_state_cb, ctrl_obj); + } +} +#endif + +static void _set_text_to_part(Evas_Object *obj, const char *part, const char *text) +{ + const char *old_text = NULL; retif(obj == NULL, , "Invalid parameter!"); retif(part == NULL, , "Invalid parameter!"); retif(text == NULL, , "Invalid parameter!"); @@ -71,60 +156,29 @@ static void _set_text_to_part(Evas_Object *obj, const char *part, const char *te old_text = elm_object_part_text_get(obj, part); if (old_text != NULL) { if (strcmp(old_text, text) == 0) { - return ; + return; } } elm_object_part_text_set(obj, part, text); } -static Evas_Object *_check_duplicated_image_loading(Evas_Object *obj, const char *part, const char *file_path) { - Evas_Object *old_ic = NULL; - const char *old_ic_path = NULL; - - retif(obj == NULL, NULL, "Invalid parameter!"); - retif(part == NULL, NULL, "Invalid parameter!"); - retif(file_path == NULL, NULL, "Invalid parameter!"); - - old_ic = elm_object_part_content_get(obj, part); - if (old_ic != NULL) { - elm_image_file_get(old_ic, &old_ic_path, NULL); - if (old_ic_path != NULL) { - if (strcmp(old_ic_path, file_path) == 0) - return old_ic; - } - - elm_object_part_content_unset(obj, part); - evas_object_del(old_ic); - } - - return NULL; -} - -static Evas_Object *_check_duplicated_loading(Evas_Object *obj, const char *part) { +static Evas_Object *_check_duplicated_loading(Evas_Object *obj, const char *part) +{ Evas_Object *old_content = NULL; - retif(obj == NULL, NULL, "Invalid parameter!"); retif(part == NULL, NULL, "Invalid parameter!"); old_content = elm_object_part_content_get(obj, part); if (old_content != NULL) { - return old_content; + return old_content; } return NULL; } -static int _brightness_get_automate_level(void) { - int is_on = 0; - - if (vconf_get_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, &is_on) == 0) - return is_on; - else - return SETTING_BRIGHTNESS_AUTOMATIC_OFF; -} - -static void _brightness_vconf_cb(keynode_t *key, void* data) { +static void _brightness_vconf_cb(keynode_t *key, void* data) +{ brightness_ctrl_obj *ctrl_obj = NULL; retif(data == NULL, , "Data parameter is NULL"); @@ -135,56 +189,73 @@ static void _brightness_vconf_cb(keynode_t *key, void* data) { } } -static void quickpanel_brightness_qp_opened(void *data) +static int _brightness_set_level(int level) { - struct appdata *ad = NULL; + int ret = DEVICE_ERROR_NONE; - retif(data == NULL, , "Invalid parameter!"); - ad = data; + ret = device_display_set_brightness(0, level); + if (ret != DEVICE_ERROR_NONE) { + ERR("failed to set brightness"); + } - retif(g_ctrl_obj == NULL, , "Invalid parameter!"); + return level; +} - if (g_ctrl_obj->viewer != NULL) { - _brightness_view_update(); +static int _brightness_get_level(void) { + + int level = 0; + + if (vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &level) == 0) { + return level; + } else { + return SETTING_BRIGHTNESS_LEVEL5; } } -static void quickpanel_brightness_qp_closed(void *data) -{ - struct appdata *ad = NULL; +Evas_Object *_slider_get(Evas_Object *view, brightness_ctrl_obj *ctrl_obj) { - retif(data == NULL, , "Invalid parameter!"); - ad = data; + retif(view == NULL, NULL, "Data parameter is NULL"); - retif(g_ctrl_obj == NULL, , "Invalid parameter!"); + Evas_Object *obj = elm_object_part_content_get(view, "elm.swallow.slider"); - if (g_ctrl_obj->viewer != NULL) { - _brightness_view_update(); + if (obj) { + return obj; + } else { + return ctrl_obj->brighntess_slider; } } -static int _brightness_set_level(int level) { - int ret = DEVICE_ERROR_NONE; - ret = device_set_brightness_to_settings(0, level); - if (ret != DEVICE_ERROR_NONE) { - ERR("failed to set brightness"); - } +static void _slider_changed_job_cb(void *data) +{ + int value = 0; + double val = 0.0; + Evas_Object *obj = NULL; + brightness_ctrl_obj *ctrl_obj = data; + double time_current = 0.0; + static double time_before = 0.0; - return level; -} + retif(ctrl_obj == NULL, , "Data parameter is NULL"); + obj = _slider_get(_controller_view_get(), ctrl_obj); + retif(obj == NULL, , "obj is NULL"); -static int _brightness_get_level(void) { - int level = 0; + val = elm_slider_value_get(obj); + value = (int)(val + 0.5); + + time_current = ecore_loop_time_get(); + + if (value != ctrl_obj->last_requested_level) { + if (value >= ctrl_obj->min_level && value <= ctrl_obj->max_level) { + ctrl_obj->last_requested_level = value; + if (time_current - time_before >= 0.045) { + _brightness_set_level(value); + time_before = time_current; + } + _brightness_set_image(value); + } + } - if (vconf_get_int(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, &level) == 0) - return level; - else - return SETTING_BRIGHTNESS_LEVEL5; -} -static int _brightness_set_automate_level(int is_on) { - return vconf_set_int(VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, is_on); } static void @@ -192,22 +263,57 @@ _brightness_ctrl_slider_changed_cb(void *data, Evas_Object *obj, void *event_info) { + int pos_new = (int)event_info; + LOGI("SLIDER_NEW_POS: %d", pos_new); + + _slider_changed_job_cb(data); +} + + +static void _brightness_ctrl_overheat_check(Evas_Object *slider, void *data, int is_display_popup) +{ int value = 0; - static int old_val = -1; - brightness_ctrl_obj *ctrl_obj = NULL; + int max_brightness = BRIGHTNESS_MAX; + brightness_ctrl_obj *ctrl_obj = data; + retif(slider == NULL, , "slider is NULL"); + retif(ctrl_obj == NULL, , "Data parameter is NULL"); - retif(data == NULL, , "Data parameter is NULL"); - ctrl_obj = data; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); - double val = elm_slider_value_get(obj); - value = (int)(val + 0.5); + value = ctrl_obj->last_requested_level; - if (value != old_val) - { - if (value >= ctrl_obj->min_level && value <= ctrl_obj->max_level) { - DBG("brightness is changed to %d", value); - _brightness_set_level(value); + device_display_get_max_brightness(0, &max_brightness); + if (value > max_brightness && max_brightness != BRIGHTNESS_MAX) { + DBG("max brightness is limited"); + if (is_display_popup == 1) { + if (ad->popup == NULL) { + quickpanel_setting_create_timeout_popup(ad->win, + _("IDS_ST_POP_UNABLE_TO_INCREASE_BRIGHTNESS_FURTHER_BECAUSE_OF_PHONE_OVERHEATING")); + } } + elm_slider_value_set(slider, (double)max_brightness); + ctrl_obj->last_requested_level = max_brightness; + _brightness_set_level(max_brightness); + _brightness_set_image(max_brightness); + return; + } +} + +static void _slider_delayed_changed_job_cb(void *data) +{ + int value = 0; + brightness_ctrl_obj *ctrl_obj = data; + Evas_Object *obj = NULL; + retif(ctrl_obj == NULL, , "Data parameter is NULL"); + obj = _slider_get(_controller_view_get(), ctrl_obj); + retif(obj == NULL, , "obj is NULL"); + + value = ctrl_obj->last_requested_level; + + if (value >= ctrl_obj->min_level && value <= ctrl_obj->max_level) { + _brightness_set_level(value); + _brightness_set_image(value); } } @@ -216,133 +322,136 @@ _brightness_ctrl_slider_delayed_changed_cb(void *data, Evas_Object *obj, void *event_info) { - int value = 0; - - value = _brightness_get_level(); - DBG("brightness is changed to %d", value); - _brightness_set_level(value); + LOGI(""); + ecore_job_add(_slider_delayed_changed_job_cb, data); } static void -_brightness_ctrl_slider_drag_start_cb(void *data, +_brightness_slider_drag_start_cb(void *data, Evas_Object *obj, void *event_info) { - _brightness_deregister_event_cb(data); + is_sliding = EINA_TRUE; + slider_drag_start = _brightness_get_level(); } static void -_brightness_ctrl_slider_drag_stop_cb(void *data, +_brightness_slider_drag_stop_cb(void *data, Evas_Object *obj, void *event_info) { - _brightness_register_event_cb(data); + brightness_ctrl_obj *ctrl_obj = data; + is_sliding = EINA_FALSE; } -static void _brightness_ctrl_checker_toggle_cb(void *data, - Evas_Object * obj, - void *event_info) + +/*! + * workaround to avoid focus jump to other pages + */ +static void _frame_focused(void *data, Evas_Object * obj, void *event_info) { - quickpanel_play_feedback(); + quickpanel_page_setting_all_focus_allow_set(EINA_FALSE); +} - retif(obj == NULL, , "obj parameter is NULL"); +static void _frame_unfocused(void *data, Evas_Object * obj, void *event_info) +{ + quickpanel_page_setting_all_focus_allow_set(EINA_TRUE); +} - int status = elm_check_state_get(obj); - brightness_ctrl_obj *ctrl_obj = NULL; - retif(data == NULL, , "Data parameter is NULL"); - ctrl_obj = data; +static void _brightness_view_pos_set() +{ + struct appdata *ad = quickpanel_get_app_data(); - _brightness_set_automate_level(status); + Evas_Coord base_y; +// Evas_Coord settings_y; + Evas_Coord brightness_y; - if (ctrl_obj->viewer != NULL) { - _brightness_view_update(); - } + Eina_Bool ret = EINA_FALSE; + + edje_object_part_geometry_get(_EDJ(ad->view_root), "qp.root.swallow", NULL, &base_y, NULL, NULL); +// edje_object_part_geometry_get(ad->ly, QP_SETTING_BASE_PART, NULL, &settings_y, NULL, NULL); + + Evas_Object *settings_swallow = quickpanel_setting_layout_get(ad->ly, QP_SETTING_BASE_PART); + ret = edje_object_part_geometry_get(_EDJ(settings_swallow), QP_SETTING_BRIGHTNESS_PART_WVGA, NULL, &brightness_y, NULL, NULL); + msgif(!ret, "ret is EINA_FALSE"); + + evas_object_move(g_ctrl_obj->viewer, 0, base_y + /*settings_y */+ brightness_y); } static Evas_Object *_brightness_view_create(Evas_Object *list) { Eina_Bool ret = EINA_TRUE; + Evas_Object *view_wrapper = NULL; Evas_Object *view = NULL; retif(list == NULL, NULL, "list parameter is NULL"); - view = elm_layout_add(list); - - if (view != NULL) { - ret = elm_layout_file_set(view, DEFAULT_EDJ, - "quickpanel/brightness_controller/default"); - + view_wrapper = elm_layout_add(list); + if (view_wrapper != NULL) { + ret = elm_layout_file_set(view_wrapper, DEFAULT_EDJ, + "quickpanel/brightness_controller/wrapper"); if (ret == EINA_FALSE) { - ERR("failed to load brightness layout"); + ERR("failed to load brightness wapper layout"); + } + evas_object_size_hint_weight_set(view_wrapper, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(view_wrapper, EVAS_HINT_FILL, EVAS_HINT_FILL); + + view = elm_layout_add(view_wrapper); + if (view != NULL) { + ret = elm_layout_file_set(view, DEFAULT_EDJ, + "quickpanel/brightness_controller/default"); + + if (ret == EINA_FALSE) { + ERR("failed to load brightness layout"); + } + evas_object_size_hint_weight_set(view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(view, EVAS_HINT_FILL, EVAS_HINT_FILL); + + Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(view); + elm_access_info_cb_set(focus, ELM_ACCESS_TYPE, quickpanel_accessibility_info_cb_s, _NOT_LOCALIZED("Brightness")); + elm_object_part_content_set(view, "focus", focus); + + evas_object_smart_callback_add(focus, "focused", _frame_focused, NULL); + evas_object_smart_callback_add(focus, "unfocused", _frame_unfocused, NULL); + evas_object_show(view); + _brightness_view_pos_set(); + + g_ctrl_obj->brighntess_slider = view; + _controller_view_set(view_wrapper, view); + evas_object_show(view_wrapper); } - evas_object_size_hint_weight_set(view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(view, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(view); } - return view; + return view_wrapper; } -static void _brightness_set_text(void) -{ - brightness_ctrl_obj *ctrl_obj = g_ctrl_obj; - retif(ctrl_obj == NULL, , "Invalid parameter!"); - retif(ctrl_obj->viewer == NULL, , "Invalid parameter!"); - - _set_text_to_part(ctrl_obj->viewer, "elm.check.text", _("IDS_QP_BODY_AUTO")); - _set_text_to_part(ctrl_obj->viewer, "elm.text.label", _S("IDS_COM_OPT_BRIGHTNESS")); -} - -static void _brightness_set_image(void) -{ - Evas_Object *ic = NULL; - Evas_Object *old_ic = NULL; - brightness_ctrl_obj *ctrl_obj = g_ctrl_obj; - retif(ctrl_obj == NULL, , "Invalid parameter!"); - retif(ctrl_obj->viewer == NULL, , "Invalid parameter!"); - - old_ic = _check_duplicated_image_loading(ctrl_obj->viewer, - "elm.swallow.thumbnail", QP_BRIGHTNESS_CONTROL_ICON_IMG); - - if (old_ic == NULL) { - ic = elm_image_add(ctrl_obj->viewer); - if (ic != NULL) { - elm_image_resizable_set(ic, EINA_FALSE, EINA_FALSE); - elm_image_file_set(ic, QP_BRIGHTNESS_CONTROL_ICON_IMG, "elm.swallow.thumbnail"); - elm_object_part_content_set(ctrl_obj->viewer, "elm.swallow.thumbnail", ic); - } - } -} - -static void _brightness_set_checker(void) +static void _brightness_set_image(int level) { - Evas_Object *checker = NULL; - Evas_Object *old_obj = NULL; + int old_brightness_type = -1; + int mapped_level = 0; + char buf[128] = {0,}; + Evas_Object *view = _controller_view_get(); brightness_ctrl_obj *ctrl_obj = g_ctrl_obj; retif(ctrl_obj == NULL, , "Invalid parameter!"); - retif(ctrl_obj->viewer == NULL, , "Invalid parameter!"); - - old_obj = _check_duplicated_loading(ctrl_obj->viewer, - "elm.check.swallow"); - - if (old_obj == NULL) { - checker = elm_check_add(ctrl_obj->viewer); - - if (checker != NULL) { - elm_object_style_set(checker, "quickpanel"); - evas_object_smart_callback_add(checker,"changed",_brightness_ctrl_checker_toggle_cb , ctrl_obj); - elm_object_part_content_set(ctrl_obj->viewer, "elm.check.swallow", checker); - } else { - ERR("failed to create checker"); - return ; - } + retif(view == NULL, , "Invalid parameter!"); + + if (level <= 1) { + mapped_level = 0; + } else if (level >= 100) { + mapped_level = 11; + } else if (level > 1 && level <= 9){ + mapped_level = 1; } else { - checker = old_obj; + mapped_level = (level / 10); } - elm_check_state_set(checker, _brightness_get_automate_level()); + if (ctrl_obj->level_before != mapped_level ) { + snprintf(buf, sizeof(buf) - 1, "icon.state.%d", mapped_level); + elm_object_signal_emit(view, buf, "prog"); + ctrl_obj->level_before = mapped_level; + } } static void _brightness_set_slider(void) @@ -351,18 +460,16 @@ static void _brightness_set_slider(void) Evas_Object *slider = NULL; Evas_Object *old_obj = NULL; brightness_ctrl_obj *ctrl_obj = g_ctrl_obj; + Evas_Object *view = _controller_view_get(); retif(ctrl_obj == NULL, , "Invalid parameter!"); - retif(ctrl_obj->viewer == NULL, , "Invalid parameter!"); + retif(view == NULL, , "Invalid parameter!"); - old_obj = _check_duplicated_loading(ctrl_obj->viewer, - "elm.swallow.slider"); + old_obj = _check_duplicated_loading(view, "elm.swallow.slider"); if (old_obj == NULL) { - slider = elm_slider_add(ctrl_obj->viewer); + slider = elm_slider_add(view); if (slider != NULL) { - elm_object_style_set(slider, "quickpanel"); - evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, 0.0); evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, 0.5); elm_slider_min_max_set(slider, ctrl_obj->min_level, ctrl_obj->max_level); @@ -370,60 +477,80 @@ static void _brightness_set_slider(void) _brightness_ctrl_slider_changed_cb, ctrl_obj); evas_object_smart_callback_add(slider, "delay,changed", _brightness_ctrl_slider_delayed_changed_cb, ctrl_obj); + evas_object_smart_callback_add(slider, "slider,drag,start", - _brightness_ctrl_slider_drag_start_cb, ctrl_obj); + _brightness_slider_drag_start_cb, ctrl_obj); + + evas_object_smart_callback_add(slider, "slider,drag,stop", - _brightness_ctrl_slider_drag_stop_cb, ctrl_obj); - elm_object_part_content_set(ctrl_obj->viewer, "elm.swallow.slider", slider); + _brightness_slider_drag_stop_cb, ctrl_obj); + + elm_object_part_content_set(view, "elm.swallow.slider", slider); } else { ERR("failed to create slider"); - return ; + return; } } else { slider = old_obj; } - value = _brightness_get_level(); + elm_object_style_set(slider, "quickpanel_style"); + elm_slider_indicator_format_set(slider, NULL); + elm_slider_indicator_format_function_set(slider, NULL, NULL); + elm_slider_indicator_show_set(slider, EINA_FALSE); + +#ifdef QP_SCREENREADER_ENABLE + _set_slider_accessiblity_state(slider); +#endif + + value = _brightness_get_level(); elm_slider_value_set(slider, value); + _brightness_set_image(value); +} - if (_brightness_get_automate_level()) { - elm_object_disabled_set(slider, EINA_TRUE); - } else { - elm_object_disabled_set(slider, EINA_FALSE); +static void _focus_pair_set() +{ + brightness_ctrl_obj *ctrl_obj = g_ctrl_obj; + Evas_Object *focus = NULL; + Evas_Object *slider = NULL; + Evas_Object *view = _controller_view_get(); + retif(ctrl_obj == NULL, , "Invalid parameter!"); + retif(view == NULL, , "Invalid parameter!"); + + focus = elm_object_part_content_get(view, "focus"); + slider = elm_object_part_content_get(view, "elm.swallow.slider"); + + if (focus != NULL && slider != NULL) { + /* focus */ + elm_object_focus_next_object_set(focus, slider, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(focus, slider, ELM_FOCUS_DOWN); + + /* slider */ + elm_object_focus_next_object_set(slider, focus, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(slider, focus, ELM_FOCUS_UP); } } static void _brightness_view_update(void) { - _brightness_set_text(); - _brightness_set_image(); - _brightness_set_checker(); _brightness_set_slider(); + _focus_pair_set(); } static void _brightness_add(brightness_ctrl_obj *ctrl_obj, void *data) { - qp_item_data *qid = NULL; - struct appdata *ad; - - ad = data; + struct appdata *ad = data; + retif(!ad, , "list is NULL"); retif(!ad->list, , "list is NULL"); + retif(ctrl_obj == NULL, , "ctrl_obj is null"); + retif(ctrl_obj->viewer != NULL, , "viewer is already created"); ctrl_obj->viewer = _brightness_view_create(ad->list); ctrl_obj->data = data; - if (ctrl_obj->viewer != NULL) { - qid = quickpanel_list_util_item_new(QP_ITEM_TYPE_BRIGHTNESS, ctrl_obj); - if (qid != NULL) { - quickpanel_list_util_item_set_tag(ctrl_obj->viewer, qid); - quickpanel_list_util_sort_insert(ad->list, ctrl_obj->viewer); - } else { - ERR("fail to alloc vit"); - } - } else { - ERR("failed to create brightness view"); - } + _brightness_set_image(BRIGHTNESS_MIN); + _refresh(ad); } static void _brightness_remove(brightness_ctrl_obj *ctrl_obj, void *data) @@ -435,11 +562,12 @@ static void _brightness_remove(brightness_ctrl_obj *ctrl_obj, void *data) if (g_ctrl_obj != NULL) { if (g_ctrl_obj->viewer != NULL) { quickpanel_list_util_item_unpack_by_object(ad->list - , g_ctrl_obj->viewer); + , g_ctrl_obj->viewer, 0, 0); quickpanel_list_util_item_del_tag(g_ctrl_obj->viewer); evas_object_del(g_ctrl_obj->viewer); + g_ctrl_obj->viewer = NULL; } - INFO("success to remove brightness controller"); + DBG("brightness controller is removed"); free(g_ctrl_obj); g_ctrl_obj = NULL; } @@ -450,60 +578,154 @@ static void _brightness_register_event_cb(brightness_ctrl_obj *ctrl_obj) int ret = 0; retif(ctrl_obj == NULL, , "Data parameter is NULL"); - ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, - _brightness_vconf_cb, ctrl_obj); - if (ret != 0) { - ERR("failed to register a cb key:%s err:%d", - "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret); + if (ctrl_obj->is_event_registered == 0) { + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, + _brightness_vconf_cb, ctrl_obj); + if (ret != 0) { + ERR("failed to register a cb key:%s err:%d", + "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret); + } + ctrl_obj->is_event_registered = 1; } } static void _brightness_deregister_event_cb(brightness_ctrl_obj *ctrl_obj) { int ret = 0; + retif(ctrl_obj == NULL, , "Data parameter is NULL"); - ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, _brightness_vconf_cb); - if (ret != 0) { - ERR("failed to register a cb key:%s err:%d", "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret); + if (ctrl_obj->is_event_registered == 1) { + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_LCD_BRIGHTNESS, _brightness_vconf_cb); + if (ret != 0) { + ERR("failed to register a cb key:%s err:%d", "VCONFKEY_SETAPPL_LCD_BRIGHTNESS", ret); + } + ctrl_obj->is_event_registered = 0; } } -static int quickpanel_brightness_init(void *data) +static void _brightness_create(void *data) { - retif(data == NULL, QP_FAIL, "Invalid parameter!"); - if (g_ctrl_obj == NULL) { - g_ctrl_obj = (brightness_ctrl_obj *)malloc(sizeof(brightness_ctrl_obj)); + g_ctrl_obj = (brightness_ctrl_obj *)calloc(1, sizeof(brightness_ctrl_obj)); + if (g_ctrl_obj != NULL) { + g_ctrl_obj->min_level = BRIGHTNESS_MIN; + g_ctrl_obj->max_level = BRIGHTNESS_MAX; + g_ctrl_obj->last_requested_level = _brightness_get_level(); + + _brightness_add(g_ctrl_obj, data); + _brightness_view_update(); + _brightness_register_event_cb(g_ctrl_obj); + + g_ctrl_obj->brighntess_slider = NULL; + + DBG("brightness controller is created"); + } } +} +static void _brightness_destroy(void *data) +{ if (g_ctrl_obj != NULL) { - g_ctrl_obj->min_level = BRIGHTNESS_MIN; - g_ctrl_obj->max_level = BRIGHTNESS_MAX; + _brightness_deregister_event_cb(g_ctrl_obj); + _brightness_remove(g_ctrl_obj, data); - DBG("brightness range %d~%d\n", g_ctrl_obj->min_level, g_ctrl_obj->max_level); + DBG("brightness controller is removed"); + } - _brightness_add(g_ctrl_obj, data); - _brightness_view_update(); - _brightness_register_event_cb(g_ctrl_obj); + g_ctrl_obj = NULL; +} + +static void _handler_brightness(void *data, DBusMessage *msg) +{ + int ret = 0; + DBusError err; + char *key = NULL; + char *value = NULL; + retif(data == NULL || msg == NULL, , "Invalid parameter!"); + + dbus_error_init(&err); + ret = dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &key, + DBUS_TYPE_STRING, &value, + DBUS_TYPE_INVALID); + retif(ret == 0, , "dbus_message_get_args error"); + retif(key == NULL, , "Failed to get key"); + retif(value == NULL, , "Failed to get value"); + + if (dbus_error_is_set(&err)) { + ERR("dbus err: %s", err.message); + dbus_error_free(&err); + return; } - return QP_OK; + if (strcmp(key, "visibility") == 0) { + if (strcmp(value, PREF_BRIGHTNESS_ON) == 0) { + _brightness_create(data); + quickpanel_preference_set(PREF_BRIGHTNESS, PREF_BRIGHTNESS_ON); + } else if (strcmp(value, PREF_BRIGHTNESS_OFF) == 0) { + _brightness_destroy(data); + quickpanel_preference_set(PREF_BRIGHTNESS, PREF_BRIGHTNESS_OFF); + } + } } -static int quickpanel_brightness_fini(void *data) +static void _ipc_init(void *data) { + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->dbus_connection == NULL, , "Invalid parameter!"); + + g_hdl_brightness = + e_dbus_signal_handler_add(ad->dbus_connection, NULL, + QP_DBUS_PATH, + QP_DBUS_NAME, + BRIGHTNESS_SIG_ACTIVITY, + _handler_brightness, data); + msgif(g_hdl_brightness == NULL, "fail to add size signal"); +} + +static void _ipc_fini(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->dbus_connection == NULL, , "Invalid parameter!"); + + if (g_hdl_brightness != NULL) { + e_dbus_signal_handler_del(ad->dbus_connection, g_hdl_brightness); + g_hdl_brightness = NULL; + } +} + +static int _init(void *data) +{ + char buf[PREF_LEN_VALUE_MAX] = {0,}; retif(data == NULL, QP_FAIL, "Invalid parameter!"); - if (g_ctrl_obj != NULL) { - _brightness_deregister_event_cb(g_ctrl_obj); - _brightness_remove(g_ctrl_obj, data); +#ifdef QP_EMERGENCY_MODE_ENABLE + if (quickpanel_emergency_mode_is_on()) { + return QP_OK; } +#endif + + quickpanel_preference_get(PREF_BRIGHTNESS, buf); + _brightness_create(data); + + _ipc_init(data); + + return QP_OK; +} + +static int _fini(void *data) +{ + retif(data == NULL, QP_FAIL, "Invalid parameter!"); + + _ipc_fini(data); + _brightness_destroy(data); - g_ctrl_obj = NULL; return QP_OK; } -static void quickpanel_brightness_lang_changed(void *data) +static void _lang_changed(void *data) { retif(data == NULL, , "Invalid parameter!"); @@ -511,3 +733,53 @@ static void quickpanel_brightness_lang_changed(void *data) _brightness_view_update(); } } + +static void _qp_opened(void *data) +{ + Evas_Object *slider = NULL; + Evas_Object *view = _controller_view_get(); + retif(g_ctrl_obj == NULL, , "Invalid parameter!"); + retif(view == NULL, , "Invalid parameter!"); + + if (view != NULL) { + _brightness_view_update(); + slider = elm_object_part_content_get(view, "elm.swallow.slider"); + if (slider != NULL) { + DBG("quickpanel opened"); + _brightness_ctrl_overheat_check(slider, g_ctrl_obj, 0); + } + } +} + +static void _qp_closed(void *data) +{ + retif(g_ctrl_obj == NULL, , "Invalid parameter!"); + + if (g_ctrl_obj->viewer != NULL) { + _brightness_view_update(); + } +} + +static void _refresh(void *data) +{ + int h = 0; + struct appdata *ad = data; + Evas_Object *view = _controller_view_get(); + retif(ad == NULL, , "Invalid parameter!"); + retif(g_ctrl_obj == NULL, , "Invalid parameter!"); + retif(g_ctrl_obj->viewer == NULL, , "Invalid parameter!"); + retif(view == NULL, , "Invalid parameter!"); + + evas_object_geometry_get(g_ctrl_obj->viewer, NULL, NULL, NULL, &h); + + if (ad->angle == 90 || ad->angle == 270) { + evas_object_resize(g_ctrl_obj->viewer, ad->win_height, h); + evas_object_resize(view, ad->win_height, h); + _brightness_view_pos_set(); + + } else { + evas_object_resize(g_ctrl_obj->viewer, ad->win_width, h); + evas_object_resize(view, ad->win_width, h); + _brightness_view_pos_set(); + } +} diff --git a/daemon/handler_controller.c b/daemon/handler_controller.c new file mode 100644 index 0000000..526fe9f --- /dev/null +++ b/daemon/handler_controller.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include "handler_controller.h" + +#include <dlog.h> +#include <vconf.h> + +#include <tapi_common.h> +#include <ITapiSim.h> +#include <TelCall.h> +#include <ITapiCall.h> +#include "setting_utils.h" + +#include "list_util.h" +#include "quickpanel-ui.h" +#include "common.h" + +HAPI void quickpanel_handler_text_set(char *text) +{ + struct appdata *ad = quickpanel_get_app_data(); + if (!ad) { + ERR("Could not get application data"); + return; + } + + Evas_Object *layout = ad->view_root; + if (!layout) { + ERR("Could not get view_root"); + return; + } + + if (text) { + elm_object_part_text_set(layout, "qp.handler.text", text); + elm_object_signal_emit(layout, "show", "qp.handler.text"); + } else { + elm_object_part_text_set(layout, "qp.handler.text", " "); + elm_object_signal_emit(layout, "hide", "qp.handler.text"); + } +} + +HAPI void quickpanel_handler_set_visibility(Eina_Bool visible) +{ + struct appdata *ad = quickpanel_get_app_data(); + if (!ad) { + ERR("Could not get application data"); + return; + } + + Evas_Object *layout = ad->view_root; + if (!layout) { + ERR("Could not get view_root"); + return; + } + + if (visible == EINA_FALSE) { + elm_object_signal_emit(layout, "qp.handler.text,hide", "qp.handler.text"); + } else { + elm_object_signal_emit(layout, "qp.handler.text,show", "qp.handler.text"); + } +} + + + + + diff --git a/daemon/handler_controller.h b/daemon/handler_controller.h new file mode 100644 index 0000000..5ae5963 --- /dev/null +++ b/daemon/handler_controller.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef HANDLER_CONTROLLER_H_ +#define HANDLER_CONTROLLER_H_ + +#include <stdio.h> +#include <stdlib.h> +#include <Evas.h> +#include <Elementary.h> +#include <Eina.h> + +void quickpanel_handler_text_set(char *text); +void quickpanel_handler_set_visibility(Eina_Bool visible); + +#endif /* HANDLER_CONTROLLER_H_ */ diff --git a/daemon/idletxt/idletxt.c b/daemon/idletxt/idletxt.c deleted file mode 100755 index b1a9694..0000000 --- a/daemon/idletxt/idletxt.c +++ /dev/null @@ -1,599 +0,0 @@ -/* - * Copyright 2012 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_X.h> -#include <vconf.h> -#include "common.h" -#include "quickpanel-ui.h" -#include "quickpanel_def.h" - -#define QP_ENABLE_SLIDING_TEXT 0 -#define QP_ENABLE_SAT 0 -#define QP_IDLETXT_PART "qp.noti.swallow.spn" - -#define QP_SPN_BASE_PART "qp.base.spn.swallow" -#define QP_SPN_BOX_PART "qp.spn.swallow" -#define QP_BUTTON_PART "qp.button.swallow" - -#define QP_IDLETXT_MAX_KEY 4 -#define QP_IDLETXT_MAX_LEN 1024 -#define QP_IDLETXT_SLIDE_LEN 130 - -#define QP_IDLETXT_LABEL_STRING \ - "<font_size=30 font_weight=Medium color=#959494FF align=left>%s</>" - -static int quickpanel_idletxt_init(void *data); -static int quickpanel_idletxt_fini(void *data); -static int quickpanel_idletxt_suspend(void *data); -static int quickpanel_idletxt_resume(void *data); -static void quickpanel_idletxt_lang_changed(void *data); - -QP_Module idletxt = { - .name = "idletxt", - .init = quickpanel_idletxt_init, - .fini = quickpanel_idletxt_fini, - .suspend = quickpanel_idletxt_suspend, - .resume = quickpanel_idletxt_resume, - .lang_changed = quickpanel_idletxt_lang_changed -}; - -static int _quickpanel_idletxt_map_exceptional_nwname(char *txt, char *map_txt, int map_txt_len) -{ - int is_mapped = 0; - - if (txt == NULL || map_txt == NULL) { - return is_mapped; - } - - if (strncasecmp(txt, "No Service", strlen("No Service")) == 0) { - strncpy(map_txt, _S("IDS_COM_BODY_NO_SERVICE"), map_txt_len); - is_mapped = 1; - } else if (strncasecmp(txt, "EMERGENCY", strlen("EMERGENCY")) == 0) { - strncpy(map_txt, _("IDS_CALL_POP_CALLING_EMERG_ONLY"), map_txt_len); - is_mapped = 1; - } else if (strncasecmp(txt, "Searching", strlen("Searching")) == 0) { - strncpy(map_txt, _S("IDS_COM_BODY_SEARCHING"), map_txt_len); - is_mapped = 1; - } else if (strncasecmp(txt, "SIM Error", strlen("SIM Error")) == 0) { - strncpy(map_txt, _S("IDS_COM_BODY_INVALID_SIM_CARD"), map_txt_len); - is_mapped = 1; - } else if (strncasecmp(txt, "NO SIM", strlen("NO SIM")) == 0) { - strncpy(map_txt, _S("IDS_COM_BODY_NO_SIM"), map_txt_len); - is_mapped = 1; - } - - return is_mapped; -} - -static Evas_Object *_quickpanel_idletxt_create_label(Evas_Object * parent, - char *txt) -{ - Evas_Object *obj = NULL; - char buf[QP_IDLETXT_MAX_LEN] = { 0, }; - char localized_txt[QP_IDLETXT_MAX_LEN] = { 0, }; - int len = 0; - - retif(parent == NULL || txt == NULL, NULL, "Invalid parameter!"); - - memset(buf, 0x00, sizeof(buf)); - - if (_quickpanel_idletxt_map_exceptional_nwname(txt, localized_txt, QP_IDLETXT_MAX_LEN) == 1) { - len = snprintf(buf, sizeof(buf), QP_IDLETXT_LABEL_STRING, localized_txt); - } else { - len = snprintf(buf, sizeof(buf), QP_IDLETXT_LABEL_STRING, txt); - } - - retif(len < 0, NULL, "len < 0"); - - obj = elm_label_add(parent); - if (obj != NULL) { - struct appdata *ad = quickpanel_get_app_data(); - - if (ad != NULL) - elm_label_wrap_width_set(obj, QP_SPN_TEXT_W * ad->scale); - else - elm_label_wrap_width_set(obj, QP_SPN_TEXT_W); - -#if QP_ENABLE_SLIDING_TEXT - elm_label_slide_mode_set(obj, ELM_LABEL_SLIDE_MODE_AUTO); - elm_label_slide_duration_set(obj, 3); - elm_object_style_set(obj, "slide_bounce"); -#else - elm_label_ellipsis_set(obj, EINA_TRUE); -#endif - - elm_object_text_set(obj, buf); - - evas_object_size_hint_weight_set(obj, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(obj, EVAS_HINT_FILL, 0.5); - - evas_object_show(obj); - } - - return obj; -} - -static Evas_Object *_quickpanel_idletxt_create_box(Evas_Object * parent) -{ - Evas_Object *box = NULL; - - retif(parent == NULL, NULL, "Invalid parameter!"); - - box = elm_box_add(parent); - if (box != NULL) { - elm_box_horizontal_set(box, EINA_FALSE); - - evas_object_show(box); - } - - return box; -} - -static int _quickpanel_idletxt_get_txt(const char *key, char *txt, int size) -{ - int len = 0; - char *str = NULL; - int i = 0; - - str = vconf_get_str(key); - if (str == NULL || str[0] == '\0') - return 0; - - /* check ASCII code */ - for (i = strlen(str) - 1; i >= 0; i--) { - if (str[i] <= 31 || str[i] >= 127) - goto failed; - } - - len = snprintf(txt, size, "%s", str); - - failed: - if (str) - free(str); - - return len; -} - -static Evas_Object *_quickpanel_idletxt_add_label(Evas_Object * box, - char *key[]) -{ - char txt[QP_IDLETXT_MAX_LEN] = { 0, }; - char buf[QP_IDLETXT_MAX_LEN] = { 0, }; - int len = 0; - int i = 0; - Evas_Object *obj = NULL; - - retif(key == NULL || key[0] == '\0', NULL, "Invalid parameter!"); - - memset(txt, 0x00, sizeof(txt)); - - for (i = 0; key[i]; i++) { - memset(buf, 0x00, sizeof(buf)); - - /* get next key string */ - if (_quickpanel_idletxt_get_txt(key[i], buf, sizeof(buf))) { - INFO("VCONFKEY(%s) = %s", key[i], buf); - - len = strlen(txt); - - snprintf(&txt[len], sizeof(txt) - len, "%s%s", - len ? " - " : "", buf); - } - } - - len = strlen(txt); - - if (len) { - obj = _quickpanel_idletxt_create_label(box, txt); - - if (obj != NULL) { - return obj; - } - } - - return NULL; -} - -static Evas_Object *_quickpanel_idletxt_exception_add_label(Evas_Object * box) -{ - int service_type = VCONFKEY_TELEPHONY_SVCTYPE_SEARCH; - char *text = NULL; - Evas_Object *obj = NULL; - - if (vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &service_type) != 0) { - ERR("fail to get VCONFKEY_TELEPHONY_SVCTYPE"); - } - - switch(service_type) { - case VCONFKEY_TELEPHONY_SVCTYPE_NOSVC: - text = _S("IDS_COM_BODY_NO_SERVICE"); - break; - case VCONFKEY_TELEPHONY_SVCTYPE_EMERGENCY: - text = _("IDS_CALL_POP_CALLING_EMERG_ONLY"); - break; - default: - if (service_type > VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) { - text = vconf_get_str(VCONFKEY_TELEPHONY_NWNAME); - } else if (service_type == VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) { - text = _S("IDS_COM_BODY_SEARCHING"); - } else { - return NULL; - } - break; - } - - if (text != NULL) { - obj = _quickpanel_idletxt_create_label(box, text); - - if (obj != NULL) { - return obj; - } - } - - return NULL; -} - -static Evas_Object *_quickpanel_idletxt_get_spn(Evas_Object * box) -{ - Evas_Object *label = NULL; - char *keylist[QP_IDLETXT_MAX_KEY] = { 0, }; - int ret = 0; - int state = 0; - int i = 0; - int service_type = VCONFKEY_TELEPHONY_SVCTYPE_NONE; - - /* make keylist */ - if (vconf_get_int(VCONFKEY_TELEPHONY_SVCTYPE, &service_type) != 0) { - ERR("fail to get VCONFKEY_TELEPHONY_SVCTYPE"); - } - - ret = vconf_get_int(VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, &state); - if (ret == 0) { - INFO("VCONFKEY(%s) = %d", - VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, state); - - if (state != VCONFKEY_TELEPHONY_DISP_INVALID - && service_type > VCONFKEY_TELEPHONY_SVCTYPE_SEARCH) { - if (i < QP_IDLETXT_MAX_KEY) { - if (state & VCONFKEY_TELEPHONY_DISP_SPN) { - keylist[i++] = - strdup(VCONFKEY_TELEPHONY_SPN_NAME); - } - - if (state & VCONFKEY_TELEPHONY_DISP_PLMN) { - keylist[i++] = - strdup(VCONFKEY_TELEPHONY_NWNAME); - } - } - - if (i > 0) { - /* get string with keylist */ - label = _quickpanel_idletxt_add_label(box, keylist); - - /* free keylist */ - while (i > 0) { - if (keylist[i]) - free(keylist[i]); - - i--; - } - } - } else { - label = _quickpanel_idletxt_exception_add_label(box); - } - } - - return label; -} - -#ifdef TBD -static Evas_Object *_quickpanel_idletxt_get_sat_text(Evas_Object * box) -{ - Evas_Object *label = NULL; - char *keylist[] = { VCONFKEY_SAT_IDLE_TEXT, 0 }; - - /* get string with keylist */ - label = _quickpanel_idletxt_add_label(box, keylist); - - return label; -} -#endif - -static Eina_Bool _quickpanel_idletxt_button_clicked_timer_cb(void *data) -{ - quickpanel_launch_app(QP_SETTING_PKG_SETTING_EMUL, NULL); - - quickpanel_close_quickpanel(true); - - return ECORE_CALLBACK_CANCEL; -} - - -static void _quickpanel_idletxt_button_clicked(void *data, Evas_Object * obj, void *event_info) -{ - struct appdata *ad = data; - - quickpanel_play_feedback(); - - retif(obj == NULL, , "Invalid parameter!"); - retif(ad == NULL, , "Invalid parameter!"); - retif(ad->win == NULL, , "ad->win is NULL"); - - ecore_idler_add(_quickpanel_idletxt_button_clicked_timer_cb, NULL); -} - -static void quickpanel_idletxt_update(void *data) -{ - struct appdata *ad = NULL; - Evas_Object *label = NULL; - Evas_Object *idletxtbox = NULL; - Evas_Object *button_settings = NULL; - Evas_Object *spn = NULL; - - retif(!data, , "Invalid parameter!"); - ad = data; - - retif(!ad->ly, , "layout is NULL!"); - - spn = elm_object_part_content_get(ad->ly, QP_SPN_BASE_PART); - retif(!spn, , "spn layout is NULL!"); - - idletxtbox = elm_object_part_content_get(spn, QP_SPN_BOX_PART); - button_settings = elm_object_part_content_get(spn, QP_BUTTON_PART); - - if (idletxtbox == NULL) { - idletxtbox = _quickpanel_idletxt_create_box(spn); - retif(idletxtbox == NULL, , "Failed to create box!"); - elm_object_part_content_set(spn, - QP_SPN_BOX_PART, idletxtbox); - } - - elm_box_clear(idletxtbox); - - /* get spn */ - label = _quickpanel_idletxt_get_spn(idletxtbox); - if (label != NULL) - elm_box_pack_end(idletxtbox, label); - - /* get sat idle text */ -#if QP_ENABLE_SAT - label = _quickpanel_idletxt_get_sat_text(idletxtbox); - if (label != NULL) - elm_box_pack_end(idletxtbox, label); -#endif - - if (button_settings == NULL) { - button_settings = elm_button_add(spn); - retif(button_settings == NULL, , "Failed to create clear button!"); - elm_object_style_set(button_settings, "quickpanel_standard"); - elm_object_part_content_set(spn, - QP_BUTTON_PART, button_settings); - evas_object_smart_callback_add(button_settings, "clicked", - _quickpanel_idletxt_button_clicked, ad); - } - - elm_object_text_set(button_settings, _S("IDS_COM_BODY_SETTINGS")); -} - -static void quickpanel_idletxt_changed_cb(keynode_t *node, void *data) -{ - quickpanel_idletxt_update(data); -} - -static int _quickpanel_idletxt_register_event_handler(void *data) -{ - int ret = 0; - - ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SVCTYPE, - quickpanel_idletxt_changed_cb, data); - if (ret != 0) - ERR("Failed to register [%s]", - VCONFKEY_TELEPHONY_SVCTYPE); - - ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, - quickpanel_idletxt_changed_cb, data); - if (ret != 0) - ERR("Failed to register [%s]", - VCONFKEY_TELEPHONY_SPN_DISP_CONDITION); - - ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SPN_NAME, - quickpanel_idletxt_changed_cb, data); - if (ret != 0) - ERR("Failed to register [%s]", - VCONFKEY_TELEPHONY_SPN_NAME); - - - ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_NWNAME, - quickpanel_idletxt_changed_cb, data); - if (ret != 0) - ERR("Failed to register [%s]", - VCONFKEY_TELEPHONY_NWNAME); - - ret = vconf_notify_key_changed(VCONFKEY_SAT_IDLE_TEXT, - quickpanel_idletxt_changed_cb, data); - if (ret != 0) - ERR("Failed to register [%s]", - VCONFKEY_SAT_IDLE_TEXT); - - - return QP_OK; -} - -static int _quickpanel_idletxt_unregister_event_handler(void) -{ - int ret = 0; - - ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SVCTYPE, - quickpanel_idletxt_changed_cb); - if (ret != 0) - ERR("Failed to unregister [%s]", - VCONFKEY_TELEPHONY_SVCTYPE); - - ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SPN_DISP_CONDITION, - quickpanel_idletxt_changed_cb); - if (ret != 0) - ERR("Failed to unregister [%s]", - VCONFKEY_TELEPHONY_SPN_DISP_CONDITION); - - ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SPN_NAME, - quickpanel_idletxt_changed_cb); - if (ret != 0) - ERR("Failed to unregister [%s]", - VCONFKEY_TELEPHONY_SPN_NAME); - - - ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_NWNAME, - quickpanel_idletxt_changed_cb); - if (ret != 0) - ERR("Failed to unregister [%s]", - VCONFKEY_TELEPHONY_NWNAME); - - ret = vconf_ignore_key_changed(VCONFKEY_SAT_IDLE_TEXT, - quickpanel_idletxt_changed_cb); - if (ret != 0) - ERR("Failed to unregister [%s]", - VCONFKEY_SAT_IDLE_TEXT); - - return QP_OK; -} - -static Evas_Object *_idletxt_load_edj(Evas_Object * parent, const char *file, - const char *group) -{ - Eina_Bool r; - Evas_Object *eo = NULL; - - retif(parent == NULL, NULL, "Invalid parameter!"); - - eo = elm_layout_add(parent); - retif(eo == NULL, NULL, "Failed to add layout object!"); - - r = elm_layout_file_set(eo, file, group); - retif(r != EINA_TRUE, NULL, "Failed to set edje object file!"); - - evas_object_size_hint_weight_set(eo, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_show(eo); - - return eo; -} - -static int quickpanel_idletxt_init(void *data) -{ - struct appdata *ad = NULL; - Evas_Object *spn = NULL; - - retif(!data, QP_FAIL, "Invalid parameter!"); - ad = data; - - spn = _idletxt_load_edj(ad->ly, DEFAULT_EDJ, "quickpanel/spn"); - retif(!spn, QP_FAIL, "fail to load spn layout"); - - elm_object_part_content_set(ad->ly, QP_SPN_BASE_PART, spn); - - quickpanel_idletxt_update(data); - - _quickpanel_idletxt_register_event_handler(data); - - return QP_OK; -} - -static int quickpanel_idletxt_fini(void *data) -{ - struct appdata *ad = (struct appdata *)data; - Evas_Object *spn = NULL; - Evas_Object *idletxtbox = NULL; - - retif(ad == NULL, QP_FAIL, "Invalid parameter!"); - - _quickpanel_idletxt_unregister_event_handler(); - - retif(!ad->ly, QP_FAIL, "Invalid parameter!"); - - spn = elm_object_part_content_unset(ad->ly, QP_SPN_BASE_PART); - retif(!spn, QP_OK, "spn is NULL"); - - idletxtbox = elm_object_part_content_get(spn, QP_SPN_BOX_PART); - if (idletxtbox) { - elm_object_part_content_unset(spn, QP_SPN_BOX_PART); - evas_object_del(idletxtbox); - } - - evas_object_del(spn); - - return QP_OK; -} - -#if QP_ENABLE_SLIDING_TEXT -static Evas_Object *_quickpanel_spn_label_get(void *data) -{ - Evas_Object *spn = NULL; - Evas_Object *label = NULL; - Evas_Object *idletxtbox = NULL; - struct appdata *ad = NULL; - retif(!data, NULL, "Invalid parameter!"); - ad = data; - - retif(!ad->ly, NULL, "layout is NULL!"); - - spn = elm_object_part_content_get(ad->ly, QP_SPN_BASE_PART); - retif(!spn, NULL, "spn layout is NULL!"); - - idletxtbox = elm_object_part_content_get(spn, QP_SPN_BOX_PART); - retif(!idletxtbox, NULL, "idletxtbox is NULL!"); - - Eina_List *list = elm_box_children_get(idletxtbox); - retif(!list, NULL, "list is NULL!"); - - label = eina_list_nth(list, 0); - - return label; -} -#endif - -static int quickpanel_idletxt_suspend(void *data) -{ -#if QP_ENABLE_SLIDING_TEXT - Evas_Object *label = _quickpanel_spn_label_get(data); - - if (label != NULL) { - elm_label_slide_mode_set(label, ELM_LABEL_SLIDE_MODE_NONE); - } -#endif - - return QP_OK; -} - -static int quickpanel_idletxt_resume(void *data) -{ -#if QP_ENABLE_SLIDING_TEXT - Evas_Object *label = _quickpanel_spn_label_get(data); - - if (label != NULL) { - elm_label_slide_mode_set(label, ELM_LABEL_SLIDE_MODE_AUTO); - } -#endif - - return QP_OK; -} - -static void quickpanel_idletxt_lang_changed(void *data) -{ - retif(data == NULL, , "Invalid parameter!"); - - quickpanel_idletxt_update(data); -} diff --git a/daemon/list_util.c b/daemon/list_util.c index 5f1c7a6..986cd17 100755 --- a/daemon/list_util.c +++ b/daemon/list_util.c @@ -1,24 +1,27 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ + #include <Elementary.h> #include <stdlib.h> #include "common.h" #include "list_util.h" +#include "vi_manager.h" #define E_DATA_ITEM_LABEL_H "QP_ITEM_DATA" @@ -27,6 +30,34 @@ struct _qp_item_data { void *data; }; +static Eina_Bool _anim_init_cb(void *data); +static Eina_Bool _anim_job_cb(void *data); +static Eina_Bool _anim_done_cb(void *data); + +static void _viewer_freeze(Evas_Object *viewer) +{ + int freezed_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + freezed_count = elm_object_scroll_freeze_get(viewer); + + if (freezed_count <= 0) { + elm_object_scroll_freeze_push(viewer); + } +} + +static void _viewer_unfreeze(Evas_Object *viewer) +{ + int i = 0, freezed_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + freezed_count = elm_object_scroll_freeze_get(viewer); + + for (i = 0 ; i < freezed_count; i++) { + elm_object_scroll_freeze_pop(viewer); + } +} + HAPI qp_item_data *quickpanel_list_util_item_new(qp_item_type_e type, void *data) { qp_item_data *qid = NULL; @@ -67,8 +98,9 @@ HAPI void *quickpanel_list_util_item_get_data(qp_item_data *qid) { void *user_data = NULL; - if (!qid) + if (!qid) { return NULL; + } user_data = qid->data; @@ -77,8 +109,9 @@ HAPI void *quickpanel_list_util_item_get_data(qp_item_data *qid) HAPI void quickpanel_list_util_item_set_data(qp_item_data *qid, void *data) { - if (!qid) - return ; + if (!qid) { + return; + } qid->data = data; } @@ -115,47 +148,23 @@ HAPI int quickpanel_list_util_item_compare(const void *data1, const void *data2) } /* elm_genlist sort is not working as i expected */ - if (qid1->type == qid2->type) + if (qid1->type == qid2->type) { return 1; + } + diff = qid1->type - qid2->type; return diff; } -HAPI void quickpanel_list_util_item_unpack_by_type(Evas_Object *list - , qp_item_type_e type) -{ - retif(list == NULL, , "invalid parameter"); - - Eina_List *l; - Eina_List *l_next; - Evas_Object *obj; - Eina_List *item_list = elm_box_children_get(list); - - EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) - { - if (obj != NULL) { - // call deleted callback - qp_item_data *qid = evas_object_data_get(obj, E_DATA_ITEM_LABEL_H); - if (qid != NULL) { - if (qid->type == type) { - elm_box_unpack(list, obj); - } - } - } - } -} - -HAPI void quickpanel_list_util_item_unpack_by_object(Evas_Object *list - , Evas_Object *item) +static qp_item_type_e _get_item_type(qp_item_data *item_data) { - retif(list == NULL, , "invalid parameter"); - retif(item == NULL, , "invalid parameter"); + retif(item_data == NULL, QP_ITEM_TYPE_NONE, "a invalid data"); - elm_box_unpack(list, item); + return item_data->type; } -static int __item_compare(const void *data1, const void *data2) +static int _item_compare(const void *data1, const void *data2) { int diff = 0; const Evas_Object *eo1 = data1; @@ -184,37 +193,546 @@ static int __item_compare(const void *data1, const void *data2) return diff; } +static void _list_util_layout_get_coord(Evas_Object *container, Evas_Object *first, + int *coord_x, int *coord_y) +{ + int x = 0; + int y = 0; + int h = 0; + int off_y = 0; + qp_item_type_e item_type = QP_ITEM_TYPE_NONE; + struct appdata *ad = quickpanel_get_app_data(); + + retif(container == NULL, , "invalid parameter"); + retif(ad == NULL, , "invalid data."); + + Eina_List *list_tmp = NULL; + Eina_List *l = NULL; + Eina_List *l_next = NULL; + Evas_Object *obj = NULL; + Eina_List *item_list = elm_box_children_get(container); -HAPI void quickpanel_list_util_sort_insert(Evas_Object *list, + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj != NULL) { + item_type = quickpanel_list_util_item_type_get(obj); + if (item_type == QP_ITEM_TYPE_ONGOING_NOTI + || item_type == QP_ITEM_TYPE_NOTI) { + list_tmp = elm_box_children_get(obj); + if (list_tmp != NULL) { + if (eina_list_count(list_tmp) != 0 ) { + evas_object_geometry_get(obj, NULL, NULL, NULL, &h); + } + eina_list_free(list_tmp); + } + } else { + evas_object_geometry_get(obj, NULL, NULL, NULL, &h); + } + + off_y += h; + h = 0; + if (obj == first) { + break; + } + } + } + + evas_object_geometry_get(container, &x, &y, NULL, &h); + if (off_y == 0 || y == 0) { + ERR("Failed get a valid height offset : %d %d", off_y, y); + } + + if (coord_x != NULL) { + *coord_x = x; + } + if (coord_y != NULL) { + *coord_y = y + off_y; + } + + if (item_list != NULL) { + eina_list_free(item_list); + } +} + +Evas_Object *_list_util_get_first(Evas_Object *list, Evas_Object *new_obj) { - retif(list == NULL, , "invalid parameter"); - retif(new_obj == NULL, , "invalid parameter"); - Eina_List *l; Eina_List *l_next; Evas_Object *obj = NULL; Evas_Object *first = NULL; Eina_List *item_list = elm_box_children_get(list); + qp_item_data *item_data = NULL; + retif(list == NULL, NULL, "invalid parameter"); + retif(new_obj == NULL, NULL, "invalid parameter"); + item_data = evas_object_data_get(new_obj, E_DATA_ITEM_LABEL_H); - retif(item_data == NULL, , "invalid parameter"); + retif(item_data == NULL, NULL, "invalid parameter"); - INFO("current entry count in list:%d", eina_list_count(item_list)); - EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) - { + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { if (obj != NULL) { - if (__item_compare(obj, item_data) >= 0) + if (_item_compare(obj, item_data) > 0) { break; + } } first = obj; } + if (item_list != NULL) { + eina_list_free(item_list); + } + + return first; +} + +HAPI qp_item_type_e quickpanel_list_util_item_type_get(Evas_Object *item) +{ + qp_item_data *qid = NULL; + retif(item == NULL, QP_ITEM_TYPE_NONE, "invalid parameter"); + + qid = evas_object_data_get(item, E_DATA_ITEM_LABEL_H); + if (qid != NULL) { + return _get_item_type(qid); + } + + return QP_ITEM_TYPE_NONE; +} + +HAPI void quickpanel_list_util_item_unpack_by_object(Evas_Object *list + , Evas_Object *item, int is_unpack_only, int is_hide) +{ + QP_VI *vi = NULL; + qp_item_data *qid = NULL; + retif(list == NULL, , "invalid parameter"); + retif(item == NULL, , "invalid parameter"); + + qid = evas_object_data_get(item, E_DATA_ITEM_LABEL_H); + vi = quickpanel_vi_new_with_data( + VI_OP_DELETE, + _get_item_type(qid), + list, + item, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + NULL, + is_unpack_only, + is_hide); + quickpanel_vi_start(vi); +} + +HAPI void quickpanel_list_util_sort_insert(Evas_Object *list, + Evas_Object *new_obj) +{ + + QP_VI *vi = NULL; + qp_item_data *qid = NULL; + retif(list == NULL, , "invalid parameter"); + retif(new_obj == NULL, , "invalid parameter"); + + qid = evas_object_data_get(new_obj, E_DATA_ITEM_LABEL_H); + vi = quickpanel_vi_new_with_data( + VI_OP_INSERT, + _get_item_type(qid), + list, + new_obj, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + NULL, + 0, + 0); + quickpanel_vi_start(vi); +} + +HAPI Elm_Transit *quickpanel_list_util_get_reorder_transit(Evas_Object *item, Elm_Transit *transit, int distance) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj = NULL; + Eina_List *item_list = NULL; + int is_start_relayout = 0; + Elm_Transit *transit_layout = NULL; + Evas_Object *container = NULL; + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, NULL, "invalid parameter"); + + container = ad->list; + retif(container == NULL, NULL, "invalid parameter"); + retif(item == NULL, NULL, "invalid parameter"); + + item_list = elm_box_children_get(container); + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj == item) { + is_start_relayout = 1; + } else if (obj != NULL && is_start_relayout == 1) { + transit_layout = elm_transit_add(); + if (transit_layout != NULL) { + elm_transit_effect_translation_add(transit_layout, 0, 0, 0, distance); + elm_transit_object_add(transit_layout, obj); + elm_transit_duration_set(transit_layout, + quickpanel_vim_get_duration(VI_OP_REORDER)); + elm_transit_tween_mode_set(transit_layout, + quickpanel_vim_get_tweenmode(VI_OP_REORDER)); + elm_transit_objects_final_state_keep_set(transit_layout, EINA_TRUE); + elm_transit_event_enabled_set(transit_layout, EINA_TRUE); + if (transit != NULL) { + elm_transit_chain_transit_add(transit, transit_layout); + } else { + elm_transit_go(transit_layout); + } + } + } + } + + if (item_list != NULL) { + eina_list_free(item_list); + } + + return transit_layout; +} + +static void _anim_init_insert(void *data) +{ + QP_VI *vi = data; + int coord_x = 0, coord_y = 0; + retif(vi == NULL, , "invalid parameter"); + + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *container = vi->container; + Evas_Object *item = vi->target; + Evas_Object *first = NULL; + + evas_object_clip_set(item, evas_object_clip_get(container)); + evas_object_color_set(item, 0, 0, 0, 0); + + first = _list_util_get_first(container, item); + _list_util_layout_get_coord(container, first, &coord_x, &coord_y); + evas_object_move(item, coord_x, coord_y); +} + +static void _anim_job_insert(void *data) +{ + + QP_VI *vi = data; + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj = NULL; + Eina_List *item_list = NULL; + int is_start_relayout = 0; + int item_width, item_height = 0; + int coord_x = 0, coord_y = 0; + Elm_Transit *transit_layout = NULL; + Elm_Transit *transit_fadein = NULL; + Evas_Object *container = NULL; + Evas_Object *item = NULL; + Evas_Object *first = NULL; + + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + container = vi->container; + item = vi->target; + item_list = elm_box_children_get(container); + + first = _list_util_get_first(container, item); + _list_util_layout_get_coord(container, first, &coord_x, &coord_y); + evas_object_move(item, coord_x, coord_y); + is_start_relayout = (first == NULL) ? 1 : 0; + + evas_object_geometry_get(item, NULL, NULL, &item_width, &item_height); + if (item_width == 0 && item_height == 0) { + ERR("failed to get a size of item %d %d", item_width, item_height); + evas_object_size_hint_min_get (item, &item_width, &item_height); + } + + if (vi->item_type == QP_ITEM_TYPE_ONGOING_NOTI) { + if (item_list != NULL) { + eina_list_free(item_list); + } + return; + } + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj == first) { + is_start_relayout = 1; + } else if (obj != NULL && is_start_relayout == 1) { + transit_layout = elm_transit_add(); + if (transit_layout != NULL) { + elm_transit_effect_translation_add(transit_layout, 0, 0, 0, item_height); + elm_transit_object_add(transit_layout, obj); + elm_transit_duration_set(transit_layout, + quickpanel_vim_get_duration(VI_OP_REORDER)); + elm_transit_tween_mode_set(transit_layout, + quickpanel_vim_get_tweenmode(VI_OP_REORDER)); + elm_transit_objects_final_state_keep_set(transit_layout, EINA_TRUE); + elm_transit_go(transit_layout); + } else { + ERR("Failed to create a transit"); + } + } + } + + if (item_list != NULL) { + eina_list_free(item_list); + } + + transit_fadein = elm_transit_add(); + if (transit_fadein != NULL) { + elm_transit_object_add(transit_fadein, item); + elm_transit_effect_color_add(transit_fadein, 0, 0, 0, 0, 255, 255, 255, 255); + elm_transit_duration_set(transit_fadein, + quickpanel_vim_get_duration(VI_OP_INSERT)); + elm_transit_tween_mode_set(transit_fadein, + quickpanel_vim_get_tweenmode(VI_OP_INSERT)); + elm_transit_del_cb_set(transit_fadein, quickpanel_vi_done_cb_for_transit, vi); + + if (transit_layout != NULL) { + elm_transit_chain_transit_add(transit_layout, transit_fadein); + } else { + elm_transit_go(transit_fadein); + } + } else { + if (transit_layout != NULL) elm_transit_del(transit_layout); + quickpanel_vi_done(vi); + ERR("Failed to create all the transit"); + } +} + +static void _anim_done_insert(void *data) +{ + QP_VI *vi = data; + retif(data == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *container = vi->container; + Evas_Object *item = vi->target; + Evas_Object *first = _list_util_get_first(container, item); + + evas_object_color_set(item, 255, 255, 255, 255); + if (first == NULL) { - elm_box_pack_start(list, new_obj); + elm_box_pack_start(container, item); + } else { + elm_box_pack_after(container, item, first); + } +} + +static void _anim_job_delete(void *data) +{ + QP_VI *vi = data; + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj = NULL; + Eina_List *item_list = NULL; + int is_start_relayout = 0; + int item_width, item_height = 0; + Elm_Transit *transit_layout = NULL; + Elm_Transit *transit_fadeout = NULL; + Evas_Object *container = NULL; + Evas_Object *item = NULL; + + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + container = vi->container; + item = vi->target; + item_list = elm_box_children_get(container); + + evas_object_geometry_get(item, NULL, NULL, &item_width, &item_height); + if (item_width == 0 && item_height == 0) { + ERR("failed to get a size of item %d %d", item_width, item_height); + evas_object_size_hint_min_get (item, &item_width, &item_height); + } + + transit_fadeout = elm_transit_add(); + if (transit_fadeout != NULL) { + elm_transit_object_add(transit_fadeout, item); + elm_transit_effect_color_add(transit_fadeout, 255, 255, 255, 255, 0, 0, 0, 0); + elm_transit_objects_final_state_keep_set(transit_fadeout, EINA_TRUE); + elm_transit_tween_mode_set(transit_fadeout, + quickpanel_vim_get_tweenmode(VI_OP_DELETE)); + elm_transit_duration_set(transit_fadeout, + quickpanel_vim_get_duration(VI_OP_DELETE)); + elm_transit_go(transit_fadeout); + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj == item) { + is_start_relayout = 1; + } else if (obj != NULL && is_start_relayout == 1) { + transit_layout = elm_transit_add(); + if (transit_layout != NULL) { + elm_transit_effect_translation_add(transit_layout, 0, 0, 0, -item_height); + elm_transit_object_add(transit_layout, obj); + elm_transit_duration_set(transit_layout, + quickpanel_vim_get_duration(VI_OP_REORDER)); + elm_transit_tween_mode_set(transit_layout, + quickpanel_vim_get_tweenmode(VI_OP_REORDER)); + elm_transit_objects_final_state_keep_set(transit_layout, EINA_TRUE); + elm_transit_chain_transit_add(transit_fadeout, transit_layout); + } else { + ERR("Failed to create a transit"); + } + } + } + } + + if (item_list != NULL) { + eina_list_free(item_list); + } + + if (transit_layout != NULL) { + elm_transit_del_cb_set(transit_layout, quickpanel_vi_done_cb_for_transit, + vi); + } else if (transit_fadeout != NULL) { + elm_transit_del_cb_set(transit_fadeout, quickpanel_vi_done_cb_for_transit, + vi); + } else { + ERR("Failed to create all the transit"); + quickpanel_vi_done(vi); + } +} + +static void _anim_done_delete(void *data) +{ + QP_VI *vi = data; + + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *container = vi->container; + Evas_Object *item = vi->target; + + elm_box_unpack(container, item); + + if (vi->extra_flag_2 == 1) { + evas_object_move(item, -10000, -10000); + quickpanel_vi_object_event_freeze_set(item, EINA_FALSE); + } + if (vi->extra_flag_1 == 0 && item != NULL) { + evas_object_del(item); + item = NULL; + } +} + +static Eina_Bool _anim_init_cb(void *data) +{ + int i = 0; + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_init_table[] = { + { + .op_type = VI_OP_INSERT, + .handler = _anim_init_insert, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + for (i = 0; anim_init_table[i].op_type != VI_OP_NONE; i++) { + if (anim_init_table[i].op_type != vi->op_type) { + continue; + } + + anim_init_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +static Eina_Bool _anim_job_cb(void *data) +{ + int i = 0; + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_job_table[] = { + { + .op_type = VI_OP_INSERT, + .handler = _anim_job_insert, + }, + { + .op_type = VI_OP_DELETE, + .handler = _anim_job_delete, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + for (i = 0; anim_job_table[i].op_type != VI_OP_NONE; i++) { + if (anim_job_table[i].op_type != vi->op_type) { + continue; + } + + anim_job_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +static Eina_Bool _anim_done_cb(void *data) +{ + int i = 0; + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_done_table[] = { + { + .op_type = VI_OP_INSERT, + .handler = _anim_done_insert, + }, + { + .op_type = VI_OP_DELETE, + .handler = _anim_done_delete, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + for (i = 0; anim_done_table[i].op_type != VI_OP_NONE; i++) { + if (anim_done_table[i].op_type != vi->op_type) { + continue; + } + + anim_done_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +HAPI void quickpanel_list_util_scroll_freeze_set(Eina_Bool is_freeze) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + retif(ad->scroller == NULL, , "invalid data."); + + if (is_freeze == EINA_TRUE) { + _viewer_freeze(ad->scroller); } else { - elm_box_pack_after(list, new_obj, first); + _viewer_unfreeze(ad->scroller); } } diff --git a/daemon/list_util.h b/daemon/list_util.h index 795178a..8ddb165 100755 --- a/daemon/list_util.h +++ b/daemon/list_util.h @@ -1,19 +1,21 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ + #ifndef _QP_LIST_UTIL_DEF_ #define _QP_LIST_UTIL_DEF_ @@ -23,11 +25,16 @@ typedef enum { QP_ITEM_TYPE_NONE = -1, QP_ITEM_TYPE_SETTING = 0, QP_ITEM_TYPE_BRIGHTNESS, - QP_ITEM_TYPE_ONGOING_NOTI, + QP_ITEM_TYPE_DUAL_SIM, + QP_ITEM_TYPE_FACTORY, + QP_ITEM_TYPE_MULTIWINDOW, + QP_ITEM_TYPE_EARJACK, QP_ITEM_TYPE_MINICTRL_ONGOING, QP_ITEM_TYPE_MINICTRL_TOP, QP_ITEM_TYPE_MINICTRL_MIDDLE, QP_ITEM_TYPE_MINICTRL_LOW, + QP_ITEM_TYPE_ONGOING_NOTI_GROUP, + QP_ITEM_TYPE_ONGOING_NOTI, QP_ITEM_TYPE_NOTI_GROUP, QP_ITEM_TYPE_NOTI, QP_ITEM_TYPE_BAR, @@ -50,14 +57,17 @@ void quickpanel_list_util_item_del_tag(Evas_Object *item); void *quickpanel_list_util_item_get_data(qp_item_data *qid); void quickpanel_list_util_item_set_data(qp_item_data *qid, void *data); int quickpanel_list_util_item_compare(const void *data1, const void *data2); +qp_item_type_e quickpanel_list_util_item_type_get(Evas_Object *item); -void quickpanel_list_util_item_unpack_by_type(Evas_Object *list - , qp_item_type_e type); void quickpanel_list_util_item_unpack_by_object(Evas_Object *list - , Evas_Object *item); + , Evas_Object *item, int is_unpack_only, int is_hide); void quickpanel_list_util_sort_insert(Evas_Object *list, Evas_Object *new_obj); +Elm_Transit *quickpanel_list_util_get_reorder_transit(Evas_Object *item, + Elm_Transit *transit, int distance); +void quickpanel_list_util_scroll_freeze_set(Eina_Bool is_freeze); + #endif /* _QP_LIST_UTIL_DEF_ */ diff --git a/daemon/media.c b/daemon/media.c index 3991634..e0c7a44 100755 --- a/daemon/media.c +++ b/daemon/media.c @@ -1,25 +1,64 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 <glib.h> #include <vconf.h> +#include <metadata_extractor.h> #include "common.h" #include "quickpanel-ui.h" -static player_h g_sound_player; -static Ecore_Timer *g_sound_player_timer; +#define NEED_TO_DEBUG_LOCKUP_ISSUE + +static struct info { + int id; + int is_feedback_initialized; + player_h player; + Ecore_Timer *playing_timer; +} s_info = { + .player = NULL, + .playing_timer = NULL, + .id = 0, + .is_feedback_initialized = 0, +}; + +static void _quickpanel_player_free(player_h *sound_player); + +static void +_quickpanel_player_del_timeout_timer(void) +{ + if (s_info.playing_timer) { + ecore_timer_del(s_info.playing_timer); + s_info.playing_timer = NULL; + } +} + +static Eina_Bool _quickpanel_player_timeout_cb(void *data) +{ + s_info.playing_timer = NULL; + + retif(data == NULL, ECORE_CALLBACK_CANCEL, "invalid parameter"); + player_h *sound_player = data; + + _quickpanel_player_free(sound_player); + s_info.playing_timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} static void _quickpanel_player_free_job_cb(void *data) { @@ -28,6 +67,9 @@ static void _quickpanel_player_free_job_cb(void *data) retif(sound_player == NULL, , "invalid parameter"); +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("before stopping media"); +#endif if (player_get_state(sound_player, &state) == PLAYER_ERROR_NONE) { INFO("the state of sound player %d", state); @@ -41,6 +83,9 @@ static void _quickpanel_player_free_job_cb(void *data) } } player_destroy(sound_player); +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("after stopping media"); +#endif } static void _quickpanel_player_free(player_h *sound_player) @@ -52,26 +97,25 @@ static void _quickpanel_player_free(player_h *sound_player) *sound_player = NULL; } -static void -_quickpanel_player_del_timeout_timer(void) +static void _quickpanel_player_start_job_cb(void *data) { - if (g_sound_player_timer) { - ecore_timer_del(g_sound_player_timer); - g_sound_player_timer = NULL; - } -} - -static Eina_Bool _quickpanel_player_timeout_cb(void *data) -{ - g_sound_player_timer = NULL; - - retif(data == NULL, ECORE_CALLBACK_CANCEL, "invalid parameter"); + int ret = PLAYER_ERROR_NONE; player_h *sound_player = data; - _quickpanel_player_free(sound_player); - g_sound_player_timer = NULL; - - return ECORE_CALLBACK_CANCEL; +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("before playing media"); +#endif + ret = player_start(*sound_player); + if (ret != PLAYER_ERROR_NONE) { /* if directly return retor.. */ + ERR("player_start [%d]", ret); + _quickpanel_player_free(sound_player); + return; + } + s_info.playing_timer = ecore_timer_add(QP_PLAY_DURATION_LIMIT, + _quickpanel_player_timeout_cb, sound_player); +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("after playing media"); +#endif } static void @@ -80,6 +124,8 @@ _quickpanel_player_completed_cb(void *user_data) retif(user_data == NULL, , "invalid parameter"); player_h *sound_player = user_data; + DBG("Media player completed"); + _quickpanel_player_del_timeout_timer(); _quickpanel_player_free(sound_player); } @@ -90,6 +136,8 @@ _quickpanel_player_interrupted_cb(player_interrupted_code_e code, void *user_dat retif(user_data == NULL, , "invalid parameter"); player_h *sound_player = user_data; + ERR("interrupt code [%d]", (int)code); + _quickpanel_player_del_timeout_timer(); _quickpanel_player_free(sound_player); } @@ -100,61 +148,104 @@ _quickpanel_player_error_cb(int error_code, void *user_data) retif(user_data == NULL, , "invalid parameter"); player_h *sound_player = user_data; + ERR("Error code [%d]", (int)error_code); + _quickpanel_player_del_timeout_timer(); _quickpanel_player_free(sound_player); } -HAPI void quickpanel_player_play(sound_type_e sound_type, const char *sound_file) +HAPI int quickpanel_media_player_is_drm_error(int error_code) { - player_h *sound_player = &g_sound_player; + if (error_code == PLAYER_ERROR_DRM_EXPIRED + || error_code == PLAYER_ERROR_DRM_NO_LICENSE + || error_code == PLAYER_ERROR_DRM_FUTURE_USE + || error_code == PLAYER_ERROR_DRM_NOT_PERMITTED) { + return 1; + } + + return 0; +} + +HAPI int quickpanel_media_player_play(sound_type_e sound_type, const char *sound_file) +{ + player_h *sound_player = &s_info.player; + sound_session_type_e type = 1; int ret = PLAYER_ERROR_NONE; + int sndRet = SOUND_MANAGER_ERROR_NONE; player_state_e state = PLAYER_STATE_NONE; +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("Start player"); +#endif _quickpanel_player_del_timeout_timer(); if (*sound_player != NULL) { _quickpanel_player_free(sound_player); } +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("setting sound session start"); +#endif + if (sound_type == SOUND_TYPE_NOTIFICATION) { + sound_manager_get_session_type(&type); + if (type != SOUND_SESSION_TYPE_NOTIFICATION) { + sndRet = sound_manager_set_session_type(SOUND_SESSION_TYPE_NOTIFICATION); + if (sndRet != SOUND_MANAGER_ERROR_NONE) { + ERR("sound_manager_set_session_type fail sndRet :%x",sndRet); + return PLAYER_ERROR_INVALID_PARAMETER; + } + } + } +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("setting sound session finished"); +#endif + +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("player_create start"); +#endif ret = player_create(sound_player); if (ret != PLAYER_ERROR_NONE) { ERR("creating the player handle failed[%d]", ret); - player_destroy(*sound_player); + *sound_player = NULL; + return ret; } +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("player_create finished"); +#endif ret = player_set_sound_type(*sound_player, sound_type); if (ret != PLAYER_ERROR_NONE) { ERR("player_set_sound_type() ERR: %x!!!!", ret); _quickpanel_player_free(sound_player); - return ; + return ret; } player_get_state(*sound_player, &state); if (state > PLAYER_STATE_READY) { _quickpanel_player_free(sound_player); - return; + return ret; } ret = player_set_uri(*sound_player, sound_file); if (ret != PLAYER_ERROR_NONE) { ERR("set attribute---profile_uri[%d]", ret); _quickpanel_player_free(sound_player); - return; + return ret; } ret = player_prepare(*sound_player); if (ret != PLAYER_ERROR_NONE) { ERR("realizing the player handle failed[%d]", ret); _quickpanel_player_free(sound_player); - return; + return ret; } player_get_state(*sound_player, &state); if (state != PLAYER_STATE_READY) { ERR("state of player is invalid %d", state); _quickpanel_player_free(sound_player); - return; + return ret; } /* register callback */ @@ -162,56 +253,133 @@ HAPI void quickpanel_player_play(sound_type_e sound_type, const char *sound_file if (ret != PLAYER_ERROR_NONE) { ERR("player_set_completed_cb() ERR: %x!!!!", ret); _quickpanel_player_free(sound_player); - return; + return ret; } ret = player_set_interrupted_cb(*sound_player, _quickpanel_player_interrupted_cb, sound_player); if (ret != PLAYER_ERROR_NONE) { _quickpanel_player_free(sound_player); - return; + return ret; } ret = player_set_error_cb(*sound_player, _quickpanel_player_error_cb, sound_player); if (ret != PLAYER_ERROR_NONE) { _quickpanel_player_free(sound_player); - return; + return ret; } - ret = player_start(*sound_player); - if (ret != PLAYER_ERROR_NONE) { /* if directly return retor.. */ - ERR("player_start [%d]", ret); - _quickpanel_player_free(sound_player); - return; + ecore_job_add(_quickpanel_player_start_job_cb, sound_player); +#ifdef NEED_TO_DEBUG_LOCKUP_ISSUE + SERR("playing request"); +#endif + + return ret; +} + +static Eina_Bool _playable_check(const char *file_path) +{ + char *value = NULL; + int ret_meta = METADATA_EXTRACTOR_ERROR_NONE; + metadata_extractor_h metadata = NULL; + Eina_Bool ret = EINA_FALSE; + + ret_meta = metadata_extractor_create(&metadata); + if (ret_meta != METADATA_EXTRACTOR_ERROR_NONE) { + ERR("Failed to create metadata extractor:%d", ret_meta); + return ret; } - g_sound_player_timer = ecore_timer_add(QP_PLAY_DURATION_LIMIT, - _quickpanel_player_timeout_cb, sound_player); + if (metadata == NULL) { + ERR("Failed to create metadata extractor:%d", ret_meta); + return ret; + } + + ret_meta = metadata_extractor_set_path(metadata, file_path); + if (ret_meta != METADATA_EXTRACTOR_ERROR_NONE) { + ERR("Failed to set path to meta extractor:%d", ret_meta); + metadata_extractor_destroy(metadata); + return ret; + } + ret_meta = metadata_extractor_get_metadata(metadata, METADATA_HAS_AUDIO, &value); + if (ret_meta != METADATA_EXTRACTOR_ERROR_NONE) { + ERR("Failed to get metadata:%d", ret_meta); + metadata_extractor_destroy(metadata); + return ret; + } + + if(value && g_strcmp0(value, "0")) { + ret = EINA_TRUE; + } + + if (value != NULL) { + free(value); + } + DBG("%s :: playable[%d]", file_path, ret); + metadata_extractor_destroy(metadata); + return ret; +} + +HAPI Eina_Bool quickpanel_media_playable_check(const char *file_path) +{ + Eina_Bool ret = EINA_FALSE; + + /* Check file exist or not */ + ret = ecore_file_exists(file_path); + if (ret == EINA_FALSE) { + ERR("%s file does not exist", file_path); + return ret; + } + + /* Check file playable or not */ + ret = _playable_check(file_path); + if (ret == EINA_FALSE) { + ERR("%s file does not playable", file_path); + return ret; + } + + return ret; } -HAPI void quickpanel_player_stop(void) + +HAPI void quickpanel_media_player_stop(void) { _quickpanel_player_del_timeout_timer(); - if (g_sound_player != NULL) { - _quickpanel_player_free(&g_sound_player); + if (s_info.player != NULL) { + _quickpanel_player_free(&s_info.player); } + + quickpanel_media_player_id_set(0); } -HAPI int quickpanel_is_sound_enabled(void) +HAPI void quickpanel_media_player_id_set(int id) { - int snd_status = 0; + s_info.id = id; +} + +HAPI int quickpanel_media_player_id_get(void) +{ + return s_info.id; +} + +HAPI int quickpanel_media_is_sound_enabled(void) +{ + int snd_status = 0, ret = -1; #ifdef VCONFKEY_SETAPPL_ACCESSIBILITY_TURN_OFF_ALL_SOUNDS int snd_disabled_status = 0; - vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TURN_OFF_ALL_SOUNDS, &snd_disabled_status); - vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &snd_status); + ret = vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TURN_OFF_ALL_SOUNDS, &snd_disabled_status); + msgif(ret != 0, "failed to get VCONFKEY_SETAPPL_ACCESSIBILITY_TURN_OFF_ALL_SOUNDS"); + ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &snd_status); + msgif(ret != 0, "failed to get VCONFKEY_SETAPPL_SOUND_STATUS_BOOL"); if (snd_disabled_status == 0 && snd_status == 1) { return 1; } #else - vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &snd_status); + ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &snd_status); + msgif(ret != 0, "failed to get VCONFKEY_SETAPPL_SOUND_STATUS_BOOL"); if (snd_status == 1) { return 1; @@ -221,22 +389,27 @@ HAPI int quickpanel_is_sound_enabled(void) return 0; } -HAPI int quickpanel_is_vib_enabled(void) +HAPI int quickpanel_media_is_vib_enabled(void) { - int vib_status = 0; + int vib_status = 0, ret = -1; - vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vib_status); + ret = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, &vib_status); + if (ret == 0) { + if (vib_status == 1) + return 1; + } else { + ERR("failed to get a value of VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL"); + } - if (vib_status == 1) - return 1; - else - return 0; + return 0; } -HAPI void quickpanel_play_feedback(void) +HAPI void quickpanel_media_play_feedback(void) { - int snd_enabled = quickpanel_is_sound_enabled(); - int vib_enabled = quickpanel_is_vib_enabled(); + int snd_enabled = quickpanel_media_is_sound_enabled(); + int vib_enabled = quickpanel_media_is_vib_enabled(); + + quickpanel_media_init(); if (snd_enabled == 1) { feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TOUCH_TAP); @@ -245,12 +418,12 @@ HAPI void quickpanel_play_feedback(void) } } -HAPI int quickpanel_set_mute_toggle(void) +HAPI int quickpanel_media_set_mute_toggle(void) { int ret = -1; - if (quickpanel_is_sound_enabled() == 1 || - quickpanel_is_vib_enabled() == 1) { + if (quickpanel_media_is_sound_enabled() == 1 || + quickpanel_media_is_vib_enabled() == 1) { ret = vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, 0); msgif(ret != 0, "failed to set VCONFKEY_SETAPPL_SOUND_STATUS_BOOL"); @@ -268,3 +441,25 @@ HAPI int quickpanel_set_mute_toggle(void) return 1; } } + +HAPI void quickpanel_media_init(void) +{ + if (s_info.is_feedback_initialized == 0) { + if (feedback_initialize() == FEEDBACK_ERROR_NONE) { + s_info.is_feedback_initialized = 1; + } else { + ERR("failed to init feedback API"); + } + } +} + +HAPI void quickpanel_media_fini(void) +{ + if (s_info.is_feedback_initialized == 1) { + if (feedback_deinitialize() == FEEDBACK_ERROR_NONE) { + s_info.is_feedback_initialized = 0; + } else { + ERR("failed to deinit feedback API"); + } + } +} diff --git a/daemon/media.h b/daemon/media.h index f86ea45..3365e78 100755 --- a/daemon/media.h +++ b/daemon/media.h @@ -1,31 +1,40 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 __QUICKPANEL_MEDIA_H__ #define __QUICKPANEL_MEDIA_H__ #include <player.h> +#include <sound_manager.h> #include <feedback.h> #define QP_PLAY_DURATION_LIMIT 15 -void quickpanel_player_play(sound_type_e sound_type, const char *sound_file); -void quickpanel_player_stop(void); -int quickpanel_is_sound_enabled(void); -int quickpanel_is_vib_enabled(void); -void quickpanel_play_feedback(void); -int quickpanel_set_mute_toggle(void); +int quickpanel_media_player_play(sound_type_e sound_type, const char *sound_file); +void quickpanel_media_player_stop(void); +int quickpanel_media_is_sound_enabled(void); +int quickpanel_media_is_vib_enabled(void); +void quickpanel_media_play_feedback(void); +int quickpanel_media_set_mute_toggle(void); +void quickpanel_media_player_id_set(int id); +int quickpanel_media_player_id_get(void); +Eina_Bool quickpanel_media_playable_check(const char *file_path); +int quickpanel_media_player_is_drm_error(int error_code); +void quickpanel_media_init(void); +void quickpanel_media_fini(void); #endif diff --git a/daemon/minictrl/minictrl.c b/daemon/minictrl/minictrl.c index ee7f59f..8242ba6 100755 --- a/daemon/minictrl/minictrl.c +++ b/daemon/minictrl/minictrl.c @@ -1,46 +1,55 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 <glib.h> -#include <Ecore_X.h> #include <minicontrol-viewer.h> #include <minicontrol-monitor.h> #include <string.h> #include "common.h" #include "quickpanel-ui.h" +#include "quickpanel_def.h" #include "list_util.h" #include "quickpanel_debug_util.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif +#include "minictrl.h" +#include "vi_manager.h" -#define QP_R_MARGIN 12 -#define MINICONTROL_WIDTH_P_MAX 692 -#define MINICONTROL_WIDTH_L_MAX 1252 - +#define MINICONTROL_TYPE_STR_VIEWER "::[viewer=" +#define MINICONTROL_TYPE_STR_QUICKPANEL "QUICKPANEL" +#define MINICONTROL_TYPE_STR_LOCKSCREEN "LOCKSCREEN" #define MINICONTROL_TYPE_STR_ONGOING "_ongoing]" -static int quickpanel_minictrl_init(void *data); -static int quickpanel_minictrl_fini(void *data); -static int quickpanel_minictrl_suspend(void *data); -static int quickpanel_minictrl_resume(void *data); +static Eina_Bool _anim_init_cb(void *data); +static Eina_Bool _anim_job_cb(void *data); +static Eina_Bool _anim_done_cb(void *data); +static int _init(void *data); +static int _fini(void *data); +static int _suspend(void *data); +static int _resume(void *data); QP_Module minictrl = { .name = "minictrl", - .init = quickpanel_minictrl_init, - .fini = quickpanel_minictrl_fini, - .suspend = quickpanel_minictrl_suspend, - .resume = quickpanel_minictrl_resume, + .init = _init, + .fini = _fini, + .suspend = _suspend, + .resume = _resume, .hib_enter = NULL, .hib_leave = NULL, .lang_changed = NULL, @@ -57,8 +66,29 @@ struct _viewer_item { void *data; }; +static void _minictrl_resize_vi(Evas_Object *list, + struct _viewer_item *item, int to_w, int to_h); + GHashTable *g_prov_table; +static int _viewer_check(const char *name) +{ + char *pos_start = NULL; + retif(!name, 0, "name is NULL"); + + if ((pos_start = strstr(name, MINICONTROL_TYPE_STR_VIEWER)) != NULL) { + if (strstr(pos_start, MINICONTROL_TYPE_STR_QUICKPANEL) != NULL) { + return 1; + } else { + return 0; + } + } else if (strstr(name, MINICONTROL_TYPE_STR_LOCKSCREEN) != NULL) { + return 0; + } + + return 1; +} + static void _viewer_freeze(Evas_Object *viewer) { int freezed_count = 0; @@ -66,8 +96,6 @@ static void _viewer_freeze(Evas_Object *viewer) freezed_count = elm_object_scroll_freeze_get(viewer); - WARN("viewer(scroller) is freezed"); - if (freezed_count <= 0) { elm_object_scroll_freeze_push(viewer); } @@ -80,14 +108,13 @@ static void _viewer_unfreeze(Evas_Object *viewer) freezed_count = elm_object_scroll_freeze_get(viewer); - WARN("viewer(scroller) is unfreezed"); - for (i = 0 ; i < freezed_count; i++) { elm_object_scroll_freeze_pop(viewer); } } -static Evas_Object *_get_minictrl_obj(Evas_Object *layout) { +static Evas_Object *_get_minictrl_obj(Evas_Object *layout) +{ retif(layout == NULL, NULL, "Invalid parameter!"); return elm_object_part_content_get(layout, "elm.icon"); @@ -103,20 +130,24 @@ static void _viewer_set_size(Evas_Object *layout, void *data, int width, int hei struct appdata *ad = data; int max_width = 0; int resized_width = 0; + int is_landscape = 0; viewer = _get_minictrl_obj(layout); retif(viewer == NULL, , "Invalid parameter!"); - if (ad->angle == 90 || ad->angle == 270) { - max_width = (ad->scale * MINICONTROL_WIDTH_L_MAX) - 1; + is_landscape = (width > ad->win_width) ? 1 : 0; + + if (is_landscape) { + max_width = (ad->scale * ad->win_height); } else { - max_width = (ad->scale * MINICONTROL_WIDTH_P_MAX) - 1; + max_width = (ad->scale * ad->win_width); } resized_width = (width > max_width) ? max_width : width; - DBG("minicontroller view is resized to w:%d h:%d", resized_width, height); + SERR("minicontroller view is resized to w:%d(%d) h:%d Landscape[%d]", resized_width, width, height, is_landscape); evas_object_size_hint_min_set(viewer, resized_width, height); + evas_object_size_hint_max_set(viewer, resized_width, height); } static void _viewer_item_free(struct _viewer_item *item) @@ -126,16 +157,17 @@ static void _viewer_item_free(struct _viewer_item *item) retif(ad->list == NULL, , "Invalid parameter!"); retif(item == NULL, , "Invalid parameter!"); - if (item->name) + if (item->name) { free(item->name); + } if (item->viewer) { -#ifdef TBD - evas_object_unref(item->viewer); -#endif - quickpanel_list_util_item_unpack_by_object(ad->list, item->viewer); + quickpanel_list_util_item_unpack_by_object(ad->list, item->viewer, 0, 0); quickpanel_list_util_item_del_tag(item->viewer); - evas_object_del(item->viewer); + if (item->viewer != NULL) { + evas_object_del(item->viewer); + item->viewer = NULL; + } } free(item); @@ -161,19 +193,35 @@ static Evas_Object *_minictrl_create_view(struct appdata *ad, const char *name) Evas_Object *viewer = minicontrol_viewer_add(layout, name); if (!viewer) { ERR("fail to add viewer - %s", name); + if (layout) { + evas_object_del(layout); + } return NULL; } -#ifdef TBD - evas_object_ref(viewer); -#endif + elm_object_focus_allow_set(viewer, EINA_TRUE); elm_object_part_content_set(layout, "elm.icon", viewer); + Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(layout); + elm_object_part_content_set(layout, "focus", focus); + +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = quickpanel_accessibility_screen_reader_object_get(layout, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", layout); + + if (ao != NULL) { + elm_access_info_cb_set(ao, ELM_ACCESS_TYPE, quickpanel_accessibility_info_cb, + _NOT_LOCALIZED("Mini controller")); + } +#endif + return layout; } static int _minictrl_is_ongoing(const char *str) { - if (str == NULL) return 0; + if (str == NULL) { + return 0; + } if (strstr(str, MINICONTROL_TYPE_STR_ONGOING) != NULL) { return 1; @@ -203,7 +251,8 @@ static qp_item_type_e _minictrl_priority_to_type(minicontrol_priority_e priority } static void _minictrl_release_cb(void *data, Evas *e, - Evas_Object *obj, void *event_info) { + Evas_Object *obj, void *event_info) +{ struct appdata *ad; retif(!data, , "data is NULL"); ad = data; @@ -246,7 +295,14 @@ static void _minictrl_add(const char *name, unsigned int width, * */ viewer = _minictrl_create_view(ad, name); + if (!viewer) { + ERR("Failed to create view[%s]", name); + return; + } _viewer_set_size(viewer, ad, width, height); + quickpanel_uic_initial_resize(viewer, + (height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT) + ? height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT); evas_object_event_callback_add(_get_minictrl_obj(viewer), EVAS_CALLBACK_MOUSE_UP, _minictrl_release_cb, ad); @@ -254,7 +310,10 @@ static void _minictrl_add(const char *name, unsigned int width, vit = malloc(sizeof(struct _viewer_item)); if (!vit) { ERR("fail to alloc vit"); - evas_object_del(viewer); + if (viewer != NULL) { + evas_object_del(viewer); + viewer = NULL; + } return; } @@ -266,7 +325,10 @@ static void _minictrl_add(const char *name, unsigned int width, qid = quickpanel_list_util_item_new(type, vit); if (!qid) { ERR("fail to alloc vit"); - evas_object_del(viewer); + if (viewer != NULL) { + evas_object_del(viewer); + viewer = NULL; + } free(vit); return; } @@ -281,34 +343,32 @@ static void _minictrl_add(const char *name, unsigned int width, g_hash_table_insert(g_prov_table, g_strdup(name), vit); - INFO("success to add minicontrol %s", name); + DBG("success to add minicontrol %s", name); + quickpanel_minictrl_rotation_report(ad->angle); } static void _minictrl_remove(const char *name, void *data) { if (g_prov_table) { - if (g_hash_table_remove(g_prov_table, name)) - { - INFO("success to remove %s", name); + if (g_hash_table_remove(g_prov_table, name)) { + DBG("success to remove %s", name); retif(data == NULL, , "data is NULL"); - } - else + } else { WARN("unknown provider name : %s", name); + } } } static void _minictrl_update(const char *name, unsigned int width, unsigned int height, void *data) { + int old_h = 0; + struct appdata *ad = data; struct _viewer_item *found = NULL; - struct appdata *ad = NULL; - if (!g_prov_table) - return; - - retif(!data, , "data is NULL"); - ad = data; + retif(!g_prov_table, , "data is NULL"); + retif(!ad, , "data is NULL"); found = g_hash_table_lookup(g_prov_table, name); @@ -317,36 +377,50 @@ static void _minictrl_update(const char *name, unsigned int width, return; } - found->width = width; - found->height = height; + old_h = found->height; if (found->viewer) { - _viewer_set_size(found->viewer, ad, width, height); + if (old_h != height) { + _minictrl_resize_vi(ad->list, + found, width, height); + } else { + _viewer_set_size(found->viewer, ad, width, height); + quickpanel_uic_initial_resize(found->viewer, + (height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT) + ? height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT); + } } } -static void _minictrl_request(const char *name, int action, void *data) +static void _minictrl_request(const char *name, int action, int value, void *data) { - struct appdata *ad = NULL; + struct appdata *ad = data; retif(!name, , "name is NULL"); - retif(!data, , "data is NULL"); - ad = data; + retif(!ad, , "data is NULL"); + + SDBG("%s %d %d", name, action, value); if (action == MINICONTROL_REQ_HIDE_VIEWER) { - quickpanel_close_quickpanel(true); - } - if (action == MINICONTROL_REQ_FREEZE_SCROLL_VIEWER) { + quickpanel_uic_close_quickpanel(true, 0); + } else if (action == MINICONTROL_REQ_FREEZE_SCROLL_VIEWER) { if (ad->list != NULL) { ERR("freezed by %s", name); _viewer_freeze(ad->scroller); } - } - if (action == MINICONTROL_REQ_UNFREEZE_SCROLL_VIEWER) { + } else if (action == MINICONTROL_REQ_UNFREEZE_SCROLL_VIEWER) { if (ad->list != NULL) { ERR("unfreezed by %s", name); _viewer_unfreeze(ad->scroller); } + } +#ifdef HAVE_X + else if (action == MINICONTROL_REQ_REPORT_VIEWER_ANGLE) { + if (ad->list != NULL) { + SERR("need to broadcasting angle by %s %d", name, action); + quickpanel_minictrl_rotation_report(ad->angle); + } } +#endif } static void _mctrl_monitor_cb(minicontrol_action_e action, @@ -358,6 +432,11 @@ static void _mctrl_monitor_cb(minicontrol_action_e action, retif(!data, , "data is NULL"); retif(!name, , "name is NULL"); + if (_viewer_check(name) == 0) { + ERR("%s: ignored", name); + return; + } + switch (action) { case MINICONTROL_ACTION_START: _minictrl_add(name, width, height, priority, data); @@ -369,14 +448,229 @@ static void _mctrl_monitor_cb(minicontrol_action_e action, _minictrl_remove(name, data); break; case MINICONTROL_ACTION_REQUEST: - _minictrl_request(name, width, data); + _minictrl_request(name, width, height, data); break; default: break; } } -static int quickpanel_minictrl_init(void *data) +static void _minictrl_resize_vi(Evas_Object *list, + struct _viewer_item *item, int to_w, int to_h) +{ + QP_VI *vi = NULL; + retif(list == NULL, , "invalid parameter"); + retif(item == NULL, , "invalid parameter"); + + vi = quickpanel_vi_new_with_data( + VI_OP_RESIZE, + QP_ITEM_TYPE_MINICTRL_MIDDLE, + list, + item->viewer, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + item, + to_w, + to_h); + quickpanel_vi_start(vi); +} + +static void _anim_init_resize(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *item = vi->target; + evas_object_color_set(item, 0, 0, 0, 0); +} + +static void _reorder_transit_del_cb(void *data, Elm_Transit *transit) +{ + QP_VI *vi = data; + int to_w = 0, to_h = 0; + Evas_Object *item = NULL; + retif(vi == NULL, , "data is NULL"); + retif(vi->target == NULL, , "invalid parameter"); + + item = vi->target; + to_w = vi->extra_flag_1; + to_h = vi->extra_flag_2; + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "Invalid parameter!"); + + _viewer_set_size(item, ad, to_w, to_h); + quickpanel_uic_initial_resize(item, + (to_h > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT) + ? to_h : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT); +} + +static void _anim_job_resize(void *data) +{ + QP_VI *vi = data; + int to_w = 0, to_h = 0; + Elm_Transit *transit_layout_parent = NULL; + Elm_Transit *transit_fadein = NULL; + Evas_Object *item = NULL; + struct _viewer_item *viewer_item = NULL; + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "Invalid parameter!"); + retif(vi == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + retif(vi->extra_data_2 == NULL, , "invalid parameter"); + + item = vi->target; + to_w = vi->extra_flag_1; + to_h = vi->extra_flag_2; + viewer_item = vi->extra_data_2; + + transit_layout_parent = quickpanel_list_util_get_reorder_transit(viewer_item->viewer, NULL, to_h - viewer_item->height); + if (transit_layout_parent != NULL) { + elm_transit_del_cb_set(transit_layout_parent, _reorder_transit_del_cb, vi); + } else { + _viewer_set_size(item, ad, to_w, to_h); + quickpanel_uic_initial_resize(item, + (to_h > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT) + ? to_h : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT); + } + + transit_fadein = elm_transit_add(); + if (transit_fadein != NULL) { + elm_transit_object_add(transit_fadein, item); + elm_transit_effect_color_add(transit_fadein, 0, 0, 0, 0, 255, 255, 255, 255); + elm_transit_duration_set(transit_fadein, 0.35); + elm_transit_tween_mode_set(transit_fadein, + quickpanel_vim_get_tweenmode(VI_OP_INSERT)); + elm_transit_del_cb_set(transit_fadein, quickpanel_vi_done_cb_for_transit, vi); + elm_transit_objects_final_state_keep_set(transit_fadein, EINA_TRUE); + + if (transit_layout_parent != NULL) { + elm_transit_chain_transit_add(transit_layout_parent, transit_fadein); + elm_transit_go(transit_layout_parent); + } else { + elm_transit_go(transit_fadein); + } + } else { + ERR("Failed to create all the transit"); + quickpanel_vi_done(vi); + } +} + +static void _anim_done_resize(void *data) +{ + QP_VI *vi = data; + struct _viewer_item *viewer_item = NULL; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "Invalid parameter!"); + retif(vi == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *item = vi->target; + viewer_item = vi->extra_data_2; + + viewer_item->width = vi->extra_flag_1; + viewer_item->height = vi->extra_flag_2; + + _viewer_set_size(item, ad, viewer_item->width, viewer_item->height); + quickpanel_uic_initial_resize(item, + (viewer_item->height > QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT) + ? viewer_item->height : QP_THEME_LIST_ITEM_MINICONTRL_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT); + evas_object_color_set(item, 255, 255, 255, 255); +} + +static Eina_Bool _anim_init_cb(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_init_table[] = { + { + .op_type = VI_OP_RESIZE, + .handler = _anim_init_resize, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + int i = 0; + for (i = 0; anim_init_table[i].op_type != VI_OP_NONE; i++) { + if (anim_init_table[i].op_type != vi->op_type) { + continue; + } + + anim_init_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +static Eina_Bool _anim_job_cb(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_job_table[] = { + { + .op_type = VI_OP_RESIZE, + .handler = _anim_job_resize, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + int i = 0; + for (i = 0; anim_job_table[i].op_type != VI_OP_NONE; i++) { + if (anim_job_table[i].op_type != vi->op_type) { + continue; + } + + anim_job_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +static Eina_Bool _anim_done_cb(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_done_table[] = { + { + .op_type = VI_OP_RESIZE, + .handler = _anim_done_resize, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + int i = 0; + for (i = 0; anim_done_table[i].op_type != VI_OP_NONE; i++) { + if (anim_done_table[i].op_type != vi->op_type) { + continue; + } + + anim_done_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +static int _init(void *data) { minicontrol_error_e ret; @@ -395,12 +689,13 @@ static int quickpanel_minictrl_init(void *data) return QP_OK; } -static int quickpanel_minictrl_fini(void *data) +static int _fini(void *data) { minicontrol_error_e ret; ret = minicontrol_monitor_stop(); - if (ret != MINICONTROL_ERROR_NONE) + if (ret != MINICONTROL_ERROR_NONE) { ERR("fail to minicontrol_monitor_stop()- %d", ret); + } if (g_prov_table) { g_hash_table_remove_all(g_prov_table); @@ -410,7 +705,7 @@ static int quickpanel_minictrl_fini(void *data) return QP_OK; } -static int quickpanel_minictrl_suspend(void *data) +static int _suspend(void *data) { struct appdata *ad = data; retif(ad == NULL, QP_FAIL, "Invalid parameter!"); @@ -422,7 +717,7 @@ static int quickpanel_minictrl_suspend(void *data) return QP_OK; } -static int quickpanel_minictrl_resume(void *data) +static int _resume(void *data) { struct appdata *ad = data; retif(ad == NULL, QP_FAIL, "Invalid parameter!"); @@ -433,3 +728,16 @@ static int quickpanel_minictrl_resume(void *data) return QP_OK; } + +HAPI void quickpanel_minictrl_rotation_report(int angle) +{ + if (g_prov_table != NULL) { + if (g_hash_table_size(g_prov_table) > 0) { + SINFO("minicontrol rotation:%d", angle); +#ifdef HAVE_X + minicontrol_viewer_request(QP_PKG_QUICKPANEL, + MINICONTROL_REQ_ROTATE_PROVIDER, angle); +#endif + } + } +} diff --git a/daemon/minictrl/minictrl.h b/daemon/minictrl/minictrl.h new file mode 100644 index 0000000..6387f2c --- /dev/null +++ b/daemon/minictrl/minictrl.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef _QP_MINICONTROL_DEF_ +#define _QP_MINICONTROL_DEF_ + +void quickpanel_minictrl_rotation_report(int angle); + +#endif diff --git a/daemon/modules.c b/daemon/modules.c index 8aa0e44..efeefe0 100755 --- a/daemon/modules.c +++ b/daemon/modules.c @@ -1,19 +1,21 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ + #include "common.h" #include "modules.h" @@ -22,8 +24,14 @@ * MODULES * *****************************************************************/ -/* searchbar */ -/* extern QP_Module searchbar; */ + +#ifdef QP_SETTING_ENABLE +/* setting */ +extern QP_Module settings; +extern QP_Module settings_view_featured; +extern QP_Module settings_view_all; +#endif /* QP_SETTING_ENABLE */ + #ifdef QP_MINICTRL_ENABLE extern QP_Module minictrl; #endif /* QP_MINICTRL_ENABLE */ @@ -36,14 +44,27 @@ extern QP_Module brightness_ctrl; #ifdef QP_ANIMATED_IMAGE_ENABLE extern QP_Module animated_image; #endif + +extern QP_Module vi_manager; +extern QP_Module pager; + /* notification */ extern QP_Module noti; -extern QP_Module ticker; -extern QP_Module ticker_status; -/* idle test */ -extern QP_Module idletxt; +extern QP_Module activenoti; +extern QP_Module qp_datetime_controller; +extern QP_Module qp_datetime_view; +/* do not change the order of modules, result may be changed up to order */ static QP_Module *modules[] = { + &vi_manager, + &pager, + &qp_datetime_controller, + &qp_datetime_view, +#ifdef QP_SETTING_ENABLE + &settings, + &settings_view_featured, + &settings_view_all, +#endif /* QP_SETTING_ENABLE */ #ifdef QP_MINICTRL_ENABLE &minictrl, #endif /* QP_MINICTRL_ENABLE */ @@ -51,93 +72,101 @@ static QP_Module *modules[] = { &brightness_ctrl, #endif /* QP_BRIGHTNESS_ENABLE */ ¬i, - &ticker, - &ticker_status, - &idletxt, + &activenoti, #ifdef QP_ANIMATED_IMAGE_ENABLE - &animated_image + &animated_image, #endif }; -HAPI int init_modules(void *data) +HAPI int quickpanel_modules_init(void *data) { int i; retif(data == NULL, QP_FAIL, "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->init) + if (modules[i]->init) { modules[i]->init(data); + } + + if (modules[i]->init_job_cb) { + ecore_job_add(modules[i]->init_job_cb, data); + } } return QP_OK; } -HAPI int fini_modules(void *data) +HAPI int quickpanel_modules_fini(void *data) { int i; retif(data == NULL, QP_FAIL, "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->fini) + if (modules[i]->fini) { modules[i]->fini(data); + } } return QP_OK; } -HAPI int suspend_modules(void *data) +HAPI int quickpanel_modules_suspend(void *data) { int i; retif(data == NULL, QP_FAIL, "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->suspend) + if (modules[i]->suspend) { modules[i]->suspend(data); + } } return QP_OK; } -HAPI int resume_modules(void *data) +HAPI int quickpanel_modules_resume(void *data) { int i; retif(data == NULL, QP_FAIL, "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->resume) + if (modules[i]->resume) { modules[i]->resume(data); + } } return QP_OK; } -HAPI int hib_enter_modules(void *data) +HAPI int quickpanel_modules_hib_enter(void *data) { int i; retif(data == NULL, QP_FAIL, "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->hib_enter) + if (modules[i]->hib_enter) { modules[i]->hib_enter(data); + } } return QP_OK; } -HAPI int hib_leave_modules(void *data) +HAPI int quickpanel_modules_hib_leave(void *data) { int i; retif(data == NULL, QP_FAIL, "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->hib_leave) + if (modules[i]->hib_leave) { modules[i]->hib_leave(data); + } } return QP_OK; @@ -149,25 +178,27 @@ HAPI int hib_leave_modules(void *data) * ****************************************************************/ -HAPI void lang_change_modules(void *data) +HAPI void quickpanel_modules_lang_change(void *data) { int i; retif(data == NULL, , "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->lang_changed) + if (modules[i]->lang_changed) { modules[i]->lang_changed(data); + } } } -HAPI void refresh_modules(void *data) +HAPI void quickpanel_modules_refresh(void *data) { int i; retif(data == NULL, , "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->refresh) + if (modules[i]->refresh) { modules[i]->refresh(data); + } } } @@ -176,29 +207,31 @@ HAPI void refresh_modules(void *data) * Quickpanel open/close Events * ****************************************************************/ -HAPI int qp_opened_modules(void *data) +HAPI int quickpanel_modules_opened(void *data) { int i; retif(data == NULL, QP_FAIL, "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->qp_opened) + if (modules[i]->qp_opened) { modules[i]->qp_opened(data); + } } return QP_OK; } -HAPI int qp_closed_modules(void *data) +HAPI int quickpanel_modules_closed(void *data) { int i; retif(data == NULL, QP_FAIL, "Invalid parameter!"); for (i = 0; i < sizeof(modules) / sizeof(modules[0]); i++) { - if (modules[i]->qp_closed) + if (modules[i]->qp_closed) { modules[i]->qp_closed(data); + } } return QP_OK; diff --git a/daemon/modules.h b/daemon/modules.h index d35cec2..4480fe5 100755 --- a/daemon/modules.h +++ b/daemon/modules.h @@ -1,34 +1,36 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ + #ifndef __QP_MODULES_H__ #define __QP_MODULES_H__ #include <stdlib.h> #include "quickpanel-ui.h" -extern int init_modules(void *data); -extern int fini_modules(void *data); -extern int suspend_modules(void *data); -extern int resume_modules(void *data); -extern int hib_enter_modules(void *data); -extern int hib_leave_modules(void *data); -extern void lang_change_modules(void *data); -extern void refresh_modules(void *data); -extern int qp_opened_modules(void *data); -extern int qp_closed_modules(void *data); +extern int quickpanel_modules_init(void *data); +extern int quickpanel_modules_fini(void *data); +extern int quickpanel_modules_suspend(void *data); +extern int quickpanel_modules_resume(void *data); +extern int quickpanel_modules_hib_enter(void *data); +extern int quickpanel_modules_hib_leave(void *data); +extern void quickpanel_modules_lang_change(void *data); +extern void quickpanel_modules_refresh(void *data); +extern int quickpanel_modules_opened(void *data); +extern int quickpanel_modules_closed(void *data); #endif /* __QP_MODULES_H__ */ diff --git a/daemon/notifications/activenoti.c b/daemon/notifications/activenoti.c new file mode 100644 index 0000000..dc9ff3d --- /dev/null +++ b/daemon/notifications/activenoti.c @@ -0,0 +1,1328 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <Elementary.h> +#include <appcore-common.h> +#include <vconf.h> +#include <app_control.h> +#include <notification.h> +#include <feedback.h> +#include <system_settings.h> +#ifdef HAVE_X +#include <utilX.h> +#endif +#include "quickpanel-ui.h" +#include "common.h" +#include "noti.h" +#include "noti_win.h" +#include "noti_util.h" +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif +#include "animated_icon.h" + +#define QP_ACTIVENOTI_DURATION 3 +#define QP_ACTIVENOTI_DETAIL_DURATION 6 + +#define ACTIVENOTI_MSG_LEN 100 +#define DEFAULT_ICON RESDIR"/quickpanel_icon_default.png" + +#define E_DATA_ICON "E_DATA_ICON" +#define E_DATA_BADGE "E_DATA_BADGE" +#define E_DATA_NOTI "E_DATA_NOTI" +#define E_DATA_BTN_IMAGE "E_DATA_BTN_IMAGE" +#define E_DATA_BG_IMAGE "E_DATA_BG_IMAGE" +#define DELAY_TIMER_VALUE 0.480 +#define DEL_TIMER_VALUE 8.0 + +static struct info { + Evas_Object *activenoti; + Evas_Object *layout; + Evas_Object *btnbox; + Evas_Object *gesture; + Ecore_Timer *delay_timer; + Ecore_Timer *close_timer; +} s_info = { + .activenoti = NULL, + .layout = NULL, + .btnbox = NULL, + .gesture = NULL, + .delay_timer = NULL, + .close_timer = NULL, +}; + + +static int _activenoti_init(void *data); +static int _activenoti_fini(void *data); +static int _activenoti_enter_hib(void *data); +static int _activenoti_leave_hib(void *data); +static void _activenoti_reflesh(void *data); +static void _activenoti_create_activenoti(void *data); +static void _activenoti_win_rotated(void *data, int need_hide); +static void _activenoti_hide(void *data, int delay); +static void _activenoti_destroy_activenoti(); + + +QP_Module activenoti = { + .name = "activenoti", + .init = _activenoti_init, + .fini = _activenoti_fini, + .hib_enter = _activenoti_enter_hib, + .hib_leave = _activenoti_leave_hib, + .lang_changed = NULL, + .refresh = _activenoti_reflesh +}; + +static inline int _is_text_exist(const char *text) +{ + if (text != NULL) { + if (strlen(text) > 0) { + return 1; + } + } + + return 0; +} + +static int _is_sound_playable(void) { + int status = 0, ret = 0; + + ret = vconf_get_int(VCONFKEY_CAMERA_STATE, &status); + if (ret == 0 && status == VCONFKEY_CAMERA_STATE_RECORDING) { + ERR("camcorder is working, don't play notification sound %d %d", ret, status); + return 0; + } + return 1; +} + +static int _is_security_lockscreen_launched(void) +{ + int ret = 0; + int is_idle_lock = 0; + int lock_type = 0; + + ret = vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &is_idle_lock); + retif(ret != 0, 0,"failed to get VCONFKEY_IDLE_LOCK_STATE %d %d", ret, is_idle_lock); + + if (is_idle_lock == VCONFKEY_IDLE_LOCK ) { + DBG("Lock screen is launched"); + return 1; //don't show on lock screen + /* + ret = vconf_get_int(VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT, &lock_type); + retif(ret != 0, 0,"failed to get VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT %d %d", ret, lock_type); + if (lock_type != SETTING_SCREEN_LOCK_TYPE_NONE && lock_type != SETTING_SCREEN_LOCK_TYPE_SWIPE) { + return 1; + } + */ + } + + return 0; +} + +static Evas_Event_Flags __flick_end_cb(void *data, void *event_info) +{ + DBG(""); + Elm_Gesture_Line_Info *line_info = (Elm_Gesture_Line_Info *) event_info; + + DBG("line_info->momentum.my : %d", line_info->momentum.my); + + /* Flick Up */ + if (line_info->momentum.my < 0) + { + _activenoti_hide(NULL,0); + } + + return EVAS_EVENT_FLAG_ON_HOLD; +} + + +static Evas_Object *_gesture_create(Evas_Object *layout) +{ + Evas_Object *gesture_layer = NULL; + + INFO("gesture create"); + + gesture_layer = elm_gesture_layer_add(layout); + retif(!gesture_layer, NULL,); + elm_gesture_layer_attach(gesture_layer, layout); + evas_object_show(gesture_layer); + + elm_gesture_layer_cb_set(gesture_layer, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, __flick_end_cb, NULL); + + return gesture_layer; +} + +static int _check_sound_off(notification_h noti) +{ + char *pkgname = NULL; + + notification_get_pkgname(noti, &pkgname); + + //to do + + return 0; +} + + +static void _gesture_destroy() +{ + if (s_info.gesture) { + evas_object_del(s_info.gesture); + s_info.gesture = NULL; + } else { + ERR("s_info.gesture is NULL"); + } +} + +static inline void _activenoti_only_noti_del(notification_h noti) +{ + int applist = NOTIFICATION_DISPLAY_APP_ALL; + + retif(noti == NULL, ,"noti is null"); + + notification_get_display_applist(noti, &applist); +#ifdef HAVE_X + if (applist & NOTIFICATION_DISPLAY_APP_HEADS_UP) +#endif + { + if (!(applist & NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY)) { + char *pkgname = NULL; + int priv_id = 0; + + notification_get_pkgname(noti, &pkgname); + notification_get_id(noti, NULL, &priv_id); + notification_delete_by_priv_id(pkgname, + NOTIFICATION_TYPE_NONE, + priv_id); + } + } +} + + +static Eina_Bool _activenoti_hide_timer_cb(void *data) +{ + _activenoti_hide(NULL,0); + s_info.close_timer = NULL; + + if (s_info.delay_timer != NULL) { + ecore_timer_del(s_info.delay_timer); + s_info.delay_timer = NULL; + } + + return ECORE_CALLBACK_CANCEL; +} + + + +static void _activenoti_hide(void *data, int delay) +{ + if (delay == 1) { + if (s_info.delay_timer == NULL) { + s_info.delay_timer = ecore_timer_add(DELAY_TIMER_VALUE, _activenoti_hide_timer_cb, NULL); + } + } else { + if (s_info.delay_timer != NULL) { + ecore_timer_del(s_info.delay_timer); + s_info.delay_timer = NULL; + } + + if (s_info.close_timer != NULL) { + ecore_timer_del(s_info.close_timer); + s_info.close_timer = NULL; + } + + if (s_info.activenoti) { + evas_object_hide(s_info.activenoti); + } + } +} + + + +static void _activenoti_detail_show_cb(void *data, Evas *e, + Evas_Object *obj, + void *event_info) +{ + DBG(""); +} + +static Evas_Object *_activenoti_create_badge(Evas_Object *parent, + notification_h noti) +{ + char *pkgname = NULL; + char *icon_path = NULL; + char *icon_default = NULL; + Evas_Object *icon = NULL; + int ret = NOTIFICATION_ERROR_NONE; + + retif(noti == NULL || parent == NULL, NULL, "Invalid parameter!"); + + ret = notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB, &icon_path); + + if (ret == NOTIFICATION_ERROR_NONE && icon_path != NULL) { + DBG("icon_path : %s", icon_path); + icon = elm_image_add(parent); + elm_image_resizable_set(icon, EINA_TRUE, EINA_TRUE); + if ( elm_image_file_set(icon, icon_path, NULL) == EINA_FALSE) { + ERR("fail to set file[%s]", icon_path); + evas_object_del(icon); + icon = NULL; + free(icon_path); + return NULL; + } + } else { + /* + notification_get_pkgname(noti, &pkgname); + if (pkgname != NULL) { + INFO("pkgname : %s", pkgname); + icon_default = quickpanel_common_ui_get_pkginfo_icon(pkgname); + if (icon_default != NULL) { + elm_image_file_set(icon, icon_default, NULL); + free(icon_default); + } else { + return NULL; + } + } else { + return NULL; + } + */ + return NULL; + } + + free(icon_path); + return icon; +} + +static void _image_press_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + DBG(""); + + app_control_h app_control = data; + int ret = APP_CONTROL_ERROR_NONE; + + DBG(""); + if (app_control) { + char *app_id = NULL; + ret = app_control_get_app_id(app_control, &app_id); + + DBG("app_id : %s",app_id); + if (ret == APP_CONTROL_ERROR_NONE && app_id != NULL) { + ret = app_control_send_launch_request(app_control, NULL, NULL); + DBG("ret [%s]", ret); + free(app_id); + } + + } else { + ERR("app_control is NULL"); + } + + _activenoti_hide(NULL, 1); +} + + +static Evas_Object *_activenoti_create_icon(Evas_Object *parent, notification_h noti) +{ + char *pkgname = NULL; + char *icon_path = NULL; + char *thumb_path = NULL; + char *icon_default = NULL; + Evas_Object *icon = NULL; + retif(noti == NULL || parent == NULL, NULL, "Invalid parameter!"); + + notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_ICON, &icon_path); + notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, &thumb_path); + + icon = elm_image_add(parent); + elm_image_resizable_set(icon, EINA_TRUE, EINA_TRUE); + + if (icon_path == NULL + || (icon_path != NULL && elm_image_file_set(icon, icon_path, NULL) == EINA_FALSE)) { + DBG("icon_path : %s", icon_path); + + if (thumb_path == NULL + || (thumb_path != NULL && elm_image_file_set(icon, thumb_path, NULL) == EINA_FALSE)) { + DBG("thumb_path : %s", thumb_path); + + int ret = notification_get_pkgname(noti, &pkgname); + if (ret == NOTIFICATION_ERROR_NONE && pkgname != NULL) { + DBG("pkgname : %s", icon_default); + + icon_default = quickpanel_common_ui_get_pkginfo_icon(pkgname); + DBG("icon_default : %s", icon_default); + + if (icon_default == NULL + || ( icon_default != NULL && elm_image_file_set(icon, icon_default, NULL) == EINA_FALSE)) { + DBG("DEFAULT_ICON : %s", DEFAULT_ICON); + + if( elm_image_file_set(icon, DEFAULT_ICON, NULL) == EINA_FALSE) { + evas_object_del(icon); + icon = NULL; + } + } + } else { + if ( elm_image_file_set(icon, DEFAULT_ICON, NULL) == EINA_FALSE) { + evas_object_del(icon); + icon = NULL; + } + } + } + } + + if (icon != NULL) { + elm_object_signal_callback_add(parent, "image_press" , "", _image_press_cb, noti); + } + + free(icon_path); + free(thumb_path); + free(pkgname); + free(icon_default); + + return icon; +} + +static inline char *_get_text(notification_h noti, notification_text_type_e text_type) +{ + time_t time = 0; + char *text = NULL; + char buf[ACTIVENOTI_MSG_LEN] = {0,}; + if (notification_get_time_from_text(noti, text_type, &time) == NOTIFICATION_ERROR_NONE) { + if ((int)time > 0) { + quickpanel_noti_util_get_time(time, buf, sizeof(buf)); + text = buf; + } + } else { + notification_get_text(noti, text_type, &text); + } + + DBG("text : %s", text); + + if (text != NULL) { + return elm_entry_utf8_to_markup(text); + } + + + return NULL; +} + +static inline void _strbuf_add(Eina_Strbuf *str_buf, char *text, const char *delimiter) +{ + if (text != NULL) { + if (strlen(text) > 0) { + if (delimiter != NULL) { + eina_strbuf_append(str_buf, delimiter); + } + eina_strbuf_append(str_buf, text); + } + } +} + +static inline void _check_and_add_to_buffer(Eina_Strbuf *str_buf, char *text, int is_check_phonenumber) +{ + char buf_number[QP_UTIL_PHONE_NUMBER_MAX_LEN * 2] = { 0, }; + + if (text != NULL) { + if (strlen(text) > 0) { + if (quickpanel_common_util_is_phone_number(text) && is_check_phonenumber) { + quickpanel_common_util_phone_number_tts_make(buf_number, text, + (QP_UTIL_PHONE_NUMBER_MAX_LEN * 2) - 1); + eina_strbuf_append(str_buf, buf_number); + } else { + eina_strbuf_append(str_buf, text); + } + eina_strbuf_append_char(str_buf, '\n'); + } + } +} + +static char *_activenoti_get_label_layout_default(notification_h noti, int is_screenreader, char **subtitle, char **title, char **content) +{ + int len = 0; + char *domain = NULL; + char *dir = NULL; + const char *tmp = NULL; + char buf[ACTIVENOTI_MSG_LEN] = { 0, }; + + retif(noti == NULL, NULL, "Invalid parameter!"); + + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + if ( title != NULL ) { + *title = _get_text(noti, NOTIFICATION_TEXT_TYPE_TITLE); + } + + if ( content != NULL ) { + *content = _get_text(noti, NOTIFICATION_TEXT_TYPE_CONTENT); + } + + if ( subtitle != NULL ) { + *subtitle = _get_text(noti, NOTIFICATION_TEXT_TYPE_INFO_1); + } + + if (is_screenreader == 1) { + if (title == NULL && content == NULL) { + len = 0; + } else { + Eina_Strbuf *strbuf = eina_strbuf_new(); + if (strbuf != NULL) { + eina_strbuf_append(strbuf, _("IDS_QP_BUTTON_NOTIFICATION")); + eina_strbuf_append_char(strbuf, '\n'); + _check_and_add_to_buffer(strbuf, title, 1); + _check_and_add_to_buffer(strbuf, content, 1); + + if (eina_strbuf_length_get(strbuf) > 0) { + len = snprintf(buf, sizeof(buf) - 1, "%s", eina_strbuf_string_get(strbuf)); + } + eina_strbuf_free(strbuf); + } + } + + if (len > 0) { + return strdup(buf); + } + } + + return NULL; +} + + +static char *_activenoti_get_text(notification_h noti, int is_screenreader, char **subtitle, char **title, char **content) +{ + char *result = NULL; + result = _activenoti_get_label_layout_default(noti, is_screenreader, subtitle, title, content); + + return result; +} + +static void _noti_hide_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + _activenoti_hide(data, 0); +} + +static void _noti_press_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + DBG(""); + + notification_h noti = (notification_h) data; + int ret = APP_CONTROL_ERROR_NONE; + char *caller_pkgname = NULL; + bundle *responding_service_handle = NULL; + bundle *single_service_handle = NULL; + bundle *multi_service_handle = NULL; + int flags = 0, group_id = 0, priv_id = 0, count = 0, flag_launch = 0; + notification_type_e type = NOTIFICATION_TYPE_NONE; + + retif(noti == NULL, , "Invalid parameter!"); + + notification_get_pkgname(noti, &caller_pkgname); + notification_get_id(noti, &group_id, &priv_id); + notification_get_property(noti, &flags); + notification_get_type(noti, &type); + + if (flags & NOTIFICATION_PROP_DISABLE_APP_LAUNCH) { + flag_launch = 0; + } else { + flag_launch = 1; + } + + notification_get_execute_option(noti, NOTIFICATION_EXECUTE_TYPE_RESPONDING, NULL, &responding_service_handle); + notification_get_execute_option(noti, NOTIFICATION_EXECUTE_TYPE_SINGLE_LAUNCH, NULL, &single_service_handle); + notification_get_execute_option(noti, NOTIFICATION_EXECUTE_TYPE_MULTI_LAUNCH, NULL, &multi_service_handle); + + if (responding_service_handle != NULL) { + DBG("responding_service_handle : %s", responding_service_handle); + ret = quickpanel_uic_launch_app(NULL, responding_service_handle); + } else if (flag_launch == 1) { + char *text_count = NULL; + notification_get_text(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, &text_count); + + if (text_count != NULL) { + count = atoi(text_count); + } else { + count = 1; + } + + if (single_service_handle != NULL && multi_service_handle == NULL) { + DBG(""); + ret = quickpanel_uic_launch_app(NULL, single_service_handle); + } else if (single_service_handle == NULL && multi_service_handle != NULL) { + DBG(""); + ret = quickpanel_uic_launch_app(NULL, multi_service_handle); + } else if (single_service_handle != NULL && multi_service_handle != NULL) { + DBG(""); + if (count <= 1) { + ret = quickpanel_uic_launch_app(NULL, single_service_handle); + } else { + ret = quickpanel_uic_launch_app(NULL, multi_service_handle); + } + } else { //single_service_handle == NULL && multi_service_handle == NULL + DBG("there is no execution option in notification"); + } + quickpanel_uic_launch_app_inform_result(caller_pkgname, ret); + } + + _activenoti_hide(data , 1); + +} + + +static void _button_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + DBG(""); + app_control_h app_control = data; + Evas_Object *btn_img; + + msgif(app_control == NULL, , "Invalid parameter!"); + + btn_img = evas_object_data_get(obj, E_DATA_BTN_IMAGE); + + if (btn_img) { + evas_object_del(btn_img); + btn_img = NULL; + } + + if (app_control) { + app_control_destroy(app_control); + } +} + + +static void _button_press_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + app_control_h app_control = data; + int ret = APP_CONTROL_ERROR_NONE; + + if (app_control) { + char *app_id = NULL; + ret = app_control_get_app_id(app_control, &app_id); + + DBG("app_id : %s",app_id); + if (ret == APP_CONTROL_ERROR_NONE && app_id != NULL) { + ret = app_control_send_launch_request(app_control, NULL, NULL); + DBG("ret [%s]", ret); + free(app_id); + } + + } else { + ERR("app_control is NULL"); + } + + _activenoti_hide(NULL, 1); +} + + +static Evas_Object *_get_btn_img(Evas_Object *parent, notification_h noti, int btn_num) +{ + char *btn_path = NULL; + Evas_Object *btn_img = NULL; + retif(noti == NULL || parent == NULL, NULL, "Invalid parameter!"); + +#ifdef HAVE_X + notification_get_image(noti, btn_num + NOTIFICATION_IMAGE_TYPE_BUTTON_1, &btn_path); +#endif + + if (btn_path == NULL ){ + return NULL; + } + + btn_img = elm_image_add(parent); + evas_object_size_hint_weight_set(btn_img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn_img, EVAS_HINT_FILL, EVAS_HINT_FILL); + + if (btn_img) { + elm_image_resizable_set(btn_img, EINA_TRUE, EINA_TRUE); + if( elm_image_file_set(btn_img, btn_path, NULL) == EINA_FALSE) { + evas_object_del(btn_img); + btn_img = NULL; + return NULL; + } + } else { + return NULL; + } + + free(btn_path); + + return btn_img; +} + + +static Evas_Object *_get_bg_img(Evas_Object *parent, notification_h noti) +{ + char *bg_path = NULL; + Evas_Object *bg_img = NULL; + retif(noti == NULL || parent == NULL, NULL, "Invalid parameter!"); + + notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND, &bg_path); + + if (bg_path == NULL ){ + return NULL; + } + + bg_img = elm_image_add(parent); + evas_object_size_hint_weight_set(bg_img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bg_img, EVAS_HINT_FILL, EVAS_HINT_FILL); + + if (bg_img) { + elm_image_resizable_set(bg_img, EINA_TRUE, EINA_TRUE); + if( elm_image_file_set(bg_img, bg_path, NULL) == EINA_FALSE) { + evas_object_del(bg_img); + bg_img = NULL; + return NULL; + } + } else { + return NULL; + } + + free(bg_path); + + return bg_img; +} + + +static int _activenoti_create_button(Evas_Object *obj, notification_h noti) +{ + int btn_cnt= 0; + int ret = APP_CONTROL_ERROR_NONE; + app_control_h app_control = NULL; + + retif(obj == NULL, 0, "obj is NULL!"); + retif(noti == NULL, 0, "noti is NULL!"); + + if (s_info.btnbox) { //if exist, delete and create + evas_object_del(s_info.btnbox); + s_info.btnbox = NULL; + } + + Evas_Object *box; + box = elm_box_add(obj); + + if(box == NULL) { + ERR("box is null"); + return 0; + } + + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_show(box); + s_info.btnbox = box; + + for( btn_cnt = 0 ; btn_cnt <= 2 ; btn_cnt++) { + retif(ret != APP_CONTROL_ERROR_NONE, 0, "noapp_control_createti is failed!"); +#ifdef HAVE_X + ret = notification_get_event_handler(noti, btn_cnt + NOTIFICATION_EVENT_TYPE_CLICK_ON_BUTTON_1, &app_control); +#endif + if(ret != NOTIFICATION_ERROR_NONE || app_control == NULL) { + INFO("no more button, button count is %d", btn_cnt); + INFO("ret is %d", ret); + if (btn_cnt == 0) { // noti doesn't have button + if (app_control) { + app_control_destroy(app_control); + } + evas_object_del(s_info.btnbox); + s_info.btnbox = NULL; + return 0; + } + break; + } else { + Evas_Object *bt_layout; + char *btn_text; + Evas_Object *image; + + bt_layout = elm_layout_add(s_info.btnbox); + if(bt_layout == NULL) { + ERR("bt_layout is null"); + if (app_control) { + app_control_destroy(app_control); + } + evas_object_del(s_info.btnbox); + s_info.btnbox = NULL; + return 0; + } + + elm_layout_file_set(bt_layout, ACTIVENOTI_EDJ, "button_layout"); + evas_object_size_hint_weight_set (bt_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(bt_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + + image = _get_btn_img(bt_layout , noti, btn_cnt); + if (image != NULL) { + elm_object_part_content_set(bt_layout, "content.button.image", image); + evas_object_data_set(bt_layout, E_DATA_BTN_IMAGE, image); + } + +#ifdef HAVE_X + btn_text = _get_text(noti, btn_cnt + NOTIFICATION_TEXT_TYPE_BUTTON_1); +#endif + if (btn_text != NULL) { + DBG("btn_text :%s", btn_text); + elm_object_part_text_set(bt_layout, "content.button.text", btn_text); + free(btn_text); + } + + elm_object_signal_callback_add(bt_layout, "button_clicked" , "", _button_press_cb, app_control); + evas_object_event_callback_add(bt_layout, EVAS_CALLBACK_DEL, _button_del_cb, app_control); + evas_object_show(bt_layout); + elm_box_pack_end(s_info.btnbox,bt_layout); + } + } + elm_object_part_content_set(obj, "button.swallow", s_info.btnbox); + return btn_cnt; +} + +static void _activenoti_update_activenoti(void *data) +{ + DBG(""); + Eina_Bool ret = EINA_FALSE; + notification_h noti = (notification_h) data; + Evas_Object *icon = NULL; + Evas_Object *badge = NULL; + + Evas_Object *textblock = NULL; + char *title = NULL; + char *subtitle = NULL; + char *content = NULL; + int btn_cnt = 0; + + retif(noti == NULL, , "Invalid parameter!"); + + if (s_info.activenoti == NULL) { + ERR("Active notification doesn't exist"); + return; + } + + btn_cnt = _activenoti_create_button(s_info.layout, noti); + + if (btn_cnt == 0) { //no button + elm_object_signal_emit(s_info.layout, "btn_hide", "button.space"); + } else { + elm_object_signal_emit(s_info.layout, "btn_show", "button.space"); + } + + icon = elm_object_part_content_get(s_info.layout, "icon_big"); + if(icon != NULL) { + evas_object_del(icon); + icon = NULL; + } + + icon = _activenoti_create_icon(s_info.layout, noti); + if (icon != NULL) { + elm_object_part_content_set(s_info.layout, "icon_big", icon); + + badge = elm_object_part_content_get(s_info.layout, "icon_badge"); + if(badge != NULL) { + evas_object_del(badge); + badge = NULL; + } + + badge = _activenoti_create_badge(s_info.layout, noti); + if (badge != NULL) { + elm_object_part_content_set(s_info.layout, "icon_badge", badge); + } else { + INFO("badge is NULL"); + } + } else { + INFO("icon is NULL"); + } + _activenoti_get_text(noti, 0, &subtitle, &title, &content); + + if (title != NULL) { + Eina_Strbuf *bufferT = eina_strbuf_new(); + eina_strbuf_append(bufferT, title); + eina_strbuf_append(bufferT, "<b/>"); + elm_object_part_text_set(s_info.layout, "title_text", eina_strbuf_string_get(bufferT)); + free(title); + eina_strbuf_free(bufferT); + } + + if (subtitle != NULL) { + Eina_Strbuf *bufferST = eina_strbuf_new(); + eina_strbuf_append(bufferST, subtitle); + elm_object_part_text_set(s_info.layout, "subtitle_text", eina_strbuf_string_get(bufferST)); + free(subtitle); + eina_strbuf_free(bufferST); + elm_object_signal_emit(s_info.layout, "sub_show", "subtitle_text"); + } else { + elm_object_signal_emit(s_info.layout, "sub_hide", "subtitle_text"); + } + + if (content != NULL) { + Eina_Strbuf *bufferC = eina_strbuf_new(); + eina_strbuf_append(bufferC, content); + elm_object_part_text_set(s_info.layout, "content_text", eina_strbuf_string_get(bufferC)); + free(content); + eina_strbuf_free(bufferC); + } + + + if (s_info.close_timer != NULL) { + ecore_timer_del(s_info.close_timer); + s_info.close_timer = NULL; + } + + s_info.close_timer = ecore_timer_add(DEL_TIMER_VALUE, _activenoti_hide_timer_cb, NULL); + evas_object_show(s_info.activenoti); + + SERR("activenoti noti is updated"); +} + +static void _activenoti_create_activenoti(void *data) +{ + DBG(""); + Eina_Bool ret = EINA_FALSE; + notification_h noti = (notification_h) data; + Evas_Object *icon = NULL; + Evas_Object *badge = NULL; + Evas_Object *bg_img = NULL; + + + Evas_Object *textblock = NULL; + char *title = NULL; + char *subtitle = NULL; + char *content = NULL; + int *is_activenoti_executed = NULL; + int btn_cnt = 0; + + retif(noti == NULL, , "Invalid parameter!"); + + if (s_info.activenoti != NULL) { + ERR("Instant notification exists"); + return; + } + + s_info.activenoti = quickpanel_noti_win_add(NULL); + retif(s_info.activenoti == NULL, , "Failed to add elm activenoti."); + evas_object_data_set(s_info.activenoti, E_DATA_NOTI, noti); + + s_info.layout = elm_layout_add(s_info.activenoti); + if (!s_info.layout) { + ERR("Failed to get detailview."); + _activenoti_hide(s_info.activenoti, 0); + return; + } + + ret = elm_layout_file_set(s_info.layout, ACTIVENOTI_EDJ, "headsup/base"); + retif(ret == EINA_FALSE, , "failed to load layout"); + evas_object_show(s_info.layout); + + elm_object_signal_callback_add(s_info.layout, "noti_press" , "", _noti_press_cb, noti); + elm_object_signal_callback_add(s_info.layout, "del" , "", _noti_hide_cb, noti); + + bg_img = _get_bg_img(s_info.layout , noti); + if (bg_img != NULL) { + elm_object_part_content_set(s_info.layout, "bg_img", bg_img); + evas_object_data_set(s_info.activenoti, E_DATA_BG_IMAGE, bg_img); + } + + btn_cnt = _activenoti_create_button(s_info.layout, noti); + + if (btn_cnt == 0) { //no button + elm_object_signal_emit(s_info.layout, "btn_hide", "button.space"); + } + + quickpanel_noti_win_content_set(s_info.activenoti, s_info.layout, btn_cnt); + + icon = _activenoti_create_icon(s_info.layout, noti); + if (icon != NULL) { + elm_object_part_content_set(s_info.layout, "icon_big", icon); + evas_object_data_set(s_info.activenoti, E_DATA_ICON, icon); + + badge = _activenoti_create_badge(s_info.layout, noti); + if (badge != NULL) { + elm_object_part_content_set(s_info.layout, "icon_badge", badge); + evas_object_data_set(s_info.activenoti, E_DATA_BADGE, icon); + } else { + INFO("badge is NULL"); + } + } else { + INFO("icon is NULL"); + } + _activenoti_get_text(noti, 0, &subtitle, &title, &content); + + if (title != NULL) { + Eina_Strbuf *bufferT = eina_strbuf_new(); + eina_strbuf_append(bufferT, title); + elm_object_part_text_set(s_info.layout, "title_text", eina_strbuf_string_get(bufferT)); + free(title); + eina_strbuf_free(bufferT); + } + + + if (subtitle != NULL) { + Eina_Strbuf *bufferST = eina_strbuf_new(); + eina_strbuf_append(bufferST, subtitle); + elm_object_part_text_set(s_info.layout, "subtitle_text", eina_strbuf_string_get(bufferST)); + free(subtitle); + eina_strbuf_free(bufferST); + elm_object_signal_emit(s_info.layout, "subtext_show", "subtitle_text"); + } + + if (content != NULL) { + Eina_Strbuf *bufferC = eina_strbuf_new(); + eina_strbuf_append(bufferC, content); + elm_object_part_text_set(s_info.layout, "content_text", eina_strbuf_string_get(bufferC)); + free(content); + eina_strbuf_free(bufferC); + } + + SERR("activenoti noti is created"); + + s_info.gesture = _gesture_create(s_info.layout); + _activenoti_win_rotated(data, 0); + + if (s_info.close_timer != NULL) { + ecore_timer_del(s_info.close_timer); + s_info.close_timer = NULL; + } + + s_info.close_timer = ecore_timer_add(DEL_TIMER_VALUE, _activenoti_hide_timer_cb, NULL); + + evas_object_show(s_info.activenoti); + SERR("show activenoti noti"); +} + +static void _activenoti_destroy_activenoti() +{ + Evas_Object *bg; + Evas_Object *icon; + Evas_Object *badge; + notification_h noti; + + retif(!s_info.activenoti,,"s_info->activenoti is null"); + + _gesture_destroy(); + + DBG("_activenoti_destroy_activenoti"); + + if (s_info.delay_timer != NULL) { + ecore_timer_del(s_info.delay_timer); + s_info.delay_timer = NULL; + } + + if (s_info.close_timer != NULL) { + ecore_timer_del(s_info.close_timer); + s_info.close_timer = NULL; + } + + bg = evas_object_data_del(s_info.activenoti, E_DATA_BG_IMAGE); + if (bg) { + evas_object_del(bg); + } + + icon = evas_object_data_del(s_info.activenoti, E_DATA_ICON); + if (icon) { + evas_object_del(icon); + } + + badge = evas_object_data_del(s_info.activenoti, E_DATA_BADGE); + if (badge) { + evas_object_del(badge); + } + + if (s_info.btnbox) { + evas_object_del(s_info.btnbox); + s_info.btnbox = NULL; + } + + if (s_info.layout) { + evas_object_del(s_info.layout); + s_info.layout = NULL; + } + + noti = evas_object_data_del(s_info.activenoti, E_DATA_NOTI); + if (noti) { + _activenoti_only_noti_del(noti); + notification_free(noti); + } + if (s_info.activenoti) { + evas_object_hide(s_info.activenoti); + s_info.activenoti = NULL; + } +} + +static void _activenoti_win_rotated(void *data, int need_hide) +{ + int angle = 0; + retif(data == NULL, ,"data is NULL"); + struct appdata *ad = data; + + if (s_info.activenoti != NULL) { + angle = elm_win_rotation_get(s_info.activenoti); + + if (((angle == 0 || angle == 180) && (ad->angle == 90 || ad->angle == 270)) + || ((angle == 90 || angle == 270) && (ad->angle == 0 || ad->angle == 180))) { + if (need_hide == 1) { + evas_object_hide(s_info.activenoti); + } + } + } +} + +static void _media_feedback_sound(notification_h noti) +{ + int ret = 0, priv_id = 0; + const char *nsound_path = NULL; + notification_sound_type_e nsound_type = NOTIFICATION_SOUND_TYPE_NONE; + char *default_msg_tone = NULL; + retif(noti == NULL, ,"op_list is NULL"); + + notification_get_id(noti, NULL, &priv_id); + notification_get_sound(noti, &nsound_type, &nsound_path); + SDBG("notification sound: %d, %s", nsound_type, nsound_path); + + switch (nsound_type) { + case NOTIFICATION_SOUND_TYPE_USER_DATA: + /* + * if user data file isn't playable, play the default ringtone + */ + if (nsound_path != NULL) { + if (quickpanel_media_playable_check(nsound_path) == EINA_TRUE) { + ret = quickpanel_media_player_play(SOUND_TYPE_NOTIFICATION, nsound_path); + if (quickpanel_media_player_is_drm_error(ret) == 1) { + ERR("failed to play notification sound due to DRM problem"); +#ifdef HAVE_X + ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_SOUND_NOTIFICATION, &default_msg_tone); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "ailed to get key(%s) : %d", SYSTEM_SETTINGS_KEY_SOUND_NOTIFICATION, ret); +#endif + + + if (default_msg_tone != NULL) { + SDBG("setting sound[%s]", default_msg_tone); + ret = quickpanel_media_player_play(SOUND_TYPE_NOTIFICATION, default_msg_tone); + free(default_msg_tone); + } + } + if (ret == PLAYER_ERROR_NONE) { + quickpanel_media_player_id_set(priv_id); + } else { + ERR("failed to play notification sound"); + } + break; + } else { + ERR("playable false, So unlock tone"); + feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_UNLOCK); + } + } else { + ERR("sound path null"); + } + + break; + case NOTIFICATION_SOUND_TYPE_DEFAULT: +#ifdef HAVE_X + ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_SOUND_NOTIFICATION, &default_msg_tone); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "ailed to get key(%s) : %d", SYSTEM_SETTINGS_KEY_SOUND_NOTIFICATION, ret); +#endif + if (default_msg_tone != NULL) { + SDBG("Reminded setting sound[%s]", default_msg_tone); + ret = quickpanel_media_player_play(SOUND_TYPE_NOTIFICATION, default_msg_tone); + free(default_msg_tone); + if (ret == PLAYER_ERROR_NONE) { + quickpanel_media_player_id_set(priv_id); + } else { + ERR("failed to play notification sound(default)"); + } + } + break; + case NOTIFICATION_SOUND_TYPE_MAX: + case NOTIFICATION_SOUND_TYPE_NONE: + ERR("None type: No sound"); + break; + + default: + ERR("UnKnown type[%d]", (int)nsound_type); + break; + } +} + +static void _media_feedback_vibration(notification_h noti) +{ + retif(noti == NULL, ,"op_list is NULL"); + + /* Play Vibration */ + notification_vibration_type_e nvibration_type = NOTIFICATION_VIBRATION_TYPE_NONE; + const char *nvibration_path = NULL; + + notification_get_vibration(noti, &nvibration_type, &nvibration_path); + DBG("notification vibration: %d, %s", nvibration_type, nvibration_path); + switch (nvibration_type) { + case NOTIFICATION_VIBRATION_TYPE_USER_DATA: + case NOTIFICATION_VIBRATION_TYPE_DEFAULT: + feedback_play_type(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_MESSAGE); + break; + case NOTIFICATION_VIBRATION_TYPE_MAX: + case NOTIFICATION_VIBRATION_TYPE_NONE: + break; + } +} + +static void _activenoti_noti_detailed_changed_cb(void *data, notification_type_e type, notification_op *op_list, int num_op) +{ + notification_h noti = NULL; + notification_h noti_from_master = NULL; + int flags = 0; + int applist = NOTIFICATION_DISPLAY_APP_ALL; + int ret = 0; + int op_type = 0; + int priv_id = 0; + + DBG("_quickpanel_activenoti_noti_changed_cb"); + + retif(op_list == NULL, ,"op_list is NULL"); + + if (num_op == 1) { + notification_op_get_data(op_list, NOTIFICATION_OP_DATA_TYPE, &op_type); + notification_op_get_data(op_list, NOTIFICATION_OP_DATA_PRIV_ID, &priv_id); + notification_op_get_data(op_list, NOTIFICATION_OP_DATA_NOTI, ¬i_from_master); + DBG("op_type:%d", op_type); + DBG("op_priv_id:%d", priv_id); + DBG("noti:%p", noti_from_master); + + if (op_type != NOTIFICATION_OP_INSERT && + op_type != NOTIFICATION_OP_UPDATE) { + return; + } + if (noti_from_master == NULL) { + ERR("failed to get a notification from master"); + return; + } + if (notification_clone(noti_from_master, ¬i) != NOTIFICATION_ERROR_NONE) { + ERR("failed to create a cloned notification"); + return; + } +#ifdef QP_EMERGENCY_MODE_ENABLE + if (quickpanel_emergency_mode_is_on()) { + if (quickpanel_emergency_mode_notification_filter(noti, 1)) { + DBG("notification filtered"); + notification_free(noti); + return; + } + } +#endif + } + + retif(noti == NULL, ,"noti is NULL"); + + if (op_type == NOTIFICATION_OP_INSERT || op_type == NOTIFICATION_OP_UPDATE) { + if (_is_sound_playable() == 1) { + if (_check_sound_off(noti) == 0) { + DBG("try to play notification sound"); + _media_feedback_sound(noti); + } + if (quickpanel_media_is_vib_enabled() == 1 + || quickpanel_media_is_sound_enabled() == 1) { + _media_feedback_vibration(noti); + } + } + } + + notification_get_display_applist(noti, &applist); + + /* Check activenoti flag */ + notification_get_property(noti, &flags); + + DBG("applist : %x" ,applist); + +#ifdef HAVE_X + if (applist & NOTIFICATION_DISPLAY_APP_HEADS_UP) +#endif + { + if (_is_security_lockscreen_launched()) { + notification_free(noti); + INFO("lock screen is launched"); + return; + } + + if (quickpanel_uic_is_opened()) { + ERR("quickpanel is opened, activenoti will be not displayed"); + notification_free(noti); + INFO("quickpanel has opened"); + return; + } + + /* wait if s_info.activenoti is not NULL */ + if (s_info.activenoti == NULL) { + _activenoti_create_activenoti(noti); + } else { + INFO("s_info.activenoti is not NULL"); + _activenoti_update_activenoti(noti); + } + + if (s_info.activenoti == NULL) { + ERR("Fail to create activenoti"); + _activenoti_only_noti_del(noti); + notification_free(noti); + return; + } + } +} + +/***************************************************************************** + * + * Util functions + * + *****************************************************************************/ +static Eina_Bool _activenoti_callback_register_idler_cb(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, EINA_FALSE, "Invalid parameter!"); + + notification_register_detailed_changed_cb(_activenoti_noti_detailed_changed_cb, ad); + + return EINA_FALSE; +} + +static int _activenoti_init(void *data) +{ + struct appdata *ad = (struct appdata *)data; + + /* Register notification changed cb */ + ecore_idler_add(_activenoti_callback_register_idler_cb, ad); + return QP_OK; +} + +static int _activenoti_fini(void *data) +{ + struct appdata *ad = (struct appdata *)data; + + _activenoti_destroy_activenoti(); + + return QP_OK; +} + +static int _activenoti_enter_hib(void *data) +{ + return QP_OK; +} + +static int _activenoti_leave_hib(void *data) +{ + return QP_OK; +} + +static void _activenoti_reflesh(void *data) +{ + retif(data == NULL, , "Invalid parameter!"); + + if (s_info.activenoti != NULL) { + _activenoti_win_rotated(data, 1); + } +} diff --git a/daemon/notifications/animated_image.c b/daemon/notifications/animated_image.c index 45024fe..a8b8c98 100755 --- a/daemon/notifications/animated_image.c +++ b/daemon/notifications/animated_image.c @@ -1,37 +1,40 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.tizenopensource.org/license + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 "animated_image.h" -static int quickpanel_animated_image_init(void *data); -static int quickpanel_animated_image_fini(void *data); -static int quickpanel_animated_image_suspend(void *data); -static int quickpanel_animated_image_resume(void *data); +static int _init(void *data); +static int _fini(void *data); +static int _suspend(void *data); +static int _resume(void *data); QP_Module animated_image = { .name = "animated_image", - .init = quickpanel_animated_image_init, - .fini = quickpanel_animated_image_fini, - .suspend = quickpanel_animated_image_suspend, - .resume = quickpanel_animated_image_resume, + .init = _init, + .fini = _fini, + .suspend = _suspend, + .resume = _resume, .lang_changed = NULL, .refresh = NULL }; static Eina_List *g_animated_image_list = NULL; +static char g_animated_image_group_name[32] = {0,}; static void _animated_image_list_add(Evas_Object *image) { @@ -46,10 +49,12 @@ static void _animated_image_play(Eina_Bool on) const Eina_List *ln = NULL; Evas_Object *entry_obj = NULL; - retif(g_animated_image_list == NULL, ,"list is empty"); + retif_nomsg(g_animated_image_list == NULL, ); EINA_LIST_FOREACH_SAFE(g_animated_image_list, l, ln, entry_obj) { - if (entry_obj == NULL) continue; + if (entry_obj == NULL) { + continue; + } if (on == EINA_TRUE) { if (elm_image_animated_play_get(entry_obj) == EINA_FALSE) { @@ -71,12 +76,13 @@ static void _animated_image_deleted_cb(void *data, Evas *e, Evas_Object *obj, vo g_animated_image_list = eina_list_remove(g_animated_image_list, obj); } -HAPI void quickpanel_animated_image_add(Evas_Object *image) { +HAPI void quickpanel_animated_image_add(Evas_Object *image) +{ retif(image == NULL, , "image is NULL"); if (elm_image_animated_available_get(image) == EINA_TRUE) { elm_image_animated_set(image, EINA_TRUE); - if (quickpanel_is_suspended() == 0) { + if (quickpanel_uic_is_suspended() == 0) { elm_image_animated_play_set(image, EINA_TRUE); } else { elm_image_animated_play_set(image, EINA_FALSE); @@ -86,38 +92,54 @@ HAPI void quickpanel_animated_image_add(Evas_Object *image) { } } +HAPI char *quickpanel_animated_image_get_groupname(const char *path) +{ + static int s_image_index = 0; + + if (path != NULL) { + if (strstr(path, "gif") != NULL || strstr(path, "GIF") != NULL) { + snprintf(g_animated_image_group_name, sizeof(g_animated_image_group_name), + "%d:EVAS", s_image_index++); + + return g_animated_image_group_name; + } + } + + return NULL; +} + /***************************************************************************** * * Util functions * *****************************************************************************/ -static int quickpanel_animated_image_init(void *data) +static int _init(void *data) { return QP_OK; } -static int quickpanel_animated_image_fini(void *data) +static int _fini(void *data) { return QP_OK; } -static int quickpanel_animated_image_suspend(void *data) +static int _suspend(void *data) { struct appdata *ad = data; retif(ad == NULL, QP_FAIL, "Invalid parameter!"); - INFO("animated image going to be suspened"); + SDBG("animated image going to be suspened"); _animated_image_play(EINA_FALSE); return QP_OK; } -static int quickpanel_animated_image_resume(void *data) +static int _resume(void *data) { struct appdata *ad = data; retif(ad == NULL, QP_FAIL, "Invalid parameter!"); - INFO("animated image going to be resumed"); + SDBG("animated image going to be resumed"); _animated_image_play(EINA_TRUE); return QP_OK; diff --git a/daemon/notifications/animated_image.h b/daemon/notifications/animated_image.h index 8f61414..bfdadea 100755 --- a/daemon/notifications/animated_image.h +++ b/daemon/notifications/animated_image.h @@ -1,25 +1,29 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.tizenopensource.org/license + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 __QUICKPANEL_ANIMATED_IMAGE_H__ #define __QUICKPANEL_ANIMATED_IMAGE_H__ #include "quickpanel-ui.h" #include "common.h" -HAPI void quickpanel_animated_image_add(Evas_Object *image); +void quickpanel_animated_image_add(Evas_Object *image); +char *quickpanel_animated_image_get_groupname(const char *path); #endif diff --git a/daemon/notifications/noti.c b/daemon/notifications/noti.c index dddc98f..92ee4d6 100755 --- a/daemon/notifications/noti.c +++ b/daemon/notifications/noti.c @@ -1,87 +1,133 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 <appsvc.h> #include <time.h> #include <vconf.h> #include <appcore-common.h> -#include <app_service.h> -#include <Ecore_X.h> +#include <app_control.h> #include <notification.h> +#include <system_settings.h> #include "quickpanel-ui.h" #include "quickpanel_def.h" #include "common.h" +#include "list_util.h" #include "noti_node.h" #include "noti_gridbox.h" #include "noti_box.h" #include "noti_listbox.h" #include "noti_list_item.h" #include "noti_section.h" +#include "noti_view.h" #include "noti.h" #include "list_util.h" +#ifdef QP_SMART_ALERT_ENABLE +#include "smart_alert.h" +#endif #ifdef QP_SERVICE_NOTI_LED_ENABLE #include "noti_led.h" #endif - -#ifndef VCONFKEY_QUICKPANEL_STARTED -#define VCONFKEY_QUICKPANEL_STARTED "memory/private/"PACKAGE_NAME"/started" -#endif /* VCONFKEY_QUICKPANEL_STARTED */ +#ifdef QP_REMINDER_ENABLE +#include "reminder.h" +#endif +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif +#include "vi_manager.h" #define QP_NOTI_ONGOING_DBUS_PATH "/dbus/signal" #define QP_NOTI_ONGOING_DBUS_INTERFACE "notification.ongoing" -static noti_node *g_noti_node; -static Evas_Object *g_noti_section; -static Evas_Object *g_noti_listbox; -static Evas_Object *g_noti_gridbox; +static struct _info { + noti_node *noti_node; + Evas_Object *ongoing_noti_section_view; + Evas_Object *noti_section_view; + Evas_Object *noti_box; + + E_DBus_Signal_Handler *dbus_handler_size; + E_DBus_Signal_Handler *dbus_handler_progress; + E_DBus_Signal_Handler *dbus_handler_content; + + struct tm last_time; + + int is_ongoing_hided; +} s_info = { + .noti_node = NULL, + .ongoing_noti_section_view = NULL, + .noti_section_view = NULL, + .noti_box = NULL, + + .dbus_handler_size = NULL, + .dbus_handler_progress = NULL, + .dbus_handler_content = NULL, + + .is_ongoing_hided = 0, -static int quickpanel_noti_init(void *data); -static int quickpanel_noti_fini(void *data); -static int quickpanel_noti_suspend(void *data); -static int quickpanel_noti_resume(void *data); -static void quickpanel_noti_lang_changed(void *data); -static void quickpanel_noti_refresh(void *data); + .last_time.tm_mday = 0, + .last_time.tm_mon = 0, + .last_time.tm_year = 0, +}; + +static int _init(void *data); +static int _fini(void *data); +static int _suspend(void *data); +static int _resume(void *data); +static void _lang_changed(void *data); +static void _refresh(void *data); + +static void _ongoing_noti_section_add(void); +static void _opened(void *data); +//static void _quickpanel_ongoing_noti_section_remove(void); + +static void _noti_time_init(void *data); +static void _noti_time_fini(void *data); QP_Module noti = { .name = "noti", - .init = quickpanel_noti_init, - .fini = quickpanel_noti_fini, - .suspend = quickpanel_noti_suspend, - .resume = quickpanel_noti_resume, - .lang_changed = quickpanel_noti_lang_changed, + .init = _init, + .fini = _fini, + .suspend = _suspend, + .resume = _resume, + .lang_changed = _lang_changed, .hib_enter = NULL, .hib_leave = NULL, - .refresh = quickpanel_noti_refresh, + .refresh = _refresh, .get_height = NULL, + .qp_opened = _opened, }; -static notification_h _quickpanel_noti_update_item_progress(const char *pkgname, +static notification_h _update_item_progress(const char *pkgname, int priv_id, double progress) { char *noti_pkgname = NULL; int noti_priv_id = 0; - noti_node_item *node = noti_node_get(g_noti_node, priv_id); + noti_node_item *node = quickpanel_noti_node_get(s_info.noti_node, priv_id); if (node != NULL && node->noti != NULL) { notification_get_pkgname(node->noti, ¬i_pkgname); notification_get_id(node->noti, NULL, ¬i_priv_id); + + if (!pkgname || !noti_pkgname) { + return NULL; + } + if (!strcmp(noti_pkgname, pkgname) && priv_id == noti_priv_id) { @@ -95,18 +141,23 @@ static notification_h _quickpanel_noti_update_item_progress(const char *pkgname, return NULL; } -static notification_h _quickpanel_noti_update_item_size(const char *pkgname, +static notification_h _update_item_size(const char *pkgname, int priv_id, double size) { char *noti_pkgname = NULL; int noti_priv_id = 0; - noti_node_item *node = noti_node_get(g_noti_node, priv_id); + noti_node_item *node = quickpanel_noti_node_get(s_info.noti_node, priv_id); if (node != NULL && node->noti != NULL) { notification_get_pkgname(node->noti, ¬i_pkgname); notification_get_id(node->noti, NULL, ¬i_priv_id); + + if (!pkgname || !noti_pkgname) { + return NULL; + } + if (!strcmp(noti_pkgname, pkgname) && priv_id == noti_priv_id) { notification_set_size(node->noti, size); @@ -117,24 +168,30 @@ static notification_h _quickpanel_noti_update_item_size(const char *pkgname, return NULL; } -static notification_h _quickpanel_noti_update_item_content(const char *pkgname, +static notification_h _update_item_content(const char *pkgname, int priv_id, char *content) { char *noti_pkgname = NULL; int noti_priv_id = 0; + int ret = NOTIFICATION_ERROR_NONE; - noti_node_item *node = noti_node_get(g_noti_node, priv_id); + noti_node_item *node = quickpanel_noti_node_get(s_info.noti_node, priv_id); if (node != NULL && node->noti != NULL) { notification_get_pkgname(node->noti, ¬i_pkgname); notification_get_id(node->noti, NULL, ¬i_priv_id); - if (!strcmp(noti_pkgname, pkgname) - && priv_id == noti_priv_id) { - notification_set_text(node->noti, - NOTIFICATION_TEXT_TYPE_CONTENT, - content, NULL, - NOTIFICATION_VARIABLE_TYPE_NONE); + + if (!pkgname || !noti_pkgname) { + return NULL; + } + + if (!strcmp(noti_pkgname, pkgname) && priv_id == noti_priv_id) { + ret = notification_set_text(node->noti, NOTIFICATION_TEXT_TYPE_CONTENT, content, NULL, NOTIFICATION_VARIABLE_TYPE_NONE); + if (ret != NOTIFICATION_ERROR_NONE) { + ERR("Failed to set text[%d]", ret); + } + return node->noti; } } @@ -142,35 +199,25 @@ static notification_h _quickpanel_noti_update_item_content(const char *pkgname, return NULL; } -static void _quickpanel_noti_update_progressbar(void *data, +static void _update_progressbar(void *data, notification_h update_noti) { - struct appdata *ad = NULL; - Elm_Object_Item *found = NULL; - noti_node_item *node = NULL; - - retif(!data, , "data is NULL"); - ad = data; - - retif(!ad->list, , "ad->list is NULL"); - int priv_id = 0; + struct appdata *ad = data; + noti_node_item *node = NULL; + retif(ad == NULL, , "data is NULL"); + retif(ad->list == NULL, , "ad->list is NULL"); if (notification_get_id(update_noti, NULL, &priv_id) == NOTIFICATION_ERROR_NONE) { - node = noti_node_get(g_noti_node, priv_id); - - if (node != NULL) { - found = node->view; - } + node = quickpanel_noti_node_get(s_info.noti_node, priv_id); } - retif(node == NULL, , "fail to find node of priv_id:%d", priv_id); retif(node->view == NULL, , "fail to find %p", node->view); - listbox_update_item(g_noti_listbox, node->view); + quickpanel_noti_listbox_update_item(ad->list, node->view); } -static void _quickpanel_noti_item_progress_update_cb(void *data, +static void _item_progress_update_cb(void *data, DBusMessage *msg) { DBusError err; @@ -200,17 +247,16 @@ static void _quickpanel_noti_item_progress_update_cb(void *data, } /* check item on the list */ - noti = _quickpanel_noti_update_item_progress(pkgname, + noti = _update_item_progress(pkgname, priv_id, progress); retif(noti == NULL, , "Can not found noti data."); - DBG("pkgname[%s], priv_id[%d], progress[%lf]", + SDBG("pkgname[%s], priv_id[%d], progress[%lf]", pkgname, priv_id, progress); - if (!quickpanel_is_suspended()) - _quickpanel_noti_update_progressbar(data, noti); + _update_progressbar(data, noti); } -static void _quickpanel_noti_item_size_update_cb(void *data, DBusMessage * msg) +static void _item_size_update_cb(void *data, DBusMessage * msg) { DBusError err; char *pkgname = 0; @@ -237,17 +283,16 @@ static void _quickpanel_noti_item_size_update_cb(void *data, DBusMessage * msg) } /* check item on the list */ - noti = _quickpanel_noti_update_item_size(pkgname, priv_id, size); + noti = _update_item_size(pkgname, priv_id, size); retif(noti == NULL, , "Can not found noti data."); - DBG("pkgname[%s], priv_id[%d], progress[%lf]", + SDBG("pkgname[%s], priv_id[%d], progress[%lf]", pkgname, priv_id, size); - if (!quickpanel_is_suspended()) - _quickpanel_noti_update_progressbar(data, noti); + _update_progressbar(data, noti); } -static void _quickpanel_noti_item_content_update_cb(void *data, +static void _item_content_update_cb(void *data, DBusMessage *msg) { DBusError err; @@ -279,53 +324,59 @@ static void _quickpanel_noti_item_content_update_cb(void *data, return; } - DBG("pkgname[%s], priv_id[%d], content[%s]", + SDBG("pkgname[%s], priv_id[%d], content[%s]", pkgname, priv_id, content); /* check item on the list */ - noti = _quickpanel_noti_update_item_content(pkgname, priv_id, content); + noti = _update_item_content(pkgname, priv_id, content); retif(noti == NULL, , "Can not found noti data."); - if (!quickpanel_is_suspended()) - _quickpanel_noti_update_progressbar(data, noti); + _update_progressbar(data, noti); } -static void _quickpanel_do_noti_delete(notification_h noti) { +static int _do_noti_delete(notification_h noti) +{ char *pkgname = NULL; char *caller_pkgname = NULL; int flags = 0, priv_id = 0, flag_delete = 0; notification_type_e type = NOTIFICATION_TYPE_NONE; + int ret = NOTIFICATION_ERROR_INVALID_PARAMETER; - quickpanel_play_feedback(); + quickpanel_media_play_feedback(); - retif(noti == NULL, , "Invalid parameter!"); + retif(noti == NULL, NOTIFICATION_ERROR_INVALID_PARAMETER, "Invalid parameter!"); notification_get_pkgname(noti, &caller_pkgname); - notification_get_application(noti, &pkgname); - if (pkgname == NULL) +// notification_get_application(noti, &pkgname); + if (pkgname == NULL) { pkgname = caller_pkgname; + } notification_get_id(noti, NULL, &priv_id); notification_get_property(noti, &flags); notification_get_type(noti, &type); - if (flags & NOTIFICATION_PROP_PERMANENT_DISPLAY) + if (flags & NOTIFICATION_PROP_PERMANENT_DISPLAY) { flag_delete = 0; - else + } else { flag_delete = 1; + } if (flag_delete == 1 && type == NOTIFICATION_TYPE_NOTI) { - notification_delete_by_priv_id(caller_pkgname, NOTIFICATION_TYPE_NOTI, + ret = notification_delete_by_priv_id(caller_pkgname, NOTIFICATION_TYPE_NOTI, priv_id); } + + return ret; } -static void _quickpanel_do_noti_press(notification_h noti, int pressed_area) { - int ret = -1; +static void _do_noti_press(notification_h noti, int pressed_area) +{ + DBG("launch app"); + int ret = APP_CONTROL_ERROR_NONE; char *pkgname = NULL; char *caller_pkgname = NULL; - bundle *args = NULL; - bundle *group_args = NULL; + bundle *responding_service_handle = NULL; bundle *single_service_handle = NULL; bundle *multi_service_handle = NULL; @@ -333,28 +384,31 @@ static void _quickpanel_do_noti_press(notification_h noti, int pressed_area) { flag_delete = 0; notification_type_e type = NOTIFICATION_TYPE_NONE; - quickpanel_play_feedback(); + quickpanel_media_play_feedback(); retif(noti == NULL, , "Invalid parameter!"); notification_get_pkgname(noti, &caller_pkgname); - notification_get_application(noti, &pkgname); - if (pkgname == NULL) +// notification_get_application(noti, &pkgname); + if (pkgname == NULL) { pkgname = caller_pkgname; + } notification_get_id(noti, &group_id, &priv_id); notification_get_property(noti, &flags); notification_get_type(noti, &type); - if (flags & NOTIFICATION_PROP_DISABLE_APP_LAUNCH) + if (flags & NOTIFICATION_PROP_DISABLE_APP_LAUNCH) { flag_launch = 0; - else + } else { flag_launch = 1; + } - if (flags & NOTIFICATION_PROP_DISABLE_AUTO_DELETE) + if (flags & NOTIFICATION_PROP_DISABLE_AUTO_DELETE) { flag_delete = 0; - else + } else { flag_delete = 1; + } notification_get_execute_option(noti, NOTIFICATION_EXECUTE_TYPE_RESPONDING, @@ -368,12 +422,11 @@ static void _quickpanel_do_noti_press(notification_h noti, int pressed_area) { if (pressed_area == NOTI_PRESS_BUTTON_1 && responding_service_handle != NULL) { DBG(""); - quickpanel_close_quickpanel(true); - ret = quickpanel_launch_app(NULL, responding_service_handle); - quickpanel_launch_app_inform_result(pkgname, ret); + quickpanel_uic_close_quickpanel(true, 1); + ret = quickpanel_uic_launch_app(NULL, responding_service_handle); } else if (flag_launch == 1) { /* Hide quickpanel */ - quickpanel_close_quickpanel(true); + quickpanel_uic_close_quickpanel(true, 1); char *text_count = NULL; notification_get_text(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, &text_count); @@ -386,36 +439,21 @@ static void _quickpanel_do_noti_press(notification_h noti, int pressed_area) { if (single_service_handle != NULL && multi_service_handle == NULL) { DBG(""); - ret = quickpanel_launch_app(NULL, single_service_handle); - quickpanel_launch_app_inform_result(pkgname, ret); + ret = quickpanel_uic_launch_app(NULL, single_service_handle); } if (single_service_handle == NULL && multi_service_handle != NULL) { DBG(""); - ret = quickpanel_launch_app(NULL, multi_service_handle); - quickpanel_launch_app_inform_result(pkgname, ret); + ret = quickpanel_uic_launch_app(NULL, multi_service_handle); } if (single_service_handle != NULL && multi_service_handle != NULL) { DBG(""); if (count <= 1) { - ret = quickpanel_launch_app(NULL, single_service_handle); - quickpanel_launch_app_inform_result(pkgname, ret); + ret = quickpanel_uic_launch_app(NULL, single_service_handle); } else { - ret = quickpanel_launch_app(NULL, multi_service_handle); - quickpanel_launch_app_inform_result(pkgname, ret); - } - } - if (single_service_handle == NULL && multi_service_handle == NULL) { - DBG(""); - notification_get_args(noti, &args, &group_args); - - if (count > 1 && group_args != NULL) { - ret = quickpanel_launch_app(pkgname, group_args); - quickpanel_launch_app_inform_result(pkgname, ret); - } else { - ret = quickpanel_launch_app(pkgname, args); - quickpanel_launch_app_inform_result(pkgname, ret); + ret = quickpanel_uic_launch_app(NULL, multi_service_handle); } } + quickpanel_uic_launch_app_inform_result(pkgname, ret); } if (flag_delete == 1 && type == NOTIFICATION_TYPE_NOTI) { @@ -425,63 +463,67 @@ static void _quickpanel_do_noti_press(notification_h noti, int pressed_area) { } } -static void quickpanel_notibox_delete_cb(void *data, Evas_Object * obj) { +static void _notibox_delete_cb(noti_node_item *item, Evas_Object *obj) +{ DBG(""); - noti_node_item *item = data; + retif(obj == NULL, , "Invalid parameter!"); retif(item == NULL, , "Invalid parameter!"); notification_h noti = item->noti; retif(noti == NULL, , "Invalid parameter!"); - _quickpanel_do_noti_delete(noti); - + if (_do_noti_delete(noti) != NOTIFICATION_ERROR_NONE) { + quickpanel_noti_box_item_dragging_cancel(obj); + } } -static void quickpanel_notibox_button_1_cb(void *data, Evas_Object * obj) { +static void _notibox_button_1_cb(noti_node_item *item, Evas_Object *obj) +{ DBG(""); - noti_node_item *item = data; retif(item == NULL, , "Invalid parameter!"); notification_h noti = item->noti; retif(noti == NULL, , "Invalid parameter!"); - _quickpanel_do_noti_press(noti, NOTI_PRESS_BUTTON_1); + _do_noti_press(noti, NOTI_PRESS_BUTTON_1); } -static void quickpanel_notibox_select_cb(void *data, Evas_Object * obj) { +static void _notibox_select_cb(noti_node_item *item, Evas_Object *obj) +{ DBG(""); - noti_node_item *item = data; retif(item == NULL, , "Invalid parameter!"); - notification_h noti = item->noti; retif(noti == NULL, , "Invalid parameter!"); - _quickpanel_do_noti_press(noti, NOTI_PRESS_BG); + _do_noti_press(noti, NOTI_PRESS_BG); } -static void quickpanel_noti_listitem_select_cb(void *data, Evas_Object * obj) { +static void _noti_listitem_select_cb(noti_node_item *item, Evas_Object * obj) +{ DBG(""); - noti_node_item *item = data; retif(item == NULL, , "Invalid parameter!"); notification_h noti = item->noti; retif(noti == NULL, , "Invalid parameter!"); - _quickpanel_do_noti_press(noti, NOTI_PRESS_BG); + _do_noti_press(noti, NOTI_PRESS_BG); } -static inline void __ongoing_comp_n_copy(notification_h old, notification_h new) +static inline void _ongoing_comp_n_copy(notification_h old, notification_h new) { int priv_id = 0; int new_priv_id = 0; char *pkgname = NULL; char *new_pkgname = NULL; + int ret = NOTIFICATION_ERROR_NONE; - if (!old) + if (!old) { return; + } - if (!new) + if (!new) { return; + } notification_get_id(old, NULL, &priv_id); notification_get_id(new, NULL, &new_priv_id); @@ -489,8 +531,9 @@ static inline void __ongoing_comp_n_copy(notification_h old, notification_h new) notification_get_pkgname(old, &pkgname); notification_get_pkgname(new, &new_pkgname); - if (!pkgname || !new_pkgname) + if (!pkgname || !new_pkgname) { return; + } if (!strcmp(pkgname, new_pkgname) && priv_id == new_priv_id) { double percentage = 0.0; @@ -513,164 +556,162 @@ static inline void __ongoing_comp_n_copy(notification_h old, notification_h new) char *content = NULL; notification_get_text(old, NOTIFICATION_TEXT_TYPE_CONTENT, &content); - notification_set_text(new, - NOTIFICATION_TEXT_TYPE_CONTENT, content, - NULL, NOTIFICATION_VARIABLE_TYPE_NONE); + ret = notification_set_text(new, NOTIFICATION_TEXT_TYPE_CONTENT, content, NULL, NOTIFICATION_VARIABLE_TYPE_NONE); + if (ret != NOTIFICATION_ERROR_NONE) { + ERR("Failed to set text[%d]", ret); + } } } } -static void _quickpanel_noti_clear_ongoinglist() +static void _noti_node_clear_list_cb(gpointer key, gpointer value, gpointer user_data) { - if (g_noti_listbox != NULL) { - listbox_remove_all_item(g_noti_listbox, EINA_FALSE); + Evas_Object *noti_listbox = user_data; + noti_node_item *node = (noti_node_item *)value; + + if (noti_listbox != NULL && node != NULL) { + if (node->noti != NULL && node->view != NULL) { + quickpanel_noti_listbox_remove_item(noti_listbox, node->view, EINA_TRUE); + } } } -static void _quickpanel_noti_clear_notilist(void) +static void _noti_clear_list_all(void) { - if (g_noti_gridbox != NULL) { - gridbox_remove_all_item(g_noti_gridbox, EINA_FALSE); + struct appdata *ad = quickpanel_get_app_data(); + + if (s_info.noti_node->table != NULL) { + g_hash_table_foreach(s_info.noti_node->table, _noti_node_clear_list_cb, ad->list); + } + + if (s_info.noti_node != NULL) { + quickpanel_noti_node_remove_all(s_info.noti_node); } } -static void _quickpanel_noti_clear_list_all(void) -{ - _quickpanel_noti_clear_ongoinglist(); - _quickpanel_noti_clear_notilist(); +static void _ongoing_noti_section_icon_state_set(int is_closed) { + if (s_info.ongoing_noti_section_view != NULL) { + if (is_closed == 1) { + elm_object_signal_emit(s_info.ongoing_noti_section_view, "button,opened", "prog"); + } else { + elm_object_signal_emit(s_info.ongoing_noti_section_view, "button,closed", "prog"); + } + } } -static void _quickpanel_noti_section_add(void) +static void _ongoing_noti_section_deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - struct appdata *ad = quickpanel_get_app_data(); - retif(ad == NULL, , "Invalid parameter!"); - retif(ad->list == NULL, , "Invalid parameter!"); + DBG(""); + struct appdata *ad = data; + s_info.ongoing_noti_section_view = NULL; + DBG("VIM ongoing noti_section deleted"); - if (g_noti_section == NULL) { - g_noti_section = noti_section_create(ad->list); - if (g_noti_section != NULL) { - quickpanel_list_util_sort_insert(ad->list, g_noti_section); - DBG("noti section[%p]", g_noti_section); - } + if (quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_NONE) > 0) { + _ongoing_noti_section_add(); } + + quickpanel_noti_listbox_remove_item(ad->list, s_info.noti_section_view, 1); + s_info.noti_section_view = NULL; } -static void _quickpanel_noti_section_remove(void) +static void _ongoing_noti_section_add(void) { + int noti_count = 0; struct appdata *ad = quickpanel_get_app_data(); retif(ad == NULL, , "Invalid parameter!"); retif(ad->list == NULL, , "Invalid parameter!"); - if (g_noti_section != NULL) { - quickpanel_list_util_item_unpack_by_type(ad->list, QP_ITEM_TYPE_NOTI_GROUP); - noti_section_remove(g_noti_section); - g_noti_section = NULL; + if (s_info.noti_node) { + noti_count = quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_NONE); } -} -static void _quickpanel_noti_box_deleted_cb(void *data, Evas_Object *obj) { - int priv_id = -1; + DBG("[%d] ", noti_count); - retif(data == NULL, , "Invalid parameter!"); - DBG("deleting:%p", data); - - noti_node_item *item = data; - notification_h noti = item->noti; + if (s_info.ongoing_noti_section_view == NULL) { + s_info.ongoing_noti_section_view = quickpanel_noti_section_create(ad->list, QP_ITEM_TYPE_ONGOING_NOTI_GROUP); + if (s_info.ongoing_noti_section_view != NULL) { + quickpanel_noti_section_set_deleted_cb(s_info.ongoing_noti_section_view, _ongoing_noti_section_deleted_cb, ad); + quickpanel_noti_section_update(s_info.ongoing_noti_section_view, noti_count); - if (noti != NULL) { - notification_get_id(noti, NULL, &priv_id); - noti_node_remove(g_noti_node, priv_id); + if (s_info.is_ongoing_hided == 1) { + _ongoing_noti_section_icon_state_set(0); + } + } } -} - -static void _quickpanel_list_box_deleted_cb(void *data, Evas_Object *obj) { - int priv_id = -1; - - retif(data == NULL, , "Invalid parameter!"); - DBG("deleting:%p", data); - - noti_node_item *item = data; - notification_h noti = item->noti; - - if (noti != NULL) { - notification_get_id(noti, NULL, &priv_id); - noti_node_remove(g_noti_node, priv_id); + else { + DBG("noti section update %d ", noti_count); + quickpanel_noti_section_update(s_info.ongoing_noti_section_view, noti_count); } } -static void _quickpanel_noti_ongoing_add(Evas_Object *list, void *data, int is_prepend) +static void _noti_ongoing_add(Evas_Object *list, void *data, int is_prepend) { Evas_Object *noti_list_item = NULL; - notification_ly_type_e layout = NOTIFICATION_LY_ONGOING_EVENT; - - retif(list == NULL, , "Invalid parameter!"); notification_h noti = data; + retif(list == NULL, , "Invalid parameter!"); if (noti != NULL) { - notification_get_layout(noti, &layout); - noti_list_item = noti_list_item_create(g_noti_listbox, layout); + noti_list_item = quickpanel_noti_list_item_create(list, noti); if (noti_list_item != NULL) { - noti_node_item *item = noti_node_add(g_noti_node, (void*)data, (void*)noti_list_item); + noti_node_item *item = quickpanel_noti_node_add(s_info.noti_node, (void*)data, (void*)noti_list_item); if (item != NULL) { - noti_list_item_node_set(noti_list_item, item); - noti_list_item_set_item_selected_cb(noti_list_item, quickpanel_noti_listitem_select_cb); - listbox_add_item(g_noti_listbox, noti_list_item, is_prepend); + quickpanel_noti_list_item_node_set(noti_list_item, item); + quickpanel_noti_list_item_set_item_selected_cb(noti_list_item, _noti_listitem_select_cb); + + if (s_info.ongoing_noti_section_view == NULL) { + _ongoing_noti_section_add(); + } + quickpanel_noti_listbox_add_item(list, noti_list_item, is_prepend, s_info.ongoing_noti_section_view); } } else ERR("fail to insert item to list : %p", data); } DBG("noti[%p] data[%p] added listbox[%p]", - data, noti_list_item, g_noti_listbox); + data, noti_list_item, list); } -static void _quickpanel_noti_noti_add(Evas_Object *list, void *data, int is_prepend) +static void _noti_add(Evas_Object *list, void *data, int insert_pos) { notification_h noti = data; notification_ly_type_e layout = NOTIFICATION_LY_NOTI_EVENT_SINGLE; - Evas_Object *noti_box = NULL; + Evas_Object *noti_view = NULL; retif(list == NULL, , "Invalid parameter!"); - if (g_noti_section == NULL) { - _quickpanel_noti_section_add(); - } - if (noti != NULL) { notification_get_layout(noti, &layout); - Evas_Object *noti_box = noti_box_create(g_noti_gridbox, layout); + noti_view = quickpanel_noti_list_item_create(list, noti); - if (noti_box != NULL) { - noti_node_item *item = noti_node_add(g_noti_node, (void*)data, (void*)noti_box); + if (noti_view != NULL) { + noti_node_item *item = quickpanel_noti_node_add(s_info.noti_node, (void*)data, (void*)noti_view); if (item != NULL) { - noti_box_node_set(noti_box, item); - noti_box_set_item_selected_cb(noti_box, quickpanel_notibox_select_cb); - noti_box_set_item_button_1_cb(noti_box, quickpanel_notibox_button_1_cb); - noti_box_set_item_deleted_cb(noti_box, quickpanel_notibox_delete_cb); - gridbox_add_item(g_noti_gridbox, noti_box, is_prepend); + quickpanel_noti_list_item_node_set(noti_view, item); + quickpanel_noti_list_item_set_item_selected_cb(noti_view, _notibox_select_cb); + quickpanel_noti_list_item_set_item_button_1_cb(noti_view, _notibox_button_1_cb); + quickpanel_noti_list_item_set_item_deleted_cb(noti_view, _notibox_delete_cb); + + if (s_info.noti_section_view == NULL) { + _ongoing_noti_section_add(); + } + quickpanel_noti_listbox_add_item(list, noti_view, insert_pos, s_info.noti_section_view); } } else ERR("fail to insert item to list : %p", data); } - int noti_count = - noti_node_get_item_count(g_noti_node, NOTIFICATION_TYPE_NOTI); - - if (g_noti_section != NULL) { - noti_section_update(g_noti_section, noti_count); - } - DBG("noti[%p] view[%p] added gridbox[%p]", - data, noti_box, g_noti_gridbox); + data, noti_view, list); } -static void _quickpanel_noti_update_notilist(struct appdata *ad) +static void _update_notilist(struct appdata *ad) { Evas_Object *list = NULL; notification_h noti = NULL; notification_h noti_save = NULL; - notification_list_h get_list = NULL; + notification_list_h list_head = NULL; + notification_list_h list_traverse = NULL; int applist = NOTIFICATION_DISPLAY_APP_ALL; DBG(""); @@ -680,93 +721,66 @@ static void _quickpanel_noti_update_notilist(struct appdata *ad) list = ad->list; retif(list == NULL, , "Failed to get noti genlist."); - _quickpanel_noti_clear_list_all(); + _noti_clear_list_all(); - notification_get_list(NOTIFICATION_TYPE_ONGOING, -1, &get_list); - while (get_list != NULL) { - noti = notification_list_get_data(get_list); + notification_get_list(NOTIFICATION_TYPE_ONGOING, -1, &list_head); + list_traverse = list_head; + while (list_traverse != NULL) { + noti = notification_list_get_data(list_traverse); notification_get_display_applist(noti, &applist); if (applist & NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY) { notification_clone(noti, ¬i_save); - _quickpanel_noti_ongoing_add(list, noti_save, LISTBOX_APPEND); + _noti_ongoing_add(list, noti_save, LISTBOX_APPEND); } - get_list = notification_list_get_next(get_list); + list_traverse = notification_list_get_next(list_traverse); + } + if (list_head != NULL) { + notification_free_list(list_head); + list_head = NULL; } - notification_free_list(get_list); - notification_get_list(NOTIFICATION_TYPE_NOTI , -1, &get_list); - while (get_list != NULL) { - noti = notification_list_get_data(get_list); + notification_get_list(NOTIFICATION_TYPE_NOTI , -1, &list_head); + list_traverse = list_head; + while (list_traverse != NULL) { + noti = notification_list_get_data(list_traverse); notification_get_display_applist(noti, &applist); if (applist & NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY) { notification_clone(noti, ¬i_save); - _quickpanel_noti_noti_add(list, noti_save, GRIDBOX_APPEND); + _noti_add(list, noti_save, LISTBOX_APPEND); } - get_list = notification_list_get_next(get_list); + list_traverse = notification_list_get_next(list_traverse); } - notification_free_list(get_list); - - if (g_noti_gridbox != NULL) { - elm_box_recalculate(g_noti_gridbox); + if (list_head != NULL) { + notification_free_list(list_head); + list_head = NULL; } -} -static void _quickpanel_noti_delete_volatil_data(void) -{ - notification_list_h noti_list = NULL; - notification_list_h noti_list_head = NULL; - notification_h noti = NULL; - int property = 0; - - notification_get_grouping_list(NOTIFICATION_TYPE_NONE, -1, ¬i_list); - - noti_list_head = noti_list; - - while (noti_list != NULL) { - noti = notification_list_get_data(noti_list); - notification_get_property(noti, &property); - - if (property & NOTIFICATION_PROP_VOLATILE_DISPLAY) { - notification_set_property(noti, - property | - NOTIFICATION_PROP_DISABLE_UPDATE_ON_DELETE); - notification_delete(noti); - } - - noti_list = notification_list_get_next(noti_list); + if (list != NULL) { + elm_box_recalculate(list); } - - notification_free_list(noti_list_head); - - notification_update(NULL); } inline static void _print_debuginfo_from_noti(notification_h noti) { retif(noti == NULL, , "Invalid parameter!"); char *noti_pkgname = NULL; - char *noti_launch_pkgname = NULL; notification_type_e noti_type = NOTIFICATION_TYPE_NONE; notification_get_pkgname(noti, ¬i_pkgname); - notification_get_application(noti, ¬i_launch_pkgname); notification_get_type(noti, ¬i_type); if (noti_pkgname != NULL) { - ERR("pkg:%s", noti_pkgname); - } - if (noti_launch_pkgname != NULL) { - ERR("pkgl:%s", noti_launch_pkgname); + SERR("pkg:%s", noti_pkgname); } - ERR("type:%d", noti_type); + SERR("type:%d", noti_type); } -static void _quickpanel_noti_detailed_changed_cb(void *data, notification_type_e type, notification_op *op_list, int num_op) +static void _detailed_changed_cb(void *data, notification_type_e type, notification_op *op_list, int num_op) { int i = 0; int op_type = 0; @@ -777,21 +791,23 @@ static void _quickpanel_noti_detailed_changed_cb(void *data, notification_type_e notification_type_e noti_type = NOTIFICATION_TYPE_NONE; int noti_applist = NOTIFICATION_DISPLAY_APP_ALL; notification_ly_type_e noti_layout = NOTIFICATION_LY_NONE; + notification_ly_type_e old_noti_layout = NOTIFICATION_LY_NONE; retif(data == NULL, , "Invalid parameter!"); ad = data; - ERR("num_op:%d", num_op); + SERR("num_op:%d", num_op); for (i = 0; i < num_op; i++) { notification_op_get_data(op_list + i, NOTIFICATION_OP_DATA_TYPE, &op_type); notification_op_get_data(op_list + i, NOTIFICATION_OP_DATA_PRIV_ID, &priv_id); notification_op_get_data(op_list + i, NOTIFICATION_OP_DATA_NOTI, ¬i_from_master); - ERR("noti operation:%d privid:%d", op_type, priv_id); + SERR("noti operation:%d privid:%d", op_type, priv_id); - if (op_type == NOTIFICATION_OP_INSERT) { + switch(op_type) { + case NOTIFICATION_OP_INSERT: if (noti_from_master == NULL) { ERR("failed to get a notification from master"); continue; @@ -802,8 +818,19 @@ static void _quickpanel_noti_detailed_changed_cb(void *data, notification_type_e } _print_debuginfo_from_noti(noti_new); +#ifdef QP_EMERGENCY_MODE_ENABLE + if (quickpanel_emergency_mode_is_on()) { + if (quickpanel_emergency_mode_notification_filter(noti_new, 0)) { + notification_free(noti_new); + return; + } + } +#endif +#ifdef QP_SMART_ALERT_ENABLE + quickpanel_smart_alert_update_info(noti_new); +#endif #ifdef QP_SERVICE_NOTI_LED_ENABLE - quickpanel_service_noti_led_on(noti_new); + quickpanel_noti_led_proc(noti_new, op_type); #endif notification_get_type(noti_new, ¬i_type); @@ -811,7 +838,7 @@ static void _quickpanel_noti_detailed_changed_cb(void *data, notification_type_e notification_get_layout(noti_new, ¬i_layout); if (noti_applist & NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY) { - noti_node_item *node = noti_node_get(g_noti_node, priv_id); + noti_node_item *node = quickpanel_noti_node_get(s_info.noti_node, priv_id); if (node != NULL) { if (noti_type == NOTIFICATION_TYPE_NOTI) { DBG("cb after inserted:%d", priv_id); @@ -819,266 +846,284 @@ static void _quickpanel_noti_detailed_changed_cb(void *data, notification_type_e notification_free(noti_new); } else { if (noti_type == NOTIFICATION_TYPE_NOTI) { - _quickpanel_noti_noti_add(ad->list, noti_new, GRIDBOX_PREPEND); + _noti_add(ad->list, noti_new, LISTBOX_APPEND); +#ifdef QP_REMINDER_ENABLE + quickpanel_reminder_start(NULL); +#endif } else if (noti_type == NOTIFICATION_TYPE_ONGOING) { - _quickpanel_noti_ongoing_add(ad->list, noti_new, LISTBOX_PREPEND); + _noti_ongoing_add(ad->list, noti_new, LISTBOX_PREPEND); + } else { + notification_free(noti_new); } } } else { notification_free(noti_new); } - } else if (op_type == NOTIFICATION_OP_DELETE) { - noti_node_item *node = noti_node_get(g_noti_node, priv_id); + break; - if (node != NULL && node->noti != NULL) { - notification_h noti = node->noti; - notification_get_type(noti, ¬i_type); + case NOTIFICATION_OP_DELETE: + { + noti_node_item *node = quickpanel_noti_node_get(s_info.noti_node, priv_id); + + if (node != NULL && node->noti != NULL) { + notification_h noti = node->noti; + notification_get_type(noti, ¬i_type); +#ifdef QP_SMART_ALERT_ENABLE + quickpanel_smart_alert_update_info(noti); +#endif #ifdef QP_SERVICE_NOTI_LED_ENABLE - quickpanel_service_noti_led_off(noti); + quickpanel_noti_led_proc(noti, op_type); #endif - _print_debuginfo_from_noti(noti); + _print_debuginfo_from_noti(noti); + + if (noti_type == NOTIFICATION_TYPE_NOTI) { + quickpanel_noti_listbox_remove_item(ad->list, node->view, 1); + } else if (noti_type == NOTIFICATION_TYPE_ONGOING) { + quickpanel_noti_listbox_remove_item(ad->list, node->view, 1); + } - if (noti_type == NOTIFICATION_TYPE_NOTI) { - gridbox_remove_item(g_noti_gridbox, node->view, 0); - } else if (noti_type == NOTIFICATION_TYPE_ONGOING) { - listbox_remove_item(g_noti_listbox, node->view, 0); + quickpanel_noti_node_remove(s_info.noti_node, priv_id); + if (quickpanel_media_player_id_get() == priv_id) { + quickpanel_media_player_stop(); + } + } else { + ERR("node = NULL or node->noti == NULL"); } - noti_node_remove(g_noti_node, priv_id); - } - } else if (op_type == NOTIFICATION_OP_UPDATE) { - noti_node_item *node = noti_node_get(g_noti_node, priv_id); - notification_h old_noti = NULL; - if (noti_from_master == NULL) { - ERR("failed to get a notification from master"); - continue; - } - if (notification_clone(noti_from_master, ¬i_new) != NOTIFICATION_ERROR_NONE) { - ERR("failed to create a cloned notification"); - continue; +#ifdef QP_REMINDER_ENABLE + if (quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_NOTI) <= 0) { + quickpanel_reminder_stop(NULL); + } +#endif } + break; -#ifdef QP_SERVICE_NOTI_LED_ENABLE - quickpanel_service_noti_led_on(noti_new); -#endif - _print_debuginfo_from_noti(noti_new); + case NOTIFICATION_OP_UPDATE: + { + noti_node_item *node = quickpanel_noti_node_get(s_info.noti_node, priv_id); + notification_h old_noti = NULL; - if (node != NULL && node->view != NULL && node->noti != NULL) { - notification_get_type(noti_new, ¬i_type); + DBG("Notification update priv_id[%d]", priv_id); - if (noti_type == NOTIFICATION_TYPE_NOTI) { - gridbox_remove_item(g_noti_gridbox, node->view, 0); - _quickpanel_noti_noti_add(ad->list, noti_new, GRIDBOX_PREPEND); -/* - gridbox_remove_and_add_item(g_noti_gridbox, node->view, - _quickpanel_noti_noti_add - ,ad->list, noti_new, GRIDBOX_PREPEND); -*/ - } else if (noti_type == NOTIFICATION_TYPE_ONGOING) { - old_noti = node->noti; - node->noti = noti_new; - - listbox_update_item(g_noti_listbox, node->view); + if (noti_from_master == NULL) { + ERR("failed to get a notification from master"); + continue; } - if (old_noti != NULL) { - notification_free(old_noti); + if (notification_clone(noti_from_master, ¬i_new) != NOTIFICATION_ERROR_NONE) { + ERR("failed to create a cloned notification"); + continue; } - } else { - notification_get_display_applist(noti_new, ¬i_applist); - - if (noti_applist & NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY) { - if (noti_type == NOTIFICATION_TYPE_NOTI) { - _quickpanel_noti_noti_add(ad->list, noti_new, GRIDBOX_PREPEND); +#ifdef QP_EMERGENCY_MODE_ENABLE + if (quickpanel_emergency_mode_is_on()) { + if (quickpanel_emergency_mode_notification_filter(noti_new, 0)) { + DBG("notification filtered"); + notification_free(noti_new); + return; + } + } +#endif +#ifdef QP_SMART_ALERT_ENABLE + quickpanel_smart_alert_update_info(noti_new); +#endif +#ifdef QP_SERVICE_NOTI_LED_ENABLE + quickpanel_noti_led_proc(noti_new, op_type); +#endif + _print_debuginfo_from_noti(noti_new); + notification_get_layout(noti_new, ¬i_layout); + + if (node != NULL && node->view != NULL && node->noti != NULL) { + notification_get_type(noti_new, ¬i_type); + + notification_get_layout(node->noti, &old_noti_layout); + if (noti_type == NOTIFICATION_TYPE_NOTI || old_noti_layout != noti_layout) { + if (quickpanel_noti_view_is_view_handler_changed(node->view, noti_new) == 1) { + quickpanel_noti_listbox_remove_item(ad->list, node->view, 1); + quickpanel_noti_node_remove(s_info.noti_node, priv_id); + _noti_add(ad->list, noti_new, GRIDBOX_PREPEND); + } else { + old_noti = node->noti; + node->noti = noti_new; + quickpanel_noti_listbox_update_item(ad->list, node->view); + } } else if (noti_type == NOTIFICATION_TYPE_ONGOING) { - _quickpanel_noti_ongoing_add(ad->list, noti_new, GRIDBOX_PREPEND); + old_noti = node->noti; + node->noti = noti_new; + + quickpanel_noti_listbox_update_item(ad->list, node->view); + } else { + notification_free(noti_new); + } + + if (old_noti != NULL) { + notification_free(old_noti); } } else { - notification_free(noti_new); + notification_get_display_applist(noti_new, ¬i_applist); + + if (noti_applist & NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY) { + if (noti_type == NOTIFICATION_TYPE_NOTI) { + _noti_add(ad->list, noti_new, LISTBOX_PREPEND); + } else if (noti_type == NOTIFICATION_TYPE_ONGOING) { + _noti_ongoing_add(ad->list, noti_new, LISTBOX_PREPEND); + } else { + notification_free(noti_new); + } + } else { + notification_free(noti_new); + } } } - } else if (op_type == NOTIFICATION_OP_REFRESH) { - _quickpanel_noti_update_notilist(ad); - } else if (op_type == NOTIFICATION_OP_SERVICE_READY) { - _quickpanel_noti_update_notilist(ad); + break; + case NOTIFICATION_OP_SERVICE_READY: + _update_notilist(ad); + +#ifdef QP_SMART_ALERT_ENABLE + quickpanel_smart_alert_update_info(NULL); +#endif #ifdef QP_SERVICE_NOTI_LED_ENABLE - quickpanel_service_noti_init(ad); - quickpanel_service_noti_led_on(NULL); + quickpanel_noti_led_init(ad, s_info.noti_node); #endif - } - } + quickpanel_vim_set_state_ready(); - int noti_count = 0; +#ifdef QP_REMINDER_ENABLE + if (quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_NOTI) > 0) { + quickpanel_reminder_start(NULL); + } else { + quickpanel_reminder_stop(NULL); + } +#endif + //quickpanel_chg_init(); + break; - if ((noti_count = noti_node_get_item_count(g_noti_node, NOTIFICATION_TYPE_NOTI)) - <= 0) { - _quickpanel_noti_clear_notilist(); - _quickpanel_noti_section_remove(); - } else { - if (g_noti_section != NULL) { - noti_section_update(g_noti_section, noti_count); + default: + SERR("Unknown op type"); + break; } } - ERR("current noti count:%d", noti_count); -} - -static void _quickpanel_noti_update_desktop_cb(keynode_t *node, void *data) -{ - char *event = NULL; - char type[10] = {0,}; - char package[1024] = {0,}; - - event = vconf_get_str(vconf_keynode_get_name(node)); - retif(NULL == event, , "invalid event"); - - DBG("%s", event); + int noti_count = quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_NOTI); + int ongoing_noti_count = quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_ONGOING); - if (sscanf(event, "%10[^:]:%1023s", type, package) != 2) { - DBG("Failed to parse the event format : [%s], [%s]", type, package); + if (s_info.noti_section_view != NULL) { + quickpanel_noti_section_update(s_info.noti_section_view, noti_count+ongoing_noti_count); } - - if (strncasecmp(type, "delete", strlen(type)) == 0) { - notification_delete_all_by_type(package, NOTIFICATION_TYPE_NONE); + if (s_info.ongoing_noti_section_view != NULL) { + quickpanel_noti_section_update(s_info.ongoing_noti_section_view, noti_count+ongoing_noti_count); } - if (event != NULL) - free(event); + SERR("current noti count:%d, ongoing:%d", noti_count, ongoing_noti_count); } -static void _quickpanel_noti_update_sim_status_cb(keynode_t *node, void *data) +static void _update_sim_status_cb(keynode_t *node, void *data) { struct appdata *ad = data; if (ad != NULL && ad->list != NULL) { - _quickpanel_noti_update_notilist(ad); + if (notification_is_service_ready() == 1) { + _update_notilist(ad); + } } } -static int _quickpanel_noti_register_event_handler(struct appdata *ad) +static Eina_Bool _noti_callback_register_idler_cb(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, EINA_FALSE, "Invalid parameter!"); + + notification_register_detailed_changed_cb(_detailed_changed_cb, ad); + + return EINA_FALSE; +} + +static int _register_event_handler(struct appdata *ad) { int ret = 0; retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + retif(ad->dbus_connection == NULL, QP_FAIL, "Invalid parameter!"); - /* Add dbus signal */ - e_dbus_init(); - ad->dbus_connection = e_dbus_bus_get(DBUS_BUS_SYSTEM); - if (ad->dbus_connection == NULL) { - ERR("noti register : failed to get dbus bus"); - return -1; - } - - ad->dbus_handler_size = + s_info.dbus_handler_size = e_dbus_signal_handler_add(ad->dbus_connection, NULL, QP_NOTI_ONGOING_DBUS_PATH, QP_NOTI_ONGOING_DBUS_INTERFACE, "update_progress", - _quickpanel_noti_item_progress_update_cb, + _item_progress_update_cb, ad); - if (ad->dbus_handler_size == NULL) + if (s_info.dbus_handler_size == NULL) { ERR("fail to add size signal"); + } - ad->dbus_handler_progress = + s_info.dbus_handler_progress = e_dbus_signal_handler_add(ad->dbus_connection, NULL, QP_NOTI_ONGOING_DBUS_PATH, QP_NOTI_ONGOING_DBUS_INTERFACE, "update_size", - _quickpanel_noti_item_size_update_cb, + _item_size_update_cb, ad); - if (ad->dbus_handler_progress == NULL) + if (s_info.dbus_handler_progress == NULL) { ERR("fail to add progress signal"); + } - ad->dbus_handler_content = + s_info.dbus_handler_content = e_dbus_signal_handler_add(ad->dbus_connection, NULL, QP_NOTI_ONGOING_DBUS_PATH, QP_NOTI_ONGOING_DBUS_INTERFACE, "update_content", - _quickpanel_noti_item_content_update_cb, + _item_content_update_cb, ad); - if (ad->dbus_handler_content == NULL) + if (s_info.dbus_handler_content == NULL) { ERR("fail to add content signal"); + } /* Notify vconf key */ ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT, - _quickpanel_noti_update_sim_status_cb, + _update_sim_status_cb, (void *)ad); - if (ret != 0) + if (ret != 0) { ERR("Failed to register SIM_SLOT change callback!"); - - /* Notify vconf key */ - ret = vconf_notify_key_changed(VCONFKEY_MENUSCREEN_DESKTOP, - _quickpanel_noti_update_desktop_cb, - (void *)ad); - if (ret != 0) - ERR("Failed to register DESKTOP change callback!"); + } /* Register notification changed cb */ - notification_register_detailed_changed_cb(_quickpanel_noti_detailed_changed_cb, ad); + ecore_idler_add(_noti_callback_register_idler_cb, ad); return ret; } -static int _quickpanel_noti_unregister_event_handler(struct appdata *ad) +static int _unregister_event_handler(struct appdata *ad) { int ret = 0; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + retif(ad->dbus_connection == NULL, QP_FAIL, "Invalid parameter!"); /* Unregister notification changed cb */ - notification_unregister_detailed_changed_cb(_quickpanel_noti_detailed_changed_cb, (void *)ad); - - /* Ignore vconf key */ - ret = vconf_ignore_key_changed(VCONFKEY_MENUSCREEN_DESKTOP, - _quickpanel_noti_update_desktop_cb); - if (ret != 0) - ERR("Failed to ignore DESKTOP change callback!"); + notification_unregister_detailed_changed_cb(_detailed_changed_cb, (void *)ad); ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT, - _quickpanel_noti_update_sim_status_cb); - if (ret != 0) + _update_sim_status_cb); + if (ret != 0) { ERR("Failed to ignore SIM_SLOT change callback!"); + } /* Delete dbus signal */ - if (ad->dbus_handler_size != NULL) { + if (s_info.dbus_handler_size != NULL) { e_dbus_signal_handler_del(ad->dbus_connection, - ad->dbus_handler_size); - ad->dbus_handler_size = NULL; + s_info.dbus_handler_size); + s_info.dbus_handler_size = NULL; } - if (ad->dbus_handler_progress != NULL) { + if (s_info.dbus_handler_progress != NULL) { e_dbus_signal_handler_del(ad->dbus_connection, - ad->dbus_handler_progress); - ad->dbus_handler_progress = NULL; + s_info.dbus_handler_progress); + s_info.dbus_handler_progress = NULL; } - if (ad->dbus_handler_content != NULL) { + if (s_info.dbus_handler_content != NULL) { e_dbus_signal_handler_del(ad->dbus_connection, - ad->dbus_handler_content); - ad->dbus_handler_content = NULL; - } - - if (ad->dbus_connection != NULL) { - e_dbus_connection_close(ad->dbus_connection); - ad->dbus_connection = NULL; + s_info.dbus_handler_content); + s_info.dbus_handler_content = NULL; } return QP_OK; } -static int _quickpanel_noti_check_first_start(void) -{ - int status = 0; - int ret = 0; - - ret = vconf_get_bool(VCONFKEY_QUICKPANEL_STARTED, &status); - if (ret == 0 && status == 0) { - /* reboot */ - ret = vconf_set_bool(VCONFKEY_QUICKPANEL_STARTED, 1); - INFO("set : %s, result : %d", VCONFKEY_QUICKPANEL_STARTED, ret); - } - - if (status) - return 0; - - return 1; -} - -static void _quickpanel_noti_init(void *data) +/*static void _quickpanel_noti_init(void *data) { struct appdata *ad = NULL; @@ -1089,16 +1134,11 @@ static void _quickpanel_noti_init(void *data) DBG("wr"); - if (g_noti_listbox == NULL) { - g_noti_listbox = listbox_create(ad->list, quickpanel_get_app_data()); - listbox_set_item_deleted_cb(g_noti_listbox, _quickpanel_list_box_deleted_cb); - quickpanel_list_util_sort_insert(ad->list, g_noti_listbox); - } - - if (g_noti_gridbox == NULL) { - g_noti_gridbox = gridbox_create(ad->list, quickpanel_get_app_data()); - gridbox_set_item_deleted_cb(g_noti_gridbox, _quickpanel_noti_box_deleted_cb); - quickpanel_list_util_sort_insert(ad->list, g_noti_gridbox); + if (s_info.noti_box == NULL) { + s_info.noti_box = quickpanel_noti_listbox_create(ad->list + , quickpanel_get_app_data(), QP_ITEM_TYPE_ONGOING_NOTI); + quickpanel_noti_listbox_set_item_deleted_cb(s_info.noti_box, _quickpanel_list_box_deleted_cb); + quickpanel_list_util_sort_insert(ad->list, s_info.noti_box); } } @@ -1112,77 +1152,52 @@ static void _quickpanel_noti_fini(void *data) retif(ad->list == NULL, , "Invalid parameter!"); DBG("dr"); +}*/ - if (g_noti_listbox != NULL) { - quickpanel_list_util_item_unpack_by_object(ad->list - , g_noti_listbox); - listbox_remove(g_noti_listbox); - g_noti_listbox = NULL; - } - - if (g_noti_gridbox != NULL) { - quickpanel_list_util_item_unpack_by_object(ad->list - , g_noti_gridbox); - gridbox_remove(g_noti_gridbox); - g_noti_gridbox = NULL; - } -} - -static void _quickpanel_noti_cleanup(void *data) { - notifiation_clear(NOTIFICATION_TYPE_ONGOING); - _quickpanel_noti_delete_volatil_data(); -} - -static int quickpanel_noti_init(void *data) +static int _init(void *data) { struct appdata *ad = data; - int is_first = 0; - retif(ad == NULL, QP_FAIL, "Invalid parameter!"); - noti_node_create(&g_noti_node); + quickpanel_noti_node_create(&s_info.noti_node); - is_first = _quickpanel_noti_check_first_start(); - if (is_first) { - if (notification_is_service_ready()) { - _quickpanel_noti_cleanup(ad); - } else { - notification_add_deffered_task(_quickpanel_noti_cleanup, ad); - } - } + //_quickpanel_noti_init(ad); - _quickpanel_noti_init(ad); + _register_event_handler(ad); - _quickpanel_noti_register_event_handler(ad); + // NOTI TIME + _noti_time_init(data); return QP_OK; } -static int quickpanel_noti_fini(void *data) +static int _fini(void *data) { struct appdata *ad = data; retif(ad == NULL, QP_FAIL, "Invalid parameter!"); #ifdef QP_SERVICE_NOTI_LED_ENABLE - quickpanel_service_noti_fini(ad); - quickpanel_service_noti_led_off(NULL); + quickpanel_noti_led_fini(ad); #endif /* Unregister event handler */ - _quickpanel_noti_unregister_event_handler(data); + _unregister_event_handler(data); - _quickpanel_noti_clear_list_all(); + _noti_clear_list_all(); - _quickpanel_noti_fini(ad); + //_quickpanel_noti_fini(ad); - if (g_noti_node != NULL) { - noti_node_destroy(&g_noti_node); + if (s_info.noti_node != NULL) { + quickpanel_noti_node_destroy(&s_info.noti_node); } + // NOTI TIME + _noti_time_fini(data); + return QP_OK; } -static int quickpanel_noti_suspend(void *data) +static int _suspend(void *data) { struct appdata *ad = data; retif(ad == NULL, QP_FAIL, "Invalid parameter!"); @@ -1190,34 +1205,266 @@ static int quickpanel_noti_suspend(void *data) return QP_OK; } -static int quickpanel_noti_resume(void *data) +static void _noti_node_ongoing_update_cb(gpointer key, gpointer value, gpointer user_data) +{ + notification_type_e noti_type = NOTIFICATION_TYPE_NONE; + Evas_Object *noti_listbox = user_data; + noti_node_item *node = (noti_node_item *)value; + + if (noti_listbox != NULL && node != NULL) { + if (node->noti != NULL && node->view != NULL) { + notification_get_type(node->noti, ¬i_type); + if (noti_type == NOTIFICATION_TYPE_ONGOING) { + quickpanel_noti_listbox_update_item(noti_listbox, node->view); + } + } + } +} + +static int _resume(void *data) { struct appdata *ad = data; retif(ad == NULL, QP_FAIL, "Invalid parameter!"); - if (ad->list) { - listbox_update(g_noti_listbox); + if (ad->list != NULL && s_info.noti_node != NULL) { + if (quickpanel_noti_node_get_item_count(s_info.noti_node, QP_ITEM_TYPE_ONGOING_NOTI) > 0) { + if (s_info.noti_node->table != NULL) { + g_hash_table_foreach(s_info.noti_node->table, _noti_node_ongoing_update_cb, ad->list); + } + } } return QP_OK; } -static void quickpanel_noti_refresh(void *data) { +static void _refresh(void *data) +{ struct appdata *ad = NULL; retif(data == NULL, , "Invalid parameter!"); ad = data; - if (g_noti_gridbox != NULL) { - gridbox_rotation(g_noti_gridbox, ad->angle); - } + quickpanel_noti_listbox_rotation(ad->list, ad->angle); } -static void quickpanel_noti_lang_changed(void *data) +static void _lang_changed(void *data) { + int noti_count = 0; + int ongoing_noti_count = 0; struct appdata *ad = data; retif(ad == NULL, , "Invalid parameter!"); - _quickpanel_noti_update_notilist(ad); + if (notification_is_service_ready() == 1) { + + _update_notilist(ad); + + noti_count = quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_NOTI); + ongoing_noti_count = quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_ONGOING); + + if (s_info.noti_section_view != NULL) { + quickpanel_noti_section_update(s_info.noti_section_view, noti_count+ongoing_noti_count); + } + if (s_info.ongoing_noti_section_view != NULL) { + quickpanel_noti_section_update(s_info.ongoing_noti_section_view, noti_count+ongoing_noti_count); + } + } +} + +HAPI int quickpanel_noti_get_count(void) +{ + return quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_NONE); +} + +HAPI int quickpanel_noti_get_type_count(notification_type_e noti_type) +{ + return quickpanel_noti_node_get_item_count(s_info.noti_node, noti_type); +} + +HAPI int quickpanel_noti_get_geometry(int *limit_h, int *limit_partial_h, int *limit_partial_w) +{ + retif(limit_h == NULL, 0, "invalid parameter"); + retif(limit_partial_h == NULL, 0, "invalid parameter"); + retif(limit_partial_w == NULL, 0, "invalid parameter"); + struct appdata *ad = quickpanel_get_app_data(); + + return quickpanel_noti_listbox_get_geometry(ad->list, + limit_h, limit_partial_h, limit_partial_w); +} + +HAPI noti_node_item *quickpanel_noti_node_get_by_priv_id(int priv_id) +{ + retif(s_info.noti_node == NULL, NULL, "invalid parameter"); + + return quickpanel_noti_node_get(s_info.noti_node, priv_id); +} + +HAPI noti_node_item *quickpanel_noti_node_get_first_noti(void) +{ + // get box list + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj = NULL; + Eina_List *item_list = NULL; + noti_node_item *node = NULL; + noti_node_item *node_first_noti = NULL; + notification_type_e type = NOTIFICATION_TYPE_NONE; + struct appdata *ad = quickpanel_get_app_data(); + + item_list = elm_box_children_get(ad->list); + retif(item_list == NULL, NULL, "invalid parameter"); + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj != NULL) { + node = quickpanel_noti_list_item_node_get(obj); + if (node) { + notification_h noti = node->noti; + if (noti) { + notification_get_type(noti, &type); + if (type == NOTIFICATION_TYPE_NOTI) { + node_first_noti = node; + break; + } + } + } + } + } + + if (item_list != NULL) { + eina_list_free(item_list); + } + + return node_first_noti; +} + +HAPI void quickpanel_noti_closing_trigger_set(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + quickpanel_noti_listbox_closing_trigger_set(ad->list); +} + +static void _opened(void *data) +{ + if (elm_config_access_get() == EINA_TRUE) { + elm_access_say(_NOT_LOCALIZED("Notification panel")); + } +} + +HAPI void quickpanel_noti_set_clear_all_status() +{ + struct appdata *ad = quickpanel_get_app_data(); + if ((quickpanel_noti_listbox_get_item_count(ad->list) >= 0 + || quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_ONGOING) >= 0) + && quickpanel_noti_node_get_item_count(s_info.noti_node, NOTIFICATION_TYPE_NOTI) <= 0) { + INFO("NOTI SECTION CLEAR ALL HIDE"); + elm_object_signal_emit(s_info.ongoing_noti_section_view , + "notifaction,section,clear_all,hide", "base"); + } else { + INFO("NOTI SECTION CLEAR ALL SHOW"); + elm_object_signal_emit(s_info.ongoing_noti_section_view, + "notifaction,section,clear_all,show", "base"); + } + +} + +HAPI void quickpanel_noti_on_clear_all_clicked(void *data, Evas_Object *obj, void *info) +{ + quickpanel_media_play_feedback(); + LOGI("NOTI CLEAR ALL CLICKED"); + + DBG(""); + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->list == NULL, , "Invalid parameter!"); + + quickpanel_noti_closing_trigger_set(); +#ifdef HAVE_X + notification_clear(NOTIFICATION_TYPE_NOTI); +#endif + quickpanel_uic_close_quickpanel(EINA_FALSE, EINA_FALSE); + + /*if (s_info.noti_node->n_ongoing == 0) + { + _ongoing_noti_section_remove(); + }*/ +} + +// TIME REACTION + +static void _on_time_changed(keynode_t *key, void *data) +{ + struct appdata *ad = data; + + time_t current_time = time(NULL); + struct tm loc_time; + localtime_r(¤t_time, &loc_time); + + if (loc_time.tm_yday != s_info.last_time.tm_yday || loc_time.tm_year != s_info.last_time.tm_year) { + _update_notilist(ad); + } + + s_info.last_time = loc_time; +} + +static Eina_Bool _notification_time_format_changed_cb(void *data) +{ + struct appdata *ad = data; + + _update_notilist(ad); + + return ECORE_CALLBACK_CANCEL; +} + +static void _noti_time_init(void *data) +{ + int ret = 0; + struct appdata *ad = data; + retif_nomsg(ad == NULL, ); + + time_t current_time = time(NULL); + localtime_r(¤t_time, &s_info.last_time); + + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_TIMEZONE_INT, _on_time_changed, data); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_SETAPPL_TIMEZONE_INT, ret); + ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SVC_ROAM, _on_time_changed, data); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_TELEPHONY_SVC_ROAM, ret); + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_TIMEZONE_ID, _on_time_changed, data); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_SETAPPL_TIMEZONE_ID, ret); +} + +static void _noti_time_fini(void *data) +{ + int ret = 0; + struct appdata *ad = data; + retif_nomsg(ad == NULL, ); + + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_TIMEZONE_INT, _on_time_changed); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_SETAPPL_TIMEZONE_INT, ret); + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_TIMEZONE_ID, _on_time_changed); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_SETAPPL_TIMEZONE_ID, ret); + ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SVC_ROAM, _on_time_changed); + msgif(ret != 0, "failed to set key(%s) : %d", VCONFKEY_TELEPHONY_SVC_ROAM, ret); +} + +HAPI void quickpanel_noti_update_by_system_time_changed_cb(system_settings_key_e *key, void *data) +{ + struct appdata *ad = data; + +#ifdef HAVE_X + if (key == SYSTEM_SETTINGS_KEY_TIME_CHANGED + ||key == SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY ){ + _on_time_changed(key,data); + } else +#endif + { //key == SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR + _notification_time_format_changed_cb(data); + } +} + + +HAPI void quickpanel_noti_init_noti_section(void) +{ + if (s_info.ongoing_noti_section_view == NULL) { + _ongoing_noti_section_add(); + } } diff --git a/daemon/notifications/noti.h b/daemon/notifications/noti.h index 5bac7b0..7c4cda2 100755 --- a/daemon/notifications/noti.h +++ b/daemon/notifications/noti.h @@ -1,25 +1,45 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 __NOTI_H__ #define __NOTI_H__ #include "quickpanel-ui.h" +#include "noti_node.h" +#include <system_settings.h> #define NOTI_PRESS_BG 0 #define NOTI_PRESS_BUTTON_1 1 -char *quickpanel_noti_get_time(time_t t, char *buf, int buf_len); + +#define QP_PRELOAD_NOTI_ICON_PATH "/usr/apps/org.tizen.quickpanel/shared/res/noti_icons" + +int quickpanel_noti_get_count(void); +int quickpanel_noti_get_geometry(int *limit_h, int *limit_partial_h, int *limit_partial_w); +void quickpanel_noti_closing_trigger_set(void); + +noti_node_item *quickpanel_noti_node_get_by_priv_id(int priv_id); +noti_node_item *quickpanel_noti_node_get_first_noti(void); + +void quickpanel_noti_set_clear_all_status(); + +void quickpanel_noti_on_clear_all_clicked(void *data, Evas_Object *obj, void *info); +int quickpanel_noti_get_type_count(notification_type_e noti_type); +void quickpanel_noti_init_noti_section(void); +void quickpanel_noti_update_by_system_time_changed_cb(system_settings_key_e *key, void *data); + #endif diff --git a/daemon/notifications/noti_box.c b/daemon/notifications/noti_box.c index 3ca6cb8..00cd204 100755 --- a/daemon/notifications/noti_box.c +++ b/daemon/notifications/noti_box.c @@ -1,21 +1,23 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 <string.h> -#include <Ecore_X.h> +#include <notification.h> #include "quickpanel-ui.h" #include "common.h" @@ -25,50 +27,185 @@ #include "noti_node.h" #include "noti.h" #include "noti_util.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif #ifdef QP_ANIMATED_IMAGE_ENABLE #include "animated_image.h" #endif +#include "animated_icon.h" #define IMAGE_NO_RESIZE 0 #define IMAGE_RESIZE 1 +#define IMAGE_BY_FILE 0 +#define IMAGE_BY_BUFFER 1 + #define TEXT_NO_CR 0 #define TEXT_CR 1 -static void _noti_box_call_item_cb(Evas_Object *noti_box, const char *emission) { +#define THRESHOLD_DRAGGING_TIME_LIMIT 1.0 +#define LIMIT_ZOOM_RATIO 0.55 +#define LIMIT_FADEOUT_RATIO 0.1 +#define THRESHOLD_DELETE_START 80 +#define THRESHOLD_DELETE_START_Y_LIMIT 60 +#define THRESHOLD_DISTANCE ((BOX_WIDTH_P >> 1)) + +static struct _info { + int box_debug_step; +} s_info = { + .box_debug_step = 0, +}; + +static Evas_Object *_check_duplicated_image_loading(Evas_Object *obj, const char *part, const char *file_path) +{ + Evas_Object *old_ic = NULL; + const char *old_ic_path = NULL; + + retif(obj == NULL, NULL, "Invalid parameter!"); + retif(part == NULL, NULL, "Invalid parameter!"); + retif(file_path == NULL, NULL, "Invalid parameter!"); + + old_ic = elm_object_part_content_get(obj, part); + + if (quickpanel_animated_icon_is_same_icon(old_ic, file_path) == 1) { + return old_ic; + } + + if (old_ic != NULL) { + elm_image_file_get(old_ic, &old_ic_path, NULL); + if (old_ic_path != NULL) { + if (strcmp(old_ic_path, file_path) == 0) + return old_ic; + } + + elm_object_part_content_unset(obj, part); + evas_object_del(old_ic); + old_ic = NULL; + } + + return NULL; +} + +static void _noti_box_call_item_cb(Evas_Object *noti_box, const char *emission) +{ retif(noti_box == NULL, , "invalid parameter"); retif(emission == NULL, , "invalid parameter"); - INFO("recevied emission:%s", emission); + double time_current = 0.0; + static double time_called = 0.0; + + if (time_called == 0) { + time_called = ecore_loop_time_get(); + } else { + time_current = ecore_loop_time_get(); + if ((time_current - time_called) < 0.4) { + DBG("click rejected"); + return; + } + } void (*cb)(void *data, Evas_Object *obj) = NULL; noti_box_h *data = NULL; - data = evas_object_data_get(noti_box, E_DATA_NOTI_BOX_H); + retif(data == NULL, , "invalid parameter"); if (strncmp(emission,"selected", strlen("selected")) == 0) { + if (data->need_to_cancel_press > 0) { + data->need_to_cancel_press = 0; + return; + } + cb = evas_object_data_get(noti_box, E_DATA_CB_SELECTED_ITEM); - if (cb != NULL && data != NULL) { - cb(data->data, noti_box); + if (cb != NULL) { + cb(data->noti_node, noti_box); } - } - if (strncmp(emission,"button_1", strlen("button_1")) == 0) { + time_called = time_current; + } else if (strncmp(emission,"button_1", strlen("button_1")) == 0) { + if (data->need_to_cancel_press > 0) { + data->need_to_cancel_press = 0; + return; + } + cb = evas_object_data_get(noti_box, E_DATA_CB_BUTTON_1); - if (cb != NULL && data != NULL) { - cb(data->data, noti_box); + if (cb != NULL) { + cb(data->noti_node, noti_box); } - } - if (strncmp(emission,"deleted", strlen("deleted")) == 0) { + time_called = time_current; + } else if (strncmp(emission,"deleted", strlen("deleted")) == 0) { + data->need_to_cancel_press = 0; cb = evas_object_data_get(noti_box, E_DATA_CB_DELETED_ITEM); if (cb != NULL && data != NULL) { - cb(data->data, noti_box); + cb(data->noti_node, noti_box); } } } +noti_box_h *_box_handler_get(Evas_Object *obj) +{ + + return evas_object_data_get(obj, E_DATA_NOTI_BOX_H); +} + +static void _attach_memfile(Evas_Object *noti_box, notification_image_type_e image_type, void *memfile) +{ + char buf[32] = {0,}; + + snprintf(buf, sizeof(buf), "%s_%d", E_DATA_NOTI_BOX_MB_BG, image_type); + + void *memfile_attached = evas_object_data_get(noti_box, buf); + if (memfile_attached != NULL) { + free(memfile_attached); + } + evas_object_data_set(noti_box, buf, memfile); +} + +static void _deattach_memfile_all(Evas_Object *noti_box) +{ + char buf[32] = {0,}; + void *memfile = NULL; + int i = NOTIFICATION_TEXT_TYPE_NONE + 1; + + for ( ; i < NOTIFICATION_TEXT_TYPE_MAX; i++) { + snprintf(buf, sizeof(buf), "%s_%d", E_DATA_NOTI_BOX_MB_BG, i); + + memfile = evas_object_data_get(noti_box, buf); + if (memfile != NULL) { + free(memfile); + } + evas_object_data_set(noti_box, buf, NULL); + evas_object_data_del(noti_box, buf); + } +} + +static void _text_clean_all(Evas_Object *noti_box) +{ + int i = 0; + const char *text_parts[] = { + "object.text.title", + "object.text.contents", + "object.text.contents.multiline.short", + "object.text.contents.multiline", + "object.text.count", + "object.text.info.1", + "object.text.info.1.short", + "object.text.info.1.multiline", + "object.text.info.sub.1", + "object.text.info.2", + "object.text.info.2.short", + "object.text.info.sub.2", + NULL + }; + + for (i = 0; text_parts[i] != NULL; i++) { + elm_object_part_text_set(noti_box, text_parts[i], ""); + elm_object_part_text_set(noti_box, text_parts[i], NULL); + } +} + static void _signal_cb(void *data, Evas_Object *o, const char *emission, const char *source) { retif(data == NULL, , "invalid parameter"); @@ -78,8 +215,317 @@ static void _signal_cb(void *data, Evas_Object *o, const char *emission, const c _noti_box_call_item_cb(o, emission); } +#ifdef QP_SCREENREADER_ENABLE +static inline void _check_and_add_to_buffer(notification_h noti, + notification_text_type_e text_type, Eina_Strbuf *str_buf) +{ + char buf[256] = { 0, }; + char buf_number[QP_UTIL_PHONE_NUMBER_MAX_LEN * 2] = { 0, }; + + char *text = NULL; + time_t time = 0; -HAPI Evas_Object *noti_box_create(Evas_Object *parent, notification_ly_type_e layout) { + if (notification_get_time_from_text(noti, text_type, &time) == NOTIFICATION_ERROR_NONE) { + if ((int)time > 0) { + quickpanel_noti_util_get_time(time, buf, sizeof(buf)); + text = buf; + } + } else { + notification_get_text(noti, text_type, &text); + } + + if (text != NULL) { + if (strlen(text) > 0) { + if (quickpanel_common_util_is_phone_number(text)) { + quickpanel_common_util_phone_number_tts_make(buf_number, text, + (QP_UTIL_PHONE_NUMBER_MAX_LEN * 2) - 1); + DBG("[%s]", buf_number); + eina_strbuf_append(str_buf, buf_number); + } else { + eina_strbuf_append(str_buf, text); + } + eina_strbuf_append_char(str_buf, '\n'); + } + } +} + +static void _noti_box_set_rs_layout_single(Evas_Object *noti_box, + notification_h noti) +{ + Evas_Object *ao = NULL; + Eina_Strbuf *str_buf = NULL; + char *dir = NULL; + char *domain = NULL; + + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + str_buf = eina_strbuf_new(); + retif(str_buf == NULL, , "invalid parameter"); + + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_TITLE, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_CONTENT, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_1, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_2, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2, str_buf); + + if (str_buf != NULL) { + ao = quickpanel_accessibility_screen_reader_object_get(noti_box, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", noti_box); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _("IDS_QP_BUTTON_NOTIFICATION")); + elm_access_info_set(ao, ELM_ACCESS_INFO, eina_strbuf_string_get(str_buf)); + } + + eina_strbuf_free(str_buf); + } +} + +static void _noti_box_set_rs_layout_multi(Evas_Object *noti_box, + notification_h noti) +{ + DBG(""); + + Evas_Object *ao = NULL; + Eina_Strbuf *str_buf = NULL; + char *dir = NULL; + char *domain = NULL; + + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + str_buf = eina_strbuf_new(); + retif(str_buf == NULL, , "invalid parameter"); + + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_TITLE, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_CONTENT, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_1, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_2, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2, str_buf); + + if (str_buf != NULL) { + ao = quickpanel_accessibility_screen_reader_object_get(noti_box, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", noti_box); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _("IDS_QP_BUTTON_NOTIFICATION")); + elm_access_info_set(ao, ELM_ACCESS_INFO, eina_strbuf_string_get(str_buf)); + } + + eina_strbuf_free(str_buf); + } +} + +static void _noti_box_set_rs_layout_thumbnail(Evas_Object *noti_box, + notification_h noti) +{ + DBG(""); + + Evas_Object *ao = NULL; + Eina_Strbuf *str_buf = NULL; + char *dir = NULL; + char *domain = NULL; + + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + str_buf = eina_strbuf_new(); + retif(str_buf == NULL, , "invalid parameter"); + + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_TITLE, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_CONTENT, str_buf); + + if (str_buf != NULL) { + DBG("access:%s", eina_strbuf_string_get(str_buf)); + + ao = quickpanel_accessibility_screen_reader_object_get(noti_box, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", noti_box); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _("IDS_QP_BUTTON_NOTIFICATION")); + elm_access_info_set(ao, ELM_ACCESS_INFO, eina_strbuf_string_get(str_buf)); + } + + eina_strbuf_free(str_buf); + } +} +#endif + +static Eina_Bool _drag_cancel_cb(void *data) +{ + QP_VI *vi = data; + noti_box_h *box_h = NULL; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + if (vi->target != NULL) { + DBG("Canceling dragging"); + + box_h = _box_handler_get(vi->target); + retif(box_h == NULL, EINA_FALSE, "box_h is NULL"); + + box_h->state = NOTIBOX_STATE_GETSTURE_CANCELED; + evas_object_map_enable_set(vi->target, EINA_FALSE); + + box_h->vi = NULL; + } + + return EINA_TRUE; +} + +static void _mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int w = 0, h = 0; + noti_box_h *box_h = NULL; + Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info; + retif(ev == NULL, , "event_info is NULL"); + + box_h = _box_handler_get(obj); + retif(box_h == NULL, , "box_h is NULL"); + + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + + box_h->press_x = ev->canvas.x; + box_h->press_y = ev->canvas.y; + box_h->obj_w = w; + box_h->obj_h = h; + box_h->state = NOTIBOX_STATE_NORMAL; + + s_info.box_debug_step = 1; + SDBG("mouse down:%d %d %d", box_h->obj_w, box_h->obj_h, box_h->state); + + if (box_h->vi != NULL) { + quickpanel_vi_user_event_del(box_h->vi); + box_h->vi = NULL; + } + + box_h->need_to_cancel_press = 0; +} + +static void _mouse_move_cb(void* data, Evas* e, Evas_Object* obj, void* event_info) +{ + int delta_x = 0; + int delta_y = 0; + static int delta_prev = -1; + int x = 0, y = 0; + int w = 0, h = 0; + noti_box_h *box_h = NULL; + double zoom_ratio = 0.0; + double color_ratio = 0.0; + Evas_Map *map = NULL; + Evas_Event_Mouse_Move* ev = event_info; + QP_VI *vi = NULL; + retif(ev == NULL, , "event_info is NULL"); + + box_h = _box_handler_get(obj); + retif(box_h == NULL, , "box_h is NULL"); + + if (box_h->state == NOTIBOX_STATE_GETSTURE_CANCELED) { + DBG("deletion has been canceled"); + return; + } + + evas_object_geometry_get(obj, &x, &y, &w, &h); + delta_x = abs(box_h->press_x - ev->cur.output.x); + delta_y = abs(box_h->press_y - ev->cur.output.y); + + if (s_info.box_debug_step == 1) { + SDBG("mouse move:%d %d %d", delta_x, delta_y, box_h->state); + s_info.box_debug_step = 2; + } + + if (box_h->state == NOTIBOX_STATE_NORMAL) { + if (delta_x >= THRESHOLD_DELETE_START + && delta_y <= THRESHOLD_DELETE_START_Y_LIMIT) { + DBG("start a deletion"); + box_h->state = NOTIBOX_STATE_GETSTURE_WAIT; + + vi = quickpanel_vi_new_with_data( + VI_OP_DELETE, + QP_ITEM_TYPE_NOTI, + NULL, + obj, + NULL, + NULL, + NULL, + _drag_cancel_cb, + vi, + NULL, + 0, + 0); + box_h->vi = vi; + box_h->need_to_cancel_press = 1; + quickpanel_vi_user_event_add(vi); + } + } else if (box_h->state == NOTIBOX_STATE_GETSTURE_WAIT) { + if (delta_prev != delta_x) { + delta_x = (delta_x > THRESHOLD_DISTANCE) ? THRESHOLD_DISTANCE : delta_x; + delta_x = (delta_x <= 0) ? 1 : delta_x; + zoom_ratio = (1.0 - LIMIT_ZOOM_RATIO) * (1.0 - (double)delta_x / (double)THRESHOLD_DISTANCE); + color_ratio = LIMIT_FADEOUT_RATIO + + ((1.0 - LIMIT_FADEOUT_RATIO) * (1.0 - ((double)delta_x / (double)(THRESHOLD_DISTANCE)))); + + map = evas_map_new(4); + if (map != NULL) { + evas_map_util_points_populate_from_object(map, obj); + evas_map_util_zoom(map + , LIMIT_ZOOM_RATIO + zoom_ratio + , LIMIT_ZOOM_RATIO + zoom_ratio + , x + (w >> 1) + , y + (h >> 1)); + evas_map_util_points_color_set(map + , 255 * color_ratio + , 255 * color_ratio + , 255 * color_ratio + , 255 * color_ratio); + evas_object_map_enable_set(obj, EINA_TRUE); + evas_object_map_set(obj, map); + evas_map_free(map); + quickpanel_list_util_scroll_freeze_set(EINA_TRUE); + } + delta_prev = delta_x; + } + } + + box_h->distance = delta_x; +} + +static void _mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + noti_box_h *box_h = NULL; + box_h = _box_handler_get(obj); + retif(box_h == NULL, , "box_h is NULL"); + + quickpanel_list_util_scroll_freeze_set(EINA_FALSE); + + if (s_info.box_debug_step == 2) { + SDBG("mouse up:%d", box_h->state); + s_info.box_debug_step = 3; + } + + if (box_h->state == NOTIBOX_STATE_GETSTURE_WAIT) { + if (box_h->distance >= (THRESHOLD_DISTANCE - 10)) { + _noti_box_call_item_cb(obj, "deleted"); + } else { + evas_object_map_enable_set(obj, EINA_FALSE); + } + + if (box_h->vi != NULL) { + quickpanel_vi_user_event_del(box_h->vi); + box_h->vi = NULL; + } + } + + box_h->state = NOTIBOX_STATE_NORMAL; +} + +HAPI Evas_Object *quickpanel_noti_box_create(Evas_Object *parent, notification_ly_type_e layout) +{ Evas_Object *box = NULL; box = elm_layout_add(parent); @@ -100,11 +546,15 @@ HAPI Evas_Object *noti_box_create(Evas_Object *parent, notification_ly_type_e la evas_object_show(box); noti_box_h *box_h = (noti_box_h *) malloc(sizeof(noti_box_h)); + retif(box_h == NULL, NULL, "failed to allocate a memory"); + + box_h->state = NOTIBOX_STATE_NORMAL; box_h->layout = layout; - box_h->status = STATE_NORMAL; - box_h->data = NULL; + box_h->noti_node = NULL; evas_object_data_set(box, E_DATA_NOTI_BOX_H, box_h); - INFO("created notibox:%p", box); + + Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(box); + elm_object_part_content_set(box, "focus", focus); //add event elm_object_signal_callback_add(box, @@ -130,56 +580,74 @@ HAPI Evas_Object *noti_box_create(Evas_Object *parent, notification_ly_type_e la parent ); + evas_object_event_callback_add(box, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, NULL); + evas_object_event_callback_add(box, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, NULL); + evas_object_event_callback_add(box, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, NULL); + return box; } -static Evas_Object *_set_image(Evas_Object *noti_box, notification_h noti, - notification_image_type_e image_type, const char *part, int is_stretch) { - +static Evas_Object *_set_image(Evas_Object *noti_box, notification_h noti, char *image_path, + notification_image_type_e image_type, const char *part, int is_stretch, int is_use_buffer) +{ Evas_Object *content = NULL; char *image = NULL; - int w = 0, h =0; - int part_w = 0, part_h =0; - double scale = 1.0; - + char ext[32] = {0,}; + void *memfile = NULL; + size_t memfile_size = 0; retif(part == NULL, NULL,"invalid parameter"); - struct appdata *ad = quickpanel_get_app_data(); - if (ad != NULL) { - scale = ad->scale; - } - notification_get_image(noti, image_type, &image); + if (image == NULL && image_path != NULL) { + image = image_path; + } if (image != NULL) { - content = elm_image_add(noti_box); - elm_image_file_set(content, image, image); + if (is_use_buffer == IMAGE_BY_BUFFER) { + content = quickpanel_animated_icon_get(noti_box, image); + if (content == NULL) { + content = elm_image_add(noti_box); + + memfile = quickpanel_common_ui_get_buffer_from_image(image, &memfile_size, ext, sizeof(ext)); + if (memfile != NULL && memfile_size > 0) { + _attach_memfile(noti_box, image_type, memfile); + if (elm_image_memfile_set(content, memfile, memfile_size, ext, + quickpanel_animated_image_get_groupname(image)) == EINA_FALSE) { + ERR("failed to set memfile set"); + elm_image_file_set(content, image, + quickpanel_animated_image_get_groupname(image)); + } + } else { + if (memfile) { + free(memfile); // due to prevent + } + elm_image_file_set(content, image, + quickpanel_animated_image_get_groupname(image)); + } + } + } else { + content = _check_duplicated_image_loading(noti_box, part, image); + if (content == NULL) { + content = quickpanel_animated_icon_get(noti_box, image); + if (content == NULL) { + content = elm_image_add(noti_box); + + elm_image_file_set(content, image, + quickpanel_animated_image_get_groupname(image)); + } + } else { + return content; + } + } if (is_stretch == IMAGE_RESIZE) { elm_image_aspect_fixed_set(content, EINA_FALSE); elm_image_resizable_set(content, EINA_TRUE, EINA_TRUE); } else { - elm_image_object_size_get(content, &w, &h); - - if (strcmp(part, BOX_PART_ICON) == 0) { - part_w = scale * BOX_ICON_SIZE_W; - part_h = scale * BOX_ICON_SIZE_H; - } - if (strcmp(part, BOX_PART_ICON_SUB) == 0) { - part_w = scale * BOX_ICON_SUB_SIZE_W; - part_h = scale * BOX_ICON_SUB_SIZE_H; - } - - if (part_w != 0 && part_h != 0) { - if (w > part_w || h > part_h) { - elm_image_aspect_fixed_set(content, EINA_FALSE); - elm_image_resizable_set(content, EINA_TRUE, EINA_TRUE); - } else { - elm_image_aspect_fixed_set(content, EINA_TRUE); - elm_image_resizable_set(content, EINA_FALSE, EINA_FALSE); - } + if (strcmp(part, BOX_PART_ICON) == 0 || strcmp(part, BOX_PART_ICON_SUB) == 0) { + elm_image_resizable_set(content, EINA_FALSE, EINA_TRUE); } else { elm_image_aspect_fixed_set(content, EINA_TRUE); - elm_image_resizable_set(content, EINA_FALSE, EINA_FALSE); + elm_image_fill_outside_set(content, EINA_TRUE); } } @@ -191,16 +659,19 @@ static Evas_Object *_set_image(Evas_Object *noti_box, notification_h noti, } static int _set_text(Evas_Object *noti_box, notification_h noti, - notification_text_type_e text_type, const char *part, int is_need_effect, int is_support_cr) { + notification_text_type_e text_type, const char *part, char *str, int is_need_effect, int is_support_cr) +{ char buf[128] = { 0, }; char *text = NULL; char *text_utf8 = NULL; time_t time = 0; - if (notification_get_time_from_text(noti, text_type, &time) == NOTIFICATION_ERROR_NONE) { + if (str != NULL) { + text = str; + } else if (notification_get_time_from_text(noti, text_type, &time) == NOTIFICATION_ERROR_NONE) { if ((int)time > 0) { - quickpanel_noti_get_time(time, buf, sizeof(buf)); + quickpanel_noti_util_get_time(time, buf, sizeof(buf)); text = buf; } } else { @@ -219,14 +690,15 @@ static int _set_text(Evas_Object *noti_box, notification_h noti, elm_object_part_text_set(noti_box, part, text); } } else { - quickpanel_util_char_replace(text, _NEWLINE, _SPACE); + quickpanel_common_util_char_replace(text, _NEWLINE, _SPACE); elm_object_part_text_set(noti_box, part, text); } - if (is_need_effect == 1) + if (is_need_effect == 1) { elm_object_signal_emit(noti_box, "object.show.effect", part); - else + } else { elm_object_signal_emit(noti_box, "object.show", part); + } } return strlen(text); @@ -236,7 +708,8 @@ static int _set_text(Evas_Object *noti_box, notification_h noti, } static int _check_text_null(notification_h noti, - notification_text_type_e text_type) { + notification_text_type_e text_type) +{ char *text = NULL; notification_get_text(noti, text_type, &text); @@ -249,7 +722,8 @@ static int _check_text_null(notification_h noti, } static int _check_image_null(notification_h noti, - notification_image_type_e image_type) { + notification_image_type_e image_type) +{ char *image = NULL; notification_get_image(noti, image_type, &image); @@ -266,12 +740,16 @@ static int _check_image_null(notification_h noti, } static void _noti_box_set_layout_single(Evas_Object *noti_box, - notification_h noti) { + notification_h noti) +{ char *dir = NULL; char *domain = NULL; + char *pkgname = NULL; + char *icon_path = NULL; int is_need_effect = 0; int is_contents_only = 0; int is_sub_info_1_only = 0; + int is_contents_and_sub_info_2 = 0; Evas_Object *icon = NULL; if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { @@ -292,89 +770,134 @@ static void _noti_box_set_layout_single(Evas_Object *noti_box, is_sub_info_1_only = 1; } + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 + && (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) != 1 + || _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) != 1)) { + is_contents_and_sub_info_2 = 1; + } + DBG("is_contents_only:%d is_sub_info_1_only:%d", is_contents_only, is_sub_info_1_only); + notification_get_pkgname(noti, &pkgname); notification_get_text_domain(noti, &domain, &dir); - if (domain != NULL && dir != NULL) + if (domain != NULL && dir != NULL) { bindtextdomain(domain, dir); + } _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_TITLE, - "object.text.title", is_need_effect, TEXT_CR); + "object.text.title", NULL, is_need_effect, TEXT_CR); if (is_contents_only == 1) { _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, - "object.text.contents.multiline", is_need_effect, TEXT_CR); + "object.text.contents.multiline", NULL, is_need_effect, TEXT_CR); } else { - _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, - "object.text.contents", is_need_effect, TEXT_NO_CR); + if (is_contents_and_sub_info_2 == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents.multiline.short", NULL, is_need_effect, TEXT_NO_CR); + } else { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_NO_CR); + } if (is_sub_info_1_only == 1) { _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, - "object.text.info.1.multiline", is_need_effect, TEXT_CR); + "object.text.info.1.multiline", NULL, is_need_effect, TEXT_CR); } else { if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 0) { if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1) { _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, - "object.text.info.1", is_need_effect, TEXT_NO_CR); + "object.text.info.1", NULL, is_need_effect, TEXT_NO_CR); } else { _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, - "object.text.info.1.short", is_need_effect, TEXT_NO_CR); + "object.text.info.1.short", NULL, is_need_effect, TEXT_NO_CR); _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, - "object.text.info.sub.1", is_need_effect, TEXT_NO_CR); + "object.text.info.sub.1", NULL, is_need_effect, TEXT_NO_CR); } } _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_2, - "object.text.info.2", is_need_effect, TEXT_NO_CR); + "object.text.info.2", NULL, is_need_effect, TEXT_NO_CR); } } if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_ICON, - "object.icon.sub", IMAGE_NO_RESIZE); - icon = _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, - "object.icon", IMAGE_NO_RESIZE); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); #ifdef QP_ANIMATED_IMAGE_ENABLE quickpanel_animated_image_add(icon); #endif } else { - icon = _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_ICON, - "object.icon", IMAGE_NO_RESIZE); + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); #ifdef QP_ANIMATED_IMAGE_ENABLE quickpanel_animated_image_add(icon); #endif - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB, - "object.icon.sub", IMAGE_NO_RESIZE); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON_SUB, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); } - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND, - "object.icon.background", IMAGE_RESIZE); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_BACKGROUND, + "object.icon.background", IMAGE_NO_RESIZE, IMAGE_BY_BUFFER); - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { - elm_object_signal_emit(noti_box, "box.show.dim", "box.prog"); - } - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 1 && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { - elm_object_signal_emit(noti_box, "box.hide.icon.bg", "box.prog"); - } - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 0 - || _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { - elm_object_signal_emit(noti_box, "box.show.sub.bg", "box.prog"); + + icon_path = quickpanel_common_ui_get_pkginfo_icon(pkgname); + if (icon_path != NULL) { + _set_image(noti_box, NULL, + icon_path, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + free(icon_path); + } + } else { + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { + elm_object_signal_emit(noti_box, "box.show.dim", "box.prog"); + } + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { + elm_object_signal_emit(noti_box, "box.hide.icon.bg", "box.prog"); + elm_object_signal_emit(noti_box, "box.title.without.icon", "box.prog"); + } + if (((_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 0 + || _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 0)) { + elm_object_signal_emit(noti_box, "box.show.sub.bg", "box.prog"); + } } + +#ifdef QP_SCREENREADER_ENABLE + _noti_box_set_rs_layout_single(noti_box, noti); +#endif } static void _noti_box_set_layout_multi(Evas_Object *noti_box, - notification_h noti) { - int length = 0; + notification_h noti) +{ + char *pkgname = NULL; + char *icon_path = NULL; char *dir = NULL; char *domain = NULL; - char buf[128] = {0,}; int is_need_effect = 0; + int is_contents_only = 0; int is_sub_info_1_only = 0; + int is_contents_and_sub_info_2 = 0; Evas_Object *icon = NULL; if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { is_need_effect = 1; } + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) == 1) { + is_contents_only = 1; + } + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) != 1 && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 1 @@ -382,264 +905,408 @@ static void _noti_box_set_layout_multi(Evas_Object *noti_box, is_sub_info_1_only = 1; } + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 + && (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) != 1 + || _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) != 1)) { + is_contents_and_sub_info_2 = 1; + } + DBG("is_sub_info_1_only:%d", is_sub_info_1_only); + notification_get_pkgname(noti, &pkgname); notification_get_text_domain(noti, &domain, &dir); - if (domain != NULL && dir != NULL) + if (domain != NULL && dir != NULL) { bindtextdomain(domain, dir); + } _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_TITLE, - "object.text.title", is_need_effect, TEXT_CR); + "object.text.title", NULL, is_need_effect, TEXT_CR); if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT) == 0) { - _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, - "object.text.contents.short", is_need_effect, TEXT_NO_CR); - length = _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, - "object.text.count", is_need_effect, TEXT_NO_CR); - length = (length >= 5) ? 5 : length; - snprintf(buf, sizeof(buf), "box.count.%d", length); - elm_object_signal_emit(noti_box, buf, "box.prog"); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, "object.text.count", NULL, + is_need_effect, TEXT_NO_CR); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, "object.text.contents", NULL, + is_need_effect, TEXT_NO_CR); } else { - _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, - "object.text.contents", is_need_effect, TEXT_NO_CR); + if (is_contents_only == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents.multiline", NULL, is_need_effect, TEXT_CR); + } else if (is_contents_and_sub_info_2 == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents.multiline.short", NULL, is_need_effect, TEXT_NO_CR); + } else { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_NO_CR); + } } if (is_sub_info_1_only == 1) { _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, - "object.text.info.1.multiline", is_need_effect, TEXT_CR); + "object.text.info.1.multiline", NULL, is_need_effect, TEXT_CR); } else { if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 0) { if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1) { _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, - "object.text.info.1", is_need_effect, TEXT_NO_CR); + "object.text.info.1", NULL, is_need_effect, TEXT_NO_CR); } else { _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, - "object.text.info.1.short", is_need_effect, TEXT_NO_CR); + "object.text.info.1.short", NULL, is_need_effect, TEXT_NO_CR); _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, - "object.text.info.sub.1", is_need_effect, TEXT_NO_CR); + "object.text.info.sub.1", NULL, is_need_effect, TEXT_NO_CR); } } if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 0) { if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) == 1) { _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_2, - "object.text.info.2", is_need_effect, TEXT_NO_CR); + "object.text.info.2", NULL, is_need_effect, TEXT_NO_CR); } else { _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_2, - "object.text.info.2.short", is_need_effect, TEXT_NO_CR); + "object.text.info.2.short", NULL, is_need_effect, TEXT_NO_CR); _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2, - "object.text.info.sub.2", is_need_effect, TEXT_NO_CR); + "object.text.info.sub.2", NULL, is_need_effect, TEXT_NO_CR); } } } if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_ICON, - "object.icon.sub", IMAGE_NO_RESIZE); - icon = _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, - "object.icon", IMAGE_NO_RESIZE); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); #ifdef QP_ANIMATED_IMAGE_ENABLE quickpanel_animated_image_add(icon); #endif } else { - icon = _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_ICON, - "object.icon", IMAGE_NO_RESIZE); + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); #ifdef QP_ANIMATED_IMAGE_ENABLE quickpanel_animated_image_add(icon); #endif - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB, - "object.icon.sub", IMAGE_NO_RESIZE); - } - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND, - "object.icon.background", IMAGE_RESIZE); - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { - elm_object_signal_emit(noti_box, "box.show.dim", "box.prog"); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON_SUB, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); } - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_BACKGROUND, + "object.icon.background", IMAGE_NO_RESIZE, IMAGE_BY_BUFFER); + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 1 && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { - elm_object_signal_emit(noti_box, "box.hide.icon.bg", "box.prog"); - } - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 0 - || _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { - elm_object_signal_emit(noti_box, "box.show.sub.bg", "box.prog"); + + icon_path = quickpanel_common_ui_get_pkginfo_icon(pkgname); + if (icon_path != NULL) { + _set_image(noti_box, NULL, + icon_path, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + free(icon_path); + } + } else { + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { + elm_object_signal_emit(noti_box, "box.show.dim", "box.prog"); + } + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { + elm_object_signal_emit(noti_box, "box.hide.icon.bg", "box.prog"); + elm_object_signal_emit(noti_box, "box.title.without.icon", "box.prog"); + } + if (((_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 0 + || _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 0)) { + elm_object_signal_emit(noti_box, "box.show.sub.bg", "box.prog"); + } } + +#ifdef QP_SCREENREADER_ENABLE + _noti_box_set_rs_layout_multi(noti_box, noti); +#endif } static void _noti_box_set_layout_thumbnail(Evas_Object *noti_box, - notification_h noti) { + notification_h noti) +{ + char *pkgname = NULL; + char *icon_path = NULL; char *dir = NULL; char *domain = NULL; int is_need_effect = 0; + int is_sub_info_1_only = 0; + int is_show_info = 0; Evas_Object *icon = NULL; - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { is_need_effect = 1; - else + } else { is_need_effect = 0; + } + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) != 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 1) { + is_sub_info_1_only = 1; + } + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_1)!= 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_2) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_3) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_4) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_5) == 1) { + is_show_info = 1; + } + + notification_get_pkgname(noti, &pkgname); notification_get_text_domain(noti, &domain, &dir); - if (domain != NULL && dir != NULL) + if (domain != NULL && dir != NULL) { bindtextdomain(domain, dir); + } _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_TITLE, - "object.text.title", is_need_effect, TEXT_CR); - _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, - "object.text.contents", is_need_effect, TEXT_NO_CR); + "object.text.title", NULL, is_need_effect, TEXT_CR); + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT) == 0) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, "object.text.count", NULL, + is_need_effect, TEXT_NO_CR); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, "object.text.contents", NULL, + is_need_effect, TEXT_NO_CR); + } else { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_NO_CR); + } + + if (is_show_info == 1) { + if (is_sub_info_1_only == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1.multiline", NULL, is_need_effect, TEXT_CR); + } else { + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 0) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1", NULL, is_need_effect, TEXT_NO_CR); + } + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 0) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_2, + "object.text.info.2", NULL, is_need_effect, TEXT_NO_CR); + } + } + } if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_ICON, - "object.icon.sub", IMAGE_NO_RESIZE); - icon = _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, - "object.icon", IMAGE_NO_RESIZE); + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); #ifdef QP_ANIMATED_IMAGE_ENABLE quickpanel_animated_image_add(icon); #endif + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + } } else { - icon = _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_ICON, - "object.icon", IMAGE_NO_RESIZE); + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); #ifdef QP_ANIMATED_IMAGE_ENABLE quickpanel_animated_image_add(icon); #endif - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB, - "object.icon.sub", IMAGE_NO_RESIZE); - } - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND, - "object.icon.background", IMAGE_RESIZE); - - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_LIST_1, - "object.thumbnail.list.1", IMAGE_RESIZE); - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_LIST_2, - "object.thumbnail.list.2", IMAGE_RESIZE); - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_LIST_3, - "object.thumbnail.list.3", IMAGE_RESIZE); - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_LIST_4, - "object.thumbnail.list.4", IMAGE_RESIZE); - _set_image(noti_box, noti, NOTIFICATION_IMAGE_TYPE_LIST_5, - "object.thumbnail.list.5", IMAGE_RESIZE); - - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { - elm_object_signal_emit(noti_box, "box.show.dim", "box.prog"); + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 0) { + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON_SUB, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + } } - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_BACKGROUND, + "object.icon.background", IMAGE_NO_RESIZE, IMAGE_BY_BUFFER); + + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_1, + "object.thumbnail.list.1", IMAGE_RESIZE, IMAGE_BY_BUFFER); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_2, + "object.thumbnail.list.2", IMAGE_RESIZE, IMAGE_BY_BUFFER); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_3, + "object.thumbnail.list.3", IMAGE_RESIZE, IMAGE_BY_BUFFER); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_4, + "object.thumbnail.list.4", IMAGE_RESIZE, IMAGE_BY_BUFFER); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_5, + "object.thumbnail.list.5", IMAGE_RESIZE, IMAGE_BY_BUFFER); + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 1 && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { - elm_object_signal_emit(noti_box, "box.hide.icon.bg", "box.prog"); - } - if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 0 - || _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { - elm_object_signal_emit(noti_box, "box.show.sub.bg", "box.prog"); + + icon_path = quickpanel_common_ui_get_pkginfo_icon(pkgname); + if (icon_path != NULL) { + _set_image(noti_box, NULL, + icon_path, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + free(icon_path); + } + } else { + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { + elm_object_signal_emit(noti_box, "box.show.dim", "box.prog"); + } + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { + elm_object_signal_emit(noti_box, "box.hide.icon.bg", "box.prog"); + elm_object_signal_emit(noti_box, "box.title.without.icon", "box.prog"); + } + if (((_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 0 + || _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 0)) { + elm_object_signal_emit(noti_box, "box.show.sub.bg", "box.prog"); + } } + +#ifdef QP_SCREENREADER_ENABLE + _noti_box_set_rs_layout_thumbnail(noti_box, noti); +#endif } static void _noti_box_set_layout(Evas_Object *noti_box, notification_h noti, - notification_ly_type_e layout) { + notification_ly_type_e layout) +{ - INFO("layout:%d", layout); + DBG("notification box layout:%d", layout); switch (layout) { - case NOTIFICATION_LY_NOTI_EVENT_SINGLE: - _noti_box_set_layout_single(noti_box, noti); - break; - case NOTIFICATION_LY_NOTI_EVENT_MULTIPLE: - _noti_box_set_layout_multi(noti_box, noti); - break; - case NOTIFICATION_LY_NOTI_THUMBNAIL: - _noti_box_set_layout_thumbnail(noti_box, noti); - break; - case NOTIFICATION_LY_NONE: - case NOTIFICATION_LY_ONGOING_EVENT: - case NOTIFICATION_LY_ONGOING_PROGRESS: - case NOTIFICATION_LY_MAX: - ERR("not supported layout type:%d", layout); - break; - } -} - -HAPI void noti_box_remove(Evas_Object *noti_box) { + case NOTIFICATION_LY_NOTI_EVENT_SINGLE: + _noti_box_set_layout_single(noti_box, noti); + break; + case NOTIFICATION_LY_NOTI_EVENT_MULTIPLE: + _noti_box_set_layout_multi(noti_box, noti); + break; + case NOTIFICATION_LY_NOTI_THUMBNAIL: + _noti_box_set_layout_thumbnail(noti_box, noti); + break; + case NOTIFICATION_LY_NONE: + case NOTIFICATION_LY_ONGOING_EVENT: + case NOTIFICATION_LY_ONGOING_PROGRESS: + case NOTIFICATION_LY_MAX: + ERR("not supported layout type:%d", layout); + break; + } +} + +HAPI void quickpanel_noti_box_remove(Evas_Object *noti_box) +{ retif(noti_box == NULL, , "invalid parameter"); noti_box_h *noti_box_h = evas_object_data_get(noti_box, E_DATA_NOTI_BOX_H); - if (noti_box_h != NULL) + evas_object_data_del(noti_box, E_DATA_NOTI_BOX_H); + if (noti_box_h != NULL) { free(noti_box_h); + } - evas_object_data_del(noti_box, E_DATA_NOTI_BOX_H); evas_object_data_del(noti_box, E_DATA_CB_SELECTED_ITEM); evas_object_data_del(noti_box, E_DATA_CB_DELETED_ITEM); - INFO("removed notibox:%p", noti_box); + _deattach_memfile_all(noti_box); evas_object_del(noti_box); + noti_box = NULL; } -HAPI void noti_box_set_status(Evas_Object *noti_box, int status) { - retif(noti_box == NULL, , "invalid parameter"); - - noti_box_h *noti_box_h = evas_object_data_get(noti_box, E_DATA_NOTI_BOX_H); - - if (noti_box_h != NULL) { - noti_box_h->status = status; - } -} - -HAPI int noti_box_get_status(Evas_Object *noti_box) { - retif(noti_box == NULL, STATE_NORMAL, "invalid parameter"); - - noti_box_h *noti_box_h = evas_object_data_get(noti_box, E_DATA_NOTI_BOX_H); - - if (noti_box_h != NULL) { - return noti_box_h->status; - } - - return STATE_DELETING; -} - -HAPI void noti_box_node_set(Evas_Object *noti_box, void *data) { +HAPI void quickpanel_noti_box_node_set(Evas_Object *noti_box, void *noti_node) +{ + int priv_id = -1; + noti_node_item *item = noti_node; retif(noti_box == NULL, , "invalid parameter"); - retif(data == NULL, , "invalid parameter"); + retif(item == NULL, , "invalid parameter"); + retif(item->noti == NULL, , "invalid parameter"); noti_box_h *noti_box_data = evas_object_data_get(noti_box, E_DATA_NOTI_BOX_H); + notification_get_id(item->noti, NULL, &priv_id); + if (noti_box_data != NULL) { - noti_box_data->data = data; + noti_box_data->noti_node = item; + noti_box_data->priv_id = priv_id; - if (data != NULL) { - noti_node_item *item = data; - _noti_box_set_layout(noti_box, item->noti, noti_box_data->layout); - } + _noti_box_set_layout(noti_box, item->noti, noti_box_data->layout); } } -HAPI void *noti_box_node_get(Evas_Object *noti_box) { +HAPI void *quickpanel_noti_box_node_get(Evas_Object *noti_box) +{ retif(noti_box == NULL, NULL, "invalid parameter"); noti_box_h *noti_box_data = evas_object_data_get(noti_box, E_DATA_NOTI_BOX_H); if (noti_box_data != NULL) { - return noti_box_data->data; + return noti_box_data->noti_node; } return NULL; } -HAPI void noti_box_set_item_selected_cb(Evas_Object *noti_box, - void(*selected_cb)(void *data, Evas_Object *obj)) { +#ifdef QP_SCREENREADER_ENABLE +static void +_noti_box_focus_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *noti_box = data; + retif(noti_box == NULL, , "invalid parameter"); + + _noti_box_call_item_cb(noti_box, "selected"); + +} +#endif + +HAPI void quickpanel_noti_box_set_item_selected_cb(Evas_Object *noti_box, + void(*selected_cb)(void *data, Evas_Object *obj)) +{ retif(noti_box == NULL, , "invalid parameter"); retif(selected_cb == NULL, , "invalid parameter"); evas_object_data_set(noti_box, E_DATA_CB_SELECTED_ITEM, selected_cb); + +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = NULL; + ao = quickpanel_accessibility_screen_reader_object_get(noti_box, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", noti_box); + if (ao != NULL) { + evas_object_smart_callback_add(ao, "clicked", _noti_box_focus_selected_cb, noti_box); + } +#endif } -HAPI void noti_box_set_item_button_1_cb(Evas_Object *noti_box, - void(*button_1_cb)(void *data, Evas_Object *obj)) { +HAPI void quickpanel_noti_box_set_item_button_1_cb(Evas_Object *noti_box, + void(*button_1_cb)(void *data, Evas_Object *obj)) +{ retif(noti_box == NULL, , "invalid parameter"); retif(button_1_cb == NULL, , "invalid parameter"); evas_object_data_set(noti_box, E_DATA_CB_BUTTON_1, button_1_cb); } -HAPI void noti_box_set_item_deleted_cb(Evas_Object *noti_box, - void(*deleted_cb)(void *data, Evas_Object *obj)) { +HAPI void quickpanel_noti_box_set_item_deleted_cb(Evas_Object *noti_box, + void(*deleted_cb)(void *data, Evas_Object *obj)) +{ retif(noti_box == NULL, , "invalid parameter"); retif(deleted_cb == NULL, , "invalid parameter"); evas_object_data_set(noti_box, E_DATA_CB_DELETED_ITEM, deleted_cb); } + +HAPI void quickpanel_noti_box_item_dragging_cancel(Evas_Object *noti_box) +{ + retif(noti_box == NULL, , "invalid parameter"); + + evas_object_map_enable_set(noti_box, EINA_FALSE); +} + +HAPI void quickpanel_noti_box_item_update(Evas_Object *noti_box) +{ + retif(noti_box == NULL, , "invalid parameter"); + + noti_node_item *item = NULL; + noti_box_h *noti_box_data = evas_object_data_get(noti_box, E_DATA_NOTI_BOX_H); + + if (noti_box_data != NULL) { + if (noti_box_data->noti_node != NULL) { + + item = quickpanel_noti_node_get_by_priv_id(noti_box_data->priv_id); + + if (item != NULL) { + _deattach_memfile_all(noti_box); + _text_clean_all(noti_box); + + _noti_box_set_layout(noti_box, item->noti, noti_box_data->layout); + } + } + } +} diff --git a/daemon/notifications/noti_box.h b/daemon/notifications/noti_box.h index 68ab375..a745d58 100755 --- a/daemon/notifications/noti_box.h +++ b/daemon/notifications/noti_box.h @@ -1,49 +1,68 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 __QUICKPANEL_NOTI_BOX_H__ #define __QUICKPANEL_NOTI_BOX_H__ #include <notification.h> - -#define STATE_NORMAL 1 -#define STATE_DELETING 0 +#include "vi_manager.h" #define E_DATA_NOTI_BOX_H "noti_box" #define E_DATA_CB_SELECTED_ITEM "noti_box_cb_selected" #define E_DATA_CB_BUTTON_1 "noti_box_cb_button_1" #define E_DATA_CB_DELETED_ITEM "noti_box_cb_deleted" +#define E_DATA_NOTI_BOX_MB_BG "noti_box_mb" + +typedef enum _qp_notibox_state_type { + NOTIBOX_STATE_NORMAL = 0, + NOTIBOX_STATE_GETSTURE_WAIT, + NOTIBOX_STATE_GETSTURE_CANCELED, + NOTIBOX_STATE_DELETED, +} qp_notibox_state_type; typedef struct _noti_box_h { int status; - void *data; + int priv_id; + void *noti_node; notification_ly_type_e layout; + + QP_VI *vi; + Ecore_Animator *animator; + + int obj_w; + int obj_h; + int press_x; + int press_y; + int distance; + int need_to_cancel_press; + qp_notibox_state_type state; } noti_box_h; -Evas_Object *noti_box_create(Evas_Object *parent, notification_ly_type_e layout); -void noti_box_node_set(Evas_Object *noti_box, void *data); -void *noti_box_node_get(Evas_Object *noti_box); -void noti_box_remove(Evas_Object *noti_box); -void noti_box_set_item_selected_cb(Evas_Object *noti_box, +Evas_Object *quickpanel_noti_box_create(Evas_Object *parent, notification_ly_type_e layout); +void quickpanel_noti_box_node_set(Evas_Object *noti_box, void *noti_node); +void *quickpanel_noti_box_node_get(Evas_Object *noti_box); +void quickpanel_noti_box_remove(Evas_Object *noti_box); +void quickpanel_noti_box_set_item_selected_cb(Evas_Object *noti_box, void(*selected_cb)(void *data, Evas_Object *obj)); -void noti_box_set_item_button_1_cb(Evas_Object *noti_box, +void quickpanel_noti_box_set_item_button_1_cb(Evas_Object *noti_box, void(*button_1_cb)(void *data, Evas_Object *obj)); -void noti_box_set_item_deleted_cb(Evas_Object *noti_box, +void quickpanel_noti_box_set_item_deleted_cb(Evas_Object *noti_box, void(*deleted_cb)(void *data, Evas_Object *obj)); -int noti_box_get_status(Evas_Object *noti_box); -void noti_box_set_status(Evas_Object *noti_box, int status); - +void quickpanel_noti_box_item_dragging_cancel(Evas_Object *noti_box); +void quickpanel_noti_box_item_update(Evas_Object *noti_box); #endif diff --git a/daemon/notifications/noti_gridbox.c b/daemon/notifications/noti_gridbox.c index fbd2457..3253bdd 100755 --- a/daemon/notifications/noti_gridbox.c +++ b/daemon/notifications/noti_gridbox.c @@ -1,20 +1,20 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ -#include <Ecore_X.h> #include "quickpanel-ui.h" #include "common.h" @@ -22,6 +22,7 @@ #include "quickpanel_def.h" #include "noti_gridbox.h" #include "noti_box.h" +#include "vi_manager.h" #define E_DATA_LAYOUT_PORTRAIT "layout_portrait" #define E_DATA_LAYOUT_LANDSCAPE "layout_landscape" @@ -42,44 +43,98 @@ typedef struct _gridbox_info_layout { int limit_w; } gridbox_info_layout; -typedef struct _gridbox_info_animation { - Evas_Object *gridbox; - Evas_Object *item; +static Eina_Bool _anim_init_cb(void *data); +static Eina_Bool _anim_job_cb(void *data); +static Eina_Bool _anim_done_cb(void *data); - void (*update_cb)(Evas_Object *list, void *data, int is_prepend); - Evas_Object *container; - void *noti; - int pos; -} gridbox_info_animation; +static gridbox_info_layout *_gridbox_get_layout(Evas_Object *gridbox) +{ + struct appdata *ad = quickpanel_get_app_data(); + gridbox_info_layout *info_layout = NULL; -static void _gridbox_layout_get_pos(int order, int *x, int *y, void *data) { - gridbox_info_layout *info_layout = data; + retif(gridbox == NULL, NULL, "invalid parameter"); + retif(ad == NULL, NULL, "invalid data."); - retif(data == NULL, , "invalid parameter"); - retif(x == NULL, , "invalid parameter"); - retif(y == NULL, , "invalid parameter"); + if (ad->angle == 270 || ad->angle == 90) { + info_layout = evas_object_data_get(gridbox, E_DATA_LAYOUT_LANDSCAPE); + } else { + info_layout = evas_object_data_get(gridbox, E_DATA_LAYOUT_PORTRAIT); + } + + return info_layout; +} + +static void _gridbox_layout_get_pos(int order, int *x, int *y, void *data) +{ + gridbox_info_layout *info_layout = data; + retif(info_layout == NULL, , "invalid parameter"); int n_per_row = info_layout->n_per_rows; int row = (order - 1) / n_per_row; int column = (order - 1) - (row * n_per_row); - //DBG("order:%d r:%d c:%d", order, row, column); - int row_x = info_layout->padding_left + ((info_layout->child_w + info_layout->padding_between) * column); int row_y = info_layout->padding_top + ((info_layout->child_h + info_layout->padding_between) * row); - *x = row_x; - *y = row_y; + if (x != NULL) { + *x = row_x; + } + + if (y != NULL) { + *y = row_y; + } +} + +static void _gridbox_layout_get_coord(Evas_Object *gridbox, int num_child, int index, + void *layout_data, int *coord_x, int *coord_y) +{ + int x, y, w, h; + int off_x = 0, off_y = 0; + int child_w; + int space_w = 0; + int num_padding_between = 0; + struct appdata *ad = quickpanel_get_app_data(); + gridbox_info_layout *info_layout = NULL; + + retif(gridbox == NULL, , "invalid parameter"); + retif(ad == NULL, , "invalid data."); + + if (layout_data != NULL) { + info_layout = (gridbox_info_layout *) layout_data; + } else { + info_layout = _gridbox_get_layout(gridbox); + } + retif(info_layout == NULL, , "invalid data."); + + //box geometry + evas_object_geometry_get(gridbox, &x, &y, &w, &h); + + num_padding_between = info_layout->n_per_rows / 2; + num_padding_between += (info_layout->n_per_rows > 1 && (info_layout->n_per_rows % 2) > 0) ? 1 : 0; + + space_w = (info_layout->padding_left * 2) + (info_layout->padding_between * num_padding_between); + child_w = (info_layout->limit_w - space_w) / info_layout->n_per_rows; + + info_layout->child_w = child_w; + _gridbox_layout_get_pos(index, &off_x, &off_y, info_layout); + + if (coord_x != NULL) { + *coord_x = x + off_x; + } + if (coord_y != NULL) { + *coord_y = y + off_y; + } } static void _gridbox_layout(Evas_Object *o, Evas_Object_Box_Data *priv, - void *data) { + void *data) +{ int n_children; - int x, y, w, h; + int x, y; int off_x = 0, off_y = 0; Eina_List *l; Eina_List *l_next; @@ -92,17 +147,17 @@ static void _gridbox_layout(Evas_Object *o, Evas_Object_Box_Data *priv, retif(priv == NULL, , "invalid parameter"); retif(data == NULL, , "invalid parameter"); - gridbox_info_layout *info_layout = (gridbox_info_layout *) data; + gridbox_info_layout *info_layout = _gridbox_get_layout(data); + retif(info_layout == NULL, , "failed to get layout data"); n_children = eina_list_count(priv->children); - DBG("layout function:%d", n_children); if (!n_children) { - evas_object_size_hint_min_set(o, -1, 0); + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(-1), ELM_SCALE_SIZE(0)); return; } //box geometry - evas_object_geometry_get(o, &x, &y, &w, &h); + evas_object_geometry_get(o, &x, &y, NULL, NULL); num_padding_between = info_layout->n_per_rows / 2; num_padding_between += (info_layout->n_per_rows > 1 && (info_layout->n_per_rows % 2) > 0) ? 1 : 0; @@ -112,11 +167,8 @@ static void _gridbox_layout(Evas_Object *o, Evas_Object_Box_Data *priv, info_layout->child_w = child_w; - DBG("grid layout children pos:%d %d", info_layout->child_w, info_layout->child_h); - int order_children = 1; - EINA_LIST_FOREACH_SAFE(priv->children, l, l_next, opt) - { + EINA_LIST_FOREACH_SAFE(priv->children, l, l_next, opt) { _gridbox_layout_get_pos(order_children, &off_x, &off_y, info_layout); evas_object_move(opt->obj, x + off_x, y + off_y); evas_object_size_hint_min_set(opt->obj, info_layout->child_w, @@ -126,11 +178,11 @@ static void _gridbox_layout(Evas_Object *o, Evas_Object_Box_Data *priv, order_children++; } - evas_object_size_hint_min_set(o, -1, - off_y + info_layout->child_h + info_layout->padding_bottom); + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(-1), off_y + info_layout->child_h + info_layout->padding_bottom); } -HAPI Evas_Object *gridbox_create(Evas_Object *parent, void *data) { +HAPI Evas_Object *quickpanel_noti_gridbox_create(Evas_Object *parent, void *data) +{ retif(parent == NULL, NULL, "invalid parameter"); retif(data == NULL, NULL, "invalid parameter"); @@ -140,8 +192,7 @@ HAPI Evas_Object *gridbox_create(Evas_Object *parent, void *data) { gridbox_info_layout *info_layout_portrait = NULL; gridbox_info_layout *info_layout_landscape = NULL; - info_layout_portrait = (gridbox_info_layout *) malloc( - sizeof(gridbox_info_layout)); + info_layout_portrait = (gridbox_info_layout *) malloc(sizeof(gridbox_info_layout)); retif(info_layout_portrait == NULL, NULL, "memory allocation failed"); info_layout_portrait->padding_between = 12 * ad->scale; info_layout_portrait->padding_top = 0; @@ -153,9 +204,12 @@ HAPI Evas_Object *gridbox_create(Evas_Object *parent, void *data) { info_layout_portrait->limit_w = ad->win_width; //400; info_layout_portrait->scale = ad->scale; - info_layout_landscape = (gridbox_info_layout *) malloc( - sizeof(gridbox_info_layout)); - retif(info_layout_landscape == NULL, NULL, "memory allocation failed"); + info_layout_landscape = (gridbox_info_layout *) malloc(sizeof(gridbox_info_layout)); + if (info_layout_landscape == NULL) { + free(info_layout_portrait); + ERR("memory allocation failed"); + return NULL; + } info_layout_landscape->padding_between = 12 * ad->scale; info_layout_landscape->padding_top = 0; info_layout_landscape->padding_left = 14 * ad->scale; @@ -171,13 +225,7 @@ HAPI Evas_Object *gridbox_create(Evas_Object *parent, void *data) { EVAS_HINT_EXPAND); evas_object_size_hint_align_set(gridbox, EVAS_HINT_FILL, EVAS_HINT_FILL); - if (ad->angle == 270 || ad->angle == 90) - elm_box_layout_set(gridbox, _gridbox_layout, info_layout_landscape, - NULL); - else - elm_box_layout_set(gridbox, _gridbox_layout, info_layout_portrait, - NULL); - + elm_box_layout_set(gridbox, _gridbox_layout, gridbox, NULL); evas_object_show(gridbox); evas_object_data_set(gridbox, E_DATA_LAYOUT_PORTRAIT, info_layout_portrait); @@ -193,8 +241,8 @@ HAPI Evas_Object *gridbox_create(Evas_Object *parent, void *data) { return gridbox; } -HAPI void gridbox_remove(Evas_Object *gridbox) { - +HAPI void quickpanel_noti_gridbox_remove(Evas_Object *gridbox) +{ retif(gridbox == NULL, , "invalid parameter"); gridbox_info_layout *info_layout_portrait = evas_object_data_get(gridbox, @@ -202,22 +250,26 @@ HAPI void gridbox_remove(Evas_Object *gridbox) { gridbox_info_layout *info_layout_landscape = evas_object_data_get(gridbox, E_DATA_LAYOUT_LANDSCAPE); - gridbox_remove_all_item(gridbox, 0); + quickpanel_noti_gridbox_remove_all_item(gridbox, 0); evas_object_data_del(gridbox, E_DATA_LAYOUT_PORTRAIT); evas_object_data_del(gridbox, E_DATA_LAYOUT_LANDSCAPE); evas_object_data_del(gridbox, E_DATA_CB_DELETE_ITEM); evas_object_data_del(gridbox, E_DATA_APP_DATA); quickpanel_list_util_item_del_tag(gridbox); evas_object_del(gridbox); + gridbox = NULL; - if (info_layout_portrait != NULL) + if (info_layout_portrait != NULL) { free(info_layout_portrait); - if (info_layout_landscape != NULL) + } + if (info_layout_landscape != NULL) { free(info_layout_landscape); + } } -HAPI void gridbox_set_item_deleted_cb(Evas_Object *gridbox, - void(*deleted_cb)(void *data, Evas_Object *obj)) { +HAPI void quickpanel_noti_gridbox_set_item_deleted_cb(Evas_Object *gridbox, + void(*deleted_cb)(void *data, Evas_Object *obj)) +{ retif(gridbox == NULL, , "invalid parameter"); retif(deleted_cb == NULL, , "invalid parameter"); @@ -225,7 +277,8 @@ HAPI void gridbox_set_item_deleted_cb(Evas_Object *gridbox, } static void _gridbox_call_item_deleted_cb(Evas_Object *gridbox, void *data, - Evas_Object *obj) { + Evas_Object *obj) + { retif(gridbox == NULL, , "invalid parameter"); void (*deleted_cb)(void *data, Evas_Object *obj) = NULL; @@ -237,14 +290,16 @@ static void _gridbox_call_item_deleted_cb(Evas_Object *gridbox, void *data, } } -HAPI void gridbox_add_item(Evas_Object *gridbox, Evas_Object *item, int is_prepend) { +HAPI void quickpanel_noti_gridbox_add_item(Evas_Object *gridbox, Evas_Object *item, int is_prepend) +{ + QP_VI *vi = NULL; const char *signal = NULL; + gridbox_info_layout *info_layout = NULL; retif(gridbox == NULL, , "invalid parameter"); retif(item == NULL, , "invalid parameter"); struct appdata *ad = evas_object_data_get(gridbox, E_DATA_APP_DATA); - if (ad != NULL) { if (ad->angle == 270 || ad->angle == 90) { signal = "box.landscape"; @@ -254,154 +309,438 @@ HAPI void gridbox_add_item(Evas_Object *gridbox, Evas_Object *item, int is_prepe } DBG("set to %s, %x", signal, item); - elm_object_signal_emit(item, signal, "box.prog"); edje_object_message_signal_process(_EDJ(item)); elm_layout_sizing_eval(item); - if (is_prepend == GRIDBOX_PREPEND) - elm_box_pack_start(gridbox, item); - else - elm_box_pack_end(gridbox, item); + info_layout = _gridbox_get_layout(gridbox); + retif(info_layout == NULL, , "invalid parameter"); + + _gridbox_layout_get_coord(gridbox, 0, 1, NULL, NULL, NULL); + + evas_object_size_hint_min_set(item, info_layout->child_w, + info_layout->child_h); + evas_object_resize(item, info_layout->child_w, + info_layout->child_h); + + vi = quickpanel_vi_new_with_data( + VI_OP_INSERT, + QP_ITEM_TYPE_NOTI, + gridbox, + item, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + NULL, + is_prepend, + 0); + quickpanel_vi_start(vi); } -static void _gridbox_remove_item_anim_cb(void *data, Elm_Transit *transit) { - DBG(""); - retif(data == NULL, , "invalid parameter"); - retif(transit == NULL, , "invalid parameter"); +static void _anim_init_insert(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *gridbox = vi->container; + Evas_Object *item = vi->target; + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); - gridbox_info_animation *info_animation = data; + evas_object_clip_set(item, evas_object_clip_get(gridbox)); + evas_object_color_set(item, 0, 0, 0, 0); +} + +static void _anim_job_insert(void *data) +{ + QP_VI *vi = data; + int index = 1, index_child = 1; + int is_prepend = 0; + int coord_x, coord_y = 0; + int coord_old_x, coord_old_y = 0; + int coord_fix_x, coord_fix_y = 0; + Evas_Object *gridbox = NULL; + Evas_Object *item = NULL; + Elm_Transit *transit_layout = NULL; + Elm_Transit *transit_fadein = NULL; + gridbox_info_layout *info_layout = NULL; - retif(info_animation->gridbox == NULL, , "invalid parameter"); - retif(info_animation->item == NULL, , "invalid parameter"); + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); - DBG("remove:%p", info_animation->item); + gridbox = vi->container; + item = vi->target; + is_prepend = vi->extra_flag_1; - void *node = noti_box_node_get(info_animation->item); - elm_box_unpack(info_animation->gridbox, info_animation->item); - noti_box_remove(info_animation->item); - _gridbox_call_item_deleted_cb(info_animation->gridbox, - node, NULL); + info_layout = _gridbox_get_layout(gridbox); + retif(info_layout == NULL, , "invalid parameter"); - if (info_animation->update_cb != NULL) { - retif(info_animation->container == NULL, , "invalid parameter"); - retif(info_animation->noti == NULL, , "invalid parameter"); + if (is_prepend != 1) { + index_child = quickpanel_noti_gridbox_get_item_count(gridbox); + } + _gridbox_layout_get_coord(gridbox, 0, index_child, NULL, &coord_x, &coord_y); + evas_object_move(item, coord_x, coord_y); + + if (is_prepend == 1) { + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj; + Eina_List *item_list = elm_box_children_get(gridbox); + + DBG("all count:%d", eina_list_count (item_list)); + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj != NULL) { + transit_layout = elm_transit_add(); + if (transit_layout != NULL) { + evas_object_geometry_get(obj, &coord_old_x, &coord_old_y, NULL, NULL); + _gridbox_layout_get_coord(gridbox, 0, index + 1, NULL, &coord_x, &coord_y); + + coord_x = coord_x - coord_old_x; + coord_y = coord_y - coord_old_y; + coord_fix_x = (coord_x != 0) ? coord_x / coord_x : 0; + coord_fix_y = (coord_y != 0) ? coord_y / coord_y : 0; + elm_transit_effect_translation_add(transit_layout, 0, 0, coord_x + coord_fix_x, coord_y + coord_fix_y); + elm_transit_object_add(transit_layout, obj); + elm_transit_duration_set(transit_layout, + quickpanel_vim_get_duration(VI_OP_REORDER)); + elm_transit_tween_mode_set(transit_layout, + quickpanel_vim_get_tweenmode(VI_OP_REORDER)); + elm_transit_objects_final_state_keep_set(transit_layout, EINA_TRUE); + elm_transit_go(transit_layout); + } else { + ERR("failed to create a transit"); + } + } + index++; + } - info_animation->update_cb(info_animation->container, - info_animation->noti, info_animation->pos); + if (item_list != NULL) { + eina_list_free(item_list); + } } - free(info_animation); - info_animation = NULL; + transit_fadein = elm_transit_add(); + if (transit_fadein != NULL) { + elm_transit_object_add(transit_fadein, item); + elm_transit_effect_color_add(transit_fadein, 0, 0, 0, 0, 255, 255, 255, 255); + elm_transit_duration_set(transit_fadein, + quickpanel_vim_get_duration(VI_OP_INSERT)); + elm_transit_tween_mode_set(transit_fadein, + quickpanel_vim_get_tweenmode(VI_OP_INSERT)); + elm_transit_del_cb_set(transit_fadein, + quickpanel_vi_done_cb_for_transit, vi); + if (transit_layout != NULL) { + elm_transit_chain_transit_add(transit_layout, transit_fadein); + } else { + elm_transit_go(transit_fadein); + } + } else { + ERR("failed to create a transit"); + quickpanel_vi_done(vi); + } } -HAPI void gridbox_remove_item(Evas_Object *gridbox, Evas_Object *item, int with_animation) { - DBG("remove:%p", item); +static void _anim_done_insert(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, , "invalid parameter"); + + Evas_Object *gridbox = vi->container; + Evas_Object *item = vi->target; + int is_prepend = vi->extra_flag_1; + retif(gridbox == NULL, , "invalid parameter"); retif(item == NULL, , "invalid parameter"); - if (noti_box_get_status(item) == STATE_DELETING) { - return ; + evas_object_color_set(item, 255, 255, 255, 255); + + if (is_prepend == GRIDBOX_PREPEND) { + elm_box_pack_start(gridbox, item); + } else { + elm_box_pack_end(gridbox, item); + } +} + +static void _anim_job_delete(void *data) +{ + QP_VI *vi = data; + int coord_x, coord_y = 0; + int coord_old_x, coord_old_y = 0; + int coord_fix_x, coord_fix_y = 0; + + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Elm_Transit *transit_layout = NULL; + Elm_Transit *transit_fadein = NULL; + Evas_Object *gridbox = vi->container; + Evas_Object *item = vi->target; + + transit_fadein = elm_transit_add(); + if (transit_fadein != NULL) { + elm_transit_object_add(transit_fadein, item); + elm_transit_effect_color_add(transit_fadein, 255, 255, 255, 255, 0, 0, 0, 0); + elm_transit_objects_final_state_keep_set(transit_fadein, EINA_TRUE); + elm_transit_tween_mode_set(transit_fadein, + quickpanel_vim_get_tweenmode(VI_OP_DELETE)); + elm_transit_duration_set(transit_fadein, + quickpanel_vim_get_duration(VI_OP_DELETE)); + elm_transit_go(transit_fadein); + } else { + ERR("failed to create a transit"); + } + + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj; + Eina_List *item_list = elm_box_children_get(gridbox); + + DBG("all count:%d", eina_list_count (item_list)); + + int index_child = 1; + int is_start_relayout = 0; + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj == item) { + is_start_relayout = 1; + } else if (obj != NULL && is_start_relayout == 1) { + transit_layout = elm_transit_add(); + if (transit_layout != NULL) { + evas_object_geometry_get(obj, &coord_old_x, &coord_old_y, NULL, NULL); + _gridbox_layout_get_coord(gridbox, 0, index_child - 1, NULL, &coord_x, &coord_y); + + coord_x = coord_x - coord_old_x; + coord_y = coord_y - coord_old_y; + coord_fix_x = (coord_x != 0) ? coord_x/coord_x : 0; + coord_fix_y = (coord_y != 0) ? coord_y/coord_y : 0; + elm_transit_effect_translation_add(transit_layout, 0, 0, coord_x + coord_fix_x, coord_y + coord_fix_y); + elm_transit_object_add(transit_layout, obj); + elm_transit_duration_set(transit_layout, + quickpanel_vim_get_duration(VI_OP_REORDER)); + elm_transit_tween_mode_set(transit_layout, + quickpanel_vim_get_tweenmode(VI_OP_REORDER)); + elm_transit_objects_final_state_keep_set(transit_layout, EINA_TRUE); + if (transit_fadein != NULL) { + elm_transit_chain_transit_add(transit_fadein, transit_layout); + } + } else { + ERR("failed to create a transit"); + } + } + index_child++; } - noti_box_set_status(item, STATE_DELETING); + + if (item_list != NULL) { + eina_list_free(item_list); + } + + if (transit_layout != NULL) { + elm_transit_del_cb_set(transit_layout, quickpanel_vi_done_cb_for_transit, vi); + } else if (transit_fadein != NULL) { + elm_transit_del_cb_set(transit_fadein, quickpanel_vi_done_cb_for_transit, vi); + } else { + ERR("failed to create a transit"); + quickpanel_vi_done(vi); + } +} + +static void _anim_done_delete(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *gridbox = vi->container; + Evas_Object *item = vi->target; + + elm_box_unpack(gridbox, item); + quickpanel_noti_box_remove(item); + _gridbox_call_item_deleted_cb(gridbox, quickpanel_noti_box_node_get(item), NULL); +} + +HAPI void quickpanel_noti_gridbox_remove_item(Evas_Object *gridbox, Evas_Object *item, int with_animation) +{ + QP_VI *vi = NULL; + retif(gridbox == NULL, , "invalid parameter"); + retif(item == NULL, , "invalid parameter"); if (with_animation == 1) { - gridbox_info_animation *info_animation = (gridbox_info_animation *) malloc( - sizeof(gridbox_info_animation)); - if (info_animation == NULL) - return; - info_animation->gridbox = gridbox; - info_animation->item = item; - info_animation->update_cb = NULL; - info_animation->container = NULL; - info_animation->noti = NULL; - info_animation->pos = 0; - - Elm_Transit *transit = elm_transit_add(); - //Fade in and out with layout object. - elm_transit_object_add(transit, item); - elm_transit_effect_fade_add(transit); - elm_transit_duration_set(transit, 0.7); - elm_transit_del_cb_set(transit, _gridbox_remove_item_anim_cb, - info_animation); - elm_transit_go(transit); + vi = quickpanel_vi_new_with_data( + VI_OP_DELETE, + QP_ITEM_TYPE_NOTI, + gridbox, + item, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + NULL, + 0, + 0); + quickpanel_vi_start(vi); } else { - void *node = noti_box_node_get(item); + void *node = quickpanel_noti_box_node_get(item); elm_box_unpack(gridbox, item); - noti_box_remove(item); + quickpanel_noti_box_remove(item); _gridbox_call_item_deleted_cb(gridbox, node, NULL); } } -HAPI void gridbox_remove_all_item(Evas_Object *gridbox, int with_animation) { - DBG(""); - retif(gridbox == NULL, , "invalid parameter"); +static void _anim_job_delete_all(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, , "invalid parameter"); + quickpanel_vi_done(vi); +} + +static void _anim_done_delete_all(void *data) +{ + QP_VI *vi = data; Eina_List *l; Eina_List *l_next; - Evas_Object *obj; - Eina_List *item_list = elm_box_children_get(gridbox); + Evas_Object *obj = NULL; + Eina_List *item_list = NULL; - EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) - { + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + + Evas_Object *gridbox = vi->container; + + item_list = elm_box_children_get(gridbox); + retif(item_list == NULL, , "invalid parameter"); + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { if (obj != NULL) { - // call deleted callback - gridbox_remove_item(gridbox, obj, with_animation); + DBG("try to remove:%p", obj); + quickpanel_noti_gridbox_remove_item(gridbox, obj, EINA_TRUE); } } + + if (item_list != NULL) { + eina_list_free(item_list); + } +} + +HAPI void quickpanel_noti_gridbox_remove_all_item(Evas_Object *gridbox, int with_animation) +{ + QP_VI *vi = NULL; + retif(gridbox == NULL, , "invalid parameter"); + + vi = quickpanel_vi_new_with_data( + VI_OP_DELETE_ALL, + QP_ITEM_TYPE_NOTI, + gridbox, + NULL, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + NULL, + 0, + 0); + quickpanel_vi_start(vi); +} + +static void _anim_job_update(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + quickpanel_vi_done(data); } -HAPI void gridbox_update_item(Evas_Object *gridbox, Evas_Object *item) { +static void _anim_done_update(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + Evas_Object *gridbox = vi->container; + Evas_Object *item = vi->target; + + if (quickpanel_noti_gridbox_get_item_exist(gridbox, item) == 1) { + quickpanel_noti_box_item_update(item); + } +} + +HAPI void quickpanel_noti_gridbox_update_item(Evas_Object *gridbox, Evas_Object *item) +{ + QP_VI *vi = NULL; retif(gridbox == NULL, , "invalid parameter"); retif(item == NULL, , "invalid parameter"); + + vi = quickpanel_vi_new_with_data( + VI_OP_UPDATE, + QP_ITEM_TYPE_NOTI, + gridbox, + item, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + NULL, + 0, + 0); + + retif(vi == NULL, , "quickpanel_vi_new_with_data returns NULL"); + vi->disable_interrupt_userevent = 1; + vi->disable_freezing = 1; + quickpanel_vi_start(vi); } -HAPI void gridbox_remove_and_add_item(Evas_Object *gridbox, Evas_Object *item +HAPI void quickpanel_noti_gridbox_remove_and_add_item(Evas_Object *gridbox, Evas_Object *item ,void (*update_cb)(Evas_Object *list, void *data, int is_prepend) - ,void *container, void *data, int pos) { - + ,void *container, void *data, int pos) +{ + QP_VI *vi = NULL; retif(gridbox == NULL, , "invalid parameter"); retif(item == NULL, , "invalid parameter"); retif(update_cb == NULL, , "invalid parameter"); retif(container == NULL, , "invalid parameter"); retif(data == NULL, , "invalid parameter"); - if (noti_box_get_status(item) == STATE_DELETING) { - return ; - } - noti_box_set_status(item, STATE_DELETING); + vi = quickpanel_vi_new_with_data( + VI_OP_DELETE, + QP_ITEM_TYPE_NOTI, + gridbox, + item, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + NULL, + 0, + 0); + quickpanel_vi_start(vi); +} - gridbox_info_animation *info_animation = (gridbox_info_animation *) malloc( - sizeof(gridbox_info_animation)); - if (info_animation == NULL) - return; - info_animation->gridbox = gridbox; - info_animation->item = item; - info_animation->update_cb = update_cb; - info_animation->container = container; - info_animation->noti = data; - info_animation->pos = pos; - - Elm_Transit *transit = elm_transit_add(); - //Fade in and out with layout object. - elm_transit_object_add(transit, item); - elm_transit_effect_fade_add(transit); - elm_transit_duration_set(transit, 0.4); - elm_transit_del_cb_set(transit, _gridbox_remove_item_anim_cb, - info_animation); - elm_transit_go(transit); -} - -HAPI void gridbox_finalize_rotation_cb(void *data) { +HAPI void gridbox_finalize_rotation_cb(void *data) +{ retif(data == NULL, , "invalid parameter"); Evas_Object *gridbox = data; elm_box_recalculate(gridbox); } -HAPI void gridbox_rotation(Evas_Object *gridbox, int angle) { +HAPI void quickpanel_noti_gridbox_rotation(Evas_Object *gridbox, int angle) +{ const char *signal = NULL; retif(gridbox == NULL, , "invalid parameter"); @@ -425,42 +764,221 @@ HAPI void gridbox_rotation(Evas_Object *gridbox, int angle) { signal = "box.portrait"; } - DBG("all count:%d", eina_list_count (item_list)); - - EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) - { + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { if (obj != NULL) { elm_object_signal_emit(obj, signal, "box.prog"); edje_object_message_signal_process(_EDJ(obj)); - elm_layout_sizing_eval(obj); DBG("set to %s, %x", signal, obj); } } - if (angle == 270 || angle == 90) { - elm_box_layout_set(gridbox, _gridbox_layout, info_layout_landscape, - NULL); - -#if 0 - layout_data = elm_box_transition_new(0.0, _gridbox_layout, - info_layout_portrait, NULL, _gridbox_layout, - info_layout_landscape, NULL, gridbox_finalize_rotation_cb, - gridbox); -#endif + if (item_list != NULL) { + eina_list_free(item_list); + } + + elm_box_layout_set(gridbox, _gridbox_layout, gridbox, NULL); + DBG("rotation angle is %d", angle); +} + +HAPI int quickpanel_noti_gridbox_get_item_count(Evas_Object *gridbox) +{ + int item_count = 0; + Eina_List *items = NULL; + retif(gridbox == NULL, 0, "invalid parameter"); + + if ((items = elm_box_children_get(gridbox)) != NULL) { + item_count = eina_list_count(items); + eina_list_free(items); + return item_count; } else { - elm_box_layout_set(gridbox, _gridbox_layout, info_layout_portrait, - NULL); -#if 0 - layout_data = elm_box_transition_new(0.0, _gridbox_layout, - info_layout_landscape, NULL, _gridbox_layout, - info_layout_portrait, NULL, gridbox_finalize_rotation_cb, - gridbox); -#endif - } - -#if 0 - elm_box_layout_set(gridbox, elm_box_layout_transition, layout_data, - elm_box_transition_free); -#endif - DBG("Angle Rotation is %d", angle); + return 0; + } +} + +HAPI int quickpanel_noti_gridbox_get_item_exist(Evas_Object *gridbox, Evas_Object *box) +{ + int ret = 0; + Eina_List *items = NULL; + retif(gridbox == NULL, 0, "invalid parameter"); + + if ((items = elm_box_children_get(gridbox)) != NULL) { + if (eina_list_data_find(items, box) != NULL) { + ret = 1; + } + eina_list_free(items); + } + + return ret; +} + +static Eina_Bool _anim_init_cb(void *data) +{ + int i = 0; + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_init_table[] = { + { + .op_type = VI_OP_INSERT, + .handler = _anim_init_insert, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + for (i = 0; anim_init_table[i].op_type != VI_OP_NONE; i++) { + if (anim_init_table[i].op_type != vi->op_type) { + continue; + } + + anim_init_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +static Eina_Bool _anim_job_cb(void *data) +{ + int i = 0; + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_job_table[] = { + { + .op_type = VI_OP_INSERT, + .handler = _anim_job_insert, + }, + { + .op_type = VI_OP_DELETE, + .handler = _anim_job_delete, + }, + { + .op_type = VI_OP_DELETE_ALL, + .handler = _anim_job_delete_all, + }, + { + .op_type = VI_OP_UPDATE, + .handler = _anim_job_update, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + for (i = 0; anim_job_table[i].op_type != VI_OP_NONE; i++) { + if (anim_job_table[i].op_type != vi->op_type) { + continue; + } + + anim_job_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +static Eina_Bool _anim_done_cb(void *data) +{ + int i = 0; + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_done_table[] = { + { + .op_type = VI_OP_INSERT, + .handler = _anim_done_insert, + }, + { + .op_type = VI_OP_DELETE, + .handler = _anim_done_delete, + }, + { + .op_type = VI_OP_DELETE_ALL, + .handler = _anim_done_delete_all, + }, + { + .op_type = VI_OP_UPDATE, + .handler = _anim_done_update, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + for (i = 0; anim_done_table[i].op_type != VI_OP_NONE; i++) { + if (anim_done_table[i].op_type != vi->op_type) { + continue; + } + + anim_done_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +HAPI int quickpanel_noti_gridbox_get_geometry(Evas_Object *gridbox, + int *limit_h, int *limit_partial_h, int *limit_partial_w) +{ + + int count = 0; + int num_last = 0; + int x = 0, y = 0, w = 0, h = 0; + Eina_List *list = NULL; + gridbox_info_layout *info_layout = NULL; + + retif(gridbox == NULL, 0, "invalid parameter"); + retif(limit_h == NULL, 0, "invalid parameter"); + retif(limit_partial_h == NULL, 0, "invalid parameter"); + retif(limit_partial_w == NULL, 0, "invalid parameter"); + evas_object_geometry_get(gridbox, &x, &y, &w, &h); + + info_layout = _gridbox_get_layout(gridbox); + retif(info_layout == NULL, 0, "invalid parameter"); + + list = elm_box_children_get(gridbox); + if (list != NULL) { + count = eina_list_count(list); + num_last = count % info_layout->n_per_rows; + eina_list_free(list); + } else { + num_last = 0; + } + + *limit_h = y + h; + if (num_last > 0) { + *limit_partial_h = *limit_h - info_layout->child_h; + *limit_partial_w = num_last * info_layout->child_w; + } else { + *limit_partial_h = *limit_h; + *limit_partial_w = 0; + } + + return 1; +} + +static void _notibox_deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + quickpanel_uic_close_quickpanel(EINA_FALSE, EINA_FALSE); +} + +HAPI void quickpanel_noti_gridbox_closing_trigger_set(Evas_Object *gridbox) +{ + Evas_Object *item = NULL; + Eina_List *items = NULL; + retif(gridbox == NULL, , "invalid parameter"); + + if ((items = elm_box_children_get(gridbox)) != NULL) { + item = eina_list_nth(items, 0); + if (item != NULL) { + evas_object_event_callback_add(item, + EVAS_CALLBACK_DEL, _notibox_deleted_cb, NULL); + } + eina_list_free(items); + } } diff --git a/daemon/notifications/noti_gridbox.h b/daemon/notifications/noti_gridbox.h index 9096d8f..5e697a4 100755 --- a/daemon/notifications/noti_gridbox.h +++ b/daemon/notifications/noti_gridbox.h @@ -1,34 +1,42 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 __QUICKPANEL_GRIDBOX_H__ #define __QUICKPANEL_GRIDBOX_H__ #define GRIDBOX_PREPEND 1 #define GRIDBOX_APPEND 0 -Evas_Object *gridbox_create(Evas_Object *parent, void *data); -void gridbox_remove(Evas_Object *gridbox); -void gridbox_add_item(Evas_Object *gridbox, Evas_Object *item, int is_prepend); -void gridbox_remove_item(Evas_Object *gridbox, Evas_Object *item, int with_animation); -void gridbox_rotation(Evas_Object *gridbox, int angle); -void gridbox_remove_and_add_item(Evas_Object *gridbox, Evas_Object *item +Evas_Object *quickpanel_noti_gridbox_create(Evas_Object *parent, void *data); +void quickpanel_noti_gridbox_remove(Evas_Object *gridbox); +void quickpanel_noti_gridbox_add_item(Evas_Object *gridbox, Evas_Object *item, int is_prepend); +void quickpanel_noti_gridbox_remove_item(Evas_Object *gridbox, Evas_Object *item, int with_animation); +void quickpanel_noti_gridbox_rotation(Evas_Object *gridbox, int angle); +void quickpanel_noti_gridbox_remove_and_add_item(Evas_Object *gridbox, Evas_Object *item ,void (*update_cb)(Evas_Object *list, void *data, int is_prepend) ,void *container, void *data, int pos); -void gridbox_remove_all_item(Evas_Object *gridbox, int with_animation); -void gridbox_set_item_deleted_cb(Evas_Object *gridbox, +void quickpanel_noti_gridbox_remove_all_item(Evas_Object *gridbox, int with_animation); +void quickpanel_noti_gridbox_set_item_deleted_cb(Evas_Object *gridbox, void(*deleted_cb)(void *data, Evas_Object *obj)); +int quickpanel_noti_gridbox_get_item_count(Evas_Object *gridbox); +int quickpanel_noti_gridbox_get_geometry(Evas_Object *gridbox, + int *limit_h, int *limit_partial_h, int *limit_partial_w); +void quickpanel_noti_gridbox_update_item(Evas_Object *gridbox, Evas_Object *item); +void quickpanel_noti_gridbox_closing_trigger_set(Evas_Object *gridbox); +int quickpanel_noti_gridbox_get_item_exist(Evas_Object *gridbox, Evas_Object *box); #endif diff --git a/daemon/notifications/noti_list_item.c b/daemon/notifications/noti_list_item.c index dad8096..5eaf40d 100755 --- a/daemon/notifications/noti_list_item.c +++ b/daemon/notifications/noti_list_item.c @@ -1,21 +1,23 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 <string.h> -#include <Ecore_X.h> +#include <notification.h> #include "quickpanel-ui.h" #include "common.h" @@ -25,592 +27,596 @@ #include "noti_node.h" #include "noti.h" #include "noti_util.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif #ifdef QP_ANIMATED_IMAGE_ENABLE #include "animated_image.h" #endif +#include "animated_icon.h" + +extern Noti_View_H noti_view_h; +extern Noti_View_H ongoing_noti_view_h; + +#define THRESHOLD_DRAGGING_TIME_LIMIT 1.0 +#define LIMIT_ZOOM_RATIO 0.57 +#define LIMIT_FADEOUT_RATIO 0.1 +#define THRESHOLD_DELETE_START 80 +#define THRESHOLD_DELETE_START_Y_LIMIT 60 +#define THRESHOLD_DISTANCE (300) + +static struct _info { + int item_debug_step; + Noti_View_H *view_handlers[NOTIFICATION_LY_MAX + 1]; +} s_info = { + .item_debug_step = 0, + .view_handlers = { + NULL, + ¬i_view_h, + ¬i_view_h, + ¬i_view_h, + &ongoing_noti_view_h, + &ongoing_noti_view_h, + NULL, + }, +}; + +static int _is_item_deletable_by_gesture(noti_list_item_h *handler) +{ + notification_type_e type = NOTIFICATION_TYPE_NONE; + retif(handler == NULL, 0, "Invalid parameter!"); + retif(handler->noti_node == NULL, 0, "Invalid parameter!"); + retif(handler->noti_node->noti == NULL, 0, "Invalid parameter!"); -#define QP_DEFAULT_ICON ICONDIR"/quickpanel_icon_default.png" - - -static Evas_Object *_check_duplicated_progress_loading(Evas_Object *obj, const char *part, const char *style_name) { - Evas_Object *old_content = NULL; - const char *old_style_name = NULL; - - retif(obj == NULL, NULL, "Invalid parameter!"); - retif(part == NULL, NULL, "Invalid parameter!"); - retif(style_name == NULL, NULL, "Invalid parameter!"); - - DBG(""); - - old_content = elm_object_part_content_get(obj, part); - if (old_content != NULL) { - old_style_name = elm_object_style_get(old_content); - if (old_style_name != NULL) { - DBG("%s", old_style_name); - if (strcmp(old_style_name, style_name) == 0) - return old_content; + notification_h noti = handler->noti_node->noti; + notification_get_type(noti, &type); - elm_object_part_content_unset(obj, part); - evas_object_del(old_content); - } + if (type == NOTIFICATION_TYPE_NOTI) { + return 1; } - return NULL; + return 0; } -static Evas_Object *_check_duplicated_image_loading(Evas_Object *obj, const char *part, const char *file_path) { - Evas_Object *old_ic = NULL; - const char *old_ic_path = NULL; - - retif(obj == NULL, NULL, "Invalid parameter!"); - retif(part == NULL, NULL, "Invalid parameter!"); - retif(file_path == NULL, NULL, "Invalid parameter!"); - - old_ic = elm_object_part_content_get(obj, part); - if (old_ic != NULL) { - elm_image_file_get(old_ic, &old_ic_path, NULL); - if (old_ic_path != NULL) { - DBG("%s:%s", old_ic_path, file_path); - if (strcmp(old_ic_path, file_path) == 0) - return old_ic; - } - - elm_object_part_content_unset(obj, part); - evas_object_del(old_ic); - } +static void _item_handler_set(Evas_Object *item, noti_list_item_h *handler) +{ + retif(item == NULL, , "Invalid parameter!"); + retif(handler == NULL, , "Invalid parameter!"); - return NULL; + evas_object_data_set(item, E_DATA_NOTI_LIST_ITEM_H, handler); } -static void _set_text_to_part(Evas_Object *obj, const char *part, const char *text) { - const char *old_text = NULL; +static noti_list_item_h *_item_handler_get(Evas_Object *item) +{ + retif(item == NULL, NULL, "Invalid parameter!"); - retif(obj == NULL, , "Invalid parameter!"); - retif(part == NULL, , "Invalid parameter!"); - retif(text == NULL, , "Invalid parameter!"); + return evas_object_data_get(item, E_DATA_NOTI_LIST_ITEM_H); +} - old_text = elm_object_part_text_get(obj, part); - if (old_text != NULL) { - if (strcmp(old_text, text) == 0) { - return ; - } - } +static noti_node_item *_get_noti_node(Evas_Object *item) +{ + retif(item == NULL, NULL, "invalid parameter"); - elm_object_part_text_set(obj, part, text); + noti_list_item_h *handler = _item_handler_get(item); + retif(handler == NULL, NULL, "invalid parameter"); + + return quickpanel_noti_node_get_by_priv_id(handler->priv_id); } -static char *_noti_get_progress(notification_h noti, char *buf, - int buf_len) +static void _response_callback_call(Evas_Object *item, const char *emission) { - double size = 0.0; - double percentage = 0.0; + static double time_called = 0.0; + retif(item == NULL, , "invalid parameter"); + retif(emission == NULL, , "invalid parameter"); - retif(noti == NULL, NULL, "Invalid parameter!"); - retif(buf == NULL, NULL, "Invalid parameter!"); + if (time_called == 0.0) { + time_called = ecore_loop_time_get(); + } else { + if ((ecore_loop_time_get() - time_called) < 0.4) { + DBG("click rejected"); + return; + } + time_called = ecore_loop_time_get(); + } - notification_get_size(noti, &size); - notification_get_progress(noti, &percentage); + response_cb cb = NULL; + noti_list_item_h *handler = _item_handler_get(item); + noti_node_item *noti_node = _get_noti_node(item); + if (handler != NULL && noti_node != NULL) { + if (strncmp(emission,"selected", strlen("selected")) == 0) { + if (handler->need_to_cancel_press > 0) { + handler->need_to_cancel_press = 0; + return; + } - if (percentage > 0) { - if (percentage < 1.0 ) { - if (snprintf(buf, buf_len, "%d%%", (int)(percentage * 100)) <= 0) { - return NULL; + cb = handler->selected_cb; + if (cb != NULL) { + cb(noti_node, item); } } - if (percentage >= 1.0) { - snprintf(buf, buf_len, "%d%%", 100); - } - - return buf; - } else if (size > 0 && percentage == 0) { - if (size > (1 << 30)) { - if (snprintf(buf, buf_len, "%.1lfGB", - size / 1000000000.0) <= 0) - return NULL; - - return buf; - } else if (size > (1 << 20)) { - if (snprintf(buf, buf_len, "%.1lfMB", - size / 1000000.0) <= 0) - return NULL; - - return buf; - } else if (size > (1 << 10)) { - if (snprintf(buf, buf_len, "%.1lfKB", - size / 1000.0) <= 0) - return NULL; - - return buf; - } else { - if (snprintf(buf, buf_len, "%lfB", size) <= 0) - return NULL; + if (strncmp(emission,"button_1", strlen("button_1")) == 0) { + if (handler->need_to_cancel_press > 0) { + handler->need_to_cancel_press = 0; + return; + } - return buf; + cb = handler->button_1_cb; + if (cb != NULL) { + cb(noti_node, item); + } + } + if (strncmp(emission,"deleted", strlen("deleted")) == 0) { + cb = handler->deleted_cb; + if (cb != NULL) { + cb(noti_node, item); + } } } - - return NULL; } -static void _noti_list_item_ongoing_set_progressbar(Evas_Object *noti_list_item) +static void _signal_cb(void *data, Evas_Object *o, const char *emission, const char *source) { - notification_h noti = NULL; - Evas_Object *ic = NULL; - Evas_Object *old_ic = NULL; - double size = 0.0; - double percentage = 0.0; - notification_type_e type = NOTIFICATION_TYPE_NONE; - notification_ly_type_e layout = NOTIFICATION_LY_NONE ; - - retif(noti_list_item == NULL, , "Invalid parameter!"); + retif(data == NULL, , "invalid parameter"); + retif(o == NULL, , "invalid parameter"); + retif(emission == NULL, , "invalid parameter"); - noti_list_item_h *noti_list_item_data = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); - retif(noti_list_item == NULL, , "data is NULL"); + _response_callback_call(o, emission); +} - noti_node_item *item = noti_list_item_data->data; - retif(item == NULL, , "data is NULL"); +static Eina_Bool _drag_cancel_cb(void *data) { + QP_VI *vi = data; + noti_list_item_h *handler = NULL; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); - noti = item->noti; - retif(noti == NULL, , "noti is NULL"); + if (vi->target != NULL) { + DBG("Canceling dragging"); - notification_get_type(noti, &type); - if (type == NOTIFICATION_TYPE_ONGOING) { - notification_get_size(noti, &size); - notification_get_progress(noti, &percentage); - notification_get_layout(noti, &layout); - - if (layout != NOTIFICATION_LY_ONGOING_EVENT) { - if (percentage > 0 && percentage <= 1) { - old_ic = _check_duplicated_progress_loading(noti_list_item, - "elm.swallow.progress", "quickpanel/list_progress"); - if (old_ic == NULL) { - ic = elm_progressbar_add(noti_list_item); - if (ic == NULL) - return ; - elm_object_style_set(ic, "quickpanel/list_progress"); - } else { - ic = old_ic; - } + handler = _item_handler_get(vi->target); + retif(handler == NULL, EINA_FALSE, "handler is NULL"); - elm_progressbar_value_set(ic, percentage); - elm_progressbar_horizontal_set(ic, EINA_TRUE); - elm_progressbar_pulse(ic, EINA_FALSE); - } else if (size >= 0 && percentage == 0) { - old_ic = _check_duplicated_progress_loading(noti_list_item, - "elm.swallow.progress", "quickpanel/pending_list"); - if (old_ic == NULL) { - ic = elm_progressbar_add(noti_list_item); - if (ic == NULL) - return ; - elm_object_style_set(ic, "quickpanel/pending_list"); - } else { - ic = old_ic; - } + handler->state = NOTILISTITEM_STATE_GETSTURE_CANCELED; + evas_object_map_enable_set(vi->target, EINA_FALSE); - elm_progressbar_horizontal_set(ic, EINA_TRUE); - elm_progressbar_pulse(ic, EINA_TRUE); - } - } + handler->vi = NULL; } - if (ic != NULL) { - elm_object_part_content_set(noti_list_item, "elm.swallow.progress", ic); - } + return EINA_TRUE; } -static void _noti_list_item_ongoing_set_icon(Evas_Object *noti_list_item) +void static _mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { - notification_h noti = NULL; - Evas_Object *ic = NULL; - Evas_Object *old_ic = NULL; - char *icon_path = NULL; - char *thumbnail_path = NULL; - char *main_icon_path = NULL; - char *sub_icon_path = NULL; - - retif(noti_list_item == NULL, , "Invalid parameter!"); - - noti_list_item_h *noti_list_item_data = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); - retif(noti_list_item == NULL, , "data is NULL"); - - noti_node_item *item = noti_list_item_data->data; - retif(item == NULL, , "data is NULL"); - - noti = item->noti; - retif(noti == NULL, , "noti is NULL"); - - notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, - &thumbnail_path); - notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_ICON, &icon_path); - - if (thumbnail_path != NULL && icon_path != NULL) { - main_icon_path = thumbnail_path; - sub_icon_path = icon_path; - } else if (icon_path != NULL && thumbnail_path == NULL) { - main_icon_path = icon_path; - sub_icon_path = NULL; - } else if (icon_path == NULL && thumbnail_path != NULL) { - main_icon_path = thumbnail_path; - sub_icon_path = NULL; - } else { - main_icon_path = NULL; - sub_icon_path = NULL; - } + int w = 0, h = 0; + noti_list_item_h *handler = NULL; + Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info; + retif(ev == NULL, , "event_info is NULL"); - if (main_icon_path != NULL) { - old_ic = _check_duplicated_image_loading(noti_list_item, - "elm.swallow.thumbnail", main_icon_path); + handler = _item_handler_get(obj); + retif(handler == NULL, , "handler is NULL"); - if (old_ic == NULL) { - ic = elm_image_add(noti_list_item); - elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE); - elm_image_file_set(ic, main_icon_path, main_icon_path); - elm_object_part_content_set(noti_list_item, "elm.swallow.thumbnail", ic); -#ifdef QP_ANIMATED_IMAGE_ENABLE - quickpanel_animated_image_add(ic); -#endif - } - } + evas_object_geometry_get(obj, NULL, NULL, &w, &h); - if (sub_icon_path != NULL) { - old_ic = _check_duplicated_image_loading(noti_list_item, - "elm.swallow.icon", sub_icon_path); + handler->press_x = ev->canvas.x; + handler->press_y = ev->canvas.y; + handler->obj_w = w; + handler->obj_h = h; + handler->state = NOTILISTITEM_STATE_NORMAL; - if (old_ic == NULL) { - ic = elm_image_add(noti_list_item); - elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE); - elm_image_file_set(ic, sub_icon_path, sub_icon_path); - elm_object_part_content_set(noti_list_item, "elm.swallow.icon", ic); - } - } + s_info.item_debug_step = 1; + SDBG("mouse down:%d %d %d", handler->obj_w, handler->obj_h, handler->state); - if (main_icon_path == NULL && sub_icon_path == NULL) { - old_ic = _check_duplicated_image_loading(noti_list_item, - "elm.swallow.thumbnail", QP_DEFAULT_ICON); - - if (old_ic == NULL) { - ic = elm_image_add(noti_list_item); - elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE); - elm_image_file_set(ic, QP_DEFAULT_ICON, QP_DEFAULT_ICON); - elm_object_part_content_set(noti_list_item, "elm.swallow.thumbnail", ic); -#ifdef QP_ANIMATED_IMAGE_ENABLE - quickpanel_animated_image_add(ic); -#endif - } + if (handler->vi != NULL) { + quickpanel_vi_user_event_del(handler->vi); + handler->vi = NULL; } + + handler->need_to_cancel_press = 0; } -static void _noti_list_item_ongoing_set_text(Evas_Object *noti_list_item) +static void _mouse_move_cb(void* data, Evas* e, Evas_Object* obj, void* event_info) { - notification_h noti = NULL; - notification_error_e noti_err = NOTIFICATION_ERROR_NONE; - char *text = NULL; - char *text_utf8 = NULL; - char *domain = NULL; - char *dir = NULL; - char *pkgname = NULL; - char *caller_pkgname = NULL; - int group_id = 0, priv_id = 0; - char buf[128] = { 0, }; - notification_type_e type = NOTIFICATION_TYPE_NONE; - double size = 0.0; - double percentage = 0.0; - int isProgressBarEnabled = 1; - notification_ly_type_e layout = NOTIFICATION_LY_NONE ; - - retif(noti_list_item == NULL, , "Invalid parameter!"); - - noti_list_item_h *noti_list_item_data = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); - retif(noti_list_item == NULL, , "data is NULL"); - - noti_node_item *item = noti_list_item_data->data; - retif(item == NULL, , "data is NULL"); - - noti = item->noti; - retif(noti == NULL, , "noti is NULL"); - - /* Set text domain */ - notification_get_text_domain(noti, &domain, &dir); - if (domain != NULL && dir != NULL) - bindtextdomain(domain, dir); + int delta_x = 0; + static int vi_start_x = 0; + static int delta_prev = -1; + int x = 0, y = 0; + int w = 0, h = 0; + noti_list_item_h *handler = NULL; + Evas_Map *map = NULL; + Evas_Event_Mouse_Move* ev = event_info; + QP_VI *vi = NULL; + retif(ev == NULL, , "event_info is NULL"); + + handler = _item_handler_get(obj); + retif(handler == NULL, , "handler is NULL"); + + if (handler->state == NOTILISTITEM_STATE_GETSTURE_CANCELED) { + DBG("deletion has been canceled"); + return; + } - /* Get pkgname & id */ - notification_get_pkgname(noti, &pkgname); - notification_get_application(noti, &caller_pkgname); - notification_get_id(noti, &group_id, &priv_id); - notification_get_type(noti, &type); - notification_get_size(noti, &size); - notification_get_progress(noti, &percentage); - notification_get_layout(noti, &layout); + evas_object_geometry_get(obj, &x, &y, &w, &h); + delta_x = ev->cur.output.x - handler->press_x; - DBG("percentage:%f size:%f", percentage, size); + if (s_info.item_debug_step == 1) { + SDBG("mouse move:%d %d %d", delta_x, vi_start_x, handler->state); + s_info.item_debug_step = 2; + } - if (percentage <= 0.0 && size <= 0.0) { - isProgressBarEnabled = 0; + if (handler->state == NOTILISTITEM_STATE_NORMAL && _is_item_deletable_by_gesture(handler) == 1) { + if (abs(delta_x) >= THRESHOLD_DELETE_START) { + DBG("start a deletion"); + handler->state = NOTILISTITEM_STATE_GETSTURE_WAIT; + + vi_start_x = delta_x; + + vi = quickpanel_vi_new_with_data( + VI_OP_DELETE, + QP_ITEM_TYPE_NOTI, + NULL, + obj, + NULL, + NULL, + NULL, + NULL, //_drag_cancel_cb, + vi, + NULL, + 0, + 0); + handler->vi = vi; + handler->need_to_cancel_press = 1; + quickpanel_vi_user_event_add(vi); + } + } else if (handler->state == NOTILISTITEM_STATE_GETSTURE_WAIT) { + if (delta_prev != delta_x) { + map = evas_map_new(4); + if (map != NULL) { + evas_map_util_points_populate_from_object(map, obj); + evas_map_util_points_populate_from_geometry(map, x + delta_x - vi_start_x, y, w, h, 0); + evas_object_map_enable_set(obj, EINA_TRUE); + evas_object_map_set(obj, map); + evas_map_free(map); + quickpanel_list_util_scroll_freeze_set(EINA_TRUE); + } + delta_prev = delta_x; + } } - noti_err = notification_get_text(noti, - NOTIFICATION_TEXT_TYPE_TITLE, - &text); + handler->distance = delta_x; +} - if (noti_err == NOTIFICATION_ERROR_NONE && text != NULL) { - quickpanel_util_char_replace(text, _NEWLINE, _SPACE); - _set_text_to_part(noti_list_item, "elm.text.title", text); +static void _mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int x = 0; + noti_list_item_h *handler = NULL; + Elm_Transit *transit_flick = NULL; + //double scale = elm_config_scale_get(); + handler = _item_handler_get(obj); + retif(handler == NULL, , "handler is NULL"); + + quickpanel_list_util_scroll_freeze_set(EINA_FALSE); + + if (s_info.item_debug_step == 2) { + SDBG("mouse up:%d", handler->state); + s_info.item_debug_step = 3; } - noti_err = notification_get_text(noti, - NOTIFICATION_TEXT_TYPE_CONTENT, - &text); - if (noti_err == NOTIFICATION_ERROR_NONE && text != NULL) { - if (layout == NOTIFICATION_LY_ONGOING_EVENT) { - text_utf8 = elm_entry_utf8_to_markup(text); - if (text_utf8 != NULL) { - _set_text_to_part(noti_list_item, "elm.text.content.multiline", text_utf8); - free(text_utf8); - } else { - _set_text_to_part(noti_list_item, "elm.text.content.multiline", text); + if (handler->state == NOTILISTITEM_STATE_GETSTURE_WAIT) { + if (abs(handler->distance) >= (THRESHOLD_DISTANCE - 10) + && _is_item_deletable_by_gesture(handler) == 1) { + x = abs(handler->distance) - THRESHOLD_DELETE_START; + + if (handler->distance > 0) { + evas_object_map_set(obj, NULL); + transit_flick = elm_transit_add(); + if (transit_flick != NULL) { + elm_transit_effect_translation_add(transit_flick, x, 0, 480, 0); + elm_transit_object_add(transit_flick, obj); + elm_transit_duration_set(transit_flick, 0.25 * (480 - x ) / 480); + elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR); + elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE); + elm_transit_go(transit_flick); + + _response_callback_call(obj, "deleted"); + } + } else if (handler->distance < 0) { + evas_object_map_set(obj, NULL); + transit_flick = elm_transit_add(); + if (transit_flick != NULL) { + elm_transit_effect_translation_add(transit_flick, -x, 0, -480, 0); + elm_transit_object_add(transit_flick, obj); + elm_transit_duration_set(transit_flick, 0.25 * ( 480 - x ) / 480); + elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR); + elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE); + elm_transit_go(transit_flick); + + _response_callback_call(obj, "deleted"); + } } - - elm_object_signal_emit(noti_list_item, "elm,state,elm.text.content.multiline,active", "elm"); } else { - quickpanel_util_char_replace(text, _NEWLINE, _SPACE); - _set_text_to_part(noti_list_item, "elm.text.content", text); - elm_object_signal_emit(noti_list_item, "elm,state,elm.text.content,active", "elm"); + evas_object_map_enable_set(obj, EINA_FALSE); } - } - if (isProgressBarEnabled != 0 - && layout != NOTIFICATION_LY_ONGOING_EVENT) { - text = _noti_get_progress(noti, buf, - sizeof(buf)); - if (text != NULL) { - quickpanel_util_char_replace(text, _NEWLINE, _SPACE); - _set_text_to_part(noti_list_item, "elm.text.time", text); + if (handler->vi != NULL) { + quickpanel_vi_user_event_del(handler->vi); + handler->vi = NULL; } - } -} + } else if (handler->state == NOTILISTITEM_STATE_GETSTURE_CANCELED) { + evas_object_map_enable_set(obj, EINA_FALSE); -static void _noti_list_item_call_item_cb(Evas_Object *noti_list_item, const char *emission) { - retif(noti_list_item == NULL, , "invalid parameter"); - retif(emission == NULL, , "invalid parameter"); + if (handler->vi != NULL) { + quickpanel_vi_user_event_del(handler->vi); + handler->vi = NULL; + } + } - DBG("%s", emission); + handler->state = NOTILISTITEM_STATE_NORMAL; +} - void (*cb)(void *data, Evas_Object *obj) = NULL; - noti_list_item_h *data = NULL; +static Evas_Event_Flags +_flick_end_cb(void *data, void *event_info) +{ + int x = 0; + noti_list_item_h *handler = NULL; + Evas_Object *view = NULL; + Elm_Transit *transit_flick = NULL; + Elm_Gesture_Momentum_Info *info = (Elm_Gesture_Momentum_Info *)event_info; + //double scale = elm_config_scale_get(); - data = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); + view = (Evas_Object *)data; + handler = _item_handler_get(view); - if (strncmp(emission,"selected", strlen("selected")) == 0) { - cb = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_CB_SELECTED_ITEM); + if (handler != NULL) { + handler->state = NOTILISTITEM_STATE_GETSTURE_CANCELED; - if (cb != NULL && data != NULL) { - cb(data->data, noti_list_item); + if (_is_item_deletable_by_gesture(handler) != 1) { + return EVAS_EVENT_FLAG_NONE; } - } - if (strncmp(emission,"button_1", strlen("button_1")) == 0) { - cb = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_CB_BUTTON_1); - if (cb != NULL && data != NULL) { - cb(data->data, noti_list_item); - } + x = abs(handler->distance) - THRESHOLD_DELETE_START; } - if (strncmp(emission,"deleted", strlen("deleted")) == 0) { - cb = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_CB_DELETED_ITEM); - if (cb != NULL && data != NULL) { - cb(data->data, noti_list_item); + if (info->x2 - info->x1 > 50) { + DBG("Flick event is occurred to right."); + evas_object_map_set(view, NULL); + transit_flick = elm_transit_add(); + if (transit_flick != NULL) { + elm_transit_effect_translation_add(transit_flick, x, 0, 480, 0); + elm_transit_object_add(transit_flick, view); + elm_transit_duration_set(transit_flick, 0.25 * (480 - x ) /480); + elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR); + elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE); + elm_transit_go(transit_flick); + + _response_callback_call(view, "deleted"); + } + } else if (info->x1 - info->x2 > 50) { + DBG("Flick event is occurred to left."); + evas_object_map_set(view, NULL); + transit_flick = elm_transit_add(); + if (transit_flick != NULL) { + elm_transit_effect_translation_add(transit_flick, -x, 0, -480, 0); + elm_transit_object_add(transit_flick, view); + elm_transit_duration_set(transit_flick, 0.25 * ( 480 - x ) / 480); + elm_transit_tween_mode_set(transit_flick, ELM_TRANSIT_TWEEN_MODE_LINEAR); + elm_transit_objects_final_state_keep_set(transit_flick, EINA_TRUE); + elm_transit_go(transit_flick); + + _response_callback_call(view, "deleted"); } } + + return EVAS_EVENT_FLAG_NONE; } -static void _signal_cb(void *data, Evas_Object *o, const char *emission, const char *source) +HAPI Evas_Object *quickpanel_noti_list_item_create(Evas_Object *parent, notification_h noti) { - retif(data == NULL, , "invalid parameter"); - retif(o == NULL, , "invalid parameter"); - retif(emission == NULL, , "invalid parameter"); + Evas_Object *view = NULL; + retif(noti == NULL, NULL, "invalid parameter"); - _noti_list_item_call_item_cb(o, emission); -} + notification_ly_type_e layout = NOTIFICATION_LY_NOTI_EVENT_SINGLE; + notification_get_layout(noti, &layout); + + retif(s_info.view_handlers[layout] == NULL, NULL, "invalid parameter"); + retif(s_info.view_handlers[layout]->create == NULL, NULL, "invalid parameter"); + + view = s_info.view_handlers[layout]->create(noti, parent); + if (view != NULL) { + noti_list_item_h *handler = (noti_list_item_h *) malloc(sizeof(noti_list_item_h)); + retif(handler == NULL, NULL, "failed to allocate a memory"); + + memset(handler, 0, sizeof(noti_list_item_h)); + + handler->layout = layout; + handler->status = STATE_NORMAL; + handler->noti_node = NULL; + handler->state = NOTILISTITEM_STATE_NORMAL; + + _item_handler_set(view, handler); + + Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(view); + elm_object_part_content_set(view, "focus", focus); + + //add event + elm_object_signal_callback_add(view, + "selected", + "edje", + _signal_cb, + parent + ); + + //add event + elm_object_signal_callback_add(view, + "button_1", + "edje", + _signal_cb, + parent + ); + + //add event + elm_object_signal_callback_add(view, + "deleted", + "edje", + _signal_cb, + parent + ); + + DBG("created box:%p", view); + + evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down_cb, NULL); + evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, NULL); + evas_object_event_callback_add(view, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, NULL); + + Evas_Object *gl = elm_gesture_layer_add(parent); + elm_gesture_layer_flick_time_limit_ms_set(gl, 300); + elm_gesture_layer_attach(gl, view); + + elm_gesture_layer_cb_set(gl, ELM_GESTURE_N_FLICKS, ELM_GESTURE_STATE_END, _flick_end_cb, view); + } else { + ERR("failed to create notification view(%s)" + , s_info.view_handlers[layout]->name); + } -HAPI Evas_Object *noti_list_item_create(Evas_Object *parent, notification_ly_type_e layout) { - Evas_Object *box = NULL; - - retif(parent == NULL, NULL, "Invalid parameter!"); - - box = elm_layout_add(parent); - - DBG(""); - elm_layout_file_set(box, DEFAULT_EDJ, - "quickpanel/listitem/default"); - - evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(box); - - noti_list_item_h *box_h = (noti_list_item_h *) malloc(sizeof(noti_list_item_h)); - box_h->layout = layout; - box_h->status = STATE_NORMAL; - box_h->data = NULL; - evas_object_data_set(box, E_DATA_NOTI_LIST_ITEM_H, box_h); - DBG("created box:%p", box); - - //add event - elm_object_signal_callback_add(box, - "selected", - "edje", - _signal_cb, - parent - ); - - //add event - elm_object_signal_callback_add(box, - "button_1", - "edje", - _signal_cb, - parent - ); - - //add event - elm_object_signal_callback_add(box, - "deleted", - "edje", - _signal_cb, - parent - ); - - return box; + return view; } -static void _noti_list_item_set_layout_ongoing_noti(Evas_Object *noti_list_item, - notification_h noti) { - DBG(""); - retif(noti_list_item == NULL, , "invalid parameter"); +HAPI void quickpanel_noti_list_item_update(Evas_Object *item) +{ + retif(item == NULL, , "invalid parameter"); - _noti_list_item_ongoing_set_progressbar(noti_list_item); - _noti_list_item_ongoing_set_icon(noti_list_item); - _noti_list_item_ongoing_set_text(noti_list_item); -} + noti_list_item_h *handler = _item_handler_get(item); + if (handler != NULL) { + retif(s_info.view_handlers[handler->layout] == NULL, , "invalid parameter"); + retif(s_info.view_handlers[handler->layout]->update == NULL, , "invalid parameter"); -static void _noti_list_item_set_layout(Evas_Object *noti_list_item, notification_h noti, - notification_ly_type_e layout) { - - DBG("layout:%d", layout); - - switch (layout) { - case NOTIFICATION_LY_NOTI_EVENT_SINGLE: - break; - case NOTIFICATION_LY_NOTI_EVENT_MULTIPLE: - break; - case NOTIFICATION_LY_NOTI_THUMBNAIL: - break; - case NOTIFICATION_LY_NONE: - break; - case NOTIFICATION_LY_ONGOING_EVENT: - case NOTIFICATION_LY_ONGOING_PROGRESS: - _noti_list_item_set_layout_ongoing_noti(noti_list_item, noti); - break; - case NOTIFICATION_LY_MAX: - DBG("not supported layout type:%d", layout); - break; + noti_node_item *noti_node = _get_noti_node(item); + s_info.view_handlers[handler->layout]->update(noti_node, handler->layout, item); } } -HAPI void noti_list_item_remove(Evas_Object *noti_list_item) { - - retif(noti_list_item == NULL, , "invalid parameter"); - - noti_list_item_h *noti_list_item_h = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); - - if (noti_list_item_h != NULL) - free(noti_list_item_h); - - evas_object_data_del(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); - evas_object_data_del(noti_list_item, E_DATA_NOTI_LIST_CB_SELECTED_ITEM); - evas_object_data_del(noti_list_item, E_DATA_NOTI_LIST_CB_BUTTON_1); - evas_object_data_del(noti_list_item, E_DATA_NOTI_LIST_CB_DELETED_ITEM); - - evas_object_del(noti_list_item); -} +HAPI void quickpanel_noti_list_item_remove(Evas_Object *item) +{ + retif(item == NULL, , "invalid parameter"); + + noti_list_item_h *handler = _item_handler_get(item); + if (handler != NULL) { + retif(s_info.view_handlers[handler->layout] == NULL, , "invalid parameter"); + + if (s_info.view_handlers[handler->layout] != NULL) { + if (s_info.view_handlers[handler->layout]->remove != NULL) { + noti_node_item *noti_node = _get_noti_node(item); + s_info.view_handlers[handler->layout]->remove(noti_node, handler->layout, item); + } + } -HAPI void noti_list_item_update(Evas_Object *noti_list_item) { - retif(noti_list_item == NULL, , "invalid parameter"); + free(handler); + } - _noti_list_item_ongoing_set_progressbar(noti_list_item); - _noti_list_item_ongoing_set_icon(noti_list_item); - _noti_list_item_ongoing_set_text(noti_list_item); + evas_object_data_del(item, E_DATA_NOTI_LIST_ITEM_H); + evas_object_del(item); + item = NULL; } -HAPI void noti_list_item_set_status(Evas_Object *noti_list_item, int status) { - retif(noti_list_item == NULL, , "invalid parameter"); - - noti_list_item_h *noti_list_item_h = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); +HAPI void quickpanel_noti_list_item_set_status(Evas_Object *item, int status) +{ + retif(item == NULL, , "invalid parameter"); - if (noti_list_item_h != NULL) { - noti_list_item_h->status = status; + noti_list_item_h *handler = _item_handler_get(item); + if (handler != NULL) { + handler->status = status; } } -HAPI int noti_list_item_get_status(Evas_Object *noti_list_item) { - retif(noti_list_item == NULL, STATE_NORMAL, "invalid parameter"); - - noti_list_item_h *noti_list_item_h = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); +HAPI int quickpanel_noti_list_item_get_status(Evas_Object *item) +{ + retif(item == NULL, STATE_NORMAL, "invalid parameter"); - if (noti_list_item_h != NULL) { - return noti_list_item_h->status; + noti_list_item_h *handler = _item_handler_get(item); + if (handler != NULL) { + return handler->status; } return STATE_DELETING; } -HAPI void noti_list_item_node_set(Evas_Object *noti_list_item, void *data) { - retif(noti_list_item == NULL, , "invalid parameter"); - retif(data == NULL, , "invalid parameter"); - - noti_list_item_h *noti_list_item_data = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); +HAPI void quickpanel_noti_list_item_node_set(Evas_Object *item, noti_node_item *noti_node) +{ + int priv_id = 0; + retif(item == NULL, , "invalid parameter"); + retif(noti_node == NULL, , "invalid parameter"); + + noti_list_item_h *handler = _item_handler_get(item); + if (handler != NULL) { + handler->noti_node = noti_node; + notification_get_id(handler->noti_node->noti, NULL, &priv_id); + handler->priv_id = priv_id; + quickpanel_noti_list_item_update(item); + } +} - if (noti_list_item_data != NULL) { - noti_list_item_data->data = data; +HAPI void *quickpanel_noti_list_item_node_get(Evas_Object *item) +{ + retif(item == NULL, NULL, "invalid parameter"); - if (data != NULL) { - noti_node_item *item = data; - _noti_list_item_set_layout(noti_list_item, item->noti, noti_list_item_data->layout); - } + noti_node_item *noti_node = _get_noti_node(item); + if (noti_node != NULL) { + return noti_node; } + + return NULL; } -HAPI void *noti_list_item_node_get(Evas_Object *noti_list_item) { - retif(noti_list_item == NULL, NULL, "invalid parameter"); +#ifdef QP_SCREENREADER_ENABLE +static void _focus_selected_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *item = data; + retif(item == NULL, , "invalid parameter"); - noti_list_item_h *noti_list_item_data = evas_object_data_get(noti_list_item, E_DATA_NOTI_LIST_ITEM_H); + _response_callback_call(item, "selected"); +} +#endif + +HAPI void quickpanel_noti_list_item_set_item_selected_cb(Evas_Object *item, response_cb callback) +{ + retif(item == NULL, , "invalid parameter"); + retif(callback == NULL, , "invalid parameter"); - if (noti_list_item_data != NULL) { - return noti_list_item_data->data; + noti_list_item_h *handler = _item_handler_get(item); + if (handler != NULL) { + handler->selected_cb = callback; } - return NULL; +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = NULL; + ao = quickpanel_accessibility_screen_reader_object_get(item, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", item); + if (ao != NULL) { + evas_object_smart_callback_add(ao, "clicked", _focus_selected_cb, item); + } +#endif } -HAPI void noti_list_item_set_item_selected_cb(Evas_Object *noti_list_item, - void(*selected_cb)(void *data, Evas_Object *obj)) { - retif(noti_list_item == NULL, , "invalid parameter"); - retif(selected_cb == NULL, , "invalid parameter"); +HAPI void quickpanel_noti_list_item_set_item_button_1_cb(Evas_Object *item, response_cb callback) +{ + retif(item == NULL, , "invalid parameter"); + retif(callback == NULL, , "invalid parameter"); - evas_object_data_set(noti_list_item, E_DATA_NOTI_LIST_CB_SELECTED_ITEM, selected_cb); + noti_list_item_h *handler = _item_handler_get(item); + if (handler != NULL) { + handler->button_1_cb = callback; + } } -HAPI void noti_list_item_set_item_button_1_cb(Evas_Object *noti_list_item, - void(*button_1_cb)(void *data, Evas_Object *obj)) { - retif(noti_list_item == NULL, , "invalid parameter"); - retif(button_1_cb == NULL, , "invalid parameter"); +HAPI void quickpanel_noti_list_item_set_item_deleted_cb(Evas_Object *item, response_cb callback) +{ + retif(item == NULL, , "invalid parameter"); + retif(callback == NULL, , "invalid parameter"); - evas_object_data_set(noti_list_item, E_DATA_NOTI_LIST_CB_BUTTON_1, button_1_cb); + noti_list_item_h *handler = _item_handler_get(item); + if (handler != NULL) { + handler->deleted_cb = callback; + } } -HAPI void noti_list_item_set_item_deleted_cb(Evas_Object *noti_list_item, - void(*deleted_cb)(void *data, Evas_Object *obj)) { - retif(noti_list_item == NULL, , "invalid parameter"); - retif(deleted_cb == NULL, , "invalid parameter"); - - evas_object_data_set(noti_list_item, E_DATA_NOTI_LIST_CB_DELETED_ITEM, deleted_cb); +HAPI noti_list_item_h *quickpanel_noti_list_item_handler_get(Evas_Object *item) +{ + return _item_handler_get(item); } diff --git a/daemon/notifications/noti_list_item.h b/daemon/notifications/noti_list_item.h index b829ae5..6573c0a 100755 --- a/daemon/notifications/noti_list_item.h +++ b/daemon/notifications/noti_list_item.h @@ -1,51 +1,87 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 __QUICKPANEL_NOTI_LIST_ITEM_H__ #define __QUICKPANEL_NOTI_LIST_ITEM_H__ #include <notification.h> +#include "noti_node.h" +#include "vi_manager.h" #define STATE_NORMAL 1 #define STATE_DELETING 0 #define E_DATA_NOTI_LIST_ITEM_H "noti_list_item" -#define E_DATA_NOTI_LIST_CB_SELECTED_ITEM "noti_list_item_cb_selected" -#define E_DATA_NOTI_LIST_CB_BUTTON_1 "noti_list_item_cb_button_1" -#define E_DATA_NOTI_LIST_CB_DELETED_ITEM "noti_list_item_cb_deleted" + +typedef Evas_Object *(*creater_cb)(notification_h, Evas_Object *); +typedef void (*action_cb)(noti_node_item *, notification_ly_type_e, Evas_Object *); +typedef void (*response_cb)(noti_node_item *, Evas_Object *); + +typedef enum _qp_notilistitem_state_type { + NOTILISTITEM_STATE_NORMAL = 0, + NOTILISTITEM_STATE_GETSTURE_WAIT, + NOTILISTITEM_STATE_GETSTURE_CANCELED, + NOTILISTITEM_STATE_DELETED, +} qp_notilistitem_state_type; + +typedef struct _Noti_View_H { + char *name; + + /* func */ + creater_cb create; + action_cb update; + action_cb remove; +} Noti_View_H; typedef struct _noti_list_item_h { int status; - void *data; - notification_ly_type_e layout; + int priv_id; + notification_ly_type_e layout; + noti_node_item *noti_node; + + response_cb selected_cb; + response_cb button_1_cb; + response_cb deleted_cb; + + QP_VI *vi; + Ecore_Animator *animator; + + int obj_w; + int obj_h; + int press_x; + int press_y; + int distance; + int need_to_cancel_press; + qp_notilistitem_state_type state; } noti_list_item_h; -Evas_Object *noti_list_item_create(Evas_Object *parent, notification_ly_type_e layout); -void noti_list_item_node_set(Evas_Object *noti_list_item, void *data); -void *noti_list_item_node_get(Evas_Object *noti_list_item); -void noti_list_item_remove(Evas_Object *noti_list_item); -void noti_list_item_set_item_selected_cb(Evas_Object *noti_list_item, - void(*selected_cb)(void *data, Evas_Object *obj)); -void noti_list_item_set_item_button_1_cb(Evas_Object *noti_list_item, - void(*button_1_cb)(void *data, Evas_Object *obj)); -void noti_list_item_set_item_deleted_cb(Evas_Object *noti_list_item, - void(*deleted_cb)(void *data, Evas_Object *obj)); -int noti_list_item_get_status(Evas_Object *noti_list_item); -void noti_list_item_set_status(Evas_Object *noti_list_item, int status); -void noti_list_item_update(Evas_Object *noti_list_item); +Evas_Object *quickpanel_noti_list_item_create(Evas_Object *parent, notification_h noti); +void quickpanel_noti_list_item_update(Evas_Object *item); +void quickpanel_noti_list_item_remove(Evas_Object *item); + +void quickpanel_noti_list_item_node_set(Evas_Object *item, noti_node_item *noti_node); +void *quickpanel_noti_list_item_node_get(Evas_Object *item); +int quickpanel_noti_list_item_get_status(Evas_Object *item); +void quickpanel_noti_list_item_set_status(Evas_Object *item, int status); +void quickpanel_noti_list_item_set_item_selected_cb(Evas_Object *item, response_cb selected_cb); +void quickpanel_noti_list_item_set_item_button_1_cb(Evas_Object *item, response_cb callback); +void quickpanel_noti_list_item_set_item_deleted_cb(Evas_Object *item, response_cb callback); +noti_list_item_h *quickpanel_noti_list_item_handler_get(Evas_Object *item); #endif diff --git a/daemon/notifications/noti_listbox.c b/daemon/notifications/noti_listbox.c index 6cc0db7..9066fd4 100755 --- a/daemon/notifications/noti_listbox.c +++ b/daemon/notifications/noti_listbox.c @@ -1,20 +1,20 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ -#include <Ecore_X.h> #include "quickpanel-ui.h" #include "common.h" @@ -22,36 +22,159 @@ #include "quickpanel_def.h" #include "noti_listbox.h" #include "noti_list_item.h" +#include "vi_manager.h" +#include "noti.h" #define E_DATA_LAYOUT_PORTRAIT "layout_portrait" #define E_DATA_LAYOUT_LANDSCAPE "layout_landscape" #define E_DATA_CB_DELETE_ITEM "cb_delete_item" #define E_DATA_CB_REMOVED "cb_removed" #define E_DATA_APP_DATA "app_data" +#define E_DATA_IS_HIDED "hided" + +static Eina_Bool _anim_init_cb(void *data); +static Eina_Bool _anim_job_cb(void *data); +static Eina_Bool _anim_done_cb(void *data); + +static void _listbox_flag_set(Evas_Object *container, const char *key, int value) +{ + retif(container == NULL, , "invalid parameter"); + retif(key == NULL, , "invalid parameter"); + + evas_object_data_set(container, key, (void *)value); +} + +static int _listbox_flag_get(Evas_Object *container, const char *key) +{ + retif(container == NULL, 0, "invalid parameter"); + retif(key == NULL, 0, "invalid parameter"); + + return (int)evas_object_data_get(container, key); +} + +static int _listbox_layout_item_valid(Evas_Object *container, Evas_Object *item) +{ + int ret = 0; + Eina_List *list = NULL; + retif(container == NULL, 0, "invalid parameter"); + list = elm_box_children_get(container); + retif(list == NULL, 0, "invalid parameter. containter[%p]", container); + + if (eina_list_data_find(list, item) != NULL) { + ret = 1; + } + + eina_list_free(list); + + return ret; +} + +static void _listbox_layout_get_coord(Evas_Object *container, int insert_position, + int *coord_x, int *coord_y, Evas_Object *noti_section) +{ + int x, y, h; + int off_y = 0; + struct appdata *ad = quickpanel_get_app_data(); + + retif(container == NULL, , "invalid parameter"); + retif(ad == NULL, , "invalid data."); + + if (insert_position == 0) { + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj = NULL; + Eina_List *item_list = elm_box_children_get(container); + noti_node_item *node = NULL; + notification_type_e type = NOTIFICATION_TYPE_NONE; + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + node = quickpanel_noti_list_item_node_get(obj); + if (node) { + notification_h noti = node->noti; + if (noti) { + notification_get_type(noti, &type); + if (type == NOTIFICATION_TYPE_NOTI) { + break; + } else { + evas_object_geometry_get(obj, NULL, NULL, NULL, &h); + off_y += h; + } + } + } else { + evas_object_geometry_get(obj, NULL, NULL, NULL, &h); + off_y += h; + } + } + + if (item_list != NULL) { + eina_list_free(item_list); + } + } + else if (insert_position == 1) { + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj = NULL; + Eina_List *item_list = elm_box_children_get(container); + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj != NULL) { + evas_object_geometry_get(obj, NULL, NULL, NULL, &h); + off_y += h; + } + if (obj == noti_section) { + break; + } + } + + if (item_list != NULL) { + eina_list_free(item_list); + } + } + + evas_object_geometry_get(container, &x, &y, NULL, &h); + if (off_y == 0 || y == 0) { + ERR("Failed get a valid height offset : %d %d", off_y, y); + } + + if (coord_x != NULL) { + *coord_x = x; + } + if (coord_y != NULL) { + *coord_y = y + off_y; + } +} + +static void _listbox_layout_size_get(Evas_Object *container, int *w, int *h) +{ + int h_temp = 0; + int w_item = 0, h_item = 0; + Evas_Object *obj = NULL; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + retif(container == NULL, , "invalid parameter"); + + Eina_List *item_list = elm_box_children_get(container); + + EINA_LIST_FREE(item_list, obj) + { + if (obj != NULL) { + evas_object_geometry_get(obj, NULL, NULL, NULL, &h_temp); + h_item += h_temp; + } + } + evas_object_geometry_get(container, NULL, NULL, &w_item, NULL); + + if (w != NULL) { + *w = w_item; + } + if (h != NULL) { + *h = h_item; + } +} + +HAPI Evas_Object *quickpanel_noti_listbox_create(Evas_Object *parent, void *data, qp_item_type_e item_type) +{ -typedef struct _listbox_info_layout { - int n_per_rows; - int padding_top; - int padding_left; - int padding_right; - int padding_bottom; - int padding_between; - int child_w; - int child_h; - double scale; -} listbox_info_layout; - -typedef struct _listbox_info_animation { - Evas_Object *listbox; - Evas_Object *item; - - void (*update_cb)(Evas_Object *list, void *data, int is_prepend); - Evas_Object *container; - void *noti; - int pos; -} listbox_info_animation; - -HAPI Evas_Object *listbox_create(Evas_Object *parent, void *data) { struct appdata *ad = data; Evas_Object *listbox = NULL; @@ -67,27 +190,30 @@ HAPI Evas_Object *listbox_create(Evas_Object *parent, void *data) { evas_object_data_set(listbox, E_DATA_CB_DELETE_ITEM, NULL); evas_object_data_set(listbox, E_DATA_APP_DATA, ad); + _listbox_flag_set(listbox, E_DATA_IS_HIDED, 0); qp_item_data *qid - = quickpanel_list_util_item_new(QP_ITEM_TYPE_ONGOING_NOTI, NULL); + = quickpanel_list_util_item_new(item_type, NULL); quickpanel_list_util_item_set_tag(listbox, qid); return listbox; } -HAPI void listbox_remove(Evas_Object *listbox) { - +HAPI void quickpanel_noti_listbox_remove(Evas_Object *listbox) +{ retif(listbox == NULL, , "invalid parameter"); - listbox_remove_all_item(listbox, 0); + quickpanel_noti_listbox_remove_all_item(listbox, 0); evas_object_data_del(listbox, E_DATA_CB_DELETE_ITEM); evas_object_data_del(listbox, E_DATA_APP_DATA); quickpanel_list_util_item_del_tag(listbox); evas_object_del(listbox); + listbox = NULL; } -HAPI void listbox_set_item_deleted_cb(Evas_Object *listbox, - void(*deleted_cb)(void *data, Evas_Object *obj)) { +HAPI void quickpanel_noti_listbox_set_item_deleted_cb(Evas_Object *listbox, + void(*deleted_cb)(void *data, Evas_Object *obj)) +{ retif(listbox == NULL, , "invalid parameter"); retif(deleted_cb == NULL, , "invalid parameter"); @@ -95,7 +221,8 @@ HAPI void listbox_set_item_deleted_cb(Evas_Object *listbox, } static void _listbox_call_item_deleted_cb(Evas_Object *listbox, void *data, - Evas_Object *obj) { + Evas_Object *obj) +{ retif(listbox == NULL, , "invalid parameter"); void (*deleted_cb)(void *data, Evas_Object *obj) = NULL; @@ -107,9 +234,10 @@ static void _listbox_call_item_deleted_cb(Evas_Object *listbox, void *data, } } -HAPI void listbox_add_item(Evas_Object *listbox, Evas_Object *item, int is_prepend) { +HAPI void quickpanel_noti_listbox_add_item(Evas_Object *listbox, Evas_Object *item, int insert_pos, Evas_Object *noti_section) +{ + QP_VI *vi = NULL; const char *signal = NULL; - retif(listbox == NULL, , "invalid parameter"); retif(item == NULL, , "invalid parameter"); @@ -129,188 +257,654 @@ HAPI void listbox_add_item(Evas_Object *listbox, Evas_Object *item, int is_prepe edje_object_message_signal_process(_EDJ(item)); elm_layout_sizing_eval(item); - if (is_prepend == LISTBOX_PREPEND) - elm_box_pack_start(listbox, item); - else - elm_box_pack_end(listbox, item); + vi = quickpanel_vi_new_with_data( + VI_OP_INSERT, + QP_ITEM_TYPE_ONGOING_NOTI, + listbox, + item, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + noti_section, + insert_pos, + 0); + quickpanel_vi_start(vi); } -static void _listbox_remove_item_anim_cb(void *data, Elm_Transit *transit) { - DBG(""); - retif(data == NULL, , "invalid parameter"); - retif(transit == NULL, , "invalid parameter"); - - listbox_info_animation *info_animation = data; - - retif(info_animation->listbox == NULL, , "invalid parameter"); - retif(info_animation->item == NULL, , "invalid parameter"); - - DBG("remove:%p", info_animation->item); - void *node = noti_list_item_node_get(info_animation->item); - elm_box_unpack(info_animation->listbox, info_animation->item); - noti_list_item_remove(info_animation->item); - _listbox_call_item_deleted_cb(info_animation->listbox, - node, NULL); - - if (info_animation->update_cb != NULL) { - retif(info_animation->container == NULL, , "invalid parameter"); - retif(info_animation->noti == NULL, , "invalid parameter"); - - info_animation->update_cb(info_animation->container, - info_animation->noti, info_animation->pos); - } - - free(info_animation); - info_animation = NULL; -} - -HAPI void listbox_remove_item(Evas_Object *listbox, Evas_Object *item, int with_animation) { +HAPI void quickpanel_noti_listbox_remove_item(Evas_Object *listbox, Evas_Object *item, int with_animation) +{ + QP_VI *vi = NULL; retif(listbox == NULL, , "invalid parameter"); retif(item == NULL, , "invalid parameter"); - if (noti_list_item_get_status(item) == STATE_DELETING) { - return ; - } - noti_list_item_set_status(item, STATE_DELETING); DBG("remove:%p", item); if (with_animation == 1) { - listbox_info_animation *info_animation = (listbox_info_animation *) malloc( - sizeof(listbox_info_animation)); - if (info_animation == NULL) - return; - info_animation->listbox = listbox; - info_animation->item = item; - info_animation->update_cb = NULL; - info_animation->container = NULL; - info_animation->noti = NULL; - info_animation->pos = 0; - - Elm_Transit *transit = elm_transit_add(); - //Fade in and out with layout object. - elm_transit_object_add(transit, item); - elm_transit_effect_fade_add(transit); - elm_transit_duration_set(transit, 0.7); - elm_transit_del_cb_set(transit, _listbox_remove_item_anim_cb, - info_animation); - elm_transit_go(transit); + vi = quickpanel_vi_new_with_data( + VI_OP_DELETE, + QP_ITEM_TYPE_ONGOING_NOTI, + listbox, + item, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + NULL, + 0, + 0); + quickpanel_vi_start(vi); } else { DBG("%p", item); - void *node = noti_list_item_node_get(item); + void *node = quickpanel_noti_list_item_node_get(item); elm_box_unpack(listbox, item); - noti_list_item_remove(item); + quickpanel_noti_list_item_remove(item); _listbox_call_item_deleted_cb(listbox, node, NULL); } } -HAPI void listbox_remove_all_item(Evas_Object *listbox, int with_animation) { - DBG(""); - retif(listbox == NULL, , "invalid parameter"); +static void _anim_job_delete_all(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, , "invalid parameter"); + quickpanel_vi_done(vi); +} + +static void _anim_done_delete_all(void *data) +{ + QP_VI *vi = data; Eina_List *l; Eina_List *l_next; - Evas_Object *obj; - Eina_List *item_list = elm_box_children_get(listbox); + Evas_Object *obj = NULL; + Eina_List *item_list = NULL; - EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) - { + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + + Evas_Object *listbox = vi->container; + + item_list = elm_box_children_get(listbox); + retif(item_list == NULL, , "invalid parameter"); + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { if (obj != NULL) { - // call deleted callback - listbox_remove_item(listbox, obj, with_animation); + DBG("try to remove:%p", obj); + quickpanel_noti_listbox_remove_item(listbox, obj, EINA_TRUE); } } + + if (item_list != NULL) { + eina_list_free(item_list); + } } -HAPI void listbox_update(Evas_Object *listbox) { +HAPI void quickpanel_noti_listbox_remove_all_item(Evas_Object *listbox, int with_animation) +{ + QP_VI *vi = NULL; + retif(listbox == NULL, , "invalid parameter"); + + vi = quickpanel_vi_new_with_data( + VI_OP_DELETE_ALL, + QP_ITEM_TYPE_ONGOING_NOTI, + listbox, + NULL, + _anim_init_cb, + _anim_job_cb, + _anim_done_cb, + _anim_done_cb, + vi, + NULL, + 0, + 0); + quickpanel_vi_start(vi); +} + +HAPI void quickpanel_noti_listbox_update(Evas_Object *listbox) +{ retif(listbox == NULL, , "invalid parameter"); - Eina_List *l; - Eina_List *l_next; Evas_Object *obj; Eina_List *item_list = elm_box_children_get(listbox); - DBG("all count:%d", eina_list_count(item_list)); + EINA_LIST_FREE(item_list, obj) + { + quickpanel_noti_list_item_update(obj); + } +} + +HAPI void quickpanel_noti_listbox_items_visibility_set(Evas_Object *listbox, int is_visible) +{ + retif(listbox == NULL, , "invalid parameter"); + + _listbox_flag_set(listbox, E_DATA_IS_HIDED, is_visible); +} - EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) +HAPI void quickpanel_noti_listbox_update_item(Evas_Object *listbox, Evas_Object *item) +{ + retif(listbox == NULL, , "invalid parameter"); + retif(item == NULL, , "invalid parameter"); + + if (_listbox_layout_item_valid(listbox, item)) { + quickpanel_noti_list_item_update(item); + } +} + +HAPI void quickpanel_noti_listbox_rotation(Evas_Object *listbox, int angle) +{ + int h = 0; + Evas_Object *obj = NULL; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + retif(listbox == NULL, , "invalid parameter"); + + Eina_List *item_list = elm_box_children_get(listbox); + + DBG("items in listbox:%d", eina_list_count(item_list)); + + EINA_LIST_FREE(item_list, obj) { if (obj != NULL) { - noti_list_item_update(obj); + evas_object_geometry_get(obj, NULL, NULL, NULL, &h); + if (angle == 270 || angle == 90) { + evas_object_resize(obj, ad->win_height, h); + } else { + evas_object_resize(obj, ad->win_width, h); + } + elm_layout_sizing_eval(obj); } } + + _listbox_layout_size_get(listbox, NULL, &h); + + if (angle == 270 || angle == 90) { + evas_object_resize(listbox, ad->win_height, h); + } else { + evas_object_resize(listbox, ad->win_width, h); + } + DBG("listbox has been rotated to %d", angle); } -HAPI void listbox_update_item(Evas_Object *listbox, Evas_Object *item) { - retif(listbox == NULL, , "invalid parameter"); - retif(item == NULL, , "invalid parameter"); +HAPI int quickpanel_noti_listbox_get_item_count(Evas_Object *listbox) +{ + int item_count = 0; + Eina_List *items = NULL; + retif(listbox == NULL, 0, "invalid parameter"); - noti_list_item_update(item); + if ((items = elm_box_children_get(listbox)) != NULL) { + item_count = eina_list_count(items); + eina_list_free(items); + return item_count; + } else { + return 0; + } } -HAPI void listbox_remove_and_add_item(Evas_Object *listbox, Evas_Object *item - ,void (*update_cb)(Evas_Object *list, void *data, int is_prepend) - ,void *container, void *data, int pos) { +static void _anim_init_insert(void *data) +{ - retif(listbox == NULL, , "invalid parameter"); - retif(item == NULL, , "invalid parameter"); - retif(update_cb == NULL, , "invalid parameter"); - retif(container == NULL, , "invalid parameter"); - retif(data == NULL, , "invalid parameter"); - - if (noti_list_item_get_status(item) == STATE_DELETING) { - return ; - } - noti_list_item_set_status(item, STATE_DELETING); - - listbox_info_animation *info_animation = (listbox_info_animation *) malloc( - sizeof(listbox_info_animation)); - if (info_animation == NULL) - return; - info_animation->listbox = listbox; - info_animation->item = item; - info_animation->update_cb = update_cb; - info_animation->container = container; - info_animation->noti = data; - info_animation->pos = pos; - - Elm_Transit *transit = elm_transit_add(); - //Fade in and out with layout object. - elm_transit_object_add(transit, item); - elm_transit_effect_fade_add(transit); - elm_transit_duration_set(transit, 0.4); - elm_transit_del_cb_set(transit, _listbox_remove_item_anim_cb, - info_animation); - elm_transit_go(transit); + QP_VI *vi = data; + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *container = vi->container; + Evas_Object *item = vi->target; + + evas_object_clip_set(item, evas_object_clip_get(container)); + evas_object_color_set(item, 0, 0, 0, 0); } -HAPI void listbox_rotation(Evas_Object *listbox, int angle) { - const char *signal = NULL; +static void _anim_job_insert(void *data) +{ - retif(listbox == NULL, , "invalid parameter"); + QP_VI *vi = data; + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj = NULL; + Eina_List *item_list = NULL; + int item_width, item_height = 0; + int coord_x = 0, coord_y = 0; + int insert_position = 0; + Elm_Transit *transit_layout_parent = NULL; + Elm_Transit *transit_layout = NULL; + Elm_Transit *transit_fadein = NULL; + Evas_Object *container = NULL; + Evas_Object *item = NULL; + int flag = 0; + noti_node_item *node = NULL; + notification_type_e type = NOTIFICATION_TYPE_NONE; + + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + container = vi->container; + item = vi->target; + insert_position = vi->extra_flag_1; + item_list = elm_box_children_get(container); + + _listbox_layout_get_coord(container, insert_position, &coord_x, &coord_y, (Evas_Object *)vi->extra_data_2); + evas_object_move(item, coord_x, coord_y); + + evas_object_geometry_get(item, NULL, NULL, &item_width, &item_height); + if (item_width == 0 && item_height == 0) { + ERR("failed to get a size of item %d %d", item_width, item_height); + evas_object_size_hint_min_get (item, &item_width, &item_height); + } + + transit_layout_parent = quickpanel_list_util_get_reorder_transit(container, NULL, item_height); + + if (insert_position) { + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj == (Evas_Object *)vi->extra_data_2) { + flag = 1; + } + else if (flag == 1) { + transit_layout = elm_transit_add(); + if (transit_layout != NULL) { + elm_transit_effect_translation_add(transit_layout, 0, 0, 0, item_height); + elm_transit_object_add(transit_layout, obj); + elm_transit_duration_set(transit_layout, + quickpanel_vim_get_duration(VI_OP_REORDER)); + elm_transit_tween_mode_set(transit_layout, + quickpanel_vim_get_tweenmode(VI_OP_REORDER)); + elm_transit_objects_final_state_keep_set(transit_layout, EINA_TRUE); + + elm_transit_go(transit_layout); + } else { + ERR("failed to create a transit"); + } + } + } + } + else if (insert_position == 0) { + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + node = quickpanel_noti_list_item_node_get(obj); + if (node) { + notification_h noti = node->noti; + if (noti) { + notification_get_type(noti, &type); + if (type == NOTIFICATION_TYPE_NOTI) { + flag = 1; + } + } + } + if (flag == 1) { + transit_layout = elm_transit_add(); + if (transit_layout != NULL) { + elm_transit_effect_translation_add(transit_layout, 0, 0, 0, item_height); + elm_transit_object_add(transit_layout, obj); + elm_transit_duration_set(transit_layout, + quickpanel_vim_get_duration(VI_OP_REORDER)); + elm_transit_tween_mode_set(transit_layout, + quickpanel_vim_get_tweenmode(VI_OP_REORDER)); + elm_transit_objects_final_state_keep_set(transit_layout, EINA_TRUE); + + elm_transit_go(transit_layout); + } else { + ERR("failed to create a transit"); + } + } + } + } + if (item_list != NULL) { + eina_list_free(item_list); + } + + transit_fadein = elm_transit_add(); + if (transit_fadein != NULL) { + elm_transit_object_add(transit_fadein, item); + elm_transit_effect_color_add(transit_fadein, 0, 0, 0, 0, 255, 255, 255, 255); + elm_transit_duration_set(transit_fadein, + quickpanel_vim_get_duration(VI_OP_INSERT)); + elm_transit_tween_mode_set(transit_fadein, + quickpanel_vim_get_tweenmode(VI_OP_INSERT)); + elm_transit_del_cb_set(transit_fadein, quickpanel_vi_done_cb_for_transit, vi); + + if (transit_layout != NULL) { + elm_transit_chain_transit_add(transit_layout, transit_fadein); + } else { + if (transit_layout_parent != NULL) { + elm_transit_chain_transit_add(transit_layout_parent, transit_fadein); + } else { + elm_transit_go(transit_fadein); + } + } + } else { + ERR("Failed to create all the transit"); + quickpanel_vi_done(vi); + } +} + +static void _anim_done_insert(void *data) +{ + + QP_VI *vi = data; + int inset_position = 0; Eina_List *l; Eina_List *l_next; - Evas_Object *obj; - Eina_List *item_list = elm_box_children_get(listbox); + Eina_List *item_list = NULL; + Evas_Object *obj = NULL; + noti_node_item *node = NULL; + notification_type_e type = NOTIFICATION_TYPE_NONE; + int flag = 0; + + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *container = vi->container; + Evas_Object *item = vi->target; + inset_position = vi->extra_flag_1; + item_list = elm_box_children_get(container); + + evas_object_color_set(item, 255, 255, 255, 255); + + if (inset_position == LISTBOX_PREPEND) { + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj == (Evas_Object *)vi->extra_data_2) { + elm_box_pack_after(container, item, obj); + break; + } + } + } else if (inset_position == LISTBOX_APPEND) { + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + node = quickpanel_noti_list_item_node_get(obj); + if (node) { + notification_h noti = node->noti; + if (noti) { + notification_get_type(noti, &type); + if (type == NOTIFICATION_TYPE_NOTI) { + //node_first_noti = node; + elm_box_pack_before(container, item, obj); + flag = 1; + break; + } + } + } + } + if (flag == 0) { + elm_box_pack_end(container, item); + } + } else { + int ongoing_count = quickpanel_noti_get_type_count(NOTIFICATION_TYPE_ONGOING); + DBG("NOTI INSERT AT: %d", ongoing_count); - if (angle == 270 || angle == 90) { - signal = "box.landscape"; + if (ongoing_count == 0) { + DBG("NOTI INSERT START"); + elm_box_pack_start(container, item); + } else { + Eina_List *items = elm_box_children_get(container); + if (!items) { + ERR("Failed to recieve container items, adding new notification to end of the list"); + elm_box_pack_end(container, item); + return; + } + + Evas_Object *before = eina_list_nth (items, ongoing_count - 1); + if (!before) { + ERR("Failed to recieve preceding item, adding new notification to end of the list"); + elm_box_pack_end(container, item); + return; + } + + DBG("NOTI INSERT BEFORE: %p", before); + elm_box_pack_after(container, item, before); + } + } +} + +static void _anim_job_delete(void *data) +{ + QP_VI *vi = data; + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj = NULL; + Eina_List *item_list = NULL; + int is_start_relayout = 0; + int item_width, item_height = 0; + Elm_Transit *transit_layout_parent = NULL; + Elm_Transit *transit_layout = NULL; + Elm_Transit *transit_fadeout = NULL; + Evas_Object *container = NULL; + Evas_Object *item = NULL; + + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + container = vi->container; + item = vi->target; + item_list = elm_box_children_get(container); + + evas_object_geometry_get(item, NULL, NULL, &item_width, &item_height); + if (item_width == 0 && item_height == 0) { + ERR("failed to get a size of item %d %d", item_width, item_height); + evas_object_size_hint_min_get (item, &item_width, &item_height); + } + + transit_fadeout = elm_transit_add(); + if (transit_fadeout != NULL) { + elm_transit_object_add(transit_fadeout, item); + elm_transit_effect_color_add(transit_fadeout, 255, 255, 255, 255, 0, 0, 0, 0); + elm_transit_objects_final_state_keep_set(transit_fadeout, EINA_TRUE); + elm_transit_duration_set(transit_fadeout, quickpanel_vim_get_duration(VI_OP_DELETE)); + elm_transit_go(transit_fadeout); } else { - signal = "box.portrait"; + ERR("failed to create a transit"); } - DBG("all count:%d", eina_list_count(item_list)); + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj == item) { + is_start_relayout = 1; + } else if (obj != NULL && is_start_relayout == 1) { + transit_layout = elm_transit_add(); + if (transit_layout != NULL) { + elm_transit_effect_translation_add(transit_layout, 0, 0, 0, -item_height); + elm_transit_object_add(transit_layout, obj); + elm_transit_duration_set(transit_layout, + quickpanel_vim_get_duration(VI_OP_REORDER)); + elm_transit_tween_mode_set(transit_layout, + quickpanel_vim_get_tweenmode(VI_OP_REORDER)); + elm_transit_objects_final_state_keep_set(transit_layout, EINA_TRUE); + if (transit_fadeout != NULL) { + elm_transit_chain_transit_add(transit_fadeout, transit_layout); + } + } else { + ERR("failed to create a transit"); + } + } + } - EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) - { - if (obj != NULL) { - elm_object_signal_emit(obj, signal, "box.prog"); - edje_object_message_signal_process(_EDJ(obj)); - elm_layout_sizing_eval(obj); - DBG("set to %s, %x", signal, obj); + if (item_list != NULL) { + eina_list_free(item_list); + } + + transit_layout_parent = quickpanel_list_util_get_reorder_transit(container, + transit_fadeout, -item_height); + + if (transit_layout_parent != NULL) { + elm_transit_del_cb_set(transit_layout_parent, quickpanel_vi_done_cb_for_transit, + vi); + } else if (transit_layout != NULL) { + elm_transit_del_cb_set(transit_layout, quickpanel_vi_done_cb_for_transit, + vi); + } else if (transit_fadeout != NULL) { + elm_transit_del_cb_set(transit_fadeout, quickpanel_vi_done_cb_for_transit, + vi); + } else { + ERR("Failed to create all the transit"); + quickpanel_vi_done(vi); + } +} + +static void _anim_done_delete(void *data) +{ + int w = 0, h = 0; + QP_VI *vi = data; + + retif(vi == NULL, , "invalid parameter"); + retif(vi->container == NULL, , "invalid parameter"); + retif(vi->target == NULL, , "invalid parameter"); + + Evas_Object *container = vi->container; + Evas_Object *item = vi->target; + + elm_box_unpack(container, item); + quickpanel_noti_list_item_remove(item); + _listbox_call_item_deleted_cb(container, + quickpanel_noti_list_item_node_get(item), NULL); + + if (_listbox_flag_get(container, E_DATA_IS_HIDED) == 1) { + _listbox_layout_size_get(container, &w, &h); + evas_object_resize(container, w, h); + } +} + +static Eina_Bool _anim_init_cb(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_init_table[] = { + { + .op_type = VI_OP_INSERT, + .handler = _anim_init_insert, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + int i = 0; + for (i = 0; anim_init_table[i].op_type != VI_OP_NONE; i++) { + if (anim_init_table[i].op_type != vi->op_type) { + continue; + } + + anim_init_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +static Eina_Bool _anim_job_cb(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_job_table[] = { + { + .op_type = VI_OP_INSERT, + .handler = _anim_job_insert, + }, + { + .op_type = VI_OP_DELETE, + .handler = _anim_job_delete, + }, + { + .op_type = VI_OP_DELETE_ALL, + .handler = _anim_job_delete_all, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + int i = 0; + for (i = 0; anim_job_table[i].op_type != VI_OP_NONE; i++) { + if (anim_job_table[i].op_type != vi->op_type) { + continue; + } + anim_job_table[i].handler(vi); + break; + } + + return EINA_TRUE; +} + +static Eina_Bool _anim_done_cb(void *data) +{ + QP_VI *vi = data; + retif(vi == NULL, EINA_FALSE, "invalid parameter"); + + static qp_vi_op_table anim_done_table[] = { + { + .op_type = VI_OP_INSERT, + .handler = _anim_done_insert, + }, + { + .op_type = VI_OP_DELETE, + .handler = _anim_done_delete, + }, + { + .op_type = VI_OP_DELETE_ALL, + .handler = _anim_done_delete_all, + }, + { + .op_type = VI_OP_NONE, + .handler = NULL, + }, + }; + + int i = 0; + for (i = 0; anim_done_table[i].op_type != VI_OP_NONE; i++) { + if (anim_done_table[i].op_type != vi->op_type) { + continue; } + + anim_done_table[i].handler(vi); + break; } - DBG("Angle Rotation is %d", angle); + return EINA_TRUE; +} + +HAPI int quickpanel_noti_listbox_get_geometry(Evas_Object *listbox, + int *limit_h, int *limit_partial_h, int *limit_partial_w) +{ + + int x = 0, y = 0, w = 0, h = 0; + + retif(listbox == NULL, 0, "invalid parameter"); + retif(limit_h == NULL, 0, "invalid parameter"); + retif(limit_partial_h == NULL, 0, "invalid parameter"); + retif(limit_partial_w == NULL, 0, "invalid parameter"); + evas_object_geometry_get(listbox, &x, &y, &w, &h); + + *limit_h = y + h; + *limit_partial_h = *limit_h; + *limit_partial_w = 0; + + return 1; +} + +static void _notibox_deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + quickpanel_uic_close_quickpanel(EINA_FALSE, EINA_FALSE); +} + +HAPI void quickpanel_noti_listbox_closing_trigger_set(Evas_Object *listbox) +{ + Evas_Object *item = NULL; + Eina_List *items = NULL; + retif(listbox == NULL, , "invalid parameter"); + + if ((items = elm_box_children_get(listbox)) != NULL) { + item = eina_list_nth(items, 0); + if (item != NULL) { + evas_object_event_callback_add(item, + EVAS_CALLBACK_DEL, _notibox_deleted_cb, NULL); + } + eina_list_free(items); + } } diff --git a/daemon/notifications/noti_listbox.h b/daemon/notifications/noti_listbox.h index 070e1c6..8f414e8 100755 --- a/daemon/notifications/noti_listbox.h +++ b/daemon/notifications/noti_listbox.h @@ -1,36 +1,44 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 __QUICKPANEL_NOTI_LISTBOX_H__ #define __QUICKPANEL_NOTI_LISTBOX_H__ +#include "list_util.h" + +#define LISTBOX_INSERT_AFTER -1 #define LISTBOX_PREPEND 1 #define LISTBOX_APPEND 0 -Evas_Object *listbox_create(Evas_Object *parent, void *data); -void listbox_remove(Evas_Object *listbox); -void listbox_add_item(Evas_Object *listbox, Evas_Object *item, int is_prepend); -void listbox_remove_item(Evas_Object *listbox, Evas_Object *item, int with_animation); -void listbox_rotation(Evas_Object *listbox, int angle); -void listbox_remove_and_add_item(Evas_Object *listbox, Evas_Object *item - ,void (*update_cb)(Evas_Object *list, void *data, int is_prepend) - ,void *container, void *data, int pos); -void listbox_remove_all_item(Evas_Object *listbox, int with_animation); -void listbox_set_item_deleted_cb(Evas_Object *listbox, +Evas_Object *quickpanel_noti_listbox_create(Evas_Object *parent, void *data, qp_item_type_e item_type); +void quickpanel_noti_listbox_remove(Evas_Object *listbox); +void quickpanel_noti_listbox_add_item(Evas_Object *listbox, Evas_Object *item, int is_prepend, Evas_Object *noti_section); +void quickpanel_noti_listbox_remove_item(Evas_Object *listbox, Evas_Object *item, int with_animation); +void quickpanel_noti_listbox_rotation(Evas_Object *listbox, int angle); +void quickpanel_noti_listbox_remove_all_item(Evas_Object *listbox, int with_animation); +void quickpanel_noti_listbox_set_item_deleted_cb(Evas_Object *listbox, void(*deleted_cb)(void *data, Evas_Object *obj)); -void listbox_update(Evas_Object *listbox); -void listbox_update_item(Evas_Object *listbox, Evas_Object *item); +void quickpanel_noti_listbox_update(Evas_Object *listbox); +void quickpanel_noti_listbox_update_item(Evas_Object *listbox, Evas_Object *item); +int quickpanel_noti_listbox_get_item_count(Evas_Object *listbox); +void quickpanel_noti_listbox_items_visibility_set(Evas_Object *listbox, int is_visible); +int quickpanel_noti_listbox_get_geometry(Evas_Object *listbox, + int *limit_h, int *limit_partial_h, int *limit_partial_w); +void quickpanel_noti_listbox_closing_trigger_set(Evas_Object *listbox); + #endif diff --git a/daemon/notifications/noti_node.c b/daemon/notifications/noti_node.c index 0d9166e..763d6a8 100755 --- a/daemon/notifications/noti_node.c +++ b/daemon/notifications/noti_node.c @@ -1,19 +1,21 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 "quickpanel-ui.h" #include "common.h" #include "list_util.h" @@ -21,7 +23,7 @@ static void _noti_node_free(noti_node_item *node); -HAPI void noti_node_create(noti_node **handle) +HAPI void quickpanel_noti_node_create(noti_node **handle) { retif(handle == NULL, , "Invalid parameter!"); @@ -39,7 +41,7 @@ HAPI void noti_node_create(noti_node **handle) } } -HAPI void noti_node_destroy(noti_node **handle) +HAPI void quickpanel_noti_node_destroy(noti_node **handle) { retif(handle == NULL, , "Invalid parameter!"); retif(*handle == NULL, , "Invalid parameter!"); @@ -52,7 +54,7 @@ HAPI void noti_node_destroy(noti_node **handle) *handle = NULL; } -HAPI noti_node_item *noti_node_add(noti_node *handle, notification_h noti, void *view) +HAPI noti_node_item *quickpanel_noti_node_add(noti_node *handle, notification_h noti, void *view) { int priv_id = 0; notification_type_e noti_type = NOTIFICATION_TYPE_NONE; @@ -74,48 +76,61 @@ HAPI noti_node_item *noti_node_add(noti_node *handle, notification_h noti, void notification_get_type(noti, ¬i_type); - if (noti_type == NOTIFICATION_TYPE_NOTI) + if (noti_type == NOTIFICATION_TYPE_NOTI) { handle->n_noti++; - else if (noti_type == NOTIFICATION_TYPE_ONGOING) + } else if (noti_type == NOTIFICATION_TYPE_ONGOING) { handle->n_ongoing++; + } + DBG("n_noti = [%d] n_ongoing = [%d]", handle->n_noti, handle->n_ongoing); return node; } return NULL; } -HAPI void noti_node_remove(noti_node *handle, int priv_id) +HAPI void quickpanel_noti_node_remove(noti_node *handle, int priv_id) { notification_type_e noti_type = NOTIFICATION_TYPE_NONE; retif(handle == NULL, , "Invalid parameter!"); retif(handle->table == NULL, , "Invalid parameter!"); - noti_node_item *item = noti_node_get(handle, priv_id); + noti_node_item *item = quickpanel_noti_node_get(handle, priv_id); if (item != NULL) { if (item->noti != NULL) { notification_get_type(item->noti, ¬i_type); - if (noti_type == NOTIFICATION_TYPE_NOTI) + if (noti_type == NOTIFICATION_TYPE_NOTI) { handle->n_noti--; - else if (noti_type == NOTIFICATION_TYPE_ONGOING) + } else if (noti_type == NOTIFICATION_TYPE_ONGOING) { handle->n_ongoing--; + } } notification_free(item->noti); item->noti = NULL; item->view = NULL; - if (g_hash_table_remove(handle->table, GINT_TO_POINTER(priv_id))) - { - INFO("success to remove %d", priv_id); + if (g_hash_table_remove(handle->table, GINT_TO_POINTER(priv_id))) { + DBG("success to remove %d", priv_id); } } } -HAPI noti_node_item *noti_node_get(noti_node *handle, int priv_id) +HAPI void quickpanel_noti_node_remove_all(noti_node *handle) +{ + retif(handle == NULL, , "Invalid parameter!"); + retif(handle->table == NULL, , "Invalid parameter!"); + + g_hash_table_remove_all(handle->table); + handle->n_noti = 0; + handle->n_ongoing = 0; + DBG("all the nodes are removed"); +} + +HAPI noti_node_item *quickpanel_noti_node_get(noti_node *handle, int priv_id) { retif(handle == NULL, NULL, "Invalid parameter!"); retif(handle->table == NULL, NULL, "Invalid parameter!"); @@ -124,14 +139,19 @@ HAPI noti_node_item *noti_node_get(noti_node *handle, int priv_id) (handle->table, GINT_TO_POINTER(priv_id)); } -HAPI int noti_node_get_item_count(noti_node *handle, notification_type_e noti_type) +HAPI int quickpanel_noti_node_get_item_count(noti_node *handle, notification_type_e noti_type) { retif(handle == NULL, 0, "Invalid parameter!"); - if (noti_type == NOTIFICATION_TYPE_NOTI) + DBG("n_noti %d , n_ongoing %d ", handle->n_noti, handle->n_ongoing); + + if (noti_type == NOTIFICATION_TYPE_NOTI) { return handle->n_noti; - else if (noti_type == NOTIFICATION_TYPE_ONGOING) + } else if (noti_type == NOTIFICATION_TYPE_ONGOING) { return handle->n_ongoing; + } else if (noti_type == NOTIFICATION_TYPE_NONE) { + return handle->n_noti + handle->n_ongoing; + } return 0; } diff --git a/daemon/notifications/noti_node.h b/daemon/notifications/noti_node.h index 5a43239..9ebdce6 100755 --- a/daemon/notifications/noti_node.h +++ b/daemon/notifications/noti_node.h @@ -1,19 +1,21 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 __QUICKPANEL_NOTI_NODE_H__ #define __QUICKPANEL_NOTI_NODE_H__ @@ -31,11 +33,12 @@ typedef struct _noti_node_item { void *view; } noti_node_item; -void noti_node_create(noti_node **handle); -void noti_node_destroy(noti_node **handle); -noti_node_item *noti_node_add(noti_node *handle, notification_h noti, void *view); -void noti_node_remove(noti_node *handle, int priv_id); -noti_node_item *noti_node_get(noti_node *handle, int priv_id); -int noti_node_get_item_count(noti_node *handle, notification_type_e noti_type); +void quickpanel_quickpanel_noti_node_create(noti_node **handle); +void quickpanel_noti_node_destroy(noti_node **handle); +noti_node_item *quickpanel_noti_node_add(noti_node *handle, notification_h noti, void *view); +void quickpanel_noti_node_remove(noti_node *handle, int priv_id); +void quickpanel_noti_node_remove_all(noti_node *handle); +noti_node_item *quickpanel_noti_node_get(noti_node *handle, int priv_id); +int quickpanel_noti_node_get_item_count(noti_node *handle, notification_type_e noti_type); #endif diff --git a/daemon/notifications/noti_section.c b/daemon/notifications/noti_section.c index 4a1d55d..64fe30a 100755 --- a/daemon/notifications/noti_section.c +++ b/daemon/notifications/noti_section.c @@ -1,19 +1,21 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 <notification.h> #include "quickpanel-ui.h" #include "quickpanel_def.h" @@ -21,95 +23,137 @@ #include "noti.h" #include "noti_section.h" #include "list_util.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif -static void _noti_section_button_clicked_cb(void *data, Evas_Object * obj, - void *event_info) -{ - notification_error_e noti_err = NOTIFICATION_ERROR_NONE; - - noti_err = notifiation_clear(NOTIFICATION_TYPE_NOTI); - - DBG("notiifcations going to be cleared: noti_err(%d)", noti_err); + #define NOTI_CLEAR_ALL_SECTION "quickpanel/notisection/clear_all" + #define NOTI_DEFAULT_SECTION "quickpanel/notisection/default" - quickpanel_play_feedback(); -} - -static void _noti_section_set_button(Evas_Object *noti_section) +static void _noti_section_set_text(Evas_Object *noti_section, int count) { - Evas_Object *eo = NULL; - Evas_Object *old_eo = NULL; +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = NULL; +#endif - retif(noti_section == NULL, , "invalid parameter"); + DBG("count is : %d ", count); - old_eo = elm_object_part_content_get(noti_section, "elm.swallow.icon"); - - if (old_eo == NULL) { - eo = elm_button_add(noti_section); - retif(eo == NULL, , "Failed to create clear button!"); - elm_object_style_set(eo, "quickpanel_standard"); - evas_object_smart_callback_add(eo, "clicked", - _noti_section_button_clicked_cb, NULL); - elm_object_part_content_set(noti_section, "elm.swallow.icon", eo); - } else { - eo = old_eo; - } - - elm_object_text_set(eo, _S("IDS_COM_BODY_CLEAR_ALL")); -} - -static void _noti_section_set_text(Evas_Object *noti_section, int count) -{ char text[128] = {0,}; - char format[256] = {0,}; + char *format = NULL; const char *old_text = NULL; retif(noti_section == NULL, , "invalid parameter"); - snprintf(format, sizeof(format), "%s %%d", _("IDS_QP_BODY_NOTIFICATIONS_ABB2")); + format = _("IDS_QP_HEADER_NOTIFICATIONS_HPD_ABB"); snprintf(text, sizeof(text), format, count); - old_text = elm_object_part_text_get(noti_section, "elm.text.text"); + old_text = elm_object_part_text_get(noti_section, "elm.text.notifications_number"); if (old_text != NULL) { if (strcmp(old_text, text) == 0) { - return ; + return; } } - elm_object_part_text_set(noti_section, "elm.text.text", text); +#ifdef QP_SCREENREADER_ENABLE + ao = quickpanel_accessibility_screen_reader_object_get(noti_section, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus.label", noti_section); + + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, ""); + elm_access_info_set(ao, ELM_ACCESS_INFO, text); + } +#endif + + DBG("Trying to set text :%s ", text); + + elm_object_part_text_set(noti_section, "elm.text.notifications_number", text); + elm_object_part_text_set(noti_section, "text.button.clear_all", _("IDS_QP_HEADER_CLEAR_ALL_ABB")); } -HAPI Evas_Object *noti_section_create(Evas_Object *parent) { +HAPI Evas_Object *quickpanel_noti_section_create(Evas_Object *parent, qp_item_type_e type) +{ Eina_Bool ret = EINA_FALSE; Evas_Object *section = NULL; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, NULL, "invalid parameter"); retif(parent == NULL, NULL, "invalid parameter"); section = elm_layout_add(parent); - ret = elm_layout_file_set(section, DEFAULT_EDJ, - "quickpanel/notisection/default"); + if (type == QP_ITEM_TYPE_ONGOING_NOTI_GROUP) { + ret = elm_layout_file_set(section, DEFAULT_EDJ, + NOTI_CLEAR_ALL_SECTION); + } else { //in higgs there is only one type of notifications + ret = elm_layout_file_set(section, DEFAULT_EDJ, + NOTI_CLEAR_ALL_SECTION); + } retif(ret == EINA_FALSE, NULL, "failed to load layout"); evas_object_size_hint_weight_set(section, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(section, EVAS_HINT_FILL, EVAS_HINT_FILL); + quickpanel_uic_initial_resize(section, QP_THEME_LIST_ITEM_NOTI_SECTION_HEIGHT); evas_object_show(section); qp_item_data *qid - = quickpanel_list_util_item_new(QP_ITEM_TYPE_NOTI_GROUP, NULL); + = quickpanel_list_util_item_new(type, NULL); quickpanel_list_util_item_set_tag(section, qid); + quickpanel_list_util_sort_insert(ad->list, section); + + Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(section); + elm_object_part_content_set(section, "focus", focus); + evas_object_smart_callback_add(focus, "clicked", quickpanel_noti_on_clear_all_clicked, NULL); + + focus = quickpanel_accessibility_ui_get_focus_object(section); + elm_object_part_content_set(section, "focus.label", focus); return section; } -HAPI void noti_section_update(Evas_Object *noti_section, int noti_count) { +static void _focus_pair_set(Evas_Object *view) +{ + Evas_Object *label = NULL; + Evas_Object *button = NULL; + retif(view == NULL, , "Invalid parameter!"); + + label = elm_object_part_content_get(view, "focus.label"); + button = elm_object_part_content_get(view, "elm.swallow.icon"); + + if (label != NULL && button != NULL) { + /* label */ + elm_object_focus_next_object_set(label, button, ELM_FOCUS_RIGHT); + elm_object_focus_next_object_set(label, button, ELM_FOCUS_DOWN); + + /* button */ + elm_object_focus_next_object_set(button, label, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(button, label, ELM_FOCUS_UP); + } +} + +HAPI void quickpanel_noti_section_update(Evas_Object *noti_section, int noti_count) +{ retif(noti_section == NULL, , "invalid parameter"); - _noti_section_set_button(noti_section); _noti_section_set_text(noti_section, noti_count); + _focus_pair_set(noti_section); + + quickpanel_noti_set_clear_all_status(); } -HAPI void noti_section_remove(Evas_Object *noti_section) { +HAPI void quickpanel_noti_section_set_deleted_cb(Evas_Object *noti_section, + Evas_Object_Event_Cb func, void *data) +{ + retif(noti_section == NULL, , "invalid parameter"); + retif(func == NULL, , "invalid parameter"); + + evas_object_event_callback_add(noti_section, EVAS_CALLBACK_DEL, func, data); +} + +HAPI void quickpanel_noti_section_remove(Evas_Object *noti_section) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); retif(noti_section == NULL, , "invalid parameter"); quickpanel_list_util_item_del_tag(noti_section); - evas_object_del(noti_section); + quickpanel_list_util_item_unpack_by_object(ad->list, noti_section, 0, 0); } diff --git a/daemon/notifications/noti_section.h b/daemon/notifications/noti_section.h index 12dd863..cf0c60e 100755 --- a/daemon/notifications/noti_section.h +++ b/daemon/notifications/noti_section.h @@ -1,24 +1,29 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 __QUICKPANEL_NOTI_SECTION_H__ #define __QUICKPANEL_NOTI_SECTION_H__ -Evas_Object *noti_section_create(Evas_Object *parent); -void noti_section_update(Evas_Object *noti_section, int noti_count); -void noti_section_remove(Evas_Object *noti_section) ; +#include "list_util.h" + +Evas_Object *quickpanel_noti_section_create(Evas_Object *parent, qp_item_type_e type); +void quickpanel_noti_section_update(Evas_Object *noti_section, int noti_count); +void quickpanel_noti_section_remove(Evas_Object *noti_section) ; +void quickpanel_noti_section_set_deleted_cb(Evas_Object *noti_section, + Evas_Object_Event_Cb func, void *data); #endif
\ No newline at end of file diff --git a/daemon/notifications/noti_util.c b/daemon/notifications/noti_util.c index 0f97551..b9ed40e 100755 --- a/daemon/notifications/noti_util.c +++ b/daemon/notifications/noti_util.c @@ -1,32 +1,37 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 <unicode/uloc.h> #include <unicode/udat.h> #include <unicode/udatpg.h> #include <unicode/ustring.h> #include <runtime_info.h> - +#include <vconf.h> +#include <system_settings.h> #include "quickpanel-ui.h" #include "common.h" #include "noti_util.h" #define QP_NOTI_DAY_DEC (24 * 60 * 60) +#define QP_NOTI_TIME_LEN_LIMIT 12 -HAPI int quickpanel_noti_get_event_count_from_noti(notification_h noti) { +HAPI int quickpanel_noti_util_get_event_count_from_noti(notification_h noti) +{ char *text_count = NULL; retif(noti == NULL, 0, "Invalid parameter!"); @@ -38,7 +43,8 @@ HAPI int quickpanel_noti_get_event_count_from_noti(notification_h noti) { return 1; } -HAPI int quickpanel_noti_get_event_count_by_pkgname(const char *pkgname) { +HAPI int quickpanel_noti_util_get_event_count_by_pkgname(const char *pkgname) +{ int count = 0; notification_h noti = NULL; notification_list_h noti_list = NULL; @@ -49,7 +55,7 @@ HAPI int quickpanel_noti_get_event_count_by_pkgname(const char *pkgname) { if (noti_list != NULL) { noti = notification_list_get_data(noti_list); if (noti != NULL) { - count = quickpanel_noti_get_event_count_from_noti(noti); + count = quickpanel_noti_util_get_event_count_from_noti(noti); } notification_free_list(noti_list); return count; @@ -58,25 +64,88 @@ HAPI int quickpanel_noti_get_event_count_by_pkgname(const char *pkgname) { return 0; } -HAPI char *quickpanel_noti_get_time(time_t t, char *buf, int buf_len) +static char* _get_locale(void) { + char locale_tmp[32] = { 0, }; + char *locale = NULL; + int ret = 0; + +#ifdef HAVE_X + ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, &locale); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "ailed to set key(%s) : %d", SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, ret); +#endif + + if (locale == NULL) { + ERR("vconf_get_str() failed : region format"); + return strdup("en_US"); + } + + strncpy(locale_tmp, locale, sizeof(locale_tmp) - 1); + + // remove .UTF-8 + if (strlen(locale_tmp) > 0) { + char *p = strstr(locale_tmp, ".UTF-8"); + if (p) { + *p = 0; + } + } + + free(locale); + + if (strlen(locale_tmp) > 0) { + return strdup(locale_tmp); + } + + return strdup("en_US"); +} + +static char* _get_timezone_from_vconf(void) +{ + char *szTimezone = NULL; + szTimezone = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID); + if (szTimezone == NULL) { + ERR("Cannot get time zone."); + return strdup("N/A"); + } + + return szTimezone; +} + +static char* _get_timezone(void) +{ + char buf[1024] = {0,}; + ssize_t len = readlink("/opt/etc/localtime", buf, sizeof(buf)-1); + + if (len != -1) { + buf[len] = '\0'; + } else { + ERR("failed to get a timezone information"); + return _get_timezone_from_vconf(); + } + + return strdup(buf + 20); +} + +HAPI char *quickpanel_noti_util_get_time(time_t t, char *buf, int buf_len) +{ + int ret = 0; UErrorCode status = U_ZERO_ERROR; - UDateTimePatternGenerator *generator; - UDateFormat *formatter; + UDate date; + UDateTimePatternGenerator *generator = NULL; + UDateFormat *formatter = NULL; + UChar utimezone_id[40] = {0,}; UChar skeleton[40] = { 0 }; UChar pattern[40] = { 0 }; UChar formatted[40] = { 0 }; int32_t patternCapacity, formattedCapacity; - int32_t skeletonLength, patternLength, formattedLength; - UDate date; - const char *locale; - const char customSkeleton[] = UDAT_YEAR_NUM_MONTH_DAY; + int32_t skeletonLength, patternLength; + time_t today; + struct tm loc_time; + char *timezone = NULL; + char *locale = NULL; char bf1[32] = { 0, }; bool is_24hour_enabled = FALSE; - - struct tm loc_time; - time_t today, yesterday; - int ret = 0; + int is_show_time = 0; today = time(NULL); localtime_r(&today, &loc_time); @@ -86,84 +155,135 @@ HAPI char *quickpanel_noti_get_time(time_t t, char *buf, int buf_len) loc_time.tm_hour = 0; today = mktime(&loc_time); - yesterday = today - QP_NOTI_DAY_DEC; - localtime_r(&t, &loc_time); - if (t >= yesterday && t < today) { - ret = snprintf(buf, buf_len, _S("IDS_COM_BODY_YESTERDAY")); - } else if (t < yesterday) { - /* set UDate from time_t */ - date = (UDate) t * 1000; + if (buf == NULL) { + return NULL; + } - /* get default locale */ - /* for thread saftey */ - uloc_setDefault(secure_getenv("LC_TIME"), &status); - locale = uloc_getDefault(); + if (t < today) { + /* ascii to unicode for input skeleton */ + u_uastrcpy(skeleton, UDAT_ABBR_MONTH_DAY); + skeletonLength = strlen(UDAT_ABBR_MONTH_DAY); + is_show_time = 0; + } else { +#ifdef HAVE_X + ret = system_settings_get_value_bool(SYSTEM_SETTINGS_KEY_LOCALE_TIMEFORMAT_24HOUR, &is_24hour_enabled); +#endif + if (ret == SYSTEM_SETTINGS_ERROR_NONE && is_24hour_enabled == true) { + /* ascii to unicode for input skeleton */ + u_uastrcpy(skeleton, "HHmm"); + skeletonLength = strlen("HHmm"); + } else { + /* ascii to unicode for input skeleton */ + u_uastrcpy(skeleton, "hhmm"); + skeletonLength = strlen("hhmm"); + } + is_show_time = 1; + } - /* open datetime pattern generator */ - generator = udatpg_open(locale, &status); - if (generator == NULL) - return NULL; + /* set UDate from time_t */ + date = (UDate)t * 1000; - /* calculate pattern string capacity */ - patternCapacity = - (int32_t) (sizeof(pattern) / sizeof((pattern)[0])); + patternCapacity = + (int32_t) (sizeof(pattern) / sizeof((pattern)[0])); - /* ascii to unicode for input skeleton */ - u_uastrcpy(skeleton, customSkeleton); + timezone = _get_timezone(); + locale = _get_locale(); - /* get skeleton length */ - skeletonLength = strlen(customSkeleton); + if (u_uastrncpy(utimezone_id, timezone, 40) == NULL) { + ERR("u_uastrncpy() error."); + ret = 0; + goto err; + } - /* get best pattern using skeleton */ - patternLength = - udatpg_getBestPattern(generator, skeleton, skeletonLength, - pattern, patternCapacity, &status); + ucal_setDefaultTimeZone(utimezone_id , &status); + if (U_FAILURE(status)) { + ERR("ucal_setDefaultTimeZone() is failed."); + ret = 0; + goto err; + } - /* open datetime formatter using best pattern */ - formatter = - udat_open(UDAT_IGNORE, UDAT_DEFAULT, locale, NULL, -1, - pattern, patternLength, &status); - if (formatter == NULL) { - udatpg_close(generator); - return NULL; - } +#ifdef HAVE___SECURE_GETENV + uloc_setDefault(__secure_getenv("LC_TIME"), &status); +#elif defined HAVE_SECURE_GETENV + uloc_setDefault(secure_getenv("LC_TIME"), &status); +#else + uloc_setDefault(getenv("LC_TIME"), &status); +#endif + if (U_FAILURE(status)) { + ERR("uloc_setDefault() is failed."); + ret = 0; + goto err; + } - /* calculate formatted string capacity */ - formattedCapacity = - (int32_t) (sizeof(formatted) / sizeof((formatted)[0])); + /* open datetime pattern generator */ + generator = udatpg_open(locale, &status); + if (generator == NULL) { + ret = 0; + goto err; + } - /* formatting date using formatter by best pattern */ - formattedLength = - udat_format(formatter, date, formatted, formattedCapacity, - NULL, &status); + /* get best pattern using skeleton */ + patternLength = + udatpg_getBestPattern(generator, skeleton, skeletonLength, + pattern, patternCapacity, &status); + + /* open datetime formatter using best pattern */ + formatter = + udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, + pattern, patternLength, &status); + if (formatter == NULL) { + ret = 0; + goto err; + } - /* unicode to ascii to display */ - u_austrcpy(bf1, formatted); + /* calculate formatted string capacity */ + formattedCapacity = + (int32_t) (sizeof(formatted) / sizeof((formatted)[0])); - /* close datetime pattern generator */ - udatpg_close(generator); + /* formatting date using formatter by best pattern */ + udat_format(formatter, date, formatted, formattedCapacity, + NULL, &status); - /* close datetime formatter */ - udat_close(formatter); + /* unicode to ascii to display */ + u_austrcpy(bf1, formatted); + ret = snprintf(buf, buf_len, "%s", bf1); - ret = snprintf(buf, buf_len, "%s", bf1); - } else { - ret = runtime_info_get_value_bool( - RUNTIME_INFO_KEY_24HOUR_CLOCK_FORMAT_ENABLED, &is_24hour_enabled); - if (ret == RUNTIME_INFO_ERROR_NONE && is_24hour_enabled == TRUE) { + if (is_show_time == 1 && strlen(buf) > QP_NOTI_TIME_LEN_LIMIT) { + if (is_24hour_enabled == TRUE) { ret = strftime(buf, buf_len, "%H:%M", &loc_time); } else { strftime(bf1, sizeof(bf1), "%l:%M", &loc_time); - if (loc_time.tm_hour >= 0 && loc_time.tm_hour < 12) + if (loc_time.tm_hour >= 0 && loc_time.tm_hour < 12) { ret = snprintf(buf, buf_len, "%s%s", bf1, "AM"); - else + } else { ret = snprintf(buf, buf_len, "%s%s", bf1, "PM"); + } } - } + err: + if (timezone) { + free(timezone); + timezone = NULL; + } + + if (locale) { + free(locale); + locale = NULL; + } + + if (generator) { + udatpg_close(generator); + generator = NULL; + } + + if (formatter) { + udat_close(formatter); + formatter = NULL; + } + return ret <= 0 ? NULL : buf; } diff --git a/daemon/notifications/noti_util.h b/daemon/notifications/noti_util.h index e12003d..5aca4f9 100755 --- a/daemon/notifications/noti_util.h +++ b/daemon/notifications/noti_util.h @@ -1,26 +1,28 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT 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 _QP_NOTI_UTIL_DEF_ #define _QP_NOTI_UTIL_DEF_ #include <notification.h> -HAPI int quickpanel_noti_get_event_count_from_noti(notification_h noti); -int quickpanel_noti_get_event_count_by_pkgname(const char *pkgname); -char *quickpanel_noti_get_time(time_t t, char *buf, int buf_len); +HAPI int quickpanel_noti_util_get_event_count_from_noti(notification_h noti); +int quickpanel_noti_util_get_event_count_by_pkgname(const char *pkgname); +char *quickpanel_noti_util_get_time(time_t t, char *buf, int buf_len); #endif diff --git a/daemon/notifications/noti_view.c b/daemon/notifications/noti_view.c new file mode 100644 index 0000000..b62366e --- /dev/null +++ b/daemon/notifications/noti_view.c @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <string.h> +#include <notification.h> + +#include "quickpanel-ui.h" +#include "common.h" +#include "list_util.h" +#include "quickpanel_def.h" +#include "noti_list_item.h" +#include "noti_node.h" +#include "noti.h" +#include "noti_util.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif +#ifdef QP_ANIMATED_IMAGE_ENABLE +#include "animated_image.h" +#endif +#include "animated_icon.h" +#include "noti_list_item.h" + +#define NOTI_LAYOUT_LISTTYPE 0 +#define NOTI_LAYOUT_BOXTYPE 1 + +#define E_DATA_VIEW_HANDLER_KEY "view_handler_cache" + +extern Noti_View_H noti_view_listtype_h; +extern Noti_View_H noti_view_boxtype_h; + +static struct _info { + Noti_View_H *view_handlers[NOTI_LAYOUT_BOXTYPE + 1]; +} s_info = { + .view_handlers = { + ¬i_view_listtype_h, + ¬i_view_boxtype_h, + }, +}; + +#ifdef BOX_TYPE_SUPPORTED +static int _is_image_exist(notification_h noti, notification_image_type_e image_type) +{ + char *image = NULL; + + notification_get_image(noti, image_type, &image); + + if (image == NULL) { + return 0; + } + + if (strncasecmp(image, "(null)", strlen(image)) == 0) { + return 0; + } + + return 1; +} + +static int _is_text_exist(notification_h noti, notification_text_type_e text_type) +{ + char *text = NULL; + + notification_get_text(noti, text_type, &text); + + if (text == NULL) { + return 0; + } + + return 1; +} +#endif + +static void _view_handler_set(Evas_Object *item, Noti_View_H *handler) +{ + retif(item == NULL, , "Invalid parameter!"); + retif(handler == NULL, , "Invalid parameter!"); + + evas_object_data_set(item, E_DATA_VIEW_HANDLER_KEY, handler); +} + +static Noti_View_H *_view_handler_cached_get(Evas_Object *item) +{ + retif(item == NULL, NULL, "Invalid parameter!"); + + return (Noti_View_H *)evas_object_data_get(item, E_DATA_VIEW_HANDLER_KEY); +} + +static Noti_View_H *_view_handler_get_by_contents(notification_h noti) +{ +#ifdef BOX_TYPE_SUPPORTED // Box type is not supported in Kiran + int ret = 0; + + ret += _is_text_exist(noti, NOTIFICATION_TEXT_TYPE_INFO_1); + ret += _is_text_exist(noti, NOTIFICATION_TEXT_TYPE_INFO_2); + ret += _is_image_exist(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND); + + if (ret > 0) { + return s_info.view_handlers[NOTI_LAYOUT_BOXTYPE]; + } +#endif + return s_info.view_handlers[NOTI_LAYOUT_LISTTYPE]; +} + +static void _view_handler_del(Evas_Object *item) +{ + retif(item == NULL, , "Invalid parameter!"); + + evas_object_data_del(item, E_DATA_VIEW_HANDLER_KEY); +} + +static Evas_Object *_create(notification_h noti, Evas_Object *parent) +{ + Evas_Object *view = NULL; + Noti_View_H *view_handler = NULL; + retif(parent == NULL, NULL, "Invalid parameter!"); + retif(noti == NULL, NULL, "Invalid parameter!"); + + view_handler = _view_handler_get_by_contents(noti); + if (view_handler != NULL && view_handler->create != NULL) { + view = view_handler->create(noti, parent); + if (view == NULL) { + ERR("failed to create notification view(%s)", view_handler->name); + } else { + _view_handler_set(view, view_handler); + } + } else { + ERR("create handler isn't supported"); + } + + return view; +} + +static void _update(noti_node_item *noti_node, notification_ly_type_e layout, Evas_Object *item) +{ + Noti_View_H *view_handler = NULL; + retif(item == NULL, , "Invalid parameter!"); + retif(noti_node == NULL, , "Invalid parameter!"); + retif(noti_node->noti == NULL, , "Invalid parameter!"); + + view_handler = _view_handler_get_by_contents(noti_node->noti); + if (view_handler != NULL && view_handler->update != NULL) { + _view_handler_set(item, view_handler); + view_handler->update(noti_node, layout, item); + } else { + ERR("update handler isn't supported"); + } +} + +static void _remove(noti_node_item *noti_node, notification_ly_type_e layout, Evas_Object *item) +{ + Noti_View_H *view_handler = NULL; + retif(item == NULL, , "Invalid parameter!"); + retif(noti_node == NULL, , "Invalid parameter!"); + retif(noti_node->noti == NULL, , "Invalid parameter!"); + + view_handler = _view_handler_cached_get(item); + if (view_handler != NULL && view_handler->remove != NULL) { + _view_handler_del(item); + view_handler->remove(noti_node, layout, item); + } else { + ERR("remove handler isn't supported"); + } +} + +HAPI int quickpanel_noti_view_is_view_handler_changed(Evas_Object *item, notification_h noti) +{ + Noti_View_H *view_handler_old = NULL; + Noti_View_H *view_handler_new = NULL; + + view_handler_old = _view_handler_cached_get(item); + view_handler_new = _view_handler_get_by_contents(noti); + + if (view_handler_old != view_handler_new) { + return 1; + } + + return 0; +} + +Noti_View_H noti_view_h = { + .name = "noti_view", + + .create = _create, + .update = _update, + .remove = _remove, +}; diff --git a/daemon/notifications/noti_view.h b/daemon/notifications/noti_view.h new file mode 100644 index 0000000..2e6b07c --- /dev/null +++ b/daemon/notifications/noti_view.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef _QP_NOTI_VIEW_H_ +#define _QP_NOTI_VIEW_H_ + +#include <notification.h> + +int quickpanel_noti_view_is_view_handler_changed(Evas_Object *item, notification_h noti); + +#endif diff --git a/daemon/notifications/noti_view_boxtype.c b/daemon/notifications/noti_view_boxtype.c new file mode 100644 index 0000000..f4c8de5 --- /dev/null +++ b/daemon/notifications/noti_view_boxtype.c @@ -0,0 +1,1016 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <string.h> +#include <notification.h> + +#include "quickpanel-ui.h" +#include "common.h" +#include "list_util.h" +#include "quickpanel_def.h" +#include "noti_box.h" +#include "noti_node.h" +#include "noti.h" +#include "noti_util.h" +#include "noti_list_item.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif +#ifdef QP_ANIMATED_IMAGE_ENABLE +#include "animated_image.h" +#endif +#include "animated_icon.h" + +#define IMAGE_NO_RESIZE 0 +#define IMAGE_RESIZE 1 + +#define IMAGE_BY_FILE 0 +#define IMAGE_BY_BUFFER 1 + +#define TEXT_NO_CR 0 +#define TEXT_CR 1 + +#define THRESHOLD_DRAGGING_TIME_LIMIT 1.0 +#define LIMIT_ZOOM_RATIO 0.55 +#define LIMIT_FADEOUT_RATIO 0.1 +#define THRESHOLD_DELETE_START 80 +#define THRESHOLD_DELETE_START_Y_LIMIT 60 +#define THRESHOLD_DISTANCE ((BOX_WIDTH_P >> 1)) + +static Evas_Object *_check_duplicated_image_loading(Evas_Object *obj, const char *part, const char *file_path) +{ + Evas_Object *old_ic = NULL; + const char *old_ic_path = NULL; + + retif(obj == NULL, NULL, "Invalid parameter!"); + retif(part == NULL, NULL, "Invalid parameter!"); + retif(file_path == NULL, NULL, "Invalid parameter!"); + + old_ic = elm_object_part_content_get(obj, part); + + if (quickpanel_animated_icon_is_same_icon(old_ic, file_path) == 1) { + return old_ic; + } + + if (old_ic != NULL) { + elm_image_file_get(old_ic, &old_ic_path, NULL); + if (old_ic_path != NULL) { + if (strcmp(old_ic_path, file_path) == 0) { + return old_ic; + } + } + + elm_object_part_content_unset(obj, part); + evas_object_del(old_ic); + old_ic = NULL; + } + + return NULL; +} + +static void _attach_memfile(Evas_Object *noti_box, notification_image_type_e image_type, void *memfile) +{ + char buf[32] = {0,}; + + snprintf(buf, sizeof(buf), "%s_%d", E_DATA_NOTI_BOX_MB_BG, image_type); + + void *memfile_attached = evas_object_data_get(noti_box, buf); + if (memfile_attached != NULL) { + free(memfile_attached); + } + evas_object_data_set(noti_box, buf, memfile); +} + +static void _deattach_memfile_all(Evas_Object *noti_box) +{ + char buf[32] = {0,}; + void *memfile = NULL; + int i = NOTIFICATION_TEXT_TYPE_NONE + 1; + + for ( ; i < NOTIFICATION_TEXT_TYPE_MAX; i++) { + snprintf(buf, sizeof(buf), "%s_%d", E_DATA_NOTI_BOX_MB_BG, i); + + memfile = evas_object_data_get(noti_box, buf); + if (memfile != NULL) { + free(memfile); + } + evas_object_data_set(noti_box, buf, NULL); + evas_object_data_del(noti_box, buf); + } +} + +static void _text_clean_all(Evas_Object *noti_box) +{ + int i = 0; + const char *text_parts[] = { + "object.text.title", + "object.text.contents", + "object.text.contents.multiline.short", + "object.text.contents.multiline", + "object.text.count", + "object.text.time", + "object.text.info.1", + "object.text.info.1.short", + "object.text.info.1.multiline", + "object.text.info.sub.1", + "object.text.info.2", + "object.text.info.2.short", + "object.text.info.sub.2", + NULL + }; + + for (i = 0; text_parts[i] != NULL; i++) { + elm_object_part_text_set(noti_box, text_parts[i], ""); + elm_object_part_text_set(noti_box, text_parts[i], NULL); + } +} + +#ifdef QP_SCREENREADER_ENABLE +static inline void _check_and_add_to_buffer(notification_h noti, + notification_text_type_e text_type, Eina_Strbuf *str_buf) +{ + char buf[256] = { 0, }; + char buf_number[QP_UTIL_PHONE_NUMBER_MAX_LEN * 2] = { 0, }; + + char *text = NULL; + time_t time = 0; + + if (notification_get_time_from_text(noti, text_type, &time) == NOTIFICATION_ERROR_NONE) { + if ((int)time > 0) { + quickpanel_noti_util_get_time(time, buf, sizeof(buf)); + text = buf; + } + } else { + notification_get_text(noti, text_type, &text); + } + + if (text != NULL) { + if (strlen(text) > 0) { + if (quickpanel_common_util_is_phone_number(text)) { + quickpanel_common_util_phone_number_tts_make(buf_number, text, + (QP_UTIL_PHONE_NUMBER_MAX_LEN * 2) - 1); + DBG("[%s]", buf_number); + eina_strbuf_append(str_buf, buf_number); + } else { + eina_strbuf_append(str_buf, text); + } + eina_strbuf_append_char(str_buf, '\n'); + } + } +} + +static void _noti_box_set_rs_layout_single(Evas_Object *noti_box, + notification_h noti) +{ + Evas_Object *ao = NULL; + Eina_Strbuf *str_buf = NULL; + char *dir = NULL; + char *domain = NULL; + + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + str_buf = eina_strbuf_new(); + retif(str_buf == NULL, , "invalid parameter"); + + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_TITLE, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_CONTENT, str_buf); + + time_t noti_time = 0.0; + char buf[512] = {0,}; + notification_get_time(noti, ¬i_time); + if (noti_time == 0.0) { + notification_get_insert_time(noti, ¬i_time); + } + quickpanel_noti_util_get_time(noti_time, buf, 512); + eina_strbuf_append(str_buf, buf); + eina_strbuf_append_char(str_buf, '\n'); + + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_1, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_2, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2, str_buf); + + if (str_buf != NULL) { + ao = quickpanel_accessibility_screen_reader_object_get(noti_box, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", noti_box); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _("IDS_QP_BUTTON_NOTIFICATION")); + elm_access_info_set(ao, ELM_ACCESS_INFO, eina_strbuf_string_get(str_buf)); + } + + eina_strbuf_free(str_buf); + } +} + +static void _noti_box_set_rs_layout_multi(Evas_Object *noti_box, + notification_h noti) +{ + DBG(""); + + Evas_Object *ao = NULL; + Eina_Strbuf *str_buf = NULL; + char *dir = NULL; + char *domain = NULL; + + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + str_buf = eina_strbuf_new(); + retif(str_buf == NULL, , "invalid parameter"); + + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_TITLE, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_CONTENT, str_buf); + + time_t noti_time = 0.0; + char buf[512] = {0,}; + notification_get_time(noti, ¬i_time); + if (noti_time == 0.0) { + notification_get_insert_time(noti, ¬i_time); + } + quickpanel_noti_util_get_time(noti_time, buf, 512); + eina_strbuf_append(str_buf, buf); + eina_strbuf_append_char(str_buf, '\n'); + + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_1, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_2, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2, str_buf); + + if (str_buf != NULL) { + ao = quickpanel_accessibility_screen_reader_object_get(noti_box, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", noti_box); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _("IDS_QP_BUTTON_NOTIFICATION")); + elm_access_info_set(ao, ELM_ACCESS_INFO, eina_strbuf_string_get(str_buf)); + } + + eina_strbuf_free(str_buf); + } +} + +static void _noti_box_set_rs_layout_thumbnail(Evas_Object *noti_box, + notification_h noti) +{ + DBG(""); + + Evas_Object *ao = NULL; + Eina_Strbuf *str_buf = NULL; + char *dir = NULL; + char *domain = NULL; + + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + str_buf = eina_strbuf_new(); + retif(str_buf == NULL, , "invalid parameter"); + + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_TITLE, str_buf); + _check_and_add_to_buffer(noti, NOTIFICATION_TEXT_TYPE_CONTENT, str_buf); + + time_t noti_time = 0.0; + char buf[512] = {0,}; + notification_get_time(noti, ¬i_time); + if (noti_time == 0.0) { + notification_get_insert_time(noti, ¬i_time); + } + quickpanel_noti_util_get_time(noti_time, buf, 512); + eina_strbuf_append(str_buf, buf); + eina_strbuf_append_char(str_buf, '\n'); + + if (str_buf != NULL) { + DBG("access:%s", eina_strbuf_string_get(str_buf)); + + ao = quickpanel_accessibility_screen_reader_object_get(noti_box, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", noti_box); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _("IDS_QP_BUTTON_NOTIFICATION")); + elm_access_info_set(ao, ELM_ACCESS_INFO, eina_strbuf_string_get(str_buf)); + } + + eina_strbuf_free(str_buf); + } +} +#endif + +static Evas_Object *_set_image(Evas_Object *noti_box, notification_h noti, char *image_path, + notification_image_type_e image_type, const char *part, int is_stretch, int is_use_buffer) +{ + Evas_Object *content = NULL; + char *image = NULL; + char ext[32] = {0,}; + void *memfile = NULL; + size_t memfile_size = 0; + retif(part == NULL, NULL,"invalid parameter"); + + notification_get_image(noti, image_type, &image); + if (image == NULL && image_path != NULL) { + image = image_path; + } + + if (image != NULL) { + if (is_use_buffer == IMAGE_BY_BUFFER) { + content = quickpanel_animated_icon_get(noti_box, image); + if (content == NULL) { + content = elm_image_add(noti_box); + + memfile = quickpanel_common_ui_get_buffer_from_image(image, &memfile_size, ext, sizeof(ext)); + if (memfile != NULL && memfile_size > 0) { + _attach_memfile(noti_box, image_type, memfile); + if (elm_image_memfile_set(content, memfile, memfile_size, ext, + quickpanel_animated_image_get_groupname(image)) == EINA_FALSE) { + ERR("failed to set memfile set"); + elm_image_file_set(content, image, + quickpanel_animated_image_get_groupname(image)); + } + } else { + if (memfile) { + free(memfile); // due to prevent + } + elm_image_file_set(content, image, + quickpanel_animated_image_get_groupname(image)); + } + } + } else { + content = _check_duplicated_image_loading(noti_box, part, image); + if (content == NULL) { + content = quickpanel_animated_icon_get(noti_box, image); + if (content == NULL) { + content = elm_image_add(noti_box); + + elm_image_file_set(content, image, + quickpanel_animated_image_get_groupname(image)); + } + } else { + return content; + } + } + if (is_stretch == IMAGE_RESIZE) { + elm_image_aspect_fixed_set(content, EINA_FALSE); + elm_image_resizable_set(content, EINA_TRUE, EINA_TRUE); + } else { + if (strcmp(part, BOX_PART_ICON) == 0 || strcmp(part, BOX_PART_ICON_SUB) == 0) { + elm_image_resizable_set(content, EINA_FALSE, EINA_TRUE); + } else { + elm_image_aspect_fixed_set(content, EINA_TRUE); + elm_image_fill_outside_set(content, EINA_TRUE); + } + } + + elm_object_part_content_set(noti_box, part, content); + elm_object_signal_emit(noti_box, "object.show", part); + } + + return content; +} + +static int _set_text(Evas_Object *noti_box, notification_h noti, + notification_text_type_e text_type, const char *part, char *str, int is_need_effect, int is_support_cr) +{ + char buf[128] = { 0, }; + + char *text = NULL; + char *text_utf8 = NULL; + time_t time = 0; + + if (str != NULL) { + text = str; + } else if (notification_get_time_from_text(noti, text_type, &time) == NOTIFICATION_ERROR_NONE) { + if ((int)time > 0) { + quickpanel_noti_util_get_time(time, buf, sizeof(buf)); + text = buf; + } + } else { + notification_get_text(noti, text_type, &text); + } + + if (text != NULL) { + if (strlen(text) > 0) { + + if (is_support_cr == TEXT_CR) { + text_utf8 = elm_entry_utf8_to_markup(text); + if (text_utf8 != NULL) { + elm_object_part_text_set(noti_box, part, text_utf8); + free(text_utf8); + } else { + elm_object_part_text_set(noti_box, part, text); + } + } else { + quickpanel_common_util_char_replace(text, _NEWLINE, _SPACE); + elm_object_part_text_set(noti_box, part, text); + } + + if (is_need_effect == 1) { + elm_object_signal_emit(noti_box, "object.show.effect", part); + } else { + elm_object_signal_emit(noti_box, "object.show", part); + } + } + + return strlen(text); + } + + return 0; +} + +static int _check_text_null(notification_h noti, + notification_text_type_e text_type) +{ + char *text = NULL; + + notification_get_text(noti, text_type, &text); + + if (text == NULL) { + return 1; + } + + return 0; +} + +static int _check_image_null(notification_h noti, + notification_image_type_e image_type) +{ + char *image = NULL; + + notification_get_image(noti, image_type, &image); + + if (image == NULL) { + return 1; + } + + if (strncasecmp(image, "(null)", strlen(image)) == 0) { + return 1; + } + + return 0; +} + +static void _noti_box_set_layout_single(Evas_Object *noti_box, + notification_h noti) +{ + char *dir = NULL; + char *domain = NULL; + char *pkgname = NULL; + char *icon_path = NULL; + int is_need_effect = 0; + int is_contents_only = 0; + int is_sub_info_1_only = 0; + int is_contents_and_sub_info_2 = 0; + Evas_Object *icon = NULL; + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { + is_need_effect = 1; + } + + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) == 1) { + is_contents_only = 1; + } + + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) != 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) == 1) { + is_sub_info_1_only = 1; + } + + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 + && (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) != 1 + || _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) != 1)) { + is_contents_and_sub_info_2 = 1; + } + + DBG("is_contents_only:%d is_sub_info_1_only:%d", is_contents_only, is_sub_info_1_only); + + notification_get_pkgname(noti, &pkgname); + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_TITLE, + "object.text.title", NULL, is_need_effect, TEXT_CR); + + if (is_contents_only == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_CR); + } else { + if (is_contents_and_sub_info_2 == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_NO_CR); + } else { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_NO_CR); + } + + if (is_sub_info_1_only == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1.multiline", NULL, is_need_effect, TEXT_CR); + } else { + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 0) { + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1", NULL, is_need_effect, TEXT_NO_CR); + } else { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1.short", NULL, is_need_effect, TEXT_NO_CR); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, + "object.text.info.sub.1", NULL, is_need_effect, TEXT_NO_CR); + } + } + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_2, + "object.text.info.2", NULL, is_need_effect, TEXT_NO_CR); + } + } + + time_t noti_time = 0.0; + char buf[512] = {0,}; + notification_get_time(noti, ¬i_time); + if (noti_time == 0.0) { + notification_get_insert_time(noti, ¬i_time); + } + quickpanel_noti_util_get_time(noti_time, buf, 512); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_NONE, + "object.text.time", buf, is_need_effect, TEXT_NO_CR); + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(icon); +#endif + } else { + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(icon); +#endif + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON_SUB, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + } + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_BACKGROUND, + "object.icon.background", IMAGE_NO_RESIZE, IMAGE_BY_BUFFER); + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { + + icon_path = quickpanel_common_ui_get_pkginfo_icon(pkgname); + if (icon_path != NULL) { + _set_image(noti_box, NULL, + icon_path, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + free(icon_path); + } + } else { + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { + elm_object_signal_emit(noti_box, "box.show.dim", "box.prog"); + } + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { + elm_object_signal_emit(noti_box, "box.hide.icon.bg", "box.prog"); + elm_object_signal_emit(noti_box, "box.title.without.icon", "box.prog"); + } + if (((_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 0 + || _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 0)) { + elm_object_signal_emit(noti_box, "box.show.sub.bg", "box.prog"); + } + } + +#ifdef QP_SCREENREADER_ENABLE + _noti_box_set_rs_layout_single(noti_box, noti); +#endif +} + +static void _noti_box_set_layout_multi(Evas_Object *noti_box, + notification_h noti) +{ + char *pkgname = NULL; + char *icon_path = NULL; + char *dir = NULL; + char *domain = NULL; + int is_need_effect = 0; + int is_contents_only = 0; + int is_sub_info_1_only = 0; + int is_contents_and_sub_info_2 = 0; + Evas_Object *icon = NULL; + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { + is_need_effect = 1; + } + + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) == 1) { + is_contents_only = 1; + } + + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) != 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) == 1) { + is_sub_info_1_only = 1; + } + + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1 + && (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) != 1 + || _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) != 1)) { + is_contents_and_sub_info_2 = 1; + } + + DBG("is_sub_info_1_only:%d", is_sub_info_1_only); + + notification_get_pkgname(noti, &pkgname); + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_TITLE, + "object.text.title", NULL, is_need_effect, TEXT_CR); + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT) == 0) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, "object.text.count", NULL, + is_need_effect, TEXT_NO_CR); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, "object.text.contents", NULL, + is_need_effect, TEXT_NO_CR); + } else { + if (is_contents_only == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_CR); + } else if (is_contents_and_sub_info_2 == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_NO_CR); + } else { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_NO_CR); + } + } + + time_t noti_time = 0.0; + char buf[512] = {0,}; + + notification_get_time(noti, ¬i_time); + if (noti_time == 0.0) { + notification_get_insert_time(noti, ¬i_time); + } + quickpanel_noti_util_get_time(noti_time, buf, 512); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_NONE, + "object.text.time", buf, is_need_effect, TEXT_NO_CR); + + if (is_sub_info_1_only == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1.multiline", NULL, is_need_effect, TEXT_CR); + } else { + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 0) { + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1) == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1", NULL, is_need_effect, TEXT_NO_CR); + } else { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1.short", NULL, is_need_effect, TEXT_NO_CR); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1, + "object.text.info.sub.1", NULL, is_need_effect, TEXT_NO_CR); + } + } + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 0) { + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2) == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_2, + "object.text.info.2", NULL, is_need_effect, TEXT_NO_CR); + } else { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_2, + "object.text.info.2.short", NULL, is_need_effect, TEXT_NO_CR); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_2, + "object.text.info.sub.2", NULL, is_need_effect, TEXT_NO_CR); + } + } + } + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(icon); +#endif + } else { + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(icon); +#endif + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON_SUB, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + } + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_BACKGROUND, + "object.icon.background", IMAGE_NO_RESIZE, IMAGE_BY_BUFFER); + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { + + icon_path = quickpanel_common_ui_get_pkginfo_icon(pkgname); + if (icon_path != NULL) { + _set_image(noti_box, NULL, + icon_path, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + free(icon_path); + } + } else { + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { + elm_object_signal_emit(noti_box, "box.show.dim", "box.prog"); + } + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { + elm_object_signal_emit(noti_box, "box.hide.icon.bg", "box.prog"); + elm_object_signal_emit(noti_box, "box.title.without.icon", "box.prog"); + } + if (((_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 0 + || _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 0)) { + elm_object_signal_emit(noti_box, "box.show.sub.bg", "box.prog"); + } + } + +#ifdef QP_SCREENREADER_ENABLE + _noti_box_set_rs_layout_multi(noti_box, noti); +#endif +} + +static void _noti_box_set_layout_thumbnail(Evas_Object *noti_box, + notification_h noti) +{ + char *pkgname = NULL; + char *icon_path = NULL; + char *dir = NULL; + char *domain = NULL; + int is_need_effect = 0; + int is_sub_info_1_only = 0; + int is_show_info = 0; + Evas_Object *icon = NULL; + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { + is_need_effect = 1; + } else { + is_need_effect = 0; + } + + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) != 1 + && _check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 1) { + is_sub_info_1_only = 1; + } + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_1)!= 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_2) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_3) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_4) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_LIST_5) == 1) { + is_show_info = 1; + } + + notification_get_pkgname(noti, &pkgname); + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_TITLE, + "object.text.title", NULL, is_need_effect, TEXT_CR); + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT) == 0) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, "object.text.count", NULL, + is_need_effect, TEXT_NO_CR); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, "object.text.contents", NULL, + is_need_effect, TEXT_NO_CR); + } else { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_CONTENT, + "object.text.contents", NULL, is_need_effect, TEXT_NO_CR); + } + + time_t noti_time = 0.0; + char buf[512] = {0,}; + notification_get_time(noti, ¬i_time); + if (noti_time == 0.0) { + notification_get_insert_time(noti, ¬i_time); + } + quickpanel_noti_util_get_time(noti_time, buf, 512); + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_NONE, + "object.text.time", buf, is_need_effect, TEXT_NO_CR); + + if (is_show_info == 1) { + if (is_sub_info_1_only == 1) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1.multiline", NULL, is_need_effect, TEXT_CR); + } else { + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_1) == 0) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_1, + "object.text.info.1", NULL, is_need_effect, TEXT_NO_CR); + } + if (_check_text_null(noti, NOTIFICATION_TEXT_TYPE_INFO_2) == 0) { + _set_text(noti_box, noti, NOTIFICATION_TEXT_TYPE_INFO_2, + "object.text.info.2", NULL, is_need_effect, TEXT_NO_CR); + } + } + } + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(icon); +#endif + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) { + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + } + } else { + icon = _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(icon); +#endif + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 0) { + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_ICON_SUB, + "object.icon.sub", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + } + } + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_BACKGROUND, + "object.icon.background", IMAGE_NO_RESIZE, IMAGE_BY_BUFFER); + + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_1, + "object.thumbnail.list.1", IMAGE_RESIZE, IMAGE_BY_BUFFER); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_2, + "object.thumbnail.list.2", IMAGE_RESIZE, IMAGE_BY_BUFFER); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_3, + "object.thumbnail.list.3", IMAGE_RESIZE, IMAGE_BY_BUFFER); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_4, + "object.thumbnail.list.4", IMAGE_RESIZE, IMAGE_BY_BUFFER); + _set_image(noti_box, noti, NULL, NOTIFICATION_IMAGE_TYPE_LIST_5, + "object.thumbnail.list.5", IMAGE_RESIZE, IMAGE_BY_BUFFER); + + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { + + icon_path = quickpanel_common_ui_get_pkginfo_icon(pkgname); + if (icon_path != NULL) { + _set_image(noti_box, NULL, + icon_path, NOTIFICATION_IMAGE_TYPE_ICON, + "object.icon", IMAGE_NO_RESIZE, IMAGE_BY_FILE); + free(icon_path); + } + } else { + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_BACKGROUND) == 0) { + elm_object_signal_emit(noti_box, "box.show.dim", "box.prog"); + } + if (_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 1 + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 1) { + elm_object_signal_emit(noti_box, "box.hide.icon.bg", "box.prog"); + elm_object_signal_emit(noti_box, "box.title.without.icon", "box.prog"); + } + if (((_check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON) == 0 + || _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL) == 0) + && _check_image_null(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB) == 0)) { + elm_object_signal_emit(noti_box, "box.show.sub.bg", "box.prog"); + } + } + +#ifdef QP_SCREENREADER_ENABLE + _noti_box_set_rs_layout_thumbnail(noti_box, noti); +#endif +} + +static void _noti_box_set_layout(Evas_Object *noti_box, notification_h noti, + notification_ly_type_e layout) +{ + DBG("notification box layout:%d", layout); + + switch (layout) { + case NOTIFICATION_LY_NOTI_EVENT_SINGLE: + _noti_box_set_layout_single(noti_box, noti); + break; + case NOTIFICATION_LY_NOTI_EVENT_MULTIPLE: + _noti_box_set_layout_multi(noti_box, noti); + break; + case NOTIFICATION_LY_NOTI_THUMBNAIL: + _noti_box_set_layout_thumbnail(noti_box, noti); + break; + case NOTIFICATION_LY_NONE: + case NOTIFICATION_LY_ONGOING_EVENT: + case NOTIFICATION_LY_ONGOING_PROGRESS: + case NOTIFICATION_LY_MAX: + ERR("not supported layout type:%d", layout); + break; + } + + if (elm_object_part_text_get(noti_box, "object.text.count") != NULL) { + elm_object_signal_emit(noti_box, "title.short", "prog"); + } else { + elm_object_signal_emit(noti_box, "title.long", "prog"); + } +} + +static Evas_Object *_create(notification_h noti, Evas_Object *parent) +{ + Evas_Object *box = NULL; + retif(parent == NULL, NULL, "Invalid parameter!"); + retif(noti == NULL, NULL, "Invalid parameter!"); + + notification_ly_type_e layout = NOTIFICATION_LY_NOTI_EVENT_SINGLE; + notification_get_layout(noti, &layout); + + box = elm_layout_add(parent); + + if (layout == NOTIFICATION_LY_NOTI_EVENT_SINGLE + || layout == NOTIFICATION_LY_NOTI_EVENT_MULTIPLE) { + elm_layout_file_set(box, DEFAULT_EDJ, + "quickpanel/listitem_legacy/single_multi"); + } else if (layout == NOTIFICATION_LY_NOTI_THUMBNAIL) { + elm_layout_file_set(box, DEFAULT_EDJ, "quickpanel/listitem_legacy/thumbnail"); + } else { + elm_layout_file_set(box, DEFAULT_EDJ, + "quickpanel/listitem_legacy/single_multi"); + } + + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + quickpanel_uic_initial_resize(box, QP_THEME_LIST_ITEM_NOTIFICATION_LEGACY_SINGLE_MULTI_HEIGHT + + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT); + evas_object_show(box); + + Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(box); + elm_object_part_content_set(box, "focus", focus); + + return box; +} + +static void _update(noti_node_item *noti_node, notification_ly_type_e layout, Evas_Object *item) +{ + noti_node_item *noti_node_find = NULL; + retif(item == NULL, , "Invalid parameter!"); + retif(noti_node == NULL, , "Invalid parameter!"); + + noti_list_item_h *handler = quickpanel_noti_list_item_handler_get(item); + if (handler != NULL) { + noti_node_find = quickpanel_noti_node_get_by_priv_id(handler->priv_id); + + if (noti_node_find != NULL) { + notification_ly_type_e layout = NOTIFICATION_LY_NOTI_EVENT_SINGLE; + notification_get_layout(noti_node_find->noti, &layout); + + _deattach_memfile_all(item); + _text_clean_all(item); + + _noti_box_set_layout(item, noti_node_find->noti, layout); + } + } +} + +static void _remove(noti_node_item *node_item, notification_ly_type_e layout, Evas_Object *item) +{ + retif(item == NULL, , "Invalid parameter!"); + retif(node_item == NULL, , "Invalid parameter!"); + + _deattach_memfile_all(item); +} + +Noti_View_H noti_view_boxtype_h = { + .name = "noti_view_boxtype", + + .create = _create, + .update = _update, + .remove = _remove, +}; diff --git a/daemon/notifications/noti_view_listype.c b/daemon/notifications/noti_view_listype.c new file mode 100644 index 0000000..a9dac2f --- /dev/null +++ b/daemon/notifications/noti_view_listype.c @@ -0,0 +1,362 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <string.h> +#include <efl_assist.h> + +#include "quickpanel-ui.h" +#include "common.h" +#include "list_util.h" +#include "quickpanel_def.h" +#include "noti_list_item.h" +#include "noti_node.h" +#include "noti.h" +#include "noti_util.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif +#ifdef QP_ANIMATED_IMAGE_ENABLE +#include "animated_image.h" +#endif +#include "animated_icon.h" + +#define LEN_UNIT_TEXTBLOCK 560 +#define QP_DEFAULT_ICON RESDIR"/quickpanel_icon_default.png" + +#ifdef QP_SCREENREADER_ENABLE +static inline void _check_and_add_to_buffer(Eina_Strbuf *str_buf, const char *text) +{ + char buf_number[QP_UTIL_PHONE_NUMBER_MAX_LEN * 2] = { 0, }; + + retif(str_buf == NULL, , "Invalid parameter!"); + + if (text != NULL) { + if (strlen(text) > 0) { + if (quickpanel_common_util_is_phone_number(text)) { + quickpanel_common_util_phone_number_tts_make(buf_number, text, + (QP_UTIL_PHONE_NUMBER_MAX_LEN * 2) - 1); + eina_strbuf_append(str_buf, buf_number); + } else { + eina_strbuf_append(str_buf, text); + } + eina_strbuf_append_char(str_buf, '\n'); + } + } +} +#endif + +static Evas_Object *_check_duplicated_image_loading(Evas_Object *obj, const char *part, const char *file_path) +{ + Evas_Object *old_ic = NULL; + const char *old_ic_path = NULL; + + retif(obj == NULL, NULL, "Invalid parameter!"); + retif(part == NULL, NULL, "Invalid parameter!"); + retif(file_path == NULL, NULL, "Invalid parameter!"); + + old_ic = elm_object_part_content_get(obj, part); + + if (quickpanel_animated_icon_is_same_icon(old_ic, file_path) == 1) { + return old_ic; + } + + if (old_ic != NULL) { + elm_image_file_get(old_ic, &old_ic_path, NULL); + if (old_ic_path != NULL) { + if (strcmp(old_ic_path, file_path) == 0) + return old_ic; + } + + elm_object_part_content_unset(obj, part); + evas_object_del(old_ic); + old_ic = NULL; + } + + return NULL; +} + +static void _set_text_to_part(Evas_Object *obj, const char *part, const char *text) +{ + const char *old_text = NULL; + + retif(obj == NULL, , "Invalid parameter!"); + retif(part == NULL, , "Invalid parameter!"); + retif(text == NULL, , "Invalid parameter!"); + + old_text = elm_object_part_text_get(obj, part); + if (old_text != NULL) { + if (strcmp(old_text, text) == 0) { + return; + } + } + + elm_object_part_text_set(obj, part, text); +} + +static void _set_icon(Evas_Object *item, notification_h noti) +{ + Evas_Object *ic = NULL; + Evas_Object *old_ic = NULL; + char *icon_path = NULL; + char *icon_sub_path = NULL; + char *thumbnail_path = NULL; + char *main_icon_path = NULL; + char *sub_icon_path = NULL; + char *icon_default = NULL; + char *pkgname = NULL; + + retif(item == NULL, , "Invalid parameter!"); + retif(noti == NULL, , "noti is NULL"); + + notification_get_pkgname(noti, &pkgname); + notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, + &thumbnail_path); + notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_ICON, &icon_path); + notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB, &icon_sub_path); + + if (thumbnail_path != NULL && icon_path != NULL) { + main_icon_path = thumbnail_path; + sub_icon_path = icon_path; + } else if (icon_path != NULL && thumbnail_path == NULL) { + main_icon_path = icon_path; + sub_icon_path = icon_sub_path; + } else if (icon_path == NULL && thumbnail_path != NULL) { + main_icon_path = thumbnail_path; + sub_icon_path = icon_sub_path; + } else { + icon_default = quickpanel_common_ui_get_pkginfo_icon(pkgname); + main_icon_path = icon_default; + sub_icon_path = NULL; + } + + if (main_icon_path != NULL) { + old_ic = _check_duplicated_image_loading(item, + "elm.swallow.thumbnail", main_icon_path); + + if (old_ic == NULL) { + ic = quickpanel_animated_icon_get(item, main_icon_path); + if (ic == NULL) { + ic = elm_image_add(item); + elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE); + elm_image_file_set(ic, main_icon_path, quickpanel_animated_image_get_groupname(main_icon_path)); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(ic); +#endif + + if (!strncmp(main_icon_path, QP_PRELOAD_NOTI_ICON_PATH, strlen(QP_PRELOAD_NOTI_ICON_PATH))) { + DBG("Apply color theme [%s]", main_icon_path); + evas_object_color_set(ic, 0,0,0,255); + } + } + elm_object_part_content_set(item, "elm.swallow.thumbnail", ic); + } + } + + if (sub_icon_path != NULL) { + old_ic = _check_duplicated_image_loading(item, + "elm.swallow.icon", sub_icon_path); + + if (old_ic == NULL) { + ic = elm_image_add(item); + elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE); + elm_image_file_set(ic, sub_icon_path, quickpanel_animated_image_get_groupname(sub_icon_path)); + elm_object_part_content_set(item, "elm.swallow.icon", ic); + elm_object_signal_emit(item, "elm.icon.bg.show", "elm"); + } + } + + if (main_icon_path == NULL && sub_icon_path == NULL) { + old_ic = _check_duplicated_image_loading(item, + "elm.swallow.thumbnail", QP_DEFAULT_ICON); + + if (old_ic == NULL) { + ic = elm_image_add(item); + elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE); + elm_image_file_set(ic, QP_DEFAULT_ICON, quickpanel_animated_image_get_groupname(QP_DEFAULT_ICON)); + elm_object_part_content_set(item, "elm.swallow.thumbnail", ic); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(ic); +#endif + } + } + + if (icon_default != NULL) { + free(icon_default); + } +} + +static void _set_text(Evas_Object *item, notification_h noti) +{ + int noti_err = NOTIFICATION_ERROR_NONE; + char *text = NULL; + char *domain = NULL; + char *dir = NULL; + time_t noti_time; + char buf[512] = {0,}; +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = NULL; + Eina_Strbuf *str_buf = NULL; +#endif + struct appdata *ad = quickpanel_get_app_data(); + + retif(ad == NULL, , "Invalid parameter!"); + retif(item == NULL, , "Invalid parameter!"); + retif(noti == NULL, , "noti is NULL"); + + /* Set text domain */ + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) { + bindtextdomain(domain, dir); + } + +#ifdef QP_SCREENREADER_ENABLE + ao = quickpanel_accessibility_screen_reader_object_get(item, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", item); + if (ao != NULL) { + str_buf = eina_strbuf_new(); + elm_access_info_set(ao, ELM_ACCESS_TYPE, _("IDS_QP_BUTTON_NOTIFICATION")); + } +#endif + + /* Get pkgname & id */ + noti_err = notification_get_text(noti, + NOTIFICATION_TEXT_TYPE_TITLE, + &text); + + if (noti_err == NOTIFICATION_ERROR_NONE && text != NULL) { + quickpanel_common_util_char_replace(text, _NEWLINE, _SPACE); + _set_text_to_part(item, "elm.text.title", text); +#ifdef QP_SCREENREADER_ENABLE + _check_and_add_to_buffer(str_buf, text); +#endif + } + + noti_err = notification_get_text(noti, + NOTIFICATION_TEXT_TYPE_EVENT_COUNT, + &text); + if (noti_err == NOTIFICATION_ERROR_NONE && text != NULL) { + quickpanel_common_util_char_replace(text, _NEWLINE, _SPACE); + int count = atoi(text); + if (count > 999) { + _set_text_to_part(item, "elm.text.count", "999+"); + } else { + _set_text_to_part(item, "elm.text.count", text); + } +#ifdef QP_SCREENREADER_ENABLE + _check_and_add_to_buffer(str_buf, text); +#endif + } + + noti_err = notification_get_text(noti, + NOTIFICATION_TEXT_TYPE_CONTENT, + &text); + if (noti_err == NOTIFICATION_ERROR_NONE && text != NULL) { + quickpanel_common_util_char_replace(text, _NEWLINE, _SPACE); + _set_text_to_part(item, "elm.text.content", text); +#ifdef QP_SCREENREADER_ENABLE + _check_and_add_to_buffer(str_buf, text); +#endif + } + + noti_err = notification_get_time(noti, ¬i_time); + if (noti_time == 0.0) { + noti_err = notification_get_insert_time(noti, ¬i_time); + } + if (noti_err == NOTIFICATION_ERROR_NONE) { + quickpanel_noti_util_get_time(noti_time, buf, 512); + _set_text_to_part(item, "elm.text.time", buf); +#ifdef QP_SCREENREADER_ENABLE + _check_and_add_to_buffer(str_buf, buf); +#endif + } + + if (elm_object_part_text_get(item, "elm.text.count") != NULL) { + elm_object_signal_emit(item, "title.short", "prog"); + elm_object_signal_emit(item, "count.show", "prog"); + } + if (elm_object_part_text_get(item, "elm.text.time") != NULL) { + elm_object_signal_emit(item, "content.short", "prog"); + } + + const char *get_content = elm_object_part_text_get(item, "elm.text.content"); + if (get_content == NULL || strlen(get_content) == 0) { + // if there is no content, move title to vertical center. + elm_object_signal_emit(item, "title.move.center", "prog"); + if (elm_object_part_text_get(item, "elm.text.time") != NULL) { + elm_object_signal_emit(item, "title.short.center", "prog"); + } + } else { + elm_object_signal_emit(item, "title.move.default", "prog"); + if (elm_object_part_text_get(item, "elm.text.count") != NULL) { + elm_object_signal_emit(item, "title.short", "prog"); + } else { + elm_object_signal_emit(item, "title.text.default", "prog"); + } + } +#ifdef QP_SCREENREADER_ENABLE + if (ao != NULL && str_buf != NULL) { + elm_access_info_set(ao, ELM_ACCESS_INFO, eina_strbuf_string_get(str_buf)); + eina_strbuf_free(str_buf); + } +#endif +} + +static Evas_Object *_create(notification_h noti, Evas_Object *parent) +{ + int view_height = 0; + Evas_Object *view = NULL; + const char *view_layout_group = NULL; + retif(parent == NULL, NULL, "Invalid parameter!"); + retif(noti == NULL, NULL, "Invalid parameter!"); + + notification_ly_type_e layout = NOTIFICATION_LY_NOTI_EVENT_SINGLE; + notification_get_layout(noti, &layout); + + view_layout_group = "quickpanel/listitem/notification"; + view_height = QP_THEME_LIST_ITEM_NOTIFICATION_LISTTYPE_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT; + + view = elm_layout_add(parent); + if (view != NULL) { + elm_layout_file_set(view, DEFAULT_EDJ, view_layout_group); + evas_object_size_hint_weight_set(view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(view, EVAS_HINT_FILL, EVAS_HINT_FILL); + quickpanel_uic_initial_resize(view, view_height); + evas_object_show(view); + } else { + ERR("failed to create ongoing notification view"); + } + + return view; +} + +static void _update(noti_node_item *noti_node, notification_ly_type_e layout, Evas_Object *item) +{ + retif(item == NULL, , "Invalid parameter!"); + retif(noti_node == NULL, , "Invalid parameter!"); + + _set_icon(item, noti_node->noti); + _set_text(item, noti_node->noti); +} + +Noti_View_H noti_view_listtype_h = { + .name = "noti_view_listtype", + + .create = _create, + .update = _update, + .remove = NULL, +}; diff --git a/daemon/notifications/noti_view_ongoing.c b/daemon/notifications/noti_view_ongoing.c new file mode 100644 index 0000000..9b044e0 --- /dev/null +++ b/daemon/notifications/noti_view_ongoing.c @@ -0,0 +1,513 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <string.h> +#include <efl_assist.h> + +#include "quickpanel-ui.h" +#include "common.h" +#include "list_util.h" +#include "quickpanel_def.h" +#include "noti_list_item.h" +#include "noti_node.h" +#include "noti.h" +#include "noti_util.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif +#ifdef QP_ANIMATED_IMAGE_ENABLE +#include "animated_image.h" +#endif +#include "animated_icon.h" + +#define LEN_UNIT_TEXTBLOCK 555 +#define QP_DEFAULT_ICON RESDIR"/quickpanel_icon_default.png" + +#ifdef QP_SCREENREADER_ENABLE +static inline void _check_and_add_to_buffer(Eina_Strbuf *str_buf, const char *text) +{ + char buf_number[QP_UTIL_PHONE_NUMBER_MAX_LEN * 2] = { 0, }; + + retif(str_buf == NULL, , "Invalid parameter!"); + + if (text != NULL) { + if (strlen(text) > 0) { + if (quickpanel_common_util_is_phone_number(text)) { + quickpanel_common_util_phone_number_tts_make(buf_number, text, + (QP_UTIL_PHONE_NUMBER_MAX_LEN * 2) - 1); + eina_strbuf_append(str_buf, buf_number); + } else { + eina_strbuf_append(str_buf, text); + } + eina_strbuf_append_char(str_buf, '\n'); + } + } +} +#endif + +static Evas_Object *_check_duplicated_progress_loading(Evas_Object *obj, const char *part, const char *style_name) +{ + Evas_Object *old_content = NULL; + const char *old_style_name = NULL; + + retif(obj == NULL, NULL, "Invalid parameter!"); + retif(part == NULL, NULL, "Invalid parameter!"); + retif(style_name == NULL, NULL, "Invalid parameter!"); + + old_content = elm_object_part_content_get(obj, part); + if (old_content != NULL) { + old_style_name = elm_object_style_get(old_content); + if (old_style_name != NULL) { + if (strcmp(old_style_name, style_name) == 0) + return old_content; + + elm_object_part_content_unset(obj, part); + evas_object_del(old_content); + old_content = NULL; + } + } + + return NULL; +} + +static Evas_Object *_check_duplicated_image_loading(Evas_Object *obj, const char *part, const char *file_path) +{ + Evas_Object *old_ic = NULL; + const char *old_ic_path = NULL; + + retif(obj == NULL, NULL, "Invalid parameter!"); + retif(part == NULL, NULL, "Invalid parameter!"); + retif(file_path == NULL, NULL, "Invalid parameter!"); + + old_ic = elm_object_part_content_get(obj, part); + + if (quickpanel_animated_icon_is_same_icon(old_ic, file_path) == 1) { + return old_ic; + } + + if (old_ic != NULL) { + elm_image_file_get(old_ic, &old_ic_path, NULL); + if (old_ic_path != NULL) { + if (strcmp(old_ic_path, file_path) == 0) + return old_ic; + } + + elm_object_part_content_unset(obj, part); + evas_object_del(old_ic); + old_ic = NULL; + } + + return NULL; +} + +static void _set_text_to_part(Evas_Object *obj, const char *part, const char *text) +{ + const char *old_text = NULL; + + retif(obj == NULL, , "Invalid parameter!"); + retif(part == NULL, , "Invalid parameter!"); + retif(text == NULL, , "Invalid parameter!"); + + old_text = elm_object_part_text_get(obj, part); + if (old_text != NULL) { + if (strcmp(old_text, text) == 0) { + return; + } + } + + elm_object_part_text_set(obj, part, text); +} + +static char *_noti_get_progress(notification_h noti, char *buf, int buf_len) +{ + double size = 0.0; + double percentage = 0.0; + + retif(noti == NULL, NULL, "Invalid parameter!"); + retif(buf == NULL, NULL, "Invalid parameter!"); + + notification_get_size(noti, &size); + notification_get_progress(noti, &percentage); + + if (percentage > 0) { + if (percentage < 1.0 ) { + if (snprintf(buf, buf_len, "%d%%", (int)(percentage * 100.0 + 0.5)) <= 0) { + return NULL; + } + } + if (percentage >= 1.0) { + snprintf(buf, buf_len, "%d%%", 100); + } + + return buf; + } else if (size > 0 && percentage == 0) { + if (size > (1 << 30)) { + if (snprintf(buf, buf_len, "%.1lfGB", + size / 1000000000.0) <= 0) + return NULL; + + return buf; + } else if (size > (1 << 20)) { + if (snprintf(buf, buf_len, "%.1lfMB", + size / 1000000.0) <= 0) + return NULL; + + return buf; + } else if (size > (1 << 10)) { + if (snprintf(buf, buf_len, "%.1lfKB", + size / 1000.0) <= 0) + return NULL; + + return buf; + } else { + if (snprintf(buf, buf_len, "%.0lfB", size) <= 0) + return NULL; + + return buf; + } + } + + return NULL; +} + +static void _set_progressbar(Evas_Object *item, notification_h noti) +{ + Evas_Object *ic = NULL; + Evas_Object *old_ic = NULL; + double size = 0.0; + double percentage = 0.0; + notification_type_e type = NOTIFICATION_TYPE_NONE; + notification_ly_type_e layout = NOTIFICATION_LY_NONE ; + + retif(item == NULL, , "Invalid parameter!"); + retif(noti == NULL, , "noti is NULL"); + + notification_get_type(noti, &type); + if (type == NOTIFICATION_TYPE_ONGOING) { + notification_get_size(noti, &size); + notification_get_progress(noti, &percentage); + notification_get_layout(noti, &layout); + + if (layout != NOTIFICATION_LY_ONGOING_EVENT) { + if (percentage > 0.0 && percentage <= 1.0) { + old_ic = _check_duplicated_progress_loading(item, + "elm.swallow.progress", "quickpanel/list_progress"); + if (old_ic == NULL) { + ic = elm_progressbar_add(item); + if (ic == NULL) + return; + elm_object_style_set(ic, "list_progress"); + } else { + ic = old_ic; + } + + elm_progressbar_value_set(ic, percentage); + elm_progressbar_horizontal_set(ic, EINA_TRUE); + elm_progressbar_pulse(ic, EINA_FALSE); + } else if ((size >= 0.0 && percentage == 0.0) || ((size < 0.0 && percentage == 0.0)|| (size == 0.0 && percentage < 0.0))) { + old_ic = _check_duplicated_progress_loading(item, + "elm.swallow.progress", "quickpanel/pending_list"); + if (old_ic == NULL) { + ic = elm_progressbar_add(item); + if (ic == NULL) + return; + elm_object_style_set(ic, "pending"); + } else { + ic = old_ic; + } + + elm_progressbar_horizontal_set(ic, EINA_TRUE); + elm_progressbar_pulse(ic, EINA_TRUE); + } + } + } + + if (ic != NULL) { + elm_object_part_content_set(item, "elm.swallow.progress", ic); + } +} + +static void _set_icon(Evas_Object *item, notification_h noti) +{ + Evas_Object *ic = NULL; + Evas_Object *old_ic = NULL; + char *icon_path = NULL; + char *icon_sub_path = NULL; + char *thumbnail_path = NULL; + char *main_icon_path = NULL; + char *sub_icon_path = NULL; + char *icon_default = NULL; + char *pkgname = NULL; + + retif(item == NULL, , "Invalid parameter!"); + retif(noti == NULL, , "noti is NULL"); + + notification_get_pkgname(noti, &pkgname); + notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_THUMBNAIL, + &thumbnail_path); + notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_ICON, &icon_path); + notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_ICON_SUB, &icon_sub_path); + + if (thumbnail_path != NULL && icon_path != NULL) { + main_icon_path = thumbnail_path; + sub_icon_path = icon_path; + } else if (icon_path != NULL && thumbnail_path == NULL) { + main_icon_path = icon_path; + sub_icon_path = icon_sub_path; + } else if (icon_path == NULL && thumbnail_path != NULL) { + main_icon_path = thumbnail_path; + sub_icon_path = icon_sub_path; + } else { + icon_default = quickpanel_common_ui_get_pkginfo_icon(pkgname); + main_icon_path = icon_default; + sub_icon_path = NULL; + } + + if (main_icon_path != NULL) { + old_ic = _check_duplicated_image_loading(item, + "elm.swallow.thumbnail", main_icon_path); + + if (old_ic == NULL) { + ic = quickpanel_animated_icon_get(item, main_icon_path); + if (ic == NULL) { + ic = elm_image_add(item); + elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE); + elm_image_file_set(ic, main_icon_path, quickpanel_animated_image_get_groupname(main_icon_path)); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(ic); +#endif + if (!strncmp(main_icon_path, QP_PRELOAD_NOTI_ICON_PATH, strlen(QP_PRELOAD_NOTI_ICON_PATH))) { + DBG("Apply color theme [%s]", main_icon_path); + evas_object_color_set(ic, 0,0,0,255); + } + } + elm_object_part_content_set(item, "elm.swallow.thumbnail", ic); + } + } + + if (sub_icon_path != NULL) { + old_ic = _check_duplicated_image_loading(item, + "elm.swallow.icon", sub_icon_path); + + if (old_ic == NULL) { + ic = elm_image_add(item); + elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE); + elm_image_file_set(ic, sub_icon_path, quickpanel_animated_image_get_groupname(sub_icon_path)); + elm_object_part_content_set(item, "elm.swallow.icon", ic); + elm_object_signal_emit(item, "elm.icon.bg.show", "elm"); + } + } + + if (main_icon_path == NULL && sub_icon_path == NULL) { + old_ic = _check_duplicated_image_loading(item, + "elm.swallow.thumbnail", QP_DEFAULT_ICON); + + if (old_ic == NULL) { + ic = elm_image_add(item); + elm_image_resizable_set(ic, EINA_FALSE, EINA_TRUE); + elm_image_file_set(ic, QP_DEFAULT_ICON, quickpanel_animated_image_get_groupname(QP_DEFAULT_ICON)); + elm_object_part_content_set(item, "elm.swallow.thumbnail", ic); +#ifdef QP_ANIMATED_IMAGE_ENABLE + quickpanel_animated_image_add(ic); +#endif + } + } + + if (icon_default != NULL) { + free(icon_default); + } +} + +static void _set_text(Evas_Object *item, notification_h noti) +{ + int noti_err = NOTIFICATION_ERROR_NONE; + char *text = NULL; + char *text_utf8 = NULL; + char *domain = NULL; + char *dir = NULL; + char *pkgname = NULL; +// char *caller_pkgname = NULL; + int group_id = 0, priv_id = 0; + char buf[128] = { 0, }; + notification_type_e type = NOTIFICATION_TYPE_NONE; + double size = 0.0; + double percentage = 0.0; + notification_ly_type_e layout = NOTIFICATION_LY_NONE ; +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = NULL; + Eina_Strbuf *str_buf = NULL; +#endif + Evas_Object *textblock = NULL; + int len_w = 0, num_line = 1, view_height = 0; + struct appdata *ad = quickpanel_get_app_data(); + + retif(ad == NULL, , "Invalid parameter!"); + retif(item == NULL, , "Invalid parameter!"); + retif(noti == NULL, , "noti is NULL"); + + /* Set text domain */ + notification_get_text_domain(noti, &domain, &dir); + if (domain != NULL && dir != NULL) + bindtextdomain(domain, dir); + +#ifdef QP_SCREENREADER_ENABLE + ao = quickpanel_accessibility_screen_reader_object_get(item, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", item); + if (ao != NULL) { + str_buf = eina_strbuf_new(); + elm_access_info_set(ao, ELM_ACCESS_TYPE, _("IDS_QP_BUTTON_NOTIFICATION")); + } +#endif + + /* Get pkgname & id */ + notification_get_pkgname(noti, &pkgname); +// notification_get_application(noti, &caller_pkgname); + notification_get_id(noti, &group_id, &priv_id); + notification_get_type(noti, &type); + notification_get_size(noti, &size); + notification_get_progress(noti, &percentage); + notification_get_layout(noti, &layout); + + SDBG("percentage:%f size:%f", percentage, size); + + noti_err = notification_get_text(noti, + NOTIFICATION_TEXT_TYPE_TITLE, + &text); + + if (noti_err == NOTIFICATION_ERROR_NONE && text != NULL) { + quickpanel_common_util_char_replace(text, _NEWLINE, _SPACE); + _set_text_to_part(item, "elm.text.title", text); +#ifdef QP_SCREENREADER_ENABLE + _check_and_add_to_buffer(str_buf, text); +#endif + } + + noti_err = notification_get_text(noti, NOTIFICATION_TEXT_TYPE_CONTENT, &text); + if (noti_err == NOTIFICATION_ERROR_NONE && text != NULL) { + if (layout == NOTIFICATION_LY_ONGOING_EVENT) { + text_utf8 = elm_entry_utf8_to_markup(text); + if (text_utf8 != NULL) { + _set_text_to_part(item, "elm.text.content", text_utf8); + free(text_utf8); + } else { + _set_text_to_part(item, "elm.text.content", text); + } + textblock = (Evas_Object *)edje_object_part_object_get(_EDJ(item), "elm.text.content"); + evas_object_textblock_size_native_get(textblock, &len_w, NULL); + num_line = len_w / (LEN_UNIT_TEXTBLOCK * ad->scale); + num_line = (len_w - (num_line * (LEN_UNIT_TEXTBLOCK * ad->scale))) > 0 ? num_line + 1 : num_line; + if (num_line <= 1) { + elm_object_signal_emit(item, "line1.set", "prog"); + view_height = QP_THEME_LIST_ITEM_ONGOING_EVENT_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT; + } else /*if (num_line >= 2 && num_line < 3)*/ { + elm_object_signal_emit(item, "line2.set", "prog"); + view_height = QP_THEME_LIST_ITEM_ONGOING_EVENT_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT; + } /*else { + elm_object_signal_emit(item, "line3.set", "prog"); + view_height = QP_THEME_LIST_ITEM_ONGOING_EVENT_LINE3_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT; + }*/ + quickpanel_uic_initial_resize(item, view_height); +#ifdef QP_SCREENREADER_ENABLE + _check_and_add_to_buffer(str_buf, text); +#endif + } else { + quickpanel_common_util_char_replace(text, _NEWLINE, _SPACE); + _set_text_to_part(item, "elm.text.content", text); +#ifdef QP_SCREENREADER_ENABLE + _check_and_add_to_buffer(str_buf, text); +#endif + } + } + + if (layout != NOTIFICATION_LY_ONGOING_EVENT) { + text = _noti_get_progress(noti, buf, sizeof(buf)); + if (text != NULL) { + quickpanel_common_util_char_replace(text, _NEWLINE, _SPACE); + _set_text_to_part(item, "elm.text.time", text); +#ifdef QP_SCREENREADER_ENABLE + _check_and_add_to_buffer(str_buf, text); +#endif + } else { + _set_text_to_part(item, "elm.text.time", ""); + } + } else { + const char *get_content = elm_object_part_text_get(item, "elm.text.content"); + if (get_content == NULL || strlen(get_content) == 0) { + // if there is no content, move title to vertical center. + elm_object_signal_emit(item, "title.move.center", "prog"); + } + } + +#ifdef QP_SCREENREADER_ENABLE + if (ao != NULL && str_buf != NULL) { + elm_access_info_set(ao, ELM_ACCESS_INFO, eina_strbuf_string_get(str_buf)); + eina_strbuf_free(str_buf); + } +#endif +} + +static Evas_Object *_create(notification_h noti, Evas_Object *parent) +{ + int view_height = 0; + Evas_Object *view = NULL; + const char *view_layout_group = NULL; + retif(parent == NULL, NULL, "Invalid parameter!"); + retif(noti == NULL, NULL, "Invalid parameter!"); + + notification_ly_type_e layout = NOTIFICATION_LY_NOTI_EVENT_SINGLE; + notification_get_layout(noti, &layout); + + if (layout == NOTIFICATION_LY_ONGOING_EVENT) { + view_layout_group = "quickpanel/listitem/event"; + view_height = QP_THEME_LIST_ITEM_ONGOING_EVENT_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT; + } else if (layout == NOTIFICATION_LY_ONGOING_PROGRESS) { + view_layout_group = "quickpanel/listitem/progress"; + view_height = QP_THEME_LIST_ITEM_ONGOING_PROGRESS_HEIGHT + QP_THEME_LIST_ITEM_SEPERATOR_HEIGHT; + } + + view = elm_layout_add(parent); + if (view != NULL) { + elm_layout_file_set(view, DEFAULT_EDJ, view_layout_group); + evas_object_size_hint_weight_set(view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(view, EVAS_HINT_FILL, EVAS_HINT_FILL); + quickpanel_uic_initial_resize(view, view_height); + evas_object_show(view); + } else { + ERR("failed to create ongoing notification view"); + } + + return view; +} + +static void _update(noti_node_item *noti_node, notification_ly_type_e layout, Evas_Object *item) +{ + retif(item == NULL, , "Invalid parameter!"); + retif(noti_node == NULL, , "Invalid parameter!"); + + _set_progressbar(item, noti_node->noti); + _set_icon(item, noti_node->noti); + _set_text(item, noti_node->noti); +} + +Noti_View_H ongoing_noti_view_h = { + .name = "ongoing_noti_view", + + .create = _create, + .update = _update, + .remove = NULL, +}; diff --git a/daemon/notifications/noti_win.c b/daemon/notifications/noti_win.c index f50075a..66c0a81 100755 --- a/daemon/notifications/noti_win.c +++ b/daemon/notifications/noti_win.c @@ -1,23 +1,29 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ #include <Elementary.h> +#ifdef HAVE_X #include <utilX.h> +#endif +#include <efl_util.h> + +#define NOTI_HEIGHT 200 +#define NOTI_BTN_HEIGHT 80 -#define NOTI_HEIGHT 50 #ifndef __UNUSED__ #define __UNUSED__ __attribute__((unused)) #endif @@ -30,6 +36,7 @@ rotation handling are implemented for X based platform #endif #include "common.h" #include "noti_win.h" +#include "dbus_utility.h" struct Internal_Data { Evas_Object *content; @@ -42,49 +49,28 @@ struct Internal_Data { static const char *data_key = "_data"; -static void _set_win_type_notification_level(Evas_Object *win) -{ - retif(win == NULL, , "invalid parameter"); - - Ecore_X_Window w = elm_win_xwindow_get(win); - - if (w > 0) { - ecore_x_icccm_hints_set(w, 0, ECORE_X_WINDOW_STATE_HINT_NONE, 0, 0, - 0, 0, 0); - ecore_x_netwm_opacity_set(w, 0); - - ecore_x_netwm_window_type_set(w, - ECORE_X_WINDOW_TYPE_NOTIFICATION); - utilx_set_system_notification_level(ecore_x_display_get(), w, - UTILX_NOTIFICATION_LEVEL_HIGH); - } -} - static void _show(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) { struct Internal_Data *wd = evas_object_data_get(obj, data_key); - if (!wd) + if (!wd) { return; - if (wd->content) + } + if (wd->content) { evas_object_show(wd->content); -} - -static void _content_hide(void *data, Evas *e __UNUSED__, - Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) -{ - evas_object_hide(data); + } } static void _content_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) { - Evas_Coord h; + Evas_Coord h = 0; struct Internal_Data *wd = evas_object_data_get(data, data_key); - if (!wd) + if (!wd) { return; + } evas_object_size_hint_min_get(obj, NULL, &h); if ((h > 0)) { @@ -100,11 +86,10 @@ static void _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info) struct Internal_Data *wd = evas_object_data_get(obj, data_key); Evas_Object *sub = event_info; - if (!wd) + if (!wd) { return; + } if (sub == wd->content) { - evas_object_event_callback_del(wd->content, EVAS_CALLBACK_HIDE, - _content_hide); evas_object_event_callback_del(wd->content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _content_changed_size_hints); @@ -112,17 +97,27 @@ static void _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info) } } +static void _resized(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, + void *event_info __UNUSED__) +{ + evas_object_show(obj); +} + static void _del(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) { + struct Internal_Data *wd = evas_object_data_get(obj, data_key); - if (!wd) - return; - if (wd->rotation_event_handler) - ecore_event_handler_del(wd->rotation_event_handler); + if (wd) { + if (wd->rotation_event_handler) { + ecore_event_handler_del(wd->rotation_event_handler); + } + free(wd); + } + evas_object_data_set(data, data_key, NULL); - free(wd); + } #ifdef HAVE_X @@ -132,37 +127,41 @@ static void _update_geometry_on_rotation(Evas_Object *obj, int angle, Evas_Coord root_w, root_h; struct Internal_Data *wd = evas_object_data_get(obj, data_key); - if (!wd) + if (!wd) { return; + } - ecore_x_window_size_get(ecore_x_window_root_first_get(), &root_w, - &root_h); + ecore_x_window_size_get(ecore_x_window_root_first_get(), &root_w, &root_h); - /* rotate window */ switch (angle) { case 90: *w = root_h; - if (wd->orient == NOTI_ORIENT_BOTTOM) + if (wd->orient == NOTI_ORIENT_BOTTOM) { *x = root_w - wd->h; + } break; case 270: *w = root_h; - if (!(wd->orient == NOTI_ORIENT_BOTTOM)) + if (!(wd->orient == NOTI_ORIENT_BOTTOM)) { *x = root_w - wd->h; + } break; case 180: *w = root_w; - if (!wd->orient == NOTI_ORIENT_BOTTOM) + if (!wd->orient == NOTI_ORIENT_BOTTOM) { *y = root_h - wd->h; + } break; case 0: default: *w = root_w; - if (wd->orient == NOTI_ORIENT_BOTTOM) + if (wd->orient == NOTI_ORIENT_BOTTOM) { *y = root_h - wd->h; + } break; } } +#endif static void _win_rotated(Evas_Object *obj) { @@ -172,141 +171,152 @@ static void _win_rotated(Evas_Object *obj) int angle = 0; struct Internal_Data *wd = evas_object_data_get(obj, data_key); - if (!wd) + if (!wd) { return; + } angle = elm_win_rotation_get(obj); - if (angle % 90) + if (angle % 90) { return; + } angle %= 360; if (angle < 0) angle += 360; wd->angle = angle; +#ifdef HAVE_X _update_geometry_on_rotation(obj, wd->angle, &x, &y, &w); +#endif evas_object_move(obj, x, y); wd->w = w; evas_object_resize(obj, wd->w, wd->h); } -static Eina_Bool _prop_change(void *data, int type __UNUSED__, void *event) +static void _ui_rotation_wm_cb(void *data, Evas_Object *obj, void *event) { - Ecore_X_Event_Window_Property *ev; - struct Internal_Data *wd = evas_object_data_get(data, data_key); + int angle = 0; + angle = elm_win_rotation_get((Evas_Object *)obj); + + DBG("ACTIVENOTI ROTATE:%d", angle); - if (!wd) - return ECORE_CALLBACK_PASS_ON; - ev = event; - if (ev->atom == ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE) - if (ev->win == elm_win_xwindow_get(data)) - _win_rotated(data); - return ECORE_CALLBACK_PASS_ON; + _win_rotated(obj); } -#endif -HAPI Evas_Object *noti_win_add(Evas_Object *parent) +HAPI Evas_Object *quickpanel_noti_win_add(Evas_Object *parent) { Evas_Object *win; Evas_Object *bg; struct Internal_Data *wd; - Evas_Coord w = 0; + Evas_Coord w = 0, h = 0; win = elm_win_add(parent, "noti_win", ELM_WIN_NOTIFICATION); - elm_win_alpha_set(win, EINA_TRUE); - - if (!win) + if (!win) { return NULL; + } + + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + elm_win_alpha_set(win, EINA_FALSE); +#ifdef HAVE_X + elm_win_indicator_type_set(win,ELM_WIN_INDICATOR_TYPE_1); +#endif elm_win_title_set(win, "noti_win"); elm_win_borderless_set(win, EINA_TRUE); elm_win_autodel_set(win, EINA_TRUE); - evas_object_size_hint_weight_set(win, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(win, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(win, EVAS_HINT_FILL, EVAS_HINT_FILL); + +#ifdef HAVE_X + efl_util_set_notification_window_level(win, EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT); + elm_win_aux_hint_add(win, "wm.policy.win.user.geometry", "1"); +#endif + elm_win_prop_focus_skip_set(win, EINA_TRUE); + bg = elm_bg_add(win); - evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bg); - _set_win_type_notification_level(win); + if (elm_win_wm_rotation_supported_get(win)) { + int rots[4] = { 0, 90, 180, 270 }; + elm_win_wm_rotation_available_rotations_set(win, rots, 4); + } + evas_object_smart_callback_add(win, "wm,rotation,changed", _ui_rotation_wm_cb, NULL); wd = (struct Internal_Data *) calloc(1, sizeof(struct Internal_Data)); - if (!wd) + if (!wd) { + if (win) { + evas_object_del(win); + } return NULL; + } evas_object_data_set(win, data_key, wd); wd->angle = 0; wd->orient = NOTI_ORIENT_TOP; evas_object_move(win, 0, 0); -#ifdef HAVE_X - ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, NULL); - evas_object_resize(win, w, NOTI_HEIGHT); - wd->rotation_event_handler = ecore_event_handler_add( - ECORE_X_EVENT_WINDOW_PROPERTY, _prop_change, win); -#endif + elm_win_screen_size_get(win, NULL, NULL, &w, &h); + wd->w = w; wd->h = NOTI_HEIGHT; - evas_object_smart_callback_add(win, "sub-object-del", _sub_del, NULL); + + evas_object_resize(win, w, wd->h); evas_object_event_callback_add(win, EVAS_CALLBACK_SHOW, _show, NULL); evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _del, NULL); + evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _resized, NULL); + return win; } -HAPI void noti_win_content_set(Evas_Object *obj, Evas_Object *content) +HAPI void quickpanel_noti_win_content_set(Evas_Object *obj, Evas_Object *content, int btn_cnt) { Evas_Coord h; struct Internal_Data *wd; - if (!obj) + if (!obj) { return; + } wd = evas_object_data_get(obj, data_key); - if (!wd) + if (!wd) { return; - if (wd->content) + } + if (wd->content && content != NULL) { evas_object_del(content); + content = NULL; + } wd->content = content; + + if (btn_cnt > 0) { + wd->h += NOTI_BTN_HEIGHT; + } if (content) { - evas_object_size_hint_weight_set(wd->content, EVAS_HINT_EXPAND, - EVAS_HINT_EXPAND); + evas_object_size_hint_weight_set(wd->content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(obj, wd->content); - evas_object_size_hint_min_get(wd->content, NULL, &h); - if (h) - wd->h = h; evas_object_size_hint_min_set(wd->content, wd->w, wd->h); evas_object_resize(obj, wd->w, wd->h); - evas_object_event_callback_add(wd->content, EVAS_CALLBACK_HIDE, - _content_hide, obj); - evas_object_event_callback_add(wd->content, - EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _content_changed_size_hints, obj); + evas_object_event_callback_add(wd->content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _content_changed_size_hints, obj); } } -HAPI void noti_win_orient_set(Evas_Object *obj, enum Noti_Orient orient) +HAPI void quickpanel_noti_win_orient_set(Evas_Object *obj, enum Noti_Orient orient) { -#ifdef HAVE_X Evas_Coord root_w, root_h; -#endif struct Internal_Data *wd = evas_object_data_get(obj, data_key); - if (!wd) + if (!wd) { return; - if (orient >= NOTI_ORIENT_LAST) + } + if (orient >= NOTI_ORIENT_LAST) { return; + } #ifdef HAVE_X - ecore_x_window_size_get(ecore_x_window_root_first_get(), &root_w, - &root_h); + ecore_x_window_size_get(ecore_x_window_root_first_get(), &root_w, &root_h); #endif switch (orient) { case NOTI_ORIENT_BOTTOM: -#ifdef HAVE_X evas_object_move(obj, 0, root_h - wd->h); -#endif wd->orient = NOTI_ORIENT_BOTTOM; break; case NOTI_ORIENT_TOP: default: -#ifdef HAVE_X evas_object_move(obj, 0, 0); -#endif wd->orient = NOTI_ORIENT_TOP; break; } diff --git a/daemon/notifications/noti_win.h b/daemon/notifications/noti_win.h index b8345d3..c7dd25b 100755 --- a/daemon/notifications/noti_win.h +++ b/daemon/notifications/noti_win.h @@ -1,19 +1,21 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ + #ifndef __NOTI_WIN_H__ #define __NOTI_WIN_H__ #include <Evas.h> @@ -27,15 +29,15 @@ enum Noti_Orient { /* Creates and return a new window (of widget type elm_win) of width equal to root window */ -Evas_Object *noti_win_add(Evas_Object *parent); +Evas_Object *quickpanel_noti_win_add(Evas_Object *parent); /* Sets an Evas Object as content of the notification window created using noti_win_add */ -void noti_win_content_set(Evas_Object *obj, Evas_Object *content); +void quickpanel_noti_win_content_set(Evas_Object *obj, Evas_Object *content, int btn_cnt); /* Sets the orientation of the notification window, this can be of type Noti_Orient */ -void noti_win_orient_set(Evas_Object *obj, enum Noti_Orient orient); +void quickpanel_noti_win_orient_set(Evas_Object *obj, enum Noti_Orient orient); #endif diff --git a/daemon/notifications/noti_win_x11.c b/daemon/notifications/noti_win_x11.c new file mode 100644 index 0000000..9d57415 --- /dev/null +++ b/daemon/notifications/noti_win_x11.c @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include <Elementary.h> +#include <utilX.h> +#include <efl_util.h> + +#define NOTI_HEIGHT 200 +#define NOTI_BTN_HEIGHT 80 + +#ifndef __UNUSED__ +#define __UNUSED__ __attribute__((unused)) +#endif +/* Using this macro to emphasize that some portion like stacking and +rotation handling are implemented for X based platform +*/ + +#include <Ecore_X.h> +#include "common.h" +#include "noti_win.h" +#include "dbus_utility.h" + +struct Internal_Data { + Evas_Object *content; + Ecore_Event_Handler *rotation_event_handler; + Evas_Coord w; + Evas_Coord h; + int angle; + enum Noti_Orient orient; +}; + +static const char *data_key = "_data"; + +static void _show(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, + void *event_info __UNUSED__) +{ + struct Internal_Data *wd = evas_object_data_get(obj, data_key); + + if (!wd) { + return; + } + if (wd->content) { + evas_object_show(wd->content); + } +} + +static void _content_changed_size_hints(void *data, Evas *e __UNUSED__, + Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Coord h = 0; + struct Internal_Data *wd = evas_object_data_get(data, data_key); + + if (!wd) { + return; + } + + evas_object_size_hint_min_get(obj, NULL, &h); + if ((h > 0)) { + wd->h = h; + evas_object_size_hint_min_set(obj, wd->w, wd->h); + evas_object_size_hint_min_set(data, wd->w, wd->h); + evas_object_resize(data, wd->w, wd->h); + } +} + +static void _sub_del(void *data __UNUSED__, Evas_Object *obj, void *event_info) +{ + struct Internal_Data *wd = evas_object_data_get(obj, data_key); + Evas_Object *sub = event_info; + + if (!wd) { + return; + } + if (sub == wd->content) { + evas_object_event_callback_del(wd->content, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _content_changed_size_hints); + wd->content = NULL; + } +} + +static void _resized(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, + void *event_info __UNUSED__) +{ + evas_object_show(obj); +} + +static void _del(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, + void *event_info __UNUSED__) +{ + + struct Internal_Data *wd = evas_object_data_get(obj, data_key); + + if (wd) { + if (wd->rotation_event_handler) { + ecore_event_handler_del(wd->rotation_event_handler); + } + free(wd); + } + + evas_object_data_set(data, data_key, NULL); +} + +static void _update_geometry_on_rotation(Evas_Object *obj, int angle, + int *x, int *y, int *w) +{ + Evas_Coord root_w, root_h; + struct Internal_Data *wd = evas_object_data_get(obj, data_key); + + if (!wd) { + return; + } + + ecore_x_window_size_get(ecore_x_window_root_first_get(), &root_w, &root_h); + + switch (angle) { + case 90: + *w = root_h; + if (wd->orient == NOTI_ORIENT_BOTTOM) { + *x = root_w - wd->h; + } + break; + case 270: + *w = root_h; + if (!(wd->orient == NOTI_ORIENT_BOTTOM)) { + *x = root_w - wd->h; + } + break; + case 180: + *w = root_w; + if (!wd->orient == NOTI_ORIENT_BOTTOM) { + *y = root_h - wd->h; + } + break; + case 0: + default: + *w = root_w; + if (wd->orient == NOTI_ORIENT_BOTTOM) { + *y = root_h - wd->h; + } + break; + } +} +static void _win_rotated(Evas_Object *obj) +{ + int x = 0; + int y = 0; + int w = 0; + int angle = 0; + struct Internal_Data *wd = evas_object_data_get(obj, data_key); + + if (!wd) { + return; + } + angle = elm_win_rotation_get(obj); + if (angle % 90) { + return; + } + angle %= 360; + if (angle < 0) + angle += 360; + wd->angle = angle; + + _update_geometry_on_rotation(obj, wd->angle, &x, &y, &w); + + evas_object_move(obj, x, y); + wd->w = w; + evas_object_resize(obj, wd->w, wd->h); +} + +static void _ui_rotation_wm_cb(void *data, Evas_Object *obj, void *event) +{ + int angle = 0; + angle = elm_win_rotation_get((Evas_Object *)obj); + + DBG("ACTIVENOTI ROTATE:%d", angle); + + _win_rotated(obj); +} + +HAPI Evas_Object *quickpanel_noti_win_add(Evas_Object *parent) +{ + Evas_Object *win; + Evas_Object *bg; + struct Internal_Data *wd; + Evas_Coord w = 0, h = 0; + + win = elm_win_add(parent, "noti_win", ELM_WIN_NOTIFICATION); + if (!win) { + return NULL; + } + + elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW); + elm_win_alpha_set(win, EINA_FALSE); + elm_win_indicator_type_set(win,ELM_WIN_INDICATOR_TYPE_1); + elm_win_title_set(win, "noti_win"); + elm_win_borderless_set(win, EINA_TRUE); + elm_win_autodel_set(win, EINA_TRUE); + evas_object_size_hint_weight_set(win, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(win, EVAS_HINT_FILL, EVAS_HINT_FILL); + + efl_util_set_notification_window_level(win, EFL_UTIL_NOTIFICATION_LEVEL_DEFAULT); + elm_win_aux_hint_add(win, "wm.policy.win.user.geometry", "1"); + elm_win_prop_focus_skip_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(win, bg); + + if (elm_win_wm_rotation_supported_get(win)) { + int rots[4] = { 0, 90, 180, 270 }; + elm_win_wm_rotation_available_rotations_set(win, rots, 4); + } + evas_object_smart_callback_add(win, "wm,rotation,changed", _ui_rotation_wm_cb, NULL); + + wd = (struct Internal_Data *) calloc(1, sizeof(struct Internal_Data)); + if (!wd) { + if (win) { + evas_object_del(win); + } + return NULL; + } + evas_object_data_set(win, data_key, wd); + wd->angle = 0; + wd->orient = NOTI_ORIENT_TOP; + evas_object_move(win, 0, 0); + elm_win_screen_size_get(win, NULL, NULL, &w, &h); + + wd->w = w; + wd->h = NOTI_HEIGHT; + + evas_object_resize(win, w, wd->h); + evas_object_event_callback_add(win, EVAS_CALLBACK_SHOW, _show, NULL); + evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _del, NULL); + evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _resized, NULL); + + return win; +} + +HAPI void quickpanel_noti_win_content_set(Evas_Object *obj, Evas_Object *content, int btn_cnt) +{ + Evas_Coord h; + struct Internal_Data *wd; + + if (!obj) { + return; + } + wd = evas_object_data_get(obj, data_key); + if (!wd) { + return; + } + if (wd->content && content != NULL) { + evas_object_del(content); + content = NULL; + } + wd->content = content; + + if (btn_cnt > 0) { + wd->h += NOTI_BTN_HEIGHT; + } + if (content) { + evas_object_size_hint_weight_set(wd->content, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(obj, wd->content); + evas_object_size_hint_min_set(wd->content, wd->w, wd->h); + evas_object_resize(obj, wd->w, wd->h); + evas_object_event_callback_add(wd->content, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _content_changed_size_hints, obj); + } +} + +HAPI void quickpanel_noti_win_orient_set(Evas_Object *obj, enum Noti_Orient orient) +{ + Evas_Coord root_w, root_h; + struct Internal_Data *wd = evas_object_data_get(obj, data_key); + + if (!wd) { + return; + } + if (orient >= NOTI_ORIENT_LAST) { + return; + } + ecore_x_window_size_get(ecore_x_window_root_first_get(), &root_w, &root_h); + switch (orient) { + case NOTI_ORIENT_BOTTOM: + evas_object_move(obj, 0, root_h - wd->h); + wd->orient = NOTI_ORIENT_BOTTOM; + break; + case NOTI_ORIENT_TOP: + default: + evas_object_move(obj, 0, 0); + wd->orient = NOTI_ORIENT_TOP; + break; + } +} diff --git a/daemon/notifications/status_msg.c b/daemon/notifications/status_msg.c deleted file mode 100755 index ee6f8a6..0000000 --- a/daemon/notifications/status_msg.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright 2012 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 <Elementary.h> -#include <Ecore_X.h> -#include <vconf.h> -#include <notification.h> - -#include "quickpanel-ui.h" -#include "common.h" -#include "noti_win.h" - -#define QP_STATUS_DURATION 3 -#define QP_STATUS_DETAIL_DURATION 6 - -#define STATUS_MSG_LEN 1024 -#define DEFAULT_ICON ICONDIR "/quickpanel_icon_default.png" - -#define E_DATA_STATUS_DETAIL "detail" - -static Evas_Object *g_status_win; -static Ecore_Timer *g_status_timer; -static int g_noti_height; - -static int quickpanel_status_init(void *data); -static int quickpanel_status_fini(void *data); -static void quickpanel_status_reflesh(void *data); - -QP_Module ticker_status = { - .name = "ticker_status", - .init = quickpanel_status_init, - .fini = quickpanel_status_fini, - .hib_enter = NULL, - .hib_leave = NULL, - .lang_changed = NULL, - .refresh = quickpanel_status_reflesh -}; - -/***************************************************************************** - * - * (Static) Util functions - * - *****************************************************************************/ -static void _quickpanel_status_hide(void *data) -{ - if (g_status_win) { - evas_object_hide(g_status_win); - evas_object_del(g_status_win); - g_status_win = NULL; - } -} - -static void _quickpanel_status_set_text(Evas_Object *detail, const char *message) { - retif(detail == NULL, , "Invalid parameter!"); - retif(message == NULL, , "Invalid parameter!"); - - elm_object_part_text_set(detail, "elm.text", message); -} - -static Eina_Bool _quickpanel_status_timeout_cb(void *data) -{ - DBG(""); - - g_status_timer = NULL; - - _quickpanel_status_hide(data); - - return ECORE_CALLBACK_CANCEL; -} - -static void _quickpanel_status_detail_hide_cb(void *data, Evas *e, - Evas_Object *obj, - void *event_info) -{ - if (g_status_timer) { - ecore_timer_del(g_status_timer); - g_status_timer = NULL; - } -} - -static void _quickpanel_status_detail_show_cb(void *data, Evas *e, - Evas_Object *obj, - void *event_info) -{ - DBG(""); -} - -static void _quickpanel_status_clicked_cb(void *data, Evas_Object *obj, - void *event_info) -{ - _quickpanel_status_hide(data); -} - -static void _noti_hide_cb(void *data, Evas_Object *obj, - const char *emission, const char *source) -{ - DBG(""); - - if (g_status_timer) { - ecore_timer_del(g_status_timer); - g_status_timer = NULL; - } -} - -static Evas_Object *_quickpanel_status_create_status_noti(const char *message, void *data) -{ - Evas_Object *status_noti = NULL; - Evas_Object *detail = NULL; - const char *data_win_height = NULL; - int noti_height = 0; - - retif(message == NULL, NULL, "Invalid parameter!"); - - status_noti = noti_win_add(NULL); - retif(status_noti == NULL, NULL, "Failed to add elm status_noti."); - - detail = elm_layout_add(status_noti); - if (!detail) { - ERR("Failed to get detailview."); - evas_object_del(status_noti); - return NULL; - } - elm_layout_theme_set(detail, "tickernoti", "base", "textonly"); - elm_object_signal_callback_add(detail, "request,hide", "", - _noti_hide_cb, NULL); - - data_win_height = (char *)elm_layout_data_get(detail, "height"); - if (data_win_height != NULL && elm_config_scale_get() > 0.0) - noti_height = (int)(elm_config_scale_get() - * atoi(data_win_height)); - evas_object_size_hint_min_set(detail, 1, noti_height); - g_noti_height = noti_height; - DBG("height:%d", g_noti_height); - - noti_win_content_set(status_noti, detail); - - _quickpanel_status_set_text(detail, message); - /* Use style "default" for detailview mode and - * "info" for text only mode - */ - elm_object_style_set(status_noti, "textonly"); - evas_object_data_set(status_noti, E_DATA_STATUS_DETAIL, detail); - - return status_noti; -} - -static int _quickpanel_status_get_angle(void *data) -{ - struct appdata *ad = (struct appdata *)data; - Ecore_X_Window xwin, root; - int ret = 0, angle = 0, count = 0; - unsigned char *prop_data = NULL; - - xwin = elm_win_xwindow_get(ad->win); - root = ecore_x_window_root_get(xwin); - - ret = ecore_x_window_prop_property_get(root, - ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE, - ECORE_X_ATOM_CARDINAL, 32, - &prop_data, &count); - - if (ret && prop_data) { - memcpy(&angle, prop_data, sizeof(int)); - - if (prop_data) - free(prop_data); - - return angle; - } else { - ERR("Fail to get angle"); - if (prop_data) - free(prop_data); - - return -1; - } -} - -static void _quickpanel_status_update_geometry_on_rotation(void *data, int *x, int *y, int *w, int *h) { - int angle = 0; - - if (!data) - return; - - angle = _quickpanel_status_get_angle(data); - Evas_Coord root_w, root_h; - - /* - * manually calculate win_status_noti_indi window position & size - * - win_indi is not full size window - */ - ecore_x_window_size_get(ecore_x_window_root_first_get(), &root_w, &root_h); - - // rotate win - switch(angle) - { - case 90: - *w = g_noti_height; - *h = root_h; - break; - case 270: - *w = g_noti_height; - *h = root_h; - *x = root_w - g_noti_height; - break; - case 180: - *w = root_w; - *h = g_noti_height; - *y = root_h - g_noti_height; - break; - case 0: - default: - *w = root_w; - *h = g_noti_height; - break; - } - elm_win_rotation_set(g_status_win, angle); -} - -static void _quickpanel_status_win_rotated(void *data) { - retif(data == NULL, ,"data is NULL"); - - struct appdata *ad = data; - int x = 0, y = 0, w = 0, h = 0; - - _quickpanel_status_update_geometry_on_rotation(ad, &x, &y, &w, &h); - - if (g_status_win != NULL) { - evas_object_move(g_status_win, x, y); - evas_object_resize(g_status_win, w, h); - } -} - -static void _quickpanel_status_cb(const char *message, void *data) -{ - DBG(""); - retif(message == NULL, ,"message is NULL"); - retif(data == NULL, ,"data is NULL"); - - if (g_status_timer) - ecore_timer_del(g_status_timer); - - /* Skip if previous status is still shown */ - if (g_status_win != NULL) { - Evas_Object *detail = evas_object_data_get(g_status_win, E_DATA_STATUS_DETAIL); - _quickpanel_status_set_text(detail, message); - elm_win_activate(g_status_win); - } else { - g_status_win = _quickpanel_status_create_status_noti(message, data); - if (g_status_win == NULL) { - ERR("Fail to create status_noti"); - return; - } - - _quickpanel_status_win_rotated(data); - evas_object_show(g_status_win); - - evas_object_event_callback_add(g_status_win, EVAS_CALLBACK_SHOW, - _quickpanel_status_detail_show_cb, - g_status_win); - evas_object_event_callback_add(g_status_win, EVAS_CALLBACK_HIDE, - _quickpanel_status_detail_hide_cb, - g_status_win); - evas_object_smart_callback_add(g_status_win, "clicked", - _quickpanel_status_clicked_cb, - g_status_win); - } - - g_status_timer = ecore_timer_add(QP_STATUS_DURATION, - _quickpanel_status_timeout_cb, NULL); -} - -/***************************************************************************** - * - * Util functions - * - *****************************************************************************/ -static int quickpanel_status_init(void *data) -{ - int ret = QP_OK; - - ret = notification_status_monitor_message_cb_set(_quickpanel_status_cb, data); - - return ret; -} - -static int quickpanel_status_fini(void *data) -{ - int ret = 0; - _quickpanel_status_hide(NULL); - - ret = notification_status_monitor_message_cb_unset(); - - return ret; -} - -static void quickpanel_status_reflesh(void *data) -{ - retif(data == NULL, , "Invalid parameter!"); - - if (g_status_win != NULL) { - _quickpanel_status_win_rotated(data); - } -} diff --git a/daemon/notifications/ticker.c b/daemon/notifications/ticker.c deleted file mode 100755 index 8dde239..0000000 --- a/daemon/notifications/ticker.c +++ /dev/null @@ -1,841 +0,0 @@ -/* - * Copyright 2012 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 <Elementary.h> -#include <Ecore_X.h> -#include <appcore-common.h> -#include <vconf.h> -#include <appsvc.h> -#include <app_service.h> -#include <notification.h> -#include <feedback.h> - -#include "quickpanel-ui.h" -#include "common.h" -#include "noti.h" -#include "noti_win.h" -#include "noti_util.h" - -#define QP_TICKER_DURATION 5 -#define QP_TICKER_DETAIL_DURATION 6 - -#define TICKER_MSG_LEN 1024 -#define DEFAULT_ICON ICONDIR "/quickpanel_icon_default.png" - -#define E_DATA_IS_TICKERNOTI_CONTENT "E_DATA_TN_CONTENT" -#define E_DATA_IS_TICKERNOTI_EXECUTED "E_DATA_TN_EXECUTED" - -#define FORMAT_1LINE "<font_size=29><color=#BABABA>%s</color></font>" -#define FORMAT_2LINE "<font_size=26><color=#BABABA>%s</color></font><br><font_size=29><color=#F4F4F4>%s</color></font>" -#define FORMAT_2LINE_SINGLE "<font_size=26><color=#BABABA>%s</color></font><br><font_size=29><color=#F4F4F4>%s %s</color></font>" -#define FORMAT_2LINE_MULTI "<font_size=26><color=#BABABA>%s</color></font><br><font_size=29><color=#F4F4F4>%s %s</color></font>" - -static Evas_Object *g_window; -static Evas_Object *g_ticker; -static Ecore_Timer *g_timer; -static int g_noti_height; - -static int quickpanel_ticker_init(void *data); -static int quickpanel_ticker_fini(void *data); -static int quickpanel_ticker_enter_hib(void *data); -static int quickpanel_ticker_leave_hib(void *data); -static void quickpanel_ticker_reflesh(void *data); -static void _quickpanel_ticker_destroy_tickernoti(Evas_Object *tickernoti); - -QP_Module ticker = { - .name = "ticker", - .init = quickpanel_ticker_init, - .fini = quickpanel_ticker_fini, - .hib_enter = quickpanel_ticker_enter_hib, - .hib_leave = quickpanel_ticker_leave_hib, - .lang_changed = NULL, - .refresh = quickpanel_ticker_reflesh -}; - -static int _is_lockscreen_launched(void) { - int ret = 0; - int is_lock_launched = VCONFKEY_IDLE_UNLOCK; - - if ((ret = vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &is_lock_launched)) == 0) { - if (ret == 0 && is_lock_launched == VCONFKEY_IDLE_LOCK) { - return 1; - } - } - - return 0; -} - -/***************************************************************************** - * - * (Static) Util functions - * - *****************************************************************************/ -static void _quickpanel_ticker_clicked_cb(void *data, Evas_Object *obj, - const char *emission, const char *source) { - int ret = -1; - char *pkgname = NULL; - char *caller_pkgname = NULL; - bundle *args = NULL; - bundle *group_args = NULL; - bundle *single_service_handle = NULL; - bundle *multi_service_handle = NULL; - int flags = 0, group_id = 0, priv_id = 0, count = 0, flag_launch = 0, - flag_delete = 0; - notification_type_e type = NOTIFICATION_TYPE_NONE; - notification_h noti = NULL; - int *is_ticker_executed = NULL; - - noti = data; - retif(noti == NULL, , "Invalid parameter!"); - - quickpanel_play_feedback(); - - if (_is_lockscreen_launched()) { - return ; - } - - notification_get_pkgname(noti, &caller_pkgname); - notification_get_application(noti, &pkgname); - if (pkgname == NULL) - pkgname = caller_pkgname; - - notification_get_id(noti, &group_id, &priv_id); - notification_get_property(noti, &flags); - notification_get_type(noti, &type); - - if (flags & NOTIFICATION_PROP_DISABLE_APP_LAUNCH) { - flag_launch = 0; - } else { - is_ticker_executed = evas_object_data_get(obj, E_DATA_IS_TICKERNOTI_EXECUTED); - if (is_ticker_executed != NULL) { - if (*is_ticker_executed == 0) { - flag_launch = 1; - *is_ticker_executed = 1; - } else { - flag_launch = 0; - } - } else { - flag_launch = 0; - } - } - - if (flags & NOTIFICATION_PROP_DISABLE_AUTO_DELETE) - flag_delete = 0; - else - flag_delete = 1; - - notification_get_execute_option(noti, - NOTIFICATION_EXECUTE_TYPE_SINGLE_LAUNCH, - NULL, &single_service_handle); - notification_get_execute_option(noti, - NOTIFICATION_EXECUTE_TYPE_MULTI_LAUNCH, - NULL, &multi_service_handle); - - if (flag_launch == 1) { - /* Hide quickpanel */ - quickpanel_close_quickpanel(true); - - char *text_count = NULL; - notification_get_text(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT, &text_count); - - if (text_count != NULL) { - count = atoi(text_count); - } else { - count = 1; - } - - if (single_service_handle != NULL && multi_service_handle == NULL) { - ret = quickpanel_launch_app(NULL, single_service_handle); - quickpanel_launch_app_inform_result(pkgname, ret); - } - if (single_service_handle == NULL && multi_service_handle != NULL) { - ret = quickpanel_launch_app(NULL, multi_service_handle); - quickpanel_launch_app_inform_result(pkgname, ret); - } - if (single_service_handle != NULL && multi_service_handle != NULL) { - if (count <= 1) { - ret = quickpanel_launch_app(NULL, single_service_handle); - quickpanel_launch_app_inform_result(pkgname, ret); - } else { - ret = quickpanel_launch_app(NULL, multi_service_handle); - quickpanel_launch_app_inform_result(pkgname, ret); - } - } - if (single_service_handle == NULL && multi_service_handle == NULL) { - notification_get_args(noti, &args, &group_args); - - if (count > 1 && group_args != NULL) { - ret = quickpanel_launch_app(pkgname, group_args); - quickpanel_launch_app_inform_result(pkgname, ret); - } else { - ret = quickpanel_launch_app(pkgname, args); - quickpanel_launch_app_inform_result(pkgname, ret); - } - } - } - - if (flag_delete == 1 && type == NOTIFICATION_TYPE_NOTI) { - notification_delete_by_priv_id(caller_pkgname, - NOTIFICATION_TYPE_NOTI, - priv_id); - } -} - -static inline void __ticker_only_noti_del(notification_h noti) -{ - int applist = NOTIFICATION_DISPLAY_APP_ALL; - - retif(noti == NULL, ,"noti is null"); - - notification_get_display_applist(noti, &applist); - if (applist & NOTIFICATION_DISPLAY_APP_TICKER) { - if (!(applist & NOTIFICATION_DISPLAY_APP_NOTIFICATION_TRAY)) { - char *pkgname = NULL; - int priv_id = 0; - - notification_get_pkgname(noti, &pkgname); - notification_get_id(noti, NULL, &priv_id); - notification_delete_by_priv_id(pkgname, - NOTIFICATION_TYPE_NONE, - priv_id); - } - } -} - -static void _quickpanel_ticker_hide(void *data) -{ - if (g_ticker) { - evas_object_hide(g_ticker); - _quickpanel_ticker_destroy_tickernoti(g_ticker); - g_ticker = NULL; - } -} - -static Eina_Bool _quickpanel_ticker_timeout_cb(void *data) -{ - INFO("ticker dismissed by timeout callback"); - - g_timer = NULL; - - _quickpanel_ticker_hide(data); - - return ECORE_CALLBACK_CANCEL; -} - -static void _quickpanel_ticker_detail_hide_cb(void *data, Evas *e, - Evas_Object *obj, - void *event_info) -{ - INFO("ticker dismissed by touching a hide button"); - - notification_h noti = (notification_h) data; - - if (g_timer) { - ecore_timer_del(g_timer); - g_timer = NULL; - } - - retif(noti == NULL, , "Invalid parameter!"); - - __ticker_only_noti_del(noti); - notification_free(noti); -} - -static void _quickpanel_ticker_detail_show_cb(void *data, Evas *e, - Evas_Object *obj, - void *event_info) -{ - DBG(""); -} - -static void _quickpanel_ticker_button_clicked_cb(void *data, Evas_Object *obj, - void *event_info) -{ - if (g_timer) { - ecore_timer_del(g_timer); - g_timer = NULL; - } - - _quickpanel_ticker_hide(data); -} - -static Evas_Object *_quickpanel_ticker_create_button(Evas_Object *parent, - notification_h noti) -{ - Evas_Object *button = NULL; - - retif(noti == NULL || parent == NULL, NULL, "Invalid parameter!"); - - if (_is_lockscreen_launched()) { - return NULL; - } - - button = elm_button_add(parent); - elm_object_style_set(button, "tickernoti"); - elm_object_text_set(button, _S("IDS_COM_BODY_CLOSE")); - evas_object_smart_callback_add(button, "clicked", - _quickpanel_ticker_button_clicked_cb, noti); - - return button; -} - -static Evas_Object *_quickpanel_ticker_create_icon(Evas_Object *parent, - notification_h noti) -{ - char *icon_path = NULL; - Evas_Object *icon = NULL; - - retif(noti == NULL || parent == NULL, NULL, "Invalid parameter!"); - - notification_get_image(noti, NOTIFICATION_IMAGE_TYPE_ICON, &icon_path); - icon = elm_image_add(parent); - - if (icon_path == NULL - || (elm_image_file_set(icon, icon_path, NULL) == EINA_FALSE)) { - elm_image_file_set(icon, DEFAULT_ICON, NULL); - elm_image_resizable_set(icon, EINA_TRUE, EINA_TRUE); - } - - return icon; -} - -static inline char *_get_text(notification_h noti, notification_text_type_e text_type) { - time_t time = 0; - char *text = NULL; - char buf[TICKER_MSG_LEN] = { 0, }; - - if (notification_get_time_from_text(noti, text_type, &time) == NOTIFICATION_ERROR_NONE) { - if ((int)time > 0) { - quickpanel_noti_get_time(time, buf, sizeof(buf)); - text = buf; - } - } else { - notification_get_text(noti, text_type, &text); - } - - if (text != NULL) - return elm_entry_utf8_to_markup(text); - - return NULL; -} - -static char *_quickpanel_ticker_get_label_layout_default(notification_h noti) -{ - char buf[TICKER_MSG_LEN] = { 0, }; - int len = 0; - char *domain = NULL; - char *dir = NULL; - char *title_utf8 = NULL; - char *content_utf8 = NULL; - char *event_count_utf8 = NULL; - - retif(noti == NULL, NULL, "Invalid parameter!"); - - notification_get_text_domain(noti, &domain, &dir); - if (domain != NULL && dir != NULL) - bindtextdomain(domain, dir); - - title_utf8 = _get_text(noti, NOTIFICATION_TEXT_TYPE_TITLE); - content_utf8 = _get_text(noti, NOTIFICATION_TEXT_TYPE_CONTENT); - - event_count_utf8 = _get_text(noti, NOTIFICATION_TEXT_TYPE_EVENT_COUNT); - - if (event_count_utf8 == NULL) { - if (title_utf8 && content_utf8) { - len = snprintf(buf, sizeof(buf),FORMAT_2LINE, title_utf8, content_utf8); - } else if (title_utf8) { - len = snprintf(buf, sizeof(buf),FORMAT_1LINE, title_utf8); - } - } else { - if (title_utf8 && content_utf8) { - len = snprintf(buf, sizeof(buf),FORMAT_2LINE_MULTI, title_utf8, event_count_utf8, content_utf8); - } else if (title_utf8) { - len = snprintf(buf, sizeof(buf),FORMAT_1LINE, title_utf8); - } - } - - if (title_utf8) - free(title_utf8); - - if (content_utf8) - free(content_utf8); - - if (event_count_utf8) - free(event_count_utf8); - - if (len > 0) - return strdup(buf); - - return NULL; -} - -static char *_quickpanel_ticker_get_label_layout_single(notification_h noti) -{ - char buf[TICKER_MSG_LEN] = { 0, }; - int len = 0; - char *domain = NULL; - char *dir = NULL; - char *title_utf8 = NULL; - char *content_utf8 = NULL; - char *info_1_utf8 = NULL; - char *info_sub_1_utf8 = NULL; - - retif(noti == NULL, NULL, "Invalid parameter!"); - - notification_get_text_domain(noti, &domain, &dir); - if (domain != NULL && dir != NULL) - bindtextdomain(domain, dir); - - title_utf8 = _get_text(noti, NOTIFICATION_TEXT_TYPE_TITLE); - content_utf8 = _get_text(noti, NOTIFICATION_TEXT_TYPE_CONTENT); - - info_1_utf8 = _get_text(noti, NOTIFICATION_TEXT_TYPE_INFO_1); - info_sub_1_utf8 = _get_text(noti, NOTIFICATION_TEXT_TYPE_INFO_SUB_1); - - if (info_1_utf8 == NULL) { - if (title_utf8 && content_utf8) { - len = snprintf(buf, sizeof(buf),FORMAT_2LINE, title_utf8, content_utf8); - } else if (title_utf8) { - len = snprintf(buf, sizeof(buf),FORMAT_1LINE, title_utf8); - } - } else { - if (info_sub_1_utf8) { - if (content_utf8) - len = snprintf(buf, sizeof(buf), FORMAT_2LINE_SINGLE, content_utf8, info_1_utf8, info_sub_1_utf8); - else if (title_utf8) - len = snprintf(buf, sizeof(buf), FORMAT_2LINE_SINGLE, title_utf8, info_1_utf8, info_sub_1_utf8); - } else { - if (content_utf8) - len = snprintf(buf, sizeof(buf), FORMAT_2LINE, content_utf8, info_1_utf8); - else if (title_utf8) - len = snprintf(buf, sizeof(buf), FORMAT_2LINE, title_utf8, info_1_utf8); - } - } - - if (title_utf8) - free(title_utf8); - - if (content_utf8) - free(content_utf8); - - if (info_1_utf8) - free(info_1_utf8); - - if (info_sub_1_utf8) - free(info_sub_1_utf8); - - if (len > 0) - return strdup(buf); - - return NULL; -} - -static char *_quickpanel_ticker_get_label(notification_h noti) -{ - char *result = NULL; - notification_ly_type_e layout; - - retif(noti == NULL, NULL, "Invalid parameter!"); - - notification_get_layout(noti, &layout); - - - if (layout == NOTIFICATION_LY_NOTI_EVENT_SINGLE) { - result = _quickpanel_ticker_get_label_layout_single(noti); - } else { - result = _quickpanel_ticker_get_label_layout_default(noti); - } - - return result; -} - -static void _noti_hide_cb(void *data, Evas_Object *obj, - const char *emission, const char *source) -{ - DBG(""); - - if (g_timer) { - ecore_timer_del(g_timer); - g_timer = NULL; - } - - _quickpanel_ticker_hide(data); -} - -static Evas_Object *_quickpanel_ticker_create_tickernoti(void *data) -{ - notification_h noti = (notification_h) data; - Evas_Object *tickernoti = NULL; - Evas_Object *icon = NULL; - Evas_Object *detail = NULL; - Evas_Object *button = NULL; - char *buf = NULL; - const char *data_win_height = NULL; - int noti_height = 0; - int *is_ticker_executed = NULL; - - retif(noti == NULL, NULL, "Invalid parameter!"); - - tickernoti = noti_win_add(NULL); - retif(tickernoti == NULL, NULL, "Failed to add elm tickernoti."); - - detail = elm_layout_add(tickernoti); - if (!detail) { - ERR("Failed to get detailview."); - _quickpanel_ticker_destroy_tickernoti(tickernoti); - return NULL; - } - elm_layout_theme_set(detail, "tickernoti", "base", "default"); - elm_object_signal_callback_add(detail, "request,hide", "", - _noti_hide_cb, noti); - elm_object_signal_callback_add(detail, "clicked", "", - _quickpanel_ticker_clicked_cb, noti); - - data_win_height = (char *)elm_layout_data_get(detail, "height"); - if (data_win_height != NULL && elm_config_scale_get() > 0.0) - noti_height = (int)(elm_config_scale_get() - * atoi(data_win_height)); - evas_object_size_hint_min_set(detail, 1, noti_height); - g_noti_height = noti_height; - - noti_win_content_set(tickernoti, detail); - - icon = _quickpanel_ticker_create_icon(detail, noti); - if (icon != NULL) - elm_object_part_content_set(detail, "icon", icon); - - button = _quickpanel_ticker_create_button(detail, noti); - if (button != NULL) - elm_object_part_content_set(detail, "button", button); - - buf = _quickpanel_ticker_get_label(noti); - if (buf != NULL) { - elm_object_part_text_set(detail, "elm.text", buf); - free(buf); - } - - /* Use style "default" for detailview mode and - * "info" for text only mode - */ - elm_object_style_set(tickernoti, "default"); - evas_object_data_set(tickernoti, E_DATA_IS_TICKERNOTI_CONTENT, detail); - is_ticker_executed = (int *)malloc(sizeof(int)); - if (is_ticker_executed != NULL) { - *is_ticker_executed = 0; - evas_object_data_set(detail, E_DATA_IS_TICKERNOTI_EXECUTED, is_ticker_executed); - } - - return tickernoti; -} - -static void _quickpanel_ticker_destroy_tickernoti(Evas_Object *tickernoti) -{ - int *is_ticker_executed = NULL; - Evas_Object *detail = NULL; - - retif(tickernoti == NULL, , "Invalid parameter!"); - - detail = evas_object_data_get(tickernoti, E_DATA_IS_TICKERNOTI_CONTENT); - - if (detail != NULL) { - is_ticker_executed = evas_object_data_get(detail, E_DATA_IS_TICKERNOTI_EXECUTED); - if (is_ticker_executed != NULL) { - evas_object_data_del(detail, E_DATA_IS_TICKERNOTI_EXECUTED); - free(is_ticker_executed); - } - evas_object_data_del(detail, E_DATA_IS_TICKERNOTI_CONTENT); - } - - evas_object_del(tickernoti); -} - -static int _quickpanel_ticker_get_angle(void *data) -{ - struct appdata *ad = (struct appdata *)data; - Ecore_X_Window xwin, root; - int ret = 0, angle = 0, count = 0; - unsigned char *prop_data = NULL; - - xwin = elm_win_xwindow_get(ad->win); - root = ecore_x_window_root_get(xwin); - - ret = ecore_x_window_prop_property_get(root, - ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE, - ECORE_X_ATOM_CARDINAL, 32, - &prop_data, &count); - - if (ret && prop_data) { - memcpy(&angle, prop_data, sizeof(int)); - - if (prop_data) - free(prop_data); - - return angle; - } else { - ERR("Fail to get angle"); - if (prop_data) - free(prop_data); - - return -1; - } -} - -static void _quickpanel_ticker_update_geometry_on_rotation(void *data, int *x, int *y, int *w, int *h) { - int angle = 0; - - if (!data) - return; - angle = _quickpanel_ticker_get_angle(data); - Evas_Coord root_w, root_h; - - /* - * manually calculate win_tickernoti_indi window position & size - * - win_indi is not full size window - */ - ecore_x_window_size_get(ecore_x_window_root_first_get(), &root_w, &root_h); - - // rotate win - switch(angle) - { - case 90: - *w = g_noti_height; - *h = root_h; - break; - case 270: - *w = g_noti_height; - *h = root_h; - *x = root_w - g_noti_height; - break; - case 180: - *w = root_w; - *h = g_noti_height; - *y = root_h - g_noti_height; - break; - case 0: - default: - *w = root_w; - *h = g_noti_height; - break; - } - elm_win_rotation_set(g_ticker, angle); -} - -static void _quickpanel_ticker_win_rotated(void *data) { - retif(data == NULL, ,"data is NULL"); - struct appdata *ad = data; - int x = 0, y = 0, w = 0, h = 0; - - _quickpanel_ticker_update_geometry_on_rotation(ad, &x, &y, &w, &h); - - if (g_ticker != NULL) { - evas_object_move(g_ticker, x, y); - evas_object_resize(g_ticker, w, h); - } -} - -static void _quickpanel_noti_media_feedback(notification_h noti) { - - retif(noti == NULL, ,"op_list is NULL"); - - if (quickpanel_is_sound_enabled() == 1) { - notification_sound_type_e nsound_type = NOTIFICATION_SOUND_TYPE_NONE; - const char *nsound_path = NULL; -#ifdef VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR - char *default_msg_tone = NULL; -#endif - - notification_get_sound(noti, &nsound_type, &nsound_path); - DBG("notification sound: %d, %s", nsound_type, nsound_path); - - switch (nsound_type) { - case NOTIFICATION_SOUND_TYPE_USER_DATA: - quickpanel_player_play(SOUND_TYPE_NOTIFICATION, nsound_path); - break; - case NOTIFICATION_SOUND_TYPE_DEFAULT: -#ifdef VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR - default_msg_tone = vconf_get_str(VCONFKEY_SETAPPL_NOTI_MSG_RINGTONE_PATH_STR); - - if (default_msg_tone != NULL) { - quickpanel_player_play(SOUND_TYPE_NOTIFICATION, default_msg_tone); - free(default_msg_tone); - } else { - feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_UNLOCK); - } -#else - feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_UNLOCK); -#endif - break; - case NOTIFICATION_SOUND_TYPE_MAX: - case NOTIFICATION_SOUND_TYPE_NONE: - break; - } - } - - /* Play Vibration */ - notification_vibration_type_e nvibration_type = - NOTIFICATION_VIBRATION_TYPE_NONE; - const char *nvibration_path = NULL; - - notification_get_vibration(noti, &nvibration_type, &nvibration_path); - DBG("notification vibration: %d, %s", nvibration_type, nvibration_path); - switch (nvibration_type) { - case NOTIFICATION_VIBRATION_TYPE_USER_DATA: - case NOTIFICATION_VIBRATION_TYPE_DEFAULT: - feedback_play_type(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_GENERAL); - break; - case NOTIFICATION_VIBRATION_TYPE_MAX: - case NOTIFICATION_VIBRATION_TYPE_NONE: - break; - } -} - -static void _quickpanel_ticker_noti_detailed_changed_cb(void *data, notification_type_e type, notification_op *op_list, int num_op) -{ - notification_h noti = NULL; - notification_h noti_from_master = NULL; - int flags = 0; - int applist = NOTIFICATION_DISPLAY_APP_ALL; - int op_type = 0; - int priv_id = 0; - - INFO("_quickpanel_ticker_noti_changed_cb"); - - retif(op_list == NULL, ,"op_list is NULL"); - - if (num_op == 1) { - notification_op_get_data(op_list, NOTIFICATION_OP_DATA_TYPE, &op_type); - notification_op_get_data(op_list, NOTIFICATION_OP_DATA_PRIV_ID, &priv_id); - notification_op_get_data(op_list, NOTIFICATION_OP_DATA_NOTI, ¬i_from_master); - DBG("op_type:%d", op_type); - DBG("op_priv_id:%d", priv_id); - DBG("noti:%p", noti_from_master); - - if (op_type != NOTIFICATION_OP_INSERT && - op_type != NOTIFICATION_OP_UPDATE) { - return ; - } - if (noti_from_master == NULL) { - ERR("failed to get a notification from master"); - return ; - } - if (notification_clone(noti_from_master, ¬i) != NOTIFICATION_ERROR_NONE) { - ERR("failed to create a cloned notification"); - return ; - } - } - - retif(noti == NULL, ,"noti is NULL"); - - if (op_type == NOTIFICATION_OP_INSERT || op_type == NOTIFICATION_OP_UPDATE) { - INFO("playing notification sound"); - _quickpanel_noti_media_feedback(noti); - } - - notification_get_display_applist(noti, &applist); - if (!(applist & NOTIFICATION_DISPLAY_APP_TICKER)) { - INFO("displaying ticker option is off"); - notification_free(noti); - return ; - } - - /* Skip if previous ticker is still shown */ - if (g_ticker != NULL) { - _quickpanel_ticker_hide(NULL); - } - - /* Check tickernoti flag */ - notification_get_property(noti, &flags); - - if (flags & NOTIFICATION_PROP_DISABLE_TICKERNOTI) { - INFO("NOTIFICATION_PROP_DISABLE_TICKERNOTI"); - __ticker_only_noti_del(noti); - notification_free(noti); - } else if (applist & NOTIFICATION_DISPLAY_APP_TICKER) { - if (_is_lockscreen_launched()) { - ERR("lockscreen launched, creating a ticker canceled"); - notification_free(noti); - return; - } - - /* Display ticker */ - if (g_timer) - ecore_timer_del(g_timer); - - g_ticker = _quickpanel_ticker_create_tickernoti(noti); - if (g_ticker == NULL) { - ERR("Fail to create tickernoti"); - __ticker_only_noti_del(noti); - notification_free(noti); - return; - } - - g_timer = ecore_timer_add(QP_TICKER_DURATION, - _quickpanel_ticker_timeout_cb, noti); - - _quickpanel_ticker_win_rotated(data); - evas_object_show(g_ticker); - - evas_object_event_callback_add(g_ticker, EVAS_CALLBACK_SHOW, - _quickpanel_ticker_detail_show_cb, - g_ticker); - evas_object_event_callback_add(g_ticker, EVAS_CALLBACK_HIDE, - _quickpanel_ticker_detail_hide_cb, - noti); - } -} - -/***************************************************************************** - * - * Util functions - * - *****************************************************************************/ -static int quickpanel_ticker_init(void *data) -{ - struct appdata *ad = (struct appdata *)data; - - g_window = ad->win; - - notification_register_detailed_changed_cb(_quickpanel_ticker_noti_detailed_changed_cb, - data); - - return QP_OK; -} - -static int quickpanel_ticker_fini(void *data) -{ - _quickpanel_ticker_hide(NULL); - - return QP_OK; -} - -static int quickpanel_ticker_enter_hib(void *data) -{ - return QP_OK; -} - -static int quickpanel_ticker_leave_hib(void *data) -{ - return QP_OK; -} - -static void quickpanel_ticker_reflesh(void *data) -{ - retif(data == NULL, , "Invalid parameter!"); - - if (g_ticker != NULL) { - _quickpanel_ticker_win_rotated(data); - } -} diff --git a/daemon/page/page_base.c b/daemon/page/page_base.c new file mode 100644 index 0000000..59d6ab1 --- /dev/null +++ b/daemon/page/page_base.c @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "pager.h" +#include "pager_common.h" +#include "vi_manager.h" +#include "setting_utils.h" +#include "list_util.h" +#include "settings.h" +#include "settings_view_featured.h" +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif +#include "noti.h" + +#define FICKUP_TIME_LIMIT 150 +#define FICKUP_DISTANCE_LIMIT 160 + +static void _mapbuf_enable_set(Eina_Bool is_enable); +static void _content_resize(int width, int height, const char *signal); +static int _up_cb(void *event_info, void *data); +static int _down_cb(void *event_info, void *data); +static int _scroll_start_cb(void *event_info, void *data); +static int _scroll_done_cb(void *event_info, void *data); +static int _page_changed_cb(void *event_info, void *data); + +static struct info { + Evas_Object *mapbuf; + Evas_Object *view; + Evas_Object *view_scroller; + Evas_Object *view_box; + + int flick_press_x; + int flick_press_y; + int flick_available; + int flick_time; +} s_info = { + .mapbuf = NULL, + .view = NULL, + .view_scroller = NULL, + .view_box = NULL, + + .flick_press_x = 0, + .flick_press_y = 0, + .flick_available = 0, + .flick_time = 0, +}; + +static QP_Page_Handler page_handler = { + .status = 0, + .name = NULL, + /* func */ + .mapbuf_enable_set = _mapbuf_enable_set, + .content_resize = _content_resize, + .down_cb = _down_cb, + .up_cb = _up_cb, + .scroll_start_cb = _scroll_start_cb, + .scroll_done_cb = _scroll_done_cb, + .page_changed_cb = _page_changed_cb, +}; + +static void _mapbuf_enable_set(Eina_Bool is_enable) +{ + Evas_Coord y; + + if (s_info.mapbuf != NULL) { + elm_mapbuf_enabled_set(s_info.mapbuf, is_enable); + } + + if (is_enable) { + evas_object_geometry_get(s_info.view_scroller, NULL, &y, NULL, NULL); + evas_object_move(s_info.view, 0, y); + } +} + +static void _content_resize(int width, int height, const char *signal) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + + if (s_info.view != NULL) { + elm_object_signal_emit(s_info.view, signal, "prog"); + evas_object_size_hint_min_set(s_info.view, width, height); + } +} + +void static _flick_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int limit_h = 0; + int limit_partial_h = 0; + int limit_partial_w = 0; + Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *)event_info; + retif(ev == NULL, , "event_info is NULL"); + + s_info.flick_press_x = ev->canvas.x; + s_info.flick_press_y = ev->canvas.y; + s_info.flick_time = ev->timestamp; + + quickpanel_noti_get_geometry(&limit_h, &limit_partial_h, &limit_partial_w); + + if (s_info.flick_press_y > limit_h) { + s_info.flick_available = 1; + } else { + if (s_info.flick_press_x > limit_partial_w && s_info.flick_press_y > limit_partial_h) { + s_info.flick_available = 1; + } else { + s_info.flick_available = 0; + } + } +} + +static void _flick_mouse_move_cb(void* data, Evas* e, Evas_Object* obj, void* event_info) +{ + int delta_y = 0; + Evas_Event_Mouse_Move* ev = event_info; + retif(ev == NULL, , "event_info is NULL"); + + if (s_info.flick_available == 0) { + return; + } + if (ev->cur.output.y > ev->prev.output.y) { + s_info.flick_available = 0; + return; + } + if (abs(ev->cur.output.x - ev->prev.output.x) > 40) { + s_info.flick_available = 0; + return; + } + if (ev->timestamp - s_info.flick_time > FICKUP_TIME_LIMIT) { + s_info.flick_available = 0; + return; + } + + delta_y = s_info.flick_press_y - ev->cur.output.y; + + if (delta_y > FICKUP_DISTANCE_LIMIT) { + ERR("closed by flick up base area"); + quickpanel_uic_close_quickpanel(false, 0); + } +} + +static int _up_cb(void *event_info, void *data) +{ + quickpanel_page_scroll_hold_set(EINA_TRUE); + quickpanel_page_scroll_freeze_set(EINA_FALSE); + + return QP_OK; +} + +static int _down_cb(void *event_info, void *data) +{ + int x = 0, y = 0; + static int settings_y = -1, settings_h = -1; + +#ifdef QP_EMERGENCY_MODE_ENABLE + if (quickpanel_emergency_mode_is_on()) { + return QP_OK; + } +#endif + + if (settings_y == -1 || settings_h == -1) { + Evas_Object *obj_settings = NULL; + struct appdata *ad = quickpanel_get_app_data(); + if (ad != NULL && ad->ly != NULL) { + obj_settings = quickpanel_setting_box_get(ad->ly); + if (obj_settings != NULL) { + evas_object_geometry_get(obj_settings, NULL, &settings_y, NULL, &settings_h); + } + } + } + + quickpanel_page_get_touched_pos(&x, &y); + + if (y >= settings_y && y <= settings_y + settings_h) { + if (quickpanel_settings_is_in_left_edge() == EINA_TRUE) { + quickpanel_page_scroll_hold_set(EINA_FALSE); + } + } else { + quickpanel_page_scroll_freeze_set(EINA_TRUE); + } + + return QP_OK; +} + +static int _scroll_start_cb(void *event_info, void *data) +{ + quickpanel_vim_set_state_suspend(); + + return QP_OK; +} + +static int _scroll_done_cb(void *event_info, void *data) +{ + quickpanel_vim_set_state_ready(); + + return QP_OK; +} + +static int _page_changed_cb(void *event_info, void *data) +{ + quickpanel_setting_view_featured_initial_focus_set(); + + return QP_OK; +} + +HAPI Evas_Object *quickpanel_page_base_create(Evas_Object *parent, void *data) +{ + Evas_Object *mapbuf = NULL; + Evas_Object *view = NULL; + + retif(parent == NULL, NULL, "invalid parameter"); + + if (s_info.view != NULL) { + return s_info.view; + } + + mapbuf = elm_mapbuf_add(parent); + elm_mapbuf_enabled_set(mapbuf, EINA_FALSE); + elm_mapbuf_smooth_set(mapbuf, EINA_FALSE); + + evas_object_size_hint_weight_set(mapbuf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(mapbuf, EVAS_HINT_FILL, EVAS_HINT_FILL); + + view = quickpanel_uic_load_edj(mapbuf, DEFAULT_EDJ, "quickpanel/base", 0); + retif(view == NULL, NULL, "failed to load base layout"); + + Evas_Object *scroller = elm_scroller_add(parent); + retif(!scroller, NULL, "fail to add scroller"); + //elm_object_style_set(scroller, "default"); + elm_object_style_set(scroller, "bg/default"); + elm_scroller_bounce_set(scroller, EINA_TRUE, EINA_TRUE); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(scroller); + + Evas_Object *box = elm_box_add(scroller); + if (!box) { + ERR("fail to add box"); + if (scroller != NULL) { + evas_object_del(scroller); + scroller = NULL; + } + return NULL; + } + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0); + elm_box_horizontal_set(box, EINA_FALSE); + + elm_object_content_set(scroller, box); + elm_object_part_content_set(view, "qp.base.list.swallow", scroller); + evas_object_show(scroller); + + Evas_Object *bg_touch = elm_bg_add(view); + if (bg_touch != NULL) { + //evas_object_color_set(bg_touch, 255, 255, 255, 250); + evas_object_color_set(bg_touch, 0, 0, 0, 0); + evas_object_event_callback_add(bg_touch, + EVAS_CALLBACK_MOUSE_DOWN, _flick_mouse_down_cb, NULL); + evas_object_event_callback_add(bg_touch, + EVAS_CALLBACK_MOUSE_MOVE, _flick_mouse_move_cb, NULL); + elm_object_part_content_set(view, "background.touch", bg_touch); + } + + + quickpanel_page_handler_set(mapbuf, &page_handler); + + elm_object_content_set(mapbuf, view); + evas_object_show(mapbuf); + + + s_info.mapbuf = mapbuf; + s_info.view = view; + s_info.view_scroller = scroller; + s_info.view_box = box; + +#ifdef QP_EMERGENCY_MODE_ENABLE + if (quickpanel_emergency_mode_is_on()) { + quickpanel_page_scroll_freeze_set(EINA_TRUE); + } +#endif + + return s_info.mapbuf; +} + +HAPI Evas_Object *quickpanel_page_base_view_get(const char *view_name) +{ + retif(view_name == NULL, NULL, "invalid parameter"); + + if (strcmp(view_name, "LAYOUT") == 0) { + return s_info.view; + } else if (strcmp(view_name, "SCROLLER") == 0) { + return s_info.view_scroller; + } else if (strcmp(view_name, "BOX") == 0) { + return s_info.view_box; + } + + return NULL; +} + +HAPI void quickpanel_page_base_focus_allow_set(Eina_Bool is_enable) +{ + elm_object_tree_focus_allow_set(s_info.mapbuf, is_enable); +} diff --git a/daemon/page/page_base.h b/daemon/page/page_base.h new file mode 100644 index 0000000..d2b1278 --- /dev/null +++ b/daemon/page/page_base.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __QUICKPANEL_PAGE_BASE_H__ +#define __QUICKPANEL_PAGE_BASE_H__ + +#include "quickpanel-ui.h" +#include "common.h" + +Evas_Object *quickpanel_page_base_create(Evas_Object *parent, void *data); +Evas_Object *quickpanel_page_base_view_get(const char *view_name); +void quickpanel_page_base_focus_allow_set(Eina_Bool is_enable); + +#endif diff --git a/daemon/page/page_edit.c b/daemon/page/page_edit.c new file mode 100644 index 0000000..d83a740 --- /dev/null +++ b/daemon/page/page_edit.c @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include "pager.h" +#include "pager_common.h" +#include "vi_manager.h" +#include "settings_gridbox.h" +#include "quickpanel_def.h" + +static void _mapbuf_enable_set(Eina_Bool is_enable); +static void _content_resize(int width, int height, const char *signal); +static int _up_cb(void *event_info, void *data); +static int _down_cb(void *event_info, void *data); +static int _scroll_start_cb(void *event_info, void *data); +static int _scroll_done_cb(void *event_info, void *data); + +static struct info { + int is_scroll_freezed; + Evas_Object *mapbuf; + Evas_Object *view; + Evas_Object *scroller; + Evas_Object *layout; + Evas_Object *view_section_1; + Evas_Object *view_section_2; + Evas_Object *view_active_buttons; + Evas_Object *view_reserved_buttons; +} s_info = { + .is_scroll_freezed = 0, + .mapbuf = NULL, + .view = NULL, + .scroller = NULL, + .layout = NULL, + .view_section_1 = NULL, + .view_section_2 = NULL, + .view_active_buttons = NULL, + .view_reserved_buttons = NULL, +}; + +static QP_Page_Handler page_handler = { + .status = 0, + .name = NULL, + + .mapbuf_enable_set = _mapbuf_enable_set, + .content_resize = _content_resize, + .down_cb = _down_cb, + .up_cb = _up_cb, + .scroll_start_cb = _scroll_start_cb, + .scroll_done_cb = _scroll_done_cb, +}; + +static inline void _scroll_hold(Evas_Object *viewer) +{ + int hold_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + hold_count = elm_object_scroll_hold_get(viewer); + + if (hold_count <= 0) { + elm_object_scroll_hold_push(viewer); + } +} + +static inline void _scroll_unhold(Evas_Object *viewer) +{ + int i = 0, hold_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + hold_count = elm_object_scroll_hold_get(viewer); + + for (i = 0 ; i < hold_count; i++) { + elm_object_scroll_hold_pop(viewer); + } +} + +static void _mapbuf_enable_set(Eina_Bool is_enable) +{ + Evas_Coord y; + + if (s_info.mapbuf != NULL) { + elm_mapbuf_enabled_set(s_info.mapbuf, is_enable); + } + + if (is_enable) { + evas_object_geometry_get(s_info.mapbuf, NULL, &y, NULL, NULL); + evas_object_move(s_info.view, 0, y); + } +} + +static void _content_resize(int width, int height, const char *signal) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + + if (s_info.view != NULL) { + elm_object_signal_emit(s_info.view, signal, "prog"); + evas_object_size_hint_min_set(s_info.view, ELM_SCALE_SIZE(width), ELM_SCALE_SIZE(height)); + } + if (s_info.layout != NULL) { + elm_object_signal_emit(s_info.layout, signal, "prog"); + if (strcmp(signal, "portrait") == 0) { + evas_object_size_hint_min_set(s_info.layout, ELM_SCALE_SIZE(width), ELM_SCALE_SIZE(height)); + } else { + evas_object_size_hint_min_set(s_info.layout, ELM_SCALE_SIZE(width), ELM_SCALE_SIZE(height) + (ad->scale * 100)); + } + + } +} + +static int _up_cb(void *event_info, void *data) +{ + if (s_info.is_scroll_freezed == 0) { + quickpanel_page_scroll_hold_set(EINA_TRUE); + } + quickpanel_vim_set_state_ready(); + + return QP_OK; +} + +static int _down_cb(void *event_info, void *data) +{ + if (s_info.is_scroll_freezed == 0) { + quickpanel_page_scroll_hold_set(EINA_FALSE); + } + + return QP_OK; +} + +static int _scroll_start_cb(void *event_info, void *data) +{ + return QP_OK; +} + +static int _scroll_done_cb(void *event_info, void *data) +{ + quickpanel_vim_set_state_suspend(); + + return QP_OK; +} + +static void _deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + DBG("deleted view"); + if (s_info.view_active_buttons != NULL) { + quickpanel_settings_gridbox_remove(s_info.view_active_buttons); + } + if (s_info.view_reserved_buttons != NULL) { + quickpanel_settings_gridbox_remove(s_info.view_reserved_buttons); + } + if (s_info.view_section_2 != NULL) { + evas_object_del(s_info.view_section_2); + } + if (s_info.view_section_1 != NULL) { + evas_object_del(s_info.view_section_1); + } + if (s_info.layout != NULL) { + evas_object_del(s_info.layout); + } + if (s_info.scroller != NULL) { + evas_object_del(s_info.scroller); + } + if (s_info.view != NULL) { + evas_object_del(s_info.view); + } + + s_info.mapbuf = NULL; + s_info.view = NULL; + s_info.scroller = NULL; + s_info.layout = NULL; + s_info.view_section_1 = NULL; + s_info.view_section_2 = NULL; + s_info.view_active_buttons = NULL; + s_info.view_reserved_buttons = NULL; +} + +HAPI Evas_Object *quickpanel_page_edit_create(Evas_Object *parent, void *data) +{ + Evas_Object *mapbuf = NULL; + Evas_Object *view = NULL; + Evas_Object *scroller = NULL; + Evas_Object *layout = NULL; + + retif(parent == NULL, NULL, "invalid parameter"); + + if (s_info.view == NULL) { + mapbuf = elm_mapbuf_add(parent); + elm_mapbuf_enabled_set(mapbuf, EINA_FALSE); + elm_mapbuf_smooth_set(mapbuf, EINA_FALSE); + + view = quickpanel_uic_load_edj(mapbuf, DEFAULT_EDJ, "quickpanel/page_edit_base", 0); + retif(view == NULL, NULL, "failed to load editing layout"); + + scroller = elm_scroller_add(view); + retif(!scroller, NULL, "fail to add scroller"); + elm_object_style_set(scroller, "list_effect"); + elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(scroller); + + layout = quickpanel_uic_load_edj(scroller, DEFAULT_EDJ, "quickpanel/page_edit", 0); + retif(layout == NULL, NULL, "failed to load editing layout"); + + quickpanel_page_handler_set(mapbuf, &page_handler); + evas_object_event_callback_add(mapbuf, EVAS_CALLBACK_DEL, _deleted_cb, NULL); + + elm_object_content_set(scroller, layout); + elm_object_part_content_set(view, "object.layout", scroller); + + elm_object_content_set(mapbuf, view); + evas_object_show(mapbuf); + + s_info.mapbuf = mapbuf; + s_info.view = view; + s_info.scroller = scroller; + s_info.layout = layout; + + elm_object_tree_focus_allow_set(s_info.mapbuf, EINA_FALSE); + } + + return s_info.mapbuf; +} + +HAPI Evas_Object *quickpanel_page_edit_view_get(const char *view_name) +{ + retif(view_name == NULL, NULL, "invalid parameter"); + + if (strcmp(view_name, "VIEW") == 0) { + return s_info.view; + } else if (strcmp(view_name, "LAYOUT") == 0) { + return s_info.layout; + } else if (strcmp(view_name, "SECTION.1") == 0) { + return s_info.view_section_1; + } else if (strcmp(view_name, "SECTION.2") == 0) { + return s_info.view_section_2; + } else if (strcmp(view_name, "ACTIVE.BUTTONS") == 0) { + return s_info.view_active_buttons; + } else if (strcmp(view_name, "RESERVED.BUTTONS") == 0) { + return s_info.view_reserved_buttons; + } + + return NULL; +} + +HAPI void quickpanel_page_edit_view_set(const char *view_name, Evas_Object *view) +{ + retif(s_info.view == NULL, , "invalid parameter"); + retif(s_info.layout == NULL, , "invalid parameter"); + retif(view_name == NULL, , "invalid parameter"); + retif(view == NULL, , "invalid parameter"); + + if (strcmp(view_name, "SECTION.1") == 0) { + elm_object_part_content_set(s_info.layout, "object.section.1", view); + s_info.view_section_1 = view; + } else if (strcmp(view_name, "SECTION.2") == 0) { + elm_object_part_content_set(s_info.layout, "object.section.2", view); + s_info.view_section_2 = view; + } else if (strcmp(view_name, "ACTIVE.BUTTONS") == 0) { + elm_object_part_content_set(s_info.layout, "object.active.buttons", view); + s_info.view_active_buttons = view; + } else if (strcmp(view_name, "RESERVED.BUTTONS") == 0) { + elm_object_part_content_set(s_info.layout, "object.reserved.buttons", view); + s_info.view_reserved_buttons = view; + } +} + +HAPI void quickpanel_page_edit_freeze_set(Eina_Bool is_freeze) +{ + if (is_freeze == EINA_TRUE) { + s_info.is_scroll_freezed = 1; + quickpanel_page_scroll_freeze_set(EINA_TRUE); + _scroll_hold(s_info.scroller); + } else { + s_info.is_scroll_freezed = 0; + quickpanel_page_scroll_freeze_set(EINA_FALSE); + _scroll_unhold(s_info.scroller); + } +} + +HAPI Eina_Bool quickpanel_page_edit_is_page_showed(void) +{ + if (quickpanel_pager_current_page_get() == PAGE_IDX_EDITING) { + return EINA_TRUE; + } + + return EINA_FALSE; +} diff --git a/daemon/page/page_edit.h b/daemon/page/page_edit.h new file mode 100644 index 0000000..eb6d64f --- /dev/null +++ b/daemon/page/page_edit.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __QUICKPANEL_PAGE_EDIT_H__ +#define __QUICKPANEL_PAGE_EDIT_H__ + +#include "quickpanel-ui.h" +#include "common.h" + +Evas_Object *quickpanel_page_edit_create(Evas_Object *parent, void *data); +Evas_Object *quickpanel_page_edit_view_get(const char *view_name); +void quickpanel_page_edit_view_set(const char *view_name, Evas_Object *view); +void quickpanel_page_edit_freeze_set(Eina_Bool is_freeze); +Eina_Bool quickpanel_page_edit_is_page_showed(void); + +#endif diff --git a/daemon/page/page_setting_all.c b/daemon/page/page_setting_all.c new file mode 100644 index 0000000..841ea1f --- /dev/null +++ b/daemon/page/page_setting_all.c @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include "pager.h" +#include "pager_common.h" +#include "vi_manager.h" +#include "settings_gridbox.h" +#include "settings_view_all.h" +#include "quickpanel_def.h" + +static void _mapbuf_enable_set(Eina_Bool is_enable); +static void _content_resize(int width, int height, const char *signal); +static int _up_cb(void *event_info, void *data); +static int _down_cb(void *event_info, void *data); +static int _scroll_start_cb(void *event_info, void *data); +static int _scroll_done_cb(void *event_info, void *data); +static int _page_changed_cb(void *event_info, void *data); + +static struct info { + int is_scroll_freezed; + Evas_Object *mapbuf; + Evas_Object *view; + Evas_Object *scroller; + Evas_Object *layout; + Evas_Object *view_section_1; + Evas_Object *view_active_buttons; +} s_info = { + .is_scroll_freezed = 0, + .mapbuf = NULL, + .view = NULL, + .scroller = NULL, + .layout = NULL, + .view_section_1 = NULL, + .view_active_buttons = NULL, +}; + +static QP_Page_Handler page_handler = { + .status = 0, + .name = NULL, + + .mapbuf_enable_set = _mapbuf_enable_set, + .content_resize = _content_resize, + .down_cb = _down_cb, + .up_cb = _up_cb, + .scroll_start_cb = _scroll_start_cb, + .scroll_done_cb = _scroll_done_cb, + .page_changed_cb = _page_changed_cb, +}; + +static inline void _scroll_hold(Evas_Object *viewer) +{ + int hold_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + hold_count = elm_object_scroll_hold_get(viewer); + + if (hold_count <= 0) { + elm_object_scroll_hold_push(viewer); + } +} + +static inline void _scroll_unhold(Evas_Object *viewer) +{ + int i = 0, hold_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + hold_count = elm_object_scroll_hold_get(viewer); + + for (i = 0 ; i < hold_count; i++) { + elm_object_scroll_hold_pop(viewer); + } +} + +static void _mapbuf_enable_set(Eina_Bool is_enable) +{ + Evas_Coord y; + + if (s_info.mapbuf != NULL) { + elm_mapbuf_enabled_set(s_info.mapbuf, is_enable); + } + + if (is_enable) { + evas_object_geometry_get(s_info.mapbuf, NULL, &y, NULL, NULL); + evas_object_move(s_info.view, 0, y); + } +} + +static void _content_resize(int width, int height, const char *signal) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + + if (s_info.view != NULL) { + elm_object_signal_emit(s_info.view, signal, "prog"); + evas_object_size_hint_min_set(s_info.view, ELM_SCALE_SIZE(width), ELM_SCALE_SIZE(height)); + } + if (s_info.layout != NULL) { + elm_object_signal_emit(s_info.layout, signal, "prog"); + if (strcmp(signal, "portrait") == 0) { + evas_object_size_hint_min_set(s_info.layout, ELM_SCALE_SIZE(width), ELM_SCALE_SIZE(height)); + } else { + evas_object_size_hint_min_set(s_info.layout, ELM_SCALE_SIZE(width), ELM_SCALE_SIZE(height)); + } + } +} + +static int _up_cb(void *event_info, void *data) +{ + if (s_info.is_scroll_freezed == 0) { + quickpanel_page_scroll_hold_set(EINA_TRUE); + } + + return QP_OK; +} + +static int _down_cb(void *event_info, void *data) +{ + if (s_info.is_scroll_freezed == 0) { + quickpanel_page_scroll_hold_set(EINA_FALSE); + } + + return QP_OK; +} + +static int _scroll_start_cb(void *event_info, void *data) +{ + return QP_OK; +} + +static int _scroll_done_cb(void *event_info, void *data) +{ + quickpanel_vim_set_state_suspend(); + + return QP_OK; +} + +static int _page_changed_cb(void *event_info, void *data) +{ + return QP_OK; +} + +static void _deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + DBG("deleted view"); + if (s_info.view_active_buttons != NULL) { + quickpanel_settings_gridbox_remove(s_info.view_active_buttons); + } + if (s_info.view_section_1 != NULL) { + evas_object_del(s_info.view_section_1); + } + if (s_info.layout != NULL) { + evas_object_del(s_info.layout); + } + if (s_info.scroller != NULL) { + evas_object_del(s_info.scroller); + } + if (s_info.view != NULL) { + evas_object_del(s_info.view); + } + + s_info.mapbuf = NULL; + s_info.view = NULL; + s_info.scroller = NULL; + s_info.layout = NULL; + s_info.view_section_1 = NULL; + s_info.view_active_buttons = NULL; +} + +HAPI Evas_Object *quickpanel_page_setting_all_create(Evas_Object *parent, void *data) +{ + Evas_Object *mapbuf = NULL; + Evas_Object *view = NULL; + Evas_Object *scroller = NULL; + Evas_Object *layout = NULL; + + retif(parent == NULL, NULL, "invalid parameter"); + + if (s_info.view == NULL) { + mapbuf = elm_mapbuf_add(parent); + elm_mapbuf_enabled_set(mapbuf, EINA_FALSE); + elm_mapbuf_smooth_set(mapbuf, EINA_FALSE); + + view = quickpanel_uic_load_edj(mapbuf, DEFAULT_EDJ, "quickpanel/page_setting_all_base", 0); + retif(view == NULL, NULL, "failed to load editing layout"); + + scroller = elm_scroller_add(view); + retif(!scroller, NULL, "fail to add scroller"); + elm_object_style_set(scroller, "list_effect"); + elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(scroller); + + layout = quickpanel_uic_load_edj(scroller, DEFAULT_EDJ, "quickpanel/page_setting_all", 0); + retif(layout == NULL, NULL, "failed to load editing layout"); + + quickpanel_page_handler_set(mapbuf, &page_handler); + evas_object_event_callback_add(mapbuf, EVAS_CALLBACK_DEL, _deleted_cb, NULL); + + elm_object_content_set(scroller, layout); + elm_object_part_content_set(view, "object.layout", scroller); + + elm_object_content_set(mapbuf, view); + evas_object_show(mapbuf); + + s_info.mapbuf = mapbuf; + s_info.view = view; + s_info.scroller = scroller; + s_info.layout = layout; + } + + return s_info.mapbuf; +} + +HAPI Evas_Object *quickpanel_page_setting_all_view_get(const char *view_name) +{ + retif(view_name == NULL, NULL, "invalid parameter"); + + if (strcmp(view_name, "VIEW") == 0) { + return s_info.view; + } else if (strcmp(view_name, "LAYOUT") == 0) { + return s_info.layout; + } else if (strcmp(view_name, "SECTION.1") == 0) { + return s_info.view_section_1; + } else if (strcmp(view_name, "ACTIVE.BUTTONS") == 0) { + return s_info.view_active_buttons; + } + + return NULL; +} + +HAPI void quickpanel_page_setting_all_view_set(const char *view_name, Evas_Object *view) +{ + retif(s_info.view == NULL, , "invalid parameter"); + retif(s_info.layout == NULL, , "invalid parameter"); + retif(view_name == NULL, , "invalid parameter"); + retif(view == NULL, , "invalid parameter"); + + if (strcmp(view_name, "SECTION.1") == 0) { + elm_object_part_content_set(s_info.layout, "object.section.1", view); + s_info.view_section_1 = view; + } else if (strcmp(view_name, "ACTIVE.BUTTONS") == 0) { + elm_object_part_content_set(s_info.layout, "object.active.buttons", view); + s_info.view_active_buttons = view; + } +} + +HAPI void quickpanel_page_setting_all_freeze_set(Eina_Bool is_freeze) +{ + if (is_freeze == EINA_TRUE) { + s_info.is_scroll_freezed = 1; + quickpanel_page_scroll_freeze_set(EINA_TRUE); + _scroll_hold(s_info.scroller); + } else { + s_info.is_scroll_freezed = 0; + quickpanel_page_scroll_freeze_set(EINA_FALSE); + _scroll_unhold(s_info.scroller); + } +} + +HAPI Eina_Bool quickpanel_page_setting_all_is_page_showed(void) +{ + if (quickpanel_pager_current_page_get() == PAGE_IDX_EDITING) { + return EINA_TRUE; + } + + return EINA_FALSE; +} + +HAPI void quickpanel_page_setting_all_focus_allow_set(Eina_Bool is_enable) +{ + elm_object_tree_focus_allow_set(s_info.mapbuf, is_enable); +} diff --git a/daemon/page/page_setting_all.h b/daemon/page/page_setting_all.h new file mode 100644 index 0000000..9096ef0 --- /dev/null +++ b/daemon/page/page_setting_all.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __QUICKPANEL_PAGE_SETTING_ALL_H__ +#define __QUICKPANEL_PAGE_SETTING_ALL_H__ + +#include "quickpanel-ui.h" +#include "common.h" + +Evas_Object *quickpanel_page_setting_all_create(Evas_Object *parent, void *data); +Evas_Object *quickpanel_page_setting_all_view_get(const char *view_name); +void quickpanel_page_setting_all_view_set(const char *view_name, Evas_Object *view); +void quickpanel_page_setting_all_freeze_set(Eina_Bool is_freeze); +Eina_Bool quickpanel_page_setting_all_is_page_showed(void); +void quickpanel_page_setting_all_focus_allow_set(Eina_Bool is_enable); + +#endif diff --git a/daemon/page/pager.c b/daemon/page/pager.c new file mode 100644 index 0000000..7ce9540 --- /dev/null +++ b/daemon/page/pager.c @@ -0,0 +1,559 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include "pager.h" +#include "pager_common.h" +#include "quickpanel_def.h" + +static int _init(void *data); +static void _init_job_cb(void *data); +static int _fini(void *data); +static int _resume(void *data); +static void _opened(void *data); +static void _closed(void *data); +static void _refresh(void *data); +static inline void _page_mapbuf_enable_set(Evas_Object *box, int is_enable); + +#define ENABLE_MAPBUF 0 + +typedef enum _qp_pager_state_type { + PAGER_STATE_NOT_READY = 0, + PAGER_STATE_IDLE, + PAGER_STATE_WILL_SCROLL, + PAGER_STATE_SCROLLING, + PAGER_STATE_FINISHED_SCROLLING, +} qp_pager_state_type; + +QP_Module pager = { + .name = "pager", + .init = _init, + .init_job_cb = _init_job_cb, + .fini = _fini, + .resume = _resume, + .qp_opened = _opened, + .qp_closed = _closed, + .refresh = _refresh, +}; + +static struct info { + qp_pager_state_type state; + int last_page; + int is_in_edge; + + Evas_Object *view_scroller; + Evas_Object *view_box; + + Ecore_Event_Handler *hdl_move; + Ecore_Event_Handler *hdl_up; + Ecore_Event_Handler *hdl_down; + + Ecore_Timer *timer_scroll_adj; + + int scroll_start_from; +} s_info = { + .state = PAGER_STATE_NOT_READY, + .last_page = PAGE_IDX_MAIN, + .is_in_edge = 0, + + .view_scroller = NULL, + .view_box = NULL, + + .hdl_move = NULL, + .hdl_up = NULL, + .hdl_down = NULL, + + .timer_scroll_adj = NULL, + + .scroll_start_from = -1, +}; + +static inline void _set_state(qp_pager_state_type state) +{ + if (state == PAGER_STATE_IDLE) { + _page_mapbuf_enable_set(s_info.view_box, 0); + } else if (state == PAGER_STATE_WILL_SCROLL || state == PAGER_STATE_SCROLLING) { + _page_mapbuf_enable_set(s_info.view_box, 1); + } + s_info.state = state; +} + +static inline qp_pager_state_type _get_state(void) +{ + return s_info.state; +} + +static inline int _last_page_get(void) +{ + return s_info.last_page; +} + +static inline void _page_show(int page_index) +{ + elm_scroller_page_show(s_info.view_scroller, page_index, 0); + s_info.last_page = page_index; +} + +static Eina_Bool _page_adjust_timer_cb(void *data) +{ + int index = 0; + + if (s_info.timer_scroll_adj != NULL) { + ecore_timer_del(s_info.timer_scroll_adj); + s_info.timer_scroll_adj = NULL; + } + + elm_scroller_current_page_get(s_info.view_scroller, &index, NULL); + elm_scroller_page_bring_in(s_info.view_scroller, index, 0); + s_info.last_page = index; + + return ECORE_CALLBACK_CANCEL; +} + +static inline void _page_adjust(int is_use_timer) +{ + if (s_info.timer_scroll_adj != NULL) { + ecore_timer_del(s_info.timer_scroll_adj); + s_info.timer_scroll_adj = NULL; + } + + if (is_use_timer) { + s_info.timer_scroll_adj = ecore_timer_add(0.1, _page_adjust_timer_cb, NULL); + } else { + _page_adjust_timer_cb(NULL); + } +} + +static inline int _current_page_index_get(void) +{ + int index = 0; + + elm_scroller_current_page_get(s_info.view_scroller, &index, NULL); + + return index; +} + +static inline Evas_Object *_current_page_get(void) +{ + int index = 0; + int list_cnt = 0; + Eina_List *list = NULL; + static int last_page = -1; + Evas_Object *obj = NULL; + + elm_scroller_current_page_get(s_info.view_scroller, &index, NULL); + + if (last_page != index) { + DBG("current selected page:%d", index); + last_page = index; + } + + list = elm_box_children_get(s_info.view_box); + if (list != NULL) { + list_cnt = eina_list_count(list); + + if (index < list_cnt) { + obj = (Evas_Object *)eina_list_nth(list, index); + } + eina_list_free(list); + } + + return obj; +} + +#if ENABLE_MAPBUF +static void _mapbuf_job_cb(void *data) +{ + Eina_List *list = NULL; + Eina_List *l; + Eina_List *l_next; + Evas_Object *box = s_info.view_box; + Evas_Object *item = NULL; + int is_enable = (int)data; + QP_Page_Handler *page_handler = NULL; + retif(box == NULL, , "invalid parameter"); + + list = elm_box_children_get(box); + retif(list == NULL, , "empty box"); + + SDBG("mapbuf enable:%d", is_enable); + + EINA_LIST_FOREACH_SAFE(list, l, l_next, item) { + page_handler = quickpanel_page_handler_get(item); + if (page_handler != NULL) { + if (page_handler->mapbuf_enable_set != NULL) { + if (elm_config_access_get() == EINA_FALSE) { + if (is_enable == 1) { + page_handler->mapbuf_enable_set(EINA_TRUE); + } else { + page_handler->mapbuf_enable_set(EINA_FALSE); + } + } else { + page_handler->mapbuf_enable_set(EINA_FALSE); + } + } + } + } + + eina_list_free(list); +} +#endif + +static inline void _page_mapbuf_enable_set(Evas_Object *box, int is_enable) +{ +#if ENABLE_MAPBUF + ecore_job_add(_mapbuf_job_cb, (void *)is_enable); +#endif +} + +static inline void _page_resize(Evas_Object *box, int width, int height, const char *signal) +{ + Eina_List *list = NULL; + Eina_List *l; + Eina_List *l_next; + Evas_Object *item = NULL; + QP_Page_Handler *page_handler = NULL; + retif(box == NULL, , "invalid parameter"); + + list = elm_box_children_get(box); + retif(list == NULL, , "empty box"); + + EINA_LIST_FOREACH_SAFE(list, l, l_next, item) { + page_handler = quickpanel_page_handler_get(item); + + if (page_handler != NULL) { + if (page_handler->content_resize != NULL) { + page_handler->content_resize(width, height, signal); + } + } + } + + eina_list_free(list); +} + +static inline void _page_rotation(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, , "Invalid parameter!"); + + if (ad->angle == 90 || ad->angle == 270) { + _page_resize(s_info.view_box, ad->win_height, ad->win_width - ELM_SCALE_SIZE((QP_DATE_H + QP_HANDLE_H)), "landscape"); + } else { + _page_resize(s_info.view_box, ad->win_width, ad->win_height - ELM_SCALE_SIZE((QP_DATE_H + QP_HANDLE_H)), "portrait"); + } +} + +static Eina_Bool _up_cb(void *data, int type, void *event) +{ + Evas_Object *page = _current_page_get(); + QP_Page_Handler *page_handler = NULL; + retif(page == NULL, EINA_FALSE, "Invalid parameter!"); + + if (_get_state() == PAGER_STATE_WILL_SCROLL) { + _set_state(PAGER_STATE_SCROLLING); + _page_adjust(1); + } + + page_handler = quickpanel_page_handler_get(page); + retif(page_handler == NULL, EINA_FALSE, "no page handler found"); + + if (page_handler->up_cb != NULL) { + page_handler->up_cb(event, NULL); + } + + if (_get_state() == PAGER_STATE_SCROLLING) { + _page_adjust(1); + } + + return EINA_TRUE; +} + +static Eina_Bool _down_cb(void *data, int type, void *event) +{ + Evas_Object *page = _current_page_get(); + QP_Page_Handler *page_handler = NULL; + retif(page == NULL, EINA_FALSE, "Invalid parameter!"); + + page_handler = quickpanel_page_handler_get(page); + retif(page_handler == NULL, EINA_FALSE, "no page handler found"); + + if (page_handler->down_cb != NULL) { + page_handler->down_cb(event, NULL); + } + + return EINA_TRUE; +} + +static void _scroller_anim_start_cb(void *data, Evas_Object *scroller, void *event_info) +{ + Evas_Object *page = _current_page_get(); + QP_Page_Handler *page_handler = NULL; + retif(page == NULL, , "Invalid parameter!"); + + s_info.scroll_start_from = _current_page_index_get(); + + if (_get_state() == PAGER_STATE_IDLE) { + _set_state(PAGER_STATE_WILL_SCROLL); + + page_handler = quickpanel_page_handler_get(page); + retif(page_handler == NULL, , "no page handler found"); + + if (page_handler->scroll_start_cb != NULL) { + page_handler->scroll_start_cb(event_info, NULL); + } + } +} + +static void _scroller_anim_stop_cb(void *data, Evas_Object *scroller, void *event_info) +{ + Evas_Object *page = _current_page_get(); + QP_Page_Handler *page_handler = NULL; + retif(page == NULL, , "Invalid parameter!"); + + if (s_info.is_in_edge == 1 || _get_state() == PAGER_STATE_FINISHED_SCROLLING) { + _set_state(PAGER_STATE_IDLE); + + page_handler = quickpanel_page_handler_get(page); + retif(page_handler == NULL, , "no page handler found"); + + if (page_handler->scroll_done_cb != NULL) { + page_handler->scroll_done_cb(event_info, NULL); + } + + _page_mapbuf_enable_set(s_info.view_box, 0); + } +} + +static void _scroller_edge_cb(void *data, Evas_Object *scroller, void *event_info) +{ + if (_get_state() == PAGER_STATE_WILL_SCROLL + || _get_state() == PAGER_STATE_SCROLLING) { + _set_state(PAGER_STATE_FINISHED_SCROLLING); + s_info.is_in_edge = 1; + _page_adjust(0); + } +} + +static void _scroller_scroll_cb(void *data, Evas_Object *scroller, void *event_info) +{ + s_info.is_in_edge = 0; +} + +/***************************************************************************** + * + * Util functions + * + *****************************************************************************/ +static int _init(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + retif(s_info.view_scroller == NULL, QP_FAIL, "Invalid parameter!"); + + s_info.hdl_up = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _up_cb + , s_info.view_scroller); + s_info.hdl_down = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _down_cb + , s_info.view_scroller); + + evas_object_smart_callback_add(s_info.view_scroller, "scroll,drag,start", + _scroller_anim_start_cb, s_info.view_scroller); + evas_object_smart_callback_add(s_info.view_scroller, "scroll,anim,stop", + _scroller_anim_stop_cb, s_info.view_scroller); + evas_object_smart_callback_add(s_info.view_scroller, "scroll,drag,stop", + _scroller_anim_stop_cb, s_info.view_scroller); + evas_object_smart_callback_add(s_info.view_scroller, "scroll", + _scroller_scroll_cb, s_info.view_scroller); + + evas_object_smart_callback_add(s_info.view_scroller, "edge,left", + _scroller_edge_cb, s_info.view_scroller); + evas_object_smart_callback_add(s_info.view_scroller, "edge,right", + _scroller_edge_cb, s_info.view_scroller); + + _set_state(PAGER_STATE_IDLE); + + return QP_OK; +} + +static void _init_job_cb(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, , "Invalid parameter!"); + retif(s_info.view_scroller == NULL, , "Invalid parameter!"); + + _page_rotation(ad); + + _page_show(PAGE_IDX_MAIN); + evas_object_show(s_info.view_scroller); +} + +static int _fini(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + if (s_info.hdl_up != NULL) { + ecore_event_handler_del(s_info.hdl_up); + } + if (s_info.hdl_down != NULL) { + ecore_event_handler_del(s_info.hdl_down); + } + + return QP_OK; +} + +static int _resume(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + return QP_OK; +} + +static void _opened(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + _page_mapbuf_enable_set(s_info.view_box, 0); + + quickpanel_page_editing_icon_visible_status_update(); +} + +static void _closed(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + retif(s_info.view_scroller == NULL, , "Invalid parameter!"); + + _page_show(PAGE_IDX_MAIN); + _page_mapbuf_enable_set(s_info.view_box, 0); + + quickpanel_page_editing_icon_visible_status_update(); +} + +static void _refresh(void *data) { + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + retif(s_info.view_box == NULL, , "Invalid parameter!"); + retif(s_info.view_scroller == NULL, , "Invalid parameter!"); + + _page_rotation(ad); +} + +static void _scroller_resized_cb(void *data, Evas * e, + Evas_Object * obj, void *event_info) +{ + _page_show(PAGE_IDX_MAIN); + evas_object_event_callback_del(s_info.view_scroller, EVAS_CALLBACK_RESIZE, _scroller_resized_cb); +} + +HAPI Evas_Object *quickpanel_pager_new(Evas_Object *parent, void *data) +{ + Evas_Object *box = NULL; + Evas_Object *scroller = NULL; + + retif(parent == NULL, NULL, "failed to memory allocation"); + + if (s_info.view_scroller != NULL && s_info.view_box != NULL) { + return s_info.view_scroller; + } + + scroller = elm_scroller_add(parent); + retif(!scroller, NULL, "fail to add scroller"); + elm_scroller_bounce_set(scroller, EINA_TRUE, EINA_TRUE); + elm_scroller_propagate_events_set(scroller, EINA_FALSE); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_scroller_page_relative_set (scroller, 1.0, 0.0); + + box = elm_box_add(scroller); + if (!box) { + ERR("fail to add box"); + if (scroller != NULL) { + evas_object_del(scroller); + scroller = NULL; + } + return EINA_FALSE; + } + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_show(box); + + elm_object_content_set(scroller, box); + + s_info.view_scroller = scroller; + s_info.view_box = box; + + evas_object_event_callback_add(s_info.view_scroller, EVAS_CALLBACK_RESIZE, _scroller_resized_cb, NULL); + + return scroller; +} + +HAPI void quickpanel_pager_destroy(void) +{ + if (s_info.view_box != NULL) { + elm_box_unpack_all(s_info.view_box); + evas_object_del(s_info.view_box); + s_info.view_box = NULL; + } + if (s_info.view_scroller != NULL) { + evas_object_del(s_info.view_scroller); + s_info.view_scroller = NULL; + } +} + +HAPI Evas_Object *quickpanel_pager_view_get(const char *view_name) +{ + retif(view_name == NULL, NULL, "invalid parameter"); + + if (strcmp(view_name, "SCROLLER") == 0) { + return s_info.view_scroller; + } else if (strcmp(view_name, "BOX") == 0) { + return s_info.view_box; + } + + return NULL; +} + +HAPI int quickpanel_pager_current_page_get(void) +{ + int index = 0; + + elm_scroller_current_page_get(s_info.view_scroller, &index, NULL); + + return index; +} + +HAPI void quickpanel_pager_page_set(int page_index, int need_resize) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + + if (need_resize) { + _page_rotation(ad); + } + _page_show(page_index); + + evas_object_show(s_info.view_scroller); +} + +HAPI void quickpanel_pager_mapbuf_set(int is_enable) +{ + _page_mapbuf_enable_set(s_info.view_box, is_enable); +} diff --git a/daemon/page/pager.h b/daemon/page/pager.h new file mode 100644 index 0000000..67de49b --- /dev/null +++ b/daemon/page/pager.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __QUICKPANEL_PAGER_H__ +#define __QUICKPANEL_PAGER_H__ + +#include "quickpanel-ui.h" +#include "common.h" + +typedef struct _QP_Page_Handler { + int status; + char *name; + /* func */ + void (*content_resize) (int width, int height, const char *signal); + void (*mapbuf_enable_set) (Eina_Bool is_enable); + int (*down_cb) (void *, void *); + int (*move_cb) (void *, void *); + int (*up_cb) (void *, void *); + int (*scroll_start_cb) (void *, void *); + int (*scroll_done_cb) (void *, void *); + int (*page_changed_cb) (void *, void *); +} QP_Page_Handler; + +typedef enum _qp_pager_page_type { + PAGE_IDX_MAIN = 0, + PAGE_IDX_EDITING, // Not supported +} qp_pager_page_type; + +Evas_Object *quickpanel_pager_new(Evas_Object *parent, void *data); +void quickpanel_pager_destroy(void); +Evas_Object *quickpanel_pager_view_get(const char *view_name); +int quickpanel_pager_current_page_get(void); +void quickpanel_pager_page_set(int page_index, int need_resize); +void quickpanel_pager_mapbuf_set(int is_enable); + +#endif diff --git a/daemon/page/pager_common.c b/daemon/page/pager_common.c new file mode 100644 index 0000000..1c2bfff --- /dev/null +++ b/daemon/page/pager_common.c @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "pager.h" +#include "datetime.h" + +#define EVAS_DATA_PAGE_HANDLER "page_handler" + +static inline void _scroll_hold(Evas_Object *viewer) +{ + int hold_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + hold_count = elm_object_scroll_hold_get(viewer); + + if (hold_count <= 0) { + elm_object_scroll_hold_push(viewer); + } +} + +static inline void _scroll_unhold(Evas_Object *viewer) +{ + int i = 0, hold_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + hold_count = elm_object_scroll_hold_get(viewer); + + for (i = 0 ; i < hold_count; i++) { + elm_object_scroll_hold_pop(viewer); + } +} + +static inline void _scroll_freeze(Evas_Object *viewer) +{ + int freezed_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + freezed_count = elm_object_scroll_freeze_get(viewer); + + if (freezed_count <= 0) { + elm_object_scroll_freeze_push(viewer); + } +} + +static inline void _scroll_unfreeze(Evas_Object *viewer) +{ + int i = 0, freezed_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + freezed_count = elm_object_scroll_freeze_get(viewer); + + for (i = 0 ; i < freezed_count; i++) { + elm_object_scroll_freeze_pop(viewer); + } +} + +HAPI void quickpanel_page_handler_set(Evas_Object *page, QP_Page_Handler *handler) +{ + retif(page == NULL, , "invalid parameter"); + + evas_object_data_set(page, EVAS_DATA_PAGE_HANDLER, handler); +} + +HAPI QP_Page_Handler *quickpanel_page_handler_get(Evas_Object *page) +{ + retif(page == NULL, NULL, "invalid parameter"); + + return evas_object_data_get(page, EVAS_DATA_PAGE_HANDLER); +} + +HAPI void quickpanel_page_scroll_freeze_set(Eina_Bool is_freeze) +{ + Evas_Object *pager_scroller = quickpanel_pager_view_get("SCROLLER"); + retif(pager_scroller == NULL, , "pager null"); + + if (is_freeze) { + _scroll_freeze(pager_scroller); + } else { + _scroll_unfreeze(pager_scroller); + } +} + +HAPI void quickpanel_page_scroll_hold_set(Eina_Bool is_freeze) +{ + Evas_Object *pager_scroller = quickpanel_pager_view_get("SCROLLER"); + retif(pager_scroller == NULL, , "pager null"); + + if (is_freeze) { + _scroll_hold(pager_scroller); + } else { + _scroll_unhold(pager_scroller); + } +} + +HAPI void quickpanel_page_get_recoordinated_pos(int local_x, int local_y, int *x, int *y) +{ + int rot_x = 0; + int rot_y = 0; + int width = 0; + int height = 0; + retif(x == NULL && y == NULL, , "invalid parameter"); + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + + //ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height); + elm_win_screen_size_get(ad->win, NULL, NULL, &width, &height); + + switch (ad->angle) { + case 0: + rot_x = local_x; + rot_y = local_y; + break; + case 90: + rot_x = height - local_y; + rot_y = local_x; + break; + case 180: + rot_x = width - local_x; + rot_y = height - local_y; + break; + case 270: + rot_x = local_y; + rot_y = width - local_x; + break; + default: + break; + } + + if (x != NULL) { + *x = rot_x; + } + + if (y != NULL) { + *y = rot_y; + } +} + +HAPI void quickpanel_page_get_touched_pos(int *x, int *y) +{ + int rot_x = 0; + int rot_y = 0; + int local_x = 0; + int local_y = 0; + retif(x == NULL && y == NULL, , "invalid parameter"); + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); +#ifdef HAVE_X + ecore_x_pointer_last_xy_get(&local_x, &local_y); +#endif + quickpanel_page_get_recoordinated_pos(local_x, local_y, &rot_x, &rot_y); + + if (x != NULL) { + *x = rot_x; + } + + if (y != NULL) { + *y = rot_y; + } +} + +HAPI void quickpanel_page_editing_icon_visible_status_update(void) +{ + int is_visible = 0; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + + if (quickpanel_pager_current_page_get() == PAGE_IDX_EDITING) { + is_visible = 1; + } else { + is_visible = 0; + } + + quickpanel_datetime_editing_icon_visibility_set(is_visible); +}
\ No newline at end of file diff --git a/daemon/page/pager_common.h b/daemon/page/pager_common.h new file mode 100644 index 0000000..51cb7b0 --- /dev/null +++ b/daemon/page/pager_common.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __QUICKPANEL_PAGER_COMMON_H__ +#define __QUICKPANEL_PAGER_COMMON_H__ + +#include "quickpanel-ui.h" +#include "common.h" +#include "pager.h" + +void quickpanel_page_handler_set(Evas_Object *page, QP_Page_Handler *handler); +QP_Page_Handler *quickpanel_page_handler_get(Evas_Object *page); +void quickpanel_page_scroll_hold_set(Eina_Bool is_freeze); +void quickpanel_page_scroll_freeze_set(Eina_Bool is_freeze); +void quickpanel_page_get_touched_pos(int *x, int *y); +void quickpanel_page_get_recoordinated_pos(int local_x, int local_y, int *x, int *y); +void quickpanel_page_editing_icon_visible_status_update(void); + +#endif diff --git a/daemon/page/pager_common_x11.c b/daemon/page/pager_common_x11.c new file mode 100644 index 0000000..f238f5e --- /dev/null +++ b/daemon/page/pager_common_x11.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "pager.h" +#include "datetime.h" + +#define EVAS_DATA_PAGE_HANDLER "page_handler" + +static inline void _scroll_hold(Evas_Object *viewer) +{ + int hold_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + hold_count = elm_object_scroll_hold_get(viewer); + + if (hold_count <= 0) { + elm_object_scroll_hold_push(viewer); + } +} + +static inline void _scroll_unhold(Evas_Object *viewer) +{ + int i = 0, hold_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + hold_count = elm_object_scroll_hold_get(viewer); + + for (i = 0 ; i < hold_count; i++) { + elm_object_scroll_hold_pop(viewer); + } +} + +static inline void _scroll_freeze(Evas_Object *viewer) +{ + int freezed_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + freezed_count = elm_object_scroll_freeze_get(viewer); + + if (freezed_count <= 0) { + elm_object_scroll_freeze_push(viewer); + } +} + +static inline void _scroll_unfreeze(Evas_Object *viewer) +{ + int i = 0, freezed_count = 0; + retif(viewer == NULL, , "Invalid parameter!"); + + freezed_count = elm_object_scroll_freeze_get(viewer); + + for (i = 0 ; i < freezed_count; i++) { + elm_object_scroll_freeze_pop(viewer); + } +} + +HAPI void quickpanel_page_handler_set(Evas_Object *page, QP_Page_Handler *handler) +{ + retif(page == NULL, , "invalid parameter"); + + evas_object_data_set(page, EVAS_DATA_PAGE_HANDLER, handler); +} + +HAPI QP_Page_Handler *quickpanel_page_handler_get(Evas_Object *page) +{ + retif(page == NULL, NULL, "invalid parameter"); + + return evas_object_data_get(page, EVAS_DATA_PAGE_HANDLER); +} + +HAPI void quickpanel_page_scroll_freeze_set(Eina_Bool is_freeze) +{ + Evas_Object *pager_scroller = quickpanel_pager_view_get("SCROLLER"); + retif(pager_scroller == NULL, , "pager null"); + + if (is_freeze) { + _scroll_freeze(pager_scroller); + } else { + _scroll_unfreeze(pager_scroller); + } +} + +HAPI void quickpanel_page_scroll_hold_set(Eina_Bool is_freeze) +{ + Evas_Object *pager_scroller = quickpanel_pager_view_get("SCROLLER"); + retif(pager_scroller == NULL, , "pager null"); + + if (is_freeze) { + _scroll_hold(pager_scroller); + } else { + _scroll_unhold(pager_scroller); + } +} + +HAPI void quickpanel_page_get_recoordinated_pos(int local_x, int local_y, int *x, int *y) +{ + int rot_x = 0; + int rot_y = 0; + int width = 0; + int height = 0; + retif(x == NULL && y == NULL, , "invalid parameter"); + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + + //ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height); + elm_win_screen_size_get(ad->win, NULL, NULL, &width, &height); + + switch (ad->angle) { + case 0: + rot_x = local_x; + rot_y = local_y; + break; + case 90: + rot_x = height - local_y; + rot_y = local_x; + break; + case 180: + rot_x = width - local_x; + rot_y = height - local_y; + break; + case 270: + rot_x = local_y; + rot_y = width - local_x; + break; + default: + break; + } + + if (x != NULL) { + *x = rot_x; + } + + if (y != NULL) { + *y = rot_y; + } +} + +HAPI void quickpanel_page_get_touched_pos(int *x, int *y) +{ + int rot_x = 0; + int rot_y = 0; + int local_x = 0; + int local_y = 0; + retif(x == NULL && y == NULL, , "invalid parameter"); + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + + ecore_x_pointer_last_xy_get(&local_x, &local_y); + quickpanel_page_get_recoordinated_pos(local_x, local_y, &rot_x, &rot_y); + + if (x != NULL) { + *x = rot_x; + } + + if (y != NULL) { + *y = rot_y; + } +} + +HAPI void quickpanel_page_editing_icon_visible_status_update(void) +{ + int is_visible = 0; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + + if (quickpanel_pager_current_page_get() == PAGE_IDX_EDITING) { + is_visible = 1; + } else { + is_visible = 0; + } + + quickpanel_datetime_editing_icon_visibility_set(is_visible); +}
\ No newline at end of file diff --git a/daemon/preference.c b/daemon/preference.c new file mode 100644 index 0000000..b6461b9 --- /dev/null +++ b/daemon/preference.c @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <iniparser.h> +#include "preference.h" +#include "common.h" +#include "quickpanel-ui.h" + +#define FILE_PREFERENCE DATADIR_RW"/preference.ini" + +static const char *_default_preference_get(const char *key) +{ + retif(key == NULL, NULL, "invalid parameter"); + + if (strcmp(key, PREF_BRIGHTNESS) == 0) { + return "OFF"; + } else if (strcmp(key, PREF_QUICKSETTING_ORDER) == 0){ + return "wifi,gps,sound,rotate,bluetooth,mobile_data,assisitvelight,u_power_saving,wifi_hotspot,flightmode"; + } else if (strcmp(key, PREF_QUICKSETTING_FEATURED_NUM) == 0){ + return "11"; + } else if (strcmp(key, PREF_SHORTCUT_ENABLE) == 0){ + return "ON"; + } else if (strcmp(key, PREF_SHORTCUT_EARPHONE_ORDER) == 0){ + return "org.tizen.music-player,org.tizen.videos,org.tizen.phone,srfxzv8GKR.YouTube,org.tizen.voicerecorder"; + } + + return NULL; +} + +static inline int _key_validation_check(const char *key) +{ + if (strcmp(key, PREF_BRIGHTNESS) == 0) { + return 1; + } else if (strcmp(key, PREF_QUICKSETTING_ORDER) == 0){ + return 1; + } else if (strcmp(key, PREF_QUICKSETTING_FEATURED_NUM) == 0){ + return 1; + } else if (strcmp(key, PREF_SHORTCUT_ENABLE) == 0){ + return 1; + } else if (strcmp(key, PREF_SHORTCUT_EARPHONE_ORDER) == 0){ + return 1; + } + + return 0; +} + +static inline int _is_file_exist(void) +{ + + if (access(FILE_PREFERENCE, O_RDWR) == 0) { + return 1; + } + + return 0; +} + +static void _default_file_create(void) +{ + FILE *fp = NULL ; + + fp = fopen(FILE_PREFERENCE, "w"); + retif(fp == NULL, , "fatal:failed to create preference file"); + + fprintf(fp, "\n\ + [%s]\n\ + %s = %s ;\n\ + %s = %s ;\n\ + %s = %s ;\n\ + %s = %s ;\n\ + %s = %s ;\n\ + \n" + , PREF_SECTION + , PREF_BRIGHTNESS_KEY, _default_preference_get(PREF_BRIGHTNESS) + , PREF_QUICKSETTING_ORDER_KEY, _default_preference_get(PREF_QUICKSETTING_ORDER) + , PREF_QUICKSETTING_FEATURED_NUM_KEY, _default_preference_get(PREF_QUICKSETTING_FEATURED_NUM) + , PREF_SHORTCUT_ENABLE_KEY, _default_preference_get(PREF_SHORTCUT_ENABLE) + , PREF_SHORTCUT_EARPHONE_ORDER_KEY, _default_preference_get(PREF_SHORTCUT_EARPHONE_ORDER) + ); + + fclose(fp); +} + +HAPI int quickpanel_preference_get(const char *key, char *value) +{ + int ret = QP_OK; + dictionary *ini = NULL; + const char *value_r = NULL; + retif(key == NULL, QP_FAIL, "Invalid parameter!"); + retif(value == NULL, QP_FAIL, "Invalid parameter!"); + + ini = iniparser_load(FILE_PREFERENCE); + if (ini == NULL) { + DBG("failed to load ini file"); + _default_file_create(); + value_r = _default_preference_get(key); + goto END; + } + +#ifdef HAVE_X + value_r = iniparser_getstr(ini, key); +#endif + if (value_r == NULL) { + value_r = _default_preference_get(key); + if (_key_validation_check(key) == 1) { + _default_file_create(); + } + goto END; + } else { + DBG("get:[%s]", value_r); + } + +END: + if (value_r != NULL) { + strcpy(value, value_r); + ret = QP_OK; + } + + if (ini != NULL) { +#ifdef HAVE_X + iniparser_freedict(ini); +#endif + } + + return ret; +} + +HAPI const char *quickpanel_preference_default_get(const char *key) +{ + retif(key == NULL, NULL, "Invalid parameter!"); + + return _default_preference_get(key); +} + +HAPI int quickpanel_preference_set(const char *key, char *value) +{ + int ret = QP_FAIL; + FILE *fp = NULL; + dictionary *ini = NULL; + retif(key == NULL, QP_FAIL, "Invalid parameter!"); + retif(value == NULL, QP_FAIL, "Invalid parameter!"); + + if (_is_file_exist() == 0) { + _default_file_create(); + } + + ini = iniparser_load(FILE_PREFERENCE); + retif(ini == NULL, QP_FAIL, "failed to load ini file"); +#ifdef HAVE_X + if (iniparser_setstr(ini, (char *)key, value) == 0) { + ret = QP_OK; + } else { + ERR("failed to write %s=%s", key, value); + } +#endif + + fp = fopen(FILE_PREFERENCE, "w"); + if (fp != NULL) { + iniparser_dump_ini(ini, fp); + fclose(fp); + } + + iniparser_freedict(ini); + + return ret; +} diff --git a/daemon/preference.h b/daemon/preference.h new file mode 100644 index 0000000..717fdc2 --- /dev/null +++ b/daemon/preference.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __QP_PREFERENCE_H_ +#define __QP_PREFERENCE_H_ + +#define PREF_LEN_VALUE_MAX 256 + +#define PREF_SECTION "quickpanel" +#define PREF_BRIGHTNESS_KEY "brightness" +#define PREF_QUICKSETTING_ORDER_KEY "quicksetting_order" +#define PREF_QUICKSETTING_FEATURED_NUM_KEY "quicksetting_featured_num" +#define PREF_SHORTCUT_ENABLE_KEY "shortcut_enable" +#define PREF_SHORTCUT_EARPHONE_ORDER_KEY "shortcut_earphone" + +#define PREF_BRIGHTNESS PREF_SECTION":"PREF_BRIGHTNESS_KEY +#define PREF_QUICKSETTING_ORDER PREF_SECTION":"PREF_QUICKSETTING_ORDER_KEY +#define PREF_QUICKSETTING_FEATURED_NUM PREF_SECTION":"PREF_QUICKSETTING_FEATURED_NUM_KEY +#define PREF_SHORTCUT_ENABLE PREF_SECTION":"PREF_SHORTCUT_ENABLE_KEY +#define PREF_SHORTCUT_EARPHONE_ORDER PREF_SECTION":"PREF_SHORTCUT_EARPHONE_ORDER_KEY + +int quickpanel_preference_get(const char *key, char *value); +const char *quickpanel_preference_default_get(const char *key); +int quickpanel_preference_set(const char *key, char *value); + +#endif diff --git a/daemon/quickpanel-ui.c b/daemon/quickpanel-ui.c index afe997e..0891952 100755 --- a/daemon/quickpanel-ui.c +++ b/daemon/quickpanel-ui.c @@ -1,179 +1,95 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ + #include <stdio.h> #include <signal.h> #include <app.h> -#include <system_info.h> #include <sys/utsname.h> +#ifdef HAVE_X #include <X11/Xlib.h> #include <utilX.h> +#endif #include <Ecore_Input.h> #include <vconf.h> #include <unistd.h> +#include <malloc.h> #include <privilege-control.h> -#include <bundle.h> -#include <notification.h> +/* quickpanel basics */ #include "common.h" #include "quickpanel-ui.h" #include "modules.h" #include "quickpanel_def.h" #include "list_util.h" +#include "vi_manager.h" +#include "pager.h" +#include "page_base.h" +#ifdef QP_ENABLE_PAGE_EDIT +#include "page_edit.h" +#else +#include "page_setting_all.h" +#endif + +#include "sim_controller.h" +#include "noti.h" + +/* services */ +#include "keyboard.h" +#include "keyboard_x.h" +#include "uninstall.h" +#ifdef QP_REMINDER_ENABLE +#include "reminder.h" +#endif +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif +#include "configuration.h" +#include "minictrl.h" +#include "util-time.h" + +#include <tapi_common.h> +#include <ITapiSim.h> + #define QP_WINDOW_PRIO 300 -#define QP_ENABLE_HIDING_INDICATOR 1 static struct appdata *g_app_data = NULL; -/* binary information */ -#define QP_EMUL_STR "Emulator" +#ifdef HAVE_X static Ecore_X_Atom E_ILLUME_ATOM_MV_QUICKPANEL_STATE; +#endif -static void _quickpanel_cache_flush(void *evas); -static void _quickpanel_init_size_genlist(void *data); -static void _quickpanel_ui_update_height(void *data); -static void _quickpanel_ui_set_indicator_cover(void *data); -static void _quickpanel_move_data_to_service(const char *key, const char *val, void *data); +static void _ui_rotate(void *data, int new_angle); +static void _ui_geometry_info_set(void *data); +static void _ui_handler_info_set(void *data); +static void _ui_efl_cache_flush(void *evas); HAPI void *quickpanel_get_app_data(void) { return g_app_data; } -HAPI int quickpanel_is_suspended(void) -{ - struct appdata *ad = quickpanel_get_app_data(); - retif(ad == NULL, 0, "invalid data."); - - return ad->is_suspended; -} - -HAPI int quickpanel_is_emul(void) -{ - int is_emul = 0; - char *info = NULL; - - if (system_info_get_value_string(SYSTEM_INFO_KEY_MODEL, &info) == 0) { - if (info == NULL) return 0; - if (!strncmp(QP_EMUL_STR, info, strlen(info))) { - is_emul = 1; - } - } - - if (info != NULL) free(info); - - return is_emul; -} - -HAPI int quickpanel_launch_app(char *app_id, void *data) -{ - int ret = SERVICE_ERROR_NONE; - service_h service = NULL; - - retif(app_id == NULL && data == NULL, SERVICE_ERROR_INVALID_PARAMETER, "Invialid parameter!"); - - ret = service_create(&service); - if (ret != SERVICE_ERROR_NONE) { - ERR("service_create() return error : %d", ret); - return ret; - } - retif(service == NULL, SERVICE_ERROR_INVALID_PARAMETER, "fail to create service handle!"); - - if (app_id != NULL) { - service_set_operation(service, SERVICE_OPERATION_DEFAULT); - service_set_app_id(service, app_id); - - if (data != NULL) { - bundle_iterate((bundle *)data, _quickpanel_move_data_to_service, service); - } - } else { - service_import_from_bundle(service, data); - } - - ret = service_send_launch_request(service, NULL, NULL); - if (ret != SERVICE_ERROR_NONE) { - ERR("service_send_launch_request() is failed : %d", ret); - service_destroy(service); - return ret; - } - service_destroy(service); - return ret; -} - -HAPI void quickpanel_launch_app_inform_result(const char *pkgname, int retcode) -{ - retif(retcode == SERVICE_ERROR_NONE, , "Invialid parameter!"); - retif(pkgname == NULL && retcode != SERVICE_ERROR_APP_NOT_FOUND, , "Invialid parameter!"); - - const char *msg = NULL; - - if (retcode == SERVICE_ERROR_APP_NOT_FOUND) { - notification_status_message_post(_S("IDS_COM_BODY_NO_APPLICATIONS_CAN_PERFORM_THIS_ACTION")); - } else { - Eina_Strbuf *strbuf = eina_strbuf_new(); - - if (strbuf != NULL) { - eina_strbuf_append_printf(strbuf, _S("IDS_IDLE_POP_UNABLE_TO_LAUNCH_PS"), pkgname); - eina_strbuf_append_printf(strbuf, "(%d)", retcode); - msg = eina_strbuf_string_get(strbuf); - - if (msg != NULL) { - notification_status_message_post(msg); - } - eina_strbuf_free(strbuf); - } - } -} - -static void _quickpanel_move_data_to_service(const char *key, const char *val, void *data) -{ - retif(data == NULL || key == NULL || val == NULL, , "Invialid parameter!"); - - service_h service = data; - service_add_extra_data(service, key, val); -} - -static void atoms_init_quickpanel(void) -{ - E_ILLUME_ATOM_MV_QUICKPANEL_STATE = ecore_x_atom_get("_E_MOVE_QUICKPANEL_STATE"); -} - /****************************************************************************** * * UI * ****************************************************************************/ -static Eina_Bool _quickpanel_ui_refresh_cb(void *data) -{ - struct appdata *ad = NULL; - - retif(data == NULL, QP_FAIL, "Invalid parameter!"); - ad = data; - - INFO(" >>>>>>>>>>>>>>> Refresh QP modules!! <<<<<<<<<<<<<<<< "); - refresh_modules(data); - - _quickpanel_init_size_genlist(ad); - _quickpanel_ui_update_height(ad); - - return EINA_FALSE; -} - -static void _quickpanel_cache_flush(void *evas) +static void _ui_efl_cache_flush(void *evas) { int file_cache; int collection_cache; @@ -203,128 +119,243 @@ static void _quickpanel_cache_flush(void *evas) edje_collection_cache_set(collection_cache); evas_image_cache_set(evas, image_cache); evas_font_cache_set(evas, font_cache); + + elm_cache_all_flush(); + malloc_trim(0); } -static Eina_Bool _quickpanel_hardkey_cb(void *data, int type, void *event) +static void _ui_handler_input_region_set(void *data, int contents_height) { struct appdata *ad = NULL; - Ecore_Event_Key *key_event = NULL; +#ifdef HAVE_X + Ecore_X_Window xwin; + Ecore_X_Atom atom_window_input_region = 0; +#endif + unsigned int window_input_region[4] = {0,}; - retif(data == NULL || event == NULL, - EINA_FALSE, "Invalid parameter!"); + retif(data == NULL, , "Invialid parameter!"); ad = data; - key_event = event; - if (!strcmp(key_event->keyname, KEY_SELECT)) { - quickpanel_close_quickpanel(false); +#ifdef HAVE_X + xwin = elm_win_xwindow_get(ad->win); +#endif + + switch (ad->angle) { + case 0: + window_input_region[0] = 0; //X + window_input_region[1] = contents_height; // Y + window_input_region[2] = ad->win_width; // Width + window_input_region[3] = ELM_SCALE_SIZE(QP_HANDLE_H); // height + break; + case 90: + window_input_region[0] = contents_height; //X + window_input_region[1] = 0; // Y + window_input_region[2] = ELM_SCALE_SIZE(QP_HANDLE_H); // Width + window_input_region[3] = ad->win_height; // height + break; + case 180: + window_input_region[0] = 0; //X + window_input_region[1] = ad->win_height - contents_height - ELM_SCALE_SIZE(QP_HANDLE_H); // Y + window_input_region[2] = ad->win_width; // Width + window_input_region[3] = ELM_SCALE_SIZE(QP_HANDLE_H); // height + break; + case 270: + window_input_region[0] = ad->win_width - contents_height - ELM_SCALE_SIZE(QP_HANDLE_H); //X + window_input_region[1] = 0; // Y + window_input_region[2] = ELM_SCALE_SIZE(QP_HANDLE_H); // Width + window_input_region[3] = ad->win_height; // height + break; } - return EINA_FALSE; + + INFO("win_input_0:%d\nwin_input_1:%d\nwin_input_2:%d\nwin_input_3:%d\n" + ,window_input_region[0] + ,window_input_region[1] + ,window_input_region[2] + ,window_input_region[3] + ); +#ifdef HAVE_X + atom_window_input_region = ecore_x_atom_get(STR_ATOM_WINDOW_INPUT_REGION); + ecore_x_window_prop_card32_set(xwin, atom_window_input_region, window_input_region, 4); +#endif } -static int _quickpanel_ui_rotation_get_angle(void *data) +static void _ui_handler_content_region_set(void *data, int contents_height) { - struct appdata *ad = (struct appdata *)data; - Ecore_X_Window xwin, root; - int ret = 0, angle = 0, count = 0; - unsigned char *prop_data = NULL; + struct appdata *ad = NULL; +#ifdef HAVE_X + Ecore_X_Window xwin; + Ecore_X_Atom atom_window_contents_region = 0; +#endif + unsigned int window_contents_region[4] = {0,}; - retif(data == NULL, -1, "Invalid parameter!"); + retif(data == NULL, , "Invialid parameter!"); + ad = data; +#ifdef HAVE_X xwin = elm_win_xwindow_get(ad->win); - root = ecore_x_window_root_get(xwin); +#endif + + switch (ad->angle) { + case 0: + window_contents_region[0] = 0; //X + window_contents_region[1] = 0; // Y + window_contents_region[2] = ad->win_width; // Width + window_contents_region[3] = contents_height; // height + break; + case 90: + window_contents_region[0] = 0; //X + window_contents_region[1] = 0; // Y + window_contents_region[2] = contents_height; // Width + window_contents_region[3] = ad->win_height; // height + break; + case 180: + window_contents_region[0] = 0; //X + window_contents_region[1] = ad->win_height - contents_height; // Y + window_contents_region[2] = ad->win_width; // Width + window_contents_region[3] = contents_height; // height + break; + case 270: + window_contents_region[0] = ad->win_width - contents_height ; //X + window_contents_region[1] = 0; // Y + window_contents_region[2] = contents_height; // Width + window_contents_region[3] = ad->win_height; // height + break; + } + + DBG("win_contents_0:%d\nwin_contents_1:%d\nwin_contents_2:%d\nwin_contents_3:%d\n" + ,window_contents_region[0] + ,window_contents_region[1] + ,window_contents_region[2] + ,window_contents_region[3] + ); +#ifdef HAVE_X + atom_window_contents_region = ecore_x_atom_get(STR_ATOM_WINDOW_CONTENTS_REGION); + ecore_x_window_prop_card32_set(xwin, atom_window_contents_region, window_contents_region, 4); +#endif +} + +static void _ui_handler_info_set(void *data) +{ + int contents_height = 0; + struct appdata *ad = NULL; - ret = ecore_x_window_prop_property_get(root, - ECORE_X_ATOM_E_ILLUME_ROTATE_ROOT_ANGLE, - ECORE_X_ATOM_CARDINAL, 32, - &prop_data, &count); + retif(data == NULL, , "data is NULL"); + ad = data; - if (ret && prop_data) { - memcpy(&angle, prop_data, sizeof(int)); + contents_height = ad->gl_distance_from_top + ad->gl_limit_height; - if (prop_data) - free(prop_data); + _ui_handler_input_region_set(ad, contents_height); + _ui_handler_content_region_set(ad, contents_height); +} - return angle; - } else { - ERR("Fail to get angle"); - if (prop_data) - free(prop_data); +static void _ui_geometry_info_set(void *data) +{ + struct appdata *ad = NULL; + int max_height_window = 0; + Evas_Coord genlist_y = 0; + + retif(data == NULL, , "data is NULL"); + ad = data; - return -1; + if (ad->angle == 90 || ad->angle == 270 ) { + max_height_window = ad->win_width; + } else { + max_height_window = ad->win_height; } + + edje_object_part_geometry_get(_EDJ(ad->ly), "qp.base.list.swallow", NULL, &genlist_y, NULL, NULL); + + ad->gl_distance_from_top = genlist_y; + ad->gl_distance_to_bottom = ELM_SCALE_SIZE(QP_HANDLE_H); + ad->gl_limit_height = max_height_window - ad->gl_distance_from_top - ad->gl_distance_to_bottom; } -static void _quickpanel_ui_rotation(void *data, int new_angle) +/***************************************************************************** + * + * ui rotation functions + * + ****************************************************************************/ +static void _ui_rotation_wm_cb(void *data, Evas_Object *obj, void *event) { + int angle = 0; struct appdata *ad = data; - retif(data == NULL, , "Invalid parameter!"); + retif(ad == NULL, , "Invalid parameter!"); - INFO("ROTATION: new:%d old:%d", new_angle, ad->angle); + angle = elm_win_rotation_get((Evas_Object *)obj); - if (new_angle == 0 || new_angle == 90 || new_angle == 180 || new_angle == 270) { - if (new_angle != ad->angle) { - elm_win_rotation_with_resize_set(ad->win, - new_angle); - ad->angle = new_angle; + DBG("ROTATE:%d", angle); - _quickpanel_ui_set_indicator_cover(ad); - ecore_idler_add(_quickpanel_ui_refresh_cb, ad); - } + quickpanel_minictrl_rotation_report(angle); + + _ui_rotate(ad, angle); +} + +static int _ui_rotation_angle_get(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, 0, "Invalid parameter!"); + retif(ad->win == NULL, 0, "Invalid parameter!"); + + return elm_win_rotation_get(ad->win); +} + +static void _ui_handler_enable_set(Eina_Bool is_enable) +{ + const char *signal = NULL; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + retif(ad->view_root == NULL, , "data is NULL"); + + if (is_enable == EINA_TRUE) { + signal = "mouse,down,1"; + } else { + signal = "mouse,up,1"; } + + elm_object_signal_emit(ad->view_root, signal, "qp.handler.bg"); } -static Eina_Bool quickpanel_ui_client_message_cb(void *data, int type, - void *event) +static void _ui_rotation_handler(struct appdata *ad, int angle) { - struct appdata *ad = data; - Ecore_X_Event_Client_Message *ev = event; - int new_angle; + const char *signal = NULL; - retif(data == NULL || event == NULL, - ECORE_CALLBACK_RENEW, "Invalid parameter!"); + retif(ad == NULL, , "data is NULL"); + retif(ad->view_root == NULL, , "data is NULL"); - if (ev->message_type == ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE) { - new_angle = ev->data.l[0]; - _quickpanel_ui_rotation(ad, new_angle); - } else if (ev->message_type == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE) { - if (ev->data.l[0] == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF) { - ad->is_opened = 0; - qp_closed_modules(data); - quickpanel_player_stop(); -#if QP_ENABLE_HIDING_INDICATOR - elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_HIDE); -#endif - } - } else if (ad->E_ILLUME_ATOM_MV_QUICKPANEL_STATE != NULL) { - if (ev->message_type == *(ad->E_ILLUME_ATOM_MV_QUICKPANEL_STATE)) { - if (ev->data.l[0] == 1) { - if (ad->is_opened == 0) { -#if QP_ENABLE_HIDING_INDICATOR - elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW); -#endif - INFO("quickpanel going to be opened"); - } - } - if (ev->data.l[0] == 0) { - if (ad->is_opened == 0) { - INFO("quickpanel is closed"); - ad->is_opened = 1; - qp_opened_modules(data); - quickpanel_player_stop(); - } - } - } + + if (angle == 90 || angle == 270) { + signal = "quickpanel.landscape"; + } else { + signal = "quickpanel.portrait"; } - return ECORE_CALLBACK_RENEW; + + elm_object_signal_emit(ad->view_root, signal, "quickpanel.prog"); } -static void _quickpanel_signal_handler(int signum, siginfo_t *info, void *unused) +static void _ui_rotate(void *data, int new_angle) { - ERR("quickpanel going to be terminated"); - app_efl_exit(); + struct appdata *ad = data; + retif(data == NULL, , "Invalid parameter!"); + + DBG("ROTATION: new:%d old:%d", new_angle, ad->angle); + + if (new_angle == 0 || new_angle == 90 || new_angle == 180 || new_angle == 270) { + if (new_angle != ad->angle) { + ad->angle = new_angle; + quickpanel_modules_refresh(ad); + _ui_geometry_info_set(ad); + _ui_handler_info_set(ad); + _ui_rotation_handler(ad, ad->angle); + } + } } -static Evas_Object *_quickpanel_ui_window_add(const char *name, int prio) +/***************************************************************************** + * + * ui creation/deletion functions + * + ****************************************************************************/ +static Evas_Object *_ui_window_add(const char *name, int prio) { Evas_Object *eo = NULL; Ecore_X_Window xwin; @@ -333,11 +364,7 @@ static Evas_Object *_quickpanel_ui_window_add(const char *name, int prio) if (eo != NULL) { elm_win_alpha_set(eo, EINA_TRUE); -#if QP_ENABLE_HIDING_INDICATOR elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_HIDE); -#else - elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_SHOW); -#endif elm_win_title_set(eo, name); elm_win_borderless_set(eo, EINA_TRUE); @@ -347,304 +374,109 @@ static Evas_Object *_quickpanel_ui_window_add(const char *name, int prio) elm_win_quickpanel_set(eo, 1); elm_win_quickpanel_priority_major_set(eo, prio); + if (elm_win_wm_rotation_supported_get(eo)) { + int rots[4] = { 0, 90, 180, 270 }; + elm_win_wm_rotation_available_rotations_set(eo, rots, 4); + } + /* icccm name class set */ +#ifdef HAVE_X xwin = elm_win_xwindow_get(eo); ecore_x_icccm_name_class_set(xwin, "QUICKPANEL", "QUICKPANEL"); - evas_object_show(eo); - } - - return eo; -} - -#ifdef TBD -static void _quickpanel_add_debugging_bar(Evas_Object *list) -{ - Eina_Bool ret = EINA_FALSE; - Evas_Object *bar = elm_layout_add(list); - - ret = elm_layout_file_set(bar, DEFAULT_EDJ, - "quickpanel/seperator/default"); - if (ret != EINA_FALSE) { - evas_object_size_hint_weight_set(bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bar, EVAS_HINT_FILL, EVAS_HINT_FILL); - - qp_item_data *qid - = quickpanel_list_util_item_new(QP_ITEM_TYPE_BAR, NULL); - quickpanel_list_util_item_set_tag(bar, qid); - quickpanel_list_util_sort_insert(list, bar); - evas_object_show(bar); - } -} + unsigned int val = 1; + ecore_x_window_prop_card32_set + (xwin, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL, &val, 1); #endif - -HAPI Evas_Object *quickpanel_ui_load_edj(Evas_Object * parent, const char *file, - const char *group, int is_just_load) -{ - Eina_Bool r; - Evas_Object *eo = NULL; - - retif(parent == NULL, NULL, "Invalid parameter!"); - - eo = elm_layout_add(parent); - retif(eo == NULL, NULL, "Failed to add layout object!"); - - r = elm_layout_file_set(eo, file, group); - retif(r != EINA_TRUE, NULL, - "Failed to set edje object file[%s-%s]!", file, group); - - evas_object_size_hint_weight_set(eo, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - - if (is_just_load == 1) { - elm_win_resize_object_add(parent, eo); + evas_object_show(eo); } - evas_object_show(eo); return eo; } -static int _quickpanel_ui_create_win(void *data) +static int _ui_gui_create(void *data) { struct appdata *ad = data; - int w = 0; - int h = 0; + int w = 0, h = 0; int initial_angle = 0; + Evas_Object *page_base = NULL; retif(data == NULL, QP_FAIL, "Invialid parameter!"); - ad->win = _quickpanel_ui_window_add("Quickpanel Window", + ad->win = _ui_window_add("Quickpanel Window", QP_WINDOW_PRIO); - if (ad->win == NULL) { - ERR("ui create : failed to create window."); - return -1; + retif(ad->win == NULL, QP_FAIL, "Failed to create main window"); + //build error + //elm_win_focus_allow_set(ad->win, EINA_TRUE); + + evas_object_smart_callback_add(ad->win, "wm,rotation,changed", + _ui_rotation_wm_cb, ad); + + ad->background = elm_bg_add(ad->win); + if (ad->background != NULL) { + evas_object_size_hint_weight_set(ad->background, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(ad->win, ad->background); + evas_object_show(ad->background); + } else { + ERR("failed to create background"); } -#ifdef QP_INDICATOR_WIDGET_ENABLE - ad->comformant = elm_conformant_add(ad->win); -#if QP_ENABLE_HIDING_INDICATOR - elm_object_style_set(ad->comformant, "without_resize"); -#else - elm_object_style_set(ad->comformant, "nokeypad"); -#endif - ad->ly = quickpanel_ui_load_edj(ad->comformant, - DEFAULT_EDJ, "quickpanel/gl_base", 0); - if (ad->ly == NULL) - return -1; + ad->view_root = quickpanel_uic_load_edj(ad->background, + DEFAULT_EDJ, "quickpanel/root", 0); + retif(ad->view_root == NULL, QP_FAIL, "Failed to create main page"); - evas_object_size_hint_weight_set(ad->comformant, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_win_resize_object_add(ad->win, ad->comformant); - evas_object_show(ad->comformant); - elm_object_content_set(ad->comformant, ad->ly); + Evas_Object *pager_scroller = quickpanel_pager_new(ad->view_root, NULL); + Evas_Object *pager_box = quickpanel_pager_view_get("BOX"); -#else - ad->ly = quickpanel_ui_load_edj(ad->win, - DEFAULT_EDJ, "quickpanel/gl_base", 0); - if (ad->ly == NULL) - return -1; -#endif + page_base = quickpanel_page_base_create(pager_box, NULL); + retif(page_base == NULL, QP_FAIL, "Failed to create main page"); + ad->ly = quickpanel_page_base_view_get("LAYOUT"); + retif(ad->ly == NULL, QP_FAIL, "Failed to create main page"); + + elm_box_pack_end(pager_box, page_base); + elm_win_resize_object_add(ad->win, ad->view_root); + elm_object_part_content_set(ad->view_root, "qp.root.swallow", pager_scroller); /* get noti evas */ ad->evas = evas_object_evas_get(ad->win); + ad->list = quickpanel_page_base_view_get("BOX"); + ad->scroller = quickpanel_page_base_view_get("SCROLLER"); - Evas_Object *sc = elm_scroller_add(ad->ly); - retif(!sc, EINA_FALSE, "fail to add scroller"); - elm_scroller_bounce_set(sc, EINA_TRUE, EINA_TRUE); - elm_scroller_policy_set(sc, - ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - evas_object_size_hint_weight_set(sc, - EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(sc); - - Evas_Object *box = elm_box_add(sc); - if (!box) { - ERR("fail to add box"); - evas_object_del(sc); - return EINA_FALSE; - } - evas_object_size_hint_weight_set(box, - EVAS_HINT_EXPAND, 0); - elm_box_horizontal_set(box, EINA_FALSE); - ad->list = box; - ad->scroller = sc; - -#ifdef TBD - _quickpanel_add_debugging_bar(ad->list); -#endif - - elm_object_content_set(sc, box); - elm_object_part_content_set(ad->ly, "qp.gl_base.gl.swallow", ad->scroller); - evas_object_show(ad->list); - - ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); + //ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); + elm_win_screen_size_get(ad->win, NULL, NULL, &w, &h); evas_object_resize(ad->win, w, h); ad->win_width = w; ad->win_height = h; - _quickpanel_init_size_genlist(ad); - _quickpanel_ui_set_indicator_cover(ad); - - /* key grab */ - utilx_grab_key(ecore_x_display_get(), elm_win_xwindow_get(ad->win), KEY_SELECT, SHARED_GRAB); - - initial_angle = _quickpanel_ui_rotation_get_angle(ad); - _quickpanel_ui_rotation(ad, initial_angle); - return 0; -} - -static void _quickpanel_ui_set_indicator_cover(void *data) -{ - retif(data == NULL, , "data is NULL"); - struct appdata *ad = data; - - int x_2 = 0, y_2 = 0; - int angle = ad->angle; - - int width = INDICATOR_COVER_W * ad->scale; - int height = INDICATOR_COVER_H * ad->scale; - - switch (angle) { - case 0: - x_2 = ad->win_width - width; - y_2 = 0; - break; - case 90: - x_2 = ad->win_height - width; - y_2 = 0; - break; - case 180: - x_2 = ad->win_width - width; - y_2 = 0; - break; - case 270: - x_2 = ad->win_height - width; - y_2 = 0; - break; - } - - if (ad->cover_indicator_right == NULL) { - Evas_Object *bg = evas_object_rectangle_add(ad->evas); - evas_object_color_set(bg, 52, 52, 50, 255); // opaque white background - evas_object_repeat_events_set(bg, EINA_FALSE); - evas_object_resize(bg, width, height); // covers full canvas - evas_object_move(bg, x_2, y_2); - evas_object_show(bg); - ad->cover_indicator_right = bg; - } else { - evas_object_move(ad->cover_indicator_right, x_2, y_2); - } -} - -static void _quickpanel_ui_window_set_input_region(void *data, int contents_height) -{ - struct appdata *ad = NULL; - Ecore_X_Window xwin; - Ecore_X_Atom atom_window_input_region = 0; - unsigned int window_input_region[4] = {0,}; + _ui_geometry_info_set(ad); - retif(data == NULL, , "Invialid parameter!"); - ad = data; + initial_angle = _ui_rotation_angle_get(ad); + _ui_rotate(ad, initial_angle); - xwin = elm_win_xwindow_get(ad->win); + quickpanel_pager_page_set(PAGE_IDX_MAIN, 1); - INFO("angle:%d", ad->angle); - switch (ad->angle) { - case 0: - window_input_region[0] = 0; //X - window_input_region[1] = contents_height; // Y - window_input_region[2] = ad->win_width; // Width - window_input_region[3] = ad->scale * QP_HANDLE_H; // height - break; - case 90: - window_input_region[0] = contents_height; //X - window_input_region[1] = 0; // Y - window_input_region[2] = ad->scale * QP_HANDLE_H; // Width - window_input_region[3] = ad->win_height; // height - break; - case 180: - window_input_region[0] = 0; //X - window_input_region[1] = ad->win_height - contents_height - ad->scale * QP_HANDLE_H; // Y - window_input_region[2] = ad->win_width; // Width - window_input_region[3] = ad->scale * QP_HANDLE_H; // height - break; - case 270: - window_input_region[0] = ad->win_width - contents_height - ad->scale * QP_HANDLE_H ; //X - window_input_region[1] = 0; // Y - window_input_region[2] = ad->scale * QP_HANDLE_H; // Width - window_input_region[3] = ad->win_height; // height - break; - } + sim_controller_init(ad->ly); - INFO("win_input_0:%d\nwin_input_1:%d\nwin_input_2:%d\nwin_input_3:%d\n" - ,window_input_region[0] - ,window_input_region[1] - ,window_input_region[2] - ,window_input_region[3] - ); + quickpanel_noti_init_noti_section(); - atom_window_input_region = ecore_x_atom_get(STR_ATOM_WINDOW_INPUT_REGION); - ecore_x_window_prop_card32_set(xwin, atom_window_input_region, window_input_region, 4); -} - -static void _quickpanel_ui_window_set_content_region(void *data, int contents_height) -{ - struct appdata *ad = NULL; - Ecore_X_Window xwin; - Ecore_X_Atom atom_window_contents_region = 0; - unsigned int window_contents_region[4] = {0,}; - - retif(data == NULL, , "Invialid parameter!"); - ad = data; - - xwin = elm_win_xwindow_get(ad->win); - - INFO("angle:%d", ad->angle); - switch (ad->angle) { - case 0: - window_contents_region[0] = 0; //X - window_contents_region[1] = 0; // Y - window_contents_region[2] = ad->win_width; // Width - window_contents_region[3] = contents_height; // height - break; - case 90: - window_contents_region[0] = 0; //X - window_contents_region[1] = 0; // Y - window_contents_region[2] = contents_height; // Width - window_contents_region[3] = ad->win_height; // height - break; - case 180: - window_contents_region[0] = 0; //X - window_contents_region[1] = ad->win_height - contents_height; // Y - window_contents_region[2] = ad->win_width; // Width - window_contents_region[3] = contents_height; // height - break; - case 270: - window_contents_region[0] = ad->win_width - contents_height ; //X - window_contents_region[1] = 0; // Y - window_contents_region[2] = contents_height; // Width - window_contents_region[3] = ad->win_height; // height - break; - } - - DBG("win_contents_0:%d\nwin_contents_1:%d\nwin_contents_2:%d\nwin_contents_3:%d\n" - ,window_contents_region[0] - ,window_contents_region[1] - ,window_contents_region[2] - ,window_contents_region[3] - ); - - atom_window_contents_region = ecore_x_atom_get(STR_ATOM_WINDOW_CONTENTS_REGION); - ecore_x_window_prop_card32_set(xwin, atom_window_contents_region, window_contents_region, 4); + return 0; } -static int _quickpanel_ui_delete_win(void *data) +static int _ui_gui_destroy(void *data) { struct appdata *ad = data; retif(data == NULL, QP_FAIL, "Invialid parameter!"); + if (ad->list != NULL) { + evas_object_del(ad->list); + ad->list = NULL; + } + if (ad->scroller != NULL) { + evas_object_del(ad->scroller); + ad->scroller = NULL; + } if (ad->ly != NULL) { evas_object_del(ad->ly); ad->ly = NULL; @@ -657,18 +489,30 @@ static int _quickpanel_ui_delete_win(void *data) return QP_OK; } -static void _quickpanel_ui_vconf_event_powerff_cb(keynode_t *node, - void *data) +static void _ui_setting_visibility_set(struct appdata *ad, int show) +{ + retif(ad == NULL, , "data is NULL"); + retif(ad->ly == NULL, , "data is NULL"); + + elm_object_signal_emit(ad->ly, "quickpanel.setting.show", + "quickpanel.prog"); +} + +/***************************************************************************** + * + * event handler initialization functions + * + ****************************************************************************/ +static void _vconf_event_powerff_cb(keynode_t *node, void *data) { int val; if (vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val) == 0 && (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT || val == VCONFKEY_SYSMAN_POWER_OFF_RESTART)) { - app_efl_exit(); + ui_app_exit(); } } -static void _quickpanel_ui_vconf_event_lcdoff_cb(keynode_t *node, - void *data) +static void _vconf_event_lcdoff_cb(keynode_t *node, void *data) { int ret = 0; int pm_state = VCONFKEY_PM_STATE_NORMAL; @@ -676,140 +520,303 @@ static void _quickpanel_ui_vconf_event_lcdoff_cb(keynode_t *node, ret = vconf_get_int(VCONFKEY_PM_STATE, &pm_state); if (ret == 0 && pm_state == VCONFKEY_PM_STATE_LCDOFF) { - quickpanel_close_quickpanel(false); + quickpanel_uic_close_quickpanel(false, 0); + } +} + +static Eina_Bool _ecore_event_client_message_cb(void *data, int type, void *event) +{ + struct appdata *ad = data; +#ifdef HAVE_X + Ecore_X_Event_Client_Message *ev = event; + + retif(data == NULL || event == NULL, + ECORE_CALLBACK_RENEW, "Invalid parameter!"); + + if (ev->message_type == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE) { + if (ev->data.l[0] == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF) { + SERR("quickpanel is closed"); + ad->is_opened = 0; + quickpanel_util_time_timer_enable_set(0); + quickpanel_keyboard_closing_fini(ad); + quickpanel_keyboard_x_closing_fini(ad); + quickpanel_modules_closed(data); + quickpanel_media_player_stop(); + } + } else if (ev->message_type == E_ILLUME_ATOM_MV_QUICKPANEL_STATE) { + if (ev->data.l[0] == 1) { + // pressed + if (ad->is_opened == 0) { + quickpanel_util_time_timer_enable_set(1); + quickpanel_keyboard_openning_init(ad); + quickpanel_keyboard_x_openning_init(ad); + if (quickpanel_uic_opened_reason_get() != OPENED_BY_CMD_SHOW_SETTINGS) { + quickpanel_pager_page_set(PAGE_IDX_MAIN, 0); + } + } + _ui_handler_enable_set(EINA_TRUE); + } + if (ev->data.l[0] == 0) { + // released + if (ad->is_opened == 0) { + SERR("quickpanel is opened"); + ad->is_opened = 1; + quickpanel_modules_opened(data); + quickpanel_media_player_stop(); + quickpanel_uic_opened_reason_set(OPENED_NO_REASON); + } + _ui_handler_enable_set(EINA_FALSE); + } } +#endif + return ECORE_CALLBACK_RENEW; } -static void _quickpanel_ui_vconf_event_init(struct appdata *ad) +static void _vconf_init(struct appdata *ad) { int ret = 0; ret = vconf_notify_key_changed(VCONFKEY_PM_STATE, - _quickpanel_ui_vconf_event_lcdoff_cb, ad); + _vconf_event_lcdoff_cb, ad); if (ret != 0) { ERR("VCONFKEY_PM_STATE: %d", ret); } ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, - _quickpanel_ui_vconf_event_powerff_cb, ad); + _vconf_event_powerff_cb, ad); if (ret != 0) { ERR("VCONFKEY_PM_STATE: %d", ret); } } -static void _quickpanel_ui_vconf_event_fini(struct appdata *ad) +static void _vconf_fini(struct appdata *ad) { int ret = 0; ret = vconf_ignore_key_changed(VCONFKEY_PM_STATE, - _quickpanel_ui_vconf_event_lcdoff_cb); + _vconf_event_lcdoff_cb); if (ret != 0) { ERR("VCONFKEY_PM_STATE: %d", ret); } ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, - _quickpanel_ui_vconf_event_powerff_cb); + _vconf_event_powerff_cb); if (ret != 0) { ERR("VCONFKEY_PM_STATE: %d", ret); } } -static void _quickpanel_ui_init_ecore_event(struct appdata *ad) +static void _edbus_init(struct appdata *ad) +{ + e_dbus_init(); + ad->dbus_connection = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (ad->dbus_connection == NULL) { + ERR("noti register : failed to get dbus bus"); + } +} + +static void _edbus_fini(struct appdata *ad) +{ + if (ad->dbus_connection != NULL) { + e_dbus_connection_close(ad->dbus_connection); + ad->dbus_connection = NULL; + e_dbus_shutdown(); + } +} + +static void _ecore_event_init(struct appdata *ad) { Ecore_Event_Handler *hdl = NULL; - Ecore_Event_Handler *hdl_key = NULL; /* Register window rotate event */ +#ifdef HAVE_X hdl = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, - quickpanel_ui_client_message_cb, ad); - if (hdl == NULL) + _ecore_event_client_message_cb, ad); +#endif + if (hdl == NULL) { ERR("failed to add handler(ECORE_X_EVENT_CLIENT_MESSAGE)"); + } ad->hdl_client_message = hdl; - - hdl_key = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _quickpanel_hardkey_cb, ad); - if (hdl_key == NULL) - ERR("failed to add handler(ECORE_EVENT_KEY_UP)"); - - ad->hdl_hardkey = hdl_key; } -static void _quickpanel_ui_fini_ecore_event(struct appdata *ad) +static void _ecore_event_fini(struct appdata *ad) { if (ad->hdl_client_message != NULL) { ecore_event_handler_del(ad->hdl_client_message); ad->hdl_client_message = NULL; } - if (ad->hdl_hardkey != NULL) { - ecore_event_handler_del(ad->hdl_hardkey); - ad->hdl_hardkey = NULL; - } } -static void _quickpanel_ui_setting_show(struct appdata *ad, int show) +static void _x_atom_init(void) +{ +#ifdef HAVE_X + E_ILLUME_ATOM_MV_QUICKPANEL_STATE = ecore_x_atom_get("_E_MOVE_QUICKPANEL_STATE"); +#endif +} +/***************************************************************************** + * + * App efl main interface + * + ****************************************************************************/ +static void _sigaction_terminate_handler(int signum, siginfo_t *info, void *unused) +{ + ERR("quickpanel going to be terminated"); + ui_app_exit(); +} + +static void _service_request_process(app_control_h service, void *data) { - if (!ad) - return; + char *value = NULL; + retif(service == NULL, , "Invialid parameter!"); - if (!ad->ly) - return; + if (!app_control_get_extra_data(service, "HIDE_LAUNCH", &value)) + { + if (value != NULL) { + ERR("HIDE_LAUNCH: %s", value); + if (!strcmp(value, "1")) { + quickpanel_uic_close_quickpanel(false, 0); + } else { + quickpanel_uic_open_quickpanel(OPENED_BY_CMD_HIDE_LAUNCH); + } + + free(value); + } + } else if (!app_control_get_extra_data(service, "SHOW_SETTINGS", &value)) { + if (value != NULL) { + ERR("SHOW_SETTINGS: %s", value); + if (!strcmp(value, "1")) { + quickpanel_pager_page_set(PAGE_IDX_EDITING, 0); + quickpanel_uic_open_quickpanel(OPENED_BY_CMD_SHOW_SETTINGS); + } + + free(value); + } + } +#ifdef QP_EMERGENCY_MODE_ENABLE + else if (!app_control_get_extra_data(service, "EMERGENCY_MODE_LAUNCH", &value)) { + if (value != NULL) { + ERR("EMERGENCY_MODE_LAUNCH: %s", value); + if (!strcmp(value, "1")) { + if (quickpanel_emergency_mode_syspopup_launch() == QP_FAIL) { + ERR("failed to launch emergency mode syspopup"); + } else { + quickpanel_uic_close_quickpanel(true, 0); + } + } + + free(value); + } + } +#endif } -static void _quickpanel_ui_update_height(void *data) +static Eina_Bool _appcore_cache_flush_timer_cb(void *data) { - int contents_height = 0; - int height_genlist = 0; + if (!quickpanel_uic_is_suspended()) { + return ECORE_CALLBACK_CANCEL; + } - struct appdata *ad = NULL; + return ECORE_CALLBACK_CANCEL; +} - retif(data == NULL, , "data is NULL"); - ad = data; +static Eina_Bool _ui_refresh_idler_cb(void *data) +{ + DBG(""); + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + quickpanel_modules_refresh(ad); + _ui_geometry_info_set(ad); + _ui_handler_info_set(ad); - height_genlist = ad->gl_limit_height; - contents_height = ad->gl_distance_from_top + height_genlist + ad->gl_distance_to_bottom - ad->scale * QP_HANDLE_H; + /* Cache memory is cleared when the application paused (every time, after 5 seconds (in appcore)), + * but after running in a minimized mode application have status AS_RUNNING. + * Application have status AS_PAUSED only after change of visibility to hidden condition by user (on hiding window) + * Cleaning must be performed only once after application loading in hidden condition + * (and stay in a hidden condition at time of cleaning). + */ + ecore_timer_add(10, _appcore_cache_flush_timer_cb, NULL); - _quickpanel_ui_window_set_input_region(ad, contents_height); - _quickpanel_ui_window_set_content_region(ad, contents_height); + return EINA_FALSE; } -static void _quickpanel_init_size_genlist(void *data) +static void _quickpanel_initialize(void *data) { - struct appdata *ad = NULL; - int max_height_window = 0; - Evas_Coord genlist_y = 0; - Evas_Coord spn_height = 0; + int ret = 0; + struct appdata *ad = data; + retif(ad == NULL, , "Invialid parameter!"); - retif(data == NULL, , "data is NULL"); - ad = data; + INFO(">> Creating Quickpanel"); + /* Check emulator */ + ad->is_emul = quickpanel_uic_is_emul(); + INFO("quickpanel run in %s", ad->is_emul ? "Emul" : "Device"); - if (ad->angle == 90 || ad->angle == 270 ) - max_height_window = ad->win_width; - else - max_height_window = ad->win_height; + int w, h; +#ifdef HAVE_X + Ecore_X_Screen *screen = ecore_x_default_screen_get(); + //ecore_x_screen_size_get(screen, &w, &h); + elm_win_screen_size_get(screen, NULL, NULL, &w, &h); +#endif + + ad->scale = elm_config_scale_get(); + if (ad->scale < 0) { + ad->scale = 1.0; + } - edje_object_part_geometry_get(_EDJ(ad->ly), "qp.gl_base.gl.swallow", NULL, &genlist_y, NULL, NULL); - edje_object_part_geometry_get(_EDJ(ad->ly), "qp.base.spn.swallow", NULL, NULL, NULL, &spn_height); + INFO("quickpanel scale %f", ad->scale); - ad->gl_distance_from_top = genlist_y; - ad->gl_distance_to_bottom = spn_height + (1 * ad->scale) + (ad->scale*QP_HANDLE_H) ; - ad->gl_limit_height = max_height_window - ad->gl_distance_from_top - ad->gl_distance_to_bottom; + ad->is_suspended = 1; + + /* Get theme */ + elm_theme_extension_add(NULL, DEFAULT_THEME_EDJ); + /* create quickpanel window */ + ret = _ui_gui_create(ad); + retif(ret != QP_OK, , "Failed to create window!"); + + quickpanel_media_init(); + + _x_atom_init(); + _ecore_event_init(ad); + _vconf_init(ad); + _edbus_init(ad); + + quickpanel_uninstall_init(ad); +#ifdef QP_EMERGENCY_MODE_ENABLE + quickpanel_emergency_mode_init(ad); +#endif + quickpanel_conf_init(ad); + quickpanel_keyboard_init(ad); + quickpanel_keyboard_x_init(ad); +#ifdef QP_REMINDER_ENABLE + quickpanel_reminder_init(ad); +#endif + +#ifdef QP_SETTING_ENABLE + _ui_setting_visibility_set(ad, 1); +#else /* QP_SETTING_ENABLE */ + _ui_setting_visibility_set(ad, 0); +#endif /* QP_SETTING_ENABLE */ + + /* init quickpanel modules */ + quickpanel_modules_init(ad); + ecore_idler_add(_ui_refresh_idler_cb, ad); } -/***************************************************************************** - * - * App efl main interface - * - ****************************************************************************/ -static bool quickpanel_app_create(void *data) +static bool _app_create_cb(void *data) { - DBG(""); + ERR(""); + + elm_config_engine_set("opengl_x11"); + + elm_app_base_scale_set(1.8); pid_t pid; int r; // signal handler struct sigaction act; - act.sa_sigaction = _quickpanel_signal_handler; + act.sa_sigaction = _sigaction_terminate_handler; act.sa_flags = SA_SIGINFO; int ret = sigemptyset(&act.sa_mask); @@ -826,238 +833,145 @@ static bool quickpanel_app_create(void *data) } pid = setsid(); - if (pid < 0) + if (pid < 0) { WARN("Failed to set session id!"); + } r = nice(2); - if (r == -1) + if (r == -1) { WARN("Failed to set nice value!"); + } return TRUE; } -static void quickpanel_app_terminate(void *data) +static void _app_service_cb(app_control_h service, void *data) { - DBG(""); - struct appdata *ad = data; - retif(ad == NULL, , "invalid data."); - - /* fini quickpanel modules */ - fini_modules(ad); - - _quickpanel_cache_flush(ad->evas); - - feedback_deinitialize(); - - /* unregister system event callback */ - _quickpanel_ui_vconf_event_fini(ad); - - _quickpanel_ui_fini_ecore_event(ad); + retif(ad == NULL, , "Invialid parameter!"); - if (ad->cover_indicator_right != NULL) { - evas_object_del(ad->cover_indicator_right); - ad->cover_indicator_right = NULL; + if (ad->win == NULL && ad->ly == NULL) { + _quickpanel_initialize(data); + } else { + _service_request_process(service, data); } - /* delete quickpanel window */ - _quickpanel_ui_delete_win(ad); - - INFO(" >>>>>>>>>>>>>>> QUICKPANEL IS TERMINATED!! <<<<<<<<<<<<<<<< "); } -static void quickpanel_app_pause(void *data) +static void _app_terminate_cb(void *data) { - DBG(""); + ERR(""); struct appdata *ad = data; - retif(ad == NULL,, "invalid data."); + retif(ad == NULL, , "invalid data."); - suspend_modules(ad); - quickpanel_ui_del_current_popup(); + quickpanel_media_fini(); - ad->is_suspended = 1; + /* fini quickpanel modules */ + quickpanel_modules_fini(ad); + _edbus_fini(ad); + _vconf_fini(ad); + _ecore_event_fini(ad); + + quickpanel_keyboard_fini(ad); + quickpanel_keyboard_x_fini(ad); + quickpanel_uninstall_fini(ad); +#ifdef QP_REMINDER_ENABLE + quickpanel_reminder_fini(ad); +#endif +#ifdef QP_EMERGENCY_MODE_ENABLE + quickpanel_emergency_mode_fini(ad); +#endif + quickpanel_conf_fini(ad); - _quickpanel_cache_flush(ad->evas); + /* delete quickpanel window */ + _ui_gui_destroy(ad); + + INFO("Quickpanel is terminated"); } -static void quickpanel_app_resume(void *data) +static void _app_resume_cb(void *data) { DBG(""); - struct appdata *ad = data; retif(ad == NULL,, "invalid data."); ad->is_suspended = 0; + _ui_handler_enable_set(EINA_FALSE); + + quickpanel_modules_resume(data); - resume_modules(data); + sim_controller_resume(); } -static void quickpanel_app_service(service_h service, void *data) +static void _app_pause_cb(void *data) { + DBG(""); struct appdata *ad = data; - int ret = 0; - - retif(ad == NULL, , "Invialid parameter!"); - - INFO(" >>>>>>>>>>>>>>> QUICKPANEL IS STARTED!! <<<<<<<<<<<<<<<< "); - - /* Check emulator */ - ad->is_emul = quickpanel_is_emul(); - INFO("quickpanel run in %s", ad->is_emul ? "Emul" : "Device"); - - ad->scale = elm_config_scale_get(); - if (ad->scale < 0) - ad->scale = 1.0; - - INFO("quickpanel scale %f", ad->scale); - - /* Get theme */ - elm_theme_extension_add(NULL, DEFAULT_THEME_EDJ); - - /* create quickpanel window */ - ret = _quickpanel_ui_create_win(ad); - retif(ret != QP_OK, , "Failed to create window!"); - - atoms_init_quickpanel(); - - ad->E_ILLUME_ATOM_MV_QUICKPANEL_STATE = &E_ILLUME_ATOM_MV_QUICKPANEL_STATE; - - _quickpanel_ui_init_ecore_event(ad); - - _quickpanel_ui_vconf_event_init(ad); + retif(ad == NULL,, "invalid data."); - feedback_initialize(); -#ifdef QP_SETTING_ENABLE - _quickpanel_ui_setting_show(ad, 1); -#else /* QP_SETTING_ENABLE */ - _quickpanel_ui_setting_show(ad, 0); -#endif /* QP_SETTING_ENABLE */ + quickpanel_modules_suspend(ad); - /* init quickpanel modules */ - init_modules(ad); + ad->is_suspended = 1; - ecore_idler_add(_quickpanel_ui_refresh_cb, ad); + if (ad->evas != NULL) { + _ui_efl_cache_flush(ad->evas); + evas_event_feed_mouse_cancel(ad->evas, ecore_time_get(), NULL); + } } -static void quickpanel_app_language_changed_cb(void *data) +static void _app_language_changed_cb(app_event_info_h event_info, void *data) { - retif(data == NULL, , "Invalid parameter!"); + DBG(""); + quickpanel_modules_lang_change(data); - INFO(" >>>>>>>>>>>>>>> LANGUAGE CHANGED!! <<<<<<<<<<<<<<<< "); - lang_change_modules(data); + sim_controller_on_language_change(); } -static void quickpanel_app_region_format_changed_cb(void *data) +static void _app_region_format_changed_cb(app_event_info_h event_info, void *data) { - INFO(" >>>>>>>>>>>>>>> region_format CHANGED!! <<<<<<<<<<<<<<<< "); -} - -HAPI void quickpanel_open_quickpanel(void) { - Ecore_X_Window xwin; - Ecore_X_Window zone; - struct appdata *ad = g_app_data; - DBG(""); - - retif(ad == NULL, , "Invalid parameter!"); - retif(ad->win == NULL, , "Invalid parameter!"); - - xwin = elm_win_xwindow_get(ad->win); - if (xwin != 0) { - if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) { - ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON); - } else { - ERR("failed to get zone"); - } - } else { - ERR("failed to get xwin"); - } + quickpanel_modules_lang_change(data); } -HAPI void quickpanel_close_quickpanel(bool is_check_lock) { - Ecore_X_Window xwin; - Ecore_X_Window zone; - int is_lock_launched = VCONFKEY_IDLE_UNLOCK; - struct appdata *ad = g_app_data; - - DBG(""); +int main(int argc, char *argv[]) +{ + INFO("BUILD START: %s %s", __DATE__, __TIME__); + ERR("BUILD START: %s %s", __DATE__, __TIME__); - retif(ad == NULL, , "Invalid parameter!"); - retif(ad->win == NULL, , "Invalid parameter!"); + int ret = 0; + struct appdata ad; + ui_app_lifecycle_callback_s event_callback = {0,}; + app_event_handler_h handlers[5] = {NULL, }; - if (is_check_lock == true) { - if (vconf_get_int(VCONFKEY_IDLE_LOCK_STATE, &is_lock_launched) == 0) { - if (is_lock_launched == VCONFKEY_IDLE_LOCK) { - vconf_set_int(VCONFKEY_IDLE_LOCK_STATE, VCONFKEY_IDLE_UNLOCK); - ERR("do unlock"); - } - } - } + ERR("quickpanel is forked"); - xwin = elm_win_xwindow_get(ad->win); - if (xwin != 0) { - if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) { - ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF); - } else { - ERR("failed to get zone"); - } - } else { - ERR("failed to get xwin"); + ret = control_privilege(); + if (ret != 0) { + WARN("Failed to control privilege!"); } -} - -HAPI void quickpanel_toggle_openning_quickpanel(void) { - Ecore_X_Window xwin; - Ecore_X_Window zone; - struct appdata *ad = g_app_data; - DBG(""); + event_callback.create = _app_create_cb; + event_callback.terminate = _app_terminate_cb; + event_callback.pause = _app_pause_cb; + event_callback.resume = _app_resume_cb; + event_callback.app_control = _app_service_cb; - retif(ad == NULL, , "Invalid parameter!"); - retif(ad->win == NULL, , "Invalid parameter!"); + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed_cb, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, _app_region_format_changed_cb, &ad); - xwin = elm_win_xwindow_get(ad->win); - if (xwin != 0) { - if ((zone = ecore_x_e_illume_zone_get(xwin)) != 0) { - if (ecore_x_e_illume_quickpanel_state_get(zone) == ECORE_X_ILLUME_QUICKPANEL_STATE_ON) { - ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF); - } else { - ecore_x_e_illume_quickpanel_state_send(zone, ECORE_X_ILLUME_QUICKPANEL_STATE_ON); - } - } else { - ERR("failed to get zone"); - } - } else { - ERR("failed to get xwin"); - } -} + memset(&ad, 0x0, sizeof(struct appdata)); -int main(int argc, char *argv[]) -{ - int r = 0; - struct appdata ad; - app_event_callback_s app_callback = {0,}; + g_app_data = &ad; - r = perm_app_set_privilege("org.tizen.quickpanel", NULL, NULL); - if (r != PC_OPERATION_SUCCESS) { - WARN("Failed to set privilege!"); + ret = ui_app_main(argc, argv, &event_callback, (void *)&ad); + if (ret != APP_ERROR_NONE) { + ERR("ui_app_main() is failed. err = %d", ret); } - app_callback.create = quickpanel_app_create; - app_callback.terminate = quickpanel_app_terminate; - app_callback.pause = quickpanel_app_pause; - app_callback.resume = quickpanel_app_resume; - app_callback.service = quickpanel_app_service; - app_callback.low_memory = NULL; - app_callback.low_battery = NULL; - app_callback.device_orientation = NULL; - app_callback.language_changed = quickpanel_app_language_changed_cb; - app_callback.region_format_changed = quickpanel_app_region_format_changed_cb; - - memset(&ad, 0x0, sizeof(struct appdata)); - - g_app_data = &ad; + return ret; - return app_efl_main(&argc, &argv, &app_callback, (void *)&ad); } diff --git a/daemon/quickpanel-ui.h b/daemon/quickpanel-ui.h index fb32a10..5fad73b 100755 --- a/daemon/quickpanel-ui.h +++ b/daemon/quickpanel-ui.h @@ -1,74 +1,97 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the "License"); + * Licensed under the Apache License, Version 2.0 (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/ + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ + #ifndef __QUICKPANEL_UI_H__ #define __QUICKPANEL_UI_H__ #include <Elementary.h> +#include <E_DBus.h> +#ifdef HAVE_X #include <Ecore_X.h> #include <X11/Xatom.h> +#endif #include "media.h" +#include "common_uic.h" -#if !defined(VENDOR) -# define VENDOR "org.tizen" -#endif #if !defined(PACKAGE) -# define PACKAGE "quickpanel" +# define PACKAGE "quickpanel" #endif #if !defined(LOCALEDIR) -# define LOCALEDIR "/usr/apps/"VENDOR"."PACKAGE"/res/locale" +# define LOCALEDIR "/usr/apps/org.tizen.quickpanel/res/locale" #endif #if !defined(EDJDIR) -# define EDJDIR "/usr/apps/"VENDOR"."PACKAGE"/res/edje" +# define EDJDIR "/usr/apps/org.tizen.quickpanel/res/edje" +#endif + +#if !defined(SHARED_DIR) +# define SHARED_DIR "/usr/apps/org.tizen.quickpanel/shared/res" #endif /* EDJ theme */ #define DEFAULT_EDJ EDJDIR"/"PACKAGE".edj" #define DEFAULT_THEME_EDJ EDJDIR"/"PACKAGE"_theme.edj" +#define SLIDER_THEME_EDJ EDJDIR"/"PACKAGE"_slider_theme.edj" +#define ACTIVENOTI_EDJ EDJDIR"/"PACKAGE"_activenoti.edj" #define _EDJ(o) elm_layout_edje_get(o) -#define _S(str) dgettext("sys_string", str) + #undef _ #define _(str) gettext(str) #define _NOT_LOCALIZED(str) (str) -#define QP_SETTING_SOUND_SIP_PATH \ - "/usr/apps/com.samsung.quickpanel/data/sip.wav" - #define STR_ATOM_WINDOW_INPUT_REGION "_E_COMP_WINDOW_INPUT_REGION" #define STR_ATOM_WINDOW_CONTENTS_REGION "_E_COMP_WINDOW_CONTENTS_REGION" #define MAX_NAM_LEN 4096 -#define INDICATOR_COVER_W 82 +#define INDICATOR_COVER_W 64 #define INDICATOR_COVER_H 60 #define _NEWLINE '\n' #define _SPACE ' ' + +#define QP_DBUS_NAME "org.tizen.quickpanel" +#define QP_DBUS_PATH "/Org/Tizen/Quickpanel" + +#define QP_DBUS_CLIENT_NAME "org.tizen.quickpanelsetting" +#define QP_DBUS_CLIENT_PATH "/Org/Tizen/Quickpanelsetting" + +#if !defined(VENDOR) +#define QP_PKG_QUICKPANEL "org.tizen.quickpanel" +#define QP_SETTING_PKG_SETTING "org.tizen.setting" +#define QP_MINIAPPTRAY_PKG "org.tizen.mini-apps" +#else +#define QP_PKG_QUICKPANEL VENDOR".quickpanel" #define QP_SETTING_PKG_SETTING VENDOR".setting" -#define QP_SETTING_PKG_SETTING_EMUL "kto5jikgul.Settings" +#define QP_MINIAPPTRAY_PKG VENDOR".mini-apps" +#endif +#define QP_SEARCH_PKG "org.tizen.sfinder" struct appdata { Evas_Object *win; -#ifdef QP_INDICATOR_WIDGET_ENABLE - Evas_Object *comformant; -#endif - Evas_Object *ly; + + Evas_Object *background; + Evas_Object *view_root; + Evas_Object *view_page_zero; + Evas_Object *ly; //view_base + Evas *evas; Evas_Object *scroller; @@ -87,24 +110,21 @@ struct appdata { int is_emul; /* 0 : target, 1 : emul */ int is_suspended; int is_opened; + int opening_reason; Ecore_Event_Handler *hdl_client_message; - Ecore_Event_Handler *hdl_hardkey; + Ecore_Event_Handler *hdl_hardkey_down; + Ecore_Event_Handler *hdl_hardkey_up; + Eina_Bool is_hardkey_cancel; E_DBus_Connection *dbus_connection; - E_DBus_Signal_Handler *dbus_handler_size; - E_DBus_Signal_Handler *dbus_handler_progress; - E_DBus_Signal_Handler *dbus_handler_content; - - Evas_Object *cover_indicator_right; - - Ecore_X_Atom *E_ILLUME_ATOM_MV_QUICKPANEL_STATE; }; typedef struct _QP_Module { char *name; /* func */ int (*init) (void *); + void (*init_job_cb) (void *); int (*fini) (void *); int (*suspend) (void *); int (*resume) (void *); @@ -115,24 +135,14 @@ typedef struct _QP_Module { unsigned int (*get_height) (void *); void (*qp_opened) (void *); void (*qp_closed) (void *); + void (*mw_enabled) (void *); + void (*mw_disabled) (void *); /* do not modify this area */ /* internal data */ Eina_Bool state; } QP_Module; -int quickpanel_launch_app(char *app_id, void *data); -void quickpanel_launch_app_inform_result(const char *pkgname, int retcode); -int quickpanel_is_emul(void); -void quickpanel_init_size_genlist(void *data); -void quickpanel_ui_update_height(void *data); void *quickpanel_get_app_data(void); -int quickpanel_is_suspended(void); -Evas_Object *quickpanel_ui_load_edj(Evas_Object * parent, const char *file, - const char *group, int is_just_load); -void quickpanel_ui_set_indicator_cover(void *data); -void quickpanel_close_quickpanel(bool is_check_lock); -void quickpanel_open_quickpanel(void); -void quickpanel_toggle_openning_quickpanel(void); #endif /* __QUICKPANEL_UI_H__ */ diff --git a/daemon/quickpanel-ui_x11.c b/daemon/quickpanel-ui_x11.c new file mode 100644 index 0000000..16af363 --- /dev/null +++ b/daemon/quickpanel-ui_x11.c @@ -0,0 +1,957 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <stdio.h> +#include <signal.h> +#include <app.h> +#include <sys/utsname.h> +#include <X11/Xlib.h> +#include <utilX.h> +#include <Ecore_Input.h> +#include <vconf.h> +#include <unistd.h> +#include <malloc.h> +#include <privilege-control.h> + +/* quickpanel basics */ +#include "common.h" +#include "quickpanel-ui.h" +#include "modules.h" +#include "quickpanel_def.h" +#include "list_util.h" +#include "vi_manager.h" +#include "pager.h" +#include "page_base.h" +#ifdef QP_ENABLE_PAGE_EDIT +#include "page_edit.h" +#else +#include "page_setting_all.h" +#endif + +#include "sim_controller.h" +#include "noti.h" + +/* services */ +#include "keyboard.h" +#include "keyboard_x.h" +#include "uninstall.h" +#ifdef QP_REMINDER_ENABLE +#include "reminder.h" +#endif +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif +#include "configuration.h" +#include "minictrl.h" +#include "util-time.h" + +#include <tapi_common.h> +#include <ITapiSim.h> + + +#define QP_WINDOW_PRIO 300 + +static struct appdata *g_app_data = NULL; + +static Ecore_X_Atom E_ILLUME_ATOM_MV_QUICKPANEL_STATE; + +static void _ui_rotate(void *data, int new_angle); +static void _ui_geometry_info_set(void *data); +static void _ui_handler_info_set(void *data); +static void _ui_efl_cache_flush(void *evas); + +HAPI void *quickpanel_get_app_data(void) +{ + return g_app_data; +} + +/****************************************************************************** + * + * UI + * + ****************************************************************************/ +static void _ui_efl_cache_flush(void *evas) +{ + int file_cache; + int collection_cache; + int image_cache; + int font_cache; + + retif(evas == NULL, , "Evas is NULL\n"); + + file_cache = edje_file_cache_get(); + collection_cache = edje_collection_cache_get(); + image_cache = evas_image_cache_get(evas); + font_cache = evas_font_cache_get(evas); + + edje_file_cache_set(file_cache); + edje_collection_cache_set(collection_cache); + evas_image_cache_set(evas, 0); + evas_font_cache_set(evas, 0); + + evas_image_cache_flush(evas); + evas_render_idle_flush(evas); + evas_font_cache_flush(evas); + + edje_file_cache_flush(); + edje_collection_cache_flush(); + + edje_file_cache_set(file_cache); + edje_collection_cache_set(collection_cache); + evas_image_cache_set(evas, image_cache); + evas_font_cache_set(evas, font_cache); + + elm_cache_all_flush(); + malloc_trim(0); +} + +static void _ui_handler_input_region_set(void *data, int contents_height) +{ + struct appdata *ad = NULL; + Ecore_X_Window xwin; + Ecore_X_Atom atom_window_input_region = 0; + unsigned int window_input_region[4] = {0,}; + + retif(data == NULL, , "Invialid parameter!"); + ad = data; + + xwin = elm_win_xwindow_get(ad->win); + + switch (ad->angle) { + case 0: + window_input_region[0] = 0; //X + window_input_region[1] = contents_height; // Y + window_input_region[2] = ad->win_width; // Width + window_input_region[3] = ELM_SCALE_SIZE(QP_HANDLE_H); // height + break; + case 90: + window_input_region[0] = contents_height; //X + window_input_region[1] = 0; // Y + window_input_region[2] = ELM_SCALE_SIZE(QP_HANDLE_H); // Width + window_input_region[3] = ad->win_height; // height + break; + case 180: + window_input_region[0] = 0; //X + window_input_region[1] = ad->win_height - contents_height - ELM_SCALE_SIZE(QP_HANDLE_H); // Y + window_input_region[2] = ad->win_width; // Width + window_input_region[3] = ELM_SCALE_SIZE(QP_HANDLE_H); // height + break; + case 270: + window_input_region[0] = ad->win_width - contents_height - ELM_SCALE_SIZE(QP_HANDLE_H); //X + window_input_region[1] = 0; // Y + window_input_region[2] = ELM_SCALE_SIZE(QP_HANDLE_H); // Width + window_input_region[3] = ad->win_height; // height + break; + } + + INFO("win_input_0:%d\nwin_input_1:%d\nwin_input_2:%d\nwin_input_3:%d\n" + ,window_input_region[0] + ,window_input_region[1] + ,window_input_region[2] + ,window_input_region[3] + ); + + atom_window_input_region = ecore_x_atom_get(STR_ATOM_WINDOW_INPUT_REGION); + ecore_x_window_prop_card32_set(xwin, atom_window_input_region, window_input_region, 4); +} + +static void _ui_handler_content_region_set(void *data, int contents_height) +{ + struct appdata *ad = NULL; + Ecore_X_Window xwin; + Ecore_X_Atom atom_window_contents_region = 0; + unsigned int window_contents_region[4] = {0,}; + + retif(data == NULL, , "Invialid parameter!"); + ad = data; + + xwin = elm_win_xwindow_get(ad->win); + + switch (ad->angle) { + case 0: + window_contents_region[0] = 0; //X + window_contents_region[1] = 0; // Y + window_contents_region[2] = ad->win_width; // Width + window_contents_region[3] = contents_height; // height + break; + case 90: + window_contents_region[0] = 0; //X + window_contents_region[1] = 0; // Y + window_contents_region[2] = contents_height; // Width + window_contents_region[3] = ad->win_height; // height + break; + case 180: + window_contents_region[0] = 0; //X + window_contents_region[1] = ad->win_height - contents_height; // Y + window_contents_region[2] = ad->win_width; // Width + window_contents_region[3] = contents_height; // height + break; + case 270: + window_contents_region[0] = ad->win_width - contents_height ; //X + window_contents_region[1] = 0; // Y + window_contents_region[2] = contents_height; // Width + window_contents_region[3] = ad->win_height; // height + break; + } + + DBG("win_contents_0:%d\nwin_contents_1:%d\nwin_contents_2:%d\nwin_contents_3:%d\n" + ,window_contents_region[0] + ,window_contents_region[1] + ,window_contents_region[2] + ,window_contents_region[3] + ); + + atom_window_contents_region = ecore_x_atom_get(STR_ATOM_WINDOW_CONTENTS_REGION); + ecore_x_window_prop_card32_set(xwin, atom_window_contents_region, window_contents_region, 4); +} + +static void _ui_handler_info_set(void *data) +{ + int contents_height = 0; + struct appdata *ad = NULL; + + retif(data == NULL, , "data is NULL"); + ad = data; + + contents_height = ad->gl_distance_from_top + ad->gl_limit_height; + + _ui_handler_input_region_set(ad, contents_height); + _ui_handler_content_region_set(ad, contents_height); +} + +static void _ui_geometry_info_set(void *data) +{ + struct appdata *ad = NULL; + int max_height_window = 0; + Evas_Coord genlist_y = 0; + + retif(data == NULL, , "data is NULL"); + ad = data; + + if (ad->angle == 90 || ad->angle == 270 ) { + max_height_window = ad->win_width; + } else { + max_height_window = ad->win_height; + } + + edje_object_part_geometry_get(_EDJ(ad->ly), "qp.base.list.swallow", NULL, &genlist_y, NULL, NULL); + + ad->gl_distance_from_top = genlist_y; + ad->gl_distance_to_bottom = ELM_SCALE_SIZE(QP_HANDLE_H); + ad->gl_limit_height = max_height_window - ad->gl_distance_from_top - ad->gl_distance_to_bottom; +} + +/***************************************************************************** + * + * ui rotation functions + * + ****************************************************************************/ +static void _ui_rotation_wm_cb(void *data, Evas_Object *obj, void *event) +{ + int angle = 0; + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + angle = elm_win_rotation_get((Evas_Object *)obj); + + DBG("ROTATE:%d", angle); + + quickpanel_minictrl_rotation_report(angle); + + _ui_rotate(ad, angle); +} + +static int _ui_rotation_angle_get(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, 0, "Invalid parameter!"); + retif(ad->win == NULL, 0, "Invalid parameter!"); + + return elm_win_rotation_get(ad->win); +} + +static void _ui_handler_enable_set(Eina_Bool is_enable) +{ + const char *signal = NULL; + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + retif(ad->view_root == NULL, , "data is NULL"); + + if (is_enable == EINA_TRUE) { + signal = "mouse,down,1"; + } else { + signal = "mouse,up,1"; + } + + elm_object_signal_emit(ad->view_root, signal, "qp.handler.bg"); +} + +static void _ui_rotation_handler(struct appdata *ad, int angle) +{ + const char *signal = NULL; + + retif(ad == NULL, , "data is NULL"); + retif(ad->view_root == NULL, , "data is NULL"); + + + if (angle == 90 || angle == 270) { + signal = "quickpanel.landscape"; + } else { + signal = "quickpanel.portrait"; + } + + elm_object_signal_emit(ad->view_root, signal, "quickpanel.prog"); +} + +static void _ui_rotate(void *data, int new_angle) +{ + struct appdata *ad = data; + retif(data == NULL, , "Invalid parameter!"); + + DBG("ROTATION: new:%d old:%d", new_angle, ad->angle); + + if (new_angle == 0 || new_angle == 90 || new_angle == 180 || new_angle == 270) { + if (new_angle != ad->angle) { + ad->angle = new_angle; + quickpanel_modules_refresh(ad); + _ui_geometry_info_set(ad); + _ui_handler_info_set(ad); + _ui_rotation_handler(ad, ad->angle); + } + } +} + +/***************************************************************************** + * + * ui creation/deletion functions + * + ****************************************************************************/ +static Evas_Object *_ui_window_add(const char *name, int prio) +{ + Evas_Object *eo = NULL; + Ecore_X_Window xwin; + + eo = elm_win_add(NULL, name, ELM_WIN_BASIC); + + if (eo != NULL) { + elm_win_alpha_set(eo, EINA_TRUE); + elm_win_indicator_mode_set(eo, ELM_WIN_INDICATOR_HIDE); + + elm_win_title_set(eo, name); + elm_win_borderless_set(eo, EINA_TRUE); + elm_win_autodel_set(eo, EINA_TRUE); + + /* set this window as a quickpanel */ + elm_win_quickpanel_set(eo, 1); + elm_win_quickpanel_priority_major_set(eo, prio); + + if (elm_win_wm_rotation_supported_get(eo)) { + int rots[4] = { 0, 90, 180, 270 }; + elm_win_wm_rotation_available_rotations_set(eo, rots, 4); + } + + /* icccm name class set */ + xwin = elm_win_xwindow_get(eo); + ecore_x_icccm_name_class_set(xwin, "QUICKPANEL", "QUICKPANEL"); + + unsigned int val = 1; + ecore_x_window_prop_card32_set + (xwin, ECORE_X_ATOM_E_ILLUME_ACCESS_CONTROL, &val, 1); + + evas_object_show(eo); + } + + return eo; +} + +static int _ui_gui_create(void *data) +{ + struct appdata *ad = data; + int w = 0, h = 0; + int initial_angle = 0; + Evas_Object *page_base = NULL; + + retif(data == NULL, QP_FAIL, "Invialid parameter!"); + + ad->win = _ui_window_add("Quickpanel Window", + QP_WINDOW_PRIO); + retif(ad->win == NULL, QP_FAIL, "Failed to create main window"); + //build error + //elm_win_focus_allow_set(ad->win, EINA_TRUE); + + evas_object_smart_callback_add(ad->win, "wm,rotation,changed", + _ui_rotation_wm_cb, ad); + + ad->background = elm_bg_add(ad->win); + if (ad->background != NULL) { + evas_object_size_hint_weight_set(ad->background, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(ad->win, ad->background); + evas_object_show(ad->background); + } else { + ERR("failed to create background"); + } + + ad->view_root = quickpanel_uic_load_edj(ad->background, + DEFAULT_EDJ, "quickpanel/root", 0); + retif(ad->view_root == NULL, QP_FAIL, "Failed to create main page"); + + Evas_Object *pager_scroller = quickpanel_pager_new(ad->view_root, NULL); + Evas_Object *pager_box = quickpanel_pager_view_get("BOX"); + + page_base = quickpanel_page_base_create(pager_box, NULL); + retif(page_base == NULL, QP_FAIL, "Failed to create main page"); + ad->ly = quickpanel_page_base_view_get("LAYOUT"); + retif(ad->ly == NULL, QP_FAIL, "Failed to create main page"); + + elm_box_pack_end(pager_box, page_base); + elm_win_resize_object_add(ad->win, ad->view_root); + elm_object_part_content_set(ad->view_root, "qp.root.swallow", pager_scroller); + + /* get noti evas */ + ad->evas = evas_object_evas_get(ad->win); + ad->list = quickpanel_page_base_view_get("BOX"); + ad->scroller = quickpanel_page_base_view_get("SCROLLER"); + + //ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); + elm_win_screen_size_get(ad->win, NULL, NULL, &w, &h); + evas_object_resize(ad->win, w, h); + + ad->win_width = w; + ad->win_height = h; + + _ui_geometry_info_set(ad); + + initial_angle = _ui_rotation_angle_get(ad); + _ui_rotate(ad, initial_angle); + + quickpanel_pager_page_set(PAGE_IDX_MAIN, 1); + + sim_controller_init(ad->ly); + + quickpanel_noti_init_noti_section(); + + return 0; +} + +static int _ui_gui_destroy(void *data) +{ + struct appdata *ad = data; + retif(data == NULL, QP_FAIL, "Invialid parameter!"); + + if (ad->list != NULL) { + evas_object_del(ad->list); + ad->list = NULL; + } + if (ad->scroller != NULL) { + evas_object_del(ad->scroller); + ad->scroller = NULL; + } + if (ad->ly != NULL) { + evas_object_del(ad->ly); + ad->ly = NULL; + } + if (ad->win != NULL) { + evas_object_del(ad->win); + ad->win = NULL; + } + + return QP_OK; +} + +static void _ui_setting_visibility_set(struct appdata *ad, int show) +{ + retif(ad == NULL, , "data is NULL"); + retif(ad->ly == NULL, , "data is NULL"); + + elm_object_signal_emit(ad->ly, "quickpanel.setting.show", + "quickpanel.prog"); +} + +/***************************************************************************** + * + * event handler initialization functions + * + ****************************************************************************/ +static void _vconf_event_powerff_cb(keynode_t *node, + void *data) +{ + int val; + if (vconf_get_int(VCONFKEY_SYSMAN_POWER_OFF_STATUS, &val) == 0 && + (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT || val == VCONFKEY_SYSMAN_POWER_OFF_RESTART)) { + ui_app_exit(); + } +} + +static void _vconf_event_lcdoff_cb(keynode_t *node, + void *data) +{ + int ret = 0; + int pm_state = VCONFKEY_PM_STATE_NORMAL; + + ret = vconf_get_int(VCONFKEY_PM_STATE, &pm_state); + + if (ret == 0 && pm_state == VCONFKEY_PM_STATE_LCDOFF) { + quickpanel_uic_close_quickpanel(false, 0); + } +} + +static Eina_Bool _ecore_event_client_message_cb(void *data, int type, + void *event) +{ + struct appdata *ad = data; + Ecore_X_Event_Client_Message *ev = event; + + retif(data == NULL || event == NULL, + ECORE_CALLBACK_RENEW, "Invalid parameter!"); + + if (ev->message_type == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE) { + if (ev->data.l[0] == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF) { + SERR("quickpanel is closed"); + ad->is_opened = 0; + quickpanel_util_time_timer_enable_set(0); + quickpanel_keyboard_closing_fini(ad); + quickpanel_keyboard_x_closing_fini(ad); + quickpanel_modules_closed(data); + quickpanel_media_player_stop(); + } + } else if (ev->message_type == E_ILLUME_ATOM_MV_QUICKPANEL_STATE) { + if (ev->data.l[0] == 1) { + // pressed + if (ad->is_opened == 0) { + quickpanel_util_time_timer_enable_set(1); + quickpanel_keyboard_openning_init(ad); + quickpanel_keyboard_x_openning_init(ad); + if (quickpanel_uic_opened_reason_get() != OPENED_BY_CMD_SHOW_SETTINGS) { + quickpanel_pager_page_set(PAGE_IDX_MAIN, 0); + } + } + _ui_handler_enable_set(EINA_TRUE); + } + if (ev->data.l[0] == 0) { + // released + if (ad->is_opened == 0) { + SERR("quickpanel is opened"); + ad->is_opened = 1; + quickpanel_modules_opened(data); + quickpanel_media_player_stop(); + quickpanel_uic_opened_reason_set(OPENED_NO_REASON); + } + _ui_handler_enable_set(EINA_FALSE); + } + } + return ECORE_CALLBACK_RENEW; +} + +static void _vconf_init(struct appdata *ad) +{ + int ret = 0; + + ret = vconf_notify_key_changed(VCONFKEY_PM_STATE, + _vconf_event_lcdoff_cb, ad); + if (ret != 0) { + ERR("VCONFKEY_PM_STATE: %d", ret); + } + + ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, + _vconf_event_powerff_cb, ad); + if (ret != 0) { + ERR("VCONFKEY_PM_STATE: %d", ret); + } +} + +static void _vconf_fini(struct appdata *ad) +{ + int ret = 0; + + ret = vconf_ignore_key_changed(VCONFKEY_PM_STATE, + _vconf_event_lcdoff_cb); + if (ret != 0) { + ERR("VCONFKEY_PM_STATE: %d", ret); + } + + ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_POWER_OFF_STATUS, + _vconf_event_powerff_cb); + if (ret != 0) { + ERR("VCONFKEY_PM_STATE: %d", ret); + } +} + +static void _edbus_init(struct appdata *ad) +{ + e_dbus_init(); + ad->dbus_connection = e_dbus_bus_get(DBUS_BUS_SYSTEM); + if (ad->dbus_connection == NULL) { + ERR("noti register : failed to get dbus bus"); + } +} + +static void _edbus_fini(struct appdata *ad) +{ + if (ad->dbus_connection != NULL) { + e_dbus_connection_close(ad->dbus_connection); + ad->dbus_connection = NULL; + e_dbus_shutdown(); + } +} + +static void _ecore_event_init(struct appdata *ad) +{ + Ecore_Event_Handler *hdl = NULL; + + /* Register window rotate event */ + hdl = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, + _ecore_event_client_message_cb, ad); + if (hdl == NULL) { + ERR("failed to add handler(ECORE_X_EVENT_CLIENT_MESSAGE)"); + } + + ad->hdl_client_message = hdl; +} + +static void _ecore_event_fini(struct appdata *ad) +{ + if (ad->hdl_client_message != NULL) { + ecore_event_handler_del(ad->hdl_client_message); + ad->hdl_client_message = NULL; + } +} + +static void _x_atom_init(void) +{ + E_ILLUME_ATOM_MV_QUICKPANEL_STATE = ecore_x_atom_get("_E_MOVE_QUICKPANEL_STATE"); +} +/***************************************************************************** + * + * App efl main interface + * + ****************************************************************************/ +static void _sigaction_terminate_handler(int signum, siginfo_t *info, void *unused) +{ + ERR("quickpanel going to be terminated"); + ui_app_exit(); +} + +static void _service_request_process(app_control_h service, void *data) +{ + char *value = NULL; + retif(service == NULL, , "Invialid parameter!"); + + if (!app_control_get_extra_data(service, "HIDE_LAUNCH", &value)) + { + if (value != NULL) { + ERR("HIDE_LAUNCH: %s", value); + if (!strcmp(value, "1")) { + quickpanel_uic_close_quickpanel(false, 0); + } else { + quickpanel_uic_open_quickpanel(OPENED_BY_CMD_HIDE_LAUNCH); + } + + free(value); + } + } else if (!app_control_get_extra_data(service, "SHOW_SETTINGS", &value)) { + if (value != NULL) { + ERR("SHOW_SETTINGS: %s", value); + if (!strcmp(value, "1")) { + quickpanel_pager_page_set(PAGE_IDX_EDITING, 0); + quickpanel_uic_open_quickpanel(OPENED_BY_CMD_SHOW_SETTINGS); + } + + free(value); + } + } +#ifdef QP_EMERGENCY_MODE_ENABLE + else if (!app_control_get_extra_data(service, "EMERGENCY_MODE_LAUNCH", &value)) { + if (value != NULL) { + ERR("EMERGENCY_MODE_LAUNCH: %s", value); + if (!strcmp(value, "1")) { + if (quickpanel_emergency_mode_syspopup_launch() == QP_FAIL) { + ERR("failed to launch emergency mode syspopup"); + } else { + quickpanel_uic_close_quickpanel(true, 0); + } + } + + free(value); + } + } +#endif +} + +static Eina_Bool _appcore_cache_flush_timer_cb(void *data) +{ + if (!quickpanel_uic_is_suspended()) { + return ECORE_CALLBACK_CANCEL; + } + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool _ui_refresh_idler_cb(void *data) +{ + DBG(""); + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + quickpanel_modules_refresh(ad); + _ui_geometry_info_set(ad); + _ui_handler_info_set(ad); + + /* Cache memory is cleared when the application paused (every time, after 5 seconds (in appcore)), + * but after running in a minimized mode application have status AS_RUNNING. + * Application have status AS_PAUSED only after change of visibility to hidden condition by user (on hiding window) + * Cleaning must be performed only once after application loading in hidden condition + * (and stay in a hidden condition at time of cleaning). + */ + ecore_timer_add(10, _appcore_cache_flush_timer_cb, NULL); + + return EINA_FALSE; +} + +static void _quickpanel_initialize(void *data) +{ + int ret = 0; + struct appdata *ad = data; + retif(ad == NULL, , "Invialid parameter!"); + + INFO(">> Creating Quickpanel"); + /* Check emulator */ + ad->is_emul = quickpanel_uic_is_emul(); + INFO("quickpanel run in %s", ad->is_emul ? "Emul" : "Device"); + + int w, h; + Ecore_X_Screen *screen = ecore_x_default_screen_get(); + //ecore_x_screen_size_get(screen, &w, &h); + elm_win_screen_size_get(screen, NULL, NULL, &w, &h); + + ad->scale = elm_config_scale_get(); + if (ad->scale < 0) { + ad->scale = 1.0; + } + + INFO("quickpanel scale %f", ad->scale); + + ad->is_suspended = 1; + + /* Get theme */ + elm_theme_extension_add(NULL, DEFAULT_THEME_EDJ); + /* create quickpanel window */ + ret = _ui_gui_create(ad); + retif(ret != QP_OK, , "Failed to create window!"); + + quickpanel_media_init(); + + _x_atom_init(); + _ecore_event_init(ad); + _vconf_init(ad); + _edbus_init(ad); + + quickpanel_uninstall_init(ad); +#ifdef QP_EMERGENCY_MODE_ENABLE + quickpanel_emergency_mode_init(ad); +#endif + quickpanel_conf_init(ad); + quickpanel_keyboard_init(ad); + quickpanel_keyboard_x_init(ad); +#ifdef QP_REMINDER_ENABLE + quickpanel_reminder_init(ad); +#endif + +#ifdef QP_SETTING_ENABLE + _ui_setting_visibility_set(ad, 1); +#else /* QP_SETTING_ENABLE */ + _ui_setting_visibility_set(ad, 0); +#endif /* QP_SETTING_ENABLE */ + + /* init quickpanel modules */ + quickpanel_modules_init(ad); + ecore_idler_add(_ui_refresh_idler_cb, ad); +} + +static bool _app_create_cb(void *data) +{ + ERR(""); + + elm_config_engine_set("opengl_x11"); + + elm_app_base_scale_set(1.8); + + pid_t pid; + int r; + + // signal handler + struct sigaction act; + act.sa_sigaction = _sigaction_terminate_handler; + act.sa_flags = SA_SIGINFO; + + int ret = sigemptyset(&act.sa_mask); + if (ret < 0) { + ERR("Failed to sigemptyset[%s]", strerror(errno)); + } + ret = sigaddset(&act.sa_mask, SIGTERM); + if (ret < 0) { + ERR("Failed to sigaddset[%s]", strerror(errno)); + } + ret = sigaction(SIGTERM, &act, NULL); + if (ret < 0) { + ERR("Failed to sigaction[%s]", strerror(errno)); + } + + pid = setsid(); + if (pid < 0) { + WARN("Failed to set session id!"); + } + + r = nice(2); + if (r == -1) { + WARN("Failed to set nice value!"); + } + + return TRUE; +} + +static void _app_service_cb(app_control_h service, void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invialid parameter!"); + + if (ad->win == NULL && ad->ly == NULL) { + _quickpanel_initialize(data); + } else { + _service_request_process(service, data); + } +} + +static void _app_terminate_cb(void *data) +{ + ERR(""); + + struct appdata *ad = data; + retif(ad == NULL, , "invalid data."); + + quickpanel_media_fini(); + + /* fini quickpanel modules */ + quickpanel_modules_fini(ad); + _edbus_fini(ad); + _vconf_fini(ad); + _ecore_event_fini(ad); + + quickpanel_keyboard_fini(ad); + quickpanel_keyboard_x_fini(ad); + quickpanel_uninstall_fini(ad); +#ifdef QP_REMINDER_ENABLE + quickpanel_reminder_fini(ad); +#endif +#ifdef QP_EMERGENCY_MODE_ENABLE + quickpanel_emergency_mode_fini(ad); +#endif + quickpanel_conf_fini(ad); + + /* delete quickpanel window */ + _ui_gui_destroy(ad); + + INFO("Quickpanel is terminated"); +} + +static void _app_resume_cb(void *data) +{ + DBG(""); + struct appdata *ad = data; + retif(ad == NULL,, "invalid data."); + + ad->is_suspended = 0; + _ui_handler_enable_set(EINA_FALSE); + + quickpanel_modules_resume(data); + + sim_controller_resume(); +} + +static void _app_pause_cb(void *data) +{ + DBG(""); + struct appdata *ad = data; + retif(ad == NULL,, "invalid data."); + + + quickpanel_modules_suspend(ad); + + ad->is_suspended = 1; + + if (ad->evas != NULL) { + _ui_efl_cache_flush(ad->evas); + evas_event_feed_mouse_cancel(ad->evas, ecore_time_get(), NULL); + } +} + +static void _app_language_changed_cb(app_event_info_h event_info, void *data) +{ + DBG(""); + quickpanel_modules_lang_change(data); + + sim_controller_on_language_change(); +} + +static void _app_region_format_changed_cb(app_event_info_h event_info, void *data) +{ + DBG(""); + quickpanel_modules_lang_change(data); +} + +int main(int argc, char *argv[]) +{ + INFO("BUILD START: %s %s", __DATE__, __TIME__); + ERR("BUILD START: %s %s", __DATE__, __TIME__); + + int ret = 0; + struct appdata ad; + ui_app_lifecycle_callback_s event_callback = {0,}; + app_event_handler_h handlers[5] = {NULL, }; + + ERR("quickpanel is forked"); + + ret = control_privilege(); + if (ret != 0) { + WARN("Failed to control privilege!"); + } + + event_callback.create = _app_create_cb; + event_callback.terminate = _app_terminate_cb; + event_callback.pause = _app_pause_cb; + event_callback.resume = _app_resume_cb; + event_callback.app_control = _app_service_cb; + + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, NULL, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, NULL, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, NULL, NULL); + ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed_cb, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, _app_region_format_changed_cb, &ad); + + memset(&ad, 0x0, sizeof(struct appdata)); + + g_app_data = &ad; + + ret = ui_app_main(argc, argv, &event_callback, (void *)&ad); + if (ret != APP_ERROR_NONE) { + ERR("ui_app_main() is failed. err = %d", ret); + } + + return ret; + +} diff --git a/daemon/service/animated_icon.c b/daemon/service/animated_icon.c new file mode 100644 index 0000000..352ca76 --- /dev/null +++ b/daemon/service/animated_icon.c @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + + +#include "quickpanel-ui.h" +#include "common.h" +#include "quickpanel_def.h" +#include "animated_icon.h" + +#define E_DATA_ANI_ICON_TYPE "ANI_ICON_TYPE" +#define PATH_DOWNLOAD "reserved://quickpanel/ani/downloading" +#define PATH_UPLOAD "reserved://quickpanel/ani/uploading" +#define PATH_INSTALL "reserved://quickpanel/ani/install" + +static qp_animated_icon_type _animated_type_get(const char *path) +{ + retif_nomsg(path == NULL, QP_ANIMATED_ICON_NONE); + + if (strncasecmp(path, PATH_DOWNLOAD, MIN(strlen(PATH_DOWNLOAD), strlen(path))) == 0) { + return QP_ANIMATED_ICON_DOWNLOAD; + } else if (strncasecmp(path, PATH_UPLOAD, MIN(strlen(PATH_UPLOAD), strlen(path))) == 0) { + return QP_ANIMATED_ICON_UPLOAD; + } else if (strncasecmp(path, PATH_INSTALL, MIN(strlen(PATH_INSTALL), strlen(path))) == 0) { + return QP_ANIMATED_ICON_INSTALL; + } + + return QP_ANIMATED_ICON_NONE; +} + +HAPI Evas_Object *quickpanel_animated_icon_get(Evas_Object *parent, const char *path) +{ + qp_animated_icon_type type = QP_ANIMATED_ICON_NONE; + const char *layout_icon = NULL; + Evas_Object *layout = NULL; + retif_nomsg(parent == NULL, NULL); + retif_nomsg(path == NULL, NULL); + + type = _animated_type_get(path); + + if (type == QP_ANIMATED_ICON_DOWNLOAD) { + layout_icon = "quickpanel/animated_icon_download"; + } else if (type == QP_ANIMATED_ICON_UPLOAD) { + layout_icon = "quickpanel/animated_icon_upload"; + } else if (type == QP_ANIMATED_ICON_INSTALL) { + layout_icon = "quickpanel/animated_icon_install"; + } else { + return NULL; + } + + layout = elm_layout_add(parent); + if (layout != NULL) { + elm_layout_file_set(layout, DEFAULT_EDJ, layout_icon); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_data_set(layout, E_DATA_ANI_ICON_TYPE, (void *)type); + evas_object_show(layout); + } + + return layout; +} + +HAPI int quickpanel_animated_icon_is_same_icon(Evas_Object *view, const char *path) +{ + qp_animated_icon_type type = QP_ANIMATED_ICON_NONE; + qp_animated_icon_type type_old = QP_ANIMATED_ICON_NONE; + retif_nomsg(view == NULL, 0); + retif_nomsg(path == NULL, 0); + + type = _animated_type_get(path); + type_old = (qp_animated_icon_type)evas_object_data_get(view, + E_DATA_ANI_ICON_TYPE); + + if (type == type_old) { + return 1; + } + + return 0; +} diff --git a/daemon/service/animated_icon.h b/daemon/service/animated_icon.h new file mode 100644 index 0000000..20f3890 --- /dev/null +++ b/daemon/service/animated_icon.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + + +#ifndef _QP_SERVICE_ANIMATED_ICON_DEF_ +#define _QP_SERVICE_ANIMATED_ICON_DEF_ + +#include "quickpanel-ui.h" + +typedef enum _qp_animated_icon_type { + QP_ANIMATED_ICON_NONE = -1, + QP_ANIMATED_ICON_DOWNLOAD = 1, + QP_ANIMATED_ICON_UPLOAD, + QP_ANIMATED_ICON_INSTALL, +} qp_animated_icon_type; + +Evas_Object *quickpanel_animated_icon_get(Evas_Object *parent, const char *path); +int quickpanel_animated_icon_is_same_icon(Evas_Object *view, const char *path); + +#endif diff --git a/daemon/service/configuration.c b/daemon/service/configuration.c new file mode 100644 index 0000000..7ddc6cf --- /dev/null +++ b/daemon/service/configuration.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <system_settings.h> +#include "common.h" +#include "configuration.h" + +static struct _s_configuration_info { + int longpress_threshold; +} s_configuration_info = { +#ifdef HAVE_X + .longpress_threshold = SYSTEM_SETTINGS_TAP_AND_HOLD_DELAY_SHORT, +#else + .longpress_threshold = 0, +#endif +}; + +static void _conf_longpress_threshold_cb(system_settings_key_e key, void *user_data) +{ +#ifdef HAVE_X + int delay = SYSTEM_SETTINGS_TAP_AND_HOLD_DELAY_SHORT; /* default 0.5 sec */ +#else + int delay = 0.5; +#endif + +#ifdef HAVE_X + if (SYSTEM_SETTINGS_KEY_TAP_AND_HOLD_DELAY == key) +#endif + { +#ifdef HAVE_X + if (system_settings_get_value_int(SYSTEM_SETTINGS_KEY_TAP_AND_HOLD_DELAY, &delay) != 0) { + ERR("Failed to get tap and hold delay"); + return; + } +#endif + if (s_configuration_info.longpress_threshold != delay) { + s_configuration_info.longpress_threshold = delay; + } + + DBG("Current tap and hold delay : [%d] msec", delay); + } +} + +HAPI void quickpanel_conf_init(void *data) +{ +#ifdef HAVE_X + if (system_settings_get_value_int(SYSTEM_SETTINGS_KEY_TAP_AND_HOLD_DELAY, + &s_configuration_info.longpress_threshold) != 0) { + ERR("Failed to get tap and hold delay"); + } + + if (system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_TAP_AND_HOLD_DELAY, + _conf_longpress_threshold_cb, NULL) != 0) { + ERR("Failed to set tap and hold delay changed callback"); + } +#endif +} + +HAPI void quickpanel_conf_fini(void *data) +{ +#ifdef HAVE_X + if (system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_TAP_AND_HOLD_DELAY) != 0) { + ERR("Failed to unset tab and hold delay changed callback"); + } +#endif +} + +HAPI double quickpanel_conf_longpress_time_get(void) +{ + return (double)(s_configuration_info.longpress_threshold)/(double)1000.0; +} diff --git a/daemon/service/configuration.h b/daemon/service/configuration.h new file mode 100644 index 0000000..df37014 --- /dev/null +++ b/daemon/service/configuration.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef _QP_SERVICE_CONFIGURATION_DEF_ +#define _QP_SERVICE_CONFIGURATION_DEF_ + +#include "quickpanel-ui.h" + +void quickpanel_conf_init(void *data); +void quickpanel_conf_fini(void *data); +double quickpanel_conf_longpress_time_get(void); + +#endif diff --git a/daemon/service/emergency_mode.c b/daemon/service/emergency_mode.c new file mode 100644 index 0000000..520b0d2 --- /dev/null +++ b/daemon/service/emergency_mode.c @@ -0,0 +1,317 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#include <syspopup_caller.h> +#include <pkgmgr-info.h> +#include <Eina.h> +#include <bundle_internal.h> +#include "common.h" +#include "modules.h" +#include "datetime.h" +#include "emergency_mode.h" + + +#ifdef QP_SETTING_ENABLE +extern QP_Module settings_view_featured; +#endif +#ifdef QP_BRIGHTNESS_ENABLE +extern QP_Module brightness_ctrl; +#endif + +#define SETTING_SYSPOPUP "mode-syspopup" +#define BT_SHARE_DAEMON "/usr/bin/bluetooth-share" +#define BT_SHARE_SERVER "bluetooth-share-opp-server" +#define BT_SHARE_CLIENT "bluetooth-share-opp-client" +#define SCREEN_SHOT "shot-tizen" + +static struct _info { + int is_enabled; + Eina_List *permitted_apps; +} s_info = { + .is_enabled = 0, + .permitted_apps = NULL, +}; + +static void _delete_unpermitted_app(void) +{ + notification_list_h noti_list = NULL; + notification_list_h list_traverse = NULL; + notification_h noti = NULL; + + notification_get_list(NOTIFICATION_TYPE_NONE, -1, ¬i_list); + + list_traverse = noti_list; + + while (list_traverse != NULL) { + noti = notification_list_get_data(list_traverse); + + quickpanel_emergency_mode_notification_filter(noti, 1); + + list_traverse = notification_list_get_next(list_traverse); + } + + if (noti_list != NULL) { + notification_free_list(noti_list); + noti_list = NULL; + } +} + +static void _emergency_mode_start(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (s_info.is_enabled) { + return; + } + + quickpanel_datetime_datentime_event_set(0); +#ifdef QP_SETTING_ENABLE + if (settings_view_featured.fini != NULL) { + settings_view_featured.fini(ad); + } +#endif +#ifdef QP_BRIGHTNESS_ENABLE + if (brightness_ctrl.fini != NULL) { + brightness_ctrl.fini(ad); + } +#endif + + _delete_unpermitted_app(); + s_info.is_enabled = 1; + ERR("emergency mode is enabled"); +} + +static void _emergency_mode_stop(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (!s_info.is_enabled) { + return; + } + + quickpanel_datetime_datentime_event_set(1); + +#ifdef QP_SETTING_ENABLE + if (settings_view_featured.init != NULL) { + settings_view_featured.init(ad); + } + if (settings_view_featured.init_job_cb != NULL) { + settings_view_featured.init_job_cb(ad); + } +#endif +#ifdef QP_BRIGHTNESS_ENABLE + if (brightness_ctrl.init != NULL) { + brightness_ctrl.init(ad); + } +#endif + + _delete_unpermitted_app(); + s_info.is_enabled = 0; + ERR("emergency mode is disabled"); +} + +static void _vconf_cb(keynode_t *node, void *data) +{ + int mode = 0; + + if (vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &mode) == 0) { + if (mode == SETTING_PSMODE_EMERGENCY) { + _emergency_mode_start(data); + } else { + _emergency_mode_stop(data); + } + } else { + ERR("failed to get the value of VCONFKEY_SETAPPL_PSMODE"); + } +} + +static int _app_list_cb(pkgmgrinfo_appinfo_h handle, void *user_data) +{ + char *appid = NULL; + char *permitted_appid = NULL; + pkgmgrinfo_appinfo_get_appid(handle, &appid); + + permitted_appid = strdup(appid); + + s_info.permitted_apps = eina_list_append(s_info.permitted_apps, permitted_appid); + DBG("%s is permitted.", permitted_appid); + + return 0; +} + + +static int _register_permitted_apps(void) +{ + int ret = 0; + pkgmgrinfo_appinfo_filter_h handle; + + s_info.permitted_apps = eina_list_append(s_info.permitted_apps, BT_SHARE_DAEMON); + s_info.permitted_apps = eina_list_append(s_info.permitted_apps, SCREEN_SHOT); + s_info.permitted_apps = eina_list_append(s_info.permitted_apps, BT_SHARE_SERVER); + s_info.permitted_apps = eina_list_append(s_info.permitted_apps, BT_SHARE_CLIENT); + + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret != PMINFO_R_OK) { + return -1; + } + +#ifdef HAVE_X + ret = pkgmgrinfo_appinfo_filter_add_int(handle, PMINFO_APPINFO_PROP_APP_SUPPORT_MODE, 1); +#endif + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + + ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, _app_list_cb, NULL); + if (ret != PMINFO_R_OK) { + pkgmgrinfo_appinfo_filter_destroy(handle); + return -1; + } + + pkgmgrinfo_appinfo_filter_destroy(handle); + return 0; + +} + +static int _delete_permitted_apps(void) +{ + Eina_List *list = NULL; + char *appid = NULL; + + if (!s_info.permitted_apps) { + EINA_LIST_FOREACH(s_info.permitted_apps, list, appid) + free(appid); + eina_list_free(s_info.permitted_apps); + s_info.permitted_apps = NULL; + } + + return 0; +} + +HAPI void quickpanel_emergency_mode_init(void *data) +{ + int ret = 0; + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + ret = _register_permitted_apps(); + msgif(ret !=0, "failed to register permitted apps"); + + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE, + _vconf_cb, ad); + msgif(ret != 0, "failed to notify key(VCONFKEY_SETAPPL_PSMODE) : %d", ret); + + if (quickpanel_emergency_mode_is_on()) { + s_info.is_enabled = 1; + } +} + +HAPI void quickpanel_emergency_mode_fini(void *data) +{ + int ret = 0; + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + ret = _delete_permitted_apps(); + msgif(ret !=0, "failed to delete permitted apps"); + + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE, _vconf_cb); + msgif(ret != 0, "failed to ignore key(VCONFKEY_SETAPPL_PSMODE) : %d", ret); +} + +HAPI int quickpanel_emergency_mode_is_permitted_app(const char *appid) +{ + int i = 0; + int count = 0; + char *permitted_app = NULL; + retif(appid == NULL, 0, "Invalid parameter!"); + + count = eina_list_count(s_info.permitted_apps); + for(i = 0; i < count; i++) { + permitted_app = (char *)eina_list_nth(s_info.permitted_apps, i); + if (permitted_app != NULL && strcmp(permitted_app, appid) == 0) { + return 1; + } + } + + return 0; +} + +HAPI int quickpanel_emergency_mode_is_on(void) +{ + int mode = 0; + + if (vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &mode) == 0) { + if (mode == SETTING_PSMODE_EMERGENCY) { + return 1; + } + } + + return 0; +} + +HAPI int quickpanel_emergency_mode_notification_filter(notification_h noti, int is_delete) +{ + int priv_id = 0; + char *pkgname = NULL; + + notification_get_pkgname(noti, &pkgname); + notification_get_id(noti, NULL, &priv_id); + + DBG("Emergency mode filter is called: %s", pkgname); + if (!quickpanel_emergency_mode_is_permitted_app(pkgname)) { + if (is_delete) { + notification_delete_by_priv_id(pkgname, + NOTIFICATION_TYPE_NONE, + priv_id); + } + return 1; + } + + return 0; +} + +HAPI int quickpanel_emergency_mode_syspopup_launch(void) +{ + int ret; + bundle *b = NULL; + + DBG(""); + + b = bundle_create(); + if (b == NULL) { + return QP_FAIL; + } + + bundle_add(b, "_MODE_SYSTEM_POPUP_TYPE_", "POPUP_EMERGENCY_PSMODE"); + ret = syspopup_launch(SETTING_SYSPOPUP, b); + if (ret < 0) { + ERR("failed to launch syspopup (%s):%d\n", SETTING_SYSPOPUP, ret); + bundle_free(b); + return QP_FAIL; + } + + DBG(""); + + bundle_free(b); + return QP_OK; +} diff --git a/daemon/service/emergency_mode.h b/daemon/service/emergency_mode.h new file mode 100644 index 0000000..e0655fe --- /dev/null +++ b/daemon/service/emergency_mode.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include <notification.h> + +#ifndef _QP_EMERGENCY_MODE_DEF_ +#define _QP_EMERGENCY_MODE_DEF_ + +#define PACKAGE_EMERGENCY_MODE_SETTING "setting-emergency-efl" + +void quickpanel_emergency_mode_init(void *data); +void quickpanel_emergency_mode_fini(void *data); +int quickpanel_emergency_mode_is_permitted_app(const char *appid); +int quickpanel_emergency_mode_is_on(void); +int quickpanel_emergency_mode_notification_filter(notification_h noti, int is_delete); +int quickpanel_emergency_mode_syspopup_launch(void); + +#endif diff --git a/daemon/service/keyboard.c b/daemon/service/keyboard.c new file mode 100644 index 0000000..94882ea --- /dev/null +++ b/daemon/service/keyboard.c @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include <vconf.h> +#ifdef HAVE_X +#include <utilX.h> +#include <X11/Xlib.h> +#endif +#include <Ecore_Input.h> +#include <feedback.h> +#include "common.h" +#include "noti_util.h" +#include "keyboard.h" + +#define KEY_BACK "XF86Back" +#define KEY_CANCEL "Cancel" +#define KEY_MENU "XF86Menu" +#define KEY_QUICKPANEL "XF86QuickPanel" +#define KEY_HOME "XF86Home" + +static Eina_Bool _service_hardkey_up_cb(void *data, int type, void *event) +{ + struct appdata *ad = NULL; + Ecore_Event_Key *key_event = NULL; + + retif(data == NULL || event == NULL, EINA_FALSE, "Invalid parameter!"); + ad = data; + key_event = event; + + if (!strcmp(key_event->keyname, KEY_HOME)) { + if (ad->is_hardkey_cancel == EINA_FALSE) { + quickpanel_uic_close_quickpanel(false, 0); + } else { + DBG("Cancel status, do nothing"); + } + } else if (!strcmp(key_event->keyname, KEY_CANCEL)) { + ad->is_hardkey_cancel = EINA_FALSE; + } else if (!strcmp(key_event->keyname, KEY_BACK)) { + if (ad->popup != NULL) { + Evas_Smart_Cb back_cb = evas_object_data_get(ad->popup, EDATA_BACKKEY_CB); + if (back_cb != NULL) { + back_cb(ad->popup, ad->popup, NULL); + } + } else { + quickpanel_uic_close_quickpanel(false, 0); + } + } + return EINA_FALSE; +} + +static Eina_Bool _service_hardkey_down_cb(void *data, int type, void *event) +{ + Ecore_Event_Key *key_event = event; + struct appdata *ad = data; + retif(key_event == NULL, EINA_FALSE, "Invalid parameter!"); + retif(ad == NULL, EINA_FALSE, "Invalid parameter!"); + + if (!strcmp(key_event->keyname, KEY_CANCEL)) { + ad->is_hardkey_cancel = EINA_TRUE; + } else if (!strcmp(key_event->keyname, KEY_QUICKPANEL)) { + quickpanel_uic_toggle_openning_quickpanel(); + } + return EINA_FALSE; +} + +HAPI void quickpanel_keyboard_init(void *data) +{ + struct appdata *ad = data; + Ecore_Event_Handler *hdl_key_down = NULL; + Ecore_Event_Handler *hdl_key_up = NULL; + retif(ad == NULL, , "Invalid parameter!"); + + if (elm_win_keygrab_set(elm_win_xwindow_get(ad->win), KEY_QUICKPANEL, 0, 0, 0, ELM_WIN_KEYGRAB_SHARED) != 0) { + ERR("failed to grab KEY_QUICKPANEL"); + } + + hdl_key_down = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _service_hardkey_down_cb, ad); + if (hdl_key_down == NULL) { + ERR("failed to add handler(ECORE_EVENT_KEY_DOWN)"); + } + ad->hdl_hardkey_down = hdl_key_down; + + hdl_key_up = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _service_hardkey_up_cb, ad); + if (hdl_key_up == NULL) { + ERR("failed to add handler(ECORE_EVENT_KEY_UP)"); + } + ad->hdl_hardkey_up = hdl_key_up; + ad->is_hardkey_cancel = EINA_FALSE; +} + +HAPI void quickpanel_keyboard_fini(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (ad->hdl_hardkey_up != NULL) { + ecore_event_handler_del(ad->hdl_hardkey_up); + ad->hdl_hardkey_up = NULL; + } + + if (ad->hdl_hardkey_down != NULL) { + ecore_event_handler_del(ad->hdl_hardkey_down); + ad->hdl_hardkey_down = NULL; + } + + if (elm_win_keygrab_unset(elm_win_xwindow_get(ad->win), KEY_QUICKPANEL, 0, 0) != 0) { + ERR("failed to ungrab KEY_QUICKPANEL"); + } + +} + +HAPI void quickpanel_keyboard_openning_init(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (elm_win_keygrab_set(elm_win_xwindow_get(ad->win), KEY_BACK, 0, 0, 0, ELM_WIN_KEYGRAB_EXCLUSIVE ) != 0) { + ERR("failed to grab KEY_BACK"); + } + + if (elm_win_keygrab_set(elm_win_xwindow_get(ad->win), KEY_MENU, 0, 0, 0, ELM_WIN_KEYGRAB_EXCLUSIVE ) != 0) { + ERR("failed to grab KEY_MENU"); + } + + if (elm_win_keygrab_set(elm_win_xwindow_get(ad->win), KEY_HOME, 0, 0, 0, ELM_WIN_KEYGRAB_SHARED) != 0) { + ERR("failed to grab KEY_HOME"); + } +} + +HAPI void quickpanel_keyboard_closing_fini(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (elm_win_keygrab_unset(elm_win_xwindow_get(ad->win), KEY_BACK ,0 ,0) != 0) { + ERR("failed to ungrab KEY_BACK"); + } + + if (elm_win_keygrab_unset(elm_win_xwindow_get(ad->win), KEY_MENU ,0 ,0) != 0) { + ERR("failed to ungrab KEY_MENU"); + } + + if (elm_win_keygrab_unset(elm_win_xwindow_get(ad->win), KEY_HOME ,0 ,0) != 0) { + ERR("failed to ungrab KEY_HOME"); + } +} diff --git a/daemon/service/keyboard.h b/daemon/service/keyboard.h new file mode 100644 index 0000000..6d6de63 --- /dev/null +++ b/daemon/service/keyboard.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef _QP_SERVICE_KEYBOARD_DEF_ +#define _QP_SERVICE_KEYBOARD_DEF_ + +#include "quickpanel-ui.h" + +void quickpanel_keyboard_init(void *data); +void quickpanel_keyboard_fini(void *data); +void quickpanel_keyboard_openning_init(void *data); +void quickpanel_keyboard_closing_fini(void *data); + +#endif diff --git a/daemon/service/keyboard_x.c b/daemon/service/keyboard_x.c new file mode 100644 index 0000000..4dc749b --- /dev/null +++ b/daemon/service/keyboard_x.c @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#ifdef HAVE_X +#include <utilX.h> +#include <X11/Xlib.h> +#include <X11/extensions/XInput.h> +#include <X11/extensions/XInput2.h> +#endif +#include <Ecore_Input.h> +#include <feedback.h> +#include "common.h" +#include "noti_util.h" +#include "keyboard_x.h" + +#define TAB 23 +#define SHIFT 50 +#define RETURN 36 +#define ARROW_KP_UP 80 +#define ARROW_KP_DOWN 88 +#define ARROW_KP_LEFT 83 +#define ARROW_KP_RIGHT 85 +#define ARROW_UP 111 +#define ARROW_DOWN 116 +#define ARROW_LEFT 113 +#define ARROW_RIGHT 114 + +typedef struct _key_info { + int keycode; + const char *keyname; + const char *key; + const char *string; + const char *compose; +} key_info; + +key_info key_infos[] = { + {TAB, "Tab", "Tab", "\t", "\t"}, + {RETURN, "Return", "Return", "\n", "\n"}, + {ARROW_UP, "Up", "Up", NULL, NULL}, + {ARROW_KP_UP, "Up", "Up", NULL, NULL}, + {ARROW_DOWN, "Down", "Down", NULL, NULL}, + {ARROW_KP_DOWN, "Down", "Down", NULL, NULL}, + {ARROW_LEFT, "Left", "Left", NULL, NULL}, + {ARROW_KP_LEFT, "Left", "Left", NULL, NULL}, + {ARROW_RIGHT, "Right", "Right", NULL, NULL}, + {ARROW_KP_RIGHT, "Right", "Right", NULL, NULL}, + {SHIFT, "Shift", "Shift", NULL, NULL}, +}; + +static int _cb_event_generic(void *data, int ev_type, void *event); +static Eina_Bool _xinput_init(void); +static void _key_event_select(void); +#ifdef HAVE_X +static void _focus_ui_process_press(XIRawEvent *raw_event); +static void _focus_ui_process_release(XIRawEvent *raw_event); +#endif + +static struct _s_info { + int xi2_opcode; + int is_shift_pressed; + Ecore_Event_Handler *hdl_key_event; +} s_info = { + .xi2_opcode = -1, + .is_shift_pressed = 0, + .hdl_key_event = NULL, +}; + +static int _key_event_validation_check(int keycode) +{ + int i = 0, len = 0; + + len = sizeof(key_infos) / sizeof(key_infos[0]); + + for (i = 0; i < len; i++ ) { + if (key_infos[i].keycode == keycode) { + return 1; + } + } + + return 0; +} + +static void _key_event_select(void) +{ + int rc; +#ifdef HAVE_X + XIEventMask mask; + Ecore_X_Display *d = NULL; + + d = ecore_x_display_get(); + if (d == NULL) { + ERR("failed to get ecore-display"); + return; + } + + mask.mask_len = XIMaskLen(XI_LASTEVENT); + mask.deviceid = XIAllDevices; + mask.mask = calloc(mask.mask_len, sizeof(char)); + if (mask.mask == NULL) { + ERR("failed to get ecore-display"); + return; + } + memset(mask.mask, 0, mask.mask_len); + + XISetMask(mask.mask, XI_RawKeyPress); + XISetMask(mask.mask, XI_RawKeyRelease); + + rc = XISelectEvents(d, ecore_x_window_root_first_get(), &mask, 1); + if (Success != rc) { + ERR("Failed to select XInput extension events"); + } + if (mask.mask) { + free( mask.mask); + } + ecore_x_sync(); +#endif +} + +static Eina_Bool _xinput_init(void) +{ +#ifdef HAVE_X + int event, error; + + if (!XQueryExtension(ecore_x_display_get(), "XInputExtension", + &s_info.xi2_opcode, &event, &error)) { + s_info.xi2_opcode = -1; + + SERR("failed to initialize key event receiver"); + return EINA_FALSE; + } +#endif + _key_event_select(); + + return EINA_TRUE; +} + +static int _cb_event_generic(void *data, int ev_type, void *event) +{ +#ifdef HAVE_X + Ecore_X_Event_Generic *e = (Ecore_X_Event_Generic *)event; + XIDeviceEvent *evData = (XIDeviceEvent *)(e->data); + + if ( e->extension != s_info.xi2_opcode ) { + return ECORE_CALLBACK_PASS_ON; + } + if ( !evData || evData->send_event ) { + return ECORE_CALLBACK_PASS_ON; + } + + switch( e->evtype ) { + case XI_RawKeyPress: + if (evData->deviceid == 3) { + break; + } + _focus_ui_process_press((XIRawEvent *)evData); + break; + case XI_RawKeyRelease: + if (evData->deviceid == 3) { + break; + } + _focus_ui_process_release((XIRawEvent *)evData); + break; + default: + break; + } +#endif + + return ECORE_CALLBACK_PASS_ON; +} + +#ifdef HAVE_X +static void _focus_ui_process_press(XIRawEvent *raw_event) +{ + XEvent xev; + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + retif(raw_event == NULL, , "invalid data."); + + if (raw_event->detail == SHIFT) { + s_info.is_shift_pressed = 1; + return; + } + if (_key_event_validation_check(raw_event->detail) == 0) { + return; + } + + Ecore_X_Display *d = ecore_x_display_get(); + if (d == NULL) { + ERR("failed to get ecore-display"); + return; + } + + memset(&xev, 0, sizeof(XEvent)); + xev.xany.display = ecore_x_display_get(); + xev.xkey.keycode = raw_event->detail; + xev.xkey.time = raw_event->time; + if (s_info.is_shift_pressed == 1) { + xev.xkey.state = 0x1; + } else { + xev.xkey.state = 0; + } + xev.xkey.root = ecore_x_window_root_first_get(); + xev.xkey.send_event = 1; + xev.xkey.subwindow = None; + xev.xkey.type = KeyPress; + xev.xkey.window = elm_win_xwindow_get(ad->win); + XSendEvent(d, elm_win_xwindow_get(ad->win) + , False, NoEventMask, &xev); + DBG("keypressed:%d", raw_event->detail); +} + +static void _focus_ui_process_release(XIRawEvent *raw_event) +{ + XEvent xev; + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + retif(raw_event == NULL, , "invalid data."); + + if (raw_event->detail == SHIFT) { + s_info.is_shift_pressed = 0; + return; + } + if (_key_event_validation_check(raw_event->detail) == 0) { + return; + } + + Ecore_X_Display *d = ecore_x_display_get(); + if (d == NULL) { + ERR("failed to get ecore-display"); + return; + } + + memset(&xev, 0, sizeof(XEvent)); + xev.xany.display = d; + xev.xkey.keycode = raw_event->detail; + xev.xkey.time = raw_event->time; + if (s_info.is_shift_pressed == 1) { + xev.xkey.state = 0x1; + } else { + xev.xkey.state = 0; + } + xev.xkey.root = ecore_x_window_root_first_get(); + xev.xkey.send_event = 1; + xev.xkey.subwindow = None; + xev.xkey.type = KeyRelease; + xev.xkey.window = elm_win_xwindow_get(ad->win); + XSendEvent(d, elm_win_xwindow_get(ad->win) + , False, NoEventMask, &xev); + DBG("keyrelease:%d", raw_event->detail); +} +#endif + +static void _focus_cleanup(void *data) +{ + struct appdata *ad = data; + Evas_Object *focused_obj = NULL; + retif(ad == NULL, , "invalid data."); + retif(ad->win == NULL, , "invalid data."); + + focused_obj = elm_object_focused_object_get(ad->win); + if (focused_obj != NULL) { + elm_object_focus_set(focused_obj, EINA_FALSE); + } + elm_win_focus_highlight_enabled_set(ad->win, EINA_FALSE); +} + +HAPI void quickpanel_keyboard_x_init(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + _xinput_init(); +} + +HAPI void quickpanel_keyboard_x_fini(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (s_info.hdl_key_event != NULL) { + ecore_event_handler_del(s_info.hdl_key_event); + s_info.hdl_key_event = NULL; + } + + _focus_cleanup(ad); +} + +HAPI void quickpanel_keyboard_x_openning_init(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (s_info.hdl_key_event != NULL) { + ecore_event_handler_del(s_info.hdl_key_event); + s_info.hdl_key_event = NULL; + } +#ifdef HAVE_X + s_info.hdl_key_event = ecore_event_handler_add(ECORE_X_EVENT_GENERIC, (Ecore_Event_Handler_Cb)_cb_event_generic, NULL); +#endif +} + +HAPI void quickpanel_keyboard_x_closing_fini(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (s_info.hdl_key_event != NULL) { + ecore_event_handler_del(s_info.hdl_key_event); + s_info.hdl_key_event = NULL; + } + + if (ad->win != NULL) { + elm_win_focus_highlight_enabled_set(ad->win, EINA_FALSE); + } +} diff --git a/daemon/service/keyboard_x.h b/daemon/service/keyboard_x.h new file mode 100644 index 0000000..8af2dbf --- /dev/null +++ b/daemon/service/keyboard_x.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef _QP_SERVICE_KEYBOARD_X_DEF_ +#define _QP_SERVICE_KEYBOARD_X_DEF_ + +#include "quickpanel-ui.h" + +void quickpanel_keyboard_x_init(void *data); +void quickpanel_keyboard_x_fini(void *data); +void quickpanel_keyboard_x_openning_init(void *data); +void quickpanel_keyboard_x_closing_fini(void *data); + +#endif diff --git a/daemon/service/keyboard_x_x11.c b/daemon/service/keyboard_x_x11.c new file mode 100644 index 0000000..24d7db3 --- /dev/null +++ b/daemon/service/keyboard_x_x11.c @@ -0,0 +1,322 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#include <utilX.h> +#include <X11/Xlib.h> +#include <X11/extensions/XInput.h> +#include <X11/extensions/XInput2.h> + +#include <Ecore_Input.h> +#include <feedback.h> +#include "common.h" +#include "noti_util.h" +#include "keyboard_x.h" + +#define TAB 23 +#define SHIFT 50 +#define RETURN 36 +#define ARROW_KP_UP 80 +#define ARROW_KP_DOWN 88 +#define ARROW_KP_LEFT 83 +#define ARROW_KP_RIGHT 85 +#define ARROW_UP 111 +#define ARROW_DOWN 116 +#define ARROW_LEFT 113 +#define ARROW_RIGHT 114 + +typedef struct _key_info { + int keycode; + const char *keyname; + const char *key; + const char *string; + const char *compose; +} key_info; + +key_info key_infos[] = { + {TAB, "Tab", "Tab", "\t", "\t"}, + {RETURN, "Return", "Return", "\n", "\n"}, + {ARROW_UP, "Up", "Up", NULL, NULL}, + {ARROW_KP_UP, "Up", "Up", NULL, NULL}, + {ARROW_DOWN, "Down", "Down", NULL, NULL}, + {ARROW_KP_DOWN, "Down", "Down", NULL, NULL}, + {ARROW_LEFT, "Left", "Left", NULL, NULL}, + {ARROW_KP_LEFT, "Left", "Left", NULL, NULL}, + {ARROW_RIGHT, "Right", "Right", NULL, NULL}, + {ARROW_KP_RIGHT, "Right", "Right", NULL, NULL}, + {SHIFT, "Shift", "Shift", NULL, NULL}, +}; + +static int _cb_event_generic(void *data, int ev_type, void *event); +static Eina_Bool _xinput_init(void); +static void _key_event_select(void); +static void _focus_ui_process_press(XIRawEvent *raw_event); +static void _focus_ui_process_release(XIRawEvent *raw_event); + +static struct _s_info { + int xi2_opcode; + int is_shift_pressed; + Ecore_Event_Handler *hdl_key_event; +} s_info = { + .xi2_opcode = -1, + .is_shift_pressed = 0, + .hdl_key_event = NULL, +}; + +static int _key_event_validation_check(int keycode) +{ + int i = 0, len = 0; + + len = sizeof(key_infos) / sizeof(key_infos[0]); + + for (i = 0; i < len; i++ ) { + if (key_infos[i].keycode == keycode) { + return 1; + } + } + + return 0; +} + +static void _key_event_select(void) +{ + int rc; + XIEventMask mask; + Ecore_X_Display *d = NULL; + + d = ecore_x_display_get(); + if (d == NULL) { + ERR("failed to get ecore-display"); + return; + } + + mask.mask_len = XIMaskLen(XI_LASTEVENT); + mask.deviceid = XIAllDevices; + mask.mask = calloc(mask.mask_len, sizeof(char)); + if (mask.mask == NULL) { + ERR("failed to get ecore-display"); + return; + } + memset(mask.mask, 0, mask.mask_len); + + XISetMask(mask.mask, XI_RawKeyPress); + XISetMask(mask.mask, XI_RawKeyRelease); + + rc = XISelectEvents(d, ecore_x_window_root_first_get(), &mask, 1); + if (Success != rc) { + ERR("Failed to select XInput extension events"); + } + if (mask.mask) { + free( mask.mask); + } + ecore_x_sync(); +} + +static Eina_Bool _xinput_init(void) +{ + int event, error; + + if (!XQueryExtension(ecore_x_display_get(), "XInputExtension", + &s_info.xi2_opcode, &event, &error)) { + s_info.xi2_opcode = -1; + + SERR("failed to initialize key event receiver"); + return EINA_FALSE; + } + + _key_event_select(); + + return EINA_TRUE; +} + +static int _cb_event_generic(void *data, int ev_type, void *event) +{ + Ecore_X_Event_Generic *e = (Ecore_X_Event_Generic *)event; + XIDeviceEvent *evData = (XIDeviceEvent *)(e->data); + + if ( e->extension != s_info.xi2_opcode ) { + return ECORE_CALLBACK_PASS_ON; + } + if ( !evData || evData->send_event ) { + return ECORE_CALLBACK_PASS_ON; + } + + switch( e->evtype ) { + case XI_RawKeyPress: + if (evData->deviceid == 3) { + break; + } + _focus_ui_process_press((XIRawEvent *)evData); + break; + case XI_RawKeyRelease: + if (evData->deviceid == 3) { + break; + } + _focus_ui_process_release((XIRawEvent *)evData); + break; + default: + break; + } + + return ECORE_CALLBACK_PASS_ON; +} + +static void _focus_ui_process_press(XIRawEvent *raw_event) +{ + XEvent xev; + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + retif(raw_event == NULL, , "invalid data."); + + if (raw_event->detail == SHIFT) { + s_info.is_shift_pressed = 1; + return; + } + if (_key_event_validation_check(raw_event->detail) == 0) { + return; + } + + Ecore_X_Display *d = ecore_x_display_get(); + if (d == NULL) { + ERR("failed to get ecore-display"); + return; + } + + memset(&xev, 0, sizeof(XEvent)); + xev.xany.display = ecore_x_display_get(); + xev.xkey.keycode = raw_event->detail; + xev.xkey.time = raw_event->time; + if (s_info.is_shift_pressed == 1) { + xev.xkey.state = 0x1; + } else { + xev.xkey.state = 0; + } + xev.xkey.root = ecore_x_window_root_first_get(); + xev.xkey.send_event = 1; + xev.xkey.subwindow = None; + xev.xkey.type = KeyPress; + xev.xkey.window = elm_win_xwindow_get(ad->win); + XSendEvent(d, elm_win_xwindow_get(ad->win) + , False, NoEventMask, &xev); + DBG("keypressed:%d", raw_event->detail); +} + +static void _focus_ui_process_release(XIRawEvent *raw_event) +{ + XEvent xev; + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + retif(raw_event == NULL, , "invalid data."); + + if (raw_event->detail == SHIFT) { + s_info.is_shift_pressed = 0; + return; + } + if (_key_event_validation_check(raw_event->detail) == 0) { + return; + } + + Ecore_X_Display *d = ecore_x_display_get(); + if (d == NULL) { + ERR("failed to get ecore-display"); + return; + } + + memset(&xev, 0, sizeof(XEvent)); + xev.xany.display = d; + xev.xkey.keycode = raw_event->detail; + xev.xkey.time = raw_event->time; + if (s_info.is_shift_pressed == 1) { + xev.xkey.state = 0x1; + } else { + xev.xkey.state = 0; + } + xev.xkey.root = ecore_x_window_root_first_get(); + xev.xkey.send_event = 1; + xev.xkey.subwindow = None; + xev.xkey.type = KeyRelease; + xev.xkey.window = elm_win_xwindow_get(ad->win); + XSendEvent(d, elm_win_xwindow_get(ad->win) + , False, NoEventMask, &xev); + DBG("keyrelease:%d", raw_event->detail); +} + +static void _focus_cleanup(void *data) +{ + struct appdata *ad = data; + Evas_Object *focused_obj = NULL; + retif(ad == NULL, , "invalid data."); + retif(ad->win == NULL, , "invalid data."); + + focused_obj = elm_object_focused_object_get(ad->win); + if (focused_obj != NULL) { + elm_object_focus_set(focused_obj, EINA_FALSE); + } + elm_win_focus_highlight_enabled_set(ad->win, EINA_FALSE); +} + +HAPI void quickpanel_keyboard_x_init(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + _xinput_init(); +} + +HAPI void quickpanel_keyboard_x_fini(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (s_info.hdl_key_event != NULL) { + ecore_event_handler_del(s_info.hdl_key_event); + s_info.hdl_key_event = NULL; + } + + _focus_cleanup(ad); +} + +HAPI void quickpanel_keyboard_x_openning_init(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (s_info.hdl_key_event != NULL) { + ecore_event_handler_del(s_info.hdl_key_event); + s_info.hdl_key_event = NULL; + } + s_info.hdl_key_event = + ecore_event_handler_add(ECORE_X_EVENT_GENERIC, (Ecore_Event_Handler_Cb)_cb_event_generic, NULL); +} + +HAPI void quickpanel_keyboard_x_closing_fini(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (s_info.hdl_key_event != NULL) { + ecore_event_handler_del(s_info.hdl_key_event); + s_info.hdl_key_event = NULL; + } + + if (ad->win != NULL) { + elm_win_focus_highlight_enabled_set(ad->win, EINA_FALSE); + } +} diff --git a/daemon/service/noti_led.c b/daemon/service/noti_led.c index cf93fe5..9105043 100755 --- a/daemon/service/noti_led.c +++ b/daemon/service/noti_led.c @@ -1,35 +1,156 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.tizenopensource.org/license + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ -#ifdef QP_SERVICE_NOTI_LED_ENABLE + + #include <vconf.h> #include "common.h" #include "noti_util.h" #include "noti_led.h" +#include "noti_node.h" #define LED_ON 1 #define LED_OFF 0 +#define LED_MISSED_NOTI 5 + +typedef struct _QP_LED { + int priv_id; + notification_led_op_e op; + int argb; + int timestamp; + int time_on; + int time_off; +} QP_LED_T; + +static struct _s_led_info { + Eina_List *list; + int is_turned_on; +} s_led_info = { + .list = NULL, + .is_turned_on = 0, +}; + +static QP_LED_T * _led_entry_new(int priv_id, notification_led_op_e op, int argb, int time_on, int time_off) +{ + QP_LED_T *led_entry = (QP_LED_T *)calloc(1, sizeof(QP_LED_T)); + + retif(led_entry == NULL, NULL, "failed to memory allocation"); + + led_entry->priv_id = priv_id; + led_entry->op = op; + led_entry->argb = argb; + led_entry->time_on = (time_on <= 0) ? -1 : time_on ; + led_entry->time_off = (time_off <= 0) ? -1 : time_off; + led_entry->timestamp = (int)time(NULL); + + return led_entry; +} + +static void _led_entry_del(QP_LED_T *led_entry) +{ + retif(led_entry == NULL, ,"invalid parameter"); + + free(led_entry); +} + +static int +_led_list_sort_cb(const void *data1, const void *data2) +{ + QP_LED_T *entry_1 = (QP_LED_T *)data1; + QP_LED_T *entry_2 = (QP_LED_T *)data2; -static int g_is_led_turned_on = 0; + if (entry_1 == NULL || entry_2 == NULL) { + return 0; + } + + return entry_2->timestamp - entry_1->timestamp; +} + +static void _led_list_add(QP_LED_T *led_entry) +{ + retif(led_entry == NULL, ,"invalid parameter"); + + s_led_info.list = eina_list_sorted_insert(s_led_info.list, _led_list_sort_cb, led_entry); +} + +static void _led_list_del(QP_LED_T *led_entry) +{ + retif(led_entry == NULL, ,"invalid parameter"); + + s_led_info.list = eina_list_remove(s_led_info.list, led_entry); +} + +static void _led_list_sort(void) +{ + retif(s_led_info.list == NULL, ,"invalid parameter"); -static inline int _is_led_notification_enabled(void) { + s_led_info.list = eina_list_sort(s_led_info.list, 0, _led_list_sort_cb); +} + +static QP_LED_T *_led_list_find_by_priv_id(int priv_id) +{ + Eina_List *l; + Eina_List *n; + QP_LED_T *led_entry = NULL; + + retif(s_led_info.list == NULL, NULL,"invalid parameter"); + + EINA_LIST_FOREACH_SAFE(s_led_info.list, l, n, led_entry) { + if (led_entry != NULL) { + if (led_entry->priv_id == priv_id) return led_entry; + } + } + + return NULL; +} + +static void _led_list_clean_up(void) +{ + Eina_List *l; + Eina_List *n; + QP_LED_T *led_entry = NULL; + Eina_List *list_temp = NULL; + + retif(s_led_info.list == NULL, ,"invalid parameter"); + + list_temp = s_led_info.list; + s_led_info.list = NULL; + EINA_LIST_FOREACH_SAFE(list_temp, l, n, led_entry) { + if (led_entry != NULL) { + _led_entry_del(led_entry); + } + } + + eina_list_free(list_temp); + +} + +static QP_LED_T *_led_list_get_first(void) +{ + return eina_list_nth(s_led_info.list, 0); +} + +static inline int _is_led_enabled(void) +{ int ret = -1; int status = 1; +#ifdef HAVE_x ret = vconf_get_bool(VCONFKEY_SETAPPL_LED_INDICATOR_NOTIFICATIONS, &status); - +#endif if (ret == 0) { if (status == 0) { ERR("LED notification turned off"); @@ -42,182 +163,212 @@ static inline int _is_led_notification_enabled(void) { return 1; } -static inline int __quickpanel_service_get_event_count(const char *pkgname) { - int count = 0; - notification_h noti = NULL; - notification_list_h noti_list = NULL; - - retif(pkgname == NULL, 0, "Invalid parameter!"); - - notification_get_detail_list(pkgname, NOTIFICATION_GROUP_ID_NONE, NOTIFICATION_PRIV_ID_NONE, -1, ¬i_list); - if (noti_list != NULL) { - noti = notification_list_get_data(noti_list); - if (noti != NULL) { - count = quickpanel_noti_get_event_count_from_noti(noti); - } - notification_free_list(noti_list); - return count; - } else { - return 0; - } - - return 0; +static int _led_set_mode(int mode, bool val, int on, int off, unsigned int color) +{ + // TODO: Kiran device does not support front led. + // Because H/W is not fixed, if led should work, use dbus method call. + // + // bus name : org.tizen.system.deviced + // object path : /Org/Tizen/System/DeviceD/Led + // interface name : org.tizen.system.deviced.Led + // method name : SetMode + // input argument : "iiiiu" (int32:mode, + // int32:on(1)/off(0), + // int32:[custom]on duty (default:-1), + // int32:[custom]off duty (default:-1), + // uint32:[custom]color (default:0)) + // mode LED_MISSED_NOTI = 5, LED_VOICE_RECORDING = 6, LED_REMOTE_CONTROLLER = 7, LED_AIR_WAKEUP = 8 + // custom : only support for MISSED_NOTI and VOICE_RECORDING case + // output argument : "i" (int32:result) + + return -1; } -static void _noti_led_on_with_custom_color(int led_argb) { +static void _noti_led_on(QP_LED_T *led_entry) +{ int ret = 0; + retif(led_entry == NULL, , "invalid data"); - if ((ret = led_set_mode_with_color(LED_MISSED_NOTI, LED_ON, led_argb)) == -1) { - ERR("failed led_set_mode:%d", ret); - } - g_is_led_turned_on = 1; -} - -static void _noti_led_on(notification_h noti) { - int ret = 0; - notification_led_op_e operation = -1; - int led_argb = 0x0; + DBG("turn on LED with OP:%d ARGB:%x ON:%d OFF:%d", + led_entry->op, led_entry->argb, led_entry->time_on, led_entry->time_off); - if (noti == NULL) { - if ((ret = led_set_mode(LED_MISSED_NOTI, LED_ON)) == -1) { + if (led_entry->op == NOTIFICATION_LED_OP_ON) { + if ((ret = _led_set_mode(LED_MISSED_NOTI, LED_ON, led_entry->time_on, led_entry->time_off, 0)) == -1) { ERR("failed led_set_mode:%d", ret); + } else { + s_led_info.is_turned_on = 1; } - g_is_led_turned_on = 1; - } else { - notification_get_led(noti, &operation, &led_argb); - - if (operation == NOTIFICATION_LED_OP_ON) { - if ((ret = led_set_mode(LED_MISSED_NOTI, LED_ON)) == -1) { - ERR("failed led_set_mode:%d", ret); - } - g_is_led_turned_on = 1; - } else if (operation == NOTIFICATION_LED_OP_ON_CUSTOM_COLOR) { - if ((ret = led_set_mode_with_color(LED_MISSED_NOTI, LED_ON, led_argb)) == -1) { - ERR("failed led_set_mode:%d", ret); - } - g_is_led_turned_on = 1; + } else if (led_entry->op == NOTIFICATION_LED_OP_ON_CUSTOM_COLOR) { + if ((ret = _led_set_mode(LED_MISSED_NOTI, LED_ON, led_entry->time_on, led_entry->time_off, led_entry->argb)) == -1) { + ERR("failed led_set_mode:%d", ret); } else { - ERR("NOTIFICATION_LED_OP_OFF"); + s_led_info.is_turned_on = 1; } + } else { + ERR("NOTIFICATION_LED_OP_OFF"); } } -static void _noti_led_off(void) { +static void _noti_led_off(int is_force) +{ int ret = 0; - if ((ret = led_set_mode(LED_MISSED_NOTI, LED_OFF)) == -1) { + ERR("try to turn off LED"); + retif(s_led_info.is_turned_on == 0 && is_force == 1, , "LED already turned off"); + + if ((ret = _led_set_mode(LED_MISSED_NOTI, LED_OFF, 0, 0, 0)) == -1) { ERR("failed led_set_mode:%d", ret); + } else { + s_led_info.is_turned_on = 0; } - g_is_led_turned_on = 0; } -static int _is_keep_turn_on_led(int *op, int *argb) { - notification_h noti = NULL; - notification_list_h noti_list = NULL; - notification_list_h noti_list_head = NULL; - notification_led_op_e operation = -1; +HAPI void quickpanel_noti_led_proc(notification_h noti, int op_type) +{ + int priv_id = 0; int led_argb = 0; - - notification_get_list(NOTIFICATION_TYPE_NOTI , -1, ¬i_list_head); - noti_list = noti_list_head; - - while (noti_list != NULL) { - noti = notification_list_get_data(noti_list); - if (noti != NULL) { - notification_get_led(noti, &operation, &led_argb); - if (operation >= NOTIFICATION_LED_OP_ON) { - notification_free_list(noti_list_head); - noti_list_head = NULL; - - if (op != NULL) *op = operation; - if (argb != NULL) *argb = led_argb; - return 1; + int time_on = 0; + int time_off = 0; + QP_LED_T *led_entry = NULL; + notification_led_op_e led_op = -1; + retif(noti == NULL, , "Invalid parameter!"); + + notification_get_id(noti, NULL, &priv_id); + notification_get_led(noti, &led_op, &led_argb); + notification_get_led_time_period(noti, &time_on, &time_off); + + DBG("on:%d off:%d", time_on, time_off); + + if (op_type == NOTIFICATION_OP_INSERT || op_type == NOTIFICATION_OP_UPDATE) { + led_entry = _led_list_find_by_priv_id(priv_id); + if (led_entry != NULL) { + if (led_op == NOTIFICATION_LED_OP_OFF) { + _led_list_del(led_entry); + _led_entry_del(led_entry); + } else { + led_entry->op = led_op; + led_entry->argb = led_argb; + led_entry->time_on = (time_on <= 0) ? -1 : time_on ; + led_entry->time_off = (time_off <= 0) ? -1 : time_off; + led_entry->timestamp = (int)time(NULL); + _led_list_sort(); + } + } else { + if (led_op >= NOTIFICATION_LED_OP_ON) { + led_entry = _led_entry_new(priv_id, led_op, led_argb, time_on, time_off); + _led_list_add(led_entry); } } - - noti_list = notification_list_get_next(noti_list); + } else if (op_type == NOTIFICATION_OP_DELETE) { + led_entry = _led_list_find_by_priv_id(priv_id); + if (led_entry != NULL) { + _led_list_del(led_entry); + _led_entry_del(led_entry); + } } - if (noti_list_head != NULL) { - notification_free_list(noti_list_head); - noti_list_head = NULL; + //turn on or off LED + if (_is_led_enabled() == 1) { + led_entry = _led_list_get_first(); + if (led_entry != NULL) { + _noti_led_on(led_entry); + } else { + _noti_led_off(0); + } + } else { + _noti_led_off(0); } - - return 0; } -HAPI void quickpanel_service_noti_led_on(notification_h noti) { - notification_led_op_e operation = -1; - int led_argb = 0; - - retif(_is_led_notification_enabled() == 0, , "led noti disabled"); - - if (noti == NULL) { - if (_is_keep_turn_on_led(&operation, &led_argb) >= 1) { - if (operation == NOTIFICATION_LED_OP_ON) { - _noti_led_on(NULL); - } else if (operation == NOTIFICATION_LED_OP_ON_CUSTOM_COLOR) { - _noti_led_on_with_custom_color(led_argb); - } +static void _led_option_vconf_cb(keynode_t *node, void *data) +{ + QP_LED_T *led_entry = NULL; + + if (_is_led_enabled() == 1) { + DBG("led notification is enabled"); + led_entry = _led_list_get_first(); + if (led_entry != NULL) { + DBG("try to turn on LED, op:%d argb:%x", led_entry->op, led_entry->argb); + _noti_led_on(led_entry); + } else { + _noti_led_off(1); } } else { - _noti_led_on(noti); + DBG("led notification is disabled"); + _noti_led_off(1); } } -HAPI void quickpanel_service_noti_led_off(notification_h noti) { - retif(g_is_led_turned_on == 0, , "led already turned off"); - - if (_is_keep_turn_on_led(NULL, NULL) == 0) { - _noti_led_off(); +static void _led_init_data_cb(gpointer key, gpointer value, gpointer user_data) +{ + int priv_id = 0; + int led_argb = 0; + int time_on = 0; + int time_off = 0; + notification_led_op_e led_op = -1; + noti_node_item *node = (noti_node_item *)value; + retif(node == NULL, , "Invalid parameter!"); + retif(node->noti == NULL, , "Invalid parameter!"); + + notification_get_id(node->noti, NULL, &priv_id); + notification_get_led(node->noti, &led_op, &led_argb); + notification_get_led_time_period(node->noti, &time_on, &time_off); + if (led_op >= NOTIFICATION_LED_OP_ON) { + QP_LED_T *new_entry = _led_entry_new(priv_id, led_op, led_argb, time_on, time_off); + _led_list_add(new_entry); } } - -static void quickpanel_service_noti_vconf_cb(keynode_t *node, - void *data) +static void _led_init_data(noti_node *nodes) { - int ret = 0; - int is_on = 0; + QP_LED_T *led_entry = NULL; + retif(nodes == NULL, , "Invalid parameter!"); + retif(nodes->table == NULL, , "Invalid parameter!"); - is_on = _is_led_notification_enabled(); + g_hash_table_foreach(nodes->table, _led_init_data_cb, NULL); - ERR("led notification status:%d", is_on); - - if (is_on == 0) { - if ((ret = led_set_mode(LED_MISSED_NOTI, LED_OFF)) == -1) { - ERR("failed led_set_mode:%d", ret); + if (_is_led_enabled() == 1) { + led_entry = _led_list_get_first(); + if (led_entry != NULL) { + _noti_led_on(led_entry); + } else { + _noti_led_off(1); } - g_is_led_turned_on = 0; } else { - quickpanel_service_noti_led_on(NULL); + _noti_led_off(1); } } -HAPI void quickpanel_service_noti_init(void *data) { +HAPI void quickpanel_noti_led_init(void *data, void *nodes) +{ int ret = 0; struct appdata *ad = data; retif(ad == NULL, , "Invalid parameter!"); - ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LED_INDICATOR_NOTIFICATIONS, - quickpanel_service_noti_vconf_cb, - ad); +#ifdef HAVE_X + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_LED_INDICATOR_NOTIFICATIONS,_led_option_vconf_cb, ad); +#endif if (ret != 0) { ERR("failed to notify key[%s] : %d", VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, ret); } + + if (nodes != NULL) { + _led_init_data((noti_node *)nodes); + } } -HAPI void quickpanel_service_noti_fini(void *data) { +HAPI void quickpanel_noti_led_fini(void *data) +{ int ret = 0; struct appdata *ad = data; retif(ad == NULL, , "Invalid parameter!"); - - ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_LED_INDICATOR_NOTIFICATIONS, - quickpanel_service_noti_vconf_cb); +#ifdef HAVE_X + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_LED_INDICATOR_NOTIFICATIONS,_led_option_vconf_cb); if (ret != 0) { - ERR("failed to ignore key[%s] : %d", - VCONFKEY_SETAPPL_LED_INDICATOR_NOTIFICATIONS, ret); + ERR("failed to ignore key[%s] : %d", VCONFKEY_SETAPPL_LED_INDICATOR_NOTIFICATIONS, ret); } -} #endif + + _led_list_clean_up(); +} diff --git a/daemon/service/noti_led.h b/daemon/service/noti_led.h index 486e124..63c3c69 100755 --- a/daemon/service/noti_led.h +++ b/daemon/service/noti_led.h @@ -1,40 +1,29 @@ /* - * Copyright 2012 Samsung Electronics Co., Ltd + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved * - * Licensed under the Flora License, Version 1.1 (the License); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.tizenopensource.org/license + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, + * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * */ -#ifdef QP_SERVICE_NOTI_LED_ENABLE + #ifndef _QP_NOTI_LED_DEF_ #define _QP_NOTI_LED_DEF_ #include <notification.h> -#include <dd-led.h> #include "quickpanel-ui.h" -#if !defined(VENDOR) -#define NOTI_LED_CALL_PKGNAME "com.samsung.call" -#define NOTI_LED_VTCALL_PKGNAME "com.samsung.vtmain" -#else -#define NOTI_LED_CALL_PKGNAME VENDOR".call" -#define NOTI_LED_VTCALL_PKGNAME VENDOR".vtmain" -#endif -#define NOTI_LED_MSG_PKGNAME "/usr/bin/msg-server" +void quickpanel_noti_led_init(void *data, void *noti_node); +void quickpanel_noti_led_fini(void *data); +void quickpanel_noti_led_proc(notification_h noti, int op_type); -void quickpanel_service_noti_led_on(notification_h noti); -void quickpanel_service_noti_led_off(notification_h noti); -void quickpanel_service_noti_init(void *data); -void quickpanel_service_noti_fini(void *data); - -#endif #endif diff --git a/daemon/service/reminder.c b/daemon/service/reminder.c new file mode 100644 index 0000000..cd702d8 --- /dev/null +++ b/daemon/service/reminder.c @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <alarm.h> +#include <time.h> +#include <unistd.h> +#include <vconf.h> +#include <system_settings.h> + +#include "quickpanel-ui.h" +#include "common.h" +#include "media.h" +#include "noti.h" + +#define REMINDER_MIN_INTERVAL 2 + +static struct info { + int alarm_id; +} s_info = { + .alarm_id = -1, +}; + +static void _feedback_sound_play(void) +{ + int ret = 0; + noti_node_item *node = NULL; + notification_h noti; + int priv_id = 0; + const char *nsound_path = NULL; + notification_sound_type_e nsound_type = NOTIFICATION_SOUND_TYPE_NONE; + int is_play_default = 0; + + // check first noti sound + node = quickpanel_noti_node_get_first_noti(); + if (node) { + noti = node->noti; + if (noti) { + notification_get_id(noti, NULL, &priv_id); + notification_get_sound(noti, &nsound_type, &nsound_path); + SDBG("reminded notification sound type[%d] path[%s]", nsound_type, nsound_path); + + switch (nsound_type) { + case NOTIFICATION_SOUND_TYPE_USER_DATA: + /* + * if user data file isn't playable, play the default ringtone + */ + if (nsound_path != NULL) { + if (quickpanel_media_playable_check(nsound_path) == EINA_TRUE) { + ret = quickpanel_media_player_play(SOUND_TYPE_NOTIFICATION, nsound_path); + if (ret == PLAYER_ERROR_NONE) { + quickpanel_media_player_id_set(priv_id); + } else { + ERR("failed to play notification sound[%d]", ret); + is_play_default = 1; + } + } + } + break; + case NOTIFICATION_SOUND_TYPE_DEFAULT: + is_play_default = 1; + break; + case NOTIFICATION_SOUND_TYPE_MAX: + case NOTIFICATION_SOUND_TYPE_NONE: + break; + } + } + } + + if (is_play_default) { + char *default_msg_tone = NULL; + +#ifdef HAVE_X + ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_SOUND_NOTIFICATION, &default_msg_tone); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "ailed to set key(%s) : %d", SYSTEM_SETTINGS_KEY_SOUND_NOTIFICATION, ret); + SDBG("Reminded setting sound[%s]", default_msg_tone); +#endif + if (default_msg_tone != NULL) { + ret = quickpanel_media_player_play(SOUND_TYPE_NOTIFICATION, default_msg_tone); + free(default_msg_tone); + quickpanel_media_player_id_set(0); + if (ret != PLAYER_ERROR_NONE) { + ERR("failed to play feedback sound"); + } + } + + if (quickpanel_media_is_vib_enabled() == 1) { + feedback_play_type(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_MESSAGE); + } + } +} + +static int _reminder_interval_get(void) +{ + int key = 0; + int min = 0; + int ret = -1; + + ret = vconf_get_int(VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT, &key); + retif(ret != 0, 0, "failed to get vconf VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT"); + + switch (key) { + case 1: + min = 2; + break; + case 2: + min = 5; + break; + case 3: + min = 10; + break; + } + + DBG("interval:%d", min); + + return min; +} + +static int _alarm_delete_cb(alarm_id_t id, void * user_param) +{ + int ret = ALARMMGR_RESULT_SUCCESS; + + ret = alarmmgr_remove_alarm(id); + if (ret != ALARMMGR_RESULT_SUCCESS) { + ERR("alarmmgr_enum_alarm_ids() failed"); + } + + return 0; +} + +static void _alarm_unset(void) +{ + int ret = ALARMMGR_RESULT_SUCCESS; + + if (s_info.alarm_id != -1){ + ERR("try to delete alarm_id(%d)", s_info.alarm_id); + ret = alarmmgr_remove_alarm(s_info.alarm_id); + if (ret != ALARMMGR_RESULT_SUCCESS) { + ERR("alarmmgr_remove_alarm(%d) failed", s_info.alarm_id); + ret = alarmmgr_enum_alarm_ids(_alarm_delete_cb, NULL); + if (ret != ALARMMGR_RESULT_SUCCESS) { + ERR("alarmmgr_enum_alarm_ids() failed"); + } + } + s_info.alarm_id = -1; + } +} + +static Eina_Bool _alarm_set_from_now(int min, void *data) +{ + int ret = ALARMMGR_RESULT_SUCCESS; + time_t current_time; + struct tm current_tm; + alarm_entry_t *alarm_info = NULL; + alarm_id_t alarm_id; + alarm_date_t alarm_time; + + /* delete before registering alarm ids */ + _alarm_unset(); + + /* set alarm after sec */ + time(¤t_time); + + DBG(" %s, after %d MIN alarm set", ctime(¤t_time), min); + localtime_r(¤t_time, ¤t_tm); + + alarm_info = alarmmgr_create_alarm(); + if (alarm_info == NULL) { + ERR("alarmmgr_create_alarm() is failed\n"); + return EINA_FALSE; + } + + alarm_time.year = 0; + alarm_time.month = 0; + alarm_time.day = 0; + alarm_time.hour = current_tm.tm_hour; + alarm_time.min = current_tm.tm_min + min; + alarm_time.sec = current_tm.tm_sec; + + alarmmgr_set_repeat_mode(alarm_info, ALARM_REPEAT_MODE_ONCE, 0); + alarmmgr_set_time(alarm_info, alarm_time); + alarmmgr_set_type(alarm_info, ALARM_TYPE_VOLATILE); + + ret = alarmmgr_add_alarm_with_localtime(alarm_info, NULL, &alarm_id); + if (ret != ALARMMGR_RESULT_SUCCESS) { + ERR("alarmmgr_add_alarm_with_localtime() failed:%d", ret); + alarmmgr_free_alarm(alarm_info) ; + return EINA_FALSE; + } + + DBG("alarm id(%d) is set", alarm_id); + s_info.alarm_id = alarm_id; + alarmmgr_free_alarm(alarm_info) ; + + return EINA_TRUE; +} + +static int _alarm_cb(alarm_id_t alarm_id, void *data) +{ + DBG(""); + + int min = _reminder_interval_get(); + + if (min >= REMINDER_MIN_INTERVAL) { + _alarm_set_from_now(min, data); + } else { + _alarm_unset(); + } + + if (!quickpanel_uic_is_opened()) { + _feedback_sound_play(); + } else { + ERR("quickpanel is opened, skip remind sound"); + } + + return 1; +} + +static void _alarm_setting_changed_cb(keynode_t *key, void* data) +{ + int min = _reminder_interval_get(); + + if (quickpanel_noti_get_count() <= 0) { + _alarm_unset(); + } else { + if (min >= REMINDER_MIN_INTERVAL) { + _alarm_set_from_now(min, data); + } else { + _alarm_unset(); + } + } +} + +HAPI void quickpanel_reminder_init(void *data) +{ + DBG(""); + + int ret = 0; + + ret = alarmmgr_init("org.tizen.quickpanel"); + retif(ret < 0, , "alarmmgr_init() failed (%d)", ret); + + ret = alarmmgr_set_cb(_alarm_cb, NULL); + retif(ret < 0, , "alarmmgr_init() failed (%d)", ret); + + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT, + _alarm_setting_changed_cb, data); + if (ret != 0) { + ERR("failed to register a cb key:%s err:%d", + "VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT", ret); + } + + s_info.alarm_id = -1; +} + +HAPI void quickpanel_reminder_fini(void *data) +{ + DBG(""); + + int ret = 0; + + _alarm_unset(); + + alarmmgr_fini(); + + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT, _alarm_setting_changed_cb); + if (ret != 0) { + ERR("failed to unregister a cb key:%s err:%d", "VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT", ret); + } +} + +HAPI void quickpanel_reminder_start(void *data) +{ + DBG(""); + + int min = _reminder_interval_get(); + + if (min >= REMINDER_MIN_INTERVAL) { + _alarm_set_from_now(min, data); + } +} + +HAPI void quickpanel_reminder_stop(void *data) +{ + DBG(""); + + _alarm_unset(); +} diff --git a/daemon/service/reminder.h b/daemon/service/reminder.h new file mode 100644 index 0000000..2bdf7d0 --- /dev/null +++ b/daemon/service/reminder.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef _QP_REMINDER_DEF_ +#define _QP_REMINDER_DEF_ + +void quickpanel_reminder_init(void *data); +void quickpanel_reminder_fini(void *data); +void quickpanel_reminder_start(void *data); +void quickpanel_reminder_stop(void *data); + +#endif diff --git a/daemon/service/smart_alert.c b/daemon/service/smart_alert.c new file mode 100644 index 0000000..4d16f57 --- /dev/null +++ b/daemon/service/smart_alert.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#include "common.h" +#include "noti_util.h" +#include "smart_alert.h" + +static inline int __quickpanel_service_update_event_count(const char *pkgname, const char *vconfkey) +{ + int ret = 0, count = 0; + notification_h noti = NULL; + notification_list_h noti_list = NULL; + + retif(pkgname == NULL, 0, "Invalid parameter!"); + retif(vconfkey == NULL, 0, "Invalid parameter!"); + + notification_get_detail_list(pkgname, NOTIFICATION_GROUP_ID_NONE, NOTIFICATION_PRIV_ID_NONE, -1, ¬i_list); + if (noti_list != NULL) { + noti = notification_list_get_data(noti_list); + if (noti != NULL) { + count = quickpanel_noti_util_get_event_count_from_noti(noti); + ret = vconf_set_int(vconfkey, count); + + ERR("event set:%s, count:%d", pkgname, count); + + if (ret != 0) { + ERR("failed to set vconf key[%s] : %d", vconfkey, ret); + } + } else { + ERR("no data found:%s", pkgname); + } + notification_free_list(noti_list); + return count; + } else { + ret = vconf_set_int(vconfkey, 0); + + ERR("event unset:%s", pkgname); + + if (ret != 0) { + ERR("failed to set vconf key[%s] : %d", vconfkey, ret); + } + } + + return 0; +} + +HAPI void quickpanel_smart_alert_update_info(notification_h noti) +{ + char *pkgname = NULL; + int event_count_call = 0; + int event_count_vtcall = 0; + + if (noti == NULL) { + event_count_call = quickpanel_noti_util_get_event_count_by_pkgname(SMART_ALARM_CALL_PKGNAME); + event_count_vtcall = quickpanel_noti_util_get_event_count_by_pkgname(SMART_ALARM_VTCALL_PKGNAME); + ERR("call event set, count:%d", MAX(event_count_call, event_count_vtcall)); + } else { + notification_get_pkgname(noti, &pkgname); + retif(pkgname == NULL, , "Invalid parameter!"); + + if (strncmp(pkgname, SMART_ALARM_CALL_PKGNAME, strlen(pkgname)) == 0 + || strncmp(pkgname, SMART_ALARM_VTCALL_PKGNAME, strlen(pkgname)) == 0) { + event_count_call = quickpanel_noti_util_get_event_count_by_pkgname(SMART_ALARM_CALL_PKGNAME); + event_count_vtcall = quickpanel_noti_util_get_event_count_by_pkgname(SMART_ALARM_VTCALL_PKGNAME); + + ERR("call event set, count:%d", MAX(event_count_call, event_count_vtcall)); + } + } +} diff --git a/daemon/service/smart_alert.h b/daemon/service/smart_alert.h new file mode 100644 index 0000000..0994627 --- /dev/null +++ b/daemon/service/smart_alert.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef _QP_SMART_ALERT_DEF_ +#define _QP_SMART_ALERT_DEF_ + +#include <notification.h> +#include "quickpanel-ui.h" + +#if !defined(VENDOR) +#define SMART_ALARM_CALL_PKGNAME "org.tizen.call-notification" +#define SMART_ALARM_VTCALL_PKGNAME "org.tizen.vtmain" +#define SMART_ALARM_MSG_PKGNAME "org.tizen.message" +#else +#define SMART_ALARM_CALL_PKGNAME VENDOR".call-notification" +#define SMART_ALARM_VTCALL_PKGNAME VENDOR".vtmain" +#define SMART_ALARM_MSG_PKGNAME VENDOR".message" +#endif + +void quickpanel_smart_alert_update_info(notification_h noti); + +#endif diff --git a/daemon/service/uninstall.c b/daemon/service/uninstall.c new file mode 100644 index 0000000..f520f7e --- /dev/null +++ b/daemon/service/uninstall.c @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#include <pkgmgr-info.h> +#include <package-manager.h> +#include <notification.h> +#include <badge.h> +#include "common.h" +#include "uninstall.h" + +#define QP_PKGMGR_STR_START "start" +#define QP_PKGMGR_STR_END "end" +#define QP_PKGMGR_STR_OK "ok" +#define QP_PKGMGR_STR_UNINSTALL "uninstall" + +typedef struct _pkg_event { + char *pkgname; + int is_done; +} Pkg_Event; + +static struct _s_info { + pkgmgr_client *client; + Eina_List *event_list; +} s_info = { + .client = NULL, + .event_list = NULL, +}; + +static void _item_del(Pkg_Event *item_event) +{ + if (item_event != NULL) { + free(item_event->pkgname); + } + + free(item_event); +} + +static int _is_item_exist(const char *pkgid, int remove_if_exist) +{ + int ret = 0; + Eina_List *l = NULL; + Pkg_Event *event_item = NULL; + retif(pkgid == NULL, 0, "invalid parameter"); + + EINA_LIST_FOREACH(s_info.event_list, l, event_item) { + if (event_item != NULL) { + if (strcmp(event_item->pkgname, pkgid) == 0) { + ret = 1; + break; + } + } + } + + if (ret == 1 && remove_if_exist == 1) { + s_info.event_list = eina_list_remove(s_info.event_list, event_item); + _item_del(event_item); + } + + return ret; +} + +static int _pkgmgr_event_cb(int req_id, const char *pkg_type, const char *pkgid, + const char *key, const char *val, const void *pmsg, void *priv_data) +{ + if (pkgid == NULL) { + return 0; + } + + SDBG("pkg:%s key:%s val:%s", pkgid, key, val); + + if (key != NULL && val != NULL) { + if (strcasecmp(key, QP_PKGMGR_STR_START) == 0 && + strcasecmp(val, QP_PKGMGR_STR_UNINSTALL) == 0) { + + ERR("Pkg:%s is being uninstalled", pkgid); + + Pkg_Event *event = calloc(1, sizeof(Pkg_Event)); + if (event != NULL) { + event->pkgname = strdup(pkgid); + s_info.event_list = eina_list_append(s_info.event_list, event); + } else { + ERR("failed to create event item"); + } + + return 0; + } else if (strcasecmp(key, QP_PKGMGR_STR_END) == 0 && + strcasecmp(val, QP_PKGMGR_STR_OK) == 0) { + if (_is_item_exist(pkgid, 1) == 1) { + ERR("Pkg:%s is uninstalled, delete related resource", pkgid); + notification_delete_all_by_type(pkgid, NOTIFICATION_TYPE_NOTI); + notification_delete_all_by_type(pkgid, NOTIFICATION_TYPE_ONGOING); + badge_remove(pkgid); + } + } + } + + return 0; +} + +HAPI void quickpanel_uninstall_init(void *data) +{ + int ret = -1; + + pkgmgr_client *client = pkgmgr_client_new(PC_LISTENING); + if (client != NULL) { + if ((ret = pkgmgr_client_listen_status(client, _pkgmgr_event_cb, data)) != PKGMGR_R_OK) { + ERR("Failed to listen pkgmgr event:%d", ret); + } + s_info.client = client; + } else { + ERR("Failed to create package manager client"); + } +} + +HAPI void quickpanel_uninstall_fini(void *data) +{ + int ret = -1; + Pkg_Event *event_item = NULL; + + if (s_info.client != NULL) { + if ((ret = pkgmgr_client_free(s_info.client)) != PKGMGR_R_OK) { + ERR("Failed to free pkgmgr client:%d", ret); + } + s_info.client = NULL; + } + + EINA_LIST_FREE(s_info.event_list, event_item) { + _item_del(event_item); + } + s_info.event_list = NULL; +} diff --git a/daemon/service/uninstall.h b/daemon/service/uninstall.h new file mode 100644 index 0000000..7e28d09 --- /dev/null +++ b/daemon/service/uninstall.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef _QP_SERVICE_UNINSTALL_DEF_ +#define _QP_SERVICE_UNINSTALL_DEF_ + +#include "quickpanel-ui.h" + +void quickpanel_uninstall_init(void *data); +void quickpanel_uninstall_fini(void *data); + +#endif diff --git a/daemon/settings/modules/assistive_light.c b/daemon/settings/modules/assistive_light.c new file mode 100644 index 0000000..168b338 --- /dev/null +++ b/daemon/settings/modules/assistive_light.c @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <app.h> +#include <device/led.h> +#include <vconf.h> + +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" + + +#define E_DATA_POPUP_MODULE_ITEM "mobule_item" +#define BUTTON_LABEL _("IDS_ST_BUTTON2_TORCH_ABB") +#define BUTTON_ICON_NORMAL "quick_icon_torch.png" + +static void _status_update(QP_Module_Setting *module, int light_status, int flag_extra_2); + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static void _on_vconf_assetive_light_changed(keynode_t *node, void *user_data) +{ + Eina_Bool mode = EINA_FALSE; + + if (!node) { + ERR("node == NULL"); + return; + } + +#ifdef HAVE_X + mode = node->value.b; +#endif + + quickpanel_setting_module_icon_state_set(user_data, mode); + _status_update(user_data, mode, FLAG_VALUE_VOID); +} + +static int _init(void *data) +{ + vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TORCH_LIGHT, _on_vconf_assetive_light_changed, data); + + return QP_OK; +} + +static void _set_assetive_light_mode(Eina_Bool mode) +{ + int max_brightness; + int ret = device_flash_get_max_brightness(&max_brightness); + + if (ret != 0) { + ERR("TORCH LIGHT CHANGE: ret != 0 -> %d", ret); + return; + } else { + ERR("TORCH LIGHT OK[%d]", max_brightness); + } + + int ret_set = -1; + + if(mode == EINA_TRUE) { + ret_set = device_flash_set_brightness(max_brightness); + if (ret_set != 0) { + ERR("Failed to set brightness(%d)[%d]", max_brightness, ret_set); + } else { + if (vconf_set_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TORCH_LIGHT, 1) < 0) { + ERR("Failed to set tourch light vconf key"); + } + } + } else { + ret_set = device_flash_set_brightness(0); + if (ret_set != 0) { + ERR("Failed to set brightness(0)[%d]", ret_set); + } else { + if (vconf_set_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TORCH_LIGHT, 0) < 0) { + ERR("Failed to set tourch light vconf key"); + } + } + } +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + Evas_Object *image = NULL; + const char *icon_path = NULL; + + quickpanel_setting_icon_state_set(view, state); + icon_path = BUTTON_ICON_NORMAL; + image = quickpanel_setting_icon_image_new(view, icon_path); + quickpanel_setting_icon_content_set(view, image); + quickpanel_setting_icon_text_set(view, BUTTON_LABEL, state); +} + +static void _status_update(QP_Module_Setting *module, int light_status, int flag_extra_2) +{ + int ret = -1; + retif(module == NULL, , "Invalid parameter!"); + + int brightness = 0; + ret = device_flash_get_brightness(&brightness); + if (ret != 0) { + ERR("Failed to get brightness[%d]", ret); + } + + if (brightness > 0) { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_ON); + } else { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_OFF); + } + + quickpanel_setting_module_icon_view_update(module, + quickpanel_setting_module_icon_state_get(module), FLAG_VALUE_VOID); +} + +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + _set_assetive_light_mode(FLAG_TURN_OFF); + } else { + _set_assetive_light_mode(FLAG_TURN_ON); + } + + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *) data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static int _fini(void *data) +{ + return QP_OK; +} + +QP_Module_Setting assistive_light = +{ + .name = "assisitvelight", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = NULL, + .label_get = _label_get, + .supported_get = NULL, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = NULL, + .handler_press = _mouse_clicked_cb, +}; + diff --git a/daemon/settings/modules/bluetooth.c b/daemon/settings/modules/bluetooth.c new file mode 100644 index 0000000..6b82217 --- /dev/null +++ b/daemon/settings/modules/bluetooth.c @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include <bluetooth.h> +#include <vconf.h> +#include <bluetooth_internal.h> + +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" + +#define BUTTON_LABEL _("IDS_ST_BUTTON2_BLUETOOTH_ABB") +#define BUTTON_ICON_NORMAL "quick_icon_bluetooth.png" +#define BUTTON_ICON_HIGHLIGHT NULL +#define BUTTON_ICON_DIM NULL +#define PACKAGE_SETTING_MENU "ug-bluetooth-efl-single" + +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static const char *_icon_get(qp_setting_icon_image_type type) +{ + if (type == QP_SETTING_ICON_NORMAL) { + return BUTTON_ICON_NORMAL; + } else if (type == QP_SETTING_ICON_HIGHLIGHT) { + return BUTTON_ICON_HIGHLIGHT; + } else if (type == QP_SETTING_ICON_DIM) { +#ifdef BUTTON_ICON_DIM + return BUTTON_ICON_DIM; +#endif + } + + return NULL; +} + +static void _long_press_cb(void *data) +{ +#ifdef PACKAGE_SETTING_MENU + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, NULL); +#endif +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + Evas_Object *image = NULL; + const char *icon_path = NULL; + + quickpanel_setting_icon_state_set(view, state); + + if (state == ICON_VIEW_STATE_ON) { +#ifdef BUTTON_ICON_HIGHLIGHT + icon_path = BUTTON_ICON_HIGHLIGHT; +#endif + } else if (state == ICON_VIEW_STATE_DIM) { +#ifdef BUTTON_ICON_DIM + icon_path = BUTTON_ICON_DIM; +#endif + } else { + icon_path = BUTTON_ICON_NORMAL; + } + + if (icon_path == NULL) { + icon_path = BUTTON_ICON_NORMAL; + } + image = quickpanel_setting_icon_image_new(view, icon_path); + quickpanel_setting_icon_content_set(view, image); + quickpanel_setting_icon_text_set(view, BUTTON_LABEL, state); +} + +static void _status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + int ret = 0; + bt_adapter_state_e adapter_state = BT_ADAPTER_DISABLED; + retif(module == NULL, , "Invalid parameter!"); + + ret = bt_adapter_get_state(&adapter_state); + retif(ret != BT_ERROR_NONE, , "bt_adapter_get_state failed"); + + if (adapter_state == BT_ADAPTER_ENABLED) { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_ON); + } else { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_OFF); + } + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + quickpanel_setting_module_icon_view_update(module, + quickpanel_setting_module_icon_state_get(module), + FLAG_VALUE_VOID); +} + +static void _mouse_clicked_cb(void *data, + Evas_Object *obj, const char *emission, const char *source) +{ + int ret; + int is_on = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + if (quickpanel_setting_module_is_icon_clickable(module) == 0) { + return; + } + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + ret = bt_adapter_disable(); + retif(ret != BT_ERROR_NONE, , "failed to disable BT adapter"); + + is_on = 0; + } else { + ret = bt_adapter_enable(); + retif(ret != BT_ERROR_NONE, , "failed to enable BT adapter"); + + is_on = 1; + } + + if (is_on == 1) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); + } else { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_OFF); + } + quickpanel_setting_module_icon_timer_add(module); +} + +static void _bluetooth_status_changed_cb(int result, + bt_adapter_state_e adapter_state, + void *user_data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)user_data; + retif(module == NULL, , "Invalid parameter!"); + + INFO("bluetooth state : %d", adapter_state); + quickpanel_setting_module_icon_timer_del(module); + + if (result != BT_ERROR_NONE) { + ERR("BT adapter operation is failed"); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + return; + } + + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static int _register_module_event_handler(void *data) +{ + int ret = 0; + + ret = bt_initialize(); + msgif(ret != BT_ERROR_NONE, "bt_initialize failed"); + + ret = bt_adapter_set_state_changed_cb(_bluetooth_status_changed_cb, data); + msgif(ret != BT_ERROR_NONE, "bt_adapter_set_state_changed_cb failed"); + + return QP_OK; +} + +static int _unregister_module_event_handler(void *data) +{ + int ret = 0; + + ret = bt_adapter_unset_state_changed_cb(); + msgif(ret != BT_ERROR_NONE, "bt_adapter_unset_state_changed_cb failed"); + + ret = bt_deinitialize(); + msgif(ret != BT_ERROR_NONE, "bt_deinitialize failed"); + + return QP_OK; +} + +/**************************************************************************** + * + * Quickpanel Item functions + * + ****************************************************************************/ +static int _init(void *data) +{ + int ret = QP_OK; + + ret = _register_module_event_handler(data); + + return ret; +} + +static int _fini(void *data) +{ + int ret = QP_OK; + + ret = _unregister_module_event_handler(data); + + return ret; +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +QP_Module_Setting bluetooth = { + .name = "bluetooth", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = _icon_get, + .label_get = _label_get, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = _long_press_cb, + .handler_press = _mouse_clicked_cb, +}; diff --git a/daemon/settings/modules/flightmode.c b/daemon/settings/modules/flightmode.c new file mode 100644 index 0000000..e878fd2 --- /dev/null +++ b/daemon/settings/modules/flightmode.c @@ -0,0 +1,424 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#include <syspopup_caller.h> +#include <tapi_common.h> +#include <ITapiSim.h> +#include <ITapiModem.h> +#include <TapiUtility.h> +#include <system_settings.h> +#include <bundle_internal.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" + + +#define BUTTON_LABEL _("IDS_ST_BUTTON2_FLIGHT_NMODE") +#define BUTTON_ICON_NORMAL "quick_icon_flightmode.png" +#define BUTTON_ICON_HIGHLIGHT NULL +#define BUTTON_ICON_DIM NULL +#define PACKAGE_SETTING_MENU "setting-flightmode-efl" +#define SYSPOPUP_NAME "mode-syspopup" + +static Eina_Bool fly_icon_is_locked = EINA_FALSE; +static Ecore_Timer *timer = NULL; + +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static const char *_icon_get(qp_setting_icon_image_type type) +{ + if (type == QP_SETTING_ICON_NORMAL) { + return BUTTON_ICON_NORMAL; + } else if (type == QP_SETTING_ICON_HIGHLIGHT) { + return BUTTON_ICON_HIGHLIGHT; + } else if (type == QP_SETTING_ICON_DIM) { +#ifdef BUTTON_ICON_DIM + return BUTTON_ICON_DIM; +#endif + } + + return NULL; +} + +static Eina_Bool _unlock_fly_icon(void *data) +{ + fly_icon_is_locked = EINA_FALSE; + ecore_timer_del(timer); + timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static void _long_press_cb(void *data) +{ +#ifdef PACKAGE_SETTING_MENU + if (fly_icon_is_locked == EINA_TRUE) { + LOGD("Fly icon is locked"); + return; + } + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, NULL); +#endif +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + Evas_Object *image = NULL; + const char *icon_path = NULL; + + quickpanel_setting_icon_state_set(view, state); + + if (state == ICON_VIEW_STATE_ON) { +#ifdef BUTTON_ICON_HIGHLIGHT + icon_path = BUTTON_ICON_HIGHLIGHT; +#endif + } else if (state == ICON_VIEW_STATE_DIM) { +#ifdef BUTTON_ICON_DIM + icon_path = BUTTON_ICON_DIM; +#endif + } else { + icon_path = BUTTON_ICON_NORMAL; + } + + if (icon_path == NULL) { + icon_path = BUTTON_ICON_NORMAL; + } + image = quickpanel_setting_icon_image_new(view, icon_path); + quickpanel_setting_icon_content_set(view, image); + quickpanel_setting_icon_text_set(view, BUTTON_LABEL, state); +} + +static void _status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + LOGD(""); + int ret = 0; + int status = 0; + retif(module == NULL, , "Invalid parameter!"); + +#ifdef HAVE_X + ret = system_settings_get_value_bool(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE, &status); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "fail to get VCONFKEY_TELEPHONY_FLIGHT_MODE:%d", ret); +#endif + + if (status == 1) { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_ON); + } else { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_OFF); + } + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + quickpanel_setting_module_icon_view_update(module, + quickpanel_setting_module_icon_state_get(module), + FLAG_VALUE_VOID); +} + +static void _tapi_flight_mode_cb(TapiHandle *handle, int result, void *data, void *user_data) +{ + ERR("flight mode result:%d", result); + _status_update(user_data, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static int _tapi_flight_mode_set(int on, void *data) +{ + LOGD(""); + int ret = QP_OK; + int ret_t = TAPI_API_SUCCESS; + TapiHandle *tapi_handle = NULL; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, QP_FAIL, "Invalid parameter!"); + + tapi_handle = tel_init(NULL); + retif(tapi_handle == NULL, QP_FAIL, "failed to initialized tapi handler"); + + if (on == 1) { + ret_t = tel_set_flight_mode(tapi_handle, + TAPI_POWER_FLIGHT_MODE_ENTER, _tapi_flight_mode_cb, data); + if (ret_t != TAPI_API_SUCCESS) { + ret = QP_FAIL; + ERR("tel_set_flight_mode enter error:%d", ret_t); + } + } else { + ret_t = tel_set_flight_mode(tapi_handle, + TAPI_POWER_FLIGHT_MODE_LEAVE, _tapi_flight_mode_cb, data); + if (ret_t != TAPI_API_SUCCESS) { + ret = QP_FAIL; + ERR("tel_set_flight_mode leave error:%d", ret_t); + } + } + + if ((ret_t = tel_deinit(tapi_handle)) != TAPI_API_SUCCESS) { + ERR("failed to deinitialized tapi handler:%d", ret_t); + } + + return ret; +} + +static void _turn_on(int is_on) +{ + LOGD(""); + bundle *b = NULL; + b = bundle_create(); + if (b != NULL) { + if (is_on) { + bundle_add(b, "_MODE_SYSTEM_POPUP_TYPE_", "MODE_SYSTEM_FLIGHTMODE_ON"); + } else { + bundle_add(b, "_MODE_SYSTEM_POPUP_TYPE_", "MODE_SYSTEM_FLIGHTMODE_OFF"); + } + syspopup_launch(SYSPOPUP_NAME, b); + bundle_free(b); + } else { + ERR("failed to create a bundle"); + } + + timer = ecore_timer_add(1.0, _unlock_fly_icon, NULL); +} + +static void _mouse_clicked_cb(void *data, + Evas_Object *obj, const char *emission, const char *source) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + LOGD(""); + retif(module == NULL, , "Invalid parameter!"); + + if (fly_icon_is_locked == EINA_TRUE) { + LOGD("Fly icon is locked"); + return; + } + + if (quickpanel_setting_module_is_icon_clickable(module) == 0) { + LOGD("Fly icon is not clickable"); + return; + } + + fly_icon_is_locked = EINA_TRUE; + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_OFF) { + _turn_on(1); + } else { + _turn_on(0); + } +} + +static void _tapi_flight_mode_vconf_cb(keynode_t *node, void *data) +{ + _status_update(data, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static int _register_module_event_handler(void *data) +{ + int ret = 0; + +#ifdef HAVE_X + ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE, _tapi_flight_mode_vconf_cb, data); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to notify key(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE) : %d", ret); +#endif + + return QP_OK; +} + +static int _unregister_module_event_handler(void *data) +{ + int ret = 0; + +#ifdef HAVE_X + ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to ignore key(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE) : %d", ret); +#endif + + return QP_OK; +} + +/**************************************************************************** + * + * Quickpanel Item functions + * + ****************************************************************************/ + +static int _init(void *data) +{ + int ret = QP_OK; + + ret = _register_module_event_handler(data); + + return ret; +} + +static int _fini(void *data) +{ + int ret = QP_OK; + + ret = _unregister_module_event_handler(data); + + return ret; +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _reset_icon(QP_Module_Setting *module) +{ + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_VALUE_VOID); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static void _handler_on(void *data) +{ + int ret = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_OFF) { + ret = _tapi_flight_mode_set(1, module); + + if (ret == QP_OK) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("op failed:%d", ret); + } + } else { + ERR("the button is already turned on"); + _reset_icon(module); + } +} + +static void _handler_off(void *data) +{ + int ret = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + ret = _tapi_flight_mode_set(0, module); + + if (ret == QP_OK) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("op failed:%d", ret); + } + } else { + ERR("the button is already turned off"); + _reset_icon(module); + } +} + +static void _handler_progress_on(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_VALUE_VOID); +} + +static void _handler_progress_off(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + _reset_icon(module); +} + +static int _handler_ipc(const char *command, void *data) +{ + int i = 0; + retif(data == NULL, EINA_FALSE, "item data is NULL"); + retif(command == NULL, EINA_FALSE, "command is NULL"); + + static Setting_Activity_Handler __table_handler[] = { + { + .command = "on", + .handler = _handler_on, + }, + { + .command = "off", + .handler = _handler_off, + }, + { + .command = "progress_on", + .handler = _handler_progress_on, + }, + { + .command = "progress_off", + .handler = _handler_progress_off, + }, + { + .command = NULL, + .handler = NULL, + }, + }; + + for (i = 0; __table_handler[i].command; i++) { + if (strcmp(__table_handler[i].command, command)) { + continue; + } + + if (__table_handler[i].handler != NULL) { + DBG("process:%s", command); + __table_handler[i].handler(data); + } + break; + } + + return EINA_TRUE; +} + +QP_Module_Setting flightmode = { + .name = "flightmode", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = _icon_get, + .label_get = _label_get, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = _long_press_cb, + .handler_ipc = _handler_ipc, + .handler_press = _mouse_clicked_cb, +}; diff --git a/daemon/settings/modules/gps.c b/daemon/settings/modules/gps.c new file mode 100644 index 0000000..c964cd0 --- /dev/null +++ b/daemon/settings/modules/gps.c @@ -0,0 +1,372 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#include <syspopup_caller.h> +#include <app_control.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" + +#define BUTTON_LABEL _("IDS_QP_BUTTON2_LOCATION_ABB") +#define BUTTON_ICON_NORMAL "quick_icon_location.png" +#define BUTTON_ICON_HIGHLIGHT NULL +#define BUTTON_ICON_DIM NULL +#define PACKAGE_SETTING_MENU "org.tizen.setting-location" +#define OPERATION_SETTING_MENU "http://tizen.org/appcontrol/operation/configure/location" +#define PACKAGE_SYSPOPUP "gps-syspopup" + +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static const char *_icon_get(qp_setting_icon_image_type type) +{ + if (type == QP_SETTING_ICON_NORMAL) { + return BUTTON_ICON_NORMAL; + } else if (type == QP_SETTING_ICON_HIGHLIGHT) { + return BUTTON_ICON_HIGHLIGHT; + } else if (type == QP_SETTING_ICON_DIM) { +#ifdef BUTTON_ICON_DIM + return BUTTON_ICON_DIM; +#endif + } + + return NULL; +} + +static void _long_press_cb(void *data) +{ +#ifdef PACKAGE_SETTING_MENU + // Because operation is not DEFAULT, this function can not be called. Too many changes to add operation param. + // quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, NULL); + + app_control_h service; + int ret = 0; + + ret = app_control_create(&service); + if (ret != 0) { + ERR("Failed to create app control"); + return; + } + + app_control_set_app_id(service, PACKAGE_SETTING_MENU); + app_control_set_operation(service, OPERATION_SETTING_MENU); + + ret = app_control_send_launch_request(service, NULL, NULL); + if (ret != 0) { + ERR("Failed to launch[%d]", ret); + } + + app_control_destroy(service); + +#endif +} + +static void _syspopup_launch(int is_on) +{ + syspopup_launch(PACKAGE_SYSPOPUP, NULL); +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + Evas_Object *image = NULL; + const char *icon_path = NULL; + + quickpanel_setting_icon_state_set(view, state); + + if (state == ICON_VIEW_STATE_ON) { +#ifdef BUTTON_ICON_HIGHLIGHT + icon_path = BUTTON_ICON_HIGHLIGHT; +#endif + } else if (state == ICON_VIEW_STATE_DIM) { +#ifdef BUTTON_ICON_DIM + icon_path = BUTTON_ICON_DIM; +#endif + } else { + icon_path = BUTTON_ICON_NORMAL; + } + + if (icon_path == NULL) { + icon_path = BUTTON_ICON_NORMAL; + } + image = quickpanel_setting_icon_image_new(view, icon_path); + quickpanel_setting_icon_content_set(view, image); + quickpanel_setting_icon_text_set(view, BUTTON_LABEL, state); +} + +static void _status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + int ret = 0; + int status = 0; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + +#ifdef HAVE_X + ret = vconf_get_int(VCONFKEY_LOCATION_USE_MY_LOCATION, &status); + msgif(ret != 0, "fail to get VCONFKEY_LOCATION_USE_MY_LOCATION:%d", ret); +#endif + + if (status == 1) { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_ON); + } else { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_OFF); + } + + quickpanel_setting_module_icon_view_update(module, + quickpanel_setting_module_icon_state_get(module), + FLAG_VALUE_VOID); +} + +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + int ret = 0; + int enable = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + if (quickpanel_setting_module_is_icon_clickable(module) == 0) { + return; + } + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_OFF) { + _syspopup_launch(quickpanel_setting_module_icon_state_get(module)); + } else { + // Use my location off +#ifdef HAVE_X + ret = vconf_get_int(VCONFKEY_LOCATION_USE_MY_LOCATION, &enable); +#endif + if (ret == 0) { + if (enable == 1) { +#ifdef HAVE_X + vconf_set_int(VCONFKEY_LOCATION_USE_MY_LOCATION, 0); +#endif + } + } else { + ERR("Failed to get Use my location[%d]", ret); + } + // GPS off + ret = vconf_get_int(VCONFKEY_LOCATION_ENABLED, &enable); + if (ret == 0) { + if (enable == 1) { + vconf_set_int(VCONFKEY_LOCATION_ENABLED, 0); + } + } else { + ERR("Failed to get GPS[%d]", ret); + } + // Wireless networks off + ret = vconf_get_int(VCONFKEY_LOCATION_NETWORK_ENABLED, &enable); + if (ret == 0) { + if (enable == 1) { + vconf_set_int(VCONFKEY_LOCATION_NETWORK_ENABLED, 0); + } + } else { + ERR("Failed to get GPS[%d]", ret); + } + } +} + +static void _gps_vconf_cb(keynode_t *node, + void *data) +{ + _status_update(data, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static int _register_module_event_handler(void *data) +{ + int ret = 0; + +#ifdef HAVE_X + ret = vconf_notify_key_changed(VCONFKEY_LOCATION_USE_MY_LOCATION, _gps_vconf_cb, data); + msgif(ret != 0, "failed to notify key(VCONFKEY_LOCATION_USE_MY_LOCATION) : %d", ret); +#endif + return QP_OK; +} + +static int _unregister_module_event_handler(void *data) +{ + int ret = 0; +#ifdef HAVE_X + ret = vconf_ignore_key_changed(VCONFKEY_LOCATION_USE_MY_LOCATION, _gps_vconf_cb); + msgif(ret != 0, "failed to ignore key(VCONFKEY_LOCATION_USE_MY_LOCATION) : %d", ret); +#endif + return QP_OK; +} + +/**************************************************************************** + * + * Quickpanel Item functions + * + ****************************************************************************/ +static int _init(void *data) +{ + int ret = QP_OK; + + ret = _register_module_event_handler(data); + + return ret; +} + +static int _fini(void *data) +{ + int ret = QP_OK; + + ret = _unregister_module_event_handler(data); + + return ret; +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _reset_icon(QP_Module_Setting *module) +{ + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_VALUE_VOID); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static void _handler_on(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_OFF) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("the button is already turned on"); + _reset_icon(module); + } +} + +static void _handler_off(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("the button is already turned off"); + _reset_icon(module); + } +} + +static void _handler_progress_on(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_VALUE_VOID); +} + +static void _handler_progress_off(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + _reset_icon(module); +} + +static int _handler_ipc(const char *command, void *data) +{ + int i = 0; + retif(data == NULL, EINA_FALSE, "item data is NULL"); + retif(command == NULL, EINA_FALSE, "command is NULL"); + + static Setting_Activity_Handler __table_handler[] = { + { + .command = "on", + .handler = _handler_on, + }, + { + .command = "off", + .handler = _handler_off, + }, + { + .command = "progress_on", + .handler = _handler_progress_on, + }, + { + .command = "progress_off", + .handler = _handler_progress_off, + }, + { + .command = NULL, + .handler = NULL, + }, + }; + + for (i = 0; __table_handler[i].command; i++) { + if (strcasecmp(__table_handler[i].command, command)) { + continue; + } + + if (__table_handler[i].handler != NULL) { + DBG("process:%s", command); + __table_handler[i].handler(data); + } + break; + } + + return EINA_TRUE; +} + +QP_Module_Setting gps = { + .name = "gps", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = _icon_get, + .label_get = _label_get, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = _long_press_cb, + .handler_ipc = _handler_ipc, + .handler_press = _mouse_clicked_cb, +}; diff --git a/daemon/settings/modules/mobile_data.c b/daemon/settings/modules/mobile_data.c new file mode 100644 index 0000000..3c41fff --- /dev/null +++ b/daemon/settings/modules/mobile_data.c @@ -0,0 +1,493 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#include <syspopup_caller.h> +#include <system_settings.h> +#include <bundle_internal.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" + + +#define BUTTON_LABEL _("IDS_ST_BUTTON2_MOBILE_NDATA") +#define BUTTON_ICON_NORMAL "quick_icon_mobile_data.png" +#define BUTTON_ICON_HIGHLIGHT NULL +#define BUTTON_ICON_DIM NULL +#define PACKAGE_SETTING_MENU "setting-network-efl" +#define SYSPOPUP_NAME "mode-syspopup" + +#ifndef VCONFKEY_SETAPPL_MOBILE_DATA_ON_REMINDER +#define VCONFKEY_SETAPPL_MOBILE_DATA_ON_REMINDER "db/setting/network/mobile_data_on_reminder" +#endif +#ifndef VCONFKEY_SETAPPL_MOBILE_DATA_OFF_REMINDER +#define VCONFKEY_SETAPPL_MOBILE_DATA_OFF_REMINDER "db/setting/network/mobile_data_off_reminder" +#endif + + + +static int _is_simcard_inserted(void); +static int _is_in_flightmode(void); +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); + + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static const char *_icon_get(qp_setting_icon_image_type type) +{ + if (type == QP_SETTING_ICON_NORMAL) { + return BUTTON_ICON_NORMAL; + } else if (type == QP_SETTING_ICON_HIGHLIGHT) { + return BUTTON_ICON_HIGHLIGHT; + } else if (type == QP_SETTING_ICON_DIM) { +#ifdef BUTTON_ICON_DIM + return BUTTON_ICON_DIM; +#endif + } + + return NULL; +} + +static void _long_press_cb(void *data) +{ +#ifdef PACKAGE_SETTING_MENU + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + + if (_is_in_flightmode() == 1) { + quickpanel_setting_create_timeout_popup(ad->win, _("IDS_SCP_BODY_UNABLE_TO_CONNECT_TO_MOBILE_NETWORKS_WHILE_FLIGHT_MODE_IS_ENABLED_CONNECT_TO_A_WI_FI_NETWORK_INSTEAD_OR_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN")); + return; + } + + if (_is_simcard_inserted() == 0) { + quickpanel_setting_create_timeout_popup(ad->win, _("IDS_ST_BODY_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES")); + return; + } + + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, NULL); +#endif +} + +static int _need_display_popup(int is_on) +{ + int ret = -1, status = 0; + + if (is_on == 1) { + ret = vconf_get_bool(VCONFKEY_SETAPPL_MOBILE_DATA_ON_REMINDER, + &status); + msgif(ret != 0, "failed to get VCONFKEY_SETAPPL_MOBILE_DATA_ON_REMINDER %d %d", ret, is_on); + if (ret == 0 && status == 1) { + return 1; + } + } else { + ret = vconf_get_bool(VCONFKEY_SETAPPL_MOBILE_DATA_OFF_REMINDER, + &status); + msgif(ret != 0, "failed to get VCONFKEY_SETAPPL_MOBILE_DATA_OFF_REMINDER %d %d", ret, is_on); + if (ret == 0 && status == 1) { + return 1; + } + } + + return 0; +} + +static void _turn_on(int is_on) +{ + int ret = 0; + + if (is_on) { + ret = system_settings_set_value_bool(SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED, 1); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to set SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED %d %d", ret, is_on); + } else { + ret = system_settings_set_value_bool(SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED, 0); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE,"failed to set SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED: %d %d", ret, is_on); + } +} + +static void _turn_on_with_popup(int is_on) +{ + bundle *b = NULL; + b = bundle_create(); + if (b != NULL) { + if (is_on) { + bundle_add(b, "_MODE_SYSTEM_POPUP_TYPE_", "MODE_SYSTEM_MOBILEDATA_ON"); + } else { + bundle_add(b, "_MODE_SYSTEM_POPUP_TYPE_", "MODE_SYSTEM_MOBILEDATA_OFF"); + } + syspopup_launch(SYSPOPUP_NAME, b); + bundle_free(b); + } else { + ERR("failed to create a bundle"); + } +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + Evas_Object *image = NULL; + const char *icon_path = NULL; + + quickpanel_setting_icon_state_set(view, state); + + if (state == ICON_VIEW_STATE_ON) { +#ifdef BUTTON_ICON_HIGHLIGHT + icon_path = BUTTON_ICON_HIGHLIGHT; +#endif + } else if (state == ICON_VIEW_STATE_DIM) { +#ifdef BUTTON_ICON_DIM + icon_path = BUTTON_ICON_DIM; +#endif + } else { + icon_path = BUTTON_ICON_NORMAL; + } + + if (icon_path == NULL) { + icon_path = BUTTON_ICON_NORMAL; + } + image = quickpanel_setting_icon_image_new(view, icon_path); + quickpanel_setting_icon_content_set(view, image); + quickpanel_setting_icon_text_set(view, BUTTON_LABEL, state); +} + + +static int _is_simcard_inserted(void) +{ + int ret_1 = QP_FAIL; + int ret_2 = QP_FAIL; + int sim_status_1 = VCONFKEY_TELEPHONY_SIM_UNKNOWN; + int sim_status_2 = VCONFKEY_TELEPHONY_SIM_UNKNOWN; + + ret_1 = vconf_get_int(VCONFKEY_TELEPHONY_SIM_SLOT, &sim_status_1); + msgif(ret_1 != QP_OK, "failed to get the VCONFKEY_TELEPHONY_SIM_SLOT : %d", ret_1); + + ret_2 = vconf_get_int(VCONFKEY_TELEPHONY_SIM_SLOT2, &sim_status_2); + msgif(ret_2 != QP_OK, "failed to get the VCONFKEY_TELEPHONY_SIM_SLOT2 : %d", ret_2); + + INFO("MOBILE DATA SIM CARD: %d %d", sim_status_1, sim_status_2); + + if ((ret_1 == QP_OK && sim_status_1 == VCONFKEY_TELEPHONY_SIM_INSERTED) || + (ret_2 == QP_OK && sim_status_2 == VCONFKEY_TELEPHONY_SIM_INSERTED)) { + return 1; + } + + return 0; +} + +static int _is_in_flightmode(void) +{ + int ret = QP_FAIL, flight_mode = 0; + +#ifdef HAVE_X + ret = system_settings_get_value_bool(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE, &flight_mode); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to get the SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE : %d", ret); +#endif + if (ret == QP_OK && flight_mode == 1) { + return 1; + } + + return 0; +} + +static void _status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + int ret = 0; + int status = 0; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_uic_is_emul() == 1) { + status = 1; + } else if (_is_in_flightmode() == 1) { + status = 0; + } else if (_is_simcard_inserted() == 0) { + status = 0; + } else { + ret = system_settings_get_value_bool(SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED, &status); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "fail to get SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED:%d", ret); + } + + if (status == 1) { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_ON); + } else { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_OFF); + } + + quickpanel_setting_module_icon_view_update(module, + quickpanel_setting_module_icon_state_get(module), + FLAG_VALUE_VOID); +} + +static void _mouse_clicked_cb(void *data, + Evas_Object *obj, const char *emission, const char *source) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + if (quickpanel_setting_module_is_icon_clickable(module) == 0) { + return; + } + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid data."); + + if (quickpanel_uic_is_emul() == 1) { + quickpanel_setting_create_timeout_popup(ad->win, _NOT_LOCALIZED("Unsupported.")); + return; + } + + if (_is_in_flightmode() == 1) { + quickpanel_setting_create_timeout_popup(ad->win, _("IDS_SCP_BODY_UNABLE_TO_CONNECT_TO_MOBILE_NETWORKS_WHILE_FLIGHT_MODE_IS_ENABLED_CONNECT_TO_A_WI_FI_NETWORK_INSTEAD_OR_DISABLE_FLIGHT_MODE_AND_TRY_AGAIN")); + return; + } + + if (_is_simcard_inserted() == 0) { + quickpanel_setting_create_timeout_popup(ad->win, _("IDS_ST_BODY_INSERT_SIM_CARD_TO_ACCESS_NETWORK_SERVICES")); + return; + } + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + /* disable */ + if (_need_display_popup(0) == 1) { + _turn_on_with_popup(0); + } else { + _turn_on(0); + } + } else { + /* enable */ + if (_need_display_popup(1) == 1) { + _turn_on_with_popup(1); + } else { + _turn_on(1); + } + } +} + +static void _mobiledata_vconf_cb(keynode_t *node, + void *data) +{ + _status_update(data, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static int _register_module_event_handler(void *data) +{ + int ret = 0; + + ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED, _mobiledata_vconf_cb, data); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to notify key(%s) : %d", SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED, ret); + + ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT,_mobiledata_vconf_cb, data); + msgif(ret != 0, "failed to notify key(%s) : %d", VCONFKEY_TELEPHONY_SIM_SLOT, ret); +#ifdef HAVE_X + ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE, _mobiledata_vconf_cb, data); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to notify key(%s) : %d", SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE, ret); +#endif + return QP_OK; +} + +static int _unregister_module_event_handler(void *data) +{ + int ret = 0; + + ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to ignore key(%s) : %d", SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED, ret); + + ret = vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SIM_SLOT,_mobiledata_vconf_cb); + msgif(ret != 0, "failed to ignore key(%s) : %d", VCONFKEY_TELEPHONY_SIM_SLOT, ret); + +#ifdef HAVE_X + ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to ignore key(%s) : %d", SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE, ret); +#endif + return QP_OK; +} + +/**************************************************************************** + * + * Quickpanel Item functions + * + ****************************************************************************/ + +static int _init(void *data) +{ + int ret = QP_OK; + + ret = _register_module_event_handler(data); + + return ret; +} + +static int _fini(void *data) +{ + int ret = QP_OK; + + ret = _unregister_module_event_handler(data); + + return ret; +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _reset_icon(QP_Module_Setting *module) +{ + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_VALUE_VOID); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static void _handler_on(void *data) +{ + int ret = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_OFF) { + ret = system_settings_set_value_bool(SYSTEM_SETTINGS_KEY_3G_DATA_NETWORK_ENABLED, 1); + + if (ret == SYSTEM_SETTINGS_ERROR_NONE) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("op failed:%d", ret); + } + } else { + ERR("the button is already turned on"); + _reset_icon(module); + } +} + +static void _handler_off(void *data) +{ + int ret = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + ret = vconf_set_bool(VCONFKEY_3G_ENABLE, 0); + + if (ret == 0) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("op failed:%d", ret); + } + } else { + ERR("the button is already turned off"); + _reset_icon(module); + } +} + +static void _handler_progress_on(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_VALUE_VOID); +} + +static void _handler_progress_off(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + _reset_icon(module); +} + +static int _handler_ipc(const char *command, void *data) +{ + int i = 0; + retif(data == NULL, EINA_FALSE, "item data is NULL"); + retif(command == NULL, EINA_FALSE, "command is NULL"); + + static Setting_Activity_Handler __table_handler[] = { + { + .command = "on", + .handler = _handler_on, + }, + { + .command = "off", + .handler = _handler_off, + }, + { + .command = "progress_on", + .handler = _handler_progress_on, + }, + { + .command = "progress_off", + .handler = _handler_progress_off, + }, + { + .command = NULL, + .handler = NULL, + }, + }; + + for (i = 0; __table_handler[i].command; i++) { + if (strcasecmp(__table_handler[i].command, command)) { + continue; + } + + if (__table_handler[i].handler != NULL) { + DBG("process:%s", command); + __table_handler[i].handler(data); + } + break; + } + + return EINA_TRUE; +} + +QP_Module_Setting mobile_data = { + .name = "mobile_data", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = _icon_get, + .label_get = _label_get, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = _long_press_cb, + .handler_ipc = _handler_ipc, + .handler_press = _mouse_clicked_cb, +}; diff --git a/daemon/settings/modules/rotate-lock.c b/daemon/settings/modules/rotate-lock.c new file mode 100644 index 0000000..4293d15 --- /dev/null +++ b/daemon/settings/modules/rotate-lock.c @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#include <system_settings.h> +#include <bundle_internal.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" + + +#define BUTTON_LABEL _("IDS_ST_BUTTON2_AUTO_NROTATE") +#define BUTTON_ICON_NORMAL "quick_icon_auto_rotate.png" +#define BUTTON_ICON_HIGHLIGHT NULL +#define BUTTON_ICON_DIM NULL +#define PACKAGE_SETTING_MENU "setting-display-efl" + +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static const char *_icon_get(qp_setting_icon_image_type type) +{ + if (type == QP_SETTING_ICON_NORMAL) { + return BUTTON_ICON_NORMAL; + } else if (type == QP_SETTING_ICON_HIGHLIGHT) { + return BUTTON_ICON_HIGHLIGHT; + } else if (type == QP_SETTING_ICON_DIM) { +#ifdef BUTTON_ICON_DIM + return BUTTON_ICON_DIM; +#endif + } + + return NULL; +} + +static void _long_press_cb(void *data) +{ +#ifdef PACKAGE_SETTING_MENU + bundle *kb = bundle_create(); + if (kb != NULL) { + bundle_add(kb, "viewtype", "main"); + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, kb); + bundle_free(kb); + } else { + ERR("failed to create the bunlde"); + } +#endif +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + Evas_Object *image = NULL; + const char *icon_path = NULL; + + quickpanel_setting_icon_state_set(view, state); + + if (state == ICON_VIEW_STATE_ON) { +#ifdef BUTTON_ICON_HIGHLIGHT + icon_path = BUTTON_ICON_HIGHLIGHT; +#endif + } else if (state == ICON_VIEW_STATE_DIM) { +#ifdef BUTTON_ICON_DIM + icon_path = BUTTON_ICON_DIM; +#endif + } else { + icon_path = BUTTON_ICON_NORMAL; + } + + if (icon_path == NULL) { + icon_path = BUTTON_ICON_NORMAL; + } + image = quickpanel_setting_icon_image_new(view, icon_path); + quickpanel_setting_icon_content_set(view, image); + quickpanel_setting_icon_text_set(view, BUTTON_LABEL, state); +} + +static void _status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + int ret = 0; + int status = false; + retif(module == NULL, , "Invalid parameter!"); + +#ifdef HAVE_X + ret = system_settings_get_value_bool(SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO, &status); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE , "failed to notify key SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO : %d", ret); +#endif + + if (status == true) { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_ON); + } else { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_OFF); + } + + quickpanel_setting_module_icon_view_update(module, quickpanel_setting_module_icon_state_get(module),FLAG_VALUE_VOID); +} + +static void _mouse_clicked_cb(void *data, + Evas_Object *obj, const char *emission, const char *source) +{ + int ret = 0; + bool status = false; + +#ifdef HAVE_X + ret = system_settings_get_value_bool(SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO, &status); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to notify key SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO : %d", ret); + + ret = system_settings_set_value_bool(SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO, !status ); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to notify key SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO : %d", ret); +#endif + +} + +static void _autorotation_vconf_cb(keynode_t *node, + void *data) +{ + _status_update(data, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static int _register_module_event_handler(void *data) +{ + int ret = 0; + +#ifdef HAVE_X + ret = system_settings_set_changed_cb(SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO,_autorotation_vconf_cb, data); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to notify key(SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO) : %d", ret); +#endif + + return QP_OK; +} + +static int _unregister_module_event_handler(void *data) +{ + int ret = 0; +#ifdef HAVE_X + ret = system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO); + msgif(ret != SYSTEM_SETTINGS_ERROR_NONE, "failed to ignore key(SYSTEM_SETTINGS_KEY_DISPLAY_SCREEN_ROTATION_AUTO) : %d", ret); +#endif + + return QP_OK; +} + +/**************************************************************************** + * + * Quickpanel Item functions + * + ****************************************************************************/ +static int _init(void *data) +{ + int ret = QP_OK; + + ret = _register_module_event_handler(data); + + return ret; +} + +static int _fini(void *data) +{ + int ret = QP_OK; + + ret = _unregister_module_event_handler(data); + + return ret; +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +QP_Module_Setting rotate = { + .name = "rotate", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = _icon_get, + .label_get = _label_get, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = _long_press_cb, + .handler_press = _mouse_clicked_cb, +}; diff --git a/daemon/settings/modules/sound-profile.c b/daemon/settings/modules/sound-profile.c new file mode 100644 index 0000000..bc7b30a --- /dev/null +++ b/daemon/settings/modules/sound-profile.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include <vconf.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" +#include "sound_manager.h" + +#define BUTTON_LABEL _("IDS_QP_BUTTON2_SOUND_ABB") +#define BUTTON_ICON_SND_NORMAL "quick_icon_sn_vf.png" +#define BUTTON_ICON_SND_HIGHLIGHT "quick_icon_sn_vf.png" +#define BUTTON_ICON_MUTE_NORMAL "quick_icon_sf_vf.png" +#define BUTTON_ICON_VIB_HIGHLIGHT "quick_icon_sf_vn.png" +#define PACKAGE_SETTING_MENU "setting-profile-efl" +#define SAM_LOG_FEATURE_SOUND "ST0C" + +static int g_check_press = 0; + +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static const char *_icon_get(qp_setting_icon_image_type type) +{ + if (type == QP_SETTING_ICON_NORMAL) { + return BUTTON_ICON_SND_NORMAL; + } else if (type == QP_SETTING_ICON_HIGHLIGHT) { + return BUTTON_ICON_SND_HIGHLIGHT; + } else if (type == QP_SETTING_ICON_DIM) { +#ifdef BUTTON_ICON_DIM + return BUTTON_ICON_DIM; +#endif + } + + return NULL; +} + +static void _long_press_cb(void *data) +{ +#ifdef PACKAGE_SETTING_MENU + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, NULL); +#endif +} + +static void _play_snd_job_cb(void *data) +{ +#ifdef HAVE_X + if (feedback_play_type(FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_SOUND_ON) != FEEDBACK_ERROR_NONE) { + ERR("failed to play a sound"); + } +#endif +} + +static void _play_vib_job_cb(void *data) +{ +#ifdef HAVE_X + if (feedback_play_type(FEEDBACK_TYPE_VIBRATION, FEEDBACK_PATTERN_VIBRATION_ON) != FEEDBACK_ERROR_NONE) { + ERR("failed to play a vibration"); + } +#endif +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + int icon_state; + int ret = -1; + int sound_status = 1; + int vibration_status = 1; + Evas_Object *image = NULL; + const char *text = NULL; + const char *img_path = NULL; + + retif(view == NULL, , "Invalid parameter!"); + + /* Get sound status */ + ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, &sound_status); + /* If fail, set sound on status */ + if (ret != 0) { + ERR("failed get VCONFKEY_SETAPPL_SOUND_STATUS_BOOL:%d", ret); + sound_status = 1; + } + + /* Get vibration status */ + ret = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, + &vibration_status); + /* If fail, set vibration on status */ + if (ret != 0) { + ERR("failed get VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL:%d", ret); + vibration_status = 1; + } + + INFO("sound : %d, vibration : %d", sound_status, vibration_status); + + if (sound_status == 1 && vibration_status == 1) { + /* Sound & vibration profile */ + icon_state = ICON_VIEW_STATE_ON; + text = _("IDS_QP_BUTTON2_SOUND_ABB"); + img_path = BUTTON_ICON_SND_HIGHLIGHT; + } else if (sound_status == 0 && vibration_status == 1) { + /* Vibration profile */ + icon_state = ICON_VIEW_STATE_ON; + text = _("IDS_QP_BUTTON2_VIBRATE"); + img_path = BUTTON_ICON_VIB_HIGHLIGHT; + } else if (sound_status == 1 && vibration_status == 0) { + /* Sound profile */ + icon_state = ICON_VIEW_STATE_ON; + text = _("IDS_QP_BUTTON2_SOUND_ABB"); + img_path = BUTTON_ICON_SND_HIGHLIGHT; + } else { + /* Mute profile */ + icon_state = ICON_VIEW_STATE_OFF; + text = _("IDS_QP_BUTTON2_MUTE_ABB"); + img_path = BUTTON_ICON_MUTE_NORMAL; + } + + quickpanel_setting_icon_state_set(view, icon_state); + quickpanel_setting_icon_text_set(view, text, icon_state); + image = quickpanel_setting_icon_image_new(view, img_path); + quickpanel_setting_icon_content_set(view, image); + + if (quickpanel_uic_is_opened() && g_check_press) { + g_check_press = 0; + if (sound_status == 1 && vibration_status == 0) { + ecore_job_add(_play_snd_job_cb, NULL); + } else if (sound_status == 0 && vibration_status == 1) { + ecore_job_add(_play_vib_job_cb, NULL); + } + } +} + +static void _status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update(module, + quickpanel_setting_module_icon_state_get(module), + FLAG_VALUE_VOID); +} + +static void _mouse_clicked_cb(void *data, + Evas_Object *obj, const char *emission, const char *source) +{ + int ret = 0; + int sound_status = 1; + int vibration_status = 1; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + /* Get sound profile */ + ret = vconf_get_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, + &sound_status); + retif(ret != 0, , "failed to get sound status(%d)", ret); + + ret = vconf_get_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, + &vibration_status); + retif(ret != 0, ,"failed to get vibration status(%d)", ret); + + INFO("sound : %d, vibration : %d", sound_status, vibration_status); + + g_check_press = 1; + + if (sound_status == 1 && vibration_status == 1) { + ret = vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, 0); + msgif(ret != 0, "failed set VCONFKEY_SETAPPL_SOUND_STATUS_BOOL:%d", ret); + } else if (sound_status == 1 && vibration_status == 0) { + ret = vconf_set_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, 1); + msgif(ret != 0, "failed set VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL:%d", ret); + ret = vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, 0); + msgif(ret != 0, "failed set VCONFKEY_SETAPPL_SOUND_STATUS_BOOL:%d", ret); + } else if (sound_status == 0 && vibration_status == 1) { + ret = vconf_set_bool(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, 0); + msgif(ret != 0, "failed set VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL:%d", ret); + /*insert log for mute mode on state */ + //_log_manager_insert_log(SAM_LOG_FEATURE_SOUND, "MUTE", NULL); + } else if (sound_status == 0 && vibration_status == 0) { + ret = vconf_set_bool(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, 1); + msgif(ret != 0, "failed set VCONFKEY_SETAPPL_SOUND_STATUS_BOOL:%d", ret); + } +} + +static void _soundprofile_vconf_cb(keynode_t *node, + void *data) +{ + _status_update(data, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static int _register_module_event_handler(void *data) +{ + int ret = 0; + + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, + _soundprofile_vconf_cb, data); + msgif(ret != 0, + "failed to vconf_notify_key_changed [%s] -[%d]", + VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, ret); + + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, + _soundprofile_vconf_cb, data); + msgif(ret != 0, + "failed to vconf_notify_key_changed [%s] -[%d]", + VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, ret); + + return QP_OK; +} + +static int _unregister_module_event_handler(void *data) +{ + int ret = 0; + + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, + _soundprofile_vconf_cb); + msgif(ret != 0, + "failed to vconf_ignore_key_changed [%s] -[%d]", + VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, ret); + + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_VIBRATION_STATUS_BOOL, + _soundprofile_vconf_cb); + msgif(ret != 0, + "failed to vconf_ignore_key_changed [%s] -[%d]", + VCONFKEY_SETAPPL_SOUND_STATUS_BOOL, ret); + + return QP_OK; +} + +/**************************************************************************** + * + * Quickpanel Item functions + * + ****************************************************************************/ +static int _init(void *data) +{ + int ret = QP_OK; + + ret = _register_module_event_handler(data); + + return ret; +} + +static int _fini(void *data) +{ + int ret = QP_OK; + + ret = _unregister_module_event_handler(data); + + return ret; +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + + +QP_Module_Setting sound = { + .name = "sound", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = _icon_get, + .label_get = _label_get, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = _long_press_cb, + .handler_press = _mouse_clicked_cb, + .is_disable_feedback = 1, +}; diff --git a/daemon/settings/modules/tethering.c b/daemon/settings/modules/tethering.c new file mode 100644 index 0000000..45a77ae --- /dev/null +++ b/daemon/settings/modules/tethering.c @@ -0,0 +1,461 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <vconf.h> +#include <tethering.h> +#include <glib.h> +#include <bundle_internal.h> +#include <net_connection.h> +#include <syspopup_caller.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" + +#define MOBILE_AP_SYSPOPUP_NAME "mobileap-syspopup" +#define BUTTON_LABEL _("IDS_ST_BUTTON2_WI_FI_NTETHERING") +#define BUTTON_ICON_NORMAL "quick_icon_wifi_tethering.png" +#define BUTTON_ICON_HIGHLIGHT NULL +#define BUTTON_ICON_DIM NULL +#define PACKAGE_SETTING_MENU "setting-mobileap-efl" + +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static const char *_icon_get(qp_setting_icon_image_type type) +{ + if (type == QP_SETTING_ICON_NORMAL) { + return BUTTON_ICON_NORMAL; + } else if (type == QP_SETTING_ICON_HIGHLIGHT) { + return BUTTON_ICON_HIGHLIGHT; + } else if (type == QP_SETTING_ICON_DIM) { +#ifdef BUTTON_ICON_DIM + return BUTTON_ICON_DIM; +#endif + } + + return NULL; +} + +static void _long_press_cb(void *data) +{ +#ifdef PACKAGE_SETTING_MENU + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, NULL); +#endif +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + Evas_Object *image = NULL; + const char *icon_path = NULL; + + quickpanel_setting_icon_state_set(view, state); + + if (state == ICON_VIEW_STATE_ON) { +#ifdef BUTTON_ICON_HIGHLIGHT + icon_path = BUTTON_ICON_HIGHLIGHT; +#endif + } else if (state == ICON_VIEW_STATE_DIM) { +#ifdef BUTTON_ICON_DIM + icon_path = BUTTON_ICON_DIM; +#endif + } else { + icon_path = BUTTON_ICON_NORMAL; + } + + if (icon_path == NULL) { + icon_path = BUTTON_ICON_NORMAL; + } + image = quickpanel_setting_icon_image_new(view, icon_path); + quickpanel_setting_icon_content_set(view, image); + quickpanel_setting_icon_text_set(view, BUTTON_LABEL, state); +} + +static void _status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + retif(module == NULL, , "Invalid parameter!"); + retif(module->loader->extra_handler_1 == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_timer_del(module); + + if (tethering_is_enabled(module->loader->extra_handler_1, TETHERING_TYPE_WIFI)) { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_ON); + } else { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_OFF); + } + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + quickpanel_setting_module_icon_view_update(module, + quickpanel_setting_module_icon_state_get(module), + FLAG_VALUE_VOID); +} + +static void _tethering_enabled_cb(tethering_error_e result, tethering_type_e type, bool is_requested, void *user_data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)user_data; + retif(module == NULL, , "Invalid parameter!"); + + retif(type != TETHERING_TYPE_WIFI, , "Another type of tethering is enabled - type:%d", type); + + if (result != TETHERING_ERROR_NONE) { + if (is_requested == TRUE) { + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + } + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + + WARN("Failed to enable tethering - error:%x", result); + return; + } + + if (is_requested == TRUE) { + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + } + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + WARN("WIFI tethering is enabled - type:%d", type); + + return; +} + +static void _tethering_disabled_cb(tethering_error_e result, tethering_type_e type, tethering_disabled_cause_e cause, void *user_data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)user_data; + retif(module == NULL, , "Invalid parameter!"); + retif(module->loader == NULL, , "Invalid parameter!"); + + if (result != TETHERING_ERROR_NONE && type == TETHERING_TYPE_WIFI) { + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + + WARN("Failed to disable tethering - error:%x", result); + return; + } + + if (type == TETHERING_TYPE_WIFI) { + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + WARN("WIFI tethering is disabled - cause:%x", cause); + } else { + WARN("Ignored tethering event - result:%x type:%d cause:%x", result, type, cause); + } + + return; +} + +static int _tethering_enabled_set(void *data, Eina_Bool state) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + + if (module == NULL || module->loader->extra_handler_1 == NULL) { + ERR("invalid parameter\n"); + return QP_FAIL; + } + + if (state) { + if (tethering_is_enabled(NULL, TETHERING_TYPE_WIFI) == FALSE) { + // for checking pre-conditions, popup will be provided by mobileap-syspopup + bundle *b = bundle_create(); + if (!b) { + ERR("Failed to create bundle."); + return QP_FAIL; + } + bundle_add(b, "msg", "Confirm WiFi tethering on"); + syspopup_launch(MOBILE_AP_SYSPOPUP_NAME, b); + bundle_free(b); + } + } else { + if (tethering_is_enabled(NULL, TETHERING_TYPE_WIFI) == TRUE) { + bundle *b = bundle_create(); + if (!b) { + ERR("Failed to create bundle."); + return QP_FAIL; + } + bundle_add(b, "msg", "Confirm WiFi tethering off"); + syspopup_launch(MOBILE_AP_SYSPOPUP_NAME, b); + bundle_free(b); + } + } + + return QP_OK; +} + +static void _mouse_clicked_cb(void *data, + Evas_Object *obj, const char *emission, const char *source) +{ + int ret = 0; + int is_on = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + if (quickpanel_setting_module_is_icon_clickable(module) == 0) { + DBG("Icon is not clickable"); + return; + } + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_OFF) { + ret = _tethering_enabled_set(module, EINA_TRUE); + if (ret != QP_OK) { + ERR("Failed to enable tethering"); + return; + } + is_on = 1; + } else { + ret = _tethering_enabled_set(module, EINA_FALSE); + if (ret != QP_OK) { + ERR("Failed to disable tethering"); + return; + } + is_on = 0; + } + + if (ret == QP_OK) { + if (is_on == 1) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); + } else { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_OFF); + } + quickpanel_setting_module_icon_timer_add(module); + } + return; +} + +static int _register_module_event_handler(void *data) +{ + tethering_error_e ret = TETHERING_ERROR_NONE; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, ret, "Invalid parameter!"); + + ret = tethering_create(&(module->loader->extra_handler_1)); + msgif(ret != TETHERING_ERROR_NONE, "fail to create tethering handler"); + + ret = tethering_set_enabled_cb(module->loader->extra_handler_1, + TETHERING_TYPE_WIFI, _tethering_enabled_cb, data); + msgif(ret != TETHERING_ERROR_NONE, "fail to register enabled callback"); + + ret = tethering_set_disabled_cb(module->loader->extra_handler_1, + TETHERING_TYPE_WIFI, _tethering_disabled_cb, data); + msgif(ret != TETHERING_ERROR_NONE, "fail to register disabled callback"); + + return QP_OK; +} + +static int _unregister_module_event_handler(void *data) +{ + tethering_error_e ret =TETHERING_ERROR_NONE; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, ret, "Invalid parameter!"); + + if (module->loader->extra_handler_1 != NULL) { + + tethering_destroy(module->loader->extra_handler_1); + module->loader->extra_handler_1 = NULL; + } + + return QP_OK; +} + +/**************************************************************************** + * + * Quickpanel Item functions + * + ****************************************************************************/ +static int _init(void *data) +{ + int ret = QP_OK; + + ret = _register_module_event_handler(data); + + return ret; +} + +static int _fini(void *data) +{ + int ret = QP_OK; + + ret = _unregister_module_event_handler(data); + + return ret; +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _reset_icon(QP_Module_Setting *module) +{ + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_VALUE_VOID); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static void _handler_on(void *data) +{ + tethering_error_e ret = TETHERING_ERROR_NONE; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_OFF) { + ret = _tethering_enabled_set(module, EINA_TRUE); + + if (ret == QP_OK) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("op failed:%d", ret); + } + } else { + ERR("the button is already turned on"); + _reset_icon(module); + } +} + +static void _handler_off(void *data) +{ + int ret = TETHERING_ERROR_NONE; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + ret = _tethering_enabled_set(module, EINA_FALSE); + if (ret == QP_OK) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("op failed:%d", ret); + } + } else { + ERR("the button is already turned off"); + _reset_icon(module); + } +} + +static void _handler_progress_on(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); +} + +static void _handler_progress_off(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + _reset_icon(module); +} + +static void _handler_progress_reset(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + _reset_icon(module); +} + +static int _handler_ipc(const char *command, void *data) +{ + int i = 0; + retif(data == NULL, EINA_FALSE, "item data is NULL"); + retif(command == NULL, EINA_FALSE, "command is NULL"); + + static Setting_Activity_Handler __table_handler[] = { + { + .command = "on", + .handler = _handler_on, + }, + { + .command = "off", + .handler = _handler_off, + }, + { + .command = "progress_on", + .handler = _handler_progress_on, + }, + { + .command = "progress_off", + .handler = _handler_progress_off, + }, + { + .command = "progress_reset", + .handler = _handler_progress_reset, + }, + { + .command = NULL, + .handler = NULL, + }, + }; + + for (i = 0; __table_handler[i].command; i++) { + if (strcasecmp(__table_handler[i].command, command)) { + continue; + } + + if (__table_handler[i].handler != NULL) { + DBG("process:%s", command); + __table_handler[i].handler(data); + } + break; + } + + return EINA_TRUE; +} + +QP_Module_Setting tethering = { + .name = "wifi_hotspot", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = _icon_get, + .label_get = _label_get, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = _long_press_cb, + .handler_ipc = _handler_ipc, + .handler_press = _mouse_clicked_cb, +}; diff --git a/daemon/settings/modules/ultra_power_saving.c b/daemon/settings/modules/ultra_power_saving.c new file mode 100644 index 0000000..c7ee5c8 --- /dev/null +++ b/daemon/settings/modules/ultra_power_saving.c @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <app.h> +#include <vconf.h> +#include <syspopup_caller.h> +#include <bundle_internal.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" + + +#define BUTTON_LABEL _("IDS_QP_BUTTON2_U_POWER_NSAVING_ABB") +#define BUTTON_ICON_NORMAL "quick_icon_ultra_power_saving.png" +#define BUTTON_ICON_HIGHLIGHT NULL +#define BUTTON_ICON_DIM NULL +#define PACKAGE_SETTING_MENU "setting-powersaving-efl" +#define SYSPOPUP_NAME "mode-syspopup" + +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static const char *_icon_get(qp_setting_icon_image_type type) +{ + if (type == QP_SETTING_ICON_NORMAL) { + return BUTTON_ICON_NORMAL; + } else if (type == QP_SETTING_ICON_HIGHLIGHT) { + return BUTTON_ICON_HIGHLIGHT; + } else if (type == QP_SETTING_ICON_DIM) { +#ifdef BUTTON_ICON_DIM + return BUTTON_ICON_DIM; +#endif + } + + return NULL; +} + +static void _long_press_cb(void *data) +{ +#ifdef PACKAGE_SETTING_MENU + bundle *kb = bundle_create(); + if (kb != NULL) { + bundle_add(kb, "power_saving", "upsm"); + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, kb); + bundle_free(kb); + } else { + ERR("failed to create the bunlde"); + } +#endif +} + +#if 0 +static int _is_need_to_show_disclaimer(void) { + int ret = 0, status = 0; + + ret = vconf_get_bool(VCONFKEY_SETAPPL_UPSM_DO_NOT_SHOW_DISCLAIMER, &status); + if (ret == 0 && status) { + return 0; + } + + return 1; +} +#endif + +static void _turn_on(int is_on) +{ + bundle *b = NULL; + + //if(_is_need_to_show_disclaimer() == 1) + { + b = bundle_create(); + if (b != NULL) { + bundle_add(b, "viewtype", "disc"); + + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, b); + bundle_free(b); + } + } + /*else + { + b = bundle_create(); + if (b != NULL) { + if (is_on) { + bundle_add(b, "_MODE_SYSTEM_POPUP_TYPE_", "POPUP_EMERGENCY_PSMODE_SETTING"); + } else { + bundle_add(b, "_MODE_SYSTEM_POPUP_TYPE_", "POPUP_NORMAL_PSMODE"); + } + syspopup_launch(SYSPOPUP_NAME, b); + bundle_free(b); + } else { + ERR("failed to create a bundle"); + } + }*/ +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + Evas_Object *image = NULL; + const char *icon_path = NULL; + + quickpanel_setting_icon_state_set(view, state); + + if (state == ICON_VIEW_STATE_ON) { +#ifdef BUTTON_ICON_HIGHLIGHT + icon_path = BUTTON_ICON_HIGHLIGHT; +#endif + } else if (state == ICON_VIEW_STATE_DIM) { +#ifdef BUTTON_ICON_DIM + icon_path = BUTTON_ICON_DIM; +#endif + } else { + icon_path = BUTTON_ICON_NORMAL; + } + + if (icon_path == NULL) { + icon_path = BUTTON_ICON_NORMAL; + } + image = quickpanel_setting_icon_image_new(view, icon_path); + quickpanel_setting_icon_content_set(view, image); + quickpanel_setting_icon_text_set(view, BUTTON_LABEL, state); +} + +static void _status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + int ret = 0; + int status = 0; + retif(module == NULL, , "Invalid parameter!"); + + ret = vconf_get_int(VCONFKEY_SETAPPL_PSMODE, &status); + msgif(ret != 0, "fail to get VCONFKEY_SETAPPL_PSMODE:%d", ret); + + if (status == SETTING_PSMODE_EMERGENCY) { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_ON); + } else { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_OFF); + } + + quickpanel_setting_module_icon_view_update(module, + quickpanel_setting_module_icon_state_get(module), + FLAG_VALUE_VOID); +} + +static void _mouse_clicked_cb(void *data, + Evas_Object *obj, const char *emission, const char *source) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + _turn_on(0); + } else { + _turn_on(1); + } +} + +static void _powersave_vconf_cb(keynode_t *node, void *data) +{ + _status_update(data, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static int _register_module_event_handler(void *data) +{ + int ret = 0; + + ret = vconf_notify_key_changed(VCONFKEY_SETAPPL_PSMODE, + _powersave_vconf_cb, data); + msgif(ret != 0, "failed to notify key(VCONFKEY_SETAPPL_PSMODE) : %d", ret); + + return QP_OK; +} + +static int _unregister_module_event_handler(void *data) +{ + int ret = 0; + + ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_PSMODE, + _powersave_vconf_cb); + msgif(ret != 0, "failed to ignore key(VCONFKEY_SETAPPL_PSMODE) : %d", ret); + + return QP_OK; +} + +/**************************************************************************** + * + * Quickpanel Item functions + * + ****************************************************************************/ +static int _init(void *data) +{ + int ret = QP_OK; + + ret = _register_module_event_handler(data); + + return ret; +} + +static int _fini(void *data) +{ + int ret = QP_OK; + + ret = _unregister_module_event_handler(data); + + return ret; +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +QP_Module_Setting u_power_saving = { + .name = "u_power_saving", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = _icon_get, + .label_get = _label_get, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = _long_press_cb, + .handler_press = _mouse_clicked_cb, +}; diff --git a/daemon/settings/modules/wifi.c b/daemon/settings/modules/wifi.c new file mode 100644 index 0000000..5f65151 --- /dev/null +++ b/daemon/settings/modules/wifi.c @@ -0,0 +1,579 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <app.h> +#include <tethering.h> + +#include <wifi.h> +#include <vconf.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" + +#define E_DATA_POPUP_MODULE_ITEM "mobule_item" +#define BUTTON_LABEL _("IDS_ST_BUTTON2_WI_FI_ABB") +#define BUTTON_ICON_NORMAL "quick_icon_wifi.png" +#define BUTTON_ICON_HIGHLIGHT NULL +#define BUTTON_ICON_DIM NULL +#define PACKAGE_SETTING_MENU "wifi-efl-ug-lite" +#define PACKAGE_SETTING_MENU_PTN "wifi-efl-ug" // for redwood partner + +static int _wifi_on(void *data, const char *popup_txt); +static int _wifi_off(void); +static int _wifi_is_on(bool *is_on); +static void _wifi_state_changed_cb(wifi_device_state_e state, void *user_data); +static void _mouse_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _reset_icon(QP_Module_Setting *module); + +static const char *_label_get(void) +{ + return BUTTON_LABEL; +} + +static const char *_icon_get(qp_setting_icon_image_type type) +{ + if (type == QP_SETTING_ICON_NORMAL) { + return BUTTON_ICON_NORMAL; + } else if (type == QP_SETTING_ICON_HIGHLIGHT) { + return BUTTON_ICON_HIGHLIGHT; + } else if (type == QP_SETTING_ICON_DIM) { +#ifdef BUTTON_ICON_DIM + return BUTTON_ICON_DIM; +#endif + } + + return NULL; +} + +static void _long_press_cb(void *data) +{ +#ifdef PACKAGE_SETTING_MENU + if (quickpanel_common_ui_is_package_exist(PACKAGE_SETTING_MENU)) { + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU, NULL); + } else { + DBG("No package[%s] try[%s]", PACKAGE_SETTING_MENU, PACKAGE_SETTING_MENU_PTN); + quickpanel_setting_icon_handler_longpress(PACKAGE_SETTING_MENU_PTN, NULL); + } +#endif +} + +static void _view_update(Evas_Object *view, int state, int flag_extra_1, int flag_extra_2) +{ + Evas_Object *image = NULL; + const char *icon_path = NULL; + + quickpanel_setting_icon_state_set(view, state); + + if (state == ICON_VIEW_STATE_ON) { +#ifdef BUTTON_ICON_HIGHLIGHT + icon_path = BUTTON_ICON_HIGHLIGHT; +#endif + } else if (state == ICON_VIEW_STATE_DIM) { +#ifdef BUTTON_ICON_DIM + icon_path = BUTTON_ICON_DIM; +#endif + } else { + icon_path = BUTTON_ICON_NORMAL; + } + + if (icon_path == NULL) { + icon_path = BUTTON_ICON_NORMAL; + } + image = quickpanel_setting_icon_image_new(view, icon_path); + quickpanel_setting_icon_content_set(view, image); + quickpanel_setting_icon_text_set(view, BUTTON_LABEL, state); +} + +static void _status_update(QP_Module_Setting *module, int wifi_status, int flag_extra_2) +{ + ERR(""); + int ret = -1; + bool is_on = 0; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_timer_del(module); + + if (wifi_status == FLAG_VALUE_VOID) { + ret = _wifi_is_on(&is_on); + } else { + ret = 0; + if (wifi_status == WIFI_DEVICE_STATE_ACTIVATED) { + is_on = true; + } else { + is_on = false; + } + } + + if (ret == 0 && is_on == true) { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_ON); + } else { + quickpanel_setting_module_icon_state_set(module, ICON_VIEW_STATE_OFF); + } + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + quickpanel_setting_module_icon_view_update(module, + quickpanel_setting_module_icon_state_get(module), + FLAG_VALUE_VOID); +} + +static void _mouse_clicked_cb(void *data, + Evas_Object *obj, const char *emission, const char *source) +{ + int ret = 0; + int is_on = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + if (quickpanel_setting_module_is_icon_clickable(module) == 0) { + return; + } + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + is_on = FLAG_TURN_OFF; + ret = _wifi_off(); + } else { + is_on = FLAG_TURN_ON; + ret = _wifi_on(module, + _("IDS_WIFI_POP_BOTH_WI_FI_AND_MOBILE_AP_CANNOT_BE_ACTIVATED_AT_THE_SAME_TIME_DEACTIVATE_MOBILE_AP_Q")); + } + + if (ret != 0) { + ERR("wifi op failed:%d", ret); + return; + } + + if (is_on == 1) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); + } else { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_OFF); + } + quickpanel_setting_module_icon_timer_add(module); +} + +static int _register_module_event_handler(void *data) +{ + int ret = 0; + + ret = wifi_initialize(); + msgif(ret < 0, "[ERR] wifi_initialize()"); + + ret = wifi_set_device_state_changed_cb(_wifi_state_changed_cb, data); + if (ret != 0) { + ERR("wifi cb register failed:%d", ret); + } else { + ERR("wifi op register done:%d", ret); + } + + return QP_OK; +} + +static int _unregister_module_event_handler(void *data) +{ + int ret = 0; + + ret = wifi_unset_device_state_changed_cb(); + if (ret != 0) { + ERR("wifi cb unregister failed:%d", ret); + } else { + ERR("wifi op unregister done:%d", ret); + } + + ret = wifi_deinitialize(); + msgif(ret != WIFI_ERROR_NONE, "Fail to deactivate Wi-Fi device"); + + return QP_OK; +} + +/**************************************************************************** + * + * Quickpanel Item functions + * + ****************************************************************************/ + +static int _init(void *data) +{ + int ret = QP_OK; + + ret = _register_module_event_handler(data); + + return ret; +} + +static int _fini(void *data) +{ + int ret = QP_OK; + + ret = _unregister_module_event_handler(data); + + return ret; +} + +static void _lang_changed(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _refresh(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_icon_view_update_text(module); +} + +static void _wifi_activated_cb(wifi_error_e result, void *user_data) +{ + if (result == WIFI_ERROR_NONE) { + /* succeed to turn on Wi-Fi */ + } else { + /* failed to turn on Wi-Fi */ + } +} + +static void _wifi_deactivated_cb(wifi_error_e result, void* user_data) +{ + if (result == WIFI_ERROR_NONE) { + /* succeed to turn off Wi-Fi */ + } else { + /* failed to turn off Wi-Fi */ + } +} + +static void _tethering_disabled_cb(tethering_error_e error, tethering_type_e type, tethering_disabled_cause_e code, void *data) +{ + int ret; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + tethering_h th = (tethering_h)(module->loader->extra_handler_1); + retif(th == NULL, , "th is NULL"); + tethering_destroy(th); + module->loader->extra_handler_1 = NULL; + + if (error != TETHERING_ERROR_NONE) { + /* failed to disable wifi tethering */ + return; + } + + ret = wifi_activate_with_wifi_picker_tested(_wifi_activated_cb, NULL); + if (ret != WIFI_ERROR_NONE) { + ERR("Fail to activate Wi-Fi device [%d]\n", ret); + return; + } +} + +static bool _tethering_disable(tethering_type_e type, void *data) +{ + tethering_h th = NULL; + tethering_error_e ret = TETHERING_ERROR_NONE; + QP_Module_Setting *module = (QP_Module_Setting *)data; + + retif(module == NULL, false, "Invalid parameter!"); + + if (quickpanel_setting_module_is_icon_clickable(module) == 0) { + return false; + } + + /* disable wifi tethering */ + ret = tethering_create(&th); + if (ret != TETHERING_ERROR_NONE) { + /* failed to create tethering handle */ + return false; + } + + ret = tethering_set_disabled_cb(th, type, + _tethering_disabled_cb, module); + if (ret != TETHERING_ERROR_NONE) { + /* failed to set disabled callback */ + tethering_destroy(th); + return false; + } + + module->loader->extra_handler_1 = th; + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); + quickpanel_setting_module_icon_timer_add(module); + + ret = tethering_disable(th, type); + if (ret != TETHERING_ERROR_NONE) { + ERR("fail to tethering_disable()"); + return false; + } + + return true; +} + +static void _tethering_wifi_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data) +{ + QP_Module_Setting *module = (QP_Module_Setting *) user_data; + char *resp_type = NULL; + + DBG("Result[%d]", result); + if (result == APP_CONTROL_RESULT_SUCCEEDED && reply) { + app_control_get_extra_data(reply, "_SYSPOPUP_RESP_", &resp_type); + if (resp_type) { + DBG("Response[%s]", resp_type); + if (!strcmp("RESP_TETHERING_TYPE_WIFI_OFF", resp_type)) { + _tethering_disable(TETHERING_TYPE_WIFI, user_data); + } else if (!strcmp("RESP_TETHERING_TYPE_WIFI_AP_OFF", resp_type)) { + _tethering_disable(TETHERING_TYPE_RESERVED, user_data); + } + + free(resp_type); + } + } + + _reset_icon(module); +} + +static void _tethering_off_popup(Evas_Object *win, void *data, int type, const char *popup_txt) +{ + app_control_h service = NULL; + int ret = APP_CONTROL_ERROR_NONE; + + ret = app_control_create(&service); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("Failed to create app_control[%d]", ret); + return; + } + + app_control_add_extra_data(service, "_SYSPOPUP_TITLE_", "mobileap"); + if (type == TETHERING_TYPE_WIFI) { + app_control_add_extra_data(service, "_SYSPOPUP_CONTENT_", "TETHERING_TYPE_WIFI"); + } else { + app_control_add_extra_data(service, "_SYSPOPUP_CONTENT_", "TETHERING_TYPE_WIFI_AP"); + } + app_control_add_extra_data(service, "_SYSPOPUP_TYPE_", "popup_user_resp"); + app_control_add_extra_data(service, "_AP_NAME_", "none"); + + app_control_set_app_id(service, "net.netpopup"); + + ret = app_control_send_launch_request(service, _tethering_wifi_reply_cb, data); + if (ret != APP_CONTROL_ERROR_NONE) { + ERR("Failed to send launch request[%d]", ret); + } + + app_control_destroy(service); +} + +static int _wifi_on(void *data, const char *popup_txt) +{ + int ret = -1; + struct appdata *ad = quickpanel_get_app_data(); + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(ad == NULL, ret, "Invalid parameter!"); + retif(module == NULL, ret, "Invalid parameter!"); + + /* Check wifi tethering status */ + if (tethering_is_enabled(NULL, TETHERING_TYPE_WIFI) == TRUE) { + _tethering_off_popup(ad->win, data, TETHERING_TYPE_WIFI, popup_txt); + return -1; + } else if (tethering_is_enabled(NULL, TETHERING_TYPE_RESERVED) == TRUE) { + _tethering_off_popup(ad->win, data, TETHERING_TYPE_RESERVED, popup_txt); + return -1; + } + + ret = wifi_activate_with_wifi_picker_tested(_wifi_activated_cb, NULL); + if (ret != WIFI_ERROR_NONE) { + ERR("Fail to activate Wi-Fi device [%d]\n", ret); + return -1; + } + + return 0; +} + +static int _wifi_off(void) +{ + int ret; + + ret = wifi_deactivate(_wifi_deactivated_cb, NULL); + if (ret != WIFI_ERROR_NONE) { + ERR("Fail to activate Wi-Fi device [%d]\n", ret); + return -1; + } + + return 0; +} + +static int _wifi_is_on(bool *is_on) +{ + int ret; + + ret = wifi_is_activated(is_on); + if (ret != WIFI_ERROR_NONE) { + ERR("Fail to get Wi-Fi device status [%d]\n", ret); + return -1; + } + + return 0; +} + +/* + Set Wi-Fi status changed callback + - needs to update your Wi-Fi status. +*/ +static void _wifi_state_changed_cb(wifi_device_state_e state, void *user_data) +{ + ERR("state:%d", state); + + if (state == WIFI_DEVICE_STATE_ACTIVATED) { + /* Wi-Fi is activated(On) - change your Wi-Fi status */ + _status_update(user_data, state, FLAG_VALUE_VOID); + } else if (state == WIFI_DEVICE_STATE_DEACTIVATED) { + /* Wi-Fi is deactivated(Off) - change your Wi-Fi status */ + _status_update(user_data, state, FLAG_VALUE_VOID); + } else { + /* Ignore */ + } +} + +static void _reset_icon(QP_Module_Setting *module) { + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_VALUE_VOID); + _status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); +} + +static void _handler_on(void *data) +{ + int ret = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_OFF) { + ret = _wifi_on(module, _("IDS_WIFI_POP_BOTH_WI_FI_AND_MOBILE_AP_CANNOT_BE_ACTIVATED_AT_THE_SAME_TIME_DEACTIVATE_MOBILE_AP_Q")); + + if (ret == 0) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_ON); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("op failed:%d", ret); + } + } else { + ERR("the button is already turned on"); + _reset_icon(module); + } +} + +static void _handler_off(void *data) +{ + int ret = 0; + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_DISABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_del(module); + + if (quickpanel_setting_module_icon_state_get(module) == ICON_VIEW_STATE_ON) { + ret = _wifi_off(); + + if (ret == 0) { + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_TURN_OFF); + quickpanel_setting_module_icon_timer_add(module); + } else { + ERR("op failed:%d", ret); + } + } else { + ERR("the button is already turned off"); + _reset_icon(module); + } +} + +static void _handler_progress_on(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + quickpanel_setting_module_progress_mode_set(module, FLAG_ENABLE, FLAG_VALUE_VOID); +} + +static void _handler_progress_off(void *data) +{ + QP_Module_Setting *module = (QP_Module_Setting *)data; + retif(module == NULL, , "Invalid parameter!"); + + _reset_icon(module); +} + +static int _handler_ipc(const char *command, void *data) +{ + int i = 0; + retif(data == NULL, EINA_FALSE, "item data is NULL"); + retif(command == NULL, EINA_FALSE, "command is NULL"); + + static Setting_Activity_Handler __table_handler[] = { + { + .command = "on", + .handler = _handler_on, + }, + { + .command = "off", + .handler = _handler_off, + }, + { + .command = "progress_on", + .handler = _handler_progress_on, + }, + { + .command = "progress_off", + .handler = _handler_progress_off, + }, + { + .command = NULL, + .handler = NULL, + }, + }; + + for (i = 0; __table_handler[i].command; i++) { + if (strcasecmp(__table_handler[i].command, command)) { + continue; + } + + if (__table_handler[i].handler != NULL) { + DBG("process:%s", command); + __table_handler[i].handler(data); + } + break; + } + + return EINA_TRUE; +} + +QP_Module_Setting wifi = { + .name = "wifi", + .init = _init, + .fini = _fini, + .lang_changed = _lang_changed, + .refresh = _refresh, + .icon_get = _icon_get, + .label_get = _label_get, + .view_update = _view_update, + .status_update = _status_update, + .handler_longpress = _long_press_cb, + .handler_ipc = _handler_ipc, + .handler_press = _mouse_clicked_cb, +}; diff --git a/daemon/settings/setting_module_api.c b/daemon/settings/setting_module_api.c new file mode 100644 index 0000000..b7f1cfe --- /dev/null +++ b/daemon/settings/setting_module_api.c @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include "common.h" +#include "quickpanel_def.h" +#include "quickpanel-ui.h" +#include "settings.h" +#include "setting_utils.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif +#include "setting_module_api.h" + +#define E_DATA_CONTAINER_TYPE "container_type" + +static qp_setting_icon_container_type +_icon_container_type_get(Evas_Object *view) +{ + retif(view == NULL, QP_SETTING_ICON_CONTAINER_NONE, "invalid parameter"); + + return (qp_setting_icon_container_type)evas_object_data_get(view, E_DATA_CONTAINER_TYPE); +} + +static void _icon_view_add(QP_Module_Setting *module, Evas_Object *view + ,qp_setting_icon_container_type container_type) +{ + retif(module == NULL, , "invalid parameter"); + retif(view == NULL, , "invalid parameter"); + + if (eina_list_data_find(module->view_list, view) == NULL) { + evas_object_data_set(view, E_DATA_CONTAINER_TYPE, (void *)container_type); + module->view_list = eina_list_append(module->view_list, view); + } +} + +static void _icon_view_del(QP_Module_Setting *module, Evas_Object *view) +{ + retif(module == NULL, , "invalid parameter"); + retif(view == NULL, , "invalid parameter"); + + module->view_list = eina_list_remove(module->view_list, view); +} + +HAPI Evas_Object *quickpanel_setting_module_icon_create(QP_Module_Setting *module, Evas_Object *parent) +{ + Evas_Object *view = NULL; + retif(module == NULL, NULL, "invalid parameter"); + retif(parent == NULL, NULL, "invalid parameter"); + + view = quickpanel_setting_icon_new(parent); + retif(view == NULL, NULL, "failed to create icon"); + + if (module->label_get != NULL) { + quickpanel_setting_icon_text_set(view, module->label_get(), ICON_VIEW_STATE_OFF); + } + if (module->handler_press != NULL) { + if (module->is_disable_feedback) { + quickpanel_setting_icon_click_cb_without_feedback_add(view, module->handler_press, module); + } else { + quickpanel_setting_icon_click_cb_add(view, module->handler_press, module); + } + } + evas_object_data_set(view, E_DATA_MODULE_INFO, module); + evas_object_show(view); + + return view; +} + +HAPI QP_Module_Setting *quickpanel_setting_module_get_from_icon(Evas_Object *icon) +{ + return evas_object_data_get(icon, E_DATA_MODULE_INFO); +} + +HAPI void quickpanel_setting_module_icon_add(QP_Module_Setting *module, Evas_Object *icon, + qp_setting_icon_container_type container_type) +{ + _icon_view_add(module, icon, container_type); +} + +HAPI Evas_Object *quickpanel_setting_module_icon_get(QP_Module_Setting *module, + qp_setting_icon_container_type container_type) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *view = NULL; + retif(module == NULL, NULL, "invalid parameter"); + + if (module->view_update != NULL) { + EINA_LIST_FOREACH_SAFE(module->view_list, l, l_next, view) { + if (_icon_container_type_get(view) == container_type) { + return view; + } + } + } + + return NULL; +} + +HAPI void quickpanel_setting_module_icon_remove(QP_Module_Setting *module, Evas_Object *icon) +{ + _icon_view_del(module, icon); +} + +HAPI void quickpanel_setting_module_icon_state_set(QP_Module_Setting *module, int state) +{ + retif(module == NULL, , "invalid parameter"); + retif(module->loader == NULL, , "invalid parameter"); + + module->loader->state = state; +} + +HAPI int quickpanel_setting_module_icon_state_get(QP_Module_Setting *module) +{ + retif(module == NULL, FLAG_TURN_OFF, "invalid parameter"); + retif(module->loader == NULL, FLAG_TURN_OFF, "invalid parameter"); + + return module->loader->state; +} + +HAPI void quickpanel_setting_module_icon_view_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *view = NULL; + retif(module == NULL, , "invalid parameter"); + + int status = quickpanel_setting_module_icon_state_get(module); + + if (module->view_update != NULL) { + EINA_LIST_FOREACH_SAFE(module->view_list, l, l_next, view) { + module->view_update(view, status, flag_extra_1, flag_extra_2); + } + } +} + +HAPI void quickpanel_setting_module_icon_view_update_text(QP_Module_Setting *module) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *view = NULL; + retif(module == NULL, , "invalid parameter"); + + if (module->view_update != NULL && module->label_get != NULL) { + EINA_LIST_FOREACH_SAFE(module->view_list, l, l_next, view) { + quickpanel_setting_icon_text_set(view, module->label_get(), quickpanel_setting_module_icon_state_get(module)); + } + } +} + +HAPI void quickpanel_setting_module_icon_status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2) +{ + retif(module == NULL, , "invalid parameter"); + + if (module->status_update != NULL) { + module->status_update(module, flag_extra_1, flag_extra_2); + } +} + +HAPI int quickpanel_setting_module_is_icon_clickable(QP_Module_Setting *module) +{ + retif(module == NULL, 0, "invalid parameter"); + retif(module->loader == NULL, 0, "invalid parameter"); + + if (module->loader->timer != NULL) { + return 0; + } + if (module->loader->state_icon == STATE_ICON_BUSY) { + return 0; + } + + return 1; +} + +static Eina_Bool _timer_expire_cb(void *data) +{ + retif(data == NULL, ECORE_CALLBACK_CANCEL, "invalid parameter"); + + quickpanel_setting_module_icon_timer_del(data); + quickpanel_setting_module_icon_status_update(data, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + + return ECORE_CALLBACK_CANCEL; +} + +HAPI void quickpanel_setting_module_icon_timer_add(QP_Module_Setting *module) +{ + retif(module == NULL, , "invalid parameter"); + retif(module->loader == NULL, , "invalid parameter"); + + quickpanel_setting_module_icon_timer_del(module); + module->loader->timer = ecore_timer_add(TIMER_COUNT, _timer_expire_cb, module); +} + +HAPI void quickpanel_setting_module_icon_timer_del(QP_Module_Setting *module) +{ + retif(module == NULL, , "invalid parameter"); + retif(module->loader == NULL, , "invalid parameter"); + + if (module->loader->timer != NULL) { + ecore_timer_del(module->loader->timer); + module->loader->timer = NULL; + } +} + +#ifdef __PROGRESSBAR_ENABLED__ +static Evas_Object *_progressbar_get(Evas_Object *parent) +{ + Evas_Object *content = NULL; + + content = elm_progressbar_add(parent); + retif(!content, NULL, "fail to elm_progressbar_add"); + + elm_object_style_set(content, "quickpanel_style"); + evas_object_size_hint_weight_set(content, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_progressbar_pulse(content, EINA_TRUE); + evas_object_show(content); + + return content; +} + +static void _progressbar_set(Evas_Object *view, int is_enable, int is_request_on) +{ + Evas_Object *content = NULL; + Evas_Object *content_old = NULL; + retif(view == NULL, , "invalid parameter"); + + if (is_enable == FLAG_ENABLE) { + content_old = quickpanel_setting_icon_content_get(view); + if (content_old != NULL) { + evas_object_del(content_old); + content_old = NULL; + } + content = _progressbar_get(view); + quickpanel_setting_icon_content_set(view, content); + + quickpanel_setting_icon_state_progress_set(view); + quickpanel_setting_icon_state_set(view, ICON_VIEW_STATE_DIM); + } +} +#endif + +HAPI void quickpanel_setting_module_progress_mode_set(QP_Module_Setting *module, int is_enable, int is_request_on) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *view = NULL; + retif(module == NULL, , "invalid parameter"); + retif(module->loader == NULL, , "invalid parameter"); + + EINA_LIST_FOREACH_SAFE(module->view_list, l, l_next, view) { +#ifdef __PROGRESSBAR_ENABLED__ + _progressbar_set(view, is_enable, is_request_on); +#else + if (is_enable) { + quickpanel_setting_icon_state_progress_set(view); + } +#endif + } + + if (is_enable == FLAG_ENABLE) { + module->loader->state_icon = STATE_ICON_BUSY; + } else { + module->loader->state_icon = STATE_ICON_IDLE; + } +} + +HAPI void quickpanel_setting_module_icon_destroy(QP_Module_Setting *module, Evas_Object *icon) +{ + retif(module == NULL, , "invalid parameter"); + retif(icon == NULL, , "invalid parameter"); + + _icon_view_del(module, icon); + quickpanel_setting_icon_click_cb_del(icon, module->handler_press); + evas_object_del(icon); + icon = NULL; +} diff --git a/daemon/settings/setting_module_api.h b/daemon/settings/setting_module_api.h new file mode 100644 index 0000000..39ae152 --- /dev/null +++ b/daemon/settings/setting_module_api.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __SETTING_MODULE_API_H__ +#define __SETTING_MODULE_API_H__ + +#include <Elementary.h> +#include "settings.h" + +#define FLAG_VALUE_VOID 0xDEADDEAD + +#define FLAG_ENABLE 1 +#define FLAG_DISABLE 0 + +#define FLAG_TURN_ON 1 +#define FLAG_TURN_OFF 0 + +typedef enum _qp_setting_icon_container_type { + QP_SETTING_ICON_CONTAINER_NONE = -1, + QP_SETTING_ICON_CONTAINER_FEATURED = 0, + QP_SETTING_ICON_CONTAINER_ALL_LIST, +} qp_setting_icon_container_type; + +Evas_Object *quickpanel_setting_module_icon_create(QP_Module_Setting *module, Evas_Object *parent); +void quickpanel_setting_module_icon_add(QP_Module_Setting *module, Evas_Object *icon, qp_setting_icon_container_type container_type); +void quickpanel_setting_module_icon_remove(QP_Module_Setting *module, Evas_Object *icon); +void quickpanel_setting_module_icon_state_set(QP_Module_Setting *module, int state); +int quickpanel_setting_module_icon_state_get(QP_Module_Setting *module); +Evas_Object *quickpanel_setting_module_icon_get(QP_Module_Setting *module, + qp_setting_icon_container_type container_type); +void quickpanel_setting_module_icon_view_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2); +void quickpanel_setting_module_icon_view_update_text(QP_Module_Setting *module); +void quickpanel_setting_module_icon_status_update(QP_Module_Setting *module, int flag_extra_1, int flag_extra_2); +int quickpanel_setting_module_is_icon_clickable(QP_Module_Setting *module); +void quickpanel_setting_module_icon_timer_add(QP_Module_Setting *module); +void quickpanel_setting_module_icon_timer_del(QP_Module_Setting *module); +void quickpanel_setting_module_progress_mode_set(QP_Module_Setting *module, int is_enable, int is_request_on); +void quickpanel_setting_module_icon_destroy(QP_Module_Setting *module, Evas_Object *icon); + +QP_Module_Setting *quickpanel_setting_module_get_from_icon(Evas_Object *icon); + +#endif /* __SETTING_MODULE_API_H__ */ diff --git a/daemon/settings/setting_utils.c b/daemon/settings/setting_utils.c new file mode 100644 index 0000000..e2ca27b --- /dev/null +++ b/daemon/settings/setting_utils.c @@ -0,0 +1,632 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <glib.h> +#include <efl_assist.h> +#include <notification.h> + +#include "common.h" +#include "quickpanel_def.h" +#include "quickpanel-ui.h" +#include "setting_utils.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif + +#define DEFAULT_EDJ EDJDIR"/"PACKAGE".edj" +#define _EDJ(o) elm_layout_edje_get(o) + +#define TEXT_LEN 128 +#define QP_SETTING_INITIAL_PAGE_NUM 0 +#define DIVIDER_MAGIC 0xCAFECAFE +#define E_DATA_DIVIDER_MAGIC "divider_magic" + +static inline void __escaped_text_set(Evas_Object *obj, + const char *part, const char *text) +{ + char buf[256] = {0,}; + char *ecaped = NULL; + + if (!obj) { + return; + } + + if (!part) { + return; + } + + strncpy(buf, text, sizeof(buf) - 1); + quickpanel_common_util_char_trim(buf); + ecaped = evas_textblock_text_utf8_to_markup(NULL, buf); + + elm_object_part_text_set(obj, part, ecaped); + + if (ecaped) { + free(ecaped); + } +} + +HAPI int quickpanel_setting_icon_text_set(Evas_Object *icon, const char *text, int state) +{ + retif(icon == NULL, QP_FAIL, "invalid parameter"); + retif(text == NULL, QP_FAIL, "invalid parameter"); + + __escaped_text_set(icon, "icon.text", text); + +#ifdef QP_SCREENREADER_ENABLE + char buf[256] = {0,}; + Evas_Object *ao = NULL; + + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _NOT_LOCALIZED("Button")); + strncpy(buf, text, sizeof(buf) - 1); + quickpanel_common_util_char_replace(buf, '\n', ' '); + elm_access_info_set(ao, ELM_ACCESS_INFO, buf); + } + + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + if (state == ICON_VIEW_STATE_ON) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("On")); + } else if (state == ICON_VIEW_STATE_DIM) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Turned off")); + } else if (state == ICON_VIEW_STATE_OFF) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Off")); + } + } +#endif + + return QP_OK; +} + +HAPI void quickpanel_setting_icon_access_text_set(Evas_Object *icon, const char *text) +{ +#ifdef QP_SCREENREADER_ENABLE + char buf[256] = {0,}; + Evas_Object *ao = NULL; +#endif + + retif(icon == NULL, , "invalid parameter"); + retif(text == NULL, , "invalid parameter"); + +#ifdef QP_SCREENREADER_ENABLE + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _NOT_LOCALIZED("Button")); + strncpy(buf, text, sizeof(buf) - 1); + quickpanel_common_util_char_replace(buf, '\n', ' '); + elm_access_info_set(ao, ELM_ACCESS_INFO, buf); + } +#endif +} + +HAPI Evas_Object *quickpanel_setting_icon_content_get(Evas_Object *icon) +{ + retif(icon == NULL, NULL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, NULL, "application data is NULL"); + + return elm_object_part_content_get(icon, "icon.swallow.wvga"); +} + +HAPI int quickpanel_setting_icon_content_set(Evas_Object *icon, Evas_Object *content) +{ + retif(icon == NULL, QP_FAIL, "invalid parameter"); + retif(content == NULL, QP_FAIL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, QP_FAIL, "application data is NULL"); + + elm_object_part_content_set(icon, "icon.swallow.wvga", content); + + return QP_OK; +} + +HAPI int quickpanel_setting_icon_state_set(Evas_Object *icon, int state) +{ +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = NULL; +#endif + retif(icon == NULL, -1, "invalid parameter"); + SERR("icon:%p state:%d", icon, state); + +#ifdef QP_SCREENREADER_ENABLE + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + if (state == ICON_VIEW_STATE_ON) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("On")); + } else if (state == ICON_VIEW_STATE_DIM) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Turned off")); + } else if (state == ICON_VIEW_STATE_OFF) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Off")); + } + } +#endif + + if (state == ICON_VIEW_STATE_ON) { + elm_object_signal_emit(icon, "icon.on", "quickpanl.prog"); + } else if (state == ICON_VIEW_STATE_DIM) { + elm_object_signal_emit(icon, "icon.dim", "quickpanl.prog"); + } else { + elm_object_signal_emit(icon, "icon.off", "quickpanl.prog"); + } + + edje_object_message_signal_process(_EDJ(icon)); + + return 0; +} + +HAPI int quickpanel_setting_icon_state_progress_set(Evas_Object *icon) +{ + retif(icon == NULL, -1, "invalid parameter"); + + elm_object_signal_emit(icon, "icon.progress", "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + + return 0; +} + +HAPI Evas_Object *quickpanel_setting_icon_new(Evas_Object *parent) +{ + const char *signal = NULL; + Evas_Object *icon = NULL; + retif(parent == NULL, NULL, "invalid parameter"); + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, EINA_FALSE, "invalid data."); + + icon = elm_layout_add(parent); + retif(!icon, NULL, "fail to add layout"); + + elm_layout_file_set(icon, DEFAULT_EDJ, "quickpanel/setting_icon_wvga"); + + evas_object_size_hint_weight_set(icon, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_signal_emit(icon, "icon.off", "quickpanl.prog"); + + Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(icon); + elm_object_part_content_set(icon, "focus", focus); + + if (ad->angle == 0 || ad->angle == 180) { + signal = "icon.portrait"; + } else { + signal = "icon.landscape"; + } + + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + + return icon; +} + +HAPI Evas_Object *quickpanel_setting_icon_image_new(Evas_Object *parent, const char *img_path) +{ + Evas_Object *content = NULL; + retif(parent == NULL, NULL, "invalid parameter"); + retif(img_path == NULL, NULL, "invalid parameter"); + + content = elm_image_add(parent); + retif(content == NULL, NULL, "failed to create image"); + + if (!elm_image_file_set(content, DEFAULT_EDJ, img_path)) { + ERR("fail to set file[%s]", img_path); + evas_object_del(content); + content = NULL; + return NULL; + } + + return content; +} + +HAPI static Evas_Object *quickpanel_setting_container_get(Evas_Object *base) +{ + Evas_Object *container = NULL; + retif(base == NULL, NULL, "invalid parameter"); + + container = elm_object_part_content_get(base, QP_SETTING_BASE_PART); + + return container; +} + +HAPI Evas_Object *quickpanel_setting_scroller_get(Evas_Object *base) +{ + Evas_Object *container = NULL; + Evas_Object *scroller = NULL; + retif(base == NULL, NULL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, NULL, "application data is NULL"); + + container = quickpanel_setting_container_get(base); + + scroller = elm_object_part_content_get(container, QP_SETTING_SCROLLER_PART_WVGA); + + retif(scroller == NULL, NULL, "invalid parameter"); + + return scroller; +} + +HAPI Evas_Object *quickpanel_setting_box_get_from_scroller(Evas_Object *base) +{ + Evas_Object *scroller = NULL; + Evas_Object *box = NULL; + retif(base == NULL, NULL, "invalid parameter"); + + scroller = quickpanel_setting_scroller_get(base); + retif(scroller == NULL, NULL, "invalid parameter"); + + box = elm_object_content_get(scroller); + + return box; +} + + +HAPI Evas_Object *quickpanel_setting_box_get(Evas_Object *base) +{ + Evas_Object *container = NULL; + Evas_Object *box = NULL; + retif(base == NULL, NULL, "invalid parameter"); + + container = quickpanel_setting_container_get(base); + retif(container == NULL, NULL, "invalid parameter"); + box = elm_object_part_content_get(container, QP_SETTING_SCROLLER_PART_WVGA); + + return box; +} + + +HAPI int quickpanel_setting_container_rotation_set(Evas_Object *base, int angle) +{ + Evas_Object *container = NULL; + const char *signal = NULL; + + retif(!base, -1, "base is NULL"); + retif(angle < 0, -1, "angle is %d", angle); + + container = quickpanel_setting_container_get(base); + retif(!container, -1, "box is NULL"); + + if (angle % 180 == 0) { + signal = "portrait"; + } else { + signal = "landscape"; + } + + elm_object_signal_emit(container, signal, "background"); + edje_object_message_signal_process(_EDJ(container)); + + return 0; +} + +HAPI int quickpanel_setting_icons_rotation_set(Evas_Object *base, int angle) +{ + Evas_Object *box = NULL; + Evas_Object *icon = NULL; + Eina_List *icons = NULL; + Eina_List *l = NULL; + const char *signal = NULL; + + retif(!base, -1, "base is NULL"); + retif(angle < 0, -1, "angle is %d", angle); + + box = quickpanel_setting_box_get(base); + retif(!box, -1, "box is NULL"); + + icons = elm_box_children_get(box); + retif(!icons, -1, "icons list is NULL"); + + if (angle % 180 == 0) { + signal = "icon.portrait"; + } else { + signal = "icon.landscape"; + } + + EINA_LIST_FOREACH(icons, l, icon) { + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + } + + eina_list_free(icons); + + return 0; +} + +HAPI void quickpanel_setting_icons_emit_sig(Evas_Object *icon, const char *signal) +{ + retif(!icon, , "icon is NULL"); + retif(!signal, , "icon is NULL"); + + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); +} + +HAPI int quickpanel_setting_icons_dragging_set(Evas_Object *icon, int is_on) +{ + const char *signal = NULL; + retif(!icon, QP_FAIL, "icon is NULL"); + + if (is_on == 1) { + signal = "dragging.on"; + } else { + signal = "dragging.off"; + } + + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + + return QP_OK; +} + +HAPI int quickpanel_setting_icons_screen_mode_set(Evas_Object *icon, int screen_mode) +{ + const char *signal = NULL; + retif(!icon, QP_FAIL, "icon is NULL"); + + if (screen_mode == 0) { + signal = "icon.portrait"; + } else { + signal = "icon.landscape"; + } + + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + + return QP_OK; +} + +HAPI int quickpanel_setting_icon_pack(Evas_Object *box, Evas_Object *icon, int is_attach_divider) +{ + retif(box == NULL, QP_FAIL, "box is NULL"); + + elm_box_pack_end(box, icon); + + return QP_OK; +} + +HAPI void quickpanel_setting_icon_unpack_all(Evas_Object *box) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *node = NULL; + Eina_List *list = NULL; + retif(box == NULL, , "invalid parameter"); + + list = elm_box_children_get(box); + retif(list == NULL, , "empty list"); + + elm_box_unpack_all(box); + + EINA_LIST_FOREACH_SAFE(list, l, l_next, node) { + if (node != NULL) { + if (evas_object_data_get(node, E_DATA_DIVIDER_MAGIC) == (void *)DIVIDER_MAGIC) { + evas_object_del(node); + node = NULL; + } + } + } + + eina_list_free(list); +} + +HAPI int quickpanel_setting_scroll_page_get(void *data) +{ + int page_h = 0x99; + struct appdata *ad = NULL; + retif(data == NULL, QP_FAIL, "Invalid parameter!"); + + ad = data; + retif(!ad->ly, QP_FAIL, "layout is NULL!"); + + Evas_Object *scroller = quickpanel_setting_scroller_get(ad->ly); + elm_scroller_current_page_get(scroller, &page_h, NULL); + + return page_h; +} + +HAPI int quickpanel_setting_set_scroll_page_width(void *data) +{ + struct appdata *ad = NULL; + retif(data == NULL, QP_FAIL, "Invalid parameter!"); + + ad = data; + retif(!ad->ly, QP_FAIL, "layout is NULL!"); + + Evas_Object *scroller = quickpanel_setting_scroller_get(ad->ly); + + int w, h; +#if HAVE_X + Ecore_X_Screen *screen = ecore_x_default_screen_get(); + ecore_x_screen_size_get(screen, &w, &h); +#else + elm_win_screen_size_get(ad->win, NULL, NULL, &w, &h); +#endif + elm_scroller_page_size_set(scroller, w / QP_SETTING_NUM_PORTRAIT_ICONS, 0); + + return 0; +} + +HAPI int quickpanel_setting_start(Evas_Object *base) +{ + Evas_Object *scroller = NULL; + retif(base == NULL, QP_FAIL, "Invalid parameter!"); + + scroller = quickpanel_setting_scroller_get(base); + retif(scroller == NULL, QP_FAIL, "Invalid parameter!"); + + elm_scroller_page_bring_in(scroller, 0, 0); + + return QP_OK; +} + +HAPI int quickpanel_setting_stop(Evas_Object *base, int is_bring_in) +{ + int page = QP_SETTING_INITIAL_PAGE_NUM; + Evas_Object *scroller = NULL; + retif(base == NULL, QP_FAIL, "Invalid parameter!"); + + scroller = quickpanel_setting_scroller_get(base); + retif(scroller == NULL, QP_FAIL, "Invalid parameter!"); + + if (is_bring_in == 1) { + elm_scroller_page_bring_in(scroller, page, 0); + } else { + elm_scroller_page_show(scroller, page, 0); + } + + return QP_OK; +} + +HAPI int quickpanel_setting_layout_set(Evas_Object *base, Evas_Object *setting) +{ + retif(base == NULL, QP_FAIL, "Invalid parameter!"); + retif(setting == NULL, QP_FAIL, "Invalid parameter!"); + + elm_object_part_content_set(base, QP_SETTING_BASE_PART, setting); + + return 0; +} + +HAPI Evas_Object *quickpanel_setting_layout_get(Evas_Object *base, const char *setting_part) +{ + retif(base == NULL, NULL, "Invalid parameter!"); + retif(setting_part == NULL, NULL, "Invalid parameter!"); + + return elm_object_part_content_get(base, setting_part); +} + +HAPI int quickpanel_setting_layout_remove(Evas_Object *base) +{ + Evas_Object *container = NULL; + Evas_Object *scroller = NULL; + Evas_Object *box = NULL; + retif(base == NULL, QP_FAIL, "Invalid parameter!"); + + container = quickpanel_setting_container_get(base); + scroller = quickpanel_setting_scroller_get(base); + box = quickpanel_setting_box_get(base); + + if (box) { + elm_box_clear(box); + evas_object_del(box); + box = NULL; + } + if (scroller) { + evas_object_del(scroller); + scroller = NULL; + } + if (container) { + evas_object_del(container); + container = NULL; + } + + return QP_OK; +} + +HAPI void quickpanel_setting_create_confirm_popup( + Evas_Object *parent, + char *title, + char *text, + Evas_Smart_Cb func) +{ + Evas_Object *popup = elm_popup_add(parent); + Evas_Object *btn = NULL; + + if (popup == NULL) { + return; + } + + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + if (title) { + elm_object_part_text_set(popup, "title,text", title); + } + + if (text) { + elm_object_text_set(popup, text); + } + + btn = elm_button_add(popup); + elm_object_style_set(btn, "popup"); + elm_object_text_set(btn, _("IDS_ST_SK_OK")); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", func, popup); + + evas_object_show(popup); + quickpanel_common_ui_set_current_popup(popup, func); +} + +HAPI void quickpanel_setting_create_2button_confirm_popup( + Evas_Object *parent, + char *title, + char *text, + char *btn1_text, + Evas_Smart_Cb btn1_func, + char *btn2_text, + Evas_Smart_Cb btn2_func) +{ + Evas_Object *popup = elm_popup_add(parent); + Evas_Object *btn = NULL; + + if (popup == NULL) { + return; + } + + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + if (title) { + elm_object_part_text_set(popup, "title,text", title); + } + + if (text) { + elm_object_text_set(popup, text); + } + + if (btn1_func != NULL && btn1_text != NULL) { + btn = elm_button_add(popup); + elm_object_style_set(btn, "popup"); + elm_object_text_set(btn, btn1_text); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", btn1_func, popup); + } + if (btn2_func != NULL && btn2_text != NULL) { + btn = elm_button_add(popup); + elm_object_style_set(btn, "popup"); + elm_object_text_set(btn, btn2_text); + elm_object_part_content_set(popup, "button2", btn); + evas_object_smart_callback_add(btn, "clicked", btn2_func, popup); + } + + evas_object_show(popup); + quickpanel_common_ui_set_current_popup(popup, btn1_func); +} + +HAPI void +quickpanel_setting_create_timeout_popup(Evas_Object *parent, char *msg) +{ + retif(msg == NULL, , "invalid parameter"); + + notification_status_message_post(msg); +} diff --git a/daemon/settings/setting_utils.h b/daemon/settings/setting_utils.h new file mode 100644 index 0000000..300c585 --- /dev/null +++ b/daemon/settings/setting_utils.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __SETTING_UTILS_H__ +#define __SETTING_UTILS_H__ + +#include <Elementary.h> +#include "settings.h" + +#define TIMER_CONTINUE 1 +#define TIMER_STOP 0 +#define TIMER_COUNT 10 + +#define QP_SETTING_BASE_PART "qp.base.setting.swallow" +#define QP_SETTING_SCROLLER_PART_HD "setting.container.swallow.hd" +#define QP_SETTING_SCROLLER_PART_WVGA "setting.container.swallow.wvga" +#define QP_SETTING_CONTAINER_ICON_PART "setting.icon.swallow" +#define QP_SETTING_BRIGHTNESS_PART_HD "brightness.container.swallow.hd" +#define QP_SETTING_BRIGHTNESS_PART_WVGA "brightness.container.swallow.wvga" + +int quickpanel_setting_start(Evas_Object *base); +int quickpanel_setting_stop(Evas_Object *base, int is_bring_in); + +Evas_Object *quickpanel_setting_scroller_get(Evas_Object *base); +int quickpanel_setting_set_scroll_page_width(void *data); +int quickpanel_setting_layout_set(Evas_Object *base, Evas_Object *setting); +Evas_Object *quickpanel_setting_layout_get(Evas_Object *base, const char *setting_part); + +int quickpanel_setting_layout_remove(Evas_Object *base); +int quickpanel_setting_icon_text_set(Evas_Object *icon, const char *text, int state); +void quickpanel_setting_icon_access_text_set(Evas_Object *icon, const char *text); +int quickpanel_setting_icon_content_set(Evas_Object *icon, Evas_Object *content); + +Evas_Object *quickpanel_setting_box_get(Evas_Object *base); +Evas_Object *quickpanel_setting_icon_new(Evas_Object *parent); +Evas_Object *quickpanel_setting_icon_image_new(Evas_Object *parent, const char *img_path); +int quickpanel_setting_icon_pack(Evas_Object *box, Evas_Object *icon, int is_attach_divider); +void quickpanel_setting_icon_unpack_all(Evas_Object *box); +int quickpanel_setting_container_rotation_set(Evas_Object *base, int angle); +int quickpanel_setting_icons_rotation_set(Evas_Object *base, int angle); +int quickpanel_setting_icons_dragging_set(Evas_Object *icon, int is_on); +int quickpanel_setting_icons_screen_mode_set(Evas_Object *icon, int screen_mode); +void quickpanel_setting_icons_emit_sig(Evas_Object *icon, const char *signal); +Evas_Object *quickpanel_setting_icon_content_get(Evas_Object *icon); +int quickpanel_setting_icon_content_set(Evas_Object *icon, Evas_Object *content); + +int quickpanel_setting_icon_state_set(Evas_Object *icon, int is_on); +int quickpanel_setting_icon_state_progress_set(Evas_Object *icon); + +// Do not use full window popup in quickpanel +void quickpanel_setting_create_confirm_popup(Evas_Object *parent, char *title, char *text, Evas_Smart_Cb func); +void quickpanel_setting_create_2button_confirm_popup(Evas_Object *parent, char *title, char *text, + char *btn1_text, Evas_Smart_Cb btn1_func, char *btn2_text, Evas_Smart_Cb btn2_func); +void quickpanel_setting_create_timeout_popup(Evas_Object *parent, char *msg); + +int quickpanel_setting_scroll_page_get(void *data); + +#endif /* __SETTING_UTILS_H__ */ diff --git a/daemon/settings/setting_utils_x11.c b/daemon/settings/setting_utils_x11.c new file mode 100644 index 0000000..5a5bfc3 --- /dev/null +++ b/daemon/settings/setting_utils_x11.c @@ -0,0 +1,629 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <glib.h> +#include <efl_assist.h> +#include <notification.h> + +#include "common.h" +#include "quickpanel_def.h" +#include "quickpanel-ui.h" +#include "setting_utils.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif + +#define DEFAULT_EDJ EDJDIR"/"PACKAGE".edj" +#define _EDJ(o) elm_layout_edje_get(o) + +#define TEXT_LEN 128 +#define QP_SETTING_INITIAL_PAGE_NUM 0 +#define DIVIDER_MAGIC 0xCAFECAFE +#define E_DATA_DIVIDER_MAGIC "divider_magic" + +static inline void __escaped_text_set(Evas_Object *obj, + const char *part, const char *text) +{ + char buf[256] = {0,}; + char *ecaped = NULL; + + if (!obj) { + return; + } + + if (!part) { + return; + } + + strncpy(buf, text, sizeof(buf) - 1); + quickpanel_common_util_char_trim(buf); + ecaped = evas_textblock_text_utf8_to_markup(NULL, buf); + + elm_object_part_text_set(obj, part, ecaped); + + if (ecaped) { + free(ecaped); + } +} + +HAPI int quickpanel_setting_icon_text_set(Evas_Object *icon, const char *text, int state) +{ + retif(icon == NULL, QP_FAIL, "invalid parameter"); + retif(text == NULL, QP_FAIL, "invalid parameter"); + + __escaped_text_set(icon, "icon.text", text); + +#ifdef QP_SCREENREADER_ENABLE + char buf[256] = {0,}; + Evas_Object *ao = NULL; + + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _NOT_LOCALIZED("Button")); + strncpy(buf, text, sizeof(buf) - 1); + quickpanel_common_util_char_replace(buf, '\n', ' '); + elm_access_info_set(ao, ELM_ACCESS_INFO, buf); + } + + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + if (state == ICON_VIEW_STATE_ON) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("On")); + } else if (state == ICON_VIEW_STATE_DIM) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Turned off")); + } else if (state == ICON_VIEW_STATE_OFF) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Off")); + } + } +#endif + + return QP_OK; +} + +HAPI void quickpanel_setting_icon_access_text_set(Evas_Object *icon, const char *text) +{ +#ifdef QP_SCREENREADER_ENABLE + char buf[256] = {0,}; + Evas_Object *ao = NULL; +#endif + + retif(icon == NULL, , "invalid parameter"); + retif(text == NULL, , "invalid parameter"); + +#ifdef QP_SCREENREADER_ENABLE + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + elm_access_info_set(ao, ELM_ACCESS_TYPE, _NOT_LOCALIZED("Button")); + strncpy(buf, text, sizeof(buf) - 1); + quickpanel_common_util_char_replace(buf, '\n', ' '); + elm_access_info_set(ao, ELM_ACCESS_INFO, buf); + } +#endif +} + +HAPI Evas_Object *quickpanel_setting_icon_content_get(Evas_Object *icon) +{ + retif(icon == NULL, NULL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, NULL, "application data is NULL"); + + return elm_object_part_content_get(icon, "icon.swallow.wvga"); +} + +HAPI int quickpanel_setting_icon_content_set(Evas_Object *icon, Evas_Object *content) +{ + retif(icon == NULL, QP_FAIL, "invalid parameter"); + retif(content == NULL, QP_FAIL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, QP_FAIL, "application data is NULL"); + + elm_object_part_content_set(icon, "icon.swallow.wvga", content); + + return QP_OK; +} + +HAPI int quickpanel_setting_icon_state_set(Evas_Object *icon, int state) +{ +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = NULL; +#endif + retif(icon == NULL, -1, "invalid parameter"); + SERR("icon:%p state:%d", icon, state); + +#ifdef QP_SCREENREADER_ENABLE + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + if (state == ICON_VIEW_STATE_ON) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("On")); + } else if (state == ICON_VIEW_STATE_DIM) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Turned off")); + } else if (state == ICON_VIEW_STATE_OFF) { + elm_access_info_set(ao, ELM_ACCESS_STATE, _NOT_LOCALIZED("Off")); + } + } +#endif + + if (state == ICON_VIEW_STATE_ON) { + elm_object_signal_emit(icon, "icon.on", "quickpanl.prog"); + } else if (state == ICON_VIEW_STATE_DIM) { + elm_object_signal_emit(icon, "icon.dim", "quickpanl.prog"); + } else { + elm_object_signal_emit(icon, "icon.off", "quickpanl.prog"); + } + + edje_object_message_signal_process(_EDJ(icon)); + + return 0; +} + +HAPI int quickpanel_setting_icon_state_progress_set(Evas_Object *icon) +{ + retif(icon == NULL, -1, "invalid parameter"); + + elm_object_signal_emit(icon, "icon.progress", "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + + return 0; +} + +HAPI Evas_Object *quickpanel_setting_icon_new(Evas_Object *parent) +{ + const char *signal = NULL; + Evas_Object *icon = NULL; + retif(parent == NULL, NULL, "invalid parameter"); + + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, EINA_FALSE, "invalid data."); + + icon = elm_layout_add(parent); + retif(!icon, NULL, "fail to add layout"); + + elm_layout_file_set(icon, DEFAULT_EDJ, "quickpanel/setting_icon_wvga"); + + evas_object_size_hint_weight_set(icon, + EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_signal_emit(icon, "icon.off", "quickpanl.prog"); + + Evas_Object *focus = quickpanel_accessibility_ui_get_focus_object(icon); + elm_object_part_content_set(icon, "focus", focus); + + if (ad->angle == 0 || ad->angle == 180) { + signal = "icon.portrait"; + } else { + signal = "icon.landscape"; + } + + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + + return icon; +} + +HAPI Evas_Object *quickpanel_setting_icon_image_new(Evas_Object *parent, const char *img_path) +{ + Evas_Object *content = NULL; + retif(parent == NULL, NULL, "invalid parameter"); + retif(img_path == NULL, NULL, "invalid parameter"); + + content = elm_image_add(parent); + retif(content == NULL, NULL, "failed to create image"); + + if (!elm_image_file_set(content, DEFAULT_EDJ, img_path)) { + ERR("fail to set file[%s]", img_path); + evas_object_del(content); + content = NULL; + return NULL; + } + + return content; +} + +HAPI static Evas_Object *quickpanel_setting_container_get(Evas_Object *base) +{ + Evas_Object *container = NULL; + retif(base == NULL, NULL, "invalid parameter"); + + container = elm_object_part_content_get(base, QP_SETTING_BASE_PART); + + return container; +} + +HAPI Evas_Object *quickpanel_setting_scroller_get(Evas_Object *base) +{ + Evas_Object *container = NULL; + Evas_Object *scroller = NULL; + retif(base == NULL, NULL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, NULL, "application data is NULL"); + + container = quickpanel_setting_container_get(base); + + scroller = elm_object_part_content_get(container, QP_SETTING_SCROLLER_PART_WVGA); + + retif(scroller == NULL, NULL, "invalid parameter"); + + return scroller; +} + +HAPI Evas_Object *quickpanel_setting_box_get_from_scroller(Evas_Object *base) +{ + Evas_Object *scroller = NULL; + Evas_Object *box = NULL; + retif(base == NULL, NULL, "invalid parameter"); + + scroller = quickpanel_setting_scroller_get(base); + retif(scroller == NULL, NULL, "invalid parameter"); + + box = elm_object_content_get(scroller); + + return box; +} + + +HAPI Evas_Object *quickpanel_setting_box_get(Evas_Object *base) +{ + Evas_Object *container = NULL; + Evas_Object *box = NULL; + retif(base == NULL, NULL, "invalid parameter"); + + container = quickpanel_setting_container_get(base); + retif(container == NULL, NULL, "invalid parameter"); + box = elm_object_part_content_get(container, QP_SETTING_SCROLLER_PART_WVGA); + + return box; +} + + +HAPI int quickpanel_setting_container_rotation_set(Evas_Object *base, int angle) +{ + Evas_Object *container = NULL; + const char *signal = NULL; + + retif(!base, -1, "base is NULL"); + retif(angle < 0, -1, "angle is %d", angle); + + container = quickpanel_setting_container_get(base); + retif(!container, -1, "box is NULL"); + + if (angle % 180 == 0) { + signal = "portrait"; + } else { + signal = "landscape"; + } + + elm_object_signal_emit(container, signal, "background"); + edje_object_message_signal_process(_EDJ(container)); + + return 0; +} + +HAPI int quickpanel_setting_icons_rotation_set(Evas_Object *base, int angle) +{ + Evas_Object *box = NULL; + Evas_Object *icon = NULL; + Eina_List *icons = NULL; + Eina_List *l = NULL; + const char *signal = NULL; + + retif(!base, -1, "base is NULL"); + retif(angle < 0, -1, "angle is %d", angle); + + box = quickpanel_setting_box_get(base); + retif(!box, -1, "box is NULL"); + + icons = elm_box_children_get(box); + retif(!icons, -1, "icons list is NULL"); + + if (angle % 180 == 0) { + signal = "icon.portrait"; + } else { + signal = "icon.landscape"; + } + + EINA_LIST_FOREACH(icons, l, icon) { + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + } + + eina_list_free(icons); + + return 0; +} + +HAPI void quickpanel_setting_icons_emit_sig(Evas_Object *icon, const char *signal) +{ + retif(!icon, , "icon is NULL"); + retif(!signal, , "icon is NULL"); + + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); +} + +HAPI int quickpanel_setting_icons_dragging_set(Evas_Object *icon, int is_on) +{ + const char *signal = NULL; + retif(!icon, QP_FAIL, "icon is NULL"); + + if (is_on == 1) { + signal = "dragging.on"; + } else { + signal = "dragging.off"; + } + + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + + return QP_OK; +} + +HAPI int quickpanel_setting_icons_screen_mode_set(Evas_Object *icon, int screen_mode) +{ + const char *signal = NULL; + retif(!icon, QP_FAIL, "icon is NULL"); + + if (screen_mode == 0) { + signal = "icon.portrait"; + } else { + signal = "icon.landscape"; + } + + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + + return QP_OK; +} + +HAPI int quickpanel_setting_icon_pack(Evas_Object *box, Evas_Object *icon, int is_attach_divider) +{ + retif(box == NULL, QP_FAIL, "box is NULL"); + + elm_box_pack_end(box, icon); + + return QP_OK; +} + +HAPI void quickpanel_setting_icon_unpack_all(Evas_Object *box) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *node = NULL; + Eina_List *list = NULL; + retif(box == NULL, , "invalid parameter"); + + list = elm_box_children_get(box); + retif(list == NULL, , "empty list"); + + elm_box_unpack_all(box); + + EINA_LIST_FOREACH_SAFE(list, l, l_next, node) { + if (node != NULL) { + if (evas_object_data_get(node, E_DATA_DIVIDER_MAGIC) == (void *)DIVIDER_MAGIC) { + evas_object_del(node); + node = NULL; + } + } + } + + eina_list_free(list); +} + +HAPI int quickpanel_setting_scroll_page_get(void *data) +{ + int page_h = 0x99; + struct appdata *ad = NULL; + retif(data == NULL, QP_FAIL, "Invalid parameter!"); + + ad = data; + retif(!ad->ly, QP_FAIL, "layout is NULL!"); + + Evas_Object *scroller = quickpanel_setting_scroller_get(ad->ly); + elm_scroller_current_page_get(scroller, &page_h, NULL); + + return page_h; +} + +HAPI int quickpanel_setting_set_scroll_page_width(void *data) +{ + struct appdata *ad = NULL; + retif(data == NULL, QP_FAIL, "Invalid parameter!"); + + ad = data; + retif(!ad->ly, QP_FAIL, "layout is NULL!"); + + Evas_Object *scroller = quickpanel_setting_scroller_get(ad->ly); + + int w, h; + Ecore_X_Screen *screen = ecore_x_default_screen_get(); + ecore_x_screen_size_get(screen, &w, &h); + + elm_scroller_page_size_set(scroller, w / QP_SETTING_NUM_PORTRAIT_ICONS, 0); + + return 0; +} + +HAPI int quickpanel_setting_start(Evas_Object *base) +{ + Evas_Object *scroller = NULL; + retif(base == NULL, QP_FAIL, "Invalid parameter!"); + + scroller = quickpanel_setting_scroller_get(base); + retif(scroller == NULL, QP_FAIL, "Invalid parameter!"); + + elm_scroller_page_bring_in(scroller, 0, 0); + + return QP_OK; +} + +HAPI int quickpanel_setting_stop(Evas_Object *base, int is_bring_in) +{ + int page = QP_SETTING_INITIAL_PAGE_NUM; + Evas_Object *scroller = NULL; + retif(base == NULL, QP_FAIL, "Invalid parameter!"); + + scroller = quickpanel_setting_scroller_get(base); + retif(scroller == NULL, QP_FAIL, "Invalid parameter!"); + + if (is_bring_in == 1) { + elm_scroller_page_bring_in(scroller, page, 0); + } else { + elm_scroller_page_show(scroller, page, 0); + } + + return QP_OK; +} + +HAPI int quickpanel_setting_layout_set(Evas_Object *base, Evas_Object *setting) +{ + retif(base == NULL, QP_FAIL, "Invalid parameter!"); + retif(setting == NULL, QP_FAIL, "Invalid parameter!"); + + elm_object_part_content_set(base, QP_SETTING_BASE_PART, setting); + + return 0; +} + +HAPI Evas_Object *quickpanel_setting_layout_get(Evas_Object *base, const char *setting_part) +{ + retif(base == NULL, NULL, "Invalid parameter!"); + retif(setting_part == NULL, NULL, "Invalid parameter!"); + + return elm_object_part_content_get(base, setting_part); +} + +HAPI int quickpanel_setting_layout_remove(Evas_Object *base) +{ + Evas_Object *container = NULL; + Evas_Object *scroller = NULL; + Evas_Object *box = NULL; + retif(base == NULL, QP_FAIL, "Invalid parameter!"); + + container = quickpanel_setting_container_get(base); + scroller = quickpanel_setting_scroller_get(base); + box = quickpanel_setting_box_get(base); + + if (box) { + elm_box_clear(box); + evas_object_del(box); + box = NULL; + } + if (scroller) { + evas_object_del(scroller); + scroller = NULL; + } + if (container) { + evas_object_del(container); + container = NULL; + } + + return QP_OK; +} + +HAPI void quickpanel_setting_create_confirm_popup( + Evas_Object *parent, + char *title, + char *text, + Evas_Smart_Cb func) +{ + Evas_Object *popup = elm_popup_add(parent); + Evas_Object *btn = NULL; + + if (popup == NULL) { + return; + } + + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + if (title) { + elm_object_part_text_set(popup, "title,text", title); + } + + if (text) { + elm_object_text_set(popup, text); + } + + btn = elm_button_add(popup); + elm_object_style_set(btn, "popup"); + elm_object_text_set(btn, _("IDS_ST_SK_OK")); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", func, popup); + + evas_object_show(popup); + quickpanel_common_ui_set_current_popup(popup, func); +} + +HAPI void quickpanel_setting_create_2button_confirm_popup( + Evas_Object *parent, + char *title, + char *text, + char *btn1_text, + Evas_Smart_Cb btn1_func, + char *btn2_text, + Evas_Smart_Cb btn2_func) +{ + Evas_Object *popup = elm_popup_add(parent); + Evas_Object *btn = NULL; + + if (popup == NULL) { + return; + } + + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + + if (title) { + elm_object_part_text_set(popup, "title,text", title); + } + + if (text) { + elm_object_text_set(popup, text); + } + + if (btn1_func != NULL && btn1_text != NULL) { + btn = elm_button_add(popup); + elm_object_style_set(btn, "popup"); + elm_object_text_set(btn, btn1_text); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", btn1_func, popup); + } + if (btn2_func != NULL && btn2_text != NULL) { + btn = elm_button_add(popup); + elm_object_style_set(btn, "popup"); + elm_object_text_set(btn, btn2_text); + elm_object_part_content_set(popup, "button2", btn); + evas_object_smart_callback_add(btn, "clicked", btn2_func, popup); + } + + evas_object_show(popup); + quickpanel_common_ui_set_current_popup(popup, btn1_func); +} + +HAPI void +quickpanel_setting_create_timeout_popup(Evas_Object *parent, char *msg) +{ + retif(msg == NULL, , "invalid parameter"); + + notification_status_message_post(msg); +} diff --git a/daemon/settings/settings.c b/daemon/settings/settings.c new file mode 100644 index 0000000..5f67c01 --- /dev/null +++ b/daemon/settings/settings.c @@ -0,0 +1,479 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <stdlib.h> +#include <glib.h> +#include <vconf.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "quickpanel_def.h" +#include "modules.h" +#include "settings.h" +#include "setting_utils.h" +#include "settings_ipc.h" +#include "pager_common.h" +#ifdef QP_SCREENREADER_ENABLE +#include "accessibility.h" +#endif +#include "preference.h" +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif +#include "configuration.h" + +static int quickpanel_settings_init(void *data); +static int quickpanel_settings_fini(void *data); +static int quickpanel_settings_suspend(void *data); +static int quickpanel_settings_resume(void *data); +static void quickpanel_settings_lang_changed(void *data); +static void quickpanel_settings_reflesh(void *data); +static Eina_Bool _module_is_enabled(QP_Module_Setting *module); + +extern QP_Module_Setting wifi; +extern QP_Module_Setting gps; +extern QP_Module_Setting bluetooth; +extern QP_Module_Setting sound; +extern QP_Module_Setting rotate; +extern QP_Module_Setting mobile_data; +extern QP_Module_Setting flightmode; +extern QP_Module_Setting u_power_saving; +extern QP_Module_Setting tethering; +extern QP_Module_Setting assistive_light; + +QP_Module settings = { + .name = "settings", + .init = quickpanel_settings_init, + .fini = quickpanel_settings_fini, + .suspend = quickpanel_settings_suspend, + .resume = quickpanel_settings_resume, + .lang_changed = quickpanel_settings_lang_changed, + .refresh = quickpanel_settings_reflesh, +}; + +static struct _info { + GHashTable *module_table; + QP_Module_Setting *modules[]; +} s_info = { + .module_table = NULL, + .modules = { + &wifi, + &gps, + &sound, + &rotate, + &bluetooth, + NULL, + }, +}; + +static void _module_init(QP_Module_Setting *module) +{ + if (module->init != NULL) { + module->loader = (QP_Setting_Loaded_Item *)calloc(1, sizeof(QP_Setting_Loaded_Item)); + module->init(module); + module->is_loaded = EINA_TRUE; + } +} + +static void _module_fini(QP_Module_Setting *module) +{ + if (module->fini != NULL) { + module->fini(module); + if (module->loader != NULL) { + free(module->loader); + module->loader = NULL; + module->is_loaded = EINA_FALSE; + } + } +} + +static int _module_count_get(void) +{ + int i, cnt = 0; + + for (i = 0; s_info.modules[i] != NULL; i++) { + cnt++; + } + + return cnt; +} + +static QP_Module_Setting *_module_get_by_name(const char *name) +{ + retif(name == NULL, NULL, "invalid parameter"); + retif(s_info.module_table == NULL, NULL, "invalid parameter"); + + return g_hash_table_lookup(s_info.module_table, name); +} + +static Eina_Bool _module_is_enabled(QP_Module_Setting *module) { + retif(module == NULL, EINA_FALSE, "invalid parameter"); + retif(module->name == NULL, EINA_FALSE, "invalid parameter"); + + if (strcmp(module->name, MODULE_BLANK) == 0) { + return EINA_FALSE; + } + if (module->supported_get) { + if (module->supported_get() == 0) + return EINA_FALSE; + } + return EINA_TRUE; +} + +static char *_preference_get(const char *key) +{ + char line[PREF_LEN_VALUE_MAX + 1] = {0,}; + + if (quickpanel_preference_get(key, line) == QP_OK) { + DBG("quicksetting order from file:%s", line); + return strdup(line); + } + + return NULL; +} + +static void _reservied_list_get_with_active_list(Eina_List **list) +{ + int i = 0, module_count = 0; + Eina_List *list_featured = NULL; + retif(list == NULL, , "invalid data."); + + quickpanel_settings_featured_list_get(&list_featured); + retif(list_featured == NULL, , "failed to get default active list"); + + module_count = _module_count_get(); + + for (i = 0; i < module_count; i++) { + if (eina_list_data_find(list_featured, s_info.modules[i]) == NULL){ + if (_module_is_enabled(s_info.modules[i]) == EINA_TRUE) { + *list = eina_list_append (*list, s_info.modules[i]); + } + } + } + + eina_list_free(list_featured); +} + +static int quickpanel_settings_init(void *data) +{ + int i; + int mod_count = 0; + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + mod_count = _module_count_get(); + if (s_info.module_table != NULL) { + g_hash_table_remove_all(s_info.module_table); + g_hash_table_destroy(s_info.module_table); + s_info.module_table = NULL; + } + s_info.module_table = g_hash_table_new_full(g_str_hash, g_str_equal, + (GDestroyNotify)g_free, + NULL); + if (s_info.module_table != NULL) { + for (i = 0; i < mod_count; i++) { + if (s_info.modules[i]->supported_get != NULL) { + if (s_info.modules[i]->supported_get() == 0) { + continue; + } + } + + if (s_info.modules[i]->init != NULL && s_info.modules[i]->name != NULL) { + ERR("quickbutton %s is initialized", s_info.modules[i]->name); + DBG("quickbutton %s is initialized", s_info.modules[i]->name); + g_hash_table_insert(s_info.module_table, + g_strdup(s_info.modules[i]->name), + s_info.modules[i]); + _module_init(s_info.modules[i]); + } + } + } else { + ERR("failed to create module has table"); + return QP_FAIL; + } + + quickpanel_settings_ipc_init(ad); + + return QP_OK; +} + +static int quickpanel_settings_fini(void *data) +{ + int i; + int ret = 0; + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + quickpanel_settings_ipc_fini(ad); + + for (i = 0; s_info.modules[i] != NULL; i++) { + if (_module_is_enabled(s_info.modules[i]) == EINA_TRUE) { + _module_fini(s_info.modules[i]); + } + } + + if (s_info.module_table) { + g_hash_table_remove_all(s_info.module_table); + g_hash_table_destroy(s_info.module_table); + s_info.module_table = NULL; + } + + return ret; +} + +static int quickpanel_settings_suspend(void *data) +{ + int i; + int ret = 0; + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + for (i = 0; s_info.modules[i] != NULL; i++) { + if (_module_is_enabled(s_info.modules[i]) == EINA_TRUE) { + if ((s_info.modules[i])->suspend != NULL) { + (s_info.modules[i])->suspend(s_info.modules[i]); + } + } + } + + return ret; +} + +static int quickpanel_settings_resume(void *data) +{ + int i; + int ret = 0; + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + for (i = 0; s_info.modules[i] != NULL; i++) { + if (_module_is_enabled(s_info.modules[i]) == EINA_TRUE) { + if ((s_info.modules[i])->resume != NULL) { + (s_info.modules[i])->resume(s_info.modules[i]); + } + } + } + + return ret; +} + +static void quickpanel_settings_lang_changed(void *data) +{ + int i; + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + for (i = 0; s_info.modules[i] != NULL; i++) { + if (_module_is_enabled(s_info.modules[i]) == EINA_TRUE) { + if ((s_info.modules[i])->lang_changed != NULL) { + (s_info.modules[i])->lang_changed(s_info.modules[i]); + } + } + } +} + +static void quickpanel_settings_reflesh(void *data) +{ + int i; + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + for (i = 0; s_info.modules[i] != NULL; i++) { + if (_module_is_enabled(s_info.modules[i]) == EINA_TRUE) { + if ((s_info.modules[i])->refresh != NULL) { + (s_info.modules[i])->refresh(s_info.modules[i]); + } + } + } +} + +HAPI int quickpanel_settings_featured_list_validation_check(char *order) +{ + int i = 0, is_valid = 0; + int order_count = 0; + gchar **order_split = NULL; + QP_Module_Setting *mod = NULL; + retif(order == NULL, is_valid, "Invalid parameter!"); + + if (s_info.module_table == NULL) { + return is_valid; + } + + order_split = g_strsplit(order, ",", 0); + + if (order_split != NULL) { + order_count = g_strv_length(order_split); + + if (order_count >= QP_SETTING_NUM_MINIMUM_ICON) { + for (i = 0; i < order_count; i++) { + mod = _module_get_by_name(order_split[i]); + if (mod != NULL) { + is_valid = 1; + } else { + is_valid = 0; + break; + } + } + } + + g_strfreev(order_split); + } + + return is_valid; +} + +HAPI void quickpanel_settings_featured_list_get(Eina_List **list) +{ + int i = 0, seq_count = 0; + int num_featured = 0; + int seq_added_count = 0; + gchar **params = NULL; + QP_Module_Setting *module = NULL; + retif(list == NULL, , "invalid data."); + char *sequence = _preference_get(PREF_QUICKSETTING_ORDER); + const char *default_sequence = quickpanel_preference_default_get(PREF_QUICKSETTING_ORDER); + + char *num_featured_str = _preference_get(PREF_QUICKSETTING_FEATURED_NUM); + const char *default_num_featured_str = quickpanel_preference_default_get(PREF_QUICKSETTING_FEATURED_NUM); + + if (sequence != NULL) { + params = g_strsplit(sequence, ",", 0); + free(sequence); + } else { + params = g_strsplit(default_sequence, ",", 0); + } + + if (num_featured_str != NULL) { + num_featured = atoi(num_featured_str); + free(num_featured_str); + } else { + if (default_num_featured_str != NULL) { + num_featured = atoi(default_num_featured_str); + } else { + num_featured = QP_SETTING_NUM_TOTAL_ICON; + } + } + + if (params != NULL) { + seq_count = g_strv_length(params); + + for (i = 0; i < seq_count; i++) { + if (seq_added_count >= num_featured){ + break; + } + + module = _module_get_by_name(params[i]); + if (module != NULL) { + if (_module_is_enabled(module) == EINA_TRUE) { + *list = eina_list_append (*list, module); + seq_added_count++; + } + } + } + + g_strfreev(params); + } +} + +HAPI void quickpanel_settings_all_list_get(Eina_List **list) +{ + int i = 0, seq_count = 0; + gchar **params = NULL; + QP_Module_Setting *module = NULL; + retif(list == NULL, , "invalid data."); + char *sequence = _preference_get(PREF_QUICKSETTING_ORDER); + const char *default_sequence = quickpanel_preference_default_get(PREF_QUICKSETTING_ORDER); + + if (sequence != NULL) { + params = g_strsplit(sequence, ",", 0); + free(sequence); + } else if (default_sequence != NULL){ + params = g_strsplit(default_sequence, ",", 0); + } + + if (params != NULL) { + seq_count = g_strv_length(params); + + for (i = 0; i < seq_count; i++) { + module = _module_get_by_name(params[i]); + if (module != NULL) { + if (_module_is_enabled(module) == EINA_TRUE) { + *list = eina_list_append (*list, module); + } + } + } + + g_strfreev(params); + } +} + +HAPI void quickpanel_setting_save_list_to_file(Eina_List *list, int num_featured) +{ + Eina_List *l; + Eina_List *l_next; + QP_Module_Setting *module = NULL; + char buf[32] = {0,}; + retif(list == NULL, , "invalid parameter"); + + int is_first = 1; + + char *base = NULL; + char *temp = NULL; + + EINA_LIST_FOREACH_SAFE(list, l, l_next, module) { + if (module == NULL){ + continue; + } + if (module->name == NULL) { + continue; + } + if (_module_is_enabled(module) == EINA_FALSE) { + continue; + } + + if (is_first == 1) { + base = g_strdup(module->name); + is_first = 0; + } else { + temp = g_strconcat(base, ",", module->name, NULL); + if (base != NULL) g_free(base); + base = temp; + temp = NULL; + } + } + + if (base != NULL) { + if (quickpanel_preference_set(PREF_QUICKSETTING_ORDER, base) == QP_FAIL) { + ERR("failed to write quicksetting order"); + } + g_free(base); + snprintf(buf, sizeof(buf) - 1, "%d", num_featured); + if (quickpanel_preference_set(PREF_QUICKSETTING_FEATURED_NUM, buf) == QP_FAIL) { + ERR("failed to write quicksetting featured num"); + } + } +} + +HAPI QP_Module_Setting *quickpanel_settings_module_get_by_name(const char *name) +{ + return _module_get_by_name(name); +} + +HAPI int quickpanel_settings_module_count_get(void) +{ + return _module_count_get(); +} diff --git a/daemon/settings/settings.h b/daemon/settings/settings.h new file mode 100644 index 0000000..6694617 --- /dev/null +++ b/daemon/settings/settings.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SETTING_H__ +#define __SETTING_H__ + +#include <Elementary.h> +#include "quickpanel_def.h" +#include "quickpanel-ui.h" +#include "settings_icon_common.h" + +#define MODULE_BLANK "blank" +#define FILE_QP_BUTTON_ORDER_INI DATADIR_RW"/qp_setting_order.ini" +#define E_DATA_MODULE_INFO "module_info" + +#define ICON_VIEW_STATE_OFF 0 +#define ICON_VIEW_STATE_ON 1 +#define ICON_VIEW_STATE_DIM 2 + +#define STATE_ICON_NOT_LOADED 0 +#define STATE_ICON_IDLE 1 +#define STATE_ICON_BUSY 2 + +#define QS_DBUS_SIG_ACTIVITY "ACTIVITY" +#define QS_DBUS_SIG_EDITING "EDITING" + +typedef enum _qp_setting_icon_state_type { + QP_SETTING_ICON_STATE_NOT_LOADED, + QP_SETTING_ICON_STATE_IDLE, + QP_SETTING_ICON_STATE_BUSY, +} qp_setting_icon_state_type; + +typedef enum _qp_setting_icon_image_type { + QP_SETTING_ICON_NORMAL, + QP_SETTING_ICON_HIGHLIGHT, + QP_SETTING_ICON_DIM, +} qp_setting_icon_image_type; + +typedef struct _Setting_Activity_Handler { + char *command; + void (*handler)(void *data); +} Setting_Activity_Handler; + +typedef struct _QP_Module_Setting QP_Module_Setting; +typedef struct _QP_Setting_Loaded_Item QP_Setting_Loaded_Item; + +struct _QP_Module_Setting { + char *name; + int is_disable_feedback; + + /* func */ + int (*init) (void *); + int (*fini) (void *); + int (*suspend) (void *); + int (*resume) (void *); + int (*hib_enter) (void *); + int (*hib_leave) (void *); + void (*lang_changed) (void *); + void (*refresh) (void *); + void (*qp_opened) (void *); + void (*qp_closed) (void *); + + const char *(*label_get) (void); + const char *(*icon_get) (qp_setting_icon_image_type type); + int (*supported_get) (void); + void (*view_update)(Evas_Object *, int, int, int); + void (*status_update)(QP_Module_Setting *, int, int); + + int (*handler_ipc)(const char *, void *); + Edje_Signal_Cb handler_press; + void (*handler_longpress) (void *); + + /* do not modify this area */ + /* internal data */ + Eina_Bool is_loaded; + QP_Setting_Loaded_Item *loader; + Eina_List *view_list; +}; + +struct _QP_Setting_Loaded_Item { + QP_Module_Setting *module; + void *app_data; + int state_icon; + + Evas_Object *view; + Ecore_Timer *timer; + int state; + void *extra_handler_1; +}; + +void quickpanel_setting_save_list_to_file(Eina_List *list, int num_featured); +int quickpanel_settings_featured_list_validation_check(char *order); +void quickpanel_settings_featured_list_get(Eina_List **list); +void quickpanel_settings_all_list_get(Eina_List **list); + +QP_Module_Setting *quickpanel_settings_module_get_by_name(const char *name); +int quickpanel_settings_module_count_get(void); + +#endif diff --git a/daemon/settings/settings_gridbox.c b/daemon/settings/settings_gridbox.c new file mode 100644 index 0000000..1c81624 --- /dev/null +++ b/daemon/settings/settings_gridbox.c @@ -0,0 +1,490 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include "quickpanel-ui.h" +#include "common.h" +#include "list_util.h" +#include "quickpanel_def.h" +#include "settings_gridbox.h" +#include "pager.h" + +#define E_DATA_LAYOUT_PORTRAIT "layout_portrait" +#define E_DATA_LAYOUT_LANDSCAPE "layout_landscape" +#define E_DATA_ITEM_TYPE "item_type" +#define E_DATA_POS_INFO "pos_info" +#define DIVIDER_TOUCH_W 20 + +typedef struct _info_layout { + int n_per_rows; + int padding_top; + int padding_left; + int padding_right; + int padding_bottom; + int padding_between_h; + int padding_between_v; + int child_w; + int child_h; + double scale; + int limit_w; +} info_layout; + +typedef struct _info_position { + int index; + int offset_x; + int offset_y; + int width; + int height; +} info_position; + +static Eina_List *_position_info_add(Eina_List *list, int is_icon, int index, int offset_x, int offset_y, int width, int height) +{ + info_position *pos_info = (info_position *) calloc(1, sizeof(info_position)); + retif(pos_info == NULL, NULL, "failed to allocate memory"); + + pos_info->index = index; + + if (is_icon == 1) { + if (offset_x <= 0) { + pos_info->offset_x = offset_x; + pos_info->width = width - DIVIDER_TOUCH_W; + } else { + pos_info->offset_x = offset_x + DIVIDER_TOUCH_W; + pos_info->width = width - DIVIDER_TOUCH_W - DIVIDER_TOUCH_W; + } + } else { + if (offset_x <= 0) { + pos_info->offset_x = offset_x; + pos_info->width = width - DIVIDER_TOUCH_W; + } else { + pos_info->offset_x = offset_x - DIVIDER_TOUCH_W; + pos_info->width = width + DIVIDER_TOUCH_W + DIVIDER_TOUCH_W; + } + } + + pos_info->offset_y = offset_y; + pos_info->height = height; + + return eina_list_append(list, pos_info); +} + +static void _position_info_clear(Eina_List *list) +{ + info_position *pos_info = NULL; + + EINA_LIST_FREE(list, pos_info) { + if (pos_info != NULL) { + free(pos_info); + pos_info = NULL; + } + } +} + +static Eina_List *_position_info_get(Evas_Object *gridbox) +{ + return evas_object_data_get(gridbox, E_DATA_POS_INFO); +} + +static void _position_info_set(Evas_Object *gridbox, Eina_List *list) +{ + evas_object_data_set(gridbox, E_DATA_POS_INFO, list); +} + +static info_layout *_get_layout(Evas_Object *gridbox) +{ + struct appdata *ad = quickpanel_get_app_data(); + info_layout *info_layout = NULL; + + retif(ad == NULL, NULL, "invalid data."); + retif(gridbox == NULL, NULL, "invalid parameter"); + + if (ad->angle == 270 || ad->angle == 90) { + info_layout = evas_object_data_get(gridbox, E_DATA_LAYOUT_LANDSCAPE); + } else { + info_layout = evas_object_data_get(gridbox, E_DATA_LAYOUT_PORTRAIT); + } + + return info_layout; +} + +static int _item_is_icon(Evas_Object *icon) +{ + const char *item_type = NULL; + retif(icon == NULL, 1, "invalid parameter"); + + item_type = evas_object_data_get(icon, E_DATA_ITEM_TYPE); + retif(item_type == NULL, 1, "invalid parameter"); + + if (strcmp(item_type, SETTINGS_GRIDBOX_ITEM_ICON) == 0) { + return 1; + } + + return 0; +} + +static void _item_pos_get(int order, int *x, int *y, void *data) +{ + info_layout *info_layout = data; + retif(info_layout == NULL, , "invalid parameter"); + + int n_per_row = info_layout->n_per_rows; + + int row = (order - 1) / n_per_row; + int column = (order - 1) - (row * n_per_row); + + int row_x = info_layout->padding_left + + ((info_layout->child_w + info_layout->padding_between_h) * column); + + int row_y = info_layout->padding_top + + ((info_layout->child_h + info_layout->padding_between_v) * row); + + if (x != NULL) { + *x = row_x; + } + + if (y != NULL) { + *y = row_y; + } +} + +static inline void _item_move_and_resize(Evas_Object *item, int x, int y, int w, int h) +{ + evas_object_move(item, x, y); + evas_object_size_hint_min_set(item, w, h); + evas_object_resize(item, w, h); +} + +static void _layout_cb(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) +{ + int n_children; + int x, y; + int off_x = 0, off_y = 0; + Eina_List *l; + Eina_List *l_next; + Evas_Object_Box_Option *opt; + int child_w; + int space_w = 0; + int num_padding_between = 0; + + retif(o == NULL, , "invalid parameter"); + retif(priv == NULL, , "invalid parameter"); + retif(data == NULL, , "invalid parameter"); + + info_layout *info_layout = _get_layout(data); + Eina_List *list_pos_info = _position_info_get(data); + + n_children = eina_list_count(priv->children); + DBG("layout function:%d", n_children); + if (!n_children) { + evas_object_size_hint_min_set(o, ELM_SCALE_SIZE(-1), ELM_SCALE_SIZE(0)); + return; + } + + //box geometry + evas_object_geometry_get(o, &x, &y, NULL, NULL); + + num_padding_between = info_layout->n_per_rows >> 1; + num_padding_between += (info_layout->n_per_rows > 1 && (info_layout->n_per_rows % 2) > 0) ? 1 : 0; + + space_w = (info_layout->padding_left * 2) + (info_layout->padding_between_h * num_padding_between); + child_w = (info_layout->limit_w - space_w) / info_layout->n_per_rows; + + info_layout->child_w = child_w; + + if (list_pos_info != NULL) { + _position_info_clear(list_pos_info); + _position_info_set(data, NULL); + list_pos_info = NULL; + } + + int order_obj = 0; + int order_children = 1; + int order_divider = 1; + Evas_Object *btn_previous = NULL; + + EINA_LIST_FOREACH_SAFE(priv->children, l, l_next, opt) { + if (_item_is_icon(opt->obj)) { + _item_pos_get(order_children, &off_x, &off_y, info_layout); + _item_move_and_resize(opt->obj, x + off_x, y + off_y, + info_layout->child_w, info_layout->child_h); + order_children++; + list_pos_info = + _position_info_add(list_pos_info, 1, order_obj, off_x, off_y, info_layout->child_w, info_layout->child_h); + if (btn_previous != NULL && opt->obj != NULL) { + elm_object_focus_next_object_set(opt->obj, btn_previous, ELM_FOCUS_LEFT); + elm_object_focus_next_object_set(btn_previous, opt->obj, ELM_FOCUS_RIGHT); + } + btn_previous = opt->obj; + } else { + _item_pos_get(order_children - 1, &off_x, &off_y, info_layout); + _item_move_and_resize(opt->obj, x + off_x + info_layout->child_w, y + off_y, + info_layout->padding_between_h, info_layout->child_h); + if ((order_divider % info_layout->n_per_rows) == 0) { + evas_object_hide(opt->obj); + } else { + evas_object_show(opt->obj); + } + order_divider++; + list_pos_info = + _position_info_add(list_pos_info, 0, order_obj, off_x + info_layout->child_w, off_y, + info_layout->padding_between_h, info_layout->child_h); + } + order_obj++; + } + + _position_info_set(data, list_pos_info); +} + +static void _deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + DBG("deleted_cb"); + Eina_List *list = NULL; + Evas_Object *gridbox = obj; + retif(gridbox == NULL, , "invalid parameter"); + + info_layout *info_layout_portrait = evas_object_data_get(gridbox, + E_DATA_LAYOUT_PORTRAIT); + info_layout *info_layout_landscape = evas_object_data_get(gridbox, + E_DATA_LAYOUT_LANDSCAPE); + + list = _position_info_get(gridbox); + _position_info_clear(list); + _position_info_set(gridbox, NULL); + + quickpanel_settings_gridbox_item_remove_all(gridbox); + evas_object_data_del(gridbox, E_DATA_LAYOUT_PORTRAIT); + evas_object_data_del(gridbox, E_DATA_LAYOUT_LANDSCAPE); + + if (info_layout_portrait != NULL) { + free(info_layout_portrait); + } + if (info_layout_landscape != NULL) { + free(info_layout_landscape); + } +} + +HAPI Evas_Object *quickpanel_settings_gridbox_create(Evas_Object *parent, void *data) +{ + retif(parent == NULL, NULL, "invalid parameter"); + retif(data == NULL, NULL, "invalid parameter"); + struct appdata *ad = data; + Evas_Object *gridbox = NULL; + + info_layout *info_layout_portrait = NULL; + info_layout *info_layout_landscape = NULL; + + info_layout_portrait = (info_layout *) calloc(1, + sizeof(info_layout)); + retif(info_layout_portrait == NULL, NULL, "memory allocation failed"); + info_layout_portrait->padding_between_h = 2 * ad->scale; + info_layout_portrait->padding_between_v = 1 * ad->scale; + info_layout_portrait->padding_top = 0; + info_layout_portrait->padding_left = 1; + info_layout_portrait->padding_bottom = 0; + info_layout_portrait->n_per_rows = 8; + info_layout_portrait->child_w = 0; + + info_layout_portrait->child_h = QP_SETTING_ICON_MIN_WH_WVGA * ad->scale; + + info_layout_portrait->limit_w = ad->win_width; + info_layout_portrait->scale = ad->scale; + + info_layout_landscape = (info_layout *) calloc(1, sizeof(info_layout)); + if (info_layout_landscape == NULL) { + free(info_layout_portrait); + ERR("memory allocation failed"); + return NULL; + } + info_layout_landscape->padding_between_h = 2 * ad->scale; + info_layout_landscape->padding_between_v = 1 * ad->scale; + info_layout_landscape->padding_top = 0; + info_layout_landscape->padding_left = 1; + info_layout_landscape->padding_bottom = 0; + info_layout_landscape->n_per_rows = 10; + info_layout_landscape->child_w = 0; + + info_layout_landscape->child_h = QP_SETTING_ICON_MIN_WH_WVGA * ad->scale; + + info_layout_landscape->limit_w = ad->win_height; + info_layout_landscape->scale = ad->scale; + + gridbox = elm_box_add(parent); + evas_object_size_hint_weight_set(gridbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(gridbox, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(gridbox, EINA_TRUE); + + elm_box_layout_set(gridbox, _layout_cb, gridbox, NULL); + + evas_object_data_set(gridbox, E_DATA_LAYOUT_PORTRAIT, info_layout_portrait); + evas_object_data_set(gridbox, E_DATA_LAYOUT_LANDSCAPE, info_layout_landscape); + evas_object_event_callback_add(gridbox, EVAS_CALLBACK_DEL, _deleted_cb, NULL); + + evas_object_show(gridbox); + + return gridbox; +} + +HAPI void quickpanel_settings_gridbox_remove(Evas_Object *gridbox) +{ + retif(gridbox == NULL, , "invalid parameter"); + + quickpanel_settings_gridbox_item_remove_all(gridbox); + evas_object_del(gridbox); + gridbox = NULL; +} + +HAPI void quickpanel_settings_gridbox_item_add(Evas_Object *gridbox, Evas_Object *item, const char *item_type, int is_prepend) +{ + evas_object_data_set(item, E_DATA_ITEM_TYPE, item_type); + + if (is_prepend == SETTINGS_GRIDBOX_PREPEND) { + elm_box_pack_start(gridbox, item); + } else { + elm_box_pack_end(gridbox, item); + } +} + +HAPI void quickpanel_settings_gridbox_item_remove(Evas_Object *gridbox, Evas_Object *item) +{ + retif(gridbox == NULL, , "invalid parameter"); + retif(item == NULL, , "invalid parameter"); + + elm_box_unpack(gridbox, item); + evas_object_del(item); + item = NULL; +} + +HAPI void quickpanel_settings_gridbox_item_remove_all(Evas_Object *gridbox) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj = NULL; + Eina_List *item_list = NULL; + + retif(gridbox == NULL, , "invalid parameter"); + + item_list = elm_box_children_get(gridbox); + retif(item_list == NULL, , "invalid parameter"); + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj != NULL) { + quickpanel_settings_gridbox_item_remove(gridbox, obj); + } + } + + eina_list_free(item_list); +} + +HAPI void quickpanel_settings_gridbox_rotation(Evas_Object *gridbox, int angle) +{ + const char *signal = NULL; + + retif(gridbox == NULL, , "invalid parameter"); + + info_layout *info_layout_portrait = evas_object_data_get(gridbox, + E_DATA_LAYOUT_PORTRAIT); + info_layout *info_layout_landscape = evas_object_data_get(gridbox, + E_DATA_LAYOUT_LANDSCAPE); + + retif(info_layout_portrait == NULL || info_layout_landscape == NULL, , + "gridbox is crashed"); + + Eina_List *l; + Eina_List *l_next; + Evas_Object *obj; + Eina_List *item_list = elm_box_children_get(gridbox); + retif(item_list == NULL, , "invalid parameter"); + + if (angle == 270 || angle == 90) { + signal = "icon.landscape"; + } else { + signal = "icon.portrait"; + } + + EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj) { + if (obj != NULL) { + elm_object_signal_emit(obj, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(obj)); + } + } +} + +HAPI int quickpanel_settings_gridbox_item_count_get(Evas_Object *gridbox) +{ + int item_count = 0; + Eina_List *items = NULL; + retif(gridbox == NULL, 0, "invalid parameter"); + + if ((items = elm_box_children_get(gridbox)) != NULL) { + item_count = eina_list_count(items); + eina_list_free(items); + return item_count; + } else { + return 0; + } +} + +HAPI int quickpanel_settings_gridbox_item_index_get(Evas_Object *gridbox, int touch_x, int touch_y) +{ + Eina_List *l; + Eina_List *l_next; + Eina_List *list_pos_info = NULL; + info_position *pos_info = NULL; + int x = 0, y = 0, w = 0, h = 0; + + evas_object_geometry_get(gridbox, &x, &y, &w, &h); + list_pos_info = _position_info_get(gridbox); + + if (touch_x >= x && touch_x <= x + w && touch_y >= y && touch_y <= y + h) { + touch_x = touch_x - x; + touch_y = touch_y - y; + EINA_LIST_FOREACH_SAFE(list_pos_info, l, l_next, pos_info) { + if (pos_info != NULL) { + if (touch_x >= pos_info->offset_x && touch_x <= pos_info->offset_x + pos_info->width + && touch_y >= pos_info->offset_y && touch_y <= pos_info->offset_y + pos_info->height) { + return pos_info->index; + } + } + } + } + return -1; +} + +HAPI void quickpanel_settings_gridbox_unpack_all(Evas_Object *gridbox) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *node = NULL; + Eina_List *list = NULL; + retif(gridbox == NULL, , "invalid parameter"); + + list = elm_box_children_get(gridbox); + retif(list == NULL, , "empty list"); + + elm_box_unpack_all(gridbox); + + EINA_LIST_FOREACH_SAFE(list, l, l_next, node) { + if (node != NULL) { + if (_item_is_icon(node) == 0) { + evas_object_del(node); + node = NULL; + } + } + } + + eina_list_free(list); +} diff --git a/daemon/settings/settings_gridbox.h b/daemon/settings/settings_gridbox.h new file mode 100644 index 0000000..3550e88 --- /dev/null +++ b/daemon/settings/settings_gridbox.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __QUICKPANEL_SETTINGS_GRIDBOX_H__ +#define __QUICKPANEL_SETTINGS_GRIDBOX_H__ + +#define SETTINGS_GRIDBOX_PREPEND 1 +#define SETTINGS_GRIDBOX_APPEND 0 +#define SETTINGS_GRIDBOX_ITEM_ICON "item_icon" +#define SETTINGS_GRIDBOX_ITEM_DIVIDER "item_divider" + +Evas_Object *quickpanel_settings_gridbox_create(Evas_Object *parent, void *data); +void quickpanel_settings_gridbox_remove(Evas_Object *gridbox); +void quickpanel_settings_gridbox_item_add(Evas_Object *gridbox, Evas_Object *item, const char *item_type, int is_prepend); +void quickpanel_settings_gridbox_item_remove(Evas_Object *gridbox, Evas_Object *item); +void quickpanel_settings_gridbox_item_remove_all(Evas_Object *gridbox); +void quickpanel_settings_gridbox_rotation(Evas_Object *gridbox, int angle); +int quickpanel_settings_gridbox_item_count_get(Evas_Object *gridbox); +int quickpanel_settings_gridbox_item_index_get(Evas_Object *gridbox, int touch_x, int touch_y); +void quickpanel_settings_gridbox_unpack_all(Evas_Object *gridbox); +#endif diff --git a/daemon/settings/settings_icon_common.c b/daemon/settings/settings_icon_common.c new file mode 100644 index 0000000..a29b7fa --- /dev/null +++ b/daemon/settings/settings_icon_common.c @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include "quickpanel-ui.h" +#include "quickpanel_def.h" +#include "common.h" +#include "modules.h" +#include "settings.h" +#include "setting_utils.h" +#include "setting_module_api.h" +#include "accessibility.h" +#include "configuration.h" +#include "pager_common.h" + +#define E_DATA_ICON_CLICKED_CB "clicked_cb" +#define E_DATA_ICON_ORIGINAL_OBJ "original_obj" + +static struct _info { + int down_x; + Eina_Bool is_longpressed; + Ecore_Timer *timer_longpress; +} s_info = { + .down_x = 0, + .is_longpressed = EINA_FALSE, + .timer_longpress = NULL, +}; + +static Eina_Bool _icon_handler_longpress(void *data) +{ + DBG(""); + Evas_Object *obj = data; + QP_Module_Setting *module = NULL; + retif(obj == NULL, ECORE_CALLBACK_CANCEL, "invalid argument"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, ECORE_CALLBACK_CANCEL, "application data is NULL"); + + quickpanel_media_play_feedback(); + + ecore_timer_del(s_info.timer_longpress); + s_info.timer_longpress = NULL; + s_info.is_longpressed = EINA_TRUE; + + module = evas_object_data_get(obj, E_DATA_MODULE_INFO); + if (module != NULL) { + if (module->handler_longpress != NULL) { + if (module->name) { + DBG("launch setting menu of %s", module->name); + } + module->handler_longpress(obj); + + elm_object_signal_emit(obj, "mouse,up,1", "background.super"); + } + } + + return ECORE_CALLBACK_CANCEL; +} + +static void _icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, + void *event_info) +{ + int down_x = 0; + retif(obj == NULL, , "invalid argument"); + + quickpanel_page_get_touched_pos(&down_x, NULL); + + if (s_info.down_x - down_x > 15 || s_info.down_x - down_x < -15) { + if (s_info.timer_longpress != NULL) { + ecore_timer_del(s_info.timer_longpress); + s_info.timer_longpress = NULL; + } + } +} + +static void _icon_mouse_up_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + retif(obj == NULL, , "invalid argument"); + + if (s_info.timer_longpress != NULL) { + ecore_timer_del(s_info.timer_longpress); + s_info.timer_longpress = NULL; + s_info.is_longpressed = EINA_FALSE; + } + + evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, + _icon_mouse_move_cb); +} + +static void _icon_mouse_down_cb(void *data, Evas_Object *obj, + const char *emission, const char *source) +{ + retif(obj == NULL, , "invalid argument"); + + if (s_info.timer_longpress != NULL) { + ecore_timer_del(s_info.timer_longpress); + s_info.timer_longpress = NULL; + } + + quickpanel_page_get_touched_pos(&(s_info.down_x), NULL); + + s_info.is_longpressed = EINA_FALSE; + s_info.timer_longpress = ecore_timer_add( + quickpanel_conf_longpress_time_get(), + _icon_handler_longpress, obj); + + evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE, + _icon_mouse_move_cb, NULL); +} + +#ifdef QP_SCREENREADER_ENABLE +static void +_icon_focus_clicked_cb(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *icon = NULL; + Edje_Signal_Cb func = NULL; + retif(obj == NULL, , "invalid argument"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, , "application data is NULL"); + + if (s_info.timer_longpress != NULL) { + ecore_timer_del(s_info.timer_longpress); + s_info.timer_longpress = NULL; + } + + if (s_info.is_longpressed != EINA_TRUE) { + quickpanel_media_play_feedback(); + } + + icon = evas_object_data_get(obj, E_DATA_ICON_ORIGINAL_OBJ); + if (icon != NULL) { + func = evas_object_data_get(icon, E_DATA_ICON_CLICKED_CB); + + if (func != NULL && s_info.is_longpressed != EINA_TRUE) { + func(data, icon, "mouse,clicked,1", "background.super"); + } + } +} + +static void +_icon_focus_clicked_cb_without_feedback(void *data, Evas_Object *obj, void *event_info) +{ + Evas_Object *icon = NULL; + Edje_Signal_Cb func = NULL; + retif(obj == NULL, , "invalid argument"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, , "application data is NULL"); + + if (s_info.timer_longpress != NULL) { + ecore_timer_del(s_info.timer_longpress); + s_info.timer_longpress = NULL; + } + + icon = evas_object_data_get(obj, E_DATA_ICON_ORIGINAL_OBJ); + if (icon != NULL) { + func = evas_object_data_get(icon, E_DATA_ICON_CLICKED_CB); + + if (func != NULL && s_info.is_longpressed != EINA_TRUE) { + func(data, icon, "mouse,clicked,1", "background.super"); + } + } +} +#endif + +HAPI int quickpanel_setting_icon_click_cb_add(Evas_Object *icon, + Edje_Signal_Cb func, void *data) +{ + retif(icon == NULL, QP_FAIL, "invalid parameter"); + retif(func == NULL, QP_FAIL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, QP_FAIL, "application data is NULL"); + + elm_object_signal_callback_add(icon, "mouse,up,1", "background.super", _icon_mouse_up_cb, data); + elm_object_signal_callback_add(icon, "mouse,down,1", "background.super", _icon_mouse_down_cb, data); + + evas_object_data_set(icon, E_DATA_ICON_CLICKED_CB, func); + +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = NULL; + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + evas_object_smart_callback_add(ao, "clicked", + _icon_focus_clicked_cb, data); + evas_object_data_set(ao, E_DATA_ICON_ORIGINAL_OBJ, icon); + } +#endif + + return 0; +} + +HAPI int quickpanel_setting_icon_click_cb_without_feedback_add(Evas_Object *icon, + Edje_Signal_Cb func, void *data) +{ + retif(icon == NULL, QP_FAIL, "invalid parameter"); + retif(func == NULL, QP_FAIL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, QP_FAIL, "application data is NULL"); + + elm_object_signal_callback_add(icon, "mouse,up,1", "background.super", _icon_mouse_up_cb, data); + elm_object_signal_callback_add(icon, "mouse,down,1", "background.super", _icon_mouse_down_cb, data); + + evas_object_data_set(icon, E_DATA_ICON_CLICKED_CB, func); + +#ifdef QP_SCREENREADER_ENABLE + Evas_Object *ao = NULL; + ao = quickpanel_accessibility_screen_reader_object_get(icon, + SCREEN_READER_OBJ_TYPE_ELM_OBJECT, "focus", icon); + if (ao != NULL) { + evas_object_smart_callback_add(ao, "clicked", + _icon_focus_clicked_cb_without_feedback, data); + evas_object_data_set(ao, E_DATA_ICON_ORIGINAL_OBJ, icon); + } +#endif + + return 0; +} + +HAPI int quickpanel_setting_icon_click_cb_del(Evas_Object *icon, Edje_Signal_Cb func) +{ + retif(icon == NULL, QP_FAIL, "invalid parameter"); + retif(func == NULL, QP_FAIL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, QP_FAIL, "application data is NULL"); + + elm_object_signal_callback_del(icon, "mouse,clicked,1", "background.super", func); + + return QP_OK; +} + +HAPI void quickpanel_setting_icon_handler_longpress(const char *pkgname, void *data) +{ + int ret; + + ret = quickpanel_uic_launch_ug_by_appcontrol(pkgname, data); + quickpanel_uic_launch_app_inform_result(pkgname, ret); + quickpanel_uic_close_quickpanel(true, 1); +} + diff --git a/daemon/settings/settings_icon_common.h b/daemon/settings/settings_icon_common.h new file mode 100644 index 0000000..f9ed1ee --- /dev/null +++ b/daemon/settings/settings_icon_common.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __SETTING_ICON_COMMON_H__ +#define __SETTING_ICON_COMMON_H__ + +int quickpanel_setting_icon_click_cb_add(Evas_Object *icon, + Edje_Signal_Cb func, void *data); +int quickpanel_setting_icon_click_cb_without_feedback_add(Evas_Object *icon, + Edje_Signal_Cb func, void *data); +int quickpanel_setting_icon_click_cb_del(Evas_Object *icon, Edje_Signal_Cb func); +void quickpanel_setting_icon_handler_longpress(const char *pkgname, void *data); + +#endif /* __SETTING_ICON_COMMON_H__ */ diff --git a/daemon/settings/settings_ipc.c b/daemon/settings/settings_ipc.c new file mode 100644 index 0000000..3cf0f8b --- /dev/null +++ b/daemon/settings/settings_ipc.c @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <glib.h> +#include "quickpanel-ui.h" +#include "quickpanel_def.h" +#include "common.h" +#include "modules.h" +#include "settings.h" +#include "setting_utils.h" +#include "settings_view_all.h" +#include "settings_view_featured.h" + +static struct _info { + E_DBus_Signal_Handler *hdl_activity; + E_DBus_Signal_Handler *hdl_editing; +} s_info = { + .hdl_activity = NULL, + .hdl_editing = NULL, +}; + +static void _handler_activity(void *data, DBusMessage *msg) +{ + int ret = 0; + DBusError err; + char *module = NULL; + char *command = NULL; + QP_Module_Setting *mod = NULL; + retif(data == NULL || msg == NULL, , "Invalid parameter!"); + + dbus_error_init(&err); + ret = dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &module, + DBUS_TYPE_STRING, &command, + DBUS_TYPE_INVALID); + retif(ret == 0, , "dbus_message_get_args error"); + retif(module == NULL, , "Failed to get module"); + retif(command == NULL, , "Failed to get command"); + + if (dbus_error_is_set(&err)) { + ERR("Dbus err: %s", err.message); + dbus_error_free(&err); + return; + } + + mod = quickpanel_settings_module_get_by_name(module); + if (mod != NULL) { + DBG("module:%s, command:%s", module, command); + if (mod->handler_ipc != NULL) { + if (mod->is_loaded == EINA_TRUE && mod->loader != NULL) { + mod->handler_ipc(command, mod); + } else { + ERR("module:%s isn't loaded"); + } + } else { + ERR("module:%s don't have IPC handler"); + } + } else { + ERR("failed to lookup module:%s", module); + } +} + +static void _handler_editing(void *data, DBusMessage *msg) +{ + int i = 0; + int ret = 0, is_error = 0; + DBusError err; + char *key = NULL; + char *order = NULL; + int num_featured = 0; + int order_count = 0; + gchar **order_split = NULL; + Eina_List *list_active = NULL; + QP_Module_Setting *mod = NULL; + retif(data == NULL || msg == NULL, , "Invalid parameter!"); + + dbus_error_init(&err); + ret = dbus_message_get_args(msg, &err, + DBUS_TYPE_STRING, &key, + DBUS_TYPE_STRING, &order, + DBUS_TYPE_INT32, &num_featured, + DBUS_TYPE_INVALID); + retif(ret == 0, , "dbus_message_get_args error"); + retif(key == NULL, , "Failed to get key"); + retif(order == NULL, , "Failed to get value"); + + if (dbus_error_is_set(&err)) { + ERR("dbus err: %s", err.message); + dbus_error_free(&err); + return; + } + + if (strcmp(key, "quicksetting_order") == 0) { + DBG("order:%s %d", order, num_featured); + if (quickpanel_settings_featured_list_validation_check(order) == 1) { + order_split = g_strsplit(order, ",", 0); + if (order_split != NULL) { + order_count = g_strv_length(order_split); + DBG("count of quicksettings:%d", order_count); + + for (i = 0; i < order_count; i++) { + mod = quickpanel_settings_module_get_by_name(order_split[i]); + if (mod != NULL && mod->init != NULL) { + list_active = eina_list_append (list_active, mod); + } else { + ERR("failed to get quicksetting:%s", order_split[i]); + is_error = 1; + } + } + + if (is_error == 0) { + if (list_active != NULL) { + quickpanel_setting_view_featured_reload(list_active, num_featured); + quickpanel_setting_view_all_reload(list_active); + quickpanel_setting_save_list_to_file(list_active, num_featured); + eina_list_free(list_active); + } + } + g_strfreev(order_split); + } + } else { + ERR("setting order validation check failed, igonore this signal"); + } + } +} + +static void _settings_ipc_init(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->dbus_connection == NULL, , "Invalid parameter!"); + + s_info.hdl_activity = + e_dbus_signal_handler_add(ad->dbus_connection, NULL, + QP_DBUS_PATH, + QP_DBUS_NAME, + QS_DBUS_SIG_ACTIVITY, + _handler_activity, ad); + msgif(s_info.hdl_activity == NULL, "fail to add size signal"); + + s_info.hdl_editing = + e_dbus_signal_handler_add(ad->dbus_connection, NULL, + QP_DBUS_PATH, + QP_DBUS_NAME, + QS_DBUS_SIG_EDITING, + _handler_editing, ad); + msgif(s_info.hdl_editing == NULL, "fail to add size signal"); +} + +static void _settings_ipc_fini(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + retif(ad->dbus_connection == NULL, , "Invalid parameter!"); + + if (s_info.hdl_activity != NULL) { + e_dbus_signal_handler_del(ad->dbus_connection, + s_info.hdl_activity); + s_info.hdl_activity = NULL; + } + + if (s_info.hdl_editing != NULL) { + e_dbus_signal_handler_del(ad->dbus_connection, + s_info.hdl_editing); + s_info.hdl_editing = NULL; + } +} + + +/***************************************************************************** + * + * Util functions + * + *****************************************************************************/ +HAPI int quickpanel_settings_ipc_init(void *data) +{ + _settings_ipc_init(data); + + return QP_OK; +} + +HAPI int quickpanel_settings_ipc_fini(void *data) +{ + _settings_ipc_fini(data); + + return QP_OK; +} diff --git a/daemon/settings/settings_ipc.h b/daemon/settings/settings_ipc.h new file mode 100644 index 0000000..e496cab --- /dev/null +++ b/daemon/settings/settings_ipc.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __SETTING_IPC_H__ +#define __SETTING_IPC_H__ + +int quickpanel_settings_ipc_init(void *data); +int quickpanel_settings_ipc_fini(void *data); + +#endif /* __SETTING_IPC_H__ */ diff --git a/daemon/settings/settings_view_all.c b/daemon/settings/settings_view_all.c new file mode 100644 index 0000000..2138f1d --- /dev/null +++ b/daemon/settings/settings_view_all.c @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <glib.h> +#include <notification.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "quickpanel_def.h" +#include "modules.h" +#include "preference.h" +#include "settings.h" +#include "setting_utils.h" +#include "settings_gridbox.h" +#include "setting_module_api.h" +#include "pager_common.h" +#include "page_setting_all.h" +#include "accessibility.h" +#include "configuration.h" +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif + +static int _init(void *data); +static int _fini(void *data); +static int _resume(void *data); +static void _opened(void *data); +static void _closed(void *data); +static void _refresh(void *data); +static void _view_icons_add(void); +static void _view_icons_del(void); + +QP_Module settings_view_all = { + .name = "settings_view_all", + .init = _init, + .fini = _fini, + .resume = _resume, + .qp_opened = _opened, + .qp_closed = _closed, + .refresh = _refresh, + .lang_changed = NULL, +}; + +static int _icons_rotation_set(int angle) +{ + Evas_Object *icon = NULL; + Eina_List *icons = NULL; + Evas_Object *section = NULL; + Eina_List *l = NULL; + const char *signal = NULL; + + retif(angle < 0, -1, "angle is %d", angle); + + section = quickpanel_page_setting_all_view_get("ACTIVE.BUTTONS"); + retif(!section, -1, "box is NULL"); + + icons = elm_box_children_get(section); + retif(!icons, -1, "icons list is NULL"); + + if (angle % 180 == 0) { + signal = "icon.portrait"; + } else { + signal = "icon.landscape"; + } + + EINA_LIST_FOREACH(icons, l, icon) { + elm_object_signal_emit(icon, signal, "quickpanl.prog"); + edje_object_message_signal_process(_EDJ(icon)); + } + + eina_list_free(icons); + + return 0; +} + +static Evas_Object *_icon_create(QP_Module_Setting *module, Evas_Object *parent) { + retif(module == NULL, NULL, "Invalid parameter!"); + retif(parent == NULL, NULL, "Invalid parameter!"); + + return quickpanel_setting_module_icon_create(module, parent); +} + +static Evas_Object *_divider_create(Evas_Object *parent) { + Evas_Object *divider = NULL; + retif(parent == NULL, NULL, "invalid parameter"); + + struct appdata *ad = (struct appdata*)quickpanel_get_app_data(); + retif(ad == NULL, NULL, "application data is NULL"); + + divider = quickpanel_uic_load_edj(parent, DEFAULT_EDJ, "quickpanel/setting_icon_divider", 0); + + retif(divider == NULL, NULL, "failed to load divider"); + + return divider; +} + +static void _icon_pack(Evas_Object *gridbox, Evas_Object *icon, int need_divider) +{ + Evas_Object *divider = NULL; + retif(gridbox == NULL, , "Invalid parameter!"); + retif(icon == NULL, , "Invalid parameter!"); + + quickpanel_settings_gridbox_item_add(gridbox, icon, SETTINGS_GRIDBOX_ITEM_ICON, SETTINGS_GRIDBOX_APPEND); + + if (need_divider == 1) { + divider = _divider_create(gridbox); + if (divider != NULL) { + quickpanel_settings_gridbox_item_add(gridbox, divider, + SETTINGS_GRIDBOX_ITEM_DIVIDER, SETTINGS_GRIDBOX_APPEND); + } + } +} + +static void _view_icons_add() +{ + int index = 0, total = 0; + Eina_List *l; + Eina_List *l_next; + Evas_Object *gridbox = NULL; + Evas_Object *icon = NULL; + QP_Module_Setting *module = NULL; + Eina_List *list_all_icon = NULL; + Evas_Object *layout = quickpanel_page_setting_all_view_get("LAYOUT"); + retif(layout == NULL, , "Invalid parameter!"); + + quickpanel_settings_all_list_get(&list_all_icon); + retif(list_all_icon == NULL, , "Invalid parameter!"); + + gridbox = quickpanel_page_setting_all_view_get("ACTIVE.BUTTONS"); + if (gridbox == NULL) { + gridbox = quickpanel_settings_gridbox_create(layout, quickpanel_get_app_data()); + quickpanel_page_setting_all_view_set("ACTIVE.BUTTONS", gridbox); + } + + total = eina_list_count(list_all_icon); + DBG("total:%d", total); + EINA_LIST_FOREACH_SAFE(list_all_icon, l, l_next, module) { + icon = _icon_create(module, gridbox); + if (icon != NULL) { + _icon_pack(gridbox, icon, (index != total - 1) ? 1 : 0); + quickpanel_setting_module_icon_add(module, icon, QP_SETTING_ICON_CONTAINER_ALL_LIST); + quickpanel_setting_module_icon_status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + } + DBG("all list:%s", module->name); + index++; + } + + eina_list_free(list_all_icon); +} + +static void _view_icons_del(void) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *icon = NULL; + QP_Module_Setting *module = NULL; + Eina_List *list_icons = NULL; + Evas_Object *box = quickpanel_page_setting_all_view_get("ACTIVE.BUTTONS"); + retif(box == NULL, , "Invalid parameter!"); + + list_icons = elm_box_children_get(box); + + EINA_LIST_FOREACH_SAFE(list_icons, l, l_next, icon) { + module = quickpanel_setting_module_get_from_icon(icon); + quickpanel_setting_module_icon_remove(module, icon); + elm_box_unpack(box, icon); + if (icon != NULL) { + evas_object_del(icon); + icon = NULL; + } + } + + eina_list_free(list_icons); +} + +static int _view_create(void *data) +{ + _view_icons_add(); + + return QP_OK; +} + +static int _view_destroy(void *data) +{ + _view_icons_del(); + + return QP_OK; +} + +/***************************************************************************** + * + * Util functions + * + *****************************************************************************/ +static int _init(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + _view_create(data); + + return QP_OK; +} + +static int _fini(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + _view_destroy(ad); + + return QP_OK; +} + +static int _resume(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + return QP_OK; +} + +static void _opened(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); +} + +static void _closed(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); +} + +static void _refresh(void *data) { + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + _icons_rotation_set(ad->angle); +} + +HAPI void quickpanel_setting_view_all_reload(Eina_List *list_all_module) +{ + int index = 0, total = 0; + Eina_List *l; + Eina_List *l_next; + Evas_Object *gridbox = NULL; + Evas_Object *icon = NULL; + QP_Module_Setting *module = NULL; + retif(list_all_module == NULL, , "Invalid parameter!"); + + gridbox = quickpanel_page_setting_all_view_get("ACTIVE.BUTTONS"); + retif(gridbox == NULL, , "Invalid parameter!"); + + quickpanel_settings_gridbox_unpack_all(gridbox); + + total = eina_list_count(list_all_module); + DBG("total:%d", total); + EINA_LIST_FOREACH_SAFE(list_all_module, l, l_next, module) { + if ((icon = quickpanel_setting_module_icon_get(module, + QP_SETTING_ICON_CONTAINER_ALL_LIST)) == NULL) { + icon = _icon_create(module, gridbox); + } + if (icon != NULL) { + _icon_pack(gridbox, icon, (index != total - 1) ? 1 : 0); + quickpanel_setting_module_icon_add(module, icon, QP_SETTING_ICON_CONTAINER_ALL_LIST); + quickpanel_setting_module_icon_status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + } + DBG("all list:%s", module->name); + index++; + } +} diff --git a/daemon/settings/settings_view_all.h b/daemon/settings/settings_view_all.h new file mode 100644 index 0000000..7232a7f --- /dev/null +++ b/daemon/settings/settings_view_all.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __SETTING_VIEW_ALL_H__ +#define __SETTING_VIEW_ALL_H__ + +void qp_setting_view_all_reload(Eina_List *list_all_module); + +#endif /* __SETTING_VIEW_ALL_H__ */ diff --git a/daemon/settings/settings_view_featured.c b/daemon/settings/settings_view_featured.c new file mode 100644 index 0000000..16f8b89 --- /dev/null +++ b/daemon/settings/settings_view_featured.c @@ -0,0 +1,390 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <glib.h> +#include <notification.h> +#include <efl_assist.h> +#include "common.h" +#include "quickpanel-ui.h" +#include "quickpanel_def.h" +#include "modules.h" +#include "preference.h" +#include "settings.h" +#include "setting_utils.h" +#include "settings_gridbox.h" +#include "setting_module_api.h" +#include "settings_view_featured.h" +#include "pager_common.h" +#include "accessibility.h" +#include "configuration.h" +#ifdef QP_EMERGENCY_MODE_ENABLE +#include "emergency_mode.h" +#endif + +static int _init(void *data); +static void _init_job_cb(void *data); +static int _fini(void *data); +static int _resume(void *data); +static void _opened(void *data); +static void _closed(void *data); +static void _refresh(void *data); +static void _lang_changed(void *data); + +QP_Module settings_view_featured = { + .name = "settings_view_featured", + .init = _init, + .init_job_cb = _init_job_cb, + .fini = _fini, + .resume = _resume, + .qp_opened = _opened, + .qp_closed = _closed, + .refresh = _refresh, + .lang_changed = _lang_changed, +}; + +static void _view_layout_create_with_scroller(void *data) +{ + Evas_Object *scroller = NULL; + Evas_Object *box = NULL; + Evas_Object *container = NULL; + struct appdata *ad = data; + retif(!ad->ly, , "layout is NULL!"); + + container = quickpanel_uic_load_edj(ad->ly, DEFAULT_EDJ, "quickpanel/setting_container_wvga", 0); + + retif(container == NULL, , "failed to load container"); + + scroller = elm_scroller_add(container); + retif(!scroller, , "fail to add scroller"); + elm_object_style_set(scroller, "effect"); + elm_scroller_bounce_set(scroller, EINA_TRUE, EINA_FALSE); + elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_movement_block_set(scroller, ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL); + + box = elm_box_add(scroller); + if (!box) { + ERR("fail to add box"); + if (scroller != NULL) { + evas_object_del(scroller); + scroller = NULL; + } + if (container != NULL) { + evas_object_del(container); + container = NULL; + } + return; + } + + elm_object_style_set(box, "effect"); + + evas_object_size_hint_weight_set(box, 0.0 , EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_show(box); + + elm_object_content_set(scroller, box); + + elm_object_part_content_set(container, QP_SETTING_SCROLLER_PART_WVGA, scroller); + + quickpanel_setting_layout_set(ad->ly, container); +} + + +static void _view_layout_create(void *data) +{ + Evas_Object *box = NULL; + Evas_Object *container = NULL; + struct appdata *ad = data; + retif(!ad->ly, , "layout is NULL!"); + + container = quickpanel_uic_load_edj(ad->ly, DEFAULT_EDJ, "quickpanel/setting_container_wvga", 0); + + retif(container == NULL, , "failed to load container"); + + box = elm_box_add(container); + if (!box) { + if (container != NULL) { + evas_object_del(container); + container = NULL; + } + return; + } + + elm_object_style_set(box, "effect"); + + evas_object_size_hint_weight_set(box, 0.0 , EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_horizontal_set(box, EINA_TRUE); + evas_object_show(box); + + elm_object_part_content_set(container, QP_SETTING_SCROLLER_PART_WVGA, box); + + quickpanel_setting_layout_set(ad->ly, container); +} + +static void _view_icons_add(void *data) +{ + int index = 0, total = 0; + Eina_List *l; + Eina_List *l_next; + Evas_Object *icon = NULL; + QP_Module_Setting *module = NULL; + Eina_List *list_featured_icon = NULL; + struct appdata *ad = (struct appdata *)data; + Evas_Object *box = quickpanel_setting_box_get(ad->ly); + retif(box == NULL, , "Invalid parameter!"); + + quickpanel_settings_featured_list_get(&list_featured_icon); + retif(list_featured_icon == NULL, , "Invalid parameter!"); + + total = eina_list_count(list_featured_icon); + EINA_LIST_FOREACH_SAFE(list_featured_icon, l, l_next, module) { + icon = quickpanel_setting_module_icon_create(module, box); + quickpanel_setting_module_icon_add(module, icon, QP_SETTING_ICON_CONTAINER_FEATURED); + quickpanel_setting_icon_pack(box, icon, (index == total - 1) ? 0 : 1); + quickpanel_setting_module_icon_status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + index++; + } + + eina_list_free(list_featured_icon); +} + +static void _view_icons_del(void *data) +{ + Eina_List *l; + Eina_List *l_next; + Evas_Object *icon = NULL; + QP_Module_Setting *module = NULL; + Eina_List *list_featured_icon = NULL; + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, , "Invalid parameter!"); + Evas_Object *box = quickpanel_setting_box_get(ad->ly); + retif(box == NULL, , "Invalid parameter!"); + list_featured_icon = elm_box_children_get(box); + + EINA_LIST_FOREACH_SAFE(list_featured_icon, l, l_next, icon) { + module = quickpanel_setting_module_get_from_icon(icon); + quickpanel_setting_module_icon_remove(module, icon); + elm_box_unpack(box, icon); + if (icon != NULL) { + evas_object_del(icon); + icon = NULL; + } + } + + eina_list_free(list_featured_icon); +} + +/***************************************************************************** + * + * Util functions + * + *****************************************************************************/ +static int _init(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + +#ifdef QP_EMERGENCY_MODE_ENABLE + if (quickpanel_emergency_mode_is_on()) { + elm_object_signal_emit(ad->ly, "quickpanel.setting.hide", "quickpanel.prog"); + return QP_OK; + } +#endif + + _view_layout_create(data); + _view_icons_add(data); + + elm_object_signal_emit(ad->ly, "quickpanel.setting.show", "quickpanel.prog"); + + return QP_OK; +} + +static void _init_job_cb(void *data) +{ + struct appdata *ad = data; + Evas_Object *scroller = NULL; + retif(ad == NULL, , "Invalid parameter!"); + + quickpanel_setting_set_scroll_page_width(ad); + quickpanel_setting_stop(ad->ly, 0); + scroller = quickpanel_setting_scroller_get(ad->ly); + evas_object_show(scroller); +} + +static int _fini(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + _view_icons_del(ad); + quickpanel_setting_layout_remove(ad->ly); + elm_object_signal_emit(ad->ly, "quickpanel.setting.hide", "quickpanel.prog"); + + return QP_OK; +} + +static int _resume(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + return QP_OK; +} + +static void _opened(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + quickpanel_setting_view_featured_initial_focus_set(); +} + +static void _closed(void *data) +{ + struct appdata *ad = data; + Evas_Object *focused_obj = NULL; + retif(ad == NULL, , "Invalid parameter!"); + + quickpanel_setting_stop(ad->ly, 0); + + if (ad->win != NULL) { + focused_obj = elm_object_focused_object_get(ad->win); + if (focused_obj != NULL) { + elm_object_focus_set(focused_obj, EINA_FALSE); + } + } +} + +static void _refresh(void *data) { + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + quickpanel_setting_container_rotation_set(ad->ly, ad->angle); + quickpanel_setting_icons_rotation_set(ad->ly, ad->angle); + if (ad->is_opened == 0) { + quickpanel_setting_stop(ad->ly, 1); + } +} + +static void _lang_changed(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (ad->is_opened == 0) { + quickpanel_setting_stop(ad->ly, 0); + } +} + +HAPI Eina_Bool quickpanel_settings_is_in_left_edge(void) +{ + if (quickpanel_setting_scroll_page_get(quickpanel_get_app_data()) == 0) { + return EINA_TRUE; + } + + return EINA_FALSE; +} + +HAPI void quickpanel_setting_view_featured_reload(Eina_List *list_all_module, int num_featured) +{ + int index = 0, total = 0; + Eina_List *l; + Eina_List *l_next; + Evas_Object *box = NULL; + Evas_Object *icon = NULL; + QP_Module_Setting *module = NULL; + struct appdata *ad = quickpanel_get_app_data(); + retif(list_all_module == NULL, , "Invalid parameter!"); + + box = quickpanel_setting_box_get(ad->ly); + retif(box == NULL, , "invalid parameter"); + + quickpanel_setting_icon_unpack_all(box); + + total = eina_list_count(list_all_module); + DBG("total:%d", total); + EINA_LIST_FOREACH_SAFE(list_all_module, l, l_next, module) { + if (index < num_featured) { + if ((icon = quickpanel_setting_module_icon_get(module, + QP_SETTING_ICON_CONTAINER_FEATURED)) == NULL) { + icon = quickpanel_setting_module_icon_create(module, box); + } + if (icon != NULL) { + quickpanel_setting_module_icon_add(module, icon, QP_SETTING_ICON_CONTAINER_FEATURED); + quickpanel_setting_icon_pack(box, icon, (index == num_featured - 1) ? 0 : 1); + quickpanel_setting_module_icon_status_update(module, FLAG_VALUE_VOID, FLAG_VALUE_VOID); + } + DBG("all list:%s", module->name); + } else { + if ((icon = quickpanel_setting_module_icon_get(module, + QP_SETTING_ICON_CONTAINER_FEATURED)) != NULL) { + quickpanel_setting_module_icon_remove(module, icon); + evas_object_del(icon); + icon = NULL; + } + } + + index++; + } +} + +HAPI void quickpanel_setting_view_featured_initial_focus_set(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "Invalid parameter!"); + + Evas_Object *obj_first = NULL; + Eina_List *list_featured_icon = NULL; + Evas_Object *box = quickpanel_setting_box_get(ad->ly); + retif(box == NULL, , "Invalid parameter!"); + +#ifdef QP_EMERGENCY_MODE_ENABLE + if (quickpanel_emergency_mode_is_on()) { + return; + } +#endif + + if (quickpanel_uic_opened_reason_get() == OPENED_BY_CMD_SHOW_SETTINGS) { + return; + } + + list_featured_icon = elm_box_children_get(box); + if (list_featured_icon != NULL) { + obj_first = eina_list_nth(list_featured_icon, 0); + if (obj_first != NULL) { + elm_object_focus_set(obj_first, EINA_FALSE); + elm_object_focus_set(obj_first, EINA_TRUE); + } + eina_list_free(list_featured_icon); + } +} + +HAPI void quickpanel_setting_view_featured_brightness_init(Evas_Object *brightness_view) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "Invalid parameter!"); + + Evas_Object *container = NULL; + + container = quickpanel_setting_layout_get(ad->ly, QP_SETTING_BASE_PART); + + retif(container == NULL, ,"Failed to get container"); + + elm_object_part_content_set(container, QP_SETTING_BRIGHTNESS_PART_WVGA, brightness_view); +} diff --git a/daemon/settings/settings_view_featured.h b/daemon/settings/settings_view_featured.h new file mode 100644 index 0000000..e1b5c3c --- /dev/null +++ b/daemon/settings/settings_view_featured.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __SETTING_VIEW_FEATURED_H__ +#define __SETTING_VIEW_FEATURED_H__ + +Eina_Bool quickpanel_settings_is_in_left_edge(void); +void quickpanel_setting_view_featured_reload(Eina_List *list_all_module, int num_featured); +void quickpanel_setting_view_featured_initial_focus_set(void); +void quickpanel_setting_view_featured_brightness_init(Evas_Object *brightness_view); + +#endif /* __SETTING_VIEW_FEATURED_H__ */ diff --git a/daemon/sim_controller.c b/daemon/sim_controller.c new file mode 100644 index 0000000..8302b45 --- /dev/null +++ b/daemon/sim_controller.c @@ -0,0 +1,769 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <Evas.h> +#include <Elementary.h> +#include <Eina.h> +#include <dlog.h> +#include <vconf.h> + +#include <tapi_common.h> +#include <ITapiSim.h> +#include <TelCall.h> +#include <ITapiCall.h> +#include <TelNetwork.h> +#include "setting_utils.h" + +#include "list_util.h" +#include "quickpanel-ui.h" +#include "common.h" + +#include "handler_controller.h" + +#define TAPI_HANDLE_MAX 2 + +static struct +{ + TapiHandle *handle[TAPI_HANDLE_MAX+1]; + Eina_Bool sim_card_ready[2]; + + Evas_Object *layout; + + int call_state; // 0:none, 1:call +} +sim_state_info = +{ + .handle[0] = NULL, + .handle[1] = NULL, + .handle[2] = NULL, + .sim_card_ready[0] = EINA_FALSE, + .sim_card_ready[1] = EINA_FALSE, + .layout = NULL, + .call_state = 0, +}; + +static int _sim_controller_get_call_state(void); + +static void register_sim_callbacks(); +static void unregister_sim_callbacks(); + +static void __sim_controller_call_state_changed_cb(keynode_t *key, void *data) +{ + int call_state = _sim_controller_get_call_state(); + + if (sim_state_info.call_state != call_state) + { + DBG("Call state changed[%d]", call_state); + sim_state_info.call_state = call_state; + } +} + +static int _sim_controller_get_call_state(void) +{ + int value = 0; + int ret = 0; + + ret = vconf_get_int(VCONFKEY_CALL_STATE, &value); + if (ret != 0) + { + ERR("Failed to get call state"); + return 0; + } + + if (value == VCONFKEY_CALL_OFF) + { + return 0; + } + + DBG("Call status[%d]", value); + return 1; +} + +static char *get_sim_plmn(TapiHandle *handle) +{ + int ret; + char *network_name = NULL; + + /* Reading Network (PLMN) name - ‘string’ type Property */ + ret = tel_get_property_string(handle, + TAPI_PROP_NETWORK_NETWORK_NAME, &network_name); + if(ret == TAPI_API_SUCCESS) + { + /* ‘network_name’ contains valid Network name based on Display condition */ + return network_name; + } + else + { + ERR("Sim = %p PLMN = ERROR[%d]", handle, ret); + /* get property failed */ + } + + return NULL; +} + +static char *get_sim_spn(TapiHandle *handle) +{ + int ret; + char *spn_name = NULL; + + + /* Reading SPN name - ‘string’ type Property */ + ret = tel_get_property_string(handle, + TAPI_PROP_NETWORK_SPN_NAME, &spn_name); + if(ret == TAPI_API_SUCCESS) + { + /* ‘spn_name’ contains valid Service provider name */ + return spn_name; + } + else + { + ERR("Sim = %p SPN = ERROR[%d]", handle, ret); + /* get property failed */ + return NULL; + } +} + +static char *get_plmn_spn_network(int handle_num, TapiHandle *handle) +{ + int ret = TAPI_API_SUCCESS; + int service_type = TAPI_NETWORK_SERVICE_TYPE_UNKNOWN; + int name_option = TAPI_NETWORK_DISP_INVALID; + char *plmn = NULL; + char *spn = NULL; + char buf[1024] = { 0, }; + + // get service type + ret = tel_get_property_int(handle, TAPI_PROP_NETWORK_SERVICE_TYPE, &service_type); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to get service type[%d]", ret); + } + + if (service_type >= TAPI_NETWORK_SERVICE_TYPE_2G) + { + // get network name option + ret = tel_get_property_int(handle, TAPI_PROP_NETWORK_NAME_OPTION, &name_option); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to get name option[%d]", ret); + } + + switch (name_option) + { + case TAPI_NETWORK_DISP_SPN: + spn = get_sim_spn(handle); + if (spn != NULL && spn[0] != 0) + { + INFO("PLMN/SPN - Sim %p using SPN: %s", handle, spn); + snprintf(buf, sizeof(buf), "%s", spn); + } + break; + case TAPI_NETWORK_DISP_PLMN: + plmn = get_sim_plmn(handle); + if (plmn != NULL && plmn[0] != 0) + { + INFO("PLMN/SPN - Sim %p using PLMN: %s", handle, plmn); + snprintf(buf, sizeof(buf), "%s", plmn); + } + break; + case TAPI_NETWORK_DISP_SPN_PLMN: + spn = get_sim_spn(handle); + plmn = get_sim_plmn(handle); + if (spn != NULL && spn[0] != 0 && plmn != NULL && plmn[0] != 0) + { + INFO("PLMN/SPN - Sim %p using SPN: %s, PLMN: %s", handle, spn, plmn); + snprintf(buf, sizeof(buf), "%s - %s", plmn, spn); + } + else if (spn != NULL && spn[0] != 0) + { + INFO("PLMN/SPN - Sim %p using SPN: %s", handle, spn); + snprintf(buf, sizeof(buf), "%s", spn); + } + else if (plmn != NULL && plmn[0] != 0) + { + INFO("PLMN/SPN - Sim %p using PLMN: %s", handle, plmn); + snprintf(buf, sizeof(buf), "%s", plmn); + } + break; + default: + ERR("Invalid name option[%d]", name_option); + plmn = get_sim_plmn(handle); + if (plmn != NULL && plmn[0] != 0) + { + INFO("PLMN/SPN - Sim %p using PLMN: %s", handle, plmn); + snprintf(buf, sizeof(buf), "%s", plmn); + } + break; + } + } + else + { + switch (service_type) + { + case TAPI_NETWORK_SERVICE_TYPE_NO_SERVICE: + snprintf(buf, sizeof(buf), "%s", _("IDS_IDLE_BODY_NO_SERVICE")); + break; + case TAPI_NETWORK_SERVICE_TYPE_EMERGENCY: + snprintf(buf, sizeof(buf), "%s", _("IDS_IDLE_MBODY_EMERGENCY_CALLS_ONLY")); + break; + case TAPI_NETWORK_SERVICE_TYPE_SEARCH: + snprintf(buf, sizeof(buf), "%s", _("IDS_COM_BODY_SEARCHING")); + break; + default: + ERR("invalid service type[%d]", service_type); + plmn = get_sim_plmn(handle); + if (plmn != NULL && plmn[0] != 0) + { + INFO("PLMN/SPN - Sim %p using PLMN: %s", handle, plmn); + snprintf(buf, sizeof(buf), "%s", plmn); + } + break; + } + } + + DBG("handle[%d][%p] service_type[%d], name_option[%d] >> [%s]", handle_num, handle, service_type, name_option, buf); + + if (strlen(buf) == 0) + { + ERR("Empty string"); + snprintf(buf, sizeof(buf), "%s", _("IDS_IDLE_BODY_NO_SERVICE")); + } + else if (strncasecmp(buf, "No Service", strlen("No Service")) == 0) + { + ERR("USING SPECIAL NETWORK NAME: %s in handle: %d", _("IDS_IDLE_BODY_NO_SERVICE"), handle_num); + return strdup(_("IDS_IDLE_BODY_NO_SERVICE")); + } + else if (strncasecmp(buf, "EMERGENCY", strlen("EMERGENCY")) == 0) + { + ERR("USING SPECIAL NETWORK NAME: %s in handle: %d", _("IDS_IDLE_MBODY_EMERGENCY_CALLS_ONLY"), handle_num); + return strdup(_("IDS_IDLE_MBODY_EMERGENCY_CALLS_ONLY")); + } + else if (strncasecmp(buf, "Searching", strlen("Searching")) == 0) + { + ERR("USING SPECIAL NETWORK NAME: %s in handle: %d", _("IDS_COM_BODY_SEARCHING"), handle_num); + return strdup(_("IDS_COM_BODY_SEARCHING")); + } + else if (strncasecmp(buf, "SIM Error", strlen("SIM Error")) == 0) + { + ERR("USING SPECIAL NETWORK NAME: %s in handle: %d", _("IDS_IDLE_BODY_INVALID_SIM_CARD"), handle_num); + return strdup(_("IDS_IDLE_BODY_INVALID_SIM_CARD")); + } + else if (strncasecmp(buf, "NO SIM", strlen("NO SIM")) == 0) + { + ERR("USING SPECIAL NETWORK NAME: %s in handle: %d", _("IDS_IDLE_MBODY_EMERGENCY_CALLS_ONLY"), handle_num); + return strdup(_("IDS_IDLE_MBODY_EMERGENCY_CALLS_ONLY")); + } + + return strdup(buf); +} + +// -------------------------------------------------------------------------------------------- +static void print_sim_status(TelSimCardStatus_t sim_status, int card_changed) +{ + switch(sim_status) + { + case TAPI_SIM_STATUS_CARD_ERROR : + INFO("Sim card status: TAPI_SIM_STATUS_CARD_ERROR"); + break; + + case TAPI_SIM_STATUS_CARD_NOT_PRESENT : + INFO("Sim card status: TAPI_SIM_STATUS_CARD_NOT_PRESENT"); + break; + + case TAPI_SIM_STATUS_SIM_INITIALIZING : + INFO("Sim card status: TAPI_SIM_STATUS_SIM_INITIALIZING"); + break; + + case TAPI_SIM_STATUS_SIM_INIT_COMPLETED: + INFO("Sim card status: TAPI_SIM_STATUS_SIM_INIT_COMPLETED"); + break; + + case TAPI_SIM_STATUS_SIM_PIN_REQUIRED : + INFO("Sim card status: TAPI_SIM_STATUS_SIM_PIN_REQUIRED"); + break; + + case TAPI_SIM_STATUS_SIM_PUK_REQUIRED : + INFO("Sim card status: TAPI_SIM_STATUS_SIM_PUK_REQUIRED"); + break; + + case TAPI_SIM_STATUS_CARD_BLOCKED : + INFO("Sim card status: TAPI_SIM_STATUS_CARD_BLOCKED"); + break; + + case TAPI_SIM_STATUS_SIM_NCK_REQUIRED : + INFO("Sim card status: TAPI_SIM_STATUS_SIM_NCK_REQUIRED"); + break; + + case TAPI_SIM_STATUS_SIM_NSCK_REQUIRED : + INFO("Sim card status: TAPI_SIM_STATUS_SIM_NSCK_REQUIRED"); + break; + + case TAPI_SIM_STATUS_SIM_SPCK_REQUIRED : + INFO("Sim card status: TAPI_SIM_STATUS_SIM_SPCK_REQUIRED"); + break; + + case TAPI_SIM_STATUS_SIM_CCK_REQUIRED : + INFO("Sim card status: TAPI_SIM_STATUS_SIM_CCK_REQUIRED"); + break; + + case TAPI_SIM_STATUS_CARD_REMOVED : + INFO("Sim card status: TAPI_SIM_STATUS_CARD_REMOVED"); + break; + + case TAPI_SIM_STATUS_SIM_LOCK_REQUIRED : + INFO("Sim card status: TAPI_SIM_STATUS_SIM_LOCK_REQUIRED"); + break; + + case TAPI_SIM_STATUS_CARD_CRASHED : + INFO("Sim card status: TAPI_SIM_STATUS_CARD_CRASHED"); + break; + + case TAPI_SIM_STATUS_CARD_POWEROFF : + INFO("Sim card status: TAPI_SIM_STATUS_CARD_POWEROFF"); + break; + + case TAPI_SIM_STATUS_UNKNOWN : + INFO("Sim card status: TAPI_SIM_STATUS_UNKNOWN"); + break; + } + + INFO("Sim_card_changed: %d", card_changed); +} + +static void get_sim_status() +{ + int i; + int ret; + TelSimCardStatus_t sim_status; + int card_changed; + + for(i = 0; i < TAPI_HANDLE_MAX + 1; ++i) + { + if(sim_state_info.handle[i]) + { + ret = tel_get_sim_init_info (sim_state_info.handle[i], &sim_status, &card_changed); + if(ret == 0) + { + print_sim_status(sim_status, card_changed); + + if(sim_status == TAPI_SIM_STATUS_SIM_INIT_COMPLETED || + sim_status == TAPI_SIM_STATUS_SIM_PIN_REQUIRED) + { + if (i < TAPI_HANDLE_MAX) + { + sim_state_info.sim_card_ready[i] = EINA_TRUE; + } + } + else + { + ERR("SIM[%d] is not completed initialization [%d]", i, sim_status); + } + } + else + { + ERR("Could not get sim[%d] status[%d]", i, ret); + } + } + } +} + +static void sim_handler_text_set(Eina_Bool flight_mode) +{ + if (flight_mode) + { + // if flight mode, No service + quickpanel_handler_text_set(_("IDS_IDLE_BODY_NO_SERVICE")); + } + else if (sim_state_info.sim_card_ready[0] && sim_state_info.sim_card_ready[1]) + { + quickpanel_handler_text_set(NULL); + } + else if(sim_state_info.sim_card_ready[0]) + { + char *plmn_spn1 = get_plmn_spn_network(0, sim_state_info.handle[0]); + quickpanel_handler_text_set(plmn_spn1); + if (plmn_spn1) + { + free(plmn_spn1); + } + } + else if(sim_state_info.sim_card_ready[1]) + { + char *plmn_spn1 = get_plmn_spn_network(1, sim_state_info.handle[1]); + quickpanel_handler_text_set(plmn_spn1); + if (plmn_spn1) + { + free(plmn_spn1); + } + } + else + { + quickpanel_handler_text_set(_("IDS_IDLE_MBODY_EMERGENCY_CALLS_ONLY")); + } + +} + +static void init_view() +{ + struct appdata *ad = NULL; + + ad = quickpanel_get_app_data(); + if (ad == NULL) + { + ERR("invalid data"); + return; + } + + int flight_mode_state = EINA_FALSE; + int ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &flight_mode_state); + if(ret != 0) + { + ERR("Could not get 'VCONFKEY_TELEPHONY_FLIGHT_MODE' value"); + } + + sim_handler_text_set(flight_mode_state); +} + +/* Initialize TAPI */ +static void _init_tel() +{ + char **cp_list = NULL; + unsigned int modem_num = 0; + + /* Get CP name list – cp_list */ + cp_list = tel_get_cp_name_list(); + + if(cp_list == NULL) + { + ERR("Could not get the cp_name_list"); + return; + } + + while (cp_list[modem_num]) + { + /* Initialize TAPI handle */ + sim_state_info.handle[modem_num] = tel_init(cp_list[modem_num]); + + if(cp_list[modem_num]) + ERR("sim_state_info.handle[%d] = %s; ptr = %p", modem_num, + cp_list[modem_num], sim_state_info.handle[modem_num]); + + /* Move to next CP Name in cp_list */ + modem_num++; + } + + sim_state_info.handle[modem_num] = NULL; + + /* free cp_list */ + free(cp_list); +} + +/* De-initialize TAPI */ +static void _deinit_tel() +{ + int i = 0; + while (sim_state_info.handle[i]) + { + /* De-initialize TAPI handle */ + tel_deinit(sim_state_info.handle[i]); + sim_state_info.handle[i] = NULL; + + /* Move to next handle */ + i++; + } +} + +/* Telephony state change callback */ +void tel_ready_cb(keynode_t *key, void *data) +{ + Eina_Bool status = EINA_FALSE; + + status = vconf_keynode_get_bool(key); + + if (status == TRUE) + { /* Telephony State - READY */ + DBG("tel status[%d]", status); + _init_tel(); + register_sim_callbacks(); + get_sim_status(); + + init_view(); + } + else + { /* Telephony State – NOT READY */ + /* De-initialization is optional here (ONLY if required) */ + ERR("tel status[%d]", status); + _deinit_tel(); + sim_state_info.sim_card_ready[0] = EINA_FALSE; + sim_state_info.sim_card_ready[1] = EINA_FALSE; + + unregister_sim_callbacks(); + } +} + +static void tel_flight_mode_cb(keynode_t *key, void *data) +{ + Eina_Bool flight_mode_state = EINA_FALSE; + + flight_mode_state = vconf_keynode_get_bool(key); + sim_handler_text_set(flight_mode_state); +} + +// -------------------------------------------------------------------------------------------- +static void on_sim_card_status_changed(TapiHandle *handle, const char *noti_id, void *data, void *user_data) +{ + int handle_num = (int)user_data; + int *sim_status = data; + + ERR("SIM[%p][%d] status[%d], [%d][%d]", handle, handle_num, *sim_status, sim_state_info.sim_card_ready[0], sim_state_info.sim_card_ready[1]); + + if(*sim_status == TAPI_SIM_STATUS_SIM_INIT_COMPLETED || + *sim_status == TAPI_SIM_STATUS_SIM_PIN_REQUIRED) + { + sim_state_info.sim_card_ready[handle_num] = EINA_TRUE; + } + else + { + sim_state_info.sim_card_ready[handle_num] = EINA_FALSE; + } + + init_view(); +} + +static void on_plmn_spn_changed(TapiHandle *handle, const char *noti_id, + void *data, void *user_data) +{ + if(!handle) + { + ERR("handle == NULL"); + return; + } + + int flight_mode_state = EINA_FALSE; + int ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &flight_mode_state); + if(ret != 0) + { + ERR("Could not get the 'VCONFKEY_TELEPHONY_FLIGHT_MODE' value"); + } + sim_handler_text_set(flight_mode_state); +} + +static void register_sim_callbacks() +{ + int i; + int ret; + for(i = 0; i < TAPI_HANDLE_MAX; ++i) + { + if(sim_state_info.handle[i]) + { + ret = tel_register_noti_event (sim_state_info.handle[i], + TAPI_NOTI_SIM_STATUS, on_sim_card_status_changed, (void*)i); + + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to register 'on_sim_card_status_changed' callback to handle[%d][%d]", i, ret); + } + else + { + ERR("SIM card status changed event registered"); + } + + ret = tel_register_noti_event(sim_state_info.handle[i], + TAPI_PROP_NETWORK_SPN_NAME, on_plmn_spn_changed, (void*)i); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to register 'on_plmn_spn_changed' callback to handle[%d][%d]", i, ret); + } + + ret = tel_register_noti_event(sim_state_info.handle[i], + TAPI_PROP_NETWORK_NETWORK_NAME, on_plmn_spn_changed, (void*)i); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to register 'on_plmn_spn_changed' callback to handle: %i", i); + } + + ret = tel_register_noti_event(sim_state_info.handle[i], TAPI_PROP_NETWORK_SERVICE_TYPE, on_plmn_spn_changed, (void*) i); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to register network service type[%d][%d]", ret, i); + } + + ret = tel_register_noti_event(sim_state_info.handle[i], TAPI_PROP_NETWORK_NAME_OPTION, on_plmn_spn_changed, (void*) i); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to register network name option[%d][%d]", ret, i); + } + } + else + { + ERR("No handle [%d]", i); + } + } +} + +static void unregister_sim_callbacks() +{ + int i; + int ret; + for(i = 0; i < TAPI_HANDLE_MAX; ++i) + { + if(sim_state_info.handle[i]) + { + ret = tel_deregister_noti_event(sim_state_info.handle[i], TAPI_NOTI_SIM_STATUS); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to dereregister TAPI_NOTI_SIM_STATUS callback from handle: %i", i); + } + else + { + DBG("SIM status changed event deregistered"); + } + + ret = tel_deregister_noti_event(sim_state_info.handle[i], TAPI_PROP_NETWORK_NETWORK_NAME); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to dereregister TAPI_PROP_NETWORK_PLMN callback from handle: %i", i); + } + + ret = tel_deregister_noti_event(sim_state_info.handle[i], TAPI_PROP_NETWORK_SPN_NAME); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to dereregister TAPI_PROP_NETWORK_SPN_NAME callback from handle: %i", i); + } + + ret = tel_deregister_noti_event(sim_state_info.handle[i], TAPI_PROP_NETWORK_SERVICE_TYPE); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to deregister network service type[%d][%d]", ret, i); + } + + ret = tel_deregister_noti_event(sim_state_info.handle[i], TAPI_PROP_NETWORK_NAME_OPTION); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to deregister network name option[%d][%d]", ret, i); + } + + if(i == 0) + { + ret = tel_deregister_noti_event(sim_state_info.handle[i], TAPI_NOTI_CALL_PREFERRED_VOICE_SUBSCRIPTION); + if (ret != TAPI_API_SUCCESS) + { + ERR("Failed to dereregister callback to handle: %d", i); + } + } + } + } +} + + +void sim_controller_init(Evas_Object *master_layout) +{ + int state = EINA_FALSE; + int ret; + /* Check if Telephony state - READY */ + ret = vconf_get_bool(VCONFKEY_TELEPHONY_READY, &state); + + DBG("VCONFKEY_TELEPHONY_READY == %d", state); + + if (ret != -1 && state == TRUE) + { /* Telephony State - READY */ + /* Initialize TAPI handles */ + + _init_tel(); + register_sim_callbacks(); + get_sim_status(); + + init_view(); + } + else + { /* Telephony State – NOT READY, register for change in state */ + DBG("Telephony state: [NOT Ready]"); + } + + /* Register for Telephony state change */ + ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_READY, tel_ready_cb, master_layout); + if(ret != 0) + ERR("Failed to register VCONFKEY_TELEPHONY_READY key changed callback"); + + ret = vconf_notify_key_changed(VCONFKEY_TELEPHONY_FLIGHT_MODE, tel_flight_mode_cb, master_layout); + if(ret != 0) + ERR("Failed to register VCONFKEY_TELEPHONY_FLIGHT_MODE key changed callback"); + + ret = vconf_notify_key_changed(VCONFKEY_CALL_STATE, __sim_controller_call_state_changed_cb, NULL); + if (ret != 0) + { + ERR("Failed to notify call state[%d]", ret); + } +} + +void sim_controller_resume() +{ + int state = FALSE; + int ret = 0; + int i = 0; + TelSimCardStatus_t sim_status; + int card_changed; + + ret = vconf_get_bool(VCONFKEY_TELEPHONY_READY, &state); + if (ret != 0 || state == FALSE) + { + ERR("Failed to get telephony state[%d][%d]", state, ret); + return; + } + + for (i = 0; i < TAPI_HANDLE_MAX; ++i) + { + if (sim_state_info.handle[i]) + { + ret = tel_get_sim_init_info(sim_state_info.handle[i], &sim_status, &card_changed); + DBG("SIM[%d] info[%d][%d][%d]", i, ret, sim_status, card_changed); + if (sim_status == TAPI_SIM_STATUS_SIM_INIT_COMPLETED || + sim_status == TAPI_SIM_STATUS_SIM_PIN_REQUIRED) + { + if (sim_state_info.sim_card_ready[i] != EINA_TRUE) + { + ERR("SIM[%d] is init completed but local value is not ture", i); + } + } + } + else + { + ERR("No handle[%d]", i); + } + } +} + +void sim_controller_on_language_change() +{ + on_plmn_spn_changed(sim_state_info.handle[0], "SELF", NULL, (void*) 0); + on_plmn_spn_changed(sim_state_info.handle[1], "SELF", NULL, (void*) 1); + + if (sim_state_info.handle[0] == NULL && sim_state_info.handle[1] == NULL) + { + int flight_mode = EINA_FALSE; + int ret = vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &flight_mode); + if (ret != 0) + { + ERR("Failed to get flight mode[%d]", ret); + } + + sim_handler_text_set(flight_mode); + } +} diff --git a/daemon/sim_controller.h b/daemon/sim_controller.h new file mode 100644 index 0000000..008f4ac --- /dev/null +++ b/daemon/sim_controller.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __SIM_CONTROL_H__ +#define __SIM_CONTROL_H__ + +#include <Elementary.h> +#include <Evas.h> + +void sim_controller_init(Evas_Object *master_layout); +void sim_controller_resume(); +void sim_controller_on_language_change(); + +#endif // __SIM_CONTROL_H__
\ No newline at end of file diff --git a/daemon/vi/vi_manager.c b/daemon/vi/vi_manager.c new file mode 100644 index 0000000..eeca062 --- /dev/null +++ b/daemon/vi/vi_manager.c @@ -0,0 +1,468 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#include "vi_manager.h" +#include "list_util.h" +#include "pager.h" + +static int _init(void *data); +static int _fini(void *data); +static int _resume(void *data); +static void _qp_opened(void *data); + +QP_Module vi_manager = { + .name = "vi_manager", + .init = _init, + .fini = _fini, + .resume = _resume, + .qp_opened = _qp_opened, + .lang_changed = NULL, + .refresh = NULL +}; + +static struct info { + Eina_List *vi_list; + Eina_List *vi_user_event_list; + QP_VI *current; + qp_vim_state_type state; +} s_info = { + .vi_list = NULL, + .vi_user_event_list = NULL, + .current = NULL, + .state = VIM_STATE_NOT_READY, +}; + +static QP_VI *_vi_list_get_first(void); +static QP_VI *_vi_user_event_list_get_first(void); +static void _vi_list_del(QP_VI *vi); + +static inline void _vim_set_state(qp_vim_state_type state) +{ + s_info.state = state; +} + +static inline qp_vim_state_type _vim_get_state(void) +{ + return s_info.state; +} + +static void _vi_freeze_start(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + retif(ad->list == NULL, , "invalid parameter"); + + if (!evas_object_freeze_events_get(ad->scroller)) { + INFO("VIM freezing"); + evas_object_freeze_events_set(ad->scroller, EINA_TRUE); + } +} + +static void _vi_freeze_stop(void) +{ + struct appdata *ad = quickpanel_get_app_data(); + retif(ad == NULL, , "invalid parameter"); + retif(ad->list == NULL, , "invalid parameter"); + + if (evas_object_freeze_events_get(ad->scroller)) { + INFO("VIM unfreezing"); + evas_object_freeze_events_set(ad->scroller, EINA_FALSE); + } +} + +static void _vi_restart_job_cb(void *data) +{ + QP_VI *next_vi = NULL; + QP_VI *user_vi = NULL; + + next_vi = _vi_list_get_first(); + + if (next_vi != NULL && next_vi->disable_interrupt_userevent == 0) { + while ((user_vi = _vi_user_event_list_get_first()) != NULL) { + if (user_vi->interrupt_cb != NULL) { + user_vi->interrupt_cb(user_vi); + user_vi->state = VI_STATE_INTERRUPTED; + } + quickpanel_vi_user_event_del(user_vi); + } + } + + if (_vim_get_state() == VIM_STATE_READY) { + next_vi = _vi_list_get_first(); + + if (next_vi) { + if (next_vi->job_cb != NULL) { + _vim_set_state(VIM_STATE_WORKING); + next_vi->state = VI_STATE_RUNNING; + next_vi->job_cb(next_vi); + } + } + } else if (_vim_get_state() == VIM_STATE_SUSPENDED + || _vim_get_state() == VIM_STATE_NOT_READY){ + while ((next_vi = _vi_list_get_first()) != NULL) { + quickpanel_vi_done(next_vi); + } + } +} + +static void _vi_list_add(QP_VI *new_vi) +{ + retif(new_vi == NULL, ,"invalid parameter"); + + s_info.vi_list = eina_list_append(s_info.vi_list, new_vi); +} + +static int _vi_list_count(void) +{ + retif(s_info.vi_list == NULL, 0, "list null"); + + return eina_list_count(s_info.vi_list); +} + +static void _vi_list_del(QP_VI *vi) +{ + retif(vi == NULL, ,"invalid parameter"); + + s_info.vi_list = eina_list_remove(s_info.vi_list, vi); +} + +static int _vi_list_is_data_valid(void *node) +{ + if (eina_list_data_find(s_info.vi_list, node) != NULL) { + return 1; + } + + return 0; +} + +static QP_VI *_vi_list_get_first(void) +{ + QP_VI *vi = eina_list_nth(s_info.vi_list, 0); + + return vi; +} + +static QP_VI *_vi_user_event_list_get_first(void) +{ + QP_VI *vi = eina_list_nth(s_info.vi_user_event_list, 0); + + return vi; +} + +HAPI QP_VI *quickpanel_vi_new(void) +{ + QP_VI *vi = (QP_VI *)calloc(1, sizeof(QP_VI)); + + retif(vi == NULL, NULL, "failed to memory allocation"); + + return vi; +} + +HAPI QP_VI *quickpanel_vi_new_with_data(qp_vi_op_type op_type, + qp_item_type_e item_type, + void *container, + void *target, + vi_cb init_cb, + vi_cb job_cb, + vi_cb done_cb, + vi_cb interrupt_cb, + void *extra_data_1, + void *extra_data_2, + int extra_flag_1, + int extra_flag_2) +{ + QP_VI *vi = (QP_VI *)calloc(1, sizeof(QP_VI)); + + retif(vi == NULL, NULL, "failed to memory allocation"); + + DBG(""); + + vi->state = VI_STATE_NOT_READY; + vi->op_type = op_type; + vi->item_type = item_type; + vi->container = container; + vi->target = target; + vi->init_cb = init_cb; + vi->job_cb = job_cb; + vi->done_cb = done_cb; + vi->interrupt_cb = interrupt_cb; + vi->extra_data_1 = extra_data_1; + vi->extra_data_2 = extra_data_2; + vi->extra_flag_1 = extra_flag_1; + vi->extra_flag_2 = extra_flag_2; + + return vi; +} + +HAPI void quickpanel_vi_start(QP_VI *vi) +{ + retif(vi == NULL, , "vi is NULL"); + + /* + * workaround - turn off mapbuf + * if mapbuf is enabled, geometry information from object become invalid + */ + quickpanel_pager_mapbuf_set(0); + + if (vi->init_cb != NULL) { + vi->init_cb(vi); + } + + vi->state = VI_STATE_READY; + + if (vi->disable_freezing == 0) { + _vi_freeze_start(); + } + _vi_list_add(vi); + if (vi->target != NULL) { + evas_object_ref(vi->target); + if (vi->op_type == VI_OP_DELETE) { + evas_object_freeze_events_set(vi->target, EINA_TRUE); + } + } + if (_vim_get_state() == VIM_STATE_NOT_READY) { + _vi_restart_job_cb(NULL); + } else { + ecore_job_add(_vi_restart_job_cb, NULL); + } +} + +HAPI void quickpanel_vi_interrupt(QP_VI *vi) +{ + retif(vi == NULL, , "vi is NULL"); + + if (!_vi_list_is_data_valid(vi)) { + return; + } + + _vi_list_del(vi); + + if (vi->interrupt_cb != NULL) { + vi->interrupt_cb(vi); + vi->state = VI_STATE_INTERRUPTED; + } + + if (s_info.current == vi) { + s_info.current = NULL; + } + if (_vim_get_state() == VIM_STATE_WORKING) { + if (!quickpanel_uic_is_opened()) { + _vim_set_state(VIM_STATE_SUSPENDED); + } else { + _vim_set_state(VIM_STATE_READY); + } + } + + evas_object_unref(vi->target); + free(vi); + + if (_vi_list_count() <= 0) { + _vi_freeze_stop(); + } + + ecore_job_add(_vi_restart_job_cb, NULL); +} + +HAPI void quickpanel_vi_done(QP_VI *vi) +{ + retif(vi == NULL, , "vi is NULL"); + + if (!_vi_list_is_data_valid(vi)) { + return; + } + + _vi_list_del(vi); + + if (vi->done_cb != NULL) { + vi->done_cb(vi); + vi->state = VI_STATE_DONE; + } + + if (s_info.current == vi) { + s_info.current = NULL; + } + if (_vim_get_state() == VIM_STATE_WORKING) { + if (!quickpanel_uic_is_opened()) { + _vim_set_state(VIM_STATE_SUSPENDED); + } else { + _vim_set_state(VIM_STATE_READY); + } + } + + evas_object_unref(vi->target); + free(vi); + + if (_vi_list_count() <= 0) { + _vi_freeze_stop(); + } + + ecore_job_add(_vi_restart_job_cb, NULL); +} + +HAPI void quickpanel_vi_done_cb_for_transit(void *data, Elm_Transit *transit) +{ + retif(data == NULL, , "data is NULL"); + + quickpanel_vi_done(data); +} + +HAPI void quickpanel_vim_set_state_ready(void) +{ + if (!quickpanel_uic_is_opened()) { + _vim_set_state(VIM_STATE_SUSPENDED); + } else { + _vim_set_state(VIM_STATE_READY); + } +} + +HAPI void quickpanel_vim_set_state_suspend(void) +{ + _vim_set_state(VIM_STATE_SUSPENDED); +} + +#define VIM_DURATION_INSERT 0.17 +#define VIM_DURATION_UPDATE 0.17 +#define VIM_DURATION_DELETE 0.17 +#define VIM_DURATION_REORDER 0.25 +#define VIM_THROTTLE_THRESHOLD 5 + +HAPI double quickpanel_vim_get_duration(qp_vi_op_type op_type) +{ + int count = 0; + double duration = 0.0; + + switch (op_type) { + case VI_OP_INSERT: + duration = VIM_DURATION_INSERT; + break; + case VI_OP_UPDATE: + duration = VIM_DURATION_UPDATE; + break; + case VI_OP_DELETE: + duration = VIM_DURATION_DELETE; + break; + case VI_OP_REORDER: + duration = VIM_DURATION_REORDER; + break; + default : + duration = VIM_DURATION_INSERT; + break; + } + + if ((count = _vi_list_count()) > VIM_THROTTLE_THRESHOLD) { + duration = duration * (1.0 / (double)count); + } + + return duration; +} + +HAPI Elm_Transit_Tween_Mode quickpanel_vim_get_tweenmode(qp_vi_op_type op_type) +{ + Elm_Transit_Tween_Mode mode = ELM_TRANSIT_TWEEN_MODE_LINEAR; + + switch (op_type) { + case VI_OP_INSERT: + mode = ELM_TRANSIT_TWEEN_MODE_DECELERATE; + break; + case VI_OP_UPDATE: + mode = ELM_TRANSIT_TWEEN_MODE_DECELERATE; + break; + case VI_OP_DELETE: + mode = ELM_TRANSIT_TWEEN_MODE_ACCELERATE; + break; + case VI_OP_REORDER: + mode = ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL; + break; + default : + mode = ELM_TRANSIT_TWEEN_MODE_LINEAR; + break; + } + + return mode; +} + +/***************************************************************************** + * + * Util functions + * + *****************************************************************************/ +static int _init(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + _vim_set_state(VIM_STATE_NOT_READY); + + return QP_OK; +} + +static int _fini(void *data) +{ + struct appdata *ad = (struct appdata *)data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + _vim_set_state(VIM_STATE_NOT_READY); + + return QP_OK; +} + +static int _resume(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, QP_FAIL, "Invalid parameter!"); + + if (_vim_get_state() == VIM_STATE_SUSPENDED) { + _vim_set_state(VIM_STATE_READY); + } + + return QP_OK; +} + +static void _qp_opened(void *data) +{ + struct appdata *ad = data; + retif(ad == NULL, , "Invalid parameter!"); + + if (_vim_get_state() == VIM_STATE_SUSPENDED) { + _vim_set_state(VIM_STATE_READY); + } +} + +HAPI void quickpanel_vi_user_event_add(QP_VI *new_vi) +{ + retif(new_vi == NULL, ,"invalid parameter"); + + s_info.vi_user_event_list = eina_list_append(s_info.vi_user_event_list, new_vi); +} + +HAPI void quickpanel_vi_user_event_del(QP_VI *vi) +{ + retif(vi == NULL, ,"invalid parameter"); + + if (eina_list_data_find(s_info.vi_user_event_list, vi) != NULL) { + s_info.vi_user_event_list = eina_list_remove(s_info.vi_user_event_list, vi); + free(vi); + } +} + +HAPI void quickpanel_vi_object_event_freeze_set(Evas_Object *obj, Eina_Bool freeze) +{ + retif(obj == NULL, ,"invalid parameter"); + + evas_object_freeze_events_set(obj, freeze); +} diff --git a/daemon/vi/vi_manager.h b/daemon/vi/vi_manager.h new file mode 100644 index 0000000..b2713f9 --- /dev/null +++ b/daemon/vi/vi_manager.h @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2009-2015 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __QUICKPANEL_VI_MANAGER_H__ +#define __QUICKPANEL_VI_MANAGER_H__ + +#include "quickpanel-ui.h" +#include "common.h" +#include "list_util.h" + +typedef Eina_Bool (*vi_cb)(void *data); + +typedef enum _qp_vim_state_type { + VIM_STATE_NOT_READY = 0, + VIM_STATE_READY, + VIM_STATE_WORKING, + VIM_STATE_SUSPENDED, +} qp_vim_state_type; + +typedef enum _qp_vi_state_type { + VI_STATE_NOT_READY = 0, + VI_STATE_READY = 1, + VI_STATE_RUNNING, + VI_STATE_DONE, + VI_STATE_INTERRUPTED, +} qp_vi_state_type; + +typedef enum _qp_vi_op_type { + VI_OP_NONE = -1, + VI_OP_INSERT = 0, + VI_OP_UPDATE, + VI_OP_DELETE, + VI_OP_DELETE_ALL, + VI_OP_REORDER, + VI_OP_ROTATION, + VI_OP_RESIZE, +} qp_vi_op_type; + +typedef struct _QP_VI { + qp_vi_state_type state; + qp_vi_op_type op_type; + qp_item_type_e item_type; + void *container; + void *target; + vi_cb init_cb; + vi_cb job_cb; + vi_cb done_cb; + vi_cb interrupt_cb; + int disable_interrupt_userevent; + int disable_freezing; + void *extra_data_1; + void *extra_data_2; + int extra_flag_1; + int extra_flag_2; +} QP_VI; + +typedef struct _qp_vi_op_table { + qp_vi_op_type op_type; + void (*handler)(void *data); +} qp_vi_op_table; + +QP_VI *quickpanel_vi_new(void); +QP_VI *quickpanel_vi_new_with_data( qp_vi_op_type op_type, + qp_item_type_e item_type, + void *container, + void *target, + vi_cb init_cb, + vi_cb job_cb, + vi_cb done_cb, + vi_cb interrupt_cb, + void *extra_data_1, + void *extra_data_2, + int extra_flag_1, + int extra_flag_2); +void quickpanel_vi_start(QP_VI *vi); +void quickpanel_vi_interrupt(QP_VI *vi); +void quickpanel_vi_done(QP_VI *vi); +void quickpanel_vim_set_state_ready(void); +void quickpanel_vim_set_state_suspend(void); +double quickpanel_vim_get_duration(qp_vi_op_type op_type); +void quickpanel_vi_done_cb_for_transit(void *data, Elm_Transit *transit); +Elm_Transit_Tween_Mode quickpanel_vim_get_tweenmode(qp_vi_op_type op_type); + +void quickpanel_vi_user_event_add(QP_VI *vi); +void quickpanel_vi_user_event_del(QP_VI *vi); +void quickpanel_vi_object_event_freeze_set(Evas_Object *obj, Eina_Bool freeze); + +#endif |