[SM][GUI] Custom start date popup 38/146438/9
authorPawel Aksiutowicz <p.aksiutowic@partner.samsung.com>
Mon, 28 Aug 2017 14:27:42 +0000 (16:27 +0200)
committerPawel Aksiutowicz <p.aksiutowic@partner.samsung.com>
Thu, 31 Aug 2017 16:36:45 +0000 (16:36 +0000)
Change-Id: I0c4ccd15c3be2d7cb85714a1ccbc87e9798b610e
Signed-off-by: Pawel Aksiutowicz <p.aksiutowic@partner.samsung.com>
setting-smartmanager/smartmanager-data/src/smartmanager-data-usage-mobile-settings.c

index 3c804b40a62d7ff152af746cdc93e9ed3cf04ca1..973cdcbf5c7cc717b8f20ebeab9a8ade96ea4c81 100644 (file)
@@ -26,6 +26,8 @@ static char *_last_item_label_get(void *data, Evas_Object *obj, const char *part
 
 setting_view sm_view_data_usage_mobile;
 
+static const char date_format[] = "%a, %d/%m/%Y";
+
 static const char* data_usage_mobile_strings[] = {
        "Data usage settings",
        "Set data usage cycle"
@@ -45,6 +47,11 @@ typedef enum {
        ELEMENT_TYPE_INFO
 } Element_Type_E;
 
+typedef enum {
+       DATE_MIN = 0,
+       DATE_MAX,
+} margin_date_type;
+
 typedef struct {
        SmartMgrData *smd;
        Evas_Object *popup;
@@ -161,7 +168,6 @@ static void _update_genlist_limit_item(Element_Type_E element_type, SmartMgrData
 void complement_data_usage_mobile_genlist(Evas_Object *mobile_genlist, SmartMgrData *smd)
 {
        int i = 0;
-
        Elm_Genlist_Item_Class *itc_genlist_element = NULL;
        Elm_Genlist_Item_Class *itc_genlist_last_element = NULL;
        Elm_Object_Item *last_item = NULL;
@@ -440,6 +446,21 @@ Evas_Object *_create_box(Evas_Object *parent)
        return box;
 }
 
+Evas_Object *_create_datetime(Evas_Object *parent, time_t start_date)
+{
+       SETTING_TRACE_BEGIN;
+       Evas_Object *datetime = elm_datetime_add(parent);
+       elm_object_style_set(datetime, "date_layout");
+       elm_datetime_format_set(datetime, "%d/%b/%Y");
+       elm_datetime_value_set(datetime, (Elm_Datetime_Time *)localtime(&start_date));
+       elm_object_content_set(parent, datetime);
+
+       evas_object_show(datetime);
+
+       SETTING_TRACE_END;
+       return datetime;
+}
+
 Evas_Object *_create_popup(SmartMgrData *smd, char *title)
 {
        SETTING_TRACE_BEGIN;
@@ -551,6 +572,7 @@ static void _create_custom_cycle_popup(SmartMgrData *smd, char *title,
                int days)
 {
        char buf[256] = {0};
+       SETTING_TRACE_BEGIN;
        Evas_Object *popup = _create_popup(smd, title);
        Evas_Object *box = _create_box(popup);
        Evas_Object *entry = _create_entry(box, ELEMENT_TYPE_CYCLE);
@@ -579,6 +601,112 @@ static void _create_custom_cycle_popup(SmartMgrData *smd, char *title,
        evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL,
                        _custom_cycle_popup_del_cb, cycle_start_popup_data);
        evas_object_show(popup);
+       SETTING_TRACE_END;
+}
+
+static void _custom_start_date_popup_cancel_cb(void *data, Evas_Object *obj,
+               void *event_info)
+{
+       SETTING_TRACE_BEGIN;
+       Evas_Object *popup = (Evas_Object *)data;
+       evas_object_del(popup);
+       SETTING_TRACE_END;
+}
+
+static struct tm _get_margin_date(margin_date_type date_type)
+{
+       time_t now = {0};
+       struct tm time_tm = {0};
+       time(&now);
+       time_tm = *localtime(&now);
+       if (date_type == DATE_MIN) {
+               time_tm.tm_mon -= 3;
+               time_tm.tm_hour = 0;
+               time_tm.tm_min = 0;
+               time_tm.tm_sec = 0;
+               mktime(&time_tm);
+       }
+
+       return time_tm;
+}
+
+static void _custom_start_date_popup_ok_cb(void *data, Evas_Object *obj,
+               void *event_info)
+{
+       SETTING_TRACE_BEGIN;
+       char buf[256] = {0};
+       char margin_date_buf[256] = {0};
+       time_t set_date = 0;
+       struct tm set_date_tm = {0};
+       struct tm min_date = {0};
+       struct tm max_date = {0};
+       Cycle_Start_Popup_Data_T *cycle_start_popup_data = (Cycle_Start_Popup_Data_T *)data;
+
+       elm_datetime_value_get(cycle_start_popup_data->content, (Elm_Datetime_Time *)&set_date_tm);
+       set_date = mktime(&set_date_tm);
+       min_date = _get_margin_date(DATE_MIN);
+       max_date = _get_margin_date(DATE_MAX);
+
+       if (set_date < mktime(&min_date)) {
+               strftime(margin_date_buf, sizeof(margin_date_buf), date_format, &min_date);
+               snprintf(buf, sizeof(buf), "Start date can't be before %s. Start date changed to %s.", margin_date_buf, margin_date_buf);
+               create_toast_popup(cycle_start_popup_data->popup, buf);
+               cycle_start_popup_data->smd->sim_1_limits.cycle_start = mktime(&min_date);
+               elm_datetime_value_set(cycle_start_popup_data->content, (Elm_Datetime_Time *)&min_date);
+       } else if (set_date > mktime(&max_date)) {
+               strftime(margin_date_buf, sizeof(margin_date_buf), date_format, &max_date);
+               snprintf(buf, sizeof(buf), "Start date can't be after %s. Start date changed to current date.", margin_date_buf);
+               create_toast_popup(cycle_start_popup_data->popup, buf);
+               cycle_start_popup_data->smd->sim_1_limits.cycle_start = mktime(&max_date);
+               elm_datetime_value_set(cycle_start_popup_data->content, (Elm_Datetime_Time *)&max_date);
+       } else {
+               cycle_start_popup_data->smd->sim_1_limits.cycle_start = set_date;
+               complement_data_usage_mobile_genlist(cycle_start_popup_data->smd->mobile_data_setting_genlist, cycle_start_popup_data->smd);
+               evas_object_del(cycle_start_popup_data->popup);
+       }
+
+       SETTING_TRACE_END;
+}
+
+static void _custom_start_date_popup_del_cb(void *data, Evas *e, Evas_Object *obj,
+               void *event_info)
+{
+       SETTING_TRACE_BEGIN;
+
+       Cycle_Start_Popup_Data_T *cycle_start_popup_data =
+                       (Cycle_Start_Popup_Data_T *)data;
+
+       free(cycle_start_popup_data);
+
+       SETTING_TRACE_END;
+}
+
+static void create_custom_start_date_popup(SmartMgrData *smd, char *title,
+               int time)
+{
+       SETTING_TRACE_BEGIN;
+       Cycle_Start_Popup_Data_T *cycle_start_popup_data = calloc(1, sizeof(Cycle_Start_Popup_Data_T));
+       ret_if(!cycle_start_popup_data);
+
+       Evas_Object *popup = _create_popup(smd, title);
+       Evas_Object *box = _create_box(popup);
+       Evas_Object *datetime = _create_datetime(box, (time_t)time);
+       elm_box_pack_end(box, datetime);
+
+       cycle_start_popup_data->smd = smd;
+       cycle_start_popup_data->popup = popup;
+       cycle_start_popup_data->content = datetime;
+
+       _create_popup_button(cycle_start_popup_data->popup, "button1", "Cancel", EVAS_HINT_EXPAND,
+                               EVAS_HINT_EXPAND, _custom_start_date_popup_cancel_cb, popup);
+       _create_popup_button(cycle_start_popup_data->popup, "button2", "Done",   EVAS_HINT_EXPAND,
+                       EVAS_HINT_EXPAND, _custom_start_date_popup_ok_cb,
+                       cycle_start_popup_data);
+       evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL,
+                               _custom_start_date_popup_del_cb, cycle_start_popup_data);
+
+       evas_object_show(popup);
+       SETTING_TRACE_END;
 }
 
 static bool _create_limit_popup(SmartMgrData *smd, char *title, Element_Type_E type)
@@ -648,7 +776,7 @@ static void _update_genlist_cycle_item(SmartMgrData *smd)
 
        free(elements[ELEMENT_TYPE_CYCLE].value);
 
-       if (smd->sim_1_limits.custom_mode_interval) {
+       if (smd->sim_1_limits.custom_mode_interval && smd->sim_1_limits.cycle_mode == CYCLE_MODE_CUSTOM) {
                snprintf(buf, sizeof(buf), "%d Days", smd->sim_1_limits.custom_mode_interval);
                elements[ELEMENT_TYPE_CYCLE].value = strdup(buf);
        } else {
@@ -666,31 +794,39 @@ static void _update_genlist_start_date_item(SmartMgrData *smd)
        SETTING_TRACE_BEGIN;
 
        char buf[256] = {0};
+       struct tm min_date = {0};
+
        free(elements[ELEMENT_TYPE_START_DATE].value);
 
        if (elements_start_time_initial_values[smd->sim_1_limits.cycle_mode-1]) {
-               if (smd->sim_1_limits.cycle_start > 0) {
+               if (smd->sim_1_limits.cycle_start > 1) {
                        if (smd->sim_1_limits.cycle_mode == CYCLE_MODE_MONTHLY) {
                                snprintf(buf, sizeof(buf), "%d", smd->sim_1_limits.cycle_start);
                                elements[ELEMENT_TYPE_START_DATE].value = strdup(buf);
                        } else if (smd->sim_1_limits.cycle_mode == CYCLE_MODE_WEEKLY) {
                                elements[ELEMENT_TYPE_START_DATE].value =
                                                strdup(elements_cycle_day_of_week[smd->sim_1_limits.cycle_start-1]);
-                       } else {
-                               elements[ELEMENT_TYPE_START_DATE].value = strdup(elements_start_time_initial_values[smd->sim_1_limits.cycle_mode-1]);
+                       } else if (smd->sim_1_limits.cycle_mode == CYCLE_MODE_CUSTOM) {
+                               struct tm *time = localtime((time_t*)&smd->sim_1_limits.cycle_start);
+                               strftime(buf, sizeof(buf), date_format, time);
+                               elements[ELEMENT_TYPE_START_DATE].value = strdup(buf);
                                SETTING_TRACE_DEBUG("GENLIST DATA UPDATE: %s", elements[ELEMENT_TYPE_START_DATE].value);
                        }
                } else {
-                       elements[ELEMENT_TYPE_START_DATE].value = strdup(elements_start_time_initial_values[smd->sim_1_limits.cycle_mode-1]);
-                       SETTING_TRACE_DEBUG("GENLIST DATA UPDATE: %s", elements[ELEMENT_TYPE_START_DATE].value);
+                       if (smd->sim_1_limits.cycle_mode == CYCLE_MODE_CUSTOM) {
+                               min_date = _get_margin_date(DATE_MIN);
+                               smd->sim_1_limits.cycle_start = (int)mktime(&min_date);
+                               strftime(buf, sizeof(buf), date_format, &min_date);
+                               elements[ELEMENT_TYPE_START_DATE].value = strdup(buf);
+                               SETTING_TRACE_DEBUG("GENLIST DATA UPDATE: %s", elements[ELEMENT_TYPE_START_DATE].value);
+                       } else {
+                               elements[ELEMENT_TYPE_START_DATE].value = strdup(elements_start_time_initial_values[smd->sim_1_limits.cycle_mode-1]);
+                       }
                }
-
-               SETTING_TRACE_DEBUG("GENLIST DATA UPDATE: %s", elements[ELEMENT_TYPE_START_DATE].value);
        } else {
                elements[ELEMENT_TYPE_START_DATE].value = NULL;
        }
 
-       SETTING_TRACE_DEBUG("GENLIST DATA UPDATE: %s", elements[ELEMENT_TYPE_START_DATE].value);
        elm_genlist_realized_items_update(smd->mobile_data_setting_genlist);
 
        SETTING_TRACE_END;
@@ -1001,10 +1137,9 @@ static void _create_cycle_start_popup(SmartMgrData *smd)
                _create_list_popup(smd, "Select start day", ELEMENT_TYPE_START_DATE);
                break;
        case CYCLE_MODE_DAILY:
-
                break;
        case CYCLE_MODE_CUSTOM:
-
+               create_custom_start_date_popup(smd, "Select start date", smd->sim_1_limits.cycle_start);
                break;
        default:
                break;