Skip to content

Commit d8c8673

Browse files
authored
[offline] add default pixelRatio for TilesetDescriptorOptions (#640)
* [offline] add default pixelRatio for TilesetDescriptorOptions * Automatically set MapboxMapsOptions.tileStore
1 parent 0bf0f22 commit d8c8673

File tree

8 files changed

+81
-51
lines changed

8 files changed

+81
-51
lines changed

android/src/main/kotlin/com/mapbox/maps/mapbox_maps/Extentions.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -611,12 +611,12 @@ fun com.mapbox.maps.StylePackLoadProgress.toFLTStylePackLoadProgress(): StylePac
611611
)
612612
}
613613

614-
fun TilesetDescriptorOptions.toTilesetDescriptorOptions(): com.mapbox.maps.TilesetDescriptorOptions {
614+
fun TilesetDescriptorOptions.toTilesetDescriptorOptions(context: Context): com.mapbox.maps.TilesetDescriptorOptions {
615615
val builder = com.mapbox.maps.TilesetDescriptorOptions.Builder()
616616
.styleURI(styleURI)
617617
.minZoom(minZoom.toByte())
618618
.maxZoom(maxZoom.toByte())
619-
pixelRatio?.let { builder.pixelRatio(it.toFloat()) }
619+
.pixelRatio(pixelRatio?.toFloat() ?: context.resources.displayMetrics.density)
620620
tilesets?.let { builder.tilesets(it) }
621621
stylePackOptions?.let { builder.stylePackOptions(it.toStylePackLoadOptions()) }
622622
extraOptions?.let { builder.extraOptions(it.toValue()) }

android/src/main/kotlin/com/mapbox/maps/mapbox_maps/offline/OfflineMapInstanceManager.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.mapbox.maps.mapbox_maps.offline
22

33
import android.content.Context
44
import com.mapbox.common.TileStore
5+
import com.mapbox.maps.MapboxMapsOptions
56
import com.mapbox.maps.mapbox_maps.ProxyBinaryMessenger
67
import com.mapbox.maps.mapbox_maps.pigeons.*
78
import io.flutter.plugin.common.BinaryMessenger
@@ -27,6 +28,7 @@ class OfflineMapInstanceManager(
2728
override fun setupTileStore(channelSuffix: String, filePath: String?) {
2829
val proxy = ProxyBinaryMessenger(messenger, channelSuffix)
2930
val tileStore = filePath?.let { TileStore.create(it) } ?: TileStore.create()
31+
MapboxMapsOptions.tileStore = tileStore
3032
val tileStoreController = TileStoreController(context, messenger, tileStore)
3133
_TileStore.setUp(proxy, tileStoreController)
3234
proxies["tilestore/$channelSuffix"] = proxy
@@ -35,5 +37,6 @@ class OfflineMapInstanceManager(
3537
override fun tearDownTileStore(channelSuffix: String) {
3638
val proxy = proxies["tilestore/$channelSuffix"] ?: return
3739
_TileStore.setUp(proxy, null)
40+
MapboxMapsOptions.tileStore = null
3841
}
3942
}

android/src/main/kotlin/com/mapbox/maps/mapbox_maps/offline/TileStoreController.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class TileStoreController(
3838
callback: (Result<TileRegion>) -> Unit
3939
) {
4040
tileStore.loadTileRegion(
41-
id, offlineManager.tileRegionLoadOptions(loadOptions),
41+
id, offlineManager.tileRegionLoadOptions(loadOptions, context),
4242
{ progress ->
4343
mainHandler.post {
4444
tileRegionLoadProgressHandlers[id]?.success(progress.toFLTTileRegionLoadProgress().toList())
@@ -75,7 +75,7 @@ class TileStoreController(
7575
) {
7676
tileStore.estimateTileRegion(
7777
id,
78-
offlineManager.tileRegionLoadOptions(loadOptions),
78+
offlineManager.tileRegionLoadOptions(loadOptions, context),
7979
estimateOptions?.toTileRegionEstimateOptions() ?: com.mapbox.common.TileRegionEstimateOptions(null),
8080
{ progress ->
8181
mainHandler.post {
@@ -116,7 +116,7 @@ class TileStoreController(
116116
}
117117

118118
override fun tileRegionContainsDescriptor(id: String, options: List<TilesetDescriptorOptions>, callback: (Result<Boolean>) -> Unit) {
119-
val descriptors = options.map { offlineManager.createTilesetDescriptor(it.toTilesetDescriptorOptions()) }
119+
val descriptors = options.map { offlineManager.createTilesetDescriptor(it.toTilesetDescriptorOptions(context)) }
120120
tileStore.tileRegionContainsDescriptors(id, descriptors) { expected ->
121121
mainHandler.post {
122122
callback(expected.toResult { it })
@@ -152,7 +152,7 @@ class TileStoreController(
152152
}
153153
}
154154

155-
private fun OfflineManager.tileRegionLoadOptions(fltValue: TileRegionLoadOptions): com.mapbox.common.TileRegionLoadOptions {
155+
private fun OfflineManager.tileRegionLoadOptions(fltValue: TileRegionLoadOptions, context: Context): com.mapbox.common.TileRegionLoadOptions {
156156
val builder = com.mapbox.common.TileRegionLoadOptions.Builder()
157157
.geometry(fltValue.geometry?.toGeometry())
158158
.metadata(fltValue.metadata?.toValue())
@@ -165,7 +165,7 @@ private fun OfflineManager.tileRegionLoadOptions(fltValue: TileRegionLoadOptions
165165
fltValue.descriptorsOptions?.let { options ->
166166
val descriptors: List<TilesetDescriptorOptions> = options.filterNotNull()
167167
builder.descriptors(
168-
descriptors.map { createTilesetDescriptor(it.toTilesetDescriptorOptions()) }
168+
descriptors.map { createTilesetDescriptor(it.toTilesetDescriptorOptions(context)) }
169169
)
170170
}
171171

example/ios/Podfile.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ EXTERNAL SOURCES:
4848

4949
SPEC CHECKSUMS:
5050
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
51-
integration_test: ce0a3ffa1de96d1a89ca0ac26fca7ea18a749ef4
51+
integration_test: 13825b8a9334a850581300559b8839134b124670
5252
mapbox_maps_flutter: 4ad19682f43ffed50be9c1eb2364107e21725f1f
5353
MapboxCommon: 595dd030df6b2c88e73dd53cef95acc3f31cfa7e
5454
MapboxCoreMaps: f33e09b177988af18168b8717f5d79937c85908f

example/lib/offline_map.dart

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,14 @@ class OfflineMapWidgetState extends State<OfflineMapWidget> {
3232
final StreamController<double> _tileRegionLoadProgress =
3333
StreamController.broadcast();
3434

35-
_onMapCreated(MapboxMap mapboxMap) async {
36-
this.mapboxMap = mapboxMap;
37-
await _downloadStylePack();
38-
await _downloadTileRegion();
39-
}
40-
4135
_downloadStylePack() async {
4236
final offlineManager = await OfflineManager.create();
4337
final stylePackLoadOptions = StylePackLoadOptions(
4438
glyphsRasterizationMode:
4539
GlyphsRasterizationMode.IDEOGRAPHS_RASTERIZED_LOCALLY,
4640
metadata: {"tag": "test"},
4741
acceptExpired: false);
48-
offlineManager.loadStylePack(MapboxStyles.OUTDOORS, stylePackLoadOptions,
42+
offlineManager.loadStylePack(MapboxStyles.SATELLITE_STREETS, stylePackLoadOptions,
4943
(progress) {
5044
final percentage =
5145
progress.completedResourceCount / progress.requiredResourceCount;
@@ -59,13 +53,15 @@ class OfflineMapWidgetState extends State<OfflineMapWidget> {
5953
}
6054

6155
_downloadTileRegion() async {
62-
final tmpDir = await getTemporaryDirectory();
63-
final tileStore = await TileStore.createAt(await tmpDir.uri);
56+
final path = await getTemporaryDirectory();
57+
final tileStore = await TileStore.createAt(path.uri);
6458
final tileRegionLoadOptions = TileRegionLoadOptions(
65-
geometry: Point(coordinates: Position(-80.1263, 25.7845)).toJson(),
59+
geometry: City.helsinki.toJson(),
6660
descriptorsOptions: [
61+
// If you are using a raster tileset you may need to set a different pixelRatio.
62+
// The default is UIScreen.main.scale on iOS and displayMetrics's density on Android.
6763
TilesetDescriptorOptions(
68-
styleURI: MapboxStyles.OUTDOORS, minZoom: 0, maxZoom: 16)
64+
styleURI: MapboxStyles.SATELLITE_STREETS, minZoom: 0, maxZoom: 16)
6965
],
7066
acceptExpired: true,
7167
networkRestriction: NetworkRestriction.NONE);
@@ -85,18 +81,40 @@ class OfflineMapWidgetState extends State<OfflineMapWidget> {
8581

8682
@override
8783
Widget build(BuildContext context) {
88-
final mapWidget = MapWidget(
89-
key: ValueKey("mapWidget"),
90-
styleUri: MapboxStyles.OUTDOORS,
91-
cameraOptions: CameraOptions(center: City.helsinki, zoom: 2.0),
92-
onMapCreated: _onMapCreated,
93-
);
84+
String downloadButtonText = "Download Map";
85+
final mapIsDownloaded = Future
86+
.wait([_tileRegionLoadProgress.sink.done, _stylePackProgress.sink.done])
87+
.whenComplete(() async {
88+
await OfflineSwitch.shared.setMapboxStackConnected(false);
89+
});
9490

9591
return new Column(
9692
mainAxisSize: MainAxisSize.min,
9793
children: [
9894
Expanded(
99-
child: mapWidget,
95+
child: FutureBuilder(future: mapIsDownloaded, builder: (context, snapshot) {
96+
if (snapshot.hasData) {
97+
return MapWidget(
98+
key: ValueKey("mapWidget"),
99+
styleUri: MapboxStyles.SATELLITE_STREETS,
100+
cameraOptions: CameraOptions(center: City.helsinki, zoom: 12.0),
101+
);
102+
} else {
103+
return TextButton(
104+
style: ButtonStyle(
105+
foregroundColor: MaterialStateProperty.all<Color>(Colors.blue),
106+
),
107+
onPressed: () async {
108+
setState(() {
109+
downloadButtonText = "Downloading";
110+
});
111+
await _downloadStylePack();
112+
await _downloadTileRegion();
113+
},
114+
child: Text(downloadButtonText),
115+
);
116+
}
117+
}),
100118
),
101119
SizedBox(
102120
height: 100,

ios/Classes/Extensions.swift

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -917,25 +917,15 @@ extension MapboxCoreMaps.StylePackLoadProgress {
917917

918918
extension MapboxCoreMaps.TilesetDescriptorOptions {
919919

920-
convenience init(fltValue: TilesetDescriptorOptions) {
921-
if let pixelRatio = fltValue.pixelRatio {
922-
self.init(
923-
styleURI: fltValue.styleURI,
924-
minZoom: UInt8(fltValue.minZoom),
925-
maxZoom: UInt8(fltValue.maxZoom),
926-
pixelRatio: Float(pixelRatio),
927-
tilesets: fltValue.tilesets?.compacted(),
928-
stylePack: fltValue.stylePackOptions.flatMap(MapboxCoreMaps.StylePackLoadOptions.init(fltValue:)),
929-
extraOptions: fltValue.extraOptions)
930-
} else {
931-
self.init(
932-
styleURI: fltValue.styleURI,
933-
minZoom: UInt8(fltValue.minZoom),
934-
maxZoom: UInt8(fltValue.maxZoom),
935-
tilesets: fltValue.tilesets?.compacted(),
936-
stylePack: fltValue.stylePackOptions.flatMap(MapboxCoreMaps.StylePackLoadOptions.init(fltValue:)),
937-
extraOptions: fltValue.extraOptions)
938-
}
920+
convenience init?(fltValue: TilesetDescriptorOptions) {
921+
guard let styleURI = StyleURI(rawValue: fltValue.styleURI) else { return nil }
922+
self.init(
923+
styleURI: styleURI,
924+
zoomRange: UInt8(fltValue.minZoom)...UInt8(fltValue.maxZoom),
925+
pixelRatio: fltValue.pixelRatio.map(Float.init),
926+
tilesets: fltValue.tilesets?.compacted(),
927+
stylePackOptions: fltValue.stylePackOptions.flatMap(MapboxCoreMaps.StylePackLoadOptions.init(fltValue:)),
928+
extraOptions: fltValue.extraOptions)
939929
}
940930
}
941931

@@ -995,6 +985,20 @@ extension MapboxCommon.TileRegionEstimateProgress {
995985
erroredResourceCount: Int64(erroredResourceCount))
996986
}
997987
}
988+
989+
extension MapboxCommon.NetworkRestriction {
990+
991+
init(fltValue: NetworkRestriction) {
992+
switch fltValue {
993+
case .nONE:
994+
self = .none
995+
case .dISALLOWEXPENSIVE:
996+
self = .disallowExpensive
997+
case .dISALLOWALL:
998+
self = .disallowAll
999+
}
1000+
}
1001+
}
9981002
// MARK: Result
9991003
extension Result where Failure == any Error {
10001004
init(code: String, catchingFlutter body: () throws -> Success) {

ios/Classes/Offline/OfflineMapInstanceManager.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Flutter
2+
import MapboxMaps
23

34
final class OfflineMapInstanceManager: _OfflineMapInstanceManager, _TileStoreInstanceManager {
45
enum `Error`: Swift.Error {
@@ -25,20 +26,24 @@ final class OfflineMapInstanceManager: _OfflineMapInstanceManager, _TileStoreIns
2526
}
2627

2728
func setupTileStore(channelSuffix: String, filePath: String?) throws {
28-
let tileStoreController: TileStoreController
2929
let proxy = ProxyBinaryMessenger(with: binaryMessenger, channelSuffix: channelSuffix)
30+
let tileStore: TileStore
3031
if let filePath {
31-
tileStoreController = TileStoreController(proxy: proxy, tileStore: .shared(for: URL(fileURLWithPath: filePath)))
32+
tileStore = .shared(for: URL(fileURLWithPath: filePath))
3233
} else {
33-
tileStoreController = TileStoreController(proxy: proxy, tileStore: .default)
34+
tileStore = .default
3435
}
3536

37+
MapboxMapsOptions.tileStore = tileStore
38+
let tileStoreController = TileStoreController(proxy: proxy, tileStore: tileStore)
39+
3640
_TileStoreSetup.setUp(binaryMessenger: proxy, api: tileStoreController)
3741
proxies["tilestore/\(channelSuffix)"] = proxy
3842
}
3943

4044
func tearDownTileStore(channelSuffix: String) throws {
4145
guard let proxy = proxies.removeValue(forKey: "tilestore/\(channelSuffix)") else { return }
4246
_TileStoreSetup.setUp(binaryMessenger: proxy, api: nil)
47+
MapboxMapsOptions.tileStore = nil
4348
}
4449
}

ios/Classes/Offline/TileStoreController.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ final class TileStoreController: _TileStore {
7575

7676
func tileRegionContainsDescriptor(id: String, options: [TilesetDescriptorOptions], completion: @escaping (Result<Bool, Swift.Error>) -> Void) {
7777
let descriptors = options
78-
.map(MapboxCoreMaps.TilesetDescriptorOptions.init(fltValue:))
78+
.compactMap(MapboxCoreMaps.TilesetDescriptorOptions.init(fltValue:))
7979
.map(offlineManager.createTilesetDescriptor(for:))
8080

8181
tileStore.tileRegionContainsDescriptors(forId: id, descriptors: descriptors, completion: executeOnMainThread(completion))
@@ -110,11 +110,11 @@ extension OfflineManager {
110110
geometry: convertDictionaryToGeometry(dict: fltValue.geometry),
111111
descriptors: fltValue.descriptorsOptions?.compactMap { descriptorOptions in
112112
guard let descriptorOptions else { return nil }
113-
return createTilesetDescriptor(for: MapboxCoreMaps.TilesetDescriptorOptions(fltValue: descriptorOptions))
113+
return MapboxCoreMaps.TilesetDescriptorOptions(fltValue: descriptorOptions).map(createTilesetDescriptor(for:))
114114
},
115115
metadata: fltValue.metadata,
116116
acceptExpired: fltValue.acceptExpired,
117-
networkRestriction: MapboxCommon.NetworkRestriction(other: fltValue.networkRestriction) ?? .none,
117+
networkRestriction: MapboxCommon.NetworkRestriction(fltValue: fltValue.networkRestriction),
118118
averageBytesPerSecond: fltValue.averageBytesPerSecond.map(Int.init),
119119
extraOptions: fltValue.extraOptions
120120
)

0 commit comments

Comments
 (0)