package com.orgzly.android.provider.models; import android.content.ContentValues; import android.provider.BaseColumns; import com.orgzly.org.datetime.OrgDateTime; import com.orgzly.org.datetime.OrgDelay; import com.orgzly.org.datetime.OrgInterval; import com.orgzly.org.datetime.OrgRepeater; import java.util.Calendar; /** * <2017-04-16 Sun> * <2017-01-02 Mon 13:00> * <2017-04-16 Sun .+1d> * <2017-01-02 Mon 09:00 ++1d/2d> * <2017-04-16 Sun .+1d -0d> * <2006-11-02 Thu 20:00-22:00> */ public class DbOrgTimestamp { public static final String TABLE = "org_timestamps"; // public static final int UNIT_SECOND = 101; // public static final int UNIT_MINUTE = 260; public static final int UNIT_HOUR = 360; public static final int UNIT_DAY = 424; public static final int UNIT_WEEK = 507; public static final int UNIT_MONTH = 604; public static final int UNIT_YEAR = 712; public static final int REPEATER_TYPE_CUMULATE = 20; public static final int REPEATER_TYPE_CATCH_UP = 22; public static final int REPEATER_TYPE_RESTART = 12; public static final int DELAY_TYPE_ALL = 1; public static final int DELAY_TYPE_FIRST_ONLY = 2; public static final String[] CREATE_SQL = new String[] { "CREATE TABLE IF NOT EXISTS " + TABLE + " (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + Columns.STRING + " TEXT NOT NULL UNIQUE," + Columns.IS_ACTIVE + " INTEGER NOT NULL," + Columns.YEAR + " INTEGER NOT NULL," + Columns.MONTH + " INTEGER NOT NULL," + Columns.DAY + " INTEGER NOT NULL," + Columns.HOUR + " INTEGER," + Columns.MINUTE + " INTEGER," + Columns.SECOND + " INTEGER," + Columns.END_HOUR + " INTEGER," + Columns.END_MINUTE + " INTEGER," + Columns.END_SECOND + " INTEGER," + Columns.REPEATER_TYPE + " INTEGER," + Columns.REPEATER_VALUE + " INTEGER," + Columns.REPEATER_UNIT + " INTEGER," + Columns.HABIT_DEADLINE_VALUE + " INTEGER," + Columns.HABIT_DEADLINE_UNIT + " INTEGER," + Columns.DELAY_TYPE + " INTEGER," + Columns.DELAY_VALUE + " INTEGER," + Columns.DELAY_UNIT + " INTEGER," + Columns.TIMESTAMP + " INTEGER," + Columns.END_TIMESTAMP + " INTEGER)", "CREATE INDEX IF NOT EXISTS i_" + TABLE + "_" + Columns.STRING + " ON " + TABLE + "(" + Columns.STRING + ")", "CREATE INDEX IF NOT EXISTS i_" + TABLE + "_" + Columns.TIMESTAMP + " ON " + TABLE + "(" + Columns.TIMESTAMP + ")", "CREATE INDEX IF NOT EXISTS i_" + TABLE + "_" + Columns.END_TIMESTAMP + " ON " + TABLE + "(" + Columns.END_TIMESTAMP + ")", }; public static final String DROP_SQL = "DROP TABLE IF EXISTS " + TABLE; public interface Columns { String IS_ACTIVE = "is_active"; String STRING = "string"; String YEAR = "year"; String MONTH = "month"; String DAY = "day"; String HOUR = "hour"; String MINUTE = "minute"; String SECOND = "second"; String END_HOUR = "end_hour"; String END_MINUTE = "end_minute"; String END_SECOND = "end_second"; String REPEATER_TYPE = "repeater_type"; String REPEATER_VALUE = "repeater_value"; String REPEATER_UNIT = "repeater_unit"; String HABIT_DEADLINE_VALUE = "habit_deadline_value"; String HABIT_DEADLINE_UNIT = "habit_deadline_unit"; String DELAY_TYPE = "delay_type"; String DELAY_VALUE = "delay_value"; String DELAY_UNIT = "delay_unit"; /* Unix timestamp, when string value is used as if it were in the local time zone. */ String TIMESTAMP = "timestamp"; String END_TIMESTAMP = "end_timestamp"; } public static class Column implements Columns, BaseColumns {} public static void toContentValues(ContentValues values, OrgDateTime orgDateTime) { values.put(Column.STRING, orgDateTime.toString()); values.put(Column.IS_ACTIVE, orgDateTime.isActive() ? 1 : 0); values.put(Column.YEAR, orgDateTime.getCalendar().get(Calendar.YEAR)); values.put(Column.MONTH, orgDateTime.getCalendar().get(Calendar.MONTH) + 1); values.put(Column.DAY, orgDateTime.getCalendar().get(Calendar.DAY_OF_MONTH)); if (orgDateTime.hasTime()) { values.put(Column.HOUR, orgDateTime.getCalendar().get(Calendar.HOUR_OF_DAY)); values.put(Column.MINUTE, orgDateTime.getCalendar().get(Calendar.MINUTE)); values.put(Column.SECOND, orgDateTime.getCalendar().get(Calendar.SECOND)); } else { values.putNull(Column.HOUR); values.putNull(Column.MINUTE); values.putNull(Column.SECOND); } values.put(Column.TIMESTAMP, orgDateTime.getCalendar().getTimeInMillis()); if (orgDateTime.hasEndTime()) { values.put(Column.END_HOUR, orgDateTime.getEndCalendar().get(Calendar.HOUR_OF_DAY)); values.put(Column.END_MINUTE, orgDateTime.getEndCalendar().get(Calendar.MINUTE)); values.put(Column.END_SECOND, orgDateTime.getEndCalendar().get(Calendar.SECOND)); values.put(Column.END_TIMESTAMP, orgDateTime.getEndCalendar().getTimeInMillis()); } else { values.putNull(Column.END_HOUR); values.putNull(Column.END_MINUTE); values.putNull(Column.END_SECOND); values.putNull(Column.END_TIMESTAMP); } if (orgDateTime.hasRepeater()) { values.put(Column.REPEATER_TYPE, repeaterType(orgDateTime.getRepeater().getType())); values.put(Column.REPEATER_VALUE, orgDateTime.getRepeater().getValue()); values.put(Column.REPEATER_UNIT, timeUnit(orgDateTime.getRepeater().getUnit())); if (orgDateTime.getRepeater().hasHabitDeadline()) { values.put(Column.HABIT_DEADLINE_VALUE, orgDateTime.getRepeater().getHabitDeadline().getValue()); values.put(Column.HABIT_DEADLINE_UNIT, timeUnit(orgDateTime.getRepeater().getHabitDeadline().getUnit())); } else { values.putNull(Column.HABIT_DEADLINE_VALUE); values.putNull(Column.HABIT_DEADLINE_UNIT); } } else { values.putNull(Column.REPEATER_TYPE); values.putNull(Column.REPEATER_VALUE); values.putNull(Column.REPEATER_UNIT); values.putNull(Column.HABIT_DEADLINE_VALUE); values.putNull(Column.HABIT_DEADLINE_UNIT); } if (orgDateTime.hasDelay()) { values.put(Column.DELAY_TYPE, delayType(orgDateTime.getDelay().getType())); values.put(Column.DELAY_VALUE, orgDateTime.getDelay().getValue()); values.put(Column.DELAY_UNIT, timeUnit(orgDateTime.getDelay().getUnit())); } else { values.putNull(Column.DELAY_TYPE); values.putNull(Column.DELAY_VALUE); values.putNull(Column.DELAY_UNIT); } } private static int repeaterType(OrgRepeater.Type type) { switch (type) { case CUMULATE: return REPEATER_TYPE_CUMULATE; case CATCH_UP: return REPEATER_TYPE_CATCH_UP; case RESTART: return REPEATER_TYPE_RESTART; default: return 0; } } private static int timeUnit(OrgInterval.Unit unit) { switch (unit) { case HOUR: return UNIT_HOUR; case DAY: return UNIT_DAY; case WEEK: return UNIT_WEEK; case MONTH: return UNIT_MONTH; case YEAR: return UNIT_YEAR; default: return 0; } } private static int delayType(OrgDelay.Type type) { switch (type) { case ALL: return DELAY_TYPE_ALL; case FIRST_ONLY: return DELAY_TYPE_FIRST_ONLY; default: return 0; } } }