diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d25e8bd..d7fed63 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,5 +1,7 @@ PODS: - Alamofire (5.6.2) + - apple_maps_flutter (0.0.1): + - Flutter - camera_avfoundation (0.0.1): - Flutter - Flutter (1.0.0) @@ -32,6 +34,7 @@ PODS: - Flutter DEPENDENCIES: + - apple_maps_flutter (from `.symlinks/plugins/apple_maps_flutter/ios`) - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) - Flutter (from `Flutter`) - flutter_osm_plugin (from `.symlinks/plugins/flutter_osm_plugin/ios`) @@ -53,6 +56,8 @@ SPEC REPOS: - Toast EXTERNAL SOURCES: + apple_maps_flutter: + :path: ".symlinks/plugins/apple_maps_flutter/ios" camera_avfoundation: :path: ".symlinks/plugins/camera_avfoundation/ios" Flutter: @@ -80,6 +85,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Alamofire: d368e1ff8a298e6dde360e35a3e68e6c610e7204 + apple_maps_flutter: c59725efea39e13e703cde52a1d2b14866ad68a8 camera_avfoundation: 07c77549ea54ad95d8581be86617c094a46280d9 Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a flutter_osm_plugin: f06ae1e854af57270c61ae27bdb8a386cfd4afa5 diff --git a/lib/main.dart b/lib/main.dart index afa9c76..2a769b7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -52,7 +52,7 @@ class _MyAppState extends State { } Future watchAuthenticationStatus() async { - await GlobalValuesManager.watchForInitialization(); + await GlobalValuesManager.waitForInitialization(); Supabase.instance.client.auth.onAuthStateChange((event, session) { switch (event) { diff --git a/lib/managers/authentication_manager.dart b/lib/managers/authentication_manager.dart index eb54c9a..2e31581 100644 --- a/lib/managers/authentication_manager.dart +++ b/lib/managers/authentication_manager.dart @@ -1,33 +1,17 @@ import 'package:flutter/material.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; -import 'package:quid_faciam_hodie/extensions/snackbar.dart'; -import 'package:quid_faciam_hodie/screens/main_screen.dart'; -import 'package:quid_faciam_hodie/screens/welcome_screen.dart'; import 'package:supabase/supabase.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class AuthState extends SupabaseAuthState { @override - void onUnauthenticated() { - if (mounted) { - Navigator.of(context) - .pushNamedAndRemoveUntil(WelcomeScreen.ID, (route) => false); - } - } + void onUnauthenticated() {} @override - void onAuthenticated(Session session) { - if (mounted) { - Navigator.of(context) - .pushNamedAndRemoveUntil(MainScreen.ID, (route) => false); - } - } + void onAuthenticated(Session session) {} @override void onPasswordRecovery(Session session) {} @override - void onErrorAuthenticating(String message) { - if (isMaterial(context)) context.showErrorSnackBar(message: message); - } + void onErrorAuthenticating(String message) {} } diff --git a/lib/managers/file_manager.dart b/lib/managers/file_manager.dart index cda2baf..a2b90fa 100644 --- a/lib/managers/file_manager.dart +++ b/lib/managers/file_manager.dart @@ -17,7 +17,7 @@ final supabase = Supabase.instance.client; class FileManager { static Future getMemoryMetadata(final String id) async { - await GlobalValuesManager.watchForInitialization(); + await GlobalValuesManager.waitForInitialization(); final response = await supabase .from('memories') @@ -38,7 +38,7 @@ class FileManager { final File file, { LocationData? locationData, }) async { - await GlobalValuesManager.watchForInitialization(); + await GlobalValuesManager.waitForInitialization(); final basename = uuid.v4(); final extension = file.path.split('.').last; @@ -108,7 +108,7 @@ class FileManager { final bool disableDownloadCache = false, final bool disableFileCache = false, }) async { - await GlobalValuesManager.watchForInitialization(); + await GlobalValuesManager.waitForInitialization(); final tempDirectory = await getTemporaryDirectory(); final filename = '${tempDirectory.path}/$path'; @@ -129,7 +129,7 @@ class FileManager { } static Future deleteFile(final String path) async { - await GlobalValuesManager.watchForInitialization(); + await GlobalValuesManager.waitForInitialization(); final response = await supabase.from('memories').delete().eq('location', path).execute(); diff --git a/lib/managers/global_values_manager.dart b/lib/managers/global_values_manager.dart index 4c6fcc3..dbc2a4d 100644 --- a/lib/managers/global_values_manager.dart +++ b/lib/managers/global_values_manager.dart @@ -52,7 +52,7 @@ class GlobalValuesManager { _initializeSettings(); } - static Future watchForInitialization() async { + static Future waitForInitialization() async { // Server initialization if (_serverInitializationFuture == null) { if (_isServerInitialized) { diff --git a/lib/managers/photo_manager.dart b/lib/managers/photo_manager.dart index f816c2f..71c4175 100644 --- a/lib/managers/photo_manager.dart +++ b/lib/managers/photo_manager.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:math'; import 'package:http/http.dart' as http; +import 'package:quid_faciam_hodie/constants/apis.dart'; class PhotoManager { static const MAX_PHOTOS_PER_PAGE = 80; @@ -10,7 +11,12 @@ class PhotoManager { static Future getRandomPhoto(final String query) async { final url = 'https://api.pexels.com/v1/search?query=$query&per_page=$MAX_PHOTOS_PER_PAGE&orientation=portait'; - final response = await http.get(Uri.parse(url)); + final response = await http.get( + Uri.parse(url), + headers: { + 'Authorization': PEXELS_API_KEY, + }, + ); final data = jsonDecode(response.body); final photoIndex = Random().nextInt(data['per_page']); diff --git a/lib/models/memories.dart b/lib/models/memories.dart index 40b6d23..a27b91f 100644 --- a/lib/models/memories.dart +++ b/lib/models/memories.dart @@ -109,7 +109,7 @@ class Memories extends PropertyChangeNotifier { } Future _loadInitialData() async { - await GlobalValuesManager.watchForInitialization(); + await GlobalValuesManager.waitForInitialization(); final response = await supabase .from('memories') diff --git a/lib/screens/grant_permission_screen.dart b/lib/screens/grant_permission_screen.dart index 6e57801..37dc949 100644 --- a/lib/screens/grant_permission_screen.dart +++ b/lib/screens/grant_permission_screen.dart @@ -2,8 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:quid_faciam_hodie/constants/spacing.dart'; -import 'package:quid_faciam_hodie/screens/login_screen.dart'; -import 'package:quid_faciam_hodie/screens/server_loading_screen.dart'; import 'grant_permission_screen/permissions_required_page.dart'; @@ -25,14 +23,7 @@ class GrantPermissionScreen extends StatelessWidget { child: Center( child: PermissionsRequiredPage( onPermissionsGranted: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const ServerLoadingScreen( - nextScreen: LoginScreen.ID, - ), - ), - ); + Navigator.pop(context); }, ), ), diff --git a/lib/screens/grant_permission_screen/permissions_required_page.dart b/lib/screens/grant_permission_screen/permissions_required_page.dart index 531742c..0cd730d 100644 --- a/lib/screens/grant_permission_screen/permissions_required_page.dart +++ b/lib/screens/grant_permission_screen/permissions_required_page.dart @@ -118,7 +118,7 @@ class _PermissionsRequiredPageState extends State { ), ), ), - const SizedBox(height: MEDIUM_SPACE), + const SizedBox(height: SMALL_SPACE), PlatformTextButton( onPressed: hasGrantedMicrophonePermission ? null @@ -142,6 +142,7 @@ class _PermissionsRequiredPageState extends State { ), ), ), + const SizedBox(height: SMALL_SPACE), PlatformTextButton( onPressed: hasGrantedLocationPermission ? null diff --git a/lib/screens/memory_map_screen.dart b/lib/screens/memory_map_screen.dart index 36547af..616071d 100644 --- a/lib/screens/memory_map_screen.dart +++ b/lib/screens/memory_map_screen.dart @@ -1,7 +1,6 @@ import 'package:expandable_bottom_sheet/expandable_bottom_sheet.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:flutter_osm_plugin/flutter_osm_plugin.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:quid_faciam_hodie/constants/spacing.dart'; import 'package:quid_faciam_hodie/foreign_types/memory_location.dart'; @@ -10,6 +9,8 @@ import 'package:quid_faciam_hodie/utils/lookup_address.dart'; import 'package:quid_faciam_hodie/utils/theme.dart'; import 'package:quid_faciam_hodie/widgets/icon_button_child.dart'; import 'package:quid_faciam_hodie/widgets/key_value_info.dart'; +import 'package:quid_faciam_hodie/widgets/platform_widgets/memory_cupertino_maps.dart'; +import 'package:quid_faciam_hodie/widgets/platform_widgets/memory_material_maps.dart'; import 'package:quid_faciam_hodie/widgets/sheet_indicator.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -26,7 +27,6 @@ class MemoryMapScreen extends StatefulWidget { } class _MemoryMapScreenState extends State with Loadable { - late final MapController controller; String? address; @override @@ -34,13 +34,6 @@ class _MemoryMapScreenState extends State with Loadable { super.initState(); callWithLoading(fetchAddress); - - controller = MapController( - initPosition: GeoPoint( - latitude: widget.location.latitude, - longitude: widget.location.longitude, - ), - ); } Future fetchAddress() async { @@ -60,34 +53,6 @@ class _MemoryMapScreenState extends State with Loadable { } } - void drawCircle() => controller.drawCircle( - CircleOSM( - key: 'accuracy', - color: Colors.blue, - centerPoint: GeoPoint( - latitude: widget.location.latitude, - longitude: widget.location.longitude, - ), - radius: widget.location.accuracy, - strokeWidth: 4, - ), - ); - - List get staticPoints => [ - StaticPositionGeoPoint( - 'position', - const MarkerIcon( - icon: Icon(Icons.location_on, size: 150, color: Colors.blue), - ), - [ - GeoPoint( - latitude: widget.location.latitude, - longitude: widget.location.longitude, - ) - ], - ) - ]; - @override Widget build(BuildContext context) { final localizations = AppLocalizations.of(context)!; @@ -99,16 +64,15 @@ class _MemoryMapScreenState extends State with Loadable { ), body: ExpandableBottomSheet( enableToggle: true, - background: OSMFlutter( - controller: controller, - initZoom: 13, - stepZoom: 1.0, - trackMyPosition: true, - staticPoints: staticPoints, - onMapIsReady: (_) { - drawCircle(); - }, - ), + background: isMaterial(context) + ? MemoryMaterialMaps( + location: widget.location, + initialZoom: 13, + ) + : MemoryCupertinoMaps( + location: widget.location, + initialZoom: 13, + ), persistentHeader: Container( width: double.infinity, padding: const EdgeInsets.all(SMALL_SPACE), diff --git a/lib/screens/server_loading_screen.dart b/lib/screens/server_loading_screen.dart index 26c0845..775434f 100644 --- a/lib/screens/server_loading_screen.dart +++ b/lib/screens/server_loading_screen.dart @@ -6,6 +6,7 @@ import 'package:quid_faciam_hodie/constants/spacing.dart'; import 'package:quid_faciam_hodie/managers/global_values_manager.dart'; import 'package:quid_faciam_hodie/models/memories.dart'; import 'package:quid_faciam_hodie/screens/grant_permission_screen.dart'; +import 'package:quid_faciam_hodie/screens/login_screen.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import 'empty_screen.dart'; @@ -36,23 +37,32 @@ class _ServerLoadingScreenState extends State { } Future load() async { - if (!(await GlobalValuesManager.hasGrantedPermissions())) { - Navigator.pushReplacementNamed( + while (!(await GlobalValuesManager.hasGrantedPermissions())) { + await Navigator.pushNamed( context, GrantPermissionScreen.ID, ); } - await GlobalValuesManager.watchForInitialization(); + await GlobalValuesManager.waitForInitialization(); final memories = context.read(); final session = Supabase.instance.client.auth.session(); + if (session == null && widget.nextScreen == LoginScreen.ID) { + Navigator.pushReplacementNamed( + context, + LoginScreen.ID, + ); + return; + } + if (session == null) { Navigator.pushReplacementNamed( context, WelcomeScreen.ID, ); + return; } else { if (!memories.isInitialized) { await memories.initialize(); @@ -67,17 +77,20 @@ class _ServerLoadingScreenState extends State { context, MainScreen.ID, ); + return; } else { if (memories.memories.isEmpty) { Navigator.pushReplacementNamed( context, EmptyScreen.ID, ); + return; } else { Navigator.pushReplacementNamed( context, widget.nextScreen!, ); + return; } } } diff --git a/lib/screens/timeline_screen/memory_location_view.dart b/lib/screens/timeline_screen/memory_location_view.dart deleted file mode 100644 index c8e4c70..0000000 --- a/lib/screens/timeline_screen/memory_location_view.dart +++ /dev/null @@ -1,130 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:flutter_osm_plugin/flutter_osm_plugin.dart'; -import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; -import 'package:quid_faciam_hodie/constants/spacing.dart'; -import 'package:quid_faciam_hodie/constants/values.dart'; -import 'package:quid_faciam_hodie/foreign_types/memory_location.dart'; -import 'package:quid_faciam_hodie/screens/memory_map_screen.dart'; -import 'package:quid_faciam_hodie/widgets/icon_button_child.dart'; - -class MemoryLocationView extends StatefulWidget { - final MemoryLocation location; - - const MemoryLocationView({ - Key? key, - required this.location, - }) : super(key: key); - - @override - State createState() => _MemoryLocationViewState(); -} - -class _MemoryLocationViewState extends State { - late final MapController controller; - - @override - void initState() { - super.initState(); - - controller = MapController( - initPosition: GeoPoint( - latitude: widget.location.latitude, - longitude: widget.location.longitude, - ), - ); - } - - @override - void dispose() { - controller.dispose(); - - super.dispose(); - } - - void drawCircle() => controller.drawCircle( - CircleOSM( - key: 'accuracy', - color: Colors.blue, - centerPoint: GeoPoint( - latitude: widget.location.latitude, - longitude: widget.location.longitude, - ), - radius: widget.location.accuracy, - strokeWidth: 4, - ), - ); - - List get staticPoints { - if (widget.location.accuracy <= ACCURACY_IN_METERS_FOR_PINPOINT) { - return [ - StaticPositionGeoPoint( - 'position', - const MarkerIcon( - icon: Icon(Icons.location_on, size: 150, color: Colors.blue), - ), - [ - GeoPoint( - latitude: widget.location.latitude, - longitude: widget.location.longitude, - ) - ], - ) - ]; - } else { - return []; - } - } - - @override - Widget build(BuildContext context) { - final localizations = AppLocalizations.of(context)!; - - return Column( - children: [ - SizedBox( - width: double.infinity, - height: 400, - child: GestureDetector( - // Avoid panning, map is view-only - onDoubleTap: () {}, - child: OSMFlutter( - controller: controller, - initZoom: 14, - minZoomLevel: 14, - maxZoomLevel: 14, - staticPoints: staticPoints, - onMapIsReady: (_) { - drawCircle(); - }, - ), - ), - ), - const SizedBox(height: MEDIUM_SPACE), - PlatformTextButton( - child: IconButtonChild( - icon: Icon(context.platformIcons.fullscreen), - label: Text(localizations.memorySheetViewMoreDetails), - ), - onPressed: () async { - await Navigator.push( - context, - MaterialPageRoute( - builder: (_) => MemoryMapScreen( - location: widget.location, - ), - ), - ); - - if (!mounted) { - return; - } - - Navigator.pop(context); - }, - ), - const SizedBox(height: MEDIUM_SPACE), - ], - ); - } -} diff --git a/lib/screens/timeline_screen/memory_sheet.dart b/lib/screens/timeline_screen/memory_sheet.dart index e7e6482..ea377c0 100644 --- a/lib/screens/timeline_screen/memory_sheet.dart +++ b/lib/screens/timeline_screen/memory_sheet.dart @@ -10,12 +10,15 @@ import 'package:quid_faciam_hodie/enums.dart'; import 'package:quid_faciam_hodie/extensions/snackbar.dart'; import 'package:quid_faciam_hodie/foreign_types/memory.dart'; import 'package:quid_faciam_hodie/managers/file_manager.dart'; +import 'package:quid_faciam_hodie/screens/memory_map_screen.dart'; import 'package:quid_faciam_hodie/utils/loadable.dart'; import 'package:quid_faciam_hodie/utils/theme.dart'; +import 'package:quid_faciam_hodie/widgets/icon_button_child.dart'; +import 'package:quid_faciam_hodie/widgets/platform_widgets/memory_cupertino_maps.dart'; import 'package:quid_faciam_hodie/widgets/sheet_indicator.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; -import 'memory_location_view.dart'; +import '../../widgets/platform_widgets/memory_material_maps.dart'; class MemorySheet extends StatefulWidget { final Memory memory; @@ -250,8 +253,51 @@ class _MemorySheetState extends State with Loadable { : Container( width: double.infinity, color: backgroundColor, - child: MemoryLocationView( - location: widget.memory.location!, + child: Column( + children: [ + SizedBox( + width: double.infinity, + height: 400, + child: GestureDetector( + // Avoid panning, map is view-only + onDoubleTap: () {}, + child: PlatformWidget( + material: (_, __) => MemoryMaterialMaps( + location: widget.memory.location!, + initialZoom: 14, + ), + cupertino: (_, __) => MemoryCupertinoMaps( + location: widget.memory.location!, + initialZoom: 14, + ), + ), + ), + ), + const SizedBox(height: MEDIUM_SPACE), + PlatformTextButton( + child: IconButtonChild( + icon: Icon(context.platformIcons.fullscreen), + label: Text(localizations.memorySheetViewMoreDetails), + ), + onPressed: () async { + await Navigator.push( + context, + MaterialPageRoute( + builder: (_) => MemoryMapScreen( + location: widget.memory.location!, + ), + ), + ); + + if (!mounted) { + return; + } + + Navigator.pop(context); + }, + ), + const SizedBox(height: MEDIUM_SPACE), + ], ), ), ); diff --git a/lib/screens/welcome_screen/pages/get_started_page.dart b/lib/screens/welcome_screen/pages/get_started_page.dart index e849608..bbdb069 100644 --- a/lib/screens/welcome_screen/pages/get_started_page.dart +++ b/lib/screens/welcome_screen/pages/get_started_page.dart @@ -2,7 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:quid_faciam_hodie/constants/spacing.dart'; -import 'package:quid_faciam_hodie/screens/grant_permission_screen.dart'; +import 'package:quid_faciam_hodie/screens/login_screen.dart'; +import 'package:quid_faciam_hodie/screens/server_loading_screen.dart'; import 'package:quid_faciam_hodie/screens/welcome_screen/crabs/logo.dart'; import 'package:quid_faciam_hodie/utils/theme.dart'; import 'package:quid_faciam_hodie/widgets/icon_button_child.dart'; @@ -38,9 +39,13 @@ class GetStartedPage extends StatelessWidget { label: Text(localizations.welcomeScreenStartButtonTitle), ), onPressed: () { - Navigator.pushNamed( + Navigator.push( context, - GrantPermissionScreen.ID, + MaterialPageRoute( + builder: (_) => const ServerLoadingScreen( + nextScreen: LoginScreen.ID, + ), + ), ); }, ), diff --git a/lib/screens/welcome_screen/photo_switching.dart b/lib/screens/welcome_screen/photo_switching.dart index a0e088d..534c816 100644 --- a/lib/screens/welcome_screen/photo_switching.dart +++ b/lib/screens/welcome_screen/photo_switching.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; +import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:quid_faciam_hodie/constants/spacing.dart'; import 'package:quid_faciam_hodie/constants/values.dart'; import 'package:quid_faciam_hodie/managers/photo_manager.dart'; @@ -15,7 +16,7 @@ class PhotoSwitching extends StatefulWidget { } class _PhotoSwitchingState extends State with Loadable { - late String photoURL; + String photoURL = ''; @override void initState() { @@ -41,7 +42,9 @@ class _PhotoSwitchingState extends State with Loadable { @override Widget build(BuildContext context) { if (isLoading) { - return const Center(child: CircularProgressIndicator()); + return Center( + child: PlatformCircularProgressIndicator(), + ); } return ClipRRect( diff --git a/lib/widgets/platform_widgets/memory_cupertino_maps.dart b/lib/widgets/platform_widgets/memory_cupertino_maps.dart new file mode 100644 index 0000000..1a43d25 --- /dev/null +++ b/lib/widgets/platform_widgets/memory_cupertino_maps.dart @@ -0,0 +1,62 @@ +import 'package:apple_maps_flutter/apple_maps_flutter.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:quid_faciam_hodie/foreign_types/memory_location.dart'; + +class MemoryCupertinoMaps extends StatefulWidget { + final MemoryLocation location; + final bool lockZoom; + final double initialZoom; + + const MemoryCupertinoMaps({ + Key? key, + required this.location, + required this.initialZoom, + this.lockZoom = false, + }) : super(key: key); + + @override + State createState() => _MemoryCupertinoMapsState(); +} + +class _MemoryCupertinoMapsState extends State { + @override + Widget build(BuildContext context) { + return AppleMap( + minMaxZoomPreference: MinMaxZoomPreference( + widget.lockZoom ? widget.initialZoom : 1, + widget.lockZoom ? widget.initialZoom : 20, + ), + circles: { + Circle( + circleId: CircleId('accuracy'), + center: LatLng( + widget.location.latitude, + widget.location.longitude, + ), + radius: widget.location.accuracy, + strokeWidth: 1, + fillColor: Colors.blue.withOpacity(.2), + strokeColor: Colors.blue, + ), + }, + annotations: { + Annotation( + annotationId: AnnotationId('position'), + position: LatLng( + widget.location.latitude, + widget.location.longitude, + ), + icon: BitmapDescriptor.defaultAnnotation, + ) + }, + initialCameraPosition: CameraPosition( + target: LatLng( + widget.location.latitude, + widget.location.longitude, + ), + zoom: 14, + ), + ); + } +} diff --git a/lib/widgets/platform_widgets/memory_material_maps.dart b/lib/widgets/platform_widgets/memory_material_maps.dart new file mode 100644 index 0000000..81473d8 --- /dev/null +++ b/lib/widgets/platform_widgets/memory_material_maps.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_osm_plugin/flutter_osm_plugin.dart'; +import 'package:quid_faciam_hodie/foreign_types/memory_location.dart'; + +class MemoryMaterialMaps extends StatefulWidget { + final MemoryLocation location; + final bool lockZoom; + final double initialZoom; + + const MemoryMaterialMaps({ + Key? key, + required this.location, + required this.initialZoom, + this.lockZoom = false, + }) : super(key: key); + + @override + State createState() => _MemoryMaterialMapsState(); +} + +class _MemoryMaterialMapsState extends State { + late final MapController controller; + + @override + void initState() { + super.initState(); + + controller = MapController( + initPosition: GeoPoint( + latitude: widget.location.latitude, + longitude: widget.location.longitude, + ), + ); + } + + @override + void dispose() { + controller.dispose(); + + super.dispose(); + } + + void drawCircle() => controller.drawCircle( + CircleOSM( + key: 'accuracy', + color: Colors.blue, + centerPoint: GeoPoint( + latitude: widget.location.latitude, + longitude: widget.location.longitude, + ), + radius: widget.location.accuracy, + strokeWidth: 4, + ), + ); + + List get staticPoints => [ + StaticPositionGeoPoint( + 'position', + const MarkerIcon( + icon: Icon(Icons.location_on, size: 150, color: Colors.blue), + ), + [ + GeoPoint( + latitude: widget.location.latitude, + longitude: widget.location.longitude, + ) + ], + ) + ]; + + @override + Widget build(BuildContext context) { + return OSMFlutter( + controller: controller, + initZoom: widget.initialZoom, + maxZoomLevel: widget.lockZoom ? widget.initialZoom : 19, + minZoomLevel: widget.lockZoom ? widget.initialZoom : 2, + staticPoints: staticPoints, + onMapIsReady: (_) { + drawCircle(); + }, + ); + } +} diff --git a/lib/widgets/sheet_indicator.dart b/lib/widgets/sheet_indicator.dart index 4d6fa54..43a6e18 100644 --- a/lib/widgets/sheet_indicator.dart +++ b/lib/widgets/sheet_indicator.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:quid_faciam_hodie/utils/theme.dart'; class SheetIndicator extends StatelessWidget { const SheetIndicator({Key? key}) : super(key: key); @@ -9,7 +10,7 @@ class SheetIndicator extends StatelessWidget { width: 100, height: 5, decoration: BoxDecoration( - color: Colors.white24, + color: getBodyTextColor(context).withOpacity(.2), borderRadius: BorderRadius.circular(10), ), ); diff --git a/pubspec.lock b/pubspec.lock index b807c6a..f7540e7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + apple_maps_flutter: + dependency: "direct main" + description: + name: apple_maps_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" archive: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c7bc0c8..f020eee 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -62,6 +62,7 @@ dependencies: flutter_exif_plugin: ^1.1.0 flutter_osm_plugin: ^0.39.0 url_launcher: ^6.1.5 + apple_maps_flutter: ^1.2.0 dev_dependencies: flutter_test: