From 586f47575c128b68560ba0fa387985b20ca984c1 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Thu, 29 Aug 2024 22:34:56 +0800 Subject: [PATCH] :sparkles: Audio normalize --- lib/screens/settings.dart | 154 ++++++++++++++++++++++---------------- 1 file changed, 88 insertions(+), 66 deletions(-) diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index b69d89b..ff77011 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -2,8 +2,10 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:rhythm_box/providers/auth.dart'; import 'package:rhythm_box/providers/spotify.dart'; +import 'package:rhythm_box/providers/user_preferences.dart'; import 'package:rhythm_box/screens/auth/login.dart'; import 'package:rhythm_box/widgets/auto_cache_image.dart'; +import 'package:rhythm_box/widgets/sized_container.dart'; class SettingsScreen extends StatefulWidget { const SettingsScreen({super.key}); @@ -15,6 +17,7 @@ class SettingsScreen extends StatefulWidget { class _SettingsScreenState extends State { late final SpotifyProvider _spotify = Get.find(); late final AuthenticationProvider _authenticate = Get.find(); + late final UserPreferencesProvider _preferences = Get.find(); bool _isLoggingIn = false; @@ -22,75 +25,94 @@ class _SettingsScreenState extends State { Widget build(BuildContext context) { return Material( color: Theme.of(context).colorScheme.surface, - child: SafeArea( - child: Column( - children: [ - Obx(() { - if (_authenticate.auth.value == null) { - return ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 24), - leading: const Icon(Icons.login), - title: const Text('Connect with Spotify'), - subtitle: const Text('To explore your own library and more'), - trailing: const Icon(Icons.chevron_right), - enabled: !_isLoggingIn, - onTap: () async { - setState(() => _isLoggingIn = true); - await universalLogin(context); - setState(() => _isLoggingIn = false); + child: Scaffold( + appBar: AppBar( + title: const Text('Settings'), + centerTitle: MediaQuery.of(context).size.width >= 720, + ), + body: CenteredContainer( + child: Column( + children: [ + Obx(() { + if (_authenticate.auth.value == null) { + return ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 24), + leading: const Icon(Icons.login), + title: const Text('Connect with Spotify'), + subtitle: + const Text('To explore your own library and more'), + trailing: const Icon(Icons.chevron_right), + enabled: !_isLoggingIn, + onTap: () async { + setState(() => _isLoggingIn = true); + await universalLogin(context); + setState(() => _isLoggingIn = false); + }, + ); + } + + return FutureBuilder( + future: _spotify.api.me.get(), + builder: (context, snapshot) { + if (!snapshot.hasData) { + return const ListTile( + contentPadding: + const EdgeInsets.symmetric(horizontal: 24), + leading: SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + strokeWidth: 3, + ), + ), + title: Text('Loading...'), + ); + } + + return ListTile( + leading: (snapshot.data!.images?.isNotEmpty ?? false) + ? CircleAvatar( + backgroundImage: AutoCacheImage.provider( + snapshot.data!.images!.firstOrNull!.url!, + ), + ) + : const Icon(Icons.account_circle), + title: Text(snapshot.data!.displayName!), + subtitle: const Text('Connected with your Spotify'), + ); }, ); - } + }), + Obx(() { + if (_authenticate.auth.value == null) { + return const SizedBox(); + } - return FutureBuilder( - future: _spotify.api.me.get(), - builder: (context, snapshot) { - if (!snapshot.hasData) { - return const ListTile( - contentPadding: - const EdgeInsets.symmetric(horizontal: 24), - leading: SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator( - strokeWidth: 3, - ), - ), - title: Text('Loading...'), - ); - } - - return ListTile( - leading: (snapshot.data!.images?.isNotEmpty ?? false) - ? CircleAvatar( - backgroundImage: AutoCacheImage.provider( - snapshot.data!.images!.firstOrNull!.url!, - ), - ) - : const Icon(Icons.account_circle), - title: Text(snapshot.data!.displayName!), - subtitle: const Text('Connected with your Spotify'), - ); - }, - ); - }), - Obx(() { - if (_authenticate.auth.value == null) { - return const SizedBox(); - } - - return ListTile( - contentPadding: const EdgeInsets.symmetric(horizontal: 24), - leading: const Icon(Icons.logout), - title: const Text('Log out'), - subtitle: const Text('Disconnect with this Spotify account'), - trailing: const Icon(Icons.chevron_right), - onTap: () async { - _authenticate.logout(); - }, - ); - }), - ], + return ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 24), + leading: const Icon(Icons.logout), + title: const Text('Log out'), + subtitle: const Text('Disconnect with this Spotify account'), + trailing: const Icon(Icons.chevron_right), + onTap: () async { + _authenticate.logout(); + }, + ); + }), + const Divider(thickness: 0.3, height: 1), + Obx( + () => SwitchListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 24), + secondary: const Icon(Icons.graphic_eq), + title: const Text('Normalize Audio'), + subtitle: + const Text('Make audio not too loud either too quiet'), + value: _preferences.state.value.normalizeAudio, + onChanged: _preferences.setNormalizeAudio, + ), + ), + ], + ), ), ), );