action_menu: add updating favorite area 25/46325/2
authorJehun Lim <jehun.lim@samsung.com>
Wed, 19 Aug 2015 07:37:59 +0000 (16:37 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Wed, 19 Aug 2015 08:06:56 +0000 (17:06 +0900)
Change-Id: I41a633cea8faca74274e9e99c80a836edc498783
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
src/view/action_menu.c

index 6b6d004..552ea19 100644 (file)
@@ -51,6 +51,8 @@ struct _priv {
        Evas_Object *tv_btn;
        Evas_Object *menu_btn[MAX_NUM_MENU];
        Evas_Object *grid;
+
+       Eina_List *favorite_list;
 };
 
 struct _menu_info {
@@ -156,6 +158,111 @@ static input_handler _handler = {
        .mouse_move = _mouse_move_cb
 };
 
+static char *_grid_text_get(void *data, Evas_Object *obj, const char *part)
+{
+       app_media *am;
+       app_media_info *info;
+       char buf[32];
+
+       if (!data)
+               return NULL;
+
+       am = data;
+
+       info = app_media_get_info(am);
+       if (!info) {
+               _ERR("failed to get media info");
+               return NULL;
+       }
+
+       if (!strcmp(part, PART_ELM_TEXT_TITLE))
+               return strdup(info->title);
+       else if (!strcmp(part, PART_ELM_TEXT_ARTIST))
+               return strdup(info->audio->artist);
+       else if (!strcmp(part, PART_ELM_TEXT_ALBUM))
+               return strdup(info->audio->album);
+       else if (!strcmp(part, PART_ELM_TEXT_PLAYTIME)) {
+               if (info->media_type != MEDIA_CONTENT_TYPE_VIDEO)
+                       return NULL;
+
+               util_time_string(buf, sizeof(buf),
+                                       info->video->duration, false);
+               return strdup(buf);
+       }
+
+       return NULL;
+}
+
+static Evas_Object *_grid_content_get(void *data,
+                       Evas_Object *obj, const char *part)
+{
+       Evas_Object *content;
+       app_media *am;
+       app_media_info *info;
+       struct color_data bg;
+
+       if (!data)
+               return NULL;
+
+       am = data;
+
+       info = app_media_get_info(am);
+       if (!info) {
+               _ERR("failed to get media info");
+               return NULL;
+       }
+
+       content = NULL;
+       if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) {
+               content = util_add_image(obj, info->thumbnail_path);
+               if (!content)
+                       goto err;
+
+               evas_object_show(content);
+       } else if (!strcmp(part, PART_ELM_SWALLOW_VIDEO)) {
+               if (info->media_type != MEDIA_CONTENT_TYPE_VIDEO)
+                       return NULL;
+
+               content = util_add_image(obj, IMAGE_THUMBNAIL_PLAY);
+               if (!content)
+                       goto err;
+
+               evas_object_show(content);
+       } else if (!strcmp(part, PART_ELM_SWALLOW_TEXTBG)) {
+               content = evas_object_rectangle_add(obj);
+               if (!content)
+                       goto err;
+
+               app_contents_get_color(info->title, NULL, &bg);
+               evas_object_color_set(content, bg.r, bg.g, bg.b, bg.a);
+
+               evas_object_show(content);
+       }
+
+       return content;
+
+err:
+       _ERR("failed to create evas object");
+       return NULL;
+}
+
+Elm_Gengrid_Item_Class *_get_grid_item_class(int type)
+{
+       Elm_Gengrid_Item_Class *ic;
+
+       ic = elm_gengrid_item_class_new();
+       if (!ic) {
+               _ERR("failed to create gengrid item class");
+               return NULL;
+       }
+
+       ic->func.text_get = _grid_text_get;
+       ic->func.content_get = _grid_content_get;
+       ic->item_style = content_info[type].style;
+
+       return ic;
+}
+
 static bool _check_movie_type(app_media_info *info)
 {
        return strcmp(info->video->copyright, VIDEO_COPYRIGHT);
@@ -186,6 +293,75 @@ static int _get_content_type(app_media_info *info)
        return type;
 }
 
+static void _free_favorite_list(Eina_List *list)
+{
+       app_media *am;
+
+       EINA_LIST_FREE(list, am)
+               app_media_destroy(am);
+}
+
+static void _favorite_list_foreach(gpointer data, gpointer user_data)
+{
+       media_info_h media;
+       app_media *am;
+       Eina_List **l;
+       int r;
+       char *id;
+
+       if (!data || !user_data) {
+               _ERR("invalid argument");
+               return;
+       }
+
+       id = (char *)data;
+       l = (Eina_List **)user_data;
+
+       r = media_info_get_media_from_db(id, &media);
+       if (r != MEDIA_CONTENT_ERROR_NONE) {
+               _ERR("failed to get media handle");
+               return;
+       }
+
+       am = app_media_create(media);
+       if (!am) {
+               _ERR("failed to create app media");
+               media_info_destroy(media);
+               return;
+       }
+
+       *l = eina_list_append(*l, am);
+}
+
+static Eina_List *_get_favorite_list(int type)
+{
+       GList *id_list;
+       Eina_List *list;
+       int r;
+
+       r = media_content_connect();
+       if (r != MEDIA_CONTENT_ERROR_NONE) {
+               _ERR("failed to connect to media content");
+               return NULL;
+       }
+
+       id_list = NULL;
+       if (app_contents_get_favorite_list(type, &id_list)
+               != APP_CONTENTS_ERROR_NONE) {
+               _ERR("failed to get favorite list");
+               return NULL;
+       }
+
+       list = NULL;
+       g_list_foreach(id_list, _favorite_list_foreach, &list);
+
+       app_contents_free_favorite_list(id_list);
+
+       media_content_disconnect();
+
+       return list;
+}
+
 static bool _draw_livetv_btn(struct _priv *priv)
 {
        Evas_Object *btn;
@@ -247,7 +423,8 @@ static bool _draw_menu_area(struct _priv *priv)
 
                inputmgr_add_callback(btn, ACTION_MENU_BTN, &_handler, priv);
 
-               elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_DOWN);
+               elm_object_focus_next_object_set(btn, priv->grid,
+                                       ELM_FOCUS_DOWN);
 
                priv->menu_btn[i] = btn;
        }
@@ -293,7 +470,31 @@ static bool _draw_favorite_area(struct _priv *priv)
 
 static void _update_favorite_area(struct _priv *priv, int type)
 {
-        /* It will implemented later */
+
+       Elm_Gengrid_Item_Class *ic;
+       Elm_Object_Item *it;
+       Eina_List *favorite_l, *l;
+       app_media *am;
+
+       elm_gengrid_clear(priv->grid);
+
+       elm_gengrid_item_size_set(priv->grid,
+                       elm_config_scale_get() * content_info[type].grid_x,
+                       elm_config_scale_get() * content_info[type].grid_y);
+
+       ic = _get_grid_item_class(type);
+
+       favorite_l = _get_favorite_list(content_info[type].app_contents_type);
+
+       EINA_LIST_FOREACH(favorite_l, l, am) {
+               it = elm_gengrid_item_append(priv->grid, ic, am, NULL, NULL);
+
+               elm_object_item_data_set(it, am);
+       }
+
+       elm_gengrid_item_class_free(ic);
+
+       priv->favorite_list = favorite_l;
 }
 
 static bool _draw_items(struct _priv *priv)
@@ -457,6 +658,9 @@ static void _destroy(void *view_data)
        for (i = 0; i < MAX_NUM_MENU; i++)
                inputmgr_remove_callback(priv->menu_btn[i], &_handler);
 
+       if (priv->favorite_list)
+               _free_favorite_list(priv->favorite_list);
+
        evas_object_del(priv->base);
 
        free(priv);