From 45ddd3714cd6d108444f27579532ee677e49dfa2 Mon Sep 17 00:00:00 2001 From: Dmitry Yunitsky Date: Wed, 21 Jan 2015 14:32:03 +0300 Subject: [PATCH] Check and display warning if download size is > 50 MB on cellular connection. --- .../country/BaseDownloadAdapter.java | 45 +++++++++++----- .../src/com/mapswithme/maps/MWMActivity.java | 37 ++++--------- .../maps/downloader/DownloadHelper.java | 53 +++++++++++++++++++ 3 files changed, 93 insertions(+), 42 deletions(-) create mode 100644 android/src/com/mapswithme/maps/downloader/DownloadHelper.java diff --git a/android/src/com/mapswithme/country/BaseDownloadAdapter.java b/android/src/com/mapswithme/country/BaseDownloadAdapter.java index f645e0415d..18e883de88 100644 --- a/android/src/com/mapswithme/country/BaseDownloadAdapter.java +++ b/android/src/com/mapswithme/country/BaseDownloadAdapter.java @@ -24,6 +24,7 @@ import com.mapswithme.maps.BuildConfig; import com.mapswithme.maps.MWMApplication; import com.mapswithme.maps.MapStorage; import com.mapswithme.maps.R; +import com.mapswithme.maps.downloader.DownloadHelper; import com.mapswithme.maps.widget.WheelProgressView; import com.mapswithme.util.Constants; import com.mapswithme.util.UiUtils; @@ -142,11 +143,19 @@ abstract class BaseDownloadAdapter extends BaseAdapter @Override public abstract CountryItem getItem(int position); - protected void processNotDownloaded(final String name, int position, int newOptions, ViewHolder holder) + protected void processNotDownloaded(final String name, final int position, final int status, final int newOptions, final ViewHolder holder) { - // TODO if download is greater then 50MB check 3g/WIFI connection - startItemDownloading(holder, position, newOptions); - Statistics.INSTANCE.trackCountryDownload(MWMApplication.get().nativeGetBoolean(MWMApplication.IS_PREINSTALLED, false), BuildConfig.FLAVOR); + final long[] remoteSizes = getRemoteItemSizes(position); + final long size = newOptions > StorageOptions.MAP_OPTION_MAP_ONLY ? remoteSizes[0] : remoteSizes[1]; + DownloadHelper.downloadWithCellularCheck(mFragment.getActivity(), size, name, new DownloadHelper.OnDownloadListener() + { + @Override + public void onDownload() + { + startItemDownloading(holder, position, newOptions); + Statistics.INSTANCE.trackCountryDownload(MWMApplication.get().nativeGetBoolean(MWMApplication.IS_PREINSTALLED, false), BuildConfig.FLAVOR); + } + }); } protected void confirmDownloadCancelation(final ViewHolder holder, final int position, final String name) @@ -168,11 +177,19 @@ abstract class BaseDownloadAdapter extends BaseAdapter dlg.show(); } - protected void processOutOfDate(final String name, int position, int newOptions) + protected void processOutOfDate(final String name, final int position, int status, final int newOptions) { - // TODO if download is greater then 50MB check 3g/WIFI connection - updateCountry(position, newOptions); - Statistics.INSTANCE.trackCountryUpdate(); + final long[] remoteSizes = getRemoteItemSizes(position); + final long size = newOptions > StorageOptions.MAP_OPTION_MAP_ONLY ? remoteSizes[0] : remoteSizes[1]; + DownloadHelper.downloadWithCellularCheck(mFragment.getActivity(), size, name, new DownloadHelper.OnDownloadListener() + { + @Override + public void onDownload() + { + updateCountry(position, newOptions); + Statistics.INSTANCE.trackCountryUpdate(); + } + }); } protected void processOnDisk(final String name, final int position, final int newOptions) @@ -750,10 +767,10 @@ abstract class BaseDownloadAdapter extends BaseAdapter processOnDisk(name, position, StorageOptions.MAP_OPTION_MAP_ONLY); break; case MENU_UPDATE: - processOutOfDate(name, position, StorageOptions.MAP_OPTION_MAP_ONLY); + processOutOfDate(name, position, status, StorageOptions.MAP_OPTION_MAP_ONLY); break; case MENU_DOWNLOAD: - processNotDownloaded(name, position, StorageOptions.MAP_OPTION_MAP_ONLY, holder); + processNotDownloaded(name, position, status, StorageOptions.MAP_OPTION_MAP_ONLY, holder); break; case MENU_CANCEL: confirmDownloadCancelation(holder, position, name); @@ -765,16 +782,16 @@ abstract class BaseDownloadAdapter extends BaseAdapter processOnDisk(name, position, StorageOptions.MAP_OPTION_CAR_ROUTING); break; case MENU_DOWNLOAD_ROUTING: - processNotDownloaded(name, position, StorageOptions.MAP_OPTION_CAR_ROUTING, holder); + processNotDownloaded(name, position, status, StorageOptions.MAP_OPTION_CAR_ROUTING, holder); break; case MENU_DOWNLOAD_MAP_AND_ROUTING: - processNotDownloaded(name, position, StorageOptions.MAP_OPTION_MAP_AND_CAR_ROUTING, holder); + processNotDownloaded(name, position, status, StorageOptions.MAP_OPTION_MAP_AND_CAR_ROUTING, holder); break; case MENU_UPDATE_MAP_DOWNLOAD_ROUTING: - processNotDownloaded(name, position, StorageOptions.MAP_OPTION_MAP_AND_CAR_ROUTING, holder); + processNotDownloaded(name, position, status, StorageOptions.MAP_OPTION_MAP_AND_CAR_ROUTING, holder); break; case MENU_UPDATE_MAP_AND_ROUTING: - processOutOfDate(name, position, StorageOptions.MAP_OPTION_MAP_AND_CAR_ROUTING); + processOutOfDate(name, position, status, StorageOptions.MAP_OPTION_MAP_AND_CAR_ROUTING); break; case MENU_RETRY: processFailed(holder, position); diff --git a/android/src/com/mapswithme/maps/MWMActivity.java b/android/src/com/mapswithme/maps/MWMActivity.java index f751eadb4e..1b133469d4 100644 --- a/android/src/com/mapswithme/maps/MWMActivity.java +++ b/android/src/com/mapswithme/maps/MWMActivity.java @@ -60,6 +60,7 @@ import com.mapswithme.maps.bookmarks.data.BookmarkManager; import com.mapswithme.maps.bookmarks.data.MapObject; import com.mapswithme.maps.bookmarks.data.MapObject.ApiPoint; import com.mapswithme.maps.bookmarks.data.ParcelablePoint; +import com.mapswithme.maps.downloader.DownloadHelper; import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.maps.location.LocationPredictor; import com.mapswithme.maps.search.SearchActivity; @@ -217,6 +218,7 @@ public class MWMActivity extends NvEventQueueActivity LocationState.INSTANCE.invalidatePosition(); } + @SuppressWarnings("UnusedDeclaration") public void OnDownloadCountryClicked(final int group, final int country, final int region, final int options) { runOnUiThread(new Runnable() @@ -230,35 +232,14 @@ public class MWMActivity extends NvEventQueueActivity else { long size = MapStorage.INSTANCE.countryRemoteSizeInBytes(index, options); - if (size > 50 * 1024 * 1024 && !ConnectionState.isWifiConnected()) + DownloadHelper.downloadWithCellularCheck(MWMActivity.this, size, MapStorage.INSTANCE.countryName(index), new DownloadHelper.OnDownloadListener() { - new AlertDialog.Builder(MWMActivity.this) - .setCancelable(true) - .setMessage(String.format(getString(R.string.no_wifi_ask_cellular_download), MapStorage.INSTANCE.countryName(index))) - .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dlg, int which) - { - nativeDownloadCountry(index, options); - dlg.dismiss(); - } - }) - .setNegativeButton(getString(R.string.close), new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dlg, int which) - { - dlg.dismiss(); - } - }) - .create() - .show(); - - return; - } - - nativeDownloadCountry(index, options); + @Override + public void onDownload() + { + nativeDownloadCountry(index, options); + } + }); } } }); diff --git a/android/src/com/mapswithme/maps/downloader/DownloadHelper.java b/android/src/com/mapswithme/maps/downloader/DownloadHelper.java new file mode 100644 index 0000000000..0264f3b537 --- /dev/null +++ b/android/src/com/mapswithme/maps/downloader/DownloadHelper.java @@ -0,0 +1,53 @@ +package com.mapswithme.maps.downloader; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; + +import com.mapswithme.maps.R; +import com.mapswithme.util.ConnectionState; +import com.mapswithme.util.Constants; + +public class DownloadHelper +{ + private DownloadHelper() {} + + public interface OnDownloadListener + { + void onDownload(); + } + + public static boolean canDownloadWithoutWarning(long size) + { + return size < 50 * Constants.MB || ConnectionState.isWifiConnected(); + } + + public static void downloadWithCellularCheck(Activity activity, long size, String name, final OnDownloadListener listener) + { + if (canDownloadWithoutWarning(size)) + listener.onDownload(); + else + new AlertDialog.Builder(activity) + .setCancelable(true) + .setMessage(String.format(activity.getString(R.string.no_wifi_ask_cellular_download), name)) + .setPositiveButton(activity.getString(R.string.ok), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dlg, int which) + { + listener.onDownload(); + dlg.dismiss(); + } + }) + .setNegativeButton(activity.getString(R.string.close), new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dlg, int which) + { + dlg.dismiss(); + } + }) + .create() + .show(); + } +}