summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
authorhoejoo lee <hoejoo.lee@samsung.com>2015-06-11 14:48:48 +0900
committerhoejoo lee <hoejoo.lee@samsung.com>2015-06-12 16:29:32 +0900
commitf0f2a70519e109c7999adc84036d98dc13269d7e (patch)
tree03c73e5e1b80310277af5dab7c6f5dc7a84e43d7 /daemon
parent783b89c3d7b9270781c2bd3e1196c1f49d0e3809 (diff)
downloadquickpanel-f0f2a70519e109c7999adc84036d98dc13269d7e.tar.gz
quickpanel-f0f2a70519e109c7999adc84036d98dc13269d7e.tar.bz2
quickpanel-f0f2a70519e109c7999adc84036d98dc13269d7e.zip
Change-Id: I2408a20ba7ce2de87ec104341cdb6cb2923017e8
Diffstat (limited to 'daemon')
-rw-r--r--daemon/accessibility.c114
-rw-r--r--daemon/accessibility.h35
-rwxr-xr-xdaemon/common.c340
-rwxr-xr-xdaemon/common.h46
-rw-r--r--daemon/common_uic.c375
-rw-r--r--daemon/common_uic.h43
-rw-r--r--daemon/common_uic_x11.c364
-rw-r--r--daemon/datetime/datetime.c346
-rw-r--r--daemon/datetime/datetime.h26
-rw-r--r--daemon/datetime/util-time.c1392
-rw-r--r--daemon/datetime/util-time.h28
-rw-r--r--daemon/dbus_utility.c59
-rw-r--r--daemon/dbus_utility.h23
-rwxr-xr-xdaemon/device/brightness.c762
-rw-r--r--daemon/handler_controller.c81
-rw-r--r--daemon/handler_controller.h31
-rwxr-xr-xdaemon/idletxt/idletxt.c599
-rwxr-xr-xdaemon/list_util.c614
-rwxr-xr-xdaemon/list_util.h24
-rwxr-xr-xdaemon/media.c319
-rwxr-xr-xdaemon/media.h29
-rwxr-xr-xdaemon/minictrl/minictrl.c446
-rw-r--r--daemon/minictrl/minictrl.h24
-rwxr-xr-xdaemon/modules.c99
-rwxr-xr-xdaemon/modules.h28
-rw-r--r--daemon/notifications/activenoti.c1328
-rwxr-xr-xdaemon/notifications/animated_image.c66
-rwxr-xr-xdaemon/notifications/animated_image.h14
-rwxr-xr-xdaemon/notifications/noti.c1251
-rwxr-xr-xdaemon/notifications/noti.h30
-rwxr-xr-xdaemon/notifications/noti_box.c1131
-rwxr-xr-xdaemon/notifications/noti_box.h55
-rwxr-xr-xdaemon/notifications/noti_gridbox.c874
-rwxr-xr-xdaemon/notifications/noti_gridbox.h32
-rwxr-xr-xdaemon/notifications/noti_list_item.c958
-rwxr-xr-xdaemon/notifications/noti_list_item.h80
-rwxr-xr-xdaemon/notifications/noti_listbox.c924
-rwxr-xr-xdaemon/notifications/noti_listbox.h40
-rwxr-xr-xdaemon/notifications/noti_node.c60
-rwxr-xr-xdaemon/notifications/noti_node.h23
-rwxr-xr-xdaemon/notifications/noti_section.c144
-rwxr-xr-xdaemon/notifications/noti_section.h19
-rwxr-xr-xdaemon/notifications/noti_util.c268
-rwxr-xr-xdaemon/notifications/noti_util.h16
-rw-r--r--daemon/notifications/noti_view.c201
-rw-r--r--daemon/notifications/noti_view.h26
-rw-r--r--daemon/notifications/noti_view_boxtype.c1016
-rw-r--r--daemon/notifications/noti_view_listype.c362
-rw-r--r--daemon/notifications/noti_view_ongoing.c513
-rwxr-xr-xdaemon/notifications/noti_win.c220
-rwxr-xr-xdaemon/notifications/noti_win.h14
-rw-r--r--daemon/notifications/noti_win_x11.c307
-rwxr-xr-xdaemon/notifications/status_msg.c315
-rwxr-xr-xdaemon/notifications/ticker.c841
-rw-r--r--daemon/page/page_base.c317
-rw-r--r--daemon/page/page_base.h29
-rw-r--r--daemon/page/page_edit.c302
-rw-r--r--daemon/page/page_edit.h31
-rw-r--r--daemon/page/page_setting_all.c289
-rw-r--r--daemon/page/page_setting_all.h32
-rw-r--r--daemon/page/pager.c559
-rw-r--r--daemon/page/pager.h51
-rw-r--r--daemon/page/pager_common.c190
-rw-r--r--daemon/page/pager_common.h34
-rw-r--r--daemon/page/pager_common_x11.c189
-rw-r--r--daemon/preference.c183
-rw-r--r--daemon/preference.h41
-rwxr-xr-xdaemon/quickpanel-ui.c1342
-rwxr-xr-xdaemon/quickpanel-ui.h88
-rw-r--r--daemon/quickpanel-ui_x11.c957
-rw-r--r--daemon/service/animated_icon.c93
-rw-r--r--daemon/service/animated_icon.h35
-rw-r--r--daemon/service/configuration.c86
-rw-r--r--daemon/service/configuration.h28
-rw-r--r--daemon/service/emergency_mode.c317
-rw-r--r--daemon/service/emergency_mode.h32
-rw-r--r--daemon/service/keyboard.c160
-rw-r--r--daemon/service/keyboard.h29
-rw-r--r--daemon/service/keyboard_x.c333
-rw-r--r--daemon/service/keyboard_x.h29
-rw-r--r--daemon/service/keyboard_x_x11.c322
-rwxr-xr-xdaemon/service/noti_led.c409
-rwxr-xr-xdaemon/service/noti_led.h29
-rw-r--r--daemon/service/reminder.c302
-rw-r--r--daemon/service/reminder.h27
-rw-r--r--daemon/service/smart_alert.c85
-rw-r--r--daemon/service/smart_alert.h37
-rw-r--r--daemon/service/uninstall.c147
-rw-r--r--daemon/service/uninstall.h27
-rw-r--r--daemon/settings/modules/assistive_light.c183
-rw-r--r--daemon/settings/modules/bluetooth.c241
-rw-r--r--daemon/settings/modules/flightmode.c424
-rw-r--r--daemon/settings/modules/gps.c372
-rw-r--r--daemon/settings/modules/mobile_data.c493
-rw-r--r--daemon/settings/modules/rotate-lock.c214
-rw-r--r--daemon/settings/modules/sound-profile.c300
-rw-r--r--daemon/settings/modules/tethering.c461
-rw-r--r--daemon/settings/modules/ultra_power_saving.c255
-rw-r--r--daemon/settings/modules/wifi.c579
-rw-r--r--daemon/settings/setting_module_api.c291
-rw-r--r--daemon/settings/setting_module_api.h57
-rw-r--r--daemon/settings/setting_utils.c632
-rw-r--r--daemon/settings/setting_utils.h73
-rw-r--r--daemon/settings/setting_utils_x11.c629
-rw-r--r--daemon/settings/settings.c479
-rw-r--r--daemon/settings/settings.h113
-rw-r--r--daemon/settings/settings_gridbox.c490
-rw-r--r--daemon/settings/settings_gridbox.h36
-rw-r--r--daemon/settings/settings_icon_common.c259
-rw-r--r--daemon/settings/settings_icon_common.h29
-rw-r--r--daemon/settings/settings_ipc.c202
-rw-r--r--daemon/settings/settings_ipc.h25
-rw-r--r--daemon/settings/settings_view_all.c286
-rw-r--r--daemon/settings/settings_view_all.h24
-rw-r--r--daemon/settings/settings_view_featured.c390
-rw-r--r--daemon/settings/settings_view_featured.h27
-rw-r--r--daemon/sim_controller.c769
-rw-r--r--daemon/sim_controller.h29
-rw-r--r--daemon/vi/vi_manager.c468
-rw-r--r--daemon/vi/vi_manager.h103
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 = "&#x2236;";
+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, &ampm_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 */
&noti,
- &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, &noti_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, &noti) != 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, &noti_pkgname);
notification_get_id(node->noti, NULL, &noti_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, &noti_pkgname);
notification_get_id(node->noti, NULL, &noti_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, &noti_pkgname);
notification_get_id(node->noti, NULL, &noti_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, &noti_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, &noti_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, &noti_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, &noti_pkgname);
- notification_get_application(noti, &noti_launch_pkgname);
notification_get_type(noti, &noti_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, &noti_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, &noti_type);
@@ -811,7 +838,7 @@ static void _quickpanel_noti_detailed_changed_cb(void *data, notification_type_e
notification_get_layout(noti_new, &noti_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, &noti_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, &noti_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, &noti_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, &noti_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, &noti_new) != NOTIFICATION_ERROR_NONE) {
+ ERR("failed to create a cloned notification");
+ continue;
}
- } else {
- notification_get_display_applist(noti_new, &noti_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, &noti_layout);
+
+ if (node != NULL && node->view != NULL && node->noti != NULL) {
+ notification_get_type(noti_new, &noti_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, &noti_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, &noti_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(&current_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(&current_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,
+ &noti_view_h,
+ &noti_view_h,
+ &noti_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, &noti_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, &noti_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 = {
+ &noti_view_listtype_h,
+ &noti_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, &noti_time);
+ if (noti_time == 0.0) {
+ notification_get_insert_time(noti, &noti_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, &noti_time);
+ if (noti_time == 0.0) {
+ notification_get_insert_time(noti, &noti_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, &noti_time);
+ if (noti_time == 0.0) {
+ notification_get_insert_time(noti, &noti_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, &noti_time);
+ if (noti_time == 0.0) {
+ notification_get_insert_time(noti, &noti_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, &noti_time);
+ if (noti_time == 0.0) {
+ notification_get_insert_time(noti, &noti_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, &noti_time);
+ if (noti_time == 0.0) {
+ notification_get_insert_time(noti, &noti_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, &noti_time);
+ if (noti_time == 0.0) {
+ noti_err = notification_get_insert_time(noti, &noti_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, &noti_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, &noti) != 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, &noti_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, &noti_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, &noti_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(&current_time);
+
+ DBG(" %s, after %d MIN alarm set", ctime(&current_time), min);
+ localtime_r(&current_time, &current_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, &noti_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