import 'package:anyway/constants.dart'; import 'package:anyway/main.dart'; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; bool debugMode = false; class SettingsPage extends StatefulWidget { @override _SettingsPageState createState() => _SettingsPageState(); } class _SettingsPageState extends State { @override Widget build(BuildContext context) { return ListView( padding: EdgeInsets.all(15), children: [ // First a round, centered image Center( child: CircleAvatar( radius: 75, child: Icon(Icons.settings, size: 100), ) ), Center( child: Text('Global settings', style: TextStyle(fontSize: 24)) ), Divider(indent: 25, endIndent: 25, height: 50), darkMode(), setLocationUsage(), setDebugMode(), Divider(indent: 25, endIndent: 25, height: 50), privacyInfo(), ] ); } Widget setDebugMode() { return Row( children: [ Text('Debugging: use a custom API URL'), // white space Spacer(), Switch( value: debugMode, onChanged: (bool? newValue) { setState(() { debugMode = newValue!; if (debugMode) { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: Text('Debug mode - use a custom API endpoint'), content: TextField( controller: TextEditingController(text: API_URL_DEBUG), onChanged: (value) { setState(() { API_URL_BASE = value; }); }, ), actions: [ TextButton( child: Text('OK'), onPressed: () { Navigator.of(context).pop(); }, ), ], ); } ); } }); } ) ], ); } Widget darkMode() { return Row( children: [ Text('Dark mode'), Spacer(), Switch( value: Theme.of(context).brightness == Brightness.dark, onChanged: (bool? newValue) { setState(() { rootScaffoldMessengerKey.currentState!.showSnackBar( SnackBar(content: Text('Dark mode is not implemented yet')) ); // if (newValue!) { // // Dark mode // Theme.of(context).brightness = Brightness.dark; // } else { // // Light mode // Theme.of(context).brightness = Brightness.light; // } }); } ) ], ); } Widget setLocationUsage() { Future preferences = SharedPreferences.getInstance(); return Row( children: [ Text('Use location services'), // white space Spacer(), FutureBuilder( future: preferences, builder: (context, snapshot) { if (snapshot.hasData) { bool useLocation = snapshot.data!.getBool('useLocation') ?? false; return Switch( value: useLocation, onChanged: setUseLocation, ); } else { return CircularProgressIndicator(); } } ) ], ); } void setUseLocation(bool newValue) async { await Permission.locationWhenInUse .onDeniedCallback(() { rootScaffoldMessengerKey.currentState!.showSnackBar( SnackBar(content: Text('Location services are required for this feature')) ); }) .onGrantedCallback(() { rootScaffoldMessengerKey.currentState!.showSnackBar( SnackBar(content: Text('Location services are now enabled')) ); SharedPreferences.getInstance().then( (SharedPreferences prefs) { setState(() { prefs.setBool('useLocation', newValue); }); } ); }) .onPermanentlyDeniedCallback(() { rootScaffoldMessengerKey.currentState!.showSnackBar( SnackBar(content: Text('Location services are required for this feature')) ); }) .request(); } Widget privacyInfo() { return Center( child: Column( children: [ Text('Our privacy policy is available under:'), TextButton.icon( icon: Icon(Icons.info), label: Text(PRIVACY_URL), onPressed: () async{ await launchUrl(Uri.parse(PRIVACY_URL)); } ) ], ) ); } }