Get favorite list everytime when menu is changed 04/46804/1
authorHyojung Jo <hj903.jo@samsung.com>
Wed, 26 Aug 2015 08:43:21 +0000 (17:43 +0900)
committerHyojung Jo <hj903.jo@samsung.com>
Wed, 26 Aug 2015 08:43:21 +0000 (17:43 +0900)
Change-Id: I25697a82cd5c53c89c4110387c9e9aa536360ed9
Signed-off-by: Hyojung Jo <hj903.jo@samsung.com>
include/datamgr.h
include/grid.h
src/data/app.c
src/data/channel.c
src/data/media.c
src/grid/grid_apps.c
src/grid/grid_gallery.c
src/grid/grid_movie.c
src/grid/grid_music.c
src/grid/grid_tv.c
src/view/view_base.c

index be176d0..ead6b10 100644 (file)
@@ -36,6 +36,7 @@ struct datamgr {
        int (*get_count)(enum item_type type);
        char *(*get_data)(void *data, enum data_type type);
        bool (*action)(Elm_Object_Item *it, enum action_type type);
+       bool (*data_updated)(void *data1, void *data2);
 };
 
 struct datamgr *get_channel_datamgr(void);
index bc55ff6..924d89c 100644 (file)
@@ -31,6 +31,7 @@ struct grid_data {
        Eina_List *(*create_item_list)(void);
        void (*destroy_item_list)(Eina_List *list);
        bool (*item_action)(Elm_Object_Item *it, enum action_type type);
+       bool (*item_updated)(void *pre_data, void *new_data);
 };
 
 struct grid_data *get_tv_grid_data(void);
index 75fd6ab..4ba5330 100644 (file)
@@ -193,12 +193,26 @@ static bool _action(Elm_Object_Item *it, enum action_type type)
        return true;
 }
 
+static bool _data_updated(void *data1, void *data2)
+{
+       struct app_data *adata1, *adata2;
+
+       adata1 = data1;
+       adata2 = data2;
+
+       if (!strcmp(adata1->id, adata2->id))
+               return false;
+
+       return true;
+}
+
 static struct datamgr _dmgr = {
        .get_data = _get_data,
        .get_count = NULL,
        .get_favorites = _get_favorites,
        .free_favorites = _free_favorites,
        .action = _action,
+       .data_updated = _data_updated,
 };
 
 struct datamgr *get_apps_datamgr(void)
index 5d5cb50..5c0a138 100644 (file)
@@ -219,12 +219,26 @@ static bool _action(Elm_Object_Item *it, enum action_type type)
        return true;
 }
 
+static bool _data_updated(void *data1, void *data2)
+{
+       struct channel_data *cdata1, *cdata2;
+
+       cdata1 = data1;
+       cdata2 = data2;
+
+       if (cdata1->id == cdata2->id)
+               return false;
+
+       return true;
+}
+
 static struct datamgr _dmgr = {
        .get_data = _get_data,
        .get_count = NULL,
        .get_favorites = _get_favorites,
        .free_favorites = _free_favorites,
        .action = _action,
+       .data_updated = _data_updated,
 };
 
 struct datamgr *get_channel_datamgr(void)
index 7e17bbb..de3d126 100644 (file)
@@ -275,12 +275,39 @@ static bool _action(Elm_Object_Item *it, enum action_type type)
        return true;
 }
 
+static bool _data_updated(void *data1, void *data2)
+{
+       app_media *am1, *am2;
+       app_media_info *minfo1, *minfo2;
+
+       am1 = data1;
+       am2 = data2;
+
+       minfo1 = app_media_get_info(am1);
+       if (!minfo1) {
+               _ERR("Get app_media_info failed.");
+               return false;
+       }
+
+       minfo2 = app_media_get_info(am2);
+       if (!minfo2) {
+               _ERR("Get app_media_info failed.");
+               return false;
+       }
+
+       if (!strcmp(minfo1->media_id, minfo2->media_id))
+               return false;
+
+       return true;
+}
+
 static struct datamgr _dmgr = {
        .get_data = _get_data,
        .get_count = _get_count,
        .get_favorites = _get_favorites,
        .free_favorites = _free_favorites,
        .action = _action,
+       .data_updated = _data_updated,
 };
 
 struct datamgr *get_media_datamgr(void)
index 9ad702f..a7be106 100644 (file)
@@ -175,6 +175,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type)
        return true;
 }
 
+static bool _item_updated(void *pre_data, void *new_data)
+{
+       struct datamgr *dmgr;
+
+       dmgr = get_apps_datamgr();
+       if (!dmgr || !dmgr->data_updated)
+               return false;
+
+       return dmgr->data_updated(pre_data, new_data);
+}
+
 static struct grid_data _gdata = {
        .id = STR_APPS,
        .item_size_x = ITEM_APPS_X,
@@ -183,6 +194,7 @@ static struct grid_data _gdata = {
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
        .item_action = _item_action,
+       .item_updated = _item_updated,
 };
 
 struct grid_data *get_apps_grid_data(void)
index 224ec41..be85c2c 100644 (file)
@@ -154,6 +154,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type)
        return true;
 }
 
+static bool _item_updated(void *pre_data, void *new_data)
+{
+       struct datamgr *dmgr;
+
+       dmgr = get_media_datamgr();
+       if (!dmgr || !dmgr->data_updated)
+               return false;
+
+       return dmgr->data_updated(pre_data, new_data);
+}
+
 static struct grid_data _gdata = {
        .id = STR_GALLERY,
        .item_size_x = ITEM_GALLERY_X,
@@ -162,6 +173,7 @@ static struct grid_data _gdata = {
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
        .item_action = _item_action,
+       .item_updated = _item_updated,
 };
 
 struct grid_data *get_gallery_grid_data(void)
index 959c1b1..5ac0356 100644 (file)
@@ -178,6 +178,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type)
        return true;
 }
 
+static bool _item_updated(void *pre_data, void *new_data)
+{
+       struct datamgr *dmgr;
+
+       dmgr = get_media_datamgr();
+       if (!dmgr || !dmgr->data_updated)
+               return false;
+
+       return dmgr->data_updated(pre_data, new_data);
+}
+
 static struct grid_data _gdata = {
        .id = STR_MOVIE,
        .item_size_x = ITEM_MOVIE_X,
@@ -186,6 +197,7 @@ static struct grid_data _gdata = {
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
        .item_action = _item_action,
+       .item_updated = _item_updated,
 };
 
 struct grid_data *get_movie_grid_data(void)
index b723822..e6090c6 100644 (file)
@@ -152,6 +152,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type)
        return true;
 }
 
+static bool _item_updated(void *pre_data, void *new_data)
+{
+       struct datamgr *dmgr;
+
+       dmgr = get_media_datamgr();
+       if (!dmgr || !dmgr->data_updated)
+               return false;
+
+       return dmgr->data_updated(pre_data, new_data);
+}
+
 static struct grid_data _gdata = {
        .id = STR_MUSIC,
        .item_size_x = ITEM_MUSIC_X,
@@ -160,6 +171,7 @@ static struct grid_data _gdata = {
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
        .item_action = _item_action,
+       .item_updated = _item_updated,
 };
 
 struct grid_data *get_music_grid_data(void)
index 9849ff6..8ad32b4 100644 (file)
@@ -175,6 +175,17 @@ static bool _item_action(Elm_Object_Item *it, enum action_type type)
        return true;
 }
 
+static bool _item_updated(void *pre_data, void *new_data)
+{
+       struct datamgr *dmgr;
+
+       dmgr = get_channel_datamgr();
+       if (!dmgr || !dmgr->data_updated)
+               return false;
+
+       return dmgr->data_updated(pre_data, new_data);
+}
+
 static struct grid_data _gdata = {
        .id = STR_TV,
        .item_size_x = ITEM_TV_X,
@@ -183,6 +194,7 @@ static struct grid_data _gdata = {
        .create_item_list = _create_item_list,
        .destroy_item_list = _destroy_item_list,
        .item_action = _item_action,
+       .item_updated = _item_updated,
 };
 
 struct grid_data *get_tv_grid_data(void)
index c39c01b..d3b04de 100644 (file)
@@ -81,44 +81,66 @@ static void _draw_content_count(Evas_Object *base, int count, int id)
        }
 }
 
-static void _update_grid_item_list(struct _priv *priv, struct grid_data *gdata)
+static bool _item_list_updated(struct grid_data *gdata,
+               Eina_List *pre_list, Eina_List *new_list)
 {
-       gdata->list = gdata->create_item_list();
-       if (!gdata->list) {
-               elm_object_part_text_set(priv->base, PART_NO_CONTENTS,
-                               STR_NO_CONTENTS);
-               return;
+       int pre_cnt, new_cnt;
+       void *pre_data, *new_data;
+       int i;
+
+       pre_cnt = eina_list_count(pre_list);
+       new_cnt = eina_list_count(new_list);
+
+       if (pre_cnt != new_cnt)
+               return true;
+
+       for (i = 0; i < new_cnt; i++) {
+               pre_data = eina_list_nth(pre_list, i);
+               new_data = eina_list_nth(new_list, i);
+
+               if (gdata->item_updated(pre_data, new_data))
+                       return true;
        }
 
-       if (!gridmgr_append_list(priv->gmgr, gdata->id, gdata->list))
-               _ERR("Gridmgr append list failed.");
+       return false;
 }
 
-static bool _load_current_grid(struct _priv *priv, int id)
+static bool _update_current_grid(struct _priv *priv)
 {
        struct grid_data *gdata;
        Evas_Object *prev_grid;
+       Eina_List *pre_list;
 
-       if (!priv || !priv->gmgr || !priv->base) {
+       if (!priv->gmgr || !priv->base) {
                _ERR("Invalid argument.");
                return false;
        }
 
-       gdata = _get_grid_data[id]();
+       gdata = _get_grid_data[priv->cur_menu_id]();
        if (!gdata || !gdata->id || !gdata->grid)
                return false;
 
+       pre_list = gdata->list;
+       gdata->list = gdata->create_item_list();
+
        elm_object_part_text_set(priv->base, PART_NO_CONTENTS, "");
        prev_grid = elm_object_part_content_unset(priv->base, PART_GENGRID);
        evas_object_hide(prev_grid);
 
-       elm_object_part_content_set(priv->base, PART_GENGRID, gdata->grid);
-       evas_object_show(gdata->grid);
+       if (!gdata->list) {
+               elm_object_part_text_set(priv->base,
+                               PART_NO_CONTENTS, STR_NO_CONTENTS);
+       } else {
+               elm_object_part_content_set(priv->base,
+                               PART_GENGRID, gdata->grid);
+               evas_object_show(gdata->grid);
 
-       if (!gdata->list)
-               _update_grid_item_list(priv, gdata);
+               if (_item_list_updated(gdata, pre_list, gdata->list))
+                       gridmgr_append_list(priv->gmgr, gdata->id, gdata->list);
+       }
 
-       _draw_content_count(priv->base, eina_list_count(gdata->list), id);
+       _draw_content_count(priv->base, eina_list_count(gdata->list),
+                       priv->cur_menu_id);
 
        return true;
 }
@@ -158,7 +180,7 @@ static void _menu_focused_cb(int id, void *data, Evas_Object *obj,
 
        priv->cur_menu_id = id;
 
-       if (!_load_current_grid(priv, id))
+       if (!_update_current_grid(priv))
                _ERR("Load current grid view failed.");
 }
 
@@ -499,21 +521,13 @@ static void _hide(void *data)
 
 static void _update(void *view_data, int update_type, void *data)
 {
-       struct _priv *priv;
-       struct grid_data *gdata;
-
-       if (!view_data || !data) {
+       if (!view_data) {
                _ERR("Get data failed.");
                return;
        }
-       priv = view_data;
-       gdata = data;
 
-       if (update_type == UPDATE_GRID) {
-               _update_grid_item_list(priv, gdata);
-               _draw_content_count(priv->base, eina_list_count(gdata->list),
-                               priv->cur_menu_id);
-       }
+       if (update_type == UPDATE_GRID)
+               _update_current_grid(view_data);
 }
 
 static void _destroy(void *data)