From 701a5b5d944cc8c261cc292031c44aa161af4b38 Mon Sep 17 00:00:00 2001 From: GaidamakUA Date: Wed, 16 Dec 2015 13:11:52 +0200 Subject: [PATCH] Live updates supposedly done. Needs testing. --- .../dialog_live_updates_item_settings.xml | 2 +- .../src/net/osmand/plus/OsmandSettings.java | 4 +- .../liveupdates/LiveUpdatesAlarmReceiver.java | 85 ++++++++++++++++--- .../LiveUpdatesSettingsDialogFragment.java | 21 +++-- 4 files changed, 95 insertions(+), 17 deletions(-) diff --git a/OsmAnd/res/layout/dialog_live_updates_item_settings.xml b/OsmAnd/res/layout/dialog_live_updates_item_settings.xml index 766763f84c..c8958736e8 100644 --- a/OsmAnd/res/layout/dialog_live_updates_item_settings.xml +++ b/OsmAnd/res/layout/dialog_live_updates_item_settings.xml @@ -53,7 +53,7 @@ android:text="@string/only_download_over_wifi"/> IS_LIVE_UPDATES_ON = - new BooleanPreference("IS_LIVE_UPDATES_ON", false).makeGlobal(); + new BooleanPreference("is_live_updates_on", false).makeGlobal(); + public final OsmandPreference LIVE_UPDATES_RETRIES = + new IntPreference("live_updates_retryes", 2).makeGlobal(); // UI boxes public final CommonPreference TRANSPARENT_MAP_THEME = diff --git a/OsmAnd/src/net/osmand/plus/liveupdates/LiveUpdatesAlarmReceiver.java b/OsmAnd/src/net/osmand/plus/liveupdates/LiveUpdatesAlarmReceiver.java index 1a1cf8ba0a..482d9aaa10 100644 --- a/OsmAnd/src/net/osmand/plus/liveupdates/LiveUpdatesAlarmReceiver.java +++ b/OsmAnd/src/net/osmand/plus/liveupdates/LiveUpdatesAlarmReceiver.java @@ -1,41 +1,58 @@ package net.osmand.plus.liveupdates; +import android.app.AlarmManager; +import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.net.wifi.WifiManager; import android.os.AsyncTask; import android.widget.Toast; import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; +import net.osmand.plus.activities.LocalIndexInfo; import net.osmand.plus.download.DownloadActivityType; import net.osmand.plus.download.DownloadValidationManager; import net.osmand.plus.download.IndexItem; import net.osmand.plus.resources.IncrementalChangesManager; +import net.osmand.util.Algorithms; import org.apache.commons.logging.Log; +import java.io.File; import java.util.List; public class LiveUpdatesAlarmReceiver extends BroadcastReceiver { private static final Log LOG = PlatformUtil.getLog(LiveUpdatesAlarmReceiver.class); + @Override public void onReceive(Context context, Intent intent) { - String localIndexInfo = intent.getAction(); - new PerformLiveUpdateAsyncTask(context).execute(localIndexInfo); + String fileName = intent.getAction(); + LocalIndexInfo localIndexInfo = + intent.getParcelableExtra(LiveUpdatesSettingsDialogFragment.LOCAL_INDEX_INFO); + WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + + final OsmandApplication application = (OsmandApplication) context.getApplicationContext(); + final OsmandSettings settings = application.getSettings(); + + if (!preferenceDownloadViaWiFi(localIndexInfo, settings).get() || wifi.isWifiEnabled()) { + new PerformLiveUpdateAsyncTask(context, localIndexInfo).execute(fileName); + } else { + tryRescheduleDownload(context, settings, localIndexInfo); + } } public static class PerformLiveUpdateAsyncTask extends AsyncTask { private final Context context; + private final LocalIndexInfo localIndexInfo; - public PerformLiveUpdateAsyncTask(Context context) { + public PerformLiveUpdateAsyncTask(Context context, LocalIndexInfo localIndexInfo) { this.context = context; - } - - protected void onPreExecute() { - + this.localIndexInfo = localIndexInfo; } @Override @@ -46,9 +63,13 @@ public class LiveUpdatesAlarmReceiver extends BroadcastReceiver { } protected void onPostExecute(IncrementalChangesManager.IncrementalUpdateList result) { + final OsmandApplication application = (OsmandApplication) context.getApplicationContext(); + final OsmandSettings settings = application.getSettings(); if (result.errorMessage != null) { Toast.makeText(context, result.errorMessage, Toast.LENGTH_SHORT).show(); + tryRescheduleDownload(context, settings, localIndexInfo); } else { + settings.LIVE_UPDATES_RETRIES.resetToDefault(); List ll = result.getItemsForUpdate(); if (ll.isEmpty()) { Toast.makeText(context, R.string.no_updates_available, Toast.LENGTH_SHORT).show(); @@ -56,11 +77,11 @@ public class LiveUpdatesAlarmReceiver extends BroadcastReceiver { int i = 0; IndexItem[] is = new IndexItem[ll.size()]; for (IncrementalChangesManager.IncrementalUpdate iu : ll) { - IndexItem ii = new IndexItem(iu.fileName, "Incremental update", iu.timestamp, iu.sizeText, - iu.contentSize, iu.containerSize, DownloadActivityType.LIVE_UPDATES_FILE); + IndexItem ii = new IndexItem(iu.fileName, "Incremental update", + iu.timestamp, iu.sizeText, iu.contentSize, + iu.containerSize, DownloadActivityType.LIVE_UPDATES_FILE); is[i++] = ii; } - final OsmandApplication application = (OsmandApplication) context.getApplicationContext(); DownloadValidationManager downloadValidationManager = new DownloadValidationManager(application); downloadValidationManager.startDownload(context, is); @@ -68,4 +89,48 @@ public class LiveUpdatesAlarmReceiver extends BroadcastReceiver { } } } + + private static void tryRescheduleDownload(Context context, OsmandSettings settings, + LocalIndexInfo localIndexInfo) { + final OsmandSettings.CommonPreference updateFrequencyPreference = + preferenceUpdateTimes(localIndexInfo, settings); + final Integer frequencyOrdinal = updateFrequencyPreference.get(); + if (LiveUpdatesSettingsDialogFragment.UpdateFrequencies.values()[frequencyOrdinal] + == LiveUpdatesSettingsDialogFragment.UpdateFrequencies.HOURLY) { + return; + } + final Integer retriesLeft = settings.LIVE_UPDATES_RETRIES.get(); + if (retriesLeft > 0) { + Intent intent = new Intent(context, LiveUpdatesAlarmReceiver.class); + final File file = new File(localIndexInfo.getFileName()); + final String fileName = Algorithms.getFileNameWithoutExtension(file); + intent.putExtra(LiveUpdatesSettingsDialogFragment.LOCAL_INDEX_INFO, localIndexInfo); + intent.setAction(fileName); + PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); + + long timeToRetry = System.currentTimeMillis() + AlarmManager.INTERVAL_HOUR; + + AlarmManager alarmMgr = (AlarmManager) context + .getSystemService(Context.ALARM_SERVICE); + alarmMgr.set(AlarmManager.RTC, timeToRetry, alarmIntent); + settings.LIVE_UPDATES_RETRIES.set(retriesLeft - 1); + } else { + settings.LIVE_UPDATES_RETRIES.resetToDefault(); + } + } + + private static OsmandSettings.CommonPreference preferenceDownloadViaWiFi( + LocalIndexInfo item, OsmandSettings settings) { + final String settingId = item.getFileName() + + LiveUpdatesSettingsDialogFragment.DOWNLOAD_VIA_WIFI_POSTFIX; + return settings.registerBooleanPreference(settingId, false); + } + + private static OsmandSettings.CommonPreference preferenceUpdateTimes( + LocalIndexInfo item, OsmandSettings settings) { + final String settingId = item.getFileName() + + LiveUpdatesSettingsDialogFragment.UPDATE_TIMES_POSTFIX; + return settings.registerIntPreference(settingId, + LiveUpdatesSettingsDialogFragment.UpdateFrequencies.HOURLY.ordinal()); + } } diff --git a/OsmAnd/src/net/osmand/plus/liveupdates/LiveUpdatesSettingsDialogFragment.java b/OsmAnd/src/net/osmand/plus/liveupdates/LiveUpdatesSettingsDialogFragment.java index 56eaefb3b3..0b06a5152f 100644 --- a/OsmAnd/src/net/osmand/plus/liveupdates/LiveUpdatesSettingsDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/liveupdates/LiveUpdatesSettingsDialogFragment.java @@ -33,11 +33,12 @@ public class LiveUpdatesSettingsDialogFragment extends DialogFragment { private static final int UPDATE_HOURLY = 0; private static final int UPDATE_DAILY = 1; private static final int UPDATE_WEEKLY = 2; - private static final String UPDATE_TIMES = "_update_times"; - private static final String TIME_OF_DAY_TO_UPDATE = "_time_of_day_to_update"; + public 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 int MORNING_UPDATE_TIME = 8; private static final int NIGHT_UPDATE_TIME = 21; private static final int SHIFT = 1000; + public static final String DOWNLOAD_VIA_WIFI_POSTFIX = "_download_via_wifi"; @NonNull @Override @@ -48,16 +49,20 @@ public class LiveUpdatesSettingsDialogFragment extends DialogFragment { View view = LayoutInflater.from(getActivity()) .inflate(R.layout.dialog_live_updates_item_settings, null); final SwitchCompat liveUpdatesSwitch = (SwitchCompat) view.findViewById(R.id.liveUpdatesSwitch); + final SwitchCompat downloadOverWiFiSwitch = (SwitchCompat) view.findViewById(R.id.downloadOverWiFiSwitch); final Spinner updateFrequencySpinner = (Spinner) view.findViewById(R.id.updateFrequencySpinner); final Spinner updateTimesOfDaySpinner = (Spinner) view.findViewById(R.id.updateTimesOfDaySpinner); final OsmandSettings.CommonPreference liveUpdatePreference = preferenceForLocalIndex(localIndexInfo); + final OsmandSettings.CommonPreference downloadViaWiFiPreference = + preferenceDownloadViaWiFi(localIndexInfo); final OsmandSettings.CommonPreference updateFrequencePreference = preferenceUpdateTimes(localIndexInfo); final OsmandSettings.CommonPreference timeOfDayPreference = preferenceTimeOfDayToUpdate(localIndexInfo); liveUpdatesSwitch.setChecked(liveUpdatePreference.get()); + downloadOverWiFiSwitch.setChecked(downloadViaWiFiPreference.get()); builder.setView(view) .setPositiveButton(R.string.shared_string_save, new DialogInterface.OnClickListener() { @@ -72,7 +77,7 @@ public class LiveUpdatesSettingsDialogFragment extends DialogFragment { Intent intent = new Intent(getActivity(), LiveUpdatesAlarmReceiver.class); final File file = new File(localIndexInfo.getFileName()); final String fileName = Algorithms.getFileNameWithoutExtension(file); -// intent.putExtra(LOCAL_INDEX_INFO, fileName); + intent.putExtra(LOCAL_INDEX_INFO, localIndexInfo); intent.setAction(fileName); PendingIntent alarmIntent = PendingIntent.getBroadcast(getActivity(), 0, intent, 0); @@ -100,6 +105,7 @@ public class LiveUpdatesSettingsDialogFragment extends DialogFragment { } liveUpdatePreference.set(liveUpdatesSwitch.isChecked()); + downloadViaWiFiPreference.set(downloadOverWiFiSwitch.isChecked()); alarmMgr.cancel(alarmIntent); if (liveUpdatesSwitch.isChecked()) { alarmMgr.setInexactRepeating(AlarmManager.RTC, @@ -162,13 +168,18 @@ public class LiveUpdatesSettingsDialogFragment extends DialogFragment { return getSettings().registerBooleanPreference(settingId, false); } + private OsmandSettings.CommonPreference preferenceDownloadViaWiFi(LocalIndexInfo item) { + final String settingId = item.getFileName() + DOWNLOAD_VIA_WIFI_POSTFIX; + return getSettings().registerBooleanPreference(settingId, false); + } + private OsmandSettings.CommonPreference preferenceUpdateTimes(LocalIndexInfo item) { - final String settingId = item.getFileName() + UPDATE_TIMES; + final String settingId = item.getFileName() + UPDATE_TIMES_POSTFIX; return getSettings().registerIntPreference(settingId, UpdateFrequencies.HOURLY.ordinal()); } private OsmandSettings.CommonPreference preferenceTimeOfDayToUpdate(LocalIndexInfo item) { - final String settingId = item.getFileName() + TIME_OF_DAY_TO_UPDATE; + final String settingId = item.getFileName() + TIME_OF_DAY_TO_UPDATE_POSTFIX; return getSettings().registerIntPreference(settingId, TimesOfDay.NIGHT.ordinal()); }