From 17fb47587ad676770b2f95fe0c5ea495cf0e4099 Mon Sep 17 00:00:00 2001 From: Jehun Lim Date: Tue, 4 Aug 2015 15:49:43 +0900 Subject: [PATCH] launch as viewer or player view when showing favorite item Change-Id: I6bdcd7aba4c4b36e2c1dd28798d1591c45ed5181 Signed-off-by: Jehun Lim --- CMakeLists.txt | 1 + include/view.h | 1 + packaging/org.tizen.mediahub.spec | 1 + src/main.c | 27 ++++- src/view/base.c | 210 +++++++++++++++++++++++++++++++++++++- 5 files changed, 235 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6c18cf..b377c56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,7 @@ PROJECT("mediahub" C) INCLUDE(FindPkgConfig) pkg_check_modules(PKGS REQUIRED + glib-2.0 elementary capi-appfw-application capi-media-player diff --git a/include/view.h b/include/view.h index ad62dd6..cd7992b 100644 --- a/include/view.h +++ b/include/view.h @@ -38,6 +38,7 @@ enum update_type { UPDATE_FOCUS, UPDATE_PLAY_INFO, UPDATE_PLAYER, + UPDATE_FAVORITE, UPDATE_RESUME, }; diff --git a/packaging/org.tizen.mediahub.spec b/packaging/org.tizen.mediahub.spec index ddeabd9..0470594 100644 --- a/packaging/org.tizen.mediahub.spec +++ b/packaging/org.tizen.mediahub.spec @@ -8,6 +8,7 @@ Source0: %{name}-%{version}.tar.gz Source1: %{name}.manifest BuildRequires: cmake +BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(elementary) BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(capi-media-player) diff --git a/src/main.c b/src/main.c index 0903192..f72b14c 100644 --- a/src/main.c +++ b/src/main.c @@ -25,6 +25,11 @@ #define MEDIAHUB_WIN_TITLE "Media Hub" +#define PARAM_MEDIA_ID "media_id" +#define PARAM_SENDER_ID "sender_id" + +#define SENDER_FAVORITE "Favorite" + SET_TAG(PACKAGE) struct _appdata { @@ -116,6 +121,9 @@ static void _terminate(void *data) static void _app_control(app_control_h app_control, void *data) { struct _appdata *ad; + char *media_id; + char *sender_id; + int r; if (!data) { _ERR("failed to get data"); @@ -127,7 +135,24 @@ static void _app_control(app_control_h app_control, void *data) if (ad->win) elm_win_activate(ad->win); - viewmgr_push_view(VIEW_BASE); + r = app_control_get_extra_data(app_control, PARAM_MEDIA_ID, &media_id); + if (r != APP_CONTROL_ERROR_NONE) + media_id = NULL; + + r = app_control_get_extra_data(app_control, + PARAM_SENDER_ID, &sender_id); + if (r != APP_CONTROL_ERROR_NONE) + sender_id = NULL; + + if (media_id && sender_id) { + if (!strcmp(sender_id, SENDER_FAVORITE)) + viewmgr_update_view(VIEW_BASE, + UPDATE_FAVORITE, media_id); + } else + viewmgr_push_view(VIEW_BASE); + + free(media_id); + free(sender_id); } static void _pause(void *data) diff --git a/src/view/base.c b/src/view/base.c index b5204ed..1e20e26 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -14,9 +14,13 @@ * limitations under the License. */ +#include #include #include +#include #include +#include +#include #include #include #include @@ -27,6 +31,8 @@ #define TITLE_TEXT "Media Hub" +#define VIDEO_COPYRIGHT "Unknown" + #define MENU_BTN_SIZE 3 #define BOX_PADDING_SIZE 80 @@ -38,6 +44,8 @@ struct _priv { layoutmgr *lmgr; + Eina_List *favorite_list; + int current_layout; }; @@ -130,6 +138,186 @@ static input_handler handler = { .focused = _focused_cb }; +static bool _check_movie_type(app_media_info *info) +{ + return strcmp(info->video->copyright, VIDEO_COPYRIGHT); +} + +static app_media *_get_app_media(const char *id) +{ + media_info_h media; + app_media *am; + int r; + + r = media_info_get_media_from_db(id, &media); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to get media handle"); + return NULL; + } + + am = app_media_create(media); + if (!am) { + _ERR("failed to create app media"); + return NULL; + } + + return am; +} + +static int _get_content_type(app_media_info *info) +{ + int type; + + type = -1; + switch (info->media_type) { + case MEDIA_CONTENT_TYPE_IMAGE: + type = CONTENTS_GALLERY; + break; + case MEDIA_CONTENT_TYPE_VIDEO: + if (_check_movie_type(info)) + type = CONTENTS_MOVIE; + else + type = CONTENTS_GALLERY; + break; + case MEDIA_CONTENT_TYPE_MUSIC: + type = CONTENTS_MUSIC; + break; + default: + break; + } + + return type; +} + +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 void _free_favorite_list(Eina_List *list) +{ + app_media *am; + + EINA_LIST_FREE(list, am) + app_media_destroy(am); +} + +static Eina_List *_get_favorite_list(int type) +{ + GList *id_list; + Eina_List *list; + + 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); + + return list; +} + +static int _get_media_index(Eina_List *list, const char *id) +{ + Eina_List *l; + app_media *am; + app_media_info *info; + int index; + + index = 0; + EINA_LIST_FOREACH(list, l, am) { + info = app_media_get_info(am); + if (!info) + continue; + + if (!strcmp(id, info->media_id)) + return index; + + index++; + } + + return -1; +} + +static void _update_favorite_view(struct _priv *priv, const char *id) +{ + app_media *am; + app_media_info *info; + struct view_update_data vdata; + int type; + int r; + + r = media_content_connect(); + if (r != MEDIA_CONTENT_ERROR_NONE) { + _ERR("failed to connect to media content"); + return; + } + + am = _get_app_media(id); + if (!am) { + _ERR("failed to get app media"); + return; + } + + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get app media info"); + app_media_destroy(am); + return; + } + + type = _get_content_type(info); + + vdata.list = _get_favorite_list(type); + vdata.index = _get_media_index(vdata.list, info->media_id); + + if (type == CONTENTS_MOVIE || type == CONTENTS_GALLERY) { + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_VIEWER); + } else if (type == CONTENTS_MUSIC) { + viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_MPLAYER); + } + + priv->favorite_list = vdata.list; + + app_media_destroy(am); + + media_content_disconnect(); +} + static bool _draw_title(struct _priv *priv) { if (!priv) @@ -304,11 +492,22 @@ static void _update(void *view_data, int update_type, void *data) } priv = view_data; - vdata = data; - layoutmgr_update_layout(priv->lmgr, - g_menu_item[priv->current_layout].layout_id, - update_type, vdata); + switch (update_type) { + case UPDATE_FOCUS: + case UPDATE_PLAY_INFO: + vdata = data; + + layoutmgr_update_layout(priv->lmgr, + g_menu_item[priv->current_layout].layout_id, + update_type, vdata); + break; + case UPDATE_FAVORITE: + _update_favorite_view(priv, data); + break; + default: + break; + } } static void _pause(void *view_data) @@ -353,6 +552,9 @@ static void _destroy(void *view_data) layoutmgr_destroy(priv->lmgr); + if (priv->favorite_list) + _free_favorite_list(priv->favorite_list); + evas_object_del(priv->base); free(priv); -- 2.7.4