From e820300b962b4fb31dde13208e6f2861c7d386be Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Fri, 5 Jun 2020 15:30:48 +0100 Subject: [PATCH 01/16] Add MapPacks api --- .../main/java/net/cyclestreets/api/MapPack.kt | 2 ++ .../java/net/cyclestreets/api/MapPacks.kt | 2 ++ .../api/client/geojson/MapPacksFactory.kt | 26 +++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPack.kt create mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPacks.kt create mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapPacksFactory.kt diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPack.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPack.kt new file mode 100644 index 000000000..1be75e486 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPack.kt @@ -0,0 +1,2 @@ +package net.cyclestreets.api + diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPacks.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPacks.kt new file mode 100644 index 000000000..1be75e486 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPacks.kt @@ -0,0 +1,2 @@ +package net.cyclestreets.api + diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapPacksFactory.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapPacksFactory.kt new file mode 100644 index 000000000..4ac093ab5 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapPacksFactory.kt @@ -0,0 +1,26 @@ +package net.cyclestreets.api.client.geojson + +import net.cyclestreets.api.GeoPlace +import net.cyclestreets.api.GeoPlaces +import org.geojson.Feature +import org.geojson.FeatureCollection +import org.geojson.Point +import org.osmdroid.util.GeoPoint +import java.util.* + +object MapPacksFactory { + fun toGeoPlaces(featureCollection: FeatureCollection): GeoPlaces { + val places: MutableList = ArrayList() + for (feature in featureCollection.features) { + places.add(toGeoPlace(feature)) + } + return GeoPlaces(places) + } + + private fun toGeoPlace(feature: Feature): GeoPlace { + val coordinates = (feature.geometry as Point).coordinates + return GeoPlace(GeoPoint(coordinates.latitude, coordinates.longitude), + feature.getProperty("name"), + feature.getProperty("near")) + } +} \ No newline at end of file From 3acb68f8488c81caa9344c72ac914ea3429d2336 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Fri, 5 Jun 2020 15:35:21 +0100 Subject: [PATCH 02/16] s/MapPack/Map/ in Api --- .../java/net/cyclestreets/api/ApiClient.kt | 10 ++++++- .../src/main/java/net/cyclestreets/api/Map.kt | 6 +++++ .../main/java/net/cyclestreets/api/MapPack.kt | 2 -- .../java/net/cyclestreets/api/MapPacks.kt | 2 -- .../main/java/net/cyclestreets/api/Maps.kt | 24 +++++++++++++++++ .../api/client/RetrofitApiClient.java | 7 +++++ .../net/cyclestreets/api/client/V2Api.java | 3 +++ .../api/client/geojson/MapPacksFactory.kt | 26 ------------------- .../api/client/geojson/MapsFactory.kt | 25 ++++++++++++++++++ 9 files changed, 74 insertions(+), 31 deletions(-) create mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPack.kt delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPacks.kt create mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapPacksFactory.kt create mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/ApiClient.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/ApiClient.kt index c3505af0b..0bf5b44b1 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/ApiClient.kt +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/ApiClient.kt @@ -5,6 +5,7 @@ import android.content.pm.PackageManager import net.cyclestreets.api.client.RetrofitApiClient import net.cyclestreets.core.R +import kotlin.collections.Map interface CycleStreetsApi { fun getJourneyJson(plan: String, leaving: String?, arriving: String?, speed: Int, lonLat: DoubleArray): String @@ -22,6 +23,7 @@ interface CycleStreetsApi { fun getPOIs(key: String, lonW: Double, latS: Double, lonE: Double, latN: Double): List fun getPOIs(key: String, lon: Double, lat: Double, radius: Int): List fun getBlogEntries(): Blog + fun getMaps(): Maps } object ApiClient : CycleStreetsApi { @@ -130,7 +132,9 @@ object ApiClient : CycleStreetsApi { override fun getBlogEntries(): Blog { return delegate.getBlogEntries() } - + override fun getMaps(): Maps { + return delegate.getMaps() + } } class ApiClientImpl(private val retrofitApiClient: RetrofitApiClient): CycleStreetsApi { @@ -230,6 +234,10 @@ class ApiClientImpl(private val retrofitApiClient: RetrofitApiClient): CycleStre return retrofitApiClient.blogEntries } + override fun getMaps(): Maps { + return retrofitApiClient.maps + } + ///////////////////////////////////////////////////// private fun itineraryPoints(vararg lonLat: Double): String { val sb = StringBuilder() diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt new file mode 100644 index 000000000..ed370661a --- /dev/null +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt @@ -0,0 +1,6 @@ +package net.cyclestreets.api + +data class Map( + val name: String, + val url: String +) \ No newline at end of file diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPack.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPack.kt deleted file mode 100644 index 1be75e486..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPack.kt +++ /dev/null @@ -1,2 +0,0 @@ -package net.cyclestreets.api - diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPacks.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPacks.kt deleted file mode 100644 index 1be75e486..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/MapPacks.kt +++ /dev/null @@ -1,2 +0,0 @@ -package net.cyclestreets.api - diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt new file mode 100644 index 000000000..dab455920 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt @@ -0,0 +1,24 @@ +package net.cyclestreets.api + +class Maps( + private val packs: Collection +) { + companion object { + private var loaded_: Maps? = null + + fun get(): Maps? { + if (loaded_ == null) + loaded_ = load() + return loaded_ + } // get + + private fun load(): Maps? { + try { + return ApiClient.getMaps() + } catch (e: Exception) { + // ah + } + return null + } + } +} \ No newline at end of file diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RetrofitApiClient.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RetrofitApiClient.java index 1691bb072..04a9a7474 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RetrofitApiClient.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RetrofitApiClient.java @@ -7,6 +7,7 @@ import net.cyclestreets.api.Blog; import net.cyclestreets.api.GeoPlaces; +import net.cyclestreets.api.Maps; import net.cyclestreets.api.POI; import net.cyclestreets.api.POICategories; import net.cyclestreets.api.PhotomapCategories; @@ -24,6 +25,7 @@ import net.cyclestreets.api.client.dto.UserCreateResponseDto; import net.cyclestreets.api.client.dto.UserJourneysDto; import net.cyclestreets.api.client.geojson.GeoPlacesFactory; +import net.cyclestreets.api.client.geojson.MapsFactory; import net.cyclestreets.api.client.geojson.PhotosFactory; import net.cyclestreets.api.client.geojson.PoiFactory; @@ -222,6 +224,11 @@ public UserJourneys getUserJourneys(final String username) throws IOException { return response.body().toUserJourneys(); } + public Maps getMaps() throws IOException { + Response response = v2Api.getMaps().execute(); + return MapsFactory.Companion.toMaps(response.body()); + } + public Result register(final String username, final String password, final String name, diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/V2Api.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/V2Api.java index 5d14db85b..bd0bb94e6 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/V2Api.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/V2Api.java @@ -49,6 +49,9 @@ Call geoCoder(@Query("q") String search, @GET("/v2/journeys.user?format=flat&datetime=friendly") Call getUserJourneys(@Query("username") String username); + @GET("/v2/mapdownloads.list") + Call getMaps(); + @FormUrlEncoded @POST("/v2/user.create") Call register(@Field("username") String username, diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapPacksFactory.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapPacksFactory.kt deleted file mode 100644 index 4ac093ab5..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapPacksFactory.kt +++ /dev/null @@ -1,26 +0,0 @@ -package net.cyclestreets.api.client.geojson - -import net.cyclestreets.api.GeoPlace -import net.cyclestreets.api.GeoPlaces -import org.geojson.Feature -import org.geojson.FeatureCollection -import org.geojson.Point -import org.osmdroid.util.GeoPoint -import java.util.* - -object MapPacksFactory { - fun toGeoPlaces(featureCollection: FeatureCollection): GeoPlaces { - val places: MutableList = ArrayList() - for (feature in featureCollection.features) { - places.add(toGeoPlace(feature)) - } - return GeoPlaces(places) - } - - private fun toGeoPlace(feature: Feature): GeoPlace { - val coordinates = (feature.geometry as Point).coordinates - return GeoPlace(GeoPoint(coordinates.latitude, coordinates.longitude), - feature.getProperty("name"), - feature.getProperty("near")) - } -} \ No newline at end of file diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt new file mode 100644 index 000000000..649a9b2c0 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt @@ -0,0 +1,25 @@ +package net.cyclestreets.api.client.geojson + +import net.cyclestreets.api.Map +import net.cyclestreets.api.Maps +import org.geojson.Feature +import org.geojson.FeatureCollection + +class MapsFactory { + companion object { + fun toMaps(featureCollection: FeatureCollection): Maps { + val packs = mutableListOf() + for (feature in featureCollection.features) { + packs.add(toMap(feature)) + } + return Maps(packs) + } + + private fun toMap(feature: Feature): Map { + return Map( + feature.getProperty("name"), + feature.getProperty("url") + ) + } + } +} From 6681dc621f215212652ebfa1dd46a3becedb0647 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Fri, 5 Jun 2020 16:33:14 +0100 Subject: [PATCH 03/16] Pulling list of maps from server. UI and downloading needs reworking, but hurrah so far. --- .../src/main/java/net/cyclestreets/api/Map.kt | 4 +- .../main/java/net/cyclestreets/api/Maps.kt | 26 ++++- .../client/geojson/AbstractObjectFactory.java | 2 +- .../api/client/geojson/MapsFactory.kt | 22 +++-- .../main/java/net/cyclestreets/MainSupport.kt | 2 +- .../java/net/cyclestreets/SettingsFragment.kt | 4 +- .../net/cyclestreets/tiles/TileSource.java | 2 +- .../java/net/cyclestreets/util/MapPack.java | 99 ------------------- .../java/net/cyclestreets/util/MapPack.kt | 63 ++++++++++++ 9 files changed, 110 insertions(+), 114 deletions(-) delete mode 100644 libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.java create mode 100644 libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt index ed370661a..de96a0125 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt @@ -1,6 +1,8 @@ package net.cyclestreets.api data class Map( + val id: String, val name: String, - val url: String + val url: String, + val parent: String ) \ No newline at end of file diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt index dab455920..fa80ca24c 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt @@ -1,22 +1,42 @@ package net.cyclestreets.api +import android.os.AsyncTask + class Maps( private val packs: Collection -) { +): Iterable { + val size get() = packs.size + override operator fun iterator() = packs.iterator() + companion object { private var loaded_: Maps? = null fun get(): Maps? { if (loaded_ == null) - loaded_ = load() + backgroundLoad() return loaded_ } // get + + private fun backgroundLoad() { + GetMapsTask().execute() + } + + private class GetMapsTask : AsyncTask() { + override fun doInBackground(vararg params: Void?): Maps? { + return load() + } + + override fun onPostExecute(maps: Maps?) { + loaded_ = maps + } + } + private fun load(): Maps? { try { return ApiClient.getMaps() } catch (e: Exception) { - // ah + println(e.message) } return null } diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/AbstractObjectFactory.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/AbstractObjectFactory.java index 51b7b1340..0bb397472 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/AbstractObjectFactory.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/AbstractObjectFactory.java @@ -4,7 +4,7 @@ class AbstractObjectFactory { @SuppressWarnings("unchecked") - protected static V propertyOrDefault(Feature feature, String propertyName, V defaultValue) { + static V propertyOrDefault(Feature feature, String propertyName, V defaultValue) { return (feature.getProperty(propertyName) == null) ? defaultValue : (V)feature.getProperty(propertyName); } } diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt index 649a9b2c0..81324cde0 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt @@ -2,24 +2,34 @@ package net.cyclestreets.api.client.geojson import net.cyclestreets.api.Map import net.cyclestreets.api.Maps +import net.cyclestreets.api.client.geojson.AbstractObjectFactory.propertyOrDefault import org.geojson.Feature import org.geojson.FeatureCollection class MapsFactory { companion object { fun toMaps(featureCollection: FeatureCollection): Maps { - val packs = mutableListOf() - for (feature in featureCollection.features) { - packs.add(toMap(feature)) - } - return Maps(packs) + return Maps( + featureCollection.features + .map { f -> toMap(f) } + .filter { m -> isBritainOrIreland(m) } + ) } private fun toMap(feature: Feature): Map { return Map( + feature.getProperty("id"), feature.getProperty("name"), - feature.getProperty("url") + feature.getProperty("url"), + propertyOrDefault(feature, "parent", "") ) } + + private fun isBritainOrIreland(m: Map): Boolean { + return isBritainOrIreland(m.id) + } + private fun isBritainOrIreland(p: String): Boolean { + return p.contains("great-britain") || p.contains("ireland") + } } } diff --git a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/MainSupport.kt b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/MainSupport.kt index 650f9c7b5..15ef2278e 100644 --- a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/MainSupport.kt +++ b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/MainSupport.kt @@ -19,7 +19,7 @@ object MainSupport { fun switchMapFile(intent: Intent, context: Context): Boolean { val mapPackage = intent.getStringExtra("mapfile") ?: return false val pack = MapPack.findByPackage(context, mapPackage) ?: return false - CycleStreetsPreferences.enableMapFile(pack.path()) + CycleStreetsPreferences.enableMapFile(pack.path) return true } diff --git a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt index 7dba82888..f472677cf 100644 --- a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt +++ b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt @@ -134,8 +134,8 @@ class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedP } private fun populateMapFileList(mapfilePref: ListPreference) { - val names = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.name() } - val files = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.path() } + val names = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.name } + val files = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.path } mapfilePref.entries = names.toTypedArray() mapfilePref.entryValues = files.toTypedArray() } diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java index 265bf884c..e6e29650c 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java @@ -44,7 +44,7 @@ public static ITileSource mapRenderer(final Context context) { if (renderer instanceof MapsforgeOSMTileSource) { final String mapFile = CycleStreetsPreferences.mapfile(); final MapPack pack = MapPack.findByPackage(context, mapFile); - if (pack.current()) + if (pack.getCurrent()) ((MapsforgeOSMTileSource)renderer).setMapFile(mapFile); else { MessageBox.YesNo(context, diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.java deleted file mode 100644 index 7a758e11b..000000000 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.java +++ /dev/null @@ -1,99 +0,0 @@ -package net.cyclestreets.util; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FilenameFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Environment; - -import static android.Manifest.permission.READ_EXTERNAL_STORAGE; - -public class MapPack -{ - private static final String MAPSFORGE_FILE_FORMAT_VERSION = "0.4.0"; - - public static void searchGooglePlay(final Context context) { - final Intent play = new Intent(Intent.ACTION_VIEW); - play.setData(Uri.parse("market://search?q=net.cyclestreets")); - context.startActivity(play); - } - - public static List availableMapPacks(Context context) { - final List packs = new ArrayList<>(); - - if (!PermissionsKt.hasPermission(context, READ_EXTERNAL_STORAGE)) - return packs; - - final File obbDir = new File(Environment.getExternalStorageDirectory(), "Android/obb"); - if (!obbDir.exists()) - return packs; - - for (final File mapDir : obbDir.listFiles(new CycleStreetsMapFilter())) { - final File map = findMapFile(mapDir, "main."); - final Properties props = mapProperties(mapDir); - final String name = props.getProperty("title"); - final String version = props.getProperty("version"); - if (map == null || name == null) - continue; - - packs.add(new MapPack(name, version, map)); - } - - return packs; - } - - public static MapPack findByPackage(final Context context, final String packageName) { - for (final MapPack pack : availableMapPacks(context)) - if (pack.path().contains(packageName)) - return pack; - return null; - } - - private static File findMapFile(final File mapDir, final String prefix) { - for (final File c : mapDir.listFiles()) - if (c.getName().startsWith(prefix)) - return c; - return null; - } - - private static Properties mapProperties(final File mapDir) { - final Properties details = new Properties(); - try { - final File detailsFile = findMapFile(mapDir, "patch."); - details.load(new FileInputStream(detailsFile)); - } - catch (IOException | RuntimeException e) { - } - return details; - } - - private static class CycleStreetsMapFilter implements FilenameFilter { - public boolean accept(final File dir, final String name) { - return name.contains("net.cyclestreets.maps"); - } - } - - ////////////////////////////////////////////////////// - private final String name_; - private final String path_; - private final String version_; - - private MapPack(final String n, - final String v, - final File p) { - name_ = n; - path_ = p.getAbsolutePath(); - version_ = v; - } - - public String name() { return name_; } - public String path() { return path_; } - public boolean current() { return MAPSFORGE_FILE_FORMAT_VERSION.equals(version_); } -} diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt new file mode 100644 index 000000000..3ab9d9dae --- /dev/null +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -0,0 +1,63 @@ +package net.cyclestreets.util + +import android.content.Context +import android.content.Intent +import android.net.Uri +import net.cyclestreets.api.Maps +import net.cyclestreets.api.Map +import java.io.File +import java.io.FileInputStream +import java.io.FilenameFilter +import java.io.IOException +import java.util.* + +class MapPack private constructor( + private val map: Map +) { + val name get() = map.name + val path get() = "none" + val current get() = false + + private class CycleStreetsMapFilter : FilenameFilter { + override fun accept(dir: File, name: String): Boolean { + return name.contains("net.cyclestreets.maps") + } + } + + companion object { + @JvmStatic + fun searchGooglePlay(context: Context) { + val play = Intent(Intent.ACTION_VIEW) + play.data = Uri.parse("market://search?q=net.cyclestreets") + context.startActivity(play) + } + + fun availableMapPacks(context: Context?): List { + val maps = Maps.get() ?: return emptyList() + + return maps.map {m -> MapPack(m) } + } + + @JvmStatic + fun findByPackage(context: Context?, packageName: String?): MapPack? { + for (pack in availableMapPacks(context)) if (pack.path.contains(packageName!!)) return pack + return null + } + + private fun findMapFile(mapDir: File, prefix: String): File? { + for (c in mapDir.listFiles()) if (c.name.startsWith(prefix)) return c + return null + } + + private fun mapProperties(mapDir: File): Properties { + val details = Properties() + try { + val detailsFile = findMapFile(mapDir, "patch.") + details.load(FileInputStream(detailsFile)) + } catch (e: IOException) { + } catch (e: RuntimeException) { + } + return details + } + } +} \ No newline at end of file From 8d61959557af79f950ae0931d394ef6f803058c5 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Wed, 2 Sep 2020 17:57:55 +0100 Subject: [PATCH 04/16] Rename Map to VectorMap Map was a foolish name in the first place :) --- .../src/main/java/net/cyclestreets/api/Maps.kt | 4 ++-- .../java/net/cyclestreets/api/{Map.kt => VectorMap.kt} | 2 +- .../net/cyclestreets/api/client/geojson/MapsFactory.kt | 8 ++++---- .../src/main/java/net/cyclestreets/util/MapPack.kt | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) rename libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/{Map.kt => VectorMap.kt} (85%) diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt index fa80ca24c..de0b120b5 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Maps.kt @@ -3,8 +3,8 @@ package net.cyclestreets.api import android.os.AsyncTask class Maps( - private val packs: Collection -): Iterable { + private val packs: Collection +): Iterable { val size get() = packs.size override operator fun iterator() = packs.iterator() diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/VectorMap.kt similarity index 85% rename from libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt rename to libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/VectorMap.kt index de96a0125..a59eca243 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Map.kt +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/VectorMap.kt @@ -1,6 +1,6 @@ package net.cyclestreets.api -data class Map( +data class VectorMap( val id: String, val name: String, val url: String, diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt index 81324cde0..ef8dc68d7 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt @@ -1,6 +1,6 @@ package net.cyclestreets.api.client.geojson -import net.cyclestreets.api.Map +import net.cyclestreets.api.VectorMap import net.cyclestreets.api.Maps import net.cyclestreets.api.client.geojson.AbstractObjectFactory.propertyOrDefault import org.geojson.Feature @@ -16,8 +16,8 @@ class MapsFactory { ) } - private fun toMap(feature: Feature): Map { - return Map( + private fun toMap(feature: Feature): VectorMap { + return VectorMap( feature.getProperty("id"), feature.getProperty("name"), feature.getProperty("url"), @@ -25,7 +25,7 @@ class MapsFactory { ) } - private fun isBritainOrIreland(m: Map): Boolean { + private fun isBritainOrIreland(m: VectorMap): Boolean { return isBritainOrIreland(m.id) } private fun isBritainOrIreland(p: String): Boolean { diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt index 3ab9d9dae..f25724b40 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -4,7 +4,7 @@ import android.content.Context import android.content.Intent import android.net.Uri import net.cyclestreets.api.Maps -import net.cyclestreets.api.Map +import net.cyclestreets.api.VectorMap import java.io.File import java.io.FileInputStream import java.io.FilenameFilter @@ -12,9 +12,9 @@ import java.io.IOException import java.util.* class MapPack private constructor( - private val map: Map + private val vectorMap: VectorMap ) { - val name get() = map.name + val name get() = vectorMap.name val path get() = "none" val current get() = false From ae3d9b9e5b5ba63e18dafa013533c6af058a0f7f Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Wed, 2 Sep 2020 18:02:52 +0100 Subject: [PATCH 05/16] Start extending MapPack so it knows if the pack is downloaded or not --- .../src/main/java/net/cyclestreets/util/MapPack.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt index f25724b40..4174d088f 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -14,9 +14,10 @@ import java.util.* class MapPack private constructor( private val vectorMap: VectorMap ) { - val name get() = vectorMap.name + val name get() = "${vectorMap.name}${if(downloaded) "" else " (Needs download)"}" val path get() = "none" val current get() = false + val downloaded get() = false private class CycleStreetsMapFilter : FilenameFilter { override fun accept(dir: File, name: String): Boolean { From 858a7c5b2136ff45abf7d3fb954ed2f6f5c95ef0 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Wed, 2 Sep 2020 18:14:00 +0100 Subject: [PATCH 06/16] Better property names on MapPack. Use id rather than file to identify the packs --- .../src/main/java/net/cyclestreets/SettingsFragment.kt | 8 ++++---- .../src/main/java/net/cyclestreets/util/MapPack.kt | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt index f472677cf..3cdb58e6c 100644 --- a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt +++ b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt @@ -134,10 +134,10 @@ class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedP } private fun populateMapFileList(mapfilePref: ListPreference) { - val names = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.name } - val files = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.path } - mapfilePref.entries = names.toTypedArray() - mapfilePref.entryValues = files.toTypedArray() + val titles = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.title } + val ids = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.id } + mapfilePref.entries = titles.toTypedArray() + mapfilePref.entryValues = ids.toTypedArray() } override fun onResume() { diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt index 4174d088f..442244fff 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -14,7 +14,8 @@ import java.util.* class MapPack private constructor( private val vectorMap: VectorMap ) { - val name get() = "${vectorMap.name}${if(downloaded) "" else " (Needs download)"}" + val id get() = vectorMap.id + val title get() = "${vectorMap.name}${if(downloaded) "" else " (Needs download)"}" val path get() = "none" val current get() = false val downloaded get() = false From 29a90da24d1df0447aa28adcefab5c0e564ed6b9 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Wed, 2 Sep 2020 18:14:43 +0100 Subject: [PATCH 07/16] Remove switchMapFile. We'll be retiring the external map packs so we won't need to support changing the map through the launch intent. --- .../src/main/java/net/cyclestreets/CycleStreets.kt | 2 -- .../src/main/java/net/cyclestreets/MainSupport.kt | 7 ------- 2 files changed, 9 deletions(-) diff --git a/cyclestreets.app/src/main/java/net/cyclestreets/CycleStreets.kt b/cyclestreets.app/src/main/java/net/cyclestreets/CycleStreets.kt index 6a4800426..60f10038b 100644 --- a/cyclestreets.app/src/main/java/net/cyclestreets/CycleStreets.kt +++ b/cyclestreets.app/src/main/java/net/cyclestreets/CycleStreets.kt @@ -5,8 +5,6 @@ import android.os.Bundle class CycleStreets : MainNavDrawerActivity(), RouteMapActivity, PhotoMapActivity { public override fun onCreate(savedInstanceState: Bundle?) { - MainSupport.switchMapFile(intent, this) - super.onCreate(savedInstanceState) MainSupport.handleLaunchIntent(intent, this) diff --git a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/MainSupport.kt b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/MainSupport.kt index 15ef2278e..9eea30bf9 100644 --- a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/MainSupport.kt +++ b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/MainSupport.kt @@ -16,13 +16,6 @@ private val TAG = Logging.getTag(MainSupport::class.java) object MainSupport { - fun switchMapFile(intent: Intent, context: Context): Boolean { - val mapPackage = intent.getStringExtra("mapfile") ?: return false - val pack = MapPack.findByPackage(context, mapPackage) ?: return false - CycleStreetsPreferences.enableMapFile(pack.path) - return true - } - fun handleLaunchIntent(intent: Intent, activity: Activity): Boolean { val launchUri = intent.data ?: return false Log.d(TAG, "Handling launch intent with URI: $launchUri") From f21bb755c9cbdfa9df8d392e3d9be93a0f3f2f74 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Wed, 2 Sep 2020 21:27:49 +0100 Subject: [PATCH 08/16] Build path where the map packs lives (or will live) --- .../main/java/net/cyclestreets/SettingsFragment.kt | 10 ++++++---- .../src/main/java/net/cyclestreets/util/MapPack.kt | 12 +++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt index 3cdb58e6c..1a47cb2c1 100644 --- a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt +++ b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt @@ -134,10 +134,12 @@ class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedP } private fun populateMapFileList(mapfilePref: ListPreference) { - val titles = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.title } - val ids = MapPack.availableMapPacks(context).map { pack: MapPack -> pack.id } - mapfilePref.entries = titles.toTypedArray() - mapfilePref.entryValues = ids.toTypedArray() + context?.let { + val titles = MapPack.availableMapPacks(it).map { pack: MapPack -> pack.title } + val ids = MapPack.availableMapPacks(it).map { pack: MapPack -> pack.id } + mapfilePref.entries = titles.toTypedArray() + mapfilePref.entryValues = ids.toTypedArray() + } } override fun onResume() { diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt index 442244fff..78bd4d4b2 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -3,6 +3,7 @@ package net.cyclestreets.util import android.content.Context import android.content.Intent import android.net.Uri +import android.os.Environment import net.cyclestreets.api.Maps import net.cyclestreets.api.VectorMap import java.io.File @@ -12,11 +13,12 @@ import java.io.IOException import java.util.* class MapPack private constructor( - private val vectorMap: VectorMap + private val vectorMap: VectorMap, + context: Context ) { val id get() = vectorMap.id val title get() = "${vectorMap.name}${if(downloaded) "" else " (Needs download)"}" - val path get() = "none" + val path = File(context.getExternalFilesDir(null), vectorMap.id).absolutePath val current get() = false val downloaded get() = false @@ -34,14 +36,14 @@ class MapPack private constructor( context.startActivity(play) } - fun availableMapPacks(context: Context?): List { + fun availableMapPacks(context: Context): List { val maps = Maps.get() ?: return emptyList() - return maps.map {m -> MapPack(m) } + return maps.map {m -> MapPack(m, context) } } @JvmStatic - fun findByPackage(context: Context?, packageName: String?): MapPack? { + fun findByPackage(context: Context, packageName: String?): MapPack? { for (pack in availableMapPacks(context)) if (pack.path.contains(packageName!!)) return pack return null } From 282d5aeff6a39862cbf11b56e6d20f0e424a3951 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Wed, 2 Sep 2020 21:48:09 +0100 Subject: [PATCH 09/16] Set downloaded flag based on whether file exists --- .../src/main/java/net/cyclestreets/util/MapPack.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt index 78bd4d4b2..68044588b 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -18,9 +18,9 @@ class MapPack private constructor( ) { val id get() = vectorMap.id val title get() = "${vectorMap.name}${if(downloaded) "" else " (Needs download)"}" - val path = File(context.getExternalFilesDir(null), vectorMap.id).absolutePath + val path = File(context.getExternalFilesDir(null), "${vectorMap.id}.map").absolutePath val current get() = false - val downloaded get() = false + val downloaded get() = File(path).exists() private class CycleStreetsMapFilter : FilenameFilter { override fun accept(dir: File, name: String): Boolean { From 34a0c93a25bba017f5acd6509ad9da76e734db3f Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Thu, 3 Sep 2020 15:53:12 +0100 Subject: [PATCH 10/16] s/MapPack.findByPackage/MapPack.findById/ --- .../main/java/net/cyclestreets/tiles/TileSource.java | 11 ++--------- .../src/main/java/net/cyclestreets/util/MapPack.kt | 5 ++--- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java index 99aad03ec..8ac586df1 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java @@ -52,17 +52,10 @@ public static ITileSource mapRenderer(final Context context) { if (renderer instanceof MapsforgeOSMTileSource) { final String mapFile = CycleStreetsPreferences.mapfile(); - final MapPack pack = MapPack.findByPackage(context, mapFile); - if (pack.getCurrent()) + final MapPack pack = MapPack.findById(context, mapFile); + if (pack != null && pack.getCurrent()) ((MapsforgeOSMTileSource)renderer).setMapFile(mapFile); else { - MessageBox.YesNo(context, - R.string.tiles_map_pack_out_of_date, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface arg0, int arg1) { - MapPack.searchGooglePlay(context); - } - }); CycleStreetsPreferences.resetMapstyle(); return source(DEFAULT_RENDERER).renderer(); } diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt index 68044588b..95c8cdf9e 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -43,9 +43,8 @@ class MapPack private constructor( } @JvmStatic - fun findByPackage(context: Context, packageName: String?): MapPack? { - for (pack in availableMapPacks(context)) if (pack.path.contains(packageName!!)) return pack - return null + fun findById(context: Context, packId: String): MapPack? { + return availableMapPacks(context).find { it.id == packId } } private fun findMapFile(mapDir: File, prefix: String): File? { From 8da0c32a8f9e1bc8d152176e7d55126102354264 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Thu, 3 Sep 2020 16:46:24 +0100 Subject: [PATCH 11/16] Bump mapsforge to version 0.14.0 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ef98a5623..bbf792596 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ ext { buildToolsVersion='29.0.3' // centrally manage some other dependencies - mapsforgeVersion = '0.13.0' + mapsforgeVersion = '0.14.0' osmdroidVersion = '6.1.6' // test dependencies From 8b45fa8b44dc356040303614771bb53de070538a Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Thu, 3 Sep 2020 16:55:28 +0100 Subject: [PATCH 12/16] Download map packs on first use. Needs some more attention, particularly around okaying with the user, and once the download has finished, but it's a step along the road. --- .../net/cyclestreets/tiles/TileSource.java | 15 ++++++++++----- .../main/java/net/cyclestreets/util/MapPack.kt | 18 +++++++++++++++--- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java index 8ac586df1..12efbd44e 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/tiles/TileSource.java @@ -51,14 +51,19 @@ public static ITileSource mapRenderer(final Context context) { final ITileSource renderer = source.renderer(); if (renderer instanceof MapsforgeOSMTileSource) { - final String mapFile = CycleStreetsPreferences.mapfile(); - final MapPack pack = MapPack.findById(context, mapFile); - if (pack != null && pack.getCurrent()) - ((MapsforgeOSMTileSource)renderer).setMapFile(mapFile); - else { + final String mapId = CycleStreetsPreferences.mapfile(); + final MapPack pack = MapPack.findById(context, mapId); + if (pack == null) { CycleStreetsPreferences.resetMapstyle(); return source(DEFAULT_RENDERER).renderer(); } + + if (pack.getDownloaded()) + ((MapsforgeOSMTileSource)renderer).setMapFile(pack.getPath()); + else { + pack.download(context); + return source(DEFAULT_RENDERER).renderer(); + } } return renderer; diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt index 95c8cdf9e..a5cb21449 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -1,9 +1,9 @@ package net.cyclestreets.util +import android.app.DownloadManager import android.content.Context import android.content.Intent import android.net.Uri -import android.os.Environment import net.cyclestreets.api.Maps import net.cyclestreets.api.VectorMap import java.io.File @@ -19,9 +19,21 @@ class MapPack private constructor( val id get() = vectorMap.id val title get() = "${vectorMap.name}${if(downloaded) "" else " (Needs download)"}" val path = File(context.getExternalFilesDir(null), "${vectorMap.id}.map").absolutePath - val current get() = false val downloaded get() = File(path).exists() + fun download(context: Context) { + val dm = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager + val request = DownloadManager.Request( + Uri.parse(vectorMap.url) + ) + request.setTitle("${vectorMap.name} Map Pack") + request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE) + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) + request.setDestinationInExternalFilesDir(context, null, "${vectorMap.id}.map") + + dm.enqueue(request) + } // download + private class CycleStreetsMapFilter : FilenameFilter { override fun accept(dir: File, name: String): Boolean { return name.contains("net.cyclestreets.maps") @@ -39,7 +51,7 @@ class MapPack private constructor( fun availableMapPacks(context: Context): List { val maps = Maps.get() ?: return emptyList() - return maps.map {m -> MapPack(m, context) } + return maps.map { m -> MapPack(m, context) } } @JvmStatic From 55b129ef83160d951e27dc5b72d6e4a19222b09d Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Thu, 3 Sep 2020 16:57:59 +0100 Subject: [PATCH 13/16] Strip out some of the old map pack support. --- .../java/net/cyclestreets/SettingsFragment.kt | 1 - .../java/net/cyclestreets/util/MapPack.kt | 29 ------------------- 2 files changed, 30 deletions(-) diff --git a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt index 1a47cb2c1..fa42c4905 100644 --- a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt +++ b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/SettingsFragment.kt @@ -184,7 +184,6 @@ class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedP if (mapfilePref.entryValues.isEmpty()) { mapfilePref.isEnabled = false - MessageBox.YesNo(requireView(), R.string.settings_no_map_packs) { _, _ -> MapPack.searchGooglePlay(requireContext()) } return } diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt index a5cb21449..e178a04fa 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -34,20 +34,7 @@ class MapPack private constructor( dm.enqueue(request) } // download - private class CycleStreetsMapFilter : FilenameFilter { - override fun accept(dir: File, name: String): Boolean { - return name.contains("net.cyclestreets.maps") - } - } - companion object { - @JvmStatic - fun searchGooglePlay(context: Context) { - val play = Intent(Intent.ACTION_VIEW) - play.data = Uri.parse("market://search?q=net.cyclestreets") - context.startActivity(play) - } - fun availableMapPacks(context: Context): List { val maps = Maps.get() ?: return emptyList() @@ -58,21 +45,5 @@ class MapPack private constructor( fun findById(context: Context, packId: String): MapPack? { return availableMapPacks(context).find { it.id == packId } } - - private fun findMapFile(mapDir: File, prefix: String): File? { - for (c in mapDir.listFiles()) if (c.name.startsWith(prefix)) return c - return null - } - - private fun mapProperties(mapDir: File): Properties { - val details = Properties() - try { - val detailsFile = findMapFile(mapDir, "patch.") - details.load(FileInputStream(detailsFile)) - } catch (e: IOException) { - } catch (e: RuntimeException) { - } - return details - } } } \ No newline at end of file From 9ab2421790ba0379320c27ded626754499da10fc Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Thu, 3 Sep 2020 17:24:00 +0100 Subject: [PATCH 14/16] Tweak download notification visibility --- .../src/main/java/net/cyclestreets/util/MapPack.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt index e178a04fa..667e38de6 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/MapPack.kt @@ -28,7 +28,7 @@ class MapPack private constructor( ) request.setTitle("${vectorMap.name} Map Pack") request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE) - request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE) request.setDestinationInExternalFilesDir(context, null, "${vectorMap.id}.map") dm.enqueue(request) From 486a8d5646e22d9e6dd625a563aa4b6ce38d8103 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Thu, 3 Sep 2020 17:24:32 +0100 Subject: [PATCH 15/16] Capture vector map size and last modified date --- .../src/main/java/net/cyclestreets/api/VectorMap.kt | 4 +++- .../java/net/cyclestreets/api/client/geojson/MapsFactory.kt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/VectorMap.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/VectorMap.kt index a59eca243..a217079c1 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/VectorMap.kt +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/VectorMap.kt @@ -4,5 +4,7 @@ data class VectorMap( val id: String, val name: String, val url: String, - val parent: String + val parent: String, + val size: String, + val lastModified: String ) \ No newline at end of file diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt index ef8dc68d7..a466090c6 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/geojson/MapsFactory.kt @@ -21,7 +21,9 @@ class MapsFactory { feature.getProperty("id"), feature.getProperty("name"), feature.getProperty("url"), - propertyOrDefault(feature, "parent", "") + propertyOrDefault(feature, "parent", ""), + propertyOrDefault(feature, "size", ""), + propertyOrDefault(feature, "lastModified", ""), ) } From c7389c8cfb7d6157e4bbff9f12d3ddf32d498ab3 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Wed, 30 Sep 2020 14:24:14 +0100 Subject: [PATCH 16/16] Restore mapfile preference --- libraries/cyclestreets-view/src/main/res/xml/prefs.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/cyclestreets-view/src/main/res/xml/prefs.xml b/libraries/cyclestreets-view/src/main/res/xml/prefs.xml index f94e417d4..55091dc8e 100644 --- a/libraries/cyclestreets-view/src/main/res/xml/prefs.xml +++ b/libraries/cyclestreets-view/src/main/res/xml/prefs.xml @@ -9,6 +9,9 @@ android:title="Map style" android:summary="OpenStreetMap" android:defaultValue="CycleStreets-OSM" /> +