diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt index 6586c5df8..969423c40 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/StorageAccessStreamHandler.kt @@ -171,6 +171,7 @@ class StorageAccessStreamHandler(private val activity: Activity, arguments: Any? }) activity.startActivityForResult(intent, MainActivity.SELECT_DIRECTORY_REQUEST) } else { + // TODO TLAD support KitKat success(null) endOfStream() } diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index 2518042d3..a5a746ea4 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:ui'; import 'package:aves/app_flavor.dart'; @@ -27,12 +28,15 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:overlay_support/overlay_support.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; class AvesApp extends StatefulWidget { final AppFlavor flavor; + static String userAgent = ''; + const AvesApp({ Key? key, required this.flavor, @@ -161,6 +165,7 @@ class _AvesAppState extends State { isRotationLocked: await windowService.isRotationLocked(), areAnimationsRemoved: await AccessibilityService.areAnimationsRemoved(), ); + unawaited(_initUserAgent()); FijkLog.setLevel(FijkLogLevel.Warn); // keep screen on @@ -205,6 +210,11 @@ class _AvesAppState extends State { ]; } + Future _initUserAgent() async { + final info = await PackageInfo.fromPlatform(); + AvesApp.userAgent = '${info.packageName}/${info.version}'; + } + void _onNewIntent(Map? intentData) { debugPrint('$runtimeType onNewIntent with intentData=$intentData'); diff --git a/lib/widgets/common/map/leaflet/tile_layers.dart b/lib/widgets/common/map/leaflet/tile_layers.dart index 4a2649d0c..d815e1372 100644 --- a/lib/widgets/common/map/leaflet/tile_layers.dart +++ b/lib/widgets/common/map/leaflet/tile_layers.dart @@ -1,3 +1,4 @@ +import 'package:aves/widgets/aves_app.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:provider/provider.dart'; @@ -11,6 +12,7 @@ class OSMHotLayer extends StatelessWidget { options: TileLayerOptions( urlTemplate: 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', subdomains: ['a', 'b', 'c'], + tileProvider: _NetworkTileProvider(), retinaMode: context.select((mq) => mq.devicePixelRatio) > 1, ), ); @@ -26,6 +28,7 @@ class StamenTonerLayer extends StatelessWidget { options: TileLayerOptions( urlTemplate: 'https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}{r}.png', subdomains: ['a', 'b', 'c', 'd'], + tileProvider: _NetworkTileProvider(), retinaMode: context.select((mq) => mq.devicePixelRatio) > 1, ), ); @@ -41,8 +44,22 @@ class StamenWatercolorLayer extends StatelessWidget { options: TileLayerOptions( urlTemplate: 'https://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg', subdomains: ['a', 'b', 'c', 'd'], + tileProvider: _NetworkTileProvider(), retinaMode: context.select((mq) => mq.devicePixelRatio) > 1, ), ); } } + +class _NetworkTileProvider extends NetworkTileProvider { + final Map headers = { + 'User-Agent': AvesApp.userAgent, + }; + + _NetworkTileProvider(); + + @override + ImageProvider getImage(Coords coords, TileLayerOptions options) { + return NetworkImage(getTileUrl(coords, options), headers: headers); + } +}