import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import '../components/AddDownloadLocationScreen/custom_download_location_form.dart'; import '../components/AddDownloadLocationScreen/app_directory_location_form.dart'; import '../models/finamp_models.dart'; import '../services/finamp_settings_helper.dart'; class AddDownloadLocationScreen extends StatefulWidget { const AddDownloadLocationScreen({Key? key}) : super(key: key); static const routeName = "/settings/downloadlocations/add"; @override State createState() => _AddDownloadLocationScreenState(); } class _AddDownloadLocationScreenState extends State with SingleTickerProviderStateMixin { final customLocationFormKey = GlobalKey(); final appDirectoryFormKey = GlobalKey(); late TabController _tabController; @override void initState() { super.initState(); // Since we can't initialise tabs before initState we need to awkwardly // provide the length directly _tabController = TabController(vsync: this, length: Platform.isAndroid ? 2 : 1); } @override void dispose() { _tabController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final tabs = Platform.isAndroid ? [ Tab( text: AppLocalizations.of(context)!.customLocation.toUpperCase(), ), Tab( text: AppLocalizations.of(context)!.appDirectory.toUpperCase(), ), ] : [ Tab( text: AppLocalizations.of(context)!.customLocation.toUpperCase(), ), ]; return Provider( create: (_) => NewDownloadLocation( name: null, deletable: true, path: null, useHumanReadableNames: null, ), builder: (context, _) { return Scaffold( appBar: AppBar( title: Text(AppLocalizations.of(context)!.addDownloadLocation), bottom: TabBar( controller: _tabController, tabs: tabs, ), ), floatingActionButton: FloatingActionButton( child: const Icon(Icons.check), onPressed: () { bool isValidated = false; // If _tabController.index is 0, we are on the custom location tab. // If not, we are on the app directory tab. if (_tabController.index == 0) { if (customLocationFormKey.currentState?.validate() == true) { customLocationFormKey.currentState!.save(); // If we're saving to a custom location, we want to use human readable names. // With app dir locations, we don't use human readable names. context.read().useHumanReadableNames = true; isValidated = true; } } else { if (appDirectoryFormKey.currentState?.validate() == true) { appDirectoryFormKey.currentState!.save(); context.read().useHumanReadableNames = false; isValidated = true; } } // We set a variable called isValidated so that we don't have to copy this logic into each validate() if (isValidated) { final newDownloadLocation = context.read(); // We don't use DownloadLocation when initially getting the // values because DownloadLocation doesn't have nullable values. // At this point, the NewDownloadLocation shouldn't have any // null values. final downloadLocation = DownloadLocation.create( name: newDownloadLocation.name!, path: newDownloadLocation.path!, useHumanReadableNames: newDownloadLocation.useHumanReadableNames!, deletable: newDownloadLocation.deletable, ); FinampSettingsHelper.addDownloadLocation(downloadLocation); Navigator.of(context).pop(); } }, ), body: TabBarView( controller: _tabController, children: [ Center( child: Padding( padding: const EdgeInsets.all(16.0), child: CustomDownloadLocationForm( formKey: customLocationFormKey, ), ), ), if (Platform.isAndroid) Center( child: Padding( padding: const EdgeInsets.all(16.0), child: AppDirectoryLocationForm(formKey: appDirectoryFormKey), ), ), ], ), ); }, ); } }