package org.septa.android.app.managers; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import org.septa.android.app.databases.SEPTADatabase; import org.septa.android.app.models.RouteTypes; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; /** * Future handler of database interactions * can become singleton when all calls are changed and a database instance can live here instead * of being passed in * <p/> * Created by Antoine on 12/29/2014. */ public class DatabaseManager { private static final String TAG = SEPTADatabase.class.getName(); private static final String QUERY_BUS_HOLIDAY = "SELECT service_id, date FROM holiday_bus WHERE date='%s'"; private static final String QUERY_RAIL_HOLIDAY = "SELECT service_id, date FROM holiday_rail WHERE date='%s'"; private static final String DATE_FORMAT_HOLIDAY = "yyyyMMdd"; /** * Check if the passed in date is a holiday * * @param database Database object * @param date Date object * @return the corresponding service id, otherwise -1 if day not found */ public static int isTodayBusHoliday(SQLiteDatabase database, Date date) { DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_HOLIDAY); String query = String.format(QUERY_BUS_HOLIDAY, dateFormat.format(date)); int serviceId = -1; try { Cursor cursor = database.rawQuery(query, null); if (cursor != null) { if (cursor.getCount() > 0) { cursor.moveToFirst(); serviceId = cursor.getInt(0); } cursor.close(); } } catch (Exception e) { Log.e(TAG, "Error querying holiday", e); } return serviceId; } /** * Check if the passed in date is a holiday * * @param database Database object * @param date Date object * @return the corresponding service id, otherwise -1 if day not found */ public static int isTodayRailHoliday(SQLiteDatabase database, Date date) { DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_HOLIDAY); String query = String.format(QUERY_RAIL_HOLIDAY, dateFormat.format(date)); int serviceId = -1; try { Cursor cursor = database.rawQuery(query, null); if (cursor != null) { if (cursor.getCount() > 0) { cursor.moveToFirst(); serviceId = cursor.getInt(0); } cursor.close(); } } catch (Exception e) { Log.e(TAG, "Error querying holiday", e); } return serviceId; } /** * Retrieves the service ids for the specified day of the week * * @param database database object * @param day day of the week constant from the Calendar class * @param routeType route type * @return */ public static List<Integer> serviceIdsForDayOfWeek(SQLiteDatabase database, int day, RouteTypes routeType) { List<Integer> serviceIds = new ArrayList<Integer>(); // Default to Friday(weekday) int dbDay = 2; switch (day) { case Calendar.SUNDAY: dbDay = 64; break; case Calendar.MONDAY: dbDay = 32; break; case Calendar.TUESDAY: dbDay = 16; break; case Calendar.WEDNESDAY: dbDay = 8; break; case Calendar.THURSDAY: dbDay = 4; break; case Calendar.FRIDAY: dbDay = 2; break; case Calendar.SATURDAY: dbDay = 1; break; } int serviceId = 1; String query; if(routeType == RouteTypes.RAIL) { query = "SELECT service_id, days FROM calendar_rail WHERE (days &" + dbDay + ")"; } else { query = "SELECT service_id, days FROM calendar_bus WHERE (days &" + dbDay + ")"; } Cursor cursor = null; try { cursor = database.rawQuery(query, null); if(cursor != null && cursor.moveToFirst()) { do { serviceIds.add(cursor.getInt(0)); } while(cursor.moveToNext()); cursor.close(); } } catch (Exception e) { Log.e(TAG, "Error fetching service ids", e); } return serviceIds; } /** * Return the nearest date of the passed in day * * @param dayOfWeek day of the week constant from the Calendar class * @return date representing the nearest day */ public static Date nearestDayOfWeek(int dayOfWeek) { Calendar calendar = new GregorianCalendar(); for (int i = 0; i < 7; i++) { if (calendar.get(Calendar.DAY_OF_WEEK) == dayOfWeek) { break; } else { calendar.add(Calendar.DATE, 1); } } return calendar.getTime(); } }