diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 304c821..1199195 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -12,7 +12,7 @@ PODS: - Flutter - path_provider_macos (0.0.1): - Flutter - - permission_handler (4.4.0): + - "permission_handler (5.0.0+hotfix.3)": - Flutter - quick_actions (0.0.1): - Flutter @@ -71,7 +71,7 @@ SPEC CHECKSUMS: location_permissions: 360d12ecd1c94a4cab68585f508be1d5ad944c8b path_provider: fb74bd0465e96b594bb3b5088ee4a4e7bb1f2a9d path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0 - permission_handler: f615215121f43c1640d2b8500d4ad749512828a8 + permission_handler: 4a985b5448897c27fdeadde84f7452520c0e6c58 quick_actions: 5eaa421abc932a71d9804fb86186d173020da63d url_launcher: a1c0cc845906122c4784c542523d8cacbded5626 url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313 diff --git a/lib/components/core/loading/finding_location.dart b/lib/components/core/loading/finding_location.dart index e47f1a4..697daf2 100644 --- a/lib/components/core/loading/finding_location.dart +++ b/lib/components/core/loading/finding_location.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:nextbussg/components/core/space.dart'; import 'package:nextbussg/styles/values.dart'; class FindingLocation extends StatelessWidget { diff --git a/lib/components/core/location_access_button.dart b/lib/components/core/location_access_button.dart deleted file mode 100644 index fbf0406..0000000 --- a/lib/components/core/location_access_button.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:nextbussg/components/core/buttons/button.dart'; -import 'package:nextbussg/providers/locationPerms.dart'; -import 'package:provider/provider.dart'; - -class LocationAccessButton extends StatelessWidget { - @override - Widget build(BuildContext context) { - final LocationPermissionsProvider locationPermissionsProvider = - Provider.of(context, listen: false); - return Button( - text: "Grant location access", - onTap: () { - locationPermissionsProvider.requestPermission(); - }, - ); - } -} - - -class OpenLocationSettingsButton extends StatelessWidget { - @override - Widget build(BuildContext context) { - final LocationPermissionsProvider locationPermissionsProvider = - Provider.of(context, listen: false); - return Button( - text: "Open location settings", - color: Theme.of(context).errorColor, - onTap: () { - locationPermissionsProvider.openLocationSettings(); - }, - ); - } -} diff --git a/lib/main.dart b/lib/main.dart index a49dc7a..06e6968 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,6 @@ import 'package:nextbussg/providers/favorites.dart'; import 'package:nextbussg/providers/home_rebuilder.dart'; -import 'package:nextbussg/providers/locationPerms.dart'; +import 'package:nextbussg/providers/location_perms.dart'; import 'package:nextbussg/providers/search.dart'; import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; @@ -27,8 +27,8 @@ class MyApp extends StatelessWidget { providers: [ ChangeNotifierProvider(create: (_) => FavoritesProvider()), ChangeNotifierProvider(create: (_) => SearchProvider()), - ChangeNotifierProvider( - create: (_) => LocationPermissionsProvider()), + ChangeNotifierProvider( + create: (_) => LocationPermsProvider()), ChangeNotifierProvider(create: (_) => HomeRebuilderProvider()), ], child: RouteApp(), diff --git a/lib/providers/locationPerms.dart b/lib/providers/locationPerms.dart deleted file mode 100644 index 55cc8ac..0000000 --- a/lib/providers/locationPerms.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:bot_toast/bot_toast.dart'; -import 'package:flutter/material.dart'; -import 'package:nextbussg/utils/strings.dart'; -import 'package:permission_handler/permission_handler.dart'; - -class LocationPermissionsProvider extends ChangeNotifier { - // returns true if granted, false otherwise - get getBoolPermissionStatus async { - print("Getting perm status for Home widget build"); - PermissionStatus status = - await PermissionHandler().checkPermissionStatus(PermissionGroup.locationWhenInUse); - print(status); - if (status == PermissionStatus.granted) - return true; - else - return false; - } - - // sets the value of status (granted, denied, or unkown) - // and notifies listeners, which will receive boolPermissionStatus - void setPermissionsStatus() { - PermissionHandler().checkPermissionStatus(PermissionGroup.locationWhenInUse).then( - (PermissionStatus status) { - print("Location status: $status"); - notifyListeners(); - }, - ); - } - - bool _permDenied = false; - bool get permDenied => _permDenied; - - void requestPermission() { - PermissionHandler().requestPermissions([PermissionGroup.locationWhenInUse]).then( - (Map statuses) { - final status = statuses[PermissionGroup.locationWhenInUse]; - print("Requested location perm."); - print("Result: $status"); - - if (status == PermissionStatus.denied) { - print("Denied location access, show go to settings button"); - BotToast.showText(text: Strings.locationPermissionDenied, contentColor: Colors.red); - - _permDenied = true; - } - - notifyListeners(); - }, - ); - } - - - void openLocationSettings() { - PermissionHandler().openAppSettings(); - } -} diff --git a/lib/providers/location_perms.dart b/lib/providers/location_perms.dart new file mode 100644 index 0000000..273f7d9 --- /dev/null +++ b/lib/providers/location_perms.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class LocationPermsProvider extends ChangeNotifier { + static getPermStatus() async { + print("Checking permission status ..."); + var status = await Permission.locationWhenInUse.status; + if (status.isGranted) { + print("Location granted"); + return true; + } else { + print("Location denied or unknown"); + return false; + } + } + + static requestPerm() async { + Map statuses = await [ + Permission.locationWhenInUse, + ].request(); + return statuses[Permission.locationWhenInUse]; + } +} diff --git a/lib/providers/search.dart b/lib/providers/search.dart index 564065b..8c11d5e 100644 --- a/lib/providers/search.dart +++ b/lib/providers/search.dart @@ -1,7 +1,7 @@ import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/material.dart'; import 'package:nextbussg/models/bus_stop.dart'; -import 'package:nextbussg/providers/locationPerms.dart'; +import 'package:nextbussg/providers/location_perms.dart'; import 'package:nextbussg/services/bus.dart'; import 'package:nextbussg/utils/strings.dart'; @@ -13,7 +13,9 @@ class SearchProvider extends ChangeNotifier { bool getNoStopsFoundValue() => _noStopsFound; getNearestBusStopSearchResults() async { - bool canGetPermission = await LocationPermissionsProvider().getBoolPermissionStatus; + // bool canGetPermission = await LocationPermissionsProvider().getBoolPermissionStatus; + // TODO: fix + bool canGetPermission = false; if (canGetPermission) { _searchResults = await BusService.getNearestStops(); notifyListeners(); diff --git a/lib/routes/home.dart b/lib/routes/home.dart index 1820651..4dca624 100644 --- a/lib/routes/home.dart +++ b/lib/routes/home.dart @@ -1,12 +1,17 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:nextbussg/components/core/loading/finding_location.dart'; +import 'package:nextbussg/utils/extensions.dart'; import 'package:nextbussg/components/core/page_template.dart'; import 'package:nextbussg/components/core/space.dart'; import 'package:nextbussg/components/home/bus_stop_list.dart'; import 'package:nextbussg/components/home/favorites/favorites_list.dart'; import 'package:nextbussg/providers/favorites.dart'; +import 'package:nextbussg/providers/home_rebuilder.dart'; +import 'package:nextbussg/providers/location_perms.dart'; +import 'package:nextbussg/routes/permission.dart'; import 'package:nextbussg/utils/strings.dart'; +import 'package:provider/provider.dart'; class HomePage extends StatelessWidget { @override @@ -14,10 +19,14 @@ class HomePage extends StatelessWidget { return FutureBuilder( future: getHomeWidgets(context), builder: (context, snapshot) { - if (snapshot.hasData) - return PageTemplate(children: snapshot.data); - else - return FindingLocation(); + return PageTemplate( + children: [ + if (snapshot.hasData) + ...snapshot.data + else + Center(child: Text("Loading no data...")).sliverToBoxAdapter() + ], + ).scaffold(); }, ); } diff --git a/lib/routes/oldhome.dart b/lib/routes/oldhome.dart deleted file mode 100644 index db81325..0000000 --- a/lib/routes/oldhome.dart +++ /dev/null @@ -1,124 +0,0 @@ -import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:nextbussg/components/core/loading/finding_location.dart'; -import 'package:nextbussg/components/core/location_access_button.dart'; -import 'package:nextbussg/components/core/page_template.dart'; -import 'package:nextbussg/components/core/space.dart'; -import 'package:nextbussg/components/core/title_text.dart'; -import 'package:nextbussg/components/home/bus_stop_list.dart'; -import 'package:nextbussg/components/home/favorites/favorites_list.dart'; -import 'package:nextbussg/providers/favorites.dart'; -import 'package:nextbussg/providers/home_rebuilder.dart'; -import 'package:nextbussg/providers/locationPerms.dart'; -import 'package:nextbussg/styles/values.dart'; -import 'package:nextbussg/utils/extensions.dart'; -import 'package:nextbussg/utils/quick_actions.dart'; -import 'package:nextbussg/utils/strings.dart'; -import 'package:provider/provider.dart'; -import 'package:quick_actions/quick_actions.dart'; - -class HomePage extends StatelessWidget { - List noLocationAccess(context) { - final LocationPermissionsProvider locationPermissionsProvider = - Provider.of(context, listen: false); - - return [ - TitleText( - title: "One more step ...", - ).sliverToBoxAdapter(), - Spacing(height: Values.marginBelowTitle).sliver(), - Text("We require your location to find all the bus stops near you!").sliverToBoxAdapter(), - Spacing(height: Values.marginBelowTitle).sliver(), - LocationAccessButton().sliverToBoxAdapter(), - Spacing(height: Values.marginBelowTitle).sliver(), - if (locationPermissionsProvider.permDenied) ...[ - Text(Strings.locationPermissionDenied).sliverToBoxAdapter(), - Spacing(height: Values.marginBelowTitle).sliver(), - OpenLocationSettingsButton().sliverToBoxAdapter(), - Spacing(height: Values.marginBelowTitle).sliver(), - Text(Strings.afterEnablePermision).sliverToBoxAdapter(), - ] - ]; - } - - Widget yesLocationAccess(context) => FutureBuilder( - future: order(context), - builder: (context, snapshot) { - if (snapshot.hasData) - return PageTemplate(children: snapshot.data).scaffold(); - else - return FindingLocation(); - }, - ); - - @override - Widget build(BuildContext context) { - // quick actions - final QuickActions quickActions = QuickActions(); - setup(context, quickActions); - - final LocationPermissionsProvider locationPermissionsProvider = - Provider.of(context, listen: true); - - // this is just to rebuild the home page when a favorite is added/removed - final HomeRebuilderProvider homeRebuilderProvider = - Provider.of(context, listen: true); - - print("Home widget rebuilt."); - - return FutureBuilder( - future: locationPermissionsProvider.getBoolPermissionStatus, - builder: (context, snapshot) { - if (snapshot.hasData) if (snapshot.data == true) - return yesLocationAccess(context); - else - return PageTemplate(children: noLocationAccess(context)); - else - return Text("Loading"); - }, - ); - } - - Widget simplifiedFavoritesView({int favoritesNotShown = 0}) => FavoritesBusStopList( - title: Strings.simplifiedFavoritesTitle.toUpperCase(), - iconData: FontAwesomeIcons.heart, - simplified: true, - favoritesNotShown: favoritesNotShown, - ); - - Future order(context) async { - Widget nearMe = BusStopList( - title: Strings.nearMeTitle.toUpperCase(), - iconData: FontAwesomeIcons.locationArrow, - ); - - // if there are no favorites (in simlified favorites view), the favorites heading should come below near me - // if there are in SFV, put favorites at the top - - List widgetOrder = [ - simplifiedFavoritesView(), - Spacing(height: 40).sliver(), - nearMe, - ]; - - // if there are no favorites, swap the position of favorites and near me - List favorites = await FavoritesProvider.getFavorites(simplified: true); - if (favorites.isEmpty) { - // even if the SF list is empty, there may be bus stops which are not near us. That's why - // we check if the list is empty, then check the ACTUAL amount of favorites - // if it's more than 0, it means that it's not showing - - // so just to make it clear to the user, display a message: - // You have 3 favorites, which are not near you. - - var noFavorites = (await FavoritesProvider.getFavorites(simplified: false)).length; - widgetOrder = [ - nearMe, - Spacing(height: 40).sliver(), - simplifiedFavoritesView(favoritesNotShown: noFavorites) - ]; - } - return widgetOrder; - } -} diff --git a/lib/routes/permission.dart b/lib/routes/permission.dart new file mode 100644 index 0000000..18a3a14 --- /dev/null +++ b/lib/routes/permission.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:nextbussg/components/core/buttons/button.dart'; +import 'package:nextbussg/components/core/page_template.dart'; +import 'package:nextbussg/components/core/space.dart'; +import 'package:nextbussg/providers/home_rebuilder.dart'; +import 'package:nextbussg/providers/location_perms.dart'; +import 'package:nextbussg/styles/values.dart'; +import 'package:nextbussg/utils/extensions.dart'; +import 'package:nextbussg/components/core/title_text.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:provider/provider.dart'; + +class PermissionRoute extends StatelessWidget { + @override + Widget build(BuildContext context) { + return PageTemplate( + children: [ + Column( + children: [ + TitleText(title: "Please grant location permissions ..."), + Spacing(height: Values.marginBelowTitle), + _RequestPermissionButton() + ], + ).sliverToBoxAdapter(), + ], + ).scaffold(); + } +} + +class _RequestPermissionButton extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Button( + text: "Grant permission", + onTap: () async { + var status = await LocationPermsProvider.requestPerm(); + // print("STATUS: $status"); + if (status == PermissionStatus.granted) { + print("Location permission given"); + final HomeRebuilderProvider homeRebuilderProvider = + Provider.of(context, listen: false); + homeRebuilderProvider.rebuild(); + } else { + print("Location permission NOT GIVEN"); + } + }, + ); + } +} diff --git a/lib/services/location.dart b/lib/services/location.dart index ee5c92b..7a58d48 100644 --- a/lib/services/location.dart +++ b/lib/services/location.dart @@ -2,15 +2,11 @@ import 'package:geolocator/geolocator.dart'; class LocationServices { static Future getLocation() async { - Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high); + Position position = + await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high); return position; } - static Future distanceBetween(Position point1, Position point2) => - Geolocator().distanceBetween( - point1.latitude, - point1.longitude, - point2.latitude, - point2.longitude, - ); + static Future distanceBetween(Position point1, Position point2) => Geolocator() + .distanceBetween(point1.latitude, point1.longitude, point2.latitude, point2.longitude); } diff --git a/lib/tabbed_app.dart b/lib/tabbed_app.dart index cb896b5..8f819ef 100644 --- a/lib/tabbed_app.dart +++ b/lib/tabbed_app.dart @@ -31,7 +31,6 @@ class TabbedAppState extends State { @override Widget build(BuildContext context) { - print("REBUILT TABBEDAPP"); return Scaffold( body: Stack( children: [ diff --git a/pubspec.lock b/pubspec.lock index 9dfc7ec..ccf0767 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -505,14 +505,14 @@ packages: name: permission_handler url: "https://pub.dartlang.org" source: hosted - version: "4.4.0" + version: "5.0.0+hotfix.3" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "2.0.0" petitparser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5591170..b504d8c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,7 +32,7 @@ dependencies: hive_flutter: ^0.3.0+1 geolocator: ^5.2.1 styled_widget: ^0.1.1 - permission_handler: ^4.4.0 + permission_handler: ^5.0.0 page_transition: ^1.1.5 flutter_statusbarcolor: ^0.2.3 hive_generator: ^0.7.0+2