add launching routine from recent app 65/45465/2
authorJehun Lim <jehun.lim@samsung.com>
Thu, 6 Aug 2015 08:30:25 +0000 (17:30 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Thu, 6 Aug 2015 10:06:09 +0000 (19:06 +0900)
Change-Id: I512e66d49f69e1bb347c1ec479cb20780e5a3523
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
include/util/util.h
include/view.h
src/layout/gallery.c
src/layout/movie.c
src/layout/music.c
src/main.c
src/util/util.c
src/view/base.c

index 01977ef..01901f6 100644 (file)
@@ -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__ */
index cd7992b..30a8a47 100644 (file)
@@ -39,6 +39,7 @@ enum update_type {
        UPDATE_PLAY_INFO,
        UPDATE_PLAYER,
        UPDATE_FAVORITE,
+       UPDATE_RECENT,
        UPDATE_RESUME,
 };
 
index 20f5994..28db18e 100644 (file)
@@ -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);
index ba40e5f..202e8c4 100644 (file)
@@ -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);
index b9c6a63..bbf637a 100644 (file)
@@ -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);
index a77128d..e9707c8 100644 (file)
@@ -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);
 
index a7c1d8e..41f0cd8 100644 (file)
@@ -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;
index 1e20e26..928dde1 100644 (file)
 
 #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);