use content time instead of modified time when sorting list 91/43091/1
authorMinkyu Kang <mk7.kang@samsung.com>
Wed, 8 Jul 2015 00:54:13 +0000 (09:54 +0900)
committerMinkyu Kang <mk7.kang@samsung.com>
Wed, 8 Jul 2015 00:54:13 +0000 (09:54 +0900)
Change-Id: Ia41c816932c184250e03e541425cc6ad42bdd06f
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
include/data/mediadata.h
src/data/mediadata.c
src/view/viewer.c

index 557c85f..45fff25 100644 (file)
@@ -43,6 +43,7 @@ enum list_type {
 struct group_info {
        char *name;
        Eina_List *list;
+       void *data;
 };
 
 struct mediadata *mediadata_create(const char *media_type,
index 16504bb..554c72f 100644 (file)
@@ -22,6 +22,7 @@
 #include "data/mediadata.h"
 
 typedef int (*media_compare)(struct group_info *gi, app_media_info *info);
+typedef void *(*media_compare_data_get)(app_media_info *info);
 typedef char *(*group_name_get)(app_media_info *info);
 
 static int _compare_cb_date(const void *, const void *);
@@ -29,8 +30,10 @@ static int _compare_cb_name(const void *, const void *);
 
 static int _compare_title(struct group_info *, app_media_info *);
 static char *_get_title(app_media_info *);
-static int _compare_modified_time(struct group_info *, app_media_info *);
-static char *_get_modified_time(app_media_info *);
+static void *_get_data_title(app_media_info *info);
+static int _compare_time(struct group_info *, app_media_info *);
+static char *_get_time(app_media_info *);
+static void *_get_data_time(app_media_info *info);
 
 enum _filter_type {
        E_FILTER_FOLDER = 0,
@@ -59,6 +62,7 @@ struct _sort_info {
 
 struct _list_info {
        media_compare media_cmp;
+       media_compare_data_get data_get;
        group_name_get name_get;
 };
 
@@ -79,10 +83,12 @@ static struct _list_info g_list_info[E_LIST_MAX] = {
        [E_LIST_NAME] = {
                .media_cmp = _compare_title,
                .name_get = _get_title,
+               .data_get = _get_data_title,
        },
        [E_LIST_DATE] = {
-               .media_cmp = _compare_modified_time,
-               .name_get = _get_modified_time,
+               .media_cmp = _compare_time,
+               .name_get = _get_time,
+               .data_get = _get_data_time,
        }
 };
 
@@ -121,23 +127,29 @@ static bool _create_filter(struct _data *data, filter_h *filter, int type)
        return true;
 }
 
-static char *_get_date_string(time_t time)
+static char *_get_date_string(struct tm *tm)
 {
-       struct tm tm;
        char buf[32];
 
-       localtime_r(&time, &tm);
-       strftime(buf, sizeof(buf), "%Y.%m.%d", &tm);
+       strftime(buf, sizeof(buf), "%Y.%m.%d", tm);
 
        return strdup(buf);
 }
 
 static int _compare_title(struct group_info *gi, app_media_info *info)
 {
-       if (!gi || !gi->name || !info->title)
+       if (!gi || !gi->data || !info->title)
                return -1;
 
-       return strncasecmp(gi->name, info->title, 1);
+       return strncasecmp(gi->data, info->title, 1);
+}
+
+static void *_get_data_title(app_media_info *info)
+{
+       if (!info->title)
+               return NULL;
+
+       return strdup(info->title);
 }
 
 static char *_get_title(app_media_info *info)
@@ -148,32 +160,45 @@ static char *_get_title(app_media_info *info)
        return strndup(info->title, 1);
 }
 
-static int _compare_modified_time(struct group_info *gi, app_media_info *info)
+static int _compare_time(struct group_info *gi, app_media_info *info)
 {
-       char *date;
-       int r;
+       struct tm *tm;
 
-       if (!gi || !gi->name)
+       if (!gi || !gi->data)
                return -1;
 
-       date = _get_date_string(info->modified_time);
+       tm = gi->data;
 
-       r = strcasecmp(gi->name, date);
+       if (tm->tm_year == info->content_time->tm_year &&
+                       tm->tm_yday == info->content_time->tm_yday)
+               return 0;
 
-       free(date);
+       return 1;
+}
 
-       return r;
+static void *_get_data_time(app_media_info *info)
+{
+       struct tm *tm;
+
+       tm = calloc(1, sizeof(*tm));
+       if (!tm)
+               return NULL;
+
+       memcpy(tm, info->content_time, sizeof(*tm));
+
+       return tm;
 }
 
-static char *_get_modified_time(app_media_info *info)
+static char *_get_time(app_media_info *info)
 {
-       return  _get_date_string(info->modified_time);
+       return  _get_date_string(info->content_time);
 }
 
 static int _compare_cb_date(const void *data1, const void *data2)
 {
        app_media *am1, *am2;
        app_media_info *info1, *info2;
+       time_t tm1, tm2;
 
        am1 = (app_media *)data1;
        am2 = (app_media *)data2;
@@ -184,7 +209,10 @@ static int _compare_cb_date(const void *data1, const void *data2)
        if (!info1 || !info2)
                return -1;
 
-       if (info1->modified_time < info2->modified_time)
+       tm1 = mktime(info1->content_time);
+       tm2 = mktime(info2->content_time);
+
+       if (tm1 < tm2)
                return 1;
 
        return -1;
@@ -429,6 +457,7 @@ Eina_List *mediadata_get_list(struct mediadata *md, int list_type)
                        }
 
                        gi->name = g_list_info[list_type].name_get(info);
+                       gi->data = g_list_info[list_type].data_get(info);
 
                        list = eina_list_append(list, gi);
                }
@@ -446,6 +475,7 @@ void mediadata_free_list(Eina_List *list)
 
        EINA_LIST_FOREACH(list, l, gi) {
                free(gi->name);
+               free(gi->data);
                eina_list_free(gi->list);
 
                free(gi);
index 8ee87bb..79f2e51 100644 (file)
@@ -380,16 +380,13 @@ static void _draw_title_bar(struct _priv *priv, int id, app_media_info *mi)
        char buf[32] = {0,};
        char day[32] = {0,};
        char date[32] = {0,};
-       struct tm tm;
 
        if (id == VIEWER_MOVIE) {
                elm_object_part_text_set(priv->base,
                                PART_VIEWER_TITLE, mi->title);
        } else {
-               localtime_r(&mi->modified_time, &tm);
-
-               strftime(date, sizeof(date), "%d %b", &tm);
-               strftime(day, sizeof(day), "%a", &tm);
+               strftime(date, sizeof(date), "%d %b", mi->content_time);
+               strftime(day, sizeof(day), "%a", mi->content_time);
                util_up_string(day);
 
                snprintf(buf, sizeof(buf), "%s, %s", day, date);