diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..4077602 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,145 @@ +PODS: + - audio_service (0.0.1): + - Flutter + - FlutterMacOS + - audio_session (0.0.1): + - Flutter + - DKImagePickerController/Core (4.3.9): + - DKImagePickerController/ImageDataManager + - DKImagePickerController/Resource + - DKImagePickerController/ImageDataManager (4.3.9) + - DKImagePickerController/PhotoGallery (4.3.9): + - DKImagePickerController/Core + - DKPhotoGallery + - DKImagePickerController/Resource (4.3.9) + - DKPhotoGallery (0.0.19): + - DKPhotoGallery/Core (= 0.0.19) + - DKPhotoGallery/Model (= 0.0.19) + - DKPhotoGallery/Preview (= 0.0.19) + - DKPhotoGallery/Resource (= 0.0.19) + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Core (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Preview + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Model (0.0.19): + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Preview (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Resource + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Resource (0.0.19): + - SDWebImage + - SwiftyGif + - file_picker (0.0.1): + - DKImagePickerController/PhotoGallery + - Flutter + - Flutter (1.0.0) + - flutter_media_metadata (0.0.1): + - Flutter + - flutter_native_splash (2.4.3): + - Flutter + - media_kit_libs_ios_audio (1.0.4): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - SDWebImage (5.21.5): + - SDWebImage/Core (= 5.21.5) + - SDWebImage/Core (5.21.5) + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - sqlite3 (3.51.1): + - sqlite3/common (= 3.51.1) + - sqlite3/common (3.51.1) + - sqlite3/dbstatvtab (3.51.1): + - sqlite3/common + - sqlite3/fts5 (3.51.1): + - sqlite3/common + - sqlite3/math (3.51.1): + - sqlite3/common + - sqlite3/perf-threadsafe (3.51.1): + - sqlite3/common + - sqlite3/rtree (3.51.1): + - sqlite3/common + - sqlite3/session (3.51.1): + - sqlite3/common + - sqlite3_flutter_libs (0.0.1): + - Flutter + - FlutterMacOS + - sqlite3 (~> 3.51.1) + - sqlite3/dbstatvtab + - sqlite3/fts5 + - sqlite3/math + - sqlite3/perf-threadsafe + - sqlite3/rtree + - sqlite3/session + - SwiftyGif (5.4.5) + +DEPENDENCIES: + - audio_service (from `.symlinks/plugins/audio_service/darwin`) + - audio_session (from `.symlinks/plugins/audio_session/ios`) + - file_picker (from `.symlinks/plugins/file_picker/ios`) + - Flutter (from `Flutter`) + - flutter_media_metadata (from `.symlinks/plugins/flutter_media_metadata/ios`) + - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) + - media_kit_libs_ios_audio (from `.symlinks/plugins/media_kit_libs_ios_audio/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) + - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/darwin`) + +SPEC REPOS: + trunk: + - DKImagePickerController + - DKPhotoGallery + - SDWebImage + - sqlite3 + - SwiftyGif + +EXTERNAL SOURCES: + audio_service: + :path: ".symlinks/plugins/audio_service/darwin" + audio_session: + :path: ".symlinks/plugins/audio_session/ios" + file_picker: + :path: ".symlinks/plugins/file_picker/ios" + Flutter: + :path: Flutter + flutter_media_metadata: + :path: ".symlinks/plugins/flutter_media_metadata/ios" + flutter_native_splash: + :path: ".symlinks/plugins/flutter_native_splash/ios" + media_kit_libs_ios_audio: + :path: ".symlinks/plugins/media_kit_libs_ios_audio/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" + sqlite3_flutter_libs: + :path: ".symlinks/plugins/sqlite3_flutter_libs/darwin" + +SPEC CHECKSUMS: + audio_service: aa99a6ba2ae7565996015322b0bb024e1d25c6fd + audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0 + DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c + DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 + file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + flutter_media_metadata: ad56576cf9c9842a1b23ca68195aeb816918de9b + flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf + media_kit_libs_ios_audio: 905e6323b72e65c63ab9262b2e473f52c024a3a8 + path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 + SDWebImage: e9c98383c7572d713c1a0d7dd2783b10599b9838 + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 + sqlite3: 8d708bc63e9f4ce48f0ad9d6269e478c5ced1d9b + sqlite3_flutter_libs: d13b8b3003f18f596e542bcb9482d105577eff41 + SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 + +PODFILE CHECKSUM: 3c63482e143d1b91d2d2560aee9fb04ecc74ac7e + +COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index f4d9674..328cbd5 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,12 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 173E1876C50290EA8509BCF1 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5CCAD096B144CCB72F06A4C /* Pods_RunnerTests.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + F3C5DF5D8638D6F64E69BB8C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEDCDB9ABBDB899EF9B2F2B8 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -40,6 +42,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 110B8877F8829B6285ADDC9E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; @@ -48,6 +51,7 @@ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9345B0FDC8E089C3FFC9C8F8 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -55,19 +59,56 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 99453D93EEF86A67BC56A62E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + B8099058F869DEFF83AFCA3F /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + BB3A8765F8638409C3091FBA /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + BBB716A4F2BAAE6D6F3E955B /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + C5CCAD096B144CCB72F06A4C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FEDCDB9ABBDB899EF9B2F2B8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 306BBF8D55D83C8BC56D7DC6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 173E1876C50290EA8509BCF1 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + F3C5DF5D8638D6F64E69BB8C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 28A672190E977F068DFA92A3 /* Pods */ = { + isa = PBXGroup; + children = ( + 99453D93EEF86A67BC56A62E /* Pods-Runner.debug.xcconfig */, + 110B8877F8829B6285ADDC9E /* Pods-Runner.release.xcconfig */, + B8099058F869DEFF83AFCA3F /* Pods-Runner.profile.xcconfig */, + BB3A8765F8638409C3091FBA /* Pods-RunnerTests.debug.xcconfig */, + 9345B0FDC8E089C3FFC9C8F8 /* Pods-RunnerTests.release.xcconfig */, + BBB716A4F2BAAE6D6F3E955B /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 31834D3714AAEB6AB95A1DC0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + FEDCDB9ABBDB899EF9B2F2B8 /* Pods_Runner.framework */, + C5CCAD096B144CCB72F06A4C /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -94,6 +135,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, + 28A672190E977F068DFA92A3 /* Pods */, + 31834D3714AAEB6AB95A1DC0 /* Frameworks */, ); sourceTree = ""; }; @@ -128,8 +171,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + 7C8D799F2414D2A278D39D31 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, + 306BBF8D55D83C8BC56D7DC6 /* Frameworks */, ); buildRules = ( ); @@ -145,12 +190,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 414314464B951E8785EBC7E8 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 4CC7C7CDA1874877FE539303 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -238,6 +285,67 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 414314464B951E8785EBC7E8 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 4CC7C7CDA1874877FE539303 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 7C8D799F2414D2A278D39D31 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -380,6 +488,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = BB3A8765F8638409C3091FBA /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -397,6 +506,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 9345B0FDC8E089C3FFC9C8F8 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -412,6 +522,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = BBB716A4F2BAAE6D6F3E955B /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/lib/ui/screens/player_screen.dart b/lib/ui/screens/player_screen.dart index 89246f1..7bd220f 100644 --- a/lib/ui/screens/player_screen.dart +++ b/lib/ui/screens/player_screen.dart @@ -70,7 +70,9 @@ class PlayerScreen extends HookConsumerWidget { BackdropFilter( filter: ImageFilter.blur(sigmaX: 50, sigmaY: 50), child: Container( - color: Colors.black.withValues(alpha: 0.6), + color: Theme.of( + context, + ).colorScheme.surface.withValues(alpha: 0.6), ), ), ], @@ -84,6 +86,8 @@ class PlayerScreen extends HookConsumerWidget { error: (_, _) => background = null, ); + final devicePadding = MediaQuery.paddingOf(context); + return Focus( autofocus: true, onKeyEvent: (node, event) { @@ -115,9 +119,7 @@ class PlayerScreen extends HookConsumerWidget { builder: (context) { if (isMobile) { return Padding( - padding: EdgeInsets.only( - top: MediaQuery.of(context).padding.top + 40, - ), + padding: EdgeInsets.only(top: devicePadding.top + 40), child: _MobileLayout( player: player, viewMode: viewMode, @@ -148,7 +150,6 @@ class PlayerScreen extends HookConsumerWidget { iconSize: 24, ), ), - _ViewToggleButton(viewMode: viewMode), ], ), @@ -186,7 +187,7 @@ class _MobileLayout extends StatelessWidget { metadataAsync: metadataAsync, media: media, trackPath: trackPath, - ), + ).padding(bottom: MediaQuery.paddingOf(context).bottom), ViewMode.lyrics => _LyricsView( key: const ValueKey('lyrics'), trackPath: trackPath, @@ -201,6 +202,55 @@ class _MobileLayout extends StatelessWidget { } } +class _PlayerCoverControlsPanel extends StatelessWidget { + final Player player; + final AsyncValue metadataAsync; + final Media media; + final String trackPath; + + const _PlayerCoverControlsPanel({ + required this.player, + required this.metadataAsync, + required this.media, + required this.trackPath, + }); + + @override + Widget build(BuildContext context) { + return ConstrainedBox( + constraints: BoxConstraints( + maxWidth: math.min(480, MediaQuery.sizeOf(context).width * 0.4), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 400), + child: AspectRatio( + aspectRatio: 1, + child: _PlayerCoverArt(metadataAsync: metadataAsync), + ), + ), + ), + ), + ), + _PlayerControls( + player: player, + metadataAsync: metadataAsync, + media: media, + trackPath: trackPath, + ), + const SizedBox(height: 32), + ], + ), + ); + } +} + class _DesktopLayout extends StatelessWidget { final Player player; final ValueNotifier viewMode; @@ -223,36 +273,11 @@ class _DesktopLayout extends StatelessWidget { child: switch (viewMode.value) { ViewMode.cover => Center( key: const ValueKey('cover'), - child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: math.min(480, MediaQuery.sizeOf(context).width * 0.4), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Padding( - padding: const EdgeInsets.all(32.0), - child: Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 400), - child: AspectRatio( - aspectRatio: 1, - child: _PlayerCoverArt(metadataAsync: metadataAsync), - ), - ), - ), - ), - ), - _PlayerControls( - player: player, - metadataAsync: metadataAsync, - media: media, - trackPath: trackPath, - ), - const SizedBox(height: 32), - ], - ), + child: _PlayerCoverControlsPanel( + player: player, + metadataAsync: metadataAsync, + media: media, + trackPath: trackPath, ), ), ViewMode.lyrics => Stack( @@ -264,43 +289,11 @@ class _DesktopLayout extends StatelessWidget { children: [ Expanded( child: Center( - child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: math.min( - 480, - MediaQuery.sizeOf(context).width * 0.4, - ), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Padding( - padding: const EdgeInsets.all(32.0), - child: Center( - child: ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 400, - ), - child: AspectRatio( - aspectRatio: 1, - child: _PlayerCoverArt( - metadataAsync: metadataAsync, - ), - ), - ), - ), - ), - ), - _PlayerControls( - player: player, - metadataAsync: metadataAsync, - media: media, - trackPath: trackPath, - ), - const SizedBox(height: 32), - ], - ), + child: _PlayerCoverControlsPanel( + player: player, + metadataAsync: metadataAsync, + media: media, + trackPath: trackPath, ), ), ), @@ -330,43 +323,11 @@ class _DesktopLayout extends StatelessWidget { children: [ Expanded( child: Center( - child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: math.min( - 480, - MediaQuery.sizeOf(context).width * 0.4, - ), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Padding( - padding: const EdgeInsets.all(32.0), - child: Center( - child: ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: 400, - ), - child: AspectRatio( - aspectRatio: 1, - child: _PlayerCoverArt( - metadataAsync: metadataAsync, - ), - ), - ), - ), - ), - ), - _PlayerControls( - player: player, - metadataAsync: metadataAsync, - media: media, - trackPath: trackPath, - ), - const SizedBox(height: 32), - ], - ), + child: _PlayerCoverControlsPanel( + player: player, + metadataAsync: metadataAsync, + media: media, + trackPath: trackPath, ), ), ), @@ -410,12 +371,7 @@ class _CoverView extends StatelessWidget { child: Column( children: [ Expanded( - child: Padding( - padding: const EdgeInsets.all(32.0), - child: Center( - child: _PlayerCoverArt(metadataAsync: metadataAsync), - ), - ), + child: Center(child: _PlayerCoverArt(metadataAsync: metadataAsync)), ), _PlayerControls( player: player, @@ -465,11 +421,13 @@ class _PlayerCoverArt extends StatelessWidget { aspectRatio: 1, child: Container( decoration: BoxDecoration( - color: Colors.grey[800], + color: Theme.of(context).colorScheme.surfaceContainer, borderRadius: BorderRadius.circular(24), boxShadow: [ BoxShadow( - color: Colors.black.withValues(alpha: 0.3), + color: Theme.of( + context, + ).colorScheme.shadow.withValues(alpha: 0.3), blurRadius: 20, offset: const Offset(0, 10), ), @@ -482,11 +440,13 @@ class _PlayerCoverArt extends StatelessWidget { : null, ), child: meta.artBytes == null - ? const Center( + ? Center( child: Icon( Icons.music_note, size: 80, - color: Colors.white54, + color: Theme.of( + context, + ).colorScheme.onSurface.withValues(alpha: 0.7), ), ) : null, @@ -496,11 +456,17 @@ class _PlayerCoverArt extends StatelessWidget { loading: () => const Center(child: CircularProgressIndicator()), error: (_, _) => Container( decoration: BoxDecoration( - color: Colors.grey[800], + color: Theme.of(context).colorScheme.surfaceVariant, borderRadius: BorderRadius.circular(24), ), - child: const Center( - child: Icon(Icons.error_outline, size: 80, color: Colors.white54), + child: Center( + child: Icon( + Icons.error_outline, + size: 80, + color: Theme.of( + context, + ).colorScheme.onSurface.withValues(alpha: 0.7), + ), ), ), ); @@ -714,6 +680,7 @@ class _FetchLyricsDialog extends StatelessWidget { children: [ RichText( text: TextSpan( + style: TextStyle(color: Theme.of(context).colorScheme.onSurface), children: [ const TextSpan(text: 'Search lyrics with '), TextSpan( @@ -1170,7 +1137,7 @@ class _QueueView extends HookConsumerWidget { } return ReorderableListView.builder( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.fromLTRB(16, 32, 16, 16), itemCount: playlist.medias.length, buildDefaultDragHandles: false, onReorder: (oldIndex, newIndex) { @@ -1657,6 +1624,7 @@ class _PlayerControls extends HookWidget { // Media Controls Row( + spacing: 8, mainAxisAlignment: MainAxisAlignment.center, children: [ // Shuffle @@ -1678,13 +1646,11 @@ class _PlayerControls extends HookWidget { player.setShuffle(!player.state.shuffle); }, ), - const SizedBox(width: 16), // Previous IconButton( icon: const Icon(Icons.skip_previous, size: 32), onPressed: player.previous, ), - const SizedBox(width: 16), // Play/Pause StreamBuilder( stream: player.stream.playing, @@ -1712,13 +1678,11 @@ class _PlayerControls extends HookWidget { ); }, ), - const SizedBox(width: 16), // Next IconButton( icon: const Icon(Icons.skip_next, size: 32), onPressed: player.next, ), - const SizedBox(width: 16), // Loop Mode IconButton( icon: StreamBuilder( diff --git a/lib/ui/widgets/mini_player.dart b/lib/ui/widgets/mini_player.dart index 0c662b7..5b66232 100644 --- a/lib/ui/widgets/mini_player.dart +++ b/lib/ui/widgets/mini_player.dart @@ -53,10 +53,13 @@ class _MobileMiniPlayer extends HookConsumerWidget { final path = Uri.parse(media.uri).path; final filePath = Uri.decodeFull(path); + final devicePadding = MediaQuery.paddingOf(context); + final metadataAsync = ref.watch(trackMetadataProvider(filePath)); Widget content = Container( - height: 72, + height: 72 + devicePadding.bottom, + padding: EdgeInsets.only(bottom: devicePadding.bottom), width: double.infinity, decoration: BoxDecoration( color: Theme.of(context).colorScheme.surfaceContainerHighest, @@ -268,11 +271,14 @@ class _DesktopMiniPlayer extends HookConsumerWidget { final path = Uri.parse(media.uri).path; final filePath = Uri.decodeFull(path); + final devicePadding = MediaQuery.paddingOf(context); + final metadataAsync = ref.watch(trackMetadataProvider(filePath)); Widget content = Container( - height: 72, + height: 72 + devicePadding.bottom, width: double.infinity, + padding: EdgeInsets.only(bottom: devicePadding.bottom), decoration: BoxDecoration( color: Theme.of(context).colorScheme.surfaceContainerHighest, border: Border( diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 7b4b99c..6f73d2f 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -67,7 +67,7 @@ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* groovybox.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = groovybox.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* GroovyBox.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GroovyBox.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -144,7 +144,7 @@ 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* groovybox.app */, + 33CC10ED2044A3C60003C045 /* GroovyBox.app */, 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, ); name = Products; @@ -248,7 +248,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* groovybox.app */; + productReference = 33CC10ED2044A3C60003C045 /* GroovyBox.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -368,10 +368,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; @@ -571,6 +575,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = W7HPZ53V6B; @@ -717,6 +722,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = W7HPZ53V6B; @@ -751,6 +757,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = W7HPZ53V6B; diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 0371d27..8fa40ef 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -15,7 +15,7 @@ @@ -31,7 +31,7 @@ @@ -66,7 +66,7 @@ @@ -83,7 +83,7 @@ diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib index 80e867a..41f4f25 100644 --- a/macos/Runner/Base.lproj/MainMenu.xib +++ b/macos/Runner/Base.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -13,7 +13,7 @@ - + @@ -330,14 +330,15 @@ - + - + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index 1542368..216c16b 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -5,10 +5,10 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = groovybox +PRODUCT_NAME = GroovyBox // The application's bundle identifier PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.groovybox // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2025 dev.solsynth. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2025 Solsynth. All rights reserved. diff --git a/pubspec.yaml b/pubspec.yaml index 24bf768..c7d6ec7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 +version: 1.0.0+40 environment: sdk: ^3.10.1