package com.myMinistry; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import org.joda.time.DateTime; import org.joda.time.Duration; import org.joda.time.Period; import org.joda.time.format.PeriodFormatter; import org.joda.time.format.PeriodFormatterBuilder; import android.content.Context; import android.database.Cursor; import android.os.Environment; import android.text.format.DateUtils; import android.util.TypedValue; import com.myMinistry.provider.MinistryContract.UnionsNameAsRef; import com.myMinistry.provider.MinistryDatabase; import com.myMinistry.util.FileUtils; public class Helper { public static Calendar roundMinutesAndHour(Calendar time, int TIME_PICKER_INTERVAL) { int minute = time.get(Calendar.MINUTE); int hour = time.get(Calendar.HOUR_OF_DAY); if (time.get(Calendar.MINUTE) % TIME_PICKER_INTERVAL != 0) { int minuteFloor = minute - (minute % TIME_PICKER_INTERVAL); minute = minuteFloor + (minute == minuteFloor + 1 ? TIME_PICKER_INTERVAL : 0); if (minute == 60) { hour++; minute = 0; } } time.set(Calendar.HOUR_OF_DAY, hour); time.set(Calendar.MINUTE, minute); return time; } public static String numberFormat(Double number) { DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(Locale.getDefault()); return format.format(number); } public static boolean renameDB(Context context) { /** Create the file */ File oldDB = context.getDatabasePath(MinistryDatabase.DATABASE_NAME_OLD); /** If the file exists we want to rename it to our new DB name :) */ if(oldDB.exists()) oldDB.renameTo(context.getDatabasePath(MinistryDatabase.DATABASE_NAME)); return true; } public static void renameAndMoveBackups(Context context) { boolean deleteFile = true; boolean deleteDir = true; File filePath = FileUtils.getExternalDBFile(context, ""); File dbPath = new File(FileUtils.getExternalDBFile(context, "").getParent(),"databases"); File dbPathOLD = new File(Environment.getExternalStorageDirectory() + "/Android/data/" + context.getPackageName() + ".backup/databases"); if(!filePath.exists()) filePath.mkdirs(); /** Check for old incorrect package name folder structure. */ if(dbPathOLD.exists()) { if(dbPathOLD.exists() && dbPathOLD.canWrite()) { if(dbPathOLD.listFiles() != null) { for(File file : dbPathOLD.listFiles()) { deleteFile = true; try { FileUtils.copyFile(file, new File(filePath,file.getName())); } catch (IOException e) { deleteFile = false; deleteDir = false; e.printStackTrace(); } if(deleteFile) file.delete(); } } if(deleteDir) { dbPathOLD.delete(); new File(dbPathOLD.getParent()).delete(); } } } /** Check for correct package name but using "databases" folder instead of Android default "files". */ if(dbPath.exists() && dbPath.canWrite()) { deleteDir = true; if(dbPath.listFiles() != null) { for(File file : dbPath.listFiles()) { deleteFile = true; try { FileUtils.copyFile(file, new File(filePath,file.getName())); } catch (IOException e) { deleteFile = false; deleteDir = false; e.printStackTrace(); } if(deleteFile) file.delete(); } } if(deleteDir) dbPath.delete(); } } public static double getDifference(Calendar start, Calendar end) { Duration dur = new Duration(new DateTime(start), new DateTime(end)); Period per = dur.toPeriod(); return (double)per.getHours() + ((double)per.getMinutes() / 60.0); } public static String getMinuteDuration(Cursor cursor) { SimpleDateFormat saveDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()); Calendar start = Calendar.getInstance(Locale.getDefault()); Calendar end = Calendar.getInstance(Locale.getDefault()); Duration dur = new Duration(new DateTime(start), new DateTime(start)); Duration durchange = new Duration(new DateTime(start), new DateTime(start)); for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()) { try { start.setTime(saveDateFormat.parse(cursor.getString(cursor.getColumnIndex(UnionsNameAsRef.DATE_START)))); } catch (Exception e) { start = Calendar.getInstance(Locale.getDefault()); } try { end.setTime(saveDateFormat.parse(cursor.getString(cursor.getColumnIndex(UnionsNameAsRef.DATE_END)))); } catch (Exception e) { end = Calendar.getInstance(Locale.getDefault()); } durchange = new Duration(new DateTime(start), new DateTime(end)); dur = dur.withDurationAdded(durchange, 1); } cursor.close(); PeriodFormatter retVal = new PeriodFormatterBuilder() .printZeroAlways() .appendMinutes() .toFormatter(); return retVal.print(dur.toPeriod()); } public static int clearBackups(Context context) { File extDBDir = FileUtils.getExternalDBFile(context, ""); FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String filename) { File sel = new File(dir, filename); return !(filename.contains("auto")) && !(sel.isDirectory()); } }; if(extDBDir != null && extDBDir.exists()) { File[] files = extDBDir.listFiles(filter); if(files.length > 1) { File lastModifiedFile = files[0]; for(int i = 1; i < files.length; i++) { if(lastModifiedFile.lastModified() < files[i].lastModified()) { lastModifiedFile = files[i]; } } final String excludeFileName = lastModifiedFile.getName(); filter = new FilenameFilter() { public boolean accept(File dir, String filename) { return !(filename.contains("auto")) && !(filename.contains(excludeFileName)); } }; files = extDBDir.listFiles(filter); for(int i = 0; i < files.length; i++) files[i].delete(); return 1; } else return 2; } else return 0; } public static int dipsToPix(Context context, float dps) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dps, context.getResources().getDisplayMetrics()); } public static int getIconResIDByLitTypeID(int litTypeID) { switch(litTypeID) { case MinistryDatabase.ID_BOOKS: return R.drawable.ic_action_book; case MinistryDatabase.ID_MAGAZINES: return R.drawable.ic_mag; case MinistryDatabase.ID_MEDIA: return R.drawable.ic_media; case MinistryDatabase.ID_TRACTS: return R.drawable.ic_tracts; case MinistryDatabase.ID_BROCHURES: return R.drawable.ic_booklets; default : return R.drawable.ic_action_summary; } } /** * Returns a String formatted in the default locale of the device. Looks like "Ddd, Mmm dd, H:MMTT - H:MMTT * @param context the {@link android.content.Context} that this is running within. * @param start the starting date and time of this entry. * @param end the ending date and time of this entry. */ public static String buildTimeEntryDateAndTime(Context context, Calendar start, Calendar end) { return DateUtils.formatDateRange(context, start.getTimeInMillis(), end.getTimeInMillis(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_ABBREV_WEEKDAY | DateUtils.FORMAT_NO_YEAR); } }