launch as viewer or player view when showing favorite item 53/45253/4
authorJehun Lim <jehun.lim@samsung.com>
Tue, 4 Aug 2015 06:49:43 +0000 (15:49 +0900)
committerJehun Lim <jehun.lim@samsung.com>
Tue, 4 Aug 2015 08:28:59 +0000 (17:28 +0900)
Change-Id: I6bdcd7aba4c4b36e2c1dd28798d1591c45ed5181
Signed-off-by: Jehun Lim <jehun.lim@samsung.com>
CMakeLists.txt
include/view.h
packaging/org.tizen.mediahub.spec
src/main.c
src/view/base.c

index e6c18cf..b377c56 100644 (file)
@@ -18,6 +18,7 @@ PROJECT("mediahub" C)
 
 INCLUDE(FindPkgConfig)
 pkg_check_modules(PKGS REQUIRED
+               glib-2.0
                elementary
                capi-appfw-application
                capi-media-player
index ad62dd6..cd7992b 100644 (file)
@@ -38,6 +38,7 @@ enum update_type {
        UPDATE_FOCUS,
        UPDATE_PLAY_INFO,
        UPDATE_PLAYER,
+       UPDATE_FAVORITE,
        UPDATE_RESUME,
 };
 
index ddeabd9..0470594 100644 (file)
@@ -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)
index 0903192..f72b14c 100644 (file)
 
 #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)
index b5204ed..1e20e26 100644 (file)
  * limitations under the License.
  */
 
+#include <glib.h>
 #include <app.h>
 #include <Elementary.h>
+#include <media_content.h>
 #include <app_debug.h>
+#include <app_contents.h>
+#include <app_media.h>
 #include <inputmgr.h>
 #include <viewmgr.h>
 #include <layoutmgr.h>
@@ -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);