From: Jehun Lim Date: Thu, 6 Aug 2015 08:30:25 +0000 (+0900) Subject: add launching routine from recent app X-Git-Tag: accepted/tizen/tv/20150807.043109~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=63a94f2e78740b022fa944141ffcf275a96ecdba;p=profile%2Ftv%2Fapps%2Fnative%2Fair_mediahub.git add launching routine from recent app Change-Id: I512e66d49f69e1bb347c1ec479cb20780e5a3523 Signed-off-by: Jehun Lim --- diff --git a/include/util/util.h b/include/util/util.h index 01977ef..01901f6 100644 --- a/include/util/util.h +++ b/include/util/util.h @@ -32,6 +32,7 @@ void util_time_string(char *str, int size, unsigned int ms, bool full); void util_up_string(char *str); int util_get_media_index(Eina_List *list, void *info); +int util_get_media_index_from_id(Eina_List *list, const char *id); app_media *util_find_media_info(Eina_List *list, const char *id); #endif /* __AIR_MEDIAHUB_UTIL_H__ */ diff --git a/include/view.h b/include/view.h index cd7992b..30a8a47 100644 --- a/include/view.h +++ b/include/view.h @@ -39,6 +39,7 @@ enum update_type { UPDATE_PLAY_INFO, UPDATE_PLAYER, UPDATE_FAVORITE, + UPDATE_RECENT, UPDATE_RESUME, }; diff --git a/src/layout/gallery.c b/src/layout/gallery.c index 20f5994..28db18e 100644 --- a/src/layout/gallery.c +++ b/src/layout/gallery.c @@ -147,6 +147,24 @@ static struct grid_class _gclass = { .content_get = _grid_content_get }; +static void _recent_item_selected(struct _priv *priv, app_media *am) +{ + app_media_info *info; + struct view_update_data vdata; + + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get app media info"); + return; + } + + vdata.list = mediadata_get_medialist(priv->md); + vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); + + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_VIEWER); +} + static void _grid_selected_cb(void *data, Elm_Object_Item *it) { app_media *am; @@ -402,18 +420,19 @@ static void _update(void *layout_data, int update_type, void *data) } priv = layout_data; - vdata = data; switch (update_type) { case UPDATE_CONTENT: _update_content_list(priv); break; case UPDATE_FOCUS: - if (!vdata) { + if (!data) { _ERR("invalid argument"); return; } + vdata = data; + if (priv->cur_index != vdata->index) update = true; else @@ -422,6 +441,15 @@ static void _update(void *layout_data, int update_type, void *data) listmgr_focus_content_list(priv->listmgr, vdata->index, update); break; + case UPDATE_RECENT: + if (!data) { + _ERR("invalid argument"); + return; + } + + _update_content_list(priv); + _recent_item_selected(priv, data); + break; case UPDATE_RESUME: listmgr_focus_content_list(priv->listmgr, priv->cur_index, false); diff --git a/src/layout/movie.c b/src/layout/movie.c index ba40e5f..202e8c4 100644 --- a/src/layout/movie.c +++ b/src/layout/movie.c @@ -273,7 +273,25 @@ static bool _draw_recent(void *data, Evas_Object *base) return true; } -static void _item_selected_cb(struct _priv *priv, app_media *am) +static void _recent_item_selected(struct _priv *priv, app_media *am) +{ + app_media_info *info; + struct view_update_data vdata; + + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get app media info"); + return; + } + + vdata.list = mediadata_get_medialist(priv->md); + vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); + + viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_VIEWER); +} + +static void _item_selected(struct _priv *priv, app_media *am) { struct view_update_data vdata; @@ -294,7 +312,7 @@ static void _recent_selected_cb(void *data, Evas_Object *obj) priv = data; - _item_selected_cb(priv, priv->recent_info); + _item_selected(priv, priv->recent_info); } static void _grid_selected_cb(void *data, Elm_Object_Item *it) @@ -315,7 +333,7 @@ static void _grid_selected_cb(void *data, Elm_Object_Item *it) return; } - _item_selected_cb(priv, am); + _item_selected(priv, am); } static struct listmgr_data *_create_listmgr_data(struct _priv *priv) @@ -613,7 +631,6 @@ static void _update(void *layout_data, int update_type, void *data) } priv = layout_data; - vdata = data; switch (update_type) { case UPDATE_CONTENT: @@ -621,14 +638,25 @@ static void _update(void *layout_data, int update_type, void *data) _update_recent_item(priv, -1); break; case UPDATE_FOCUS: - if (!vdata) { + if (!data) { _ERR("invalid argument"); return; } + vdata = data; + listmgr_focus_play_info(priv->listmgr); _update_recent_item(priv, vdata->index); break; + case UPDATE_RECENT: + if (!data) { + _ERR("invalid argument"); + return; + } + + _update_content_list(priv); + _recent_item_selected(priv, data); + break; case UPDATE_RESUME: listmgr_focus_content_list(priv->listmgr, priv->cur_index, false); diff --git a/src/layout/music.c b/src/layout/music.c index b9c6a63..bbf637a 100644 --- a/src/layout/music.c +++ b/src/layout/music.c @@ -248,7 +248,25 @@ static bool _draw_playing_info(void *data, Evas_Object *base) return true; } -static void _item_selected_cb(struct _priv *priv, app_media *am) +static void _recent_item_selected(struct _priv *priv, app_media *am) +{ + app_media_info *info; + struct view_update_data vdata; + + info = app_media_get_info(am); + if (!info) { + _ERR("failed to get app media info"); + return; + } + + vdata.list = mediadata_get_medialist(priv->md); + vdata.index = util_get_media_index_from_id(vdata.list, info->media_id); + + viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata); + viewmgr_push_view(VIEW_MPLAYER); +} + +static void _item_selected(struct _priv *priv, app_media *am) { struct view_update_data vdata; @@ -269,7 +287,7 @@ static void _playing_selected_cb(void *data, Evas_Object *obj) priv = data; - _item_selected_cb(priv, priv->playing_info); + _item_selected(priv, priv->playing_info); } static void _grid_selected_cb(void *data, Elm_Object_Item *it) @@ -290,7 +308,7 @@ static void _grid_selected_cb(void *data, Elm_Object_Item *it) return; } - _item_selected_cb(priv, am); + _item_selected(priv, am); } static struct listmgr_data *_create_listmgr_data(struct _priv *priv) @@ -582,7 +600,6 @@ static void _update(void *layout_data, int update_type, void *data) } priv = layout_data; - vdata = data; switch (update_type) { case UPDATE_CONTENT: @@ -590,16 +607,27 @@ static void _update(void *layout_data, int update_type, void *data) _update_playing_item(priv, -1); break; case UPDATE_PLAY_INFO: - if (!vdata) { + if (!data) { _ERR("invalid argument"); return; } + vdata = data; + _update_playing_item(priv, vdata->index); break; case UPDATE_FOCUS: listmgr_focus_play_info(priv->listmgr); break; + case UPDATE_RECENT: + if (!data) { + _ERR("invalid argument"); + return; + } + + _update_content_list(priv); + _recent_item_selected(priv, data); + break; case UPDATE_RESUME: listmgr_focus_content_list(priv->listmgr, priv->cur_index, false); diff --git a/src/main.c b/src/main.c index a77128d..e9707c8 100644 --- a/src/main.c +++ b/src/main.c @@ -30,6 +30,7 @@ #define PARAM_SENDER_ID "sender_id" #define APP_ID_FAVORITE "org.tizen.favorite" +#define APP_ID_RECENT "org.tizen.home" SET_TAG(PACKAGE) @@ -149,6 +150,11 @@ static void _app_control(app_control_h app_control, void *data) if (!strcmp(caller_id, APP_ID_FAVORITE)) viewmgr_update_view(VIEW_BASE, UPDATE_FAVORITE, media_id); + else if (!strcmp(caller_id, APP_ID_RECENT)) { + viewmgr_push_view(VIEW_BASE); + viewmgr_update_view(VIEW_BASE, + UPDATE_RECENT, media_id); + } } else viewmgr_push_view(VIEW_BASE); diff --git a/src/util/util.c b/src/util/util.c index a7c1d8e..41f0cd8 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -193,6 +193,28 @@ int util_get_media_index(Eina_List *list, void *data) return -1; } +int util_get_media_index_from_id(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; +} + app_media *util_find_media_info(Eina_List *list, const char *id) { Eina_List *l; diff --git a/src/view/base.c b/src/view/base.c index 1e20e26..928dde1 100644 --- a/src/view/base.c +++ b/src/view/base.c @@ -33,18 +33,25 @@ #define VIDEO_COPYRIGHT "Unknown" -#define MENU_BTN_SIZE 3 #define BOX_PADDING_SIZE 80 +enum _layout_type { + E_LAYOUT_MOVIE = 0, + E_LAYOUT_GALLERY, + E_LAYOUT_MUSIC, + E_LAYOUT_MAX +}; + struct _priv { Evas_Object *win; Evas_Object *base; - Evas_Object *btn[MENU_BTN_SIZE]; + Evas_Object *btn[E_LAYOUT_MAX]; Evas_Object *focused_btn; layoutmgr *lmgr; Eina_List *favorite_list; + app_media *recent_item; int current_layout; }; @@ -55,24 +62,34 @@ struct _menu_item { layout_class *(*func_get_lclass)(void); }; -static struct _menu_item g_menu_item[MENU_BTN_SIZE] = { - { +static struct _menu_item g_menu_item[E_LAYOUT_MAX] = { + [E_LAYOUT_MOVIE] = { "Movie", LAYOUT_MOVIE, layout_movie_get_lclass }, - { + [E_LAYOUT_GALLERY] = { "Gallery", LAYOUT_GALLERY, layout_gallery_get_lclass }, - { + [E_LAYOUT_MUSIC] = { "Music", LAYOUT_MUSIC, layout_music_get_lclass } }; +static void _set_current_layout(struct _priv *priv, int layout) +{ + layoutmgr_hide_layout(priv->lmgr, + g_menu_item[priv->current_layout].layout_id); + layoutmgr_show_layout(priv->lmgr, g_menu_item[layout].layout_id); + + priv->focused_btn = priv->btn[layout]; + priv->current_layout = layout; +} + static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) { @@ -114,22 +131,18 @@ static void _focused_cb(int id, void *data, Evas_Object *obj, elm_object_signal_emit(priv->focused_btn, SIG_BTN_UNSELECTED, SIG_SOURCE_SRC); - for (i = 0; i < MENU_BTN_SIZE; i++) { + for (i = 0; i < E_LAYOUT_MAX; i++) { if (priv->btn[i] == obj) break; } - if (i == MENU_BTN_SIZE) + if (i == E_LAYOUT_MAX) return; - layoutmgr_hide_layout(priv->lmgr, - g_menu_item[priv->current_layout].layout_id); - layoutmgr_show_layout(priv->lmgr, g_menu_item[i].layout_id); + _set_current_layout(priv, i); + layoutmgr_update_layout(priv->lmgr, g_menu_item[i].layout_id, UPDATE_CONTENT, NULL); - - priv->focused_btn = obj; - priv->current_layout = i; } static input_handler handler = { @@ -318,6 +331,69 @@ static void _update_favorite_view(struct _priv *priv, const char *id) media_content_disconnect(); } +static int _get_layout_type(app_media_info *info) +{ + int type; + + type = E_LAYOUT_MAX; + switch (info->media_type) { + case MEDIA_CONTENT_TYPE_IMAGE: + type = E_LAYOUT_GALLERY; + break; + case MEDIA_CONTENT_TYPE_VIDEO: + if (_check_movie_type(info)) + type = E_LAYOUT_MOVIE; + else + type = E_LAYOUT_GALLERY; + break; + case MEDIA_CONTENT_TYPE_MUSIC: + type = E_LAYOUT_MUSIC; + break; + default: + break; + } + + return type; +} + +static void _update_recent_view(struct _priv *priv, const char *id) +{ + app_media *am; + app_media_info *info; + 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_layout_type(info); + + _set_current_layout(priv, type); + + layoutmgr_update_layout(priv->lmgr, g_menu_item[type].layout_id, + UPDATE_RECENT, am); + + priv->recent_item = am; + + media_content_disconnect(); +} + static bool _draw_title(struct _priv *priv) { if (!priv) @@ -349,7 +425,7 @@ static bool _draw_menu_btn(struct _priv *priv) EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); - for (i = 0; i < MENU_BTN_SIZE; i++) { + for (i = 0; i < E_LAYOUT_MAX; i++) { btn = elm_button_add(box); if (!btn) { _ERR("failed to create button object"); @@ -372,10 +448,10 @@ static bool _draw_menu_btn(struct _priv *priv) elm_object_part_content_set(priv->base, PART_MENU_AREA, box); - elm_object_focus_next_object_set(priv->btn[MENU_BTN_SIZE - 1], + elm_object_focus_next_object_set(priv->btn[E_LAYOUT_MAX - 1], priv->btn[0], ELM_FOCUS_RIGHT); elm_object_focus_next_object_set(priv->btn[0], - priv->btn[MENU_BTN_SIZE - 1], ELM_FOCUS_LEFT); + priv->btn[E_LAYOUT_MAX - 1], ELM_FOCUS_LEFT); return true; } @@ -435,7 +511,7 @@ static Evas_Object *_create(Evas_Object *win, void *data) } lmgr = layoutmgr_create(base); - for (i = 0; i < MENU_BTN_SIZE; i++) + for (i = 0; i < E_LAYOUT_MAX; i++) layoutmgr_add_layout(lmgr, g_menu_item[i].func_get_lclass(), priv->btn[i]); @@ -505,6 +581,9 @@ static void _update(void *view_data, int update_type, void *data) case UPDATE_FAVORITE: _update_favorite_view(priv, data); break; + case UPDATE_RECENT: + _update_recent_view(priv, data); + break; default: break; } @@ -543,7 +622,7 @@ static void _destroy(void *view_data) priv = view_data; - for (i = 0; i < MENU_BTN_SIZE; i++) + for (i = 0; i < E_LAYOUT_MAX; i++) inputmgr_remove_callback(priv->btn[i], &handler); layoutmgr_remove_layout(priv->lmgr, LAYOUT_MOVIE); @@ -555,6 +634,8 @@ static void _destroy(void *view_data) if (priv->favorite_list) _free_favorite_list(priv->favorite_list); + app_media_destroy(priv->recent_item); + evas_object_del(priv->base); free(priv);