Add notification view implementation 76/42176/2
authorjinwoo.shin <jw0227.shin@samsung.com>
Wed, 24 Jun 2015 06:34:12 +0000 (15:34 +0900)
committerjinwoo.shin <jw0227.shin@samsung.com>
Wed, 24 Jun 2015 06:37:04 +0000 (15:37 +0900)
Change-Id: I6fe2a777b6f6eecefa495308a13de79615fbb71d
Signed-off-by: jinwoo.shin <jw0227.shin@samsung.com>
data/view/notification_view.edc
images/btn_bar_clearall_dis.png [moved from images/btn_clearall_dis.png with 100% similarity]
images/btn_bar_clearall_foc.png [moved from images/btn_clearall_foc.png with 100% similarity]
images/btn_bar_clearall_nor.png [moved from images/btn_clearall_nor.png with 100% similarity]
include/define.h
include/strings.h
src/notification_view.c

index 00b7a0f..26f0fc0 100644 (file)
 group {
        name: GRP_NOTIFICATION_VIEW;
        images {
-               image, "btn_clearall_dis.png" COMP;
-               image, "btn_clearall_foc.png" COMP;
-               image, "btn_clearall_nor.png" COMP;
+               image, "btn_bar_clearall_dis.png" COMP;
+               image, "btn_bar_clearall_foc.png" COMP;
+               image, "btn_bar_clearall_nor.png" COMP;
     }
        parts {
+               part {
+                       name, PART_NOTIFICATION_TITLE_BG;
+                       type, RECT;
+                       scale, 1;
+                       description {
+                               state, "default" 0.0;
+                               rel1.relative, 0.0 0.0;
+                               rel2.relative, 1.0 0.0;
+                               color, 255 255 255 255;
+                               min, 0 104;
+                               align, 0.0 0.0;
+                               fixed, 1 1;
+                               visible, 1;
+                       }
+               }
+               part {
+                       name, PART_NOTIFICATION_TITLE;
+                       type, TEXT;
+                       scale, 1;
+                       description {
+                               state, "default" 0.0;
+                               rel1.to, PART_NOTIFICATION_TITLE_BG;
+                               rel2.to, PART_NOTIFICATION_TITLE_BG;
+                               text {
+                                       font, FONT_REGULAR;
+                                       text, STR_NOTIFICATION_TITLE;
+                                       size, 46;
+                                       align, 0.5 0.5;
+                               }
+                               color, 51 51 51 255;
+                               min, 0 104;
+                               align, 0.0 0.0;
+                               fixed, 1 1;
+                               visible, 1;
+                       }
+               }
+               part {
+                       name, PART_NOTIFICATION_CLEAR_BG;
+                       type, RECT;
+                       scale, 1;
+                       description {
+                               rel1 {
+                                       to, PART_NOTIFICATION_TITLE;
+                                       relative, 1.0 0.0;
+                               }
+                               rel2 {
+                                       to, PART_NOTIFICATION_TITLE;
+                                       relative, 1.0 1.0;
+                               }
+                               min, 82 104;
+                               align, 1.0 0.0;
+                               fixed, 1 1;
+                               visible, 0;
+                       }
+                       description {
+                               state, "focused" 0.0;
+                               inherit, "default" 0.0;
+                               color, 0 119 246 255;
+                               visible, 1;
+                       }
+               }
+               part {
+                       name, PART_NOTIFICATION_CLEAR;
+                       type, IMAGE;
+                       scale, 1;
+                       description {
+                               state, "default" 0.0;
+                               rel1.to, PART_NOTIFICATION_CLEAR_BG;
+                               rel2.to, PART_NOTIFICATION_CLEAR_BG;
+                               image.normal, "btn_bar_clearall_nor.png";
+                               align, 0.0 0.0;
+                               fixed, 1 1;
+                               visible, 1;
+                       }
+                       description {
+                               state, "disabled" 0.0;
+                               inherit, "default" 0.0;
+                               image.normal, "btn_bar_clearall_dis.png";
+                       }
+                       description {
+                               state, "focused" 0.0;
+                               inherit, "default" 0.0;
+                               image.normal, "btn_bar_clearall_foc.png";
+                       }
+               }
+               part {
+                       name, PART_NOTIFICATION_CONTENT_BG;
+                       type, RECT;
+                       scale, 1;
+                       description {
+                               rel1 {
+                                       to_y, PART_NOTIFICATION_TITLE_BG;
+                                       relative, 0.0 1.0;
+                               }
+                               min, 0 976;
+                               color, 244 244 244 255;
+                               fixed, 1 1;
+                               visible, 1;
+                       }
+               }
+               part {
+                       name, "padding.notification.content";
+                       type, SPACER;
+                       scale, 1;
+                       description {
+                               rel1 {
+                                       to_y, PART_NOTIFICATION_CONTENT_BG;
+                                       relative, 0.0 0.0;
+                               }
+                               rel2 {
+                                       to_y, PART_NOTIFICATION_CONTENT_BG;
+                                       relative, 1.0 0.0;
+                               }
+                               min, 0 132;
+                               fixed, 1 1;
+                       }
+                       description {
+                               state, "no_notification" 0.0;
+                               inherit, "default" 0.0;
+                               min, 0 196;
+                       }
+               }
+               part {
+                       name, PART_CONTENT;
+                       type, SWALLOW;
+                       scale, 1;
+                       description {
+                               state, "default" 0.0;
+                               rel1 {
+                                       to, "padding.notification.content";
+                                       relative, 0.0 1.0;
+                               }
+                               rel2 {
+                                       to, "padding.notification.content";
+                                       relative, 1.0 1.0;
+                               }
+                               min, 0 678;
+                               align, 0.0 0.0;
+                               fixed, 0 1;
+                               visible, 1;
+                       }
+                       description {
+                               state, "no_notification" 0.0;
+                               inherit, "default" 0.0;
+                               visible, 0;
+                       }
+               }
+               part {
+                       name, PART_NOTIFICATION_NO_NOTIFICATION_BG;
+                       type, RECT;
+                       scale, 1;
+                       description {
+                               state, "default" 0.0;
+                               rel1 {
+                                       to_y, "padding.notification.content";
+                                       relative, 0.5 1.0;
+                               }
+                               rel2 {
+                                       to_y, "padding.notification.content";
+                                       relative, 0.5 1.0;
+                               }
+                               color, 229 229 229 255;
+                               min, 1796 788;
+                               align, 0.5 0.0;
+                               fixed, 1 1;
+                               visible, 0;
+                       }
+                       description {
+                               state, "no_notification" 0.0;
+                               inherit, "default" 0.0;
+                               visible, 1;
+                       }
+
+                       part {
+                               name, PART_NOTIFICATION_NO_NOTIFICATION;
+                               type, TEXT;
+                               scale, 1;
+                               description {
+                                       state, "default" 0.0;
+                                       text {
+                                               font, FONT_REGULAR;
+                                               text, STR_NONOTIFICATION;
+                                               size, 40;
+                                               align, 0.5 0.5;
+                                       }
+                                       color, 0 0 0 179;
+                                       align, 0.0 0.0;
+                                       fixed, 0 1;
+                                       visible, 0;
+                               }
+                               description {
+                                       state, "no_notification" 0.0;
+                                       inherit, "default" 0.0;
+                                       visible, 1;
+                               }
+                       }
+               }
        }
        programs {
+               program {
+                       name, "no_notification";
+                       signal, SIGNAL_NO_NOTIFICATION;
+                       source, SOURCE_PROGRAM;
+                       action, STATE_SET "no_notification" 0.0;
+                       target, PART_CONTENT;
+                       target, "padding.notification.content";
+                       target, PART_NOTIFICATION_NO_NOTIFICATION;
+                       target, PART_NOTIFICATION_NO_NOTIFICATION_BG;
+               }
+               program {
+                       name, "notification";
+                       signal, SIGNAL_NOTIFICATION;
+                       action, STATE_SET "default" 0.0;
+                       source, SOURCE_PROGRAM;
+                       target, PART_CONTENT;
+                       target, "padding.notification.content";
+                       target, PART_NOTIFICATION_NO_NOTIFICATION;
+                       target, PART_NOTIFICATION_NO_NOTIFICATION_BG;
+               }
+       }
+}
+group {
+       name: GRP_NOTIFICATION_CATEGORY;
+       parts {
+               part {
+                       name, "margin.left";
+                       type, SPACER;
+                       scale, 1;
+                       description {
+                               rel1.relative, 0.0 0.0;
+                               rel2.relative, 0.0 1.0;
+                               state, "default" 0.0;
+                               min, 62 0;
+                               align, 0.0 0.0;
+                               fixed, 1 1;
+                       }
+               }
+               part {
+                       name, PART_NOTIFICATION_CATEGORY_TITLE;
+                       type, TEXT;
+                       scale, 1;
+                       description {
+                               state, "default" 0.0;
+                               rel1 {
+                                       to_x, "margin.left";
+                                       relative, 1.0 0.0;
+                               }
+                               rel2.relative, 1.0 0.0;
+                               text {
+                                       font, FONT_LIGHT;
+                                       size, 36;
+                                       align, 0.0 0.5;
+                                       min, 1 1;
+                                       ellipsis, -1;
+                               }
+                               min, 0 36;
+                               color, 77 77 77 255;
+                               align, 0.0 0.0;
+                               fixed, 0 1;
+                               visible, 1;
+                       }
+                       description {
+                               state, "focused" 0.0;
+                               inherit, "default" 0.0;
+                               color, 255 255 255 255;
+                       }
+               }
+               part {
+                       name, "padding.notification.category.content";
+                       type, SPACER;
+                       scale, 1;
+                       description {
+                               state, "default" 0.0;
+                               rel1 {
+                                       to_y, PART_NOTIFICATION_CATEGORY_TITLE;
+                                       relative, 0.0 1.0;
+                               }
+                               rel2 {
+                                       to_y, PART_NOTIFICATION_CATEGORY_TITLE;
+                                       relative, 1.0 1.0;
+                               }
+                               min, 0 28;
+                               align, 0.0 0.0;
+                               fixed, 0 1;
+                       }
+               }
+               part {
+                       name, PART_CONTENT;
+                       type, SWALLOW;
+                       scale, 1;
+                       description {
+                               state, "default" 0.0;
+                               rel1 {
+                                       to_x, "margin.left";
+                                       to_y, "padding.notification.category.content";
+                                       relative, 1.0 1.0;
+                               }
+                               rel2 {
+                                       to_y, "padding.notification.category.content";
+                                       relative, 1.0 1.0;
+                               }
+                               min, 0 614;
+                               align, 0.0 0.0;
+                               fixed, 0 1;
+                               visible, 1;
+                       }
+               }
        }
 }
index fc67269..2928002 100644 (file)
 /* Definitions for notification view */
 #define NOTIFICATION_VIEW "NOTIFICATION_VIEW"
 #define GRP_NOTIFICATION_VIEW "grp.notification.view"
+#define PART_NOTIFICATION_TITLE "part.notification.title"
+#define PART_NOTIFICATION_TITLE_BG "part.notification.title.bg"
+#define PART_NOTIFICATION_CLEAR "part.notification.clear"
+#define PART_NOTIFICATION_CLEAR_BG "part.notification.clear.bg"
+#define PART_NOTIFICATION_NO_NOTIFICATION "part.notification.no_notification"
+#define PART_NOTIFICATION_CONTENT "part.notification.content"
+#define PART_NOTIFICATION_CONTENT_BG "part.notification.content.bg"
+#define GRP_NOTIFICATION_CATEGORY "grp.notification.category"
+#define PART_NOTIFICATION_CATEGORY_TITLE "part.notification.category.title"
+#define PART_NOTIFICATION_CATEGORY_CONTENT "part.notification.category.content"
 
 /* Definitions for infosquare view */
 #define SQUARE_VIEW "SQUARE_VIEW"
index 0e8a11d..964dc7a 100644 (file)
 #define STR_NOTIFICATION_TITLE "Notification Center"
 #define STR_NONOTIFICATION "No Notification"
 #define STR_CLEAR_ALL "Clear All"
+#define STR_CATEGORY_TODAY "Today"
+#define STR_CATEGORY_ONGOING "On going"
+#define STR_CATEGORY_TV "TV"
+#define STR_CATEGORY_COMMUNICATION "Communication"
+#define STR_CATEGORY_EVENT "Event"
+#define STR_CATEGORY_THINGS "Things"
+#define STR_CATEGORY_INFORMATION "Information & Notification"
+#define STR_CATEGORY_FILE "File"
 
 #define STR_SQUARE_TITLE STR_NOTIFICATION_TITLE
 #define STR_NOTIFICATION_LIST_TITLE "Recent Notification"
index 6a0bea3..b4ec9a4 100644 (file)
 #include <viewmgr.h>
 #include <inputmgr.h>
 #include <app_debug.h>
+#include <notification.h>
+#include <notification_noti.h>
 
 #include "define.h"
 
+#define STYLE_GRID_ITEM "default_2text"
+#define PART_ITEM_CONTENT "elm.text2"
+
+#define NOTIFICATION_CATEGORY_PADDING_X 62
+#define NOTIFICATION_CATEGORY_PADDING_Y 0
+#define NOTIFICATION_CATEGORY_HEIGHT 620
+#define NOTIFICATION_ITEM_WIDTH 489
+#define NOTIFICATION_ITEM_HEIGHT 134
+#define NOTIFICATION_ITEM_PADDING 26
+#define NOTIFICATION_ITEMS_IN_COL 4.0
+
+enum notification_category {
+       CATEGORY_FIRST = 0,
+       CATEGORY_TODAY = CATEGORY_FIRST,
+       CATEGORY_ONGOING,
+       CATEGORY_TV,
+       CATEGORY_COMMUNICATION,
+       CATEGORY_EVENT,
+       CATEGORY_THINGS,
+       CATEGORY_INFORMATION,
+       CATEGORY_FILE,
+       CATEGORY_MAX
+};
+
 struct _priv {
        Evas_Object *base;
+       Evas_Object *clear_btn;
+       Evas_Object *category_container;
+       Evas_Object *category[CATEGORY_MAX];
+       Elm_Gengrid_Item_Class *grid_class;
 };
 
+static const char *_get_category_title(int category)
+{
+       switch (category) {
+       case CATEGORY_TODAY:
+               return STR_CATEGORY_TODAY;
+       case CATEGORY_ONGOING:
+               return STR_CATEGORY_ONGOING;
+       case CATEGORY_TV:
+               return STR_CATEGORY_TV;
+       case CATEGORY_COMMUNICATION:
+               return STR_CATEGORY_COMMUNICATION;
+       case CATEGORY_EVENT:
+               return STR_CATEGORY_EVENT;
+       case CATEGORY_THINGS:
+               return STR_CATEGORY_THINGS;
+       case CATEGORY_INFORMATION:
+               return STR_CATEGORY_INFORMATION;
+       case CATEGORY_FILE:
+               return STR_CATEGORY_FILE;
+       default:
+               return NULL;
+       }
+}
+
+static void _draw_category(struct _priv *priv, int category,
+               notification_list_h noti_list)
+{
+       notification_h noti;
+       Evas_Object *ly;
+       int count = 0, col, w;
+
+       if (category < CATEGORY_FIRST ||
+                       category >= CATEGORY_MAX) {
+               _ERR("Undefined category");
+               return;
+       }
+
+       ly = elm_layout_add(priv->category_container);
+       elm_layout_file_set(ly, EDJEFILE, GRP_NOTIFICATION_CATEGORY);
+       evas_object_size_hint_align_set(ly, 0.0, 0.0);
+
+       elm_object_part_text_set(ly, PART_NOTIFICATION_CATEGORY_TITLE,
+                       _get_category_title(category));
+
+       priv->category[category] = elm_gengrid_add(ly);
+       elm_gengrid_item_size_set(priv->category[category],
+                       NOTIFICATION_ITEM_WIDTH, NOTIFICATION_ITEM_HEIGHT);
+       elm_gengrid_align_set(priv->category[category], 0.0, 0.0);
+       elm_gengrid_horizontal_set(priv->category[category], EINA_TRUE);
+       elm_scroller_policy_set(priv->category[category],
+                       ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+       evas_object_size_hint_weight_set(priv->category[category],
+                       EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       elm_object_content_set(ly, priv->category[category]);
+
+       elm_box_pack_end(priv->category_container, ly);
+       evas_object_show(ly);
+
+       while (noti_list != NULL) {
+               noti = notification_list_get_data(noti_list);
+               elm_gengrid_item_append(priv->category[category],
+                               priv->grid_class, noti, NULL, noti);
+
+               noti_list = notification_list_remove(noti_list, noti);
+               count++;
+       }
+
+       col = ceil(count / NOTIFICATION_ITEMS_IN_COL);
+       w = col * NOTIFICATION_ITEM_WIDTH
+                       + (col - 1) * NOTIFICATION_ITEM_PADDING;
+       evas_object_size_hint_min_set(priv->category[category],
+                       w, NOTIFICATION_CATEGORY_HEIGHT);
+}
+
+static void _update_list(struct _priv *priv)
+{
+       notification_list_h noti_list = NULL;
+
+       elm_box_clear(priv->category_container);
+
+       notification_get_list(NOTIFICATION_TYPE_NOTI, -1, &noti_list);
+       if (noti_list) {
+               elm_object_signal_emit(priv->base,
+                               SIGNAL_NOTIFICATION, SOURCE_PROGRAM);
+
+               _draw_category(priv, CATEGORY_TODAY, noti_list);
+       } else {
+               elm_object_signal_emit(priv->base,
+                               SIGNAL_NO_NOTIFICATION, SOURCE_PROGRAM);
+       }
+}
+
+static char *_grid_label_get(void *data,
+               Evas_Object *obj,
+               const char *part)
+{
+       notification_h noti = data;
+       char *buf = NULL;
+
+       if (!noti)
+               return NULL;
+
+       if (!strcmp(part, PART_TITLE)) {
+               notification_get_text(noti, NOTIFICATION_TEXT_TYPE_TITLE, &buf);
+               if (!buf)
+                       notification_get_pkgname(noti, &buf);
+
+               return buf ? strdup(buf) : NULL;
+       } else if (!strcmp(part, PART_ITEM_CONTENT)) {
+               notification_get_text(noti,
+                               NOTIFICATION_TEXT_TYPE_CONTENT, &buf);
+               return buf ? strdup(buf) : NULL;
+       }
+
+       return NULL;
+}
+
+static Evas_Object *_grid_content_get(void *data,
+               Evas_Object *obj,
+               const char *part)
+{
+       notification_h noti = data;
+       char *icon_path = NULL;
+
+       if (!noti)
+               return NULL;
+
+       if (!strcmp(part, PART_ICON)) {
+               notification_get_image(noti,
+                               NOTIFICATION_IMAGE_TYPE_ICON,
+                               &icon_path);
+
+               if (!icon_path)
+                       return NULL;
+
+               Evas_Object *icon = elm_image_add(obj);
+
+               elm_image_file_set(icon, icon_path, NULL);
+               evas_object_show(icon);
+
+               return icon;
+       }
+
+       return NULL;
+}
+
+static void _grid_del(void *data, Evas_Object *obj)
+{
+       notification_h noti = data;
+
+       if (!noti)
+               return;
+
+       notification_free(noti);
+}
+
 static Evas_Object *_create(Evas_Object *win, void *data)
 {
        struct _priv *priv;
-       Evas_Object *base;
+       Evas_Object *scroller;
 
        if (!win) {
                _ERR("failed to get win object");
@@ -41,22 +227,41 @@ static Evas_Object *_create(Evas_Object *win, void *data)
                return NULL;
        }
 
-       base = elm_layout_add(win);
-       if (!base) {
+       priv->base = elm_layout_add(win);
+       if (!priv->base) {
                _ERR("failed to create base object");
                free(priv);
                return NULL;
        }
-       elm_layout_file_set(base, EDJEFILE, GRP_NOTIFICATION_VIEW);
+       elm_layout_file_set(priv->base, EDJEFILE, GRP_NOTIFICATION_VIEW);
 
-       evas_object_size_hint_weight_set(base,
+       evas_object_size_hint_weight_set(priv->base,
                        EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       elm_win_resize_object_add(win, base);
+       elm_win_resize_object_add(win, priv->base);
+
+       scroller = elm_scroller_add(priv->base);
+       evas_object_size_hint_align_set(scroller, 0.0, 0.0);
+       elm_object_content_set(priv->base, scroller);
+
+       priv->category_container = elm_box_add(priv->base);
+       elm_object_content_set(priv->base, priv->category_container);
+       elm_box_align_set(priv->category_container, 0.0, 0.0);
+       elm_box_horizontal_set(priv->category_container, EINA_TRUE);
+       elm_box_padding_set(priv->category_container,
+                       NOTIFICATION_CATEGORY_PADDING_X,
+                       NOTIFICATION_CATEGORY_PADDING_Y);
+       evas_object_show(priv->category_container);
+
+       priv->grid_class = elm_gengrid_item_class_new();
+       priv->grid_class->item_style = STYLE_GRID_ITEM;
+       priv->grid_class->func.text_get = _grid_label_get;
+       priv->grid_class->func.content_get = _grid_content_get;
+       priv->grid_class->func.state_get = NULL;
+       priv->grid_class->func.del = _grid_del;
 
-       priv->base = base;
        viewmgr_set_view_data(NOTIFICATION_VIEW, priv);
 
-       return base;
+       return priv->base;
 }
 
 static void _show(void *view_data)
@@ -70,6 +275,8 @@ static void _show(void *view_data)
 
        priv = (struct _priv *) view_data;
 
+       _update_list(priv);
+
        evas_object_show(priv->base);
 }
 
@@ -100,6 +307,8 @@ static void _destroy(void *view_data)
 
        evas_object_del(priv->base);
 
+       elm_gengrid_item_class_free(priv->grid_class);
+
        free(priv);
 }