From 4fd94475916dca05a89d70f9e93998fc5dc83c6f Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 30 Aug 2024 23:18:49 +0800 Subject: [PATCH] :lipstick: Optimize UX --- ios/Runner/Info.plist | 110 +++++++++++++------------- lib/screens/explore.dart | 18 ++--- lib/screens/player/mini.dart | 43 ++++++++++ lib/screens/player/view.dart | 7 +- lib/widgets/player/bottom_player.dart | 2 +- pubspec.yaml | 2 +- web/index.html | 5 +- 7 files changed, 119 insertions(+), 68 deletions(-) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 7e7a546..d94da39 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -1,59 +1,59 @@ - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Groovy Box - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Groovy Box - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSApplicationCategoryType - public.app-category.music - LSRequiresIPhoneOS - - NSMicrophoneUsageDescription - To provide information for RhythmBox to normalize the output audio - UIApplicationSupportsIndirectInputEvents - - UIBackgroundModes - - audio - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIStatusBarHidden - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Groovy Box + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Groovy Box + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSApplicationCategoryType + public.app-category.music + LSRequiresIPhoneOS + + NSMicrophoneUsageDescription + To provide information for RhythmBox to normalize the output audio + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + audio + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + diff --git a/lib/screens/explore.dart b/lib/screens/explore.dart index 631701b..52e60bf 100644 --- a/lib/screens/explore.dart +++ b/lib/screens/explore.dart @@ -85,15 +85,6 @@ class _ExploreScreenState extends State { ), body: CustomScrollView( slivers: [ - if (_newReleasesPlaylist?.isNotEmpty ?? false) - SliverToBoxAdapter( - child: PlaylistSection( - isLoading: _isLoading['newReleases']!, - title: 'New Releases', - list: _newReleasesPlaylist, - ), - ), - if (_newReleasesPlaylist?.isNotEmpty ?? false) const SliverGap(16), if (_recentlyPlaylist?.isNotEmpty ?? false) SliverToBoxAdapter( child: PlaylistSection( @@ -103,6 +94,15 @@ class _ExploreScreenState extends State { ), ), if (_recentlyPlaylist?.isNotEmpty ?? false) const SliverGap(16), + if (_newReleasesPlaylist?.isNotEmpty ?? false) + SliverToBoxAdapter( + child: PlaylistSection( + isLoading: _isLoading['newReleases']!, + title: 'New Releases', + list: _newReleasesPlaylist, + ), + ), + if (_newReleasesPlaylist?.isNotEmpty ?? false) const SliverGap(16), SliverList.builder( itemCount: _forYouView?.length ?? 0, itemBuilder: (context, idx) { diff --git a/lib/screens/player/mini.dart b/lib/screens/player/mini.dart index e7bcf1e..5fe142a 100644 --- a/lib/screens/player/mini.dart +++ b/lib/screens/player/mini.dart @@ -2,8 +2,11 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:go_router/go_router.dart'; import 'package:rhythm_box/platform.dart'; +import 'package:rhythm_box/screens/player/queue.dart'; +import 'package:rhythm_box/screens/player/siblings.dart'; import 'package:rhythm_box/widgets/lyrics/synced_lyrics.dart'; import 'package:rhythm_box/widgets/player/bottom_player.dart'; +import 'package:rhythm_box/widgets/player/devices.dart'; import 'package:window_manager/window_manager.dart'; class MiniPlayerScreen extends StatefulWidget { @@ -94,6 +97,46 @@ class _MiniPlayerScreenState extends State { onPressed: () => _exitMiniPlayer(), ), const Spacer(), + IconButton( + icon: const Icon(Icons.speaker, size: 18), + onPressed: () { + showModalBottomSheet( + useRootNavigator: true, + context: context, + builder: (context) => const PlayerDevicePopup(), + ); + }, + ), + IconButton( + icon: const Icon(Icons.merge), + onPressed: () { + showModalBottomSheet( + useRootNavigator: true, + isScrollControlled: true, + context: context, + builder: (context) => const SiblingTracksPopup(), + ).then((_) { + if (mounted) { + setState(() {}); + } + }); + }, + ), + IconButton( + icon: const Icon(Icons.queue_music), + onPressed: () { + showModalBottomSheet( + useRootNavigator: true, + isScrollControlled: true, + context: context, + builder: (context) => const PlayerQueuePopup(), + ).then((_) { + if (mounted) { + setState(() {}); + } + }); + }, + ), IconButton( icon: _isHoverMode ? const Icon(Icons.touch_app) diff --git a/lib/screens/player/view.dart b/lib/screens/player/view.dart index cf2cbf6..ecf621a 100644 --- a/lib/screens/player/view.dart +++ b/lib/screens/player/view.dart @@ -139,6 +139,9 @@ class _PlayerScreenState extends State { if (_playback.state.value.activeTrack != null && _auth.auth.value != null) TrackHeartButton( + key: ValueKey( + _playback.state.value.activeTrack!.id!, + ), trackId: _playback.state.value.activeTrack!.id!, ), ], @@ -178,7 +181,9 @@ class _PlayerScreenState extends State { }, onChangeEnd: (value) { audioPlayer.seek( - Duration(milliseconds: value.toInt())); + Duration(milliseconds: value.toInt()), + ); + setState(() => _draggingValue = null); }, ), ), diff --git a/lib/widgets/player/bottom_player.dart b/lib/widgets/player/bottom_player.dart index 4517950..a717b00 100644 --- a/lib/widgets/player/bottom_player.dart +++ b/lib/widgets/player/bottom_player.dart @@ -113,7 +113,7 @@ class _BottomPlayerState extends State duration: const Duration(milliseconds: 1000), builder: (context, value, _) => LinearProgressIndicator( minHeight: 3, - value: _isFetchingActiveTrack ? null : null, + value: _isFetchingActiveTrack ? null : value, ), ), Row( diff --git a/pubspec.yaml b/pubspec.yaml index 9ed5562..d5ab98d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: rhythm_box -description: "A new Flutter project." +description: Yet another Spotify third-party client. # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev diff --git a/web/index.html b/web/index.html index 34e5cf0..37254ff 100644 --- a/web/index.html +++ b/web/index.html @@ -29,6 +29,9 @@ RhythmBox + + +