package net.osmand.plus.liveupdates; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.activities.OsmandActionBarActivity; import net.osmand.plus.helpers.FileNameTranslationHelper; import net.osmand.util.Algorithms; import java.io.File; import java.util.Calendar; public class LiveUpdatesHelper { private static final String UPDATE_TIMES_POSTFIX = "_update_times"; private static final String TIME_OF_DAY_TO_UPDATE_POSTFIX = "_time_of_day_to_update"; private static final String DOWNLOAD_VIA_WIFI_POSTFIX = "_download_via_wifi"; private static final String LIVE_UPDATES_ON_POSTFIX = "_live_updates_on"; private static final String LAST_UPDATE_ATTEMPT_ON_POSTFIX = "_last_update_attempt"; public static final String LOCAL_INDEX_INFO = "local_index_info"; private static final int MORNING_UPDATE_TIME = 8; private static final int NIGHT_UPDATE_TIME = 21; private static final int SHIFT = 1000; public static final int DEFAULT_LAST_CHECK = -1; public static OsmandSettings.CommonPreference<Boolean> preferenceForLocalIndex( String fileName, OsmandSettings settings) { final String settingId = fileName + LIVE_UPDATES_ON_POSTFIX; return settings.registerBooleanPreference(settingId, false); } public static OsmandSettings.CommonPreference<Boolean> preferenceLiveUpdatesOn( String fileName, OsmandSettings settings) { final String settingId = fileName + LIVE_UPDATES_ON_POSTFIX; return settings.registerBooleanPreference(settingId, false); } public static OsmandSettings.CommonPreference<Boolean> preferenceDownloadViaWiFi( String fileName, OsmandSettings settings) { final String settingId = fileName + DOWNLOAD_VIA_WIFI_POSTFIX; return settings.registerBooleanPreference(settingId, false); } public static OsmandSettings.CommonPreference<Integer> preferenceUpdateFrequency( String fileName, OsmandSettings settings) { final String settingId = fileName + UPDATE_TIMES_POSTFIX; return settings.registerIntPreference(settingId, UpdateFrequency.HOURLY.ordinal()); } public static OsmandSettings.CommonPreference<Integer> preferenceTimeOfDayToUpdate( String fileName, OsmandSettings settings) { final String settingId = fileName + TIME_OF_DAY_TO_UPDATE_POSTFIX; return settings.registerIntPreference(settingId, TimeOfDay.NIGHT.ordinal()); } public static OsmandSettings.CommonPreference<Long> preferenceLastCheck( String fileName, OsmandSettings settings) { final String settingId = fileName + LAST_UPDATE_ATTEMPT_ON_POSTFIX; return settings.registerLongPreference(settingId, DEFAULT_LAST_CHECK); } public static String getNameToDisplay(String fileName, OsmandActionBarActivity activity) { return FileNameTranslationHelper.getFileName(activity, activity.getMyApplication().getResourceManager().getOsmandRegions(), fileName); } public static String formatDateTime(Context ctx, long dateTime) { java.text.DateFormat dateFormat = android.text.format.DateFormat.getMediumDateFormat(ctx); java.text.DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(ctx); return dateFormat.format(dateTime) + " " + timeFormat.format(dateTime); } public static PendingIntent getPendingIntent(@NonNull Context context, @NonNull String fileName) { Intent intent = new Intent(context, LiveUpdatesAlarmReceiver.class); final File file = new File(fileName); final String fileNameNoExt = Algorithms.getFileNameWithoutExtension(file); intent.putExtra(LOCAL_INDEX_INFO, fileName); intent.setAction(fileNameNoExt); return PendingIntent.getBroadcast(context, 0, intent, 0); } public static void setAlarmForPendingIntent(PendingIntent alarmIntent, AlarmManager alarmMgr, UpdateFrequency updateFrequency, TimeOfDay timeOfDayToUpdate) { long timeOfFirstUpdate; switch (updateFrequency) { case HOURLY: timeOfFirstUpdate = System.currentTimeMillis() + SHIFT; break; case DAILY: case WEEKLY: timeOfFirstUpdate = getNextUpdateTime(timeOfDayToUpdate); break; default: throw new IllegalStateException("Unexpected update frequency:" + updateFrequency); } alarmMgr.setInexactRepeating(AlarmManager.RTC, timeOfFirstUpdate, updateFrequency.getTime(), alarmIntent); } private static long getNextUpdateTime(TimeOfDay timeOfDayToUpdate) { Calendar calendar = Calendar.getInstance(); if (timeOfDayToUpdate == TimeOfDay.MORNING) { calendar.add(Calendar.DATE, 1); calendar.set(Calendar.HOUR_OF_DAY, MORNING_UPDATE_TIME); } else if (timeOfDayToUpdate == TimeOfDay.NIGHT) { calendar.add(Calendar.DATE, 1); calendar.set(Calendar.HOUR_OF_DAY, NIGHT_UPDATE_TIME); } return calendar.getTimeInMillis(); } public enum TimeOfDay { MORNING(R.string.morning), NIGHT(R.string.night); private final int localizedId; TimeOfDay(int localizedId) { this.localizedId = localizedId; } public int getLocalizedId() { return localizedId; } @Override public String toString() { return super.toString(); } } public enum UpdateFrequency { HOURLY(R.string.hourly, AlarmManager.INTERVAL_HOUR), DAILY(R.string.daily, AlarmManager.INTERVAL_DAY), WEEKLY(R.string.weekly, AlarmManager.INTERVAL_DAY * 7); private final int localizedId; private final long time; UpdateFrequency(int localizedId, long time) { this.localizedId = localizedId; this.time = time; } public int getLocalizedId() { return localizedId; } public long getTime() { return time; } } public static void runLiveUpdate(Context context, final String fileName, boolean forceUpdate) { final String fnExt = Algorithms.getFileNameWithoutExtension(new File(fileName)); new PerformLiveUpdateAsyncTask(context, fileName, forceUpdate).execute(fnExt); } }